diff --git a/book/src/data-model/contract-moderation.md b/book/src/data-model/contract-moderation.md index 66a4403e89c..d426983176c 100644 --- a/book/src/data-model/contract-moderation.md +++ b/book/src/data-model/contract-moderation.md @@ -30,12 +30,22 @@ pub enum ContractModerators { pub enum ContractModerationList { Banlist, Suspensions } +pub struct ContractModerationReason { + pub code: Option, + pub text: String, +} + +pub struct ContractBan { pub reason: ContractModerationReason } +pub struct ContractSuspension { pub until: TimestampMillis, pub reason: ContractModerationReason } + pub struct ContractModerationStatus { - pub banned: bool, - pub suspended_until: Option, + pub ban: Option, + pub suspension: Option, } ``` +Every ban and every suspension carries a **reason**, stored with the entry so that whoever reads the list reads why. The `text` is free: at most `SystemLimits::max_contract_moderation_reason_length` (1024) bytes of UTF-8, possibly empty. The `code` is reserved for the ban codes a contract may declare in a later protocol version. No contract declares any today, so it is expected to be `None`; a moderator may still write any `u16` there, and nothing checks it against anything. The moderator pays the storage of the reason, byte for byte, and gets it back when the entry is removed. + The config is `DataContractConfig::V2`, a new variant of the config's own bincode enum inside the contract. The config version follows the platform version, as V1 did from protocol version 9: from protocol version 14 every new contract carries a V2 config, moderated or not (`CONTRACT_VERSIONS_V6` sets both `max_version` and `default_current_version` to 2), and an existing V1 contract moves to V2 with its next update. `config_valid_for_platform_version` lowers a V2 only where the platform version does not admit it, never because of what it declares. Lowering would drop a moderation declaration, and moderation can never be turned on later, so that case is refused rather than dropped: serializing a contract whose config declares moderation at a platform version below 14 (`ensure_admitted_by_platform_version`), and parsing a config value with a `moderation` key at such a version, both fail with `ProtocolError::NotSupported`. For the same reason the declaration refuses an unknown key instead of skipping it (`deny_unknown_fields`, and the moderators' `$type` map likewise): a misspelled `suspensions` would otherwise leave the contract without the list for good. A contract create or update carrying a V2 config is active from protocol version 14 only (`StateTransition::active_version_range`): before that a node rejects it at decoding, unpaid, exactly as a binary that cannot decode the V2 discriminant does, so upgraded and older nodes agree on every block before activation. The JSON shape of the moderators is a flat `{"$type": "contractOwner"}` or `{"$type": "appointedModerators", "identities": [...]}`, the style of `AuthorizedActionTakers`. ## The Transition @@ -54,9 +64,9 @@ pub struct ContractUserModerationTransitionV0 { } pub enum ContractUserModerationAction { - Ban { identity_id }, + Ban { identity_id, reason: ContractModerationReason }, Unban { identity_id }, - Suspend { identity_id, until: TimestampMillis }, + Suspend { identity_id, until: TimestampMillis, reason: ContractModerationReason }, Unsuspend { identity_id }, } ``` @@ -67,7 +77,7 @@ It is signed like a contract update: a CRITICAL authentication key without contr | Tier | What | Codes | |---|---|---| -| Basic structure (unpaid) | the target is not the signer; a suspension ends at or before `SystemLimits::max_contract_suspension_until` (2^53 - 1 ms, the largest value JSON clients read exactly) | 10901, 10700 | +| Basic structure (unpaid) | the target is not the signer; a suspension ends at or before `SystemLimits::max_contract_suspension_until` (2^53 - 1 ms, the largest value JSON clients read exactly); the text of a ban's or a suspension's reason is at most `SystemLimits::max_contract_moderation_reason_length` bytes (its code is not checked) | 10901, 10700, 10903 | | Signature and nonce | CRITICAL key, contract nonce | existing | | Transform (state, paid) | the contract exists; it keeps the list the action edits; the signer is the owner or a moderator; the target of a ban or a suspend is neither; the target exists; the action fits the target's status | 41100-41106, 41109 | @@ -85,7 +95,7 @@ Deletions (`Delete` and `IndexOnlyDelete`) are never refused: a barred identity ### The Errors -Basic, in their own band (10900-10949): `InvalidContractModerationConfigError` (10900), `ContractModerationSelfTargetError` (10901). State, in their own sub-band: `ContractModerationNotEnabledError` (41100), `IdentityNotContractModeratorError` (41101), `ContractModerationTargetNotAllowedError` (41102), `ContractUserAlreadyBannedError` (41103), `ContractUserNotBannedError` (41104), `ContractUserNotSuspendedError` (41105), `ContractSuspensionNotInFutureError` (41106), `ContractUserBannedError` (41107), `ContractUserSuspendedError` (41108), `ContractModerationTargetNotFoundError` (41109), `ContractModeratorIdentityNotFoundError` (41110, from the contract create and update, not from the moderation transition), `ContractModerationCounterpartyBarredError` (41114, from the document gate; 41111 to 41113 are reserved). A contract update that turns a list on or off is refused with the existing `DataContractConfigUpdateError` (40002). +Basic, in their own band (10900-10949): `InvalidContractModerationConfigError` (10900), `ContractModerationSelfTargetError` (10901), `ContractModerationReasonTooLongError` (10903; 10902 is reserved). State, in their own sub-band: `ContractModerationNotEnabledError` (41100), `IdentityNotContractModeratorError` (41101), `ContractModerationTargetNotAllowedError` (41102), `ContractUserAlreadyBannedError` (41103), `ContractUserNotBannedError` (41104), `ContractUserNotSuspendedError` (41105), `ContractSuspensionNotInFutureError` (41106), `ContractUserBannedError` (41107), `ContractUserSuspendedError` (41108), `ContractModerationTargetNotFoundError` (41109), `ContractModeratorIdentityNotFoundError` (41110, from the contract create and update, not from the moderation transition), `ContractModerationCounterpartyBarredError` (41114, from the document gate; 41111 to 41113 are reserved). A contract update that turns a list on or off is refused with the existing `DataContractConfigUpdateError` (40002). ## Storage @@ -96,17 +106,19 @@ Basic, in their own band (10900-10949): `InvalidContractModerationConfigError` ( ├── [1] documents └── [2] other ├── [64] contract version item (every contract) - ├── [128] banlist -> -> Item([]) (when declared) - └── [192] suspensions -> -> Item(until, u64 BE millis) (when declared) + ├── [128] banlist -> -> Item(reason) (when declared) + └── [192] suspensions -> -> Item(until ‖ reason) (when declared) ``` +`until` is a u64 of block time in milliseconds, big-endian. A reason is a tag byte (`0`: no code, `1`: a code), the code as a big-endian u16 when tagged, then the text as UTF-8 up to the end of the value, so an entry with an empty reason and no code costs one byte more than the bare entry would. A value without the tag byte is an entry written before entries carried a reason and reads as the empty reason. + The contract's own subtree holds three keys whatever the contract keeps, so its Merk keeps `1`, the documents, on top: every document proof and write goes through that key, and a fourth key beside it would have pushed it one level down (a Merk built from one sorted batch roots at the middle key). Everything else a contract keeps goes into `2`, its **other tree**, which protocol version 14 introduces together with the version item. Inside, the keys are spread like the root tree's, so the tree stays balanced as it fills and the most read entry sits on top: the banlist at `128`, read by every document transition on a moderated contract, the version item at `64`, the suspension list at `192`. A key added later should sort below `128` to keep the banlist on top when four keys are created at once. The other tree is written by every contract insertion, and by the migration on the first block of protocol version 14 for the contracts stored before it. A contract update finds it there, so its fee estimate writes none; applied, the update reads key `2` once, billed, rather than fail inside a block: a tree is left alone (it may hold the lists), a missing one is written. The 4.2 betas kept the version item itself at key `2`, before the other tree existed: an update of a contract that still holds that item puts the tree in its place and the item under it (`add_contract_to_storage` generation 1). Until such a contract is updated, the unproved `getDataContractsLatestVersions` reads its version from that item, and the proved form shows no version item for it. The list trees are created by `insert_contract` generation 2 for a contract that declares them, and by nothing else: the lists are fixed at creation, so a contract update creates none and leaves the existing ones and their entries alone, and no tree is made lazily by the first ban. An entry's storage flags name the moderator that wrote it, so the storage refund of its deletion goes to that moderator whichever transition deletes it: the explicit unban or unsuspend, the ban over a suspension, or the document transition that sweeps a lapsed suspension. The sweep's processing fee is charged to the batch signer. -The writers, readers and provers live in `packages/rs-drive/src/drive/contract/moderation/`, versioned by `DriveContractModerationMethodVersions`. A suspend that replaces an entry is a `batch_replace`, because two operations on one key would fail the batch. +The writers, readers and provers live in `packages/rs-drive/src/drive/contract/moderation/`, versioned by `DriveContractModerationMethodVersions`. A suspend that replaces an entry is a `batch_replace`, because two operations on one key would fail the batch. The replacement brings its own reason, so the entry may change size: a longer replacement merges the flags as a document that changes hands does, the moderator that replaced it paying for the bytes it added and becoming the entry's owner, refunded when it is removed; a shorter or an equally long one stays the first moderator's, who is refunded the removed bytes at once and the rest on removal. A fee estimate prices a replacement as a fresh insert of the whole entry, because GroveDB's average-case replace assumes an item keeps its size and would price no storage for a longer reason; the entries a write walks past, and the one a delete removes, are estimated at a typical reason (128 bytes of text), not at the longest. ## Reading and Proving @@ -121,11 +133,11 @@ A status query answers for the lists it names and no others: `Drive::verify_cont ## Versioning Touchpoints -All in place for protocol version 14: `CONTRACT_VERSIONS_V6` makes config V2 the config of every new contract (`max_version` and `default_current_version` 2) and `validate_config_update` 2; `STATE_TRANSITION_SERIALIZATION_VERSIONS_V3` and `DRIVE_ABCI_VALIDATION_VERSIONS_V10` carry the transition's slots and `batch_state_transition.contract_moderation_gate`, and the contract update's basic structure moves to 2 to validate the declaration; `DRIVE_CONTRACT_METHOD_VERSIONS_V4` bumps `insert_contract` to 2 and adds the `moderation` table (its `update_contract` 2 belongs to token distribution and does nothing for moderation); `DRIVE_STATE_TRANSITION_METHOD_VERSIONS_V4` adds the converter slot and bumps `documents_batch_transition` to 1 for the sweep; `DRIVE_VERIFY_METHOD_VERSIONS` and `DRIVE_ABCI_QUERY_VERSIONS` gain their moderation tables; `SYSTEM_LIMITS_V4` gains `max_contract_moderators` and `max_contract_suspension_until`. +All in place for protocol version 14: `CONTRACT_VERSIONS_V6` makes config V2 the config of every new contract (`max_version` and `default_current_version` 2) and `validate_config_update` 2; `STATE_TRANSITION_SERIALIZATION_VERSIONS_V3` and `DRIVE_ABCI_VALIDATION_VERSIONS_V10` carry the transition's slots and `batch_state_transition.contract_moderation_gate`, and the contract update's basic structure moves to 2 to validate the declaration; `DRIVE_CONTRACT_METHOD_VERSIONS_V4` bumps `insert_contract` to 2 and adds the `moderation` table (its `update_contract` 2 belongs to token distribution and does nothing for moderation); `DRIVE_STATE_TRANSITION_METHOD_VERSIONS_V4` adds the converter slot and bumps `documents_batch_transition` to 1 for the sweep; `DRIVE_VERIFY_METHOD_VERSIONS` and `DRIVE_ABCI_QUERY_VERSIONS` gain their moderation tables; `SYSTEM_LIMITS_V4` gains `max_contract_moderators`, `max_contract_suspension_until` and `max_contract_moderation_reason_length`. ## What Is Not There Yet -Group-based moderators (`AuthorizedActionTakers::Group` through group actions), keys bound to the contract allowed to sign its moderation, entry metadata such as a reason or a timestamp, and the Swift and Kotlin SDKs. +Group-based moderators (`AuthorizedActionTakers::Group` through group actions), keys bound to the contract allowed to sign its moderation, ban codes declared by the contract (the reason's `code` is where they will go), further entry metadata such as a timestamp or the moderator's id, and the Swift and Kotlin SDKs. The refusal a barred identity receives (41107, 41108, 41114) does not repeat the reason: the status query does. ## Tests diff --git a/book/src/error-handling/error-codes.md b/book/src/error-handling/error-codes.md index 121a6db66a3..4b78eff608b 100644 --- a/book/src/error-handling/error-codes.md +++ b/book/src/error-handling/error-codes.md @@ -60,7 +60,7 @@ Error codes are organized into ranges that correspond to error categories and su | 10700-10700 | General | `OverflowError` (10700) | | 10800-10818 | Address | `TransitionOverMaxInputsError` (10800), `WithdrawalBelowMinAmountError` (10818) | | 10819-10827 | Shielded | `ShieldedNoActionsError` (10819), `ShieldedTooManyActionsError` (10825), `ShieldedImplicitFeeCapExceededError` (10826), `ShieldedInvalidDenominationError` (10827 — `IdentityCreateFromShieldedPool` exit amount not a member of the versioned denomination set) | -| 10900-10949 | Contract Moderation | `InvalidContractModerationConfigError` (10900), `ContractModerationSelfTargetError` (10901); 10902 reserved | +| 10900-10949 | Contract Moderation | `InvalidContractModerationConfigError` (10900), `ContractModerationSelfTargetError` (10901), `ContractModerationReasonTooLongError` (10903); 10902 reserved | ### SignatureError codes (20000-20012) diff --git a/packages/dapi-grpc/clients/drive/v0/nodejs/drive_pbjs.js b/packages/dapi-grpc/clients/drive/v0/nodejs/drive_pbjs.js index 12ed3dad8ac..aaccf69d92e 100644 --- a/packages/dapi-grpc/clients/drive/v0/nodejs/drive_pbjs.js +++ b/packages/dapi-grpc/clients/drive/v0/nodejs/drive_pbjs.js @@ -24015,6 +24015,216 @@ $root.org = (function() { return values; })(); + v0.ContractModerationReason = (function() { + + /** + * Properties of a ContractModerationReason. + * @memberof org.dash.platform.dapi.v0 + * @interface IContractModerationReason + * @property {number|null} [code] ContractModerationReason code + * @property {string|null} [text] ContractModerationReason text + */ + + /** + * Constructs a new ContractModerationReason. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a ContractModerationReason. + * @implements IContractModerationReason + * @constructor + * @param {org.dash.platform.dapi.v0.IContractModerationReason=} [properties] Properties to set + */ + function ContractModerationReason(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]]; + } + + /** + * ContractModerationReason code. + * @member {number} code + * @memberof org.dash.platform.dapi.v0.ContractModerationReason + * @instance + */ + ContractModerationReason.prototype.code = 0; + + /** + * ContractModerationReason text. + * @member {string} text + * @memberof org.dash.platform.dapi.v0.ContractModerationReason + * @instance + */ + ContractModerationReason.prototype.text = ""; + + /** + * Creates a new ContractModerationReason instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.ContractModerationReason + * @static + * @param {org.dash.platform.dapi.v0.IContractModerationReason=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.ContractModerationReason} ContractModerationReason instance + */ + ContractModerationReason.create = function create(properties) { + return new ContractModerationReason(properties); + }; + + /** + * Encodes the specified ContractModerationReason message. Does not implicitly {@link org.dash.platform.dapi.v0.ContractModerationReason.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.ContractModerationReason + * @static + * @param {org.dash.platform.dapi.v0.IContractModerationReason} message ContractModerationReason message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ContractModerationReason.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.code != null && Object.hasOwnProperty.call(message, "code")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.code); + if (message.text != null && Object.hasOwnProperty.call(message, "text")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.text); + return writer; + }; + + /** + * Encodes the specified ContractModerationReason message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.ContractModerationReason.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.ContractModerationReason + * @static + * @param {org.dash.platform.dapi.v0.IContractModerationReason} message ContractModerationReason message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ContractModerationReason.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ContractModerationReason message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.ContractModerationReason + * @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.ContractModerationReason} ContractModerationReason + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ContractModerationReason.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.ContractModerationReason(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.code = reader.uint32(); + break; + case 2: + message.text = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ContractModerationReason message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.ContractModerationReason + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.ContractModerationReason} ContractModerationReason + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ContractModerationReason.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ContractModerationReason message. + * @function verify + * @memberof org.dash.platform.dapi.v0.ContractModerationReason + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ContractModerationReason.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.code != null && message.hasOwnProperty("code")) + if (!$util.isInteger(message.code)) + return "code: integer expected"; + if (message.text != null && message.hasOwnProperty("text")) + if (!$util.isString(message.text)) + return "text: string expected"; + return null; + }; + + /** + * Creates a ContractModerationReason message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.ContractModerationReason + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.ContractModerationReason} ContractModerationReason + */ + ContractModerationReason.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.ContractModerationReason) + return object; + var message = new $root.org.dash.platform.dapi.v0.ContractModerationReason(); + if (object.code != null) + message.code = object.code >>> 0; + if (object.text != null) + message.text = String(object.text); + return message; + }; + + /** + * Creates a plain object from a ContractModerationReason message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.ContractModerationReason + * @static + * @param {org.dash.platform.dapi.v0.ContractModerationReason} message ContractModerationReason + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ContractModerationReason.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.code = 0; + object.text = ""; + } + if (message.code != null && message.hasOwnProperty("code")) + object.code = message.code; + if (message.text != null && message.hasOwnProperty("text")) + object.text = message.text; + return object; + }; + + /** + * Converts this ContractModerationReason to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.ContractModerationReason + * @instance + * @returns {Object.} JSON object + */ + ContractModerationReason.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ContractModerationReason; + })(); + v0.GetContractModerationStatusRequest = (function() { /** @@ -24760,6 +24970,8 @@ $root.org = (function() { * @property {boolean|null} [banned] ContractModerationStatus banned * @property {number|Long|null} [suspendedUntil] ContractModerationStatus suspendedUntil * @property {Array.|null} [lists] ContractModerationStatus lists + * @property {org.dash.platform.dapi.v0.IContractModerationReason|null} [banReason] ContractModerationStatus banReason + * @property {org.dash.platform.dapi.v0.IContractModerationReason|null} [suspensionReason] ContractModerationStatus suspensionReason */ /** @@ -24802,6 +25014,22 @@ $root.org = (function() { */ ContractModerationStatus.prototype.lists = $util.emptyArray; + /** + * ContractModerationStatus banReason. + * @member {org.dash.platform.dapi.v0.IContractModerationReason|null|undefined} banReason + * @memberof org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus + * @instance + */ + ContractModerationStatus.prototype.banReason = null; + + /** + * ContractModerationStatus suspensionReason. + * @member {org.dash.platform.dapi.v0.IContractModerationReason|null|undefined} suspensionReason + * @memberof org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus + * @instance + */ + ContractModerationStatus.prototype.suspensionReason = null; + /** * Creates a new ContractModerationStatus instance using the specified properties. * @function create @@ -24836,6 +25064,10 @@ $root.org = (function() { writer.int32(message.lists[i]); writer.ldelim(); } + if (message.banReason != null && Object.hasOwnProperty.call(message, "banReason")) + $root.org.dash.platform.dapi.v0.ContractModerationReason.encode(message.banReason, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + if (message.suspensionReason != null && Object.hasOwnProperty.call(message, "suspensionReason")) + $root.org.dash.platform.dapi.v0.ContractModerationReason.encode(message.suspensionReason, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); return writer; }; @@ -24886,6 +25118,12 @@ $root.org = (function() { } else message.lists.push(reader.int32()); break; + case 4: + message.banReason = $root.org.dash.platform.dapi.v0.ContractModerationReason.decode(reader, reader.uint32()); + break; + case 5: + message.suspensionReason = $root.org.dash.platform.dapi.v0.ContractModerationReason.decode(reader, reader.uint32()); + break; default: reader.skipType(tag & 7); break; @@ -24940,6 +25178,16 @@ $root.org = (function() { break; } } + if (message.banReason != null && message.hasOwnProperty("banReason")) { + var error = $root.org.dash.platform.dapi.v0.ContractModerationReason.verify(message.banReason); + if (error) + return "banReason." + error; + } + if (message.suspensionReason != null && message.hasOwnProperty("suspensionReason")) { + var error = $root.org.dash.platform.dapi.v0.ContractModerationReason.verify(message.suspensionReason); + if (error) + return "suspensionReason." + error; + } return null; }; @@ -24987,6 +25235,16 @@ $root.org = (function() { break; } } + if (object.banReason != null) { + if (typeof object.banReason !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus.banReason: object expected"); + message.banReason = $root.org.dash.platform.dapi.v0.ContractModerationReason.fromObject(object.banReason); + } + if (object.suspensionReason != null) { + if (typeof object.suspensionReason !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus.suspensionReason: object expected"); + message.suspensionReason = $root.org.dash.platform.dapi.v0.ContractModerationReason.fromObject(object.suspensionReason); + } return message; }; @@ -25012,6 +25270,8 @@ $root.org = (function() { object.suspendedUntil = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; } else object.suspendedUntil = options.longs === String ? "0" : 0; + object.banReason = null; + object.suspensionReason = null; } if (message.banned != null && message.hasOwnProperty("banned")) object.banned = message.banned; @@ -25025,6 +25285,10 @@ $root.org = (function() { for (var j = 0; j < message.lists.length; ++j) object.lists[j] = options.enums === String ? $root.org.dash.platform.dapi.v0.ContractModerationList[message.lists[j]] : message.lists[j]; } + if (message.banReason != null && message.hasOwnProperty("banReason")) + object.banReason = $root.org.dash.platform.dapi.v0.ContractModerationReason.toObject(message.banReason, options); + if (message.suspensionReason != null && message.hasOwnProperty("suspensionReason")) + object.suspensionReason = $root.org.dash.platform.dapi.v0.ContractModerationReason.toObject(message.suspensionReason, options); return object; }; @@ -26057,6 +26321,7 @@ $root.org = (function() { * @interface IContractModerationEntry * @property {Uint8Array|null} [identityId] ContractModerationEntry identityId * @property {number|Long|null} [until] ContractModerationEntry until + * @property {org.dash.platform.dapi.v0.IContractModerationReason|null} [reason] ContractModerationEntry reason */ /** @@ -26090,6 +26355,14 @@ $root.org = (function() { */ ContractModerationEntry.prototype.until = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + /** + * ContractModerationEntry reason. + * @member {org.dash.platform.dapi.v0.IContractModerationReason|null|undefined} reason + * @memberof org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractModerationEntry + * @instance + */ + ContractModerationEntry.prototype.reason = null; + /** * Creates a new ContractModerationEntry instance using the specified properties. * @function create @@ -26118,6 +26391,8 @@ $root.org = (function() { writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.identityId); if (message.until != null && Object.hasOwnProperty.call(message, "until")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.until); + if (message.reason != null && Object.hasOwnProperty.call(message, "reason")) + $root.org.dash.platform.dapi.v0.ContractModerationReason.encode(message.reason, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); return writer; }; @@ -26158,6 +26433,9 @@ $root.org = (function() { case 2: message.until = reader.uint64(); break; + case 3: + message.reason = $root.org.dash.platform.dapi.v0.ContractModerationReason.decode(reader, reader.uint32()); + break; default: reader.skipType(tag & 7); break; @@ -26199,6 +26477,11 @@ $root.org = (function() { if (message.until != null && message.hasOwnProperty("until")) if (!$util.isInteger(message.until) && !(message.until && $util.isInteger(message.until.low) && $util.isInteger(message.until.high))) return "until: integer|Long expected"; + if (message.reason != null && message.hasOwnProperty("reason")) { + var error = $root.org.dash.platform.dapi.v0.ContractModerationReason.verify(message.reason); + if (error) + return "reason." + error; + } return null; }; @@ -26228,6 +26511,11 @@ $root.org = (function() { message.until = object.until; else if (typeof object.until === "object") message.until = new $util.LongBits(object.until.low >>> 0, object.until.high >>> 0).toNumber(true); + if (object.reason != null) { + if (typeof object.reason !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractModerationEntry.reason: object expected"); + message.reason = $root.org.dash.platform.dapi.v0.ContractModerationReason.fromObject(object.reason); + } return message; }; @@ -26257,6 +26545,7 @@ $root.org = (function() { object.until = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; } else object.until = options.longs === String ? "0" : 0; + object.reason = 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; @@ -26265,6 +26554,8 @@ $root.org = (function() { object.until = options.longs === String ? String(message.until) : message.until; else object.until = options.longs === String ? $util.Long.prototype.toString.call(message.until) : options.longs === Number ? new $util.LongBits(message.until.low >>> 0, message.until.high >>> 0).toNumber(true) : message.until; + if (message.reason != null && message.hasOwnProperty("reason")) + object.reason = $root.org.dash.platform.dapi.v0.ContractModerationReason.toObject(message.reason, options); return object; }; 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 8aea4902e2a..ce33c8b7c77 100644 --- a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js +++ b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js @@ -23507,6 +23507,216 @@ $root.org = (function() { return values; })(); + v0.ContractModerationReason = (function() { + + /** + * Properties of a ContractModerationReason. + * @memberof org.dash.platform.dapi.v0 + * @interface IContractModerationReason + * @property {number|null} [code] ContractModerationReason code + * @property {string|null} [text] ContractModerationReason text + */ + + /** + * Constructs a new ContractModerationReason. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a ContractModerationReason. + * @implements IContractModerationReason + * @constructor + * @param {org.dash.platform.dapi.v0.IContractModerationReason=} [properties] Properties to set + */ + function ContractModerationReason(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]]; + } + + /** + * ContractModerationReason code. + * @member {number} code + * @memberof org.dash.platform.dapi.v0.ContractModerationReason + * @instance + */ + ContractModerationReason.prototype.code = 0; + + /** + * ContractModerationReason text. + * @member {string} text + * @memberof org.dash.platform.dapi.v0.ContractModerationReason + * @instance + */ + ContractModerationReason.prototype.text = ""; + + /** + * Creates a new ContractModerationReason instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.ContractModerationReason + * @static + * @param {org.dash.platform.dapi.v0.IContractModerationReason=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.ContractModerationReason} ContractModerationReason instance + */ + ContractModerationReason.create = function create(properties) { + return new ContractModerationReason(properties); + }; + + /** + * Encodes the specified ContractModerationReason message. Does not implicitly {@link org.dash.platform.dapi.v0.ContractModerationReason.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.ContractModerationReason + * @static + * @param {org.dash.platform.dapi.v0.IContractModerationReason} message ContractModerationReason message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ContractModerationReason.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.code != null && Object.hasOwnProperty.call(message, "code")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.code); + if (message.text != null && Object.hasOwnProperty.call(message, "text")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.text); + return writer; + }; + + /** + * Encodes the specified ContractModerationReason message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.ContractModerationReason.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.ContractModerationReason + * @static + * @param {org.dash.platform.dapi.v0.IContractModerationReason} message ContractModerationReason message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ContractModerationReason.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ContractModerationReason message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.ContractModerationReason + * @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.ContractModerationReason} ContractModerationReason + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ContractModerationReason.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.ContractModerationReason(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.code = reader.uint32(); + break; + case 2: + message.text = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ContractModerationReason message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.ContractModerationReason + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.ContractModerationReason} ContractModerationReason + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ContractModerationReason.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ContractModerationReason message. + * @function verify + * @memberof org.dash.platform.dapi.v0.ContractModerationReason + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ContractModerationReason.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.code != null && message.hasOwnProperty("code")) + if (!$util.isInteger(message.code)) + return "code: integer expected"; + if (message.text != null && message.hasOwnProperty("text")) + if (!$util.isString(message.text)) + return "text: string expected"; + return null; + }; + + /** + * Creates a ContractModerationReason message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.ContractModerationReason + * @static + * @param {Object.} object Plain object + * @returns {org.dash.platform.dapi.v0.ContractModerationReason} ContractModerationReason + */ + ContractModerationReason.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.ContractModerationReason) + return object; + var message = new $root.org.dash.platform.dapi.v0.ContractModerationReason(); + if (object.code != null) + message.code = object.code >>> 0; + if (object.text != null) + message.text = String(object.text); + return message; + }; + + /** + * Creates a plain object from a ContractModerationReason message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.ContractModerationReason + * @static + * @param {org.dash.platform.dapi.v0.ContractModerationReason} message ContractModerationReason + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ContractModerationReason.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.code = 0; + object.text = ""; + } + if (message.code != null && message.hasOwnProperty("code")) + object.code = message.code; + if (message.text != null && message.hasOwnProperty("text")) + object.text = message.text; + return object; + }; + + /** + * Converts this ContractModerationReason to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.ContractModerationReason + * @instance + * @returns {Object.} JSON object + */ + ContractModerationReason.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ContractModerationReason; + })(); + v0.GetContractModerationStatusRequest = (function() { /** @@ -24252,6 +24462,8 @@ $root.org = (function() { * @property {boolean|null} [banned] ContractModerationStatus banned * @property {number|Long|null} [suspendedUntil] ContractModerationStatus suspendedUntil * @property {Array.|null} [lists] ContractModerationStatus lists + * @property {org.dash.platform.dapi.v0.IContractModerationReason|null} [banReason] ContractModerationStatus banReason + * @property {org.dash.platform.dapi.v0.IContractModerationReason|null} [suspensionReason] ContractModerationStatus suspensionReason */ /** @@ -24294,6 +24506,22 @@ $root.org = (function() { */ ContractModerationStatus.prototype.lists = $util.emptyArray; + /** + * ContractModerationStatus banReason. + * @member {org.dash.platform.dapi.v0.IContractModerationReason|null|undefined} banReason + * @memberof org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus + * @instance + */ + ContractModerationStatus.prototype.banReason = null; + + /** + * ContractModerationStatus suspensionReason. + * @member {org.dash.platform.dapi.v0.IContractModerationReason|null|undefined} suspensionReason + * @memberof org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus + * @instance + */ + ContractModerationStatus.prototype.suspensionReason = null; + /** * Creates a new ContractModerationStatus instance using the specified properties. * @function create @@ -24328,6 +24556,10 @@ $root.org = (function() { writer.int32(message.lists[i]); writer.ldelim(); } + if (message.banReason != null && Object.hasOwnProperty.call(message, "banReason")) + $root.org.dash.platform.dapi.v0.ContractModerationReason.encode(message.banReason, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + if (message.suspensionReason != null && Object.hasOwnProperty.call(message, "suspensionReason")) + $root.org.dash.platform.dapi.v0.ContractModerationReason.encode(message.suspensionReason, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); return writer; }; @@ -24378,6 +24610,12 @@ $root.org = (function() { } else message.lists.push(reader.int32()); break; + case 4: + message.banReason = $root.org.dash.platform.dapi.v0.ContractModerationReason.decode(reader, reader.uint32()); + break; + case 5: + message.suspensionReason = $root.org.dash.platform.dapi.v0.ContractModerationReason.decode(reader, reader.uint32()); + break; default: reader.skipType(tag & 7); break; @@ -24432,6 +24670,16 @@ $root.org = (function() { break; } } + if (message.banReason != null && message.hasOwnProperty("banReason")) { + var error = $root.org.dash.platform.dapi.v0.ContractModerationReason.verify(message.banReason); + if (error) + return "banReason." + error; + } + if (message.suspensionReason != null && message.hasOwnProperty("suspensionReason")) { + var error = $root.org.dash.platform.dapi.v0.ContractModerationReason.verify(message.suspensionReason); + if (error) + return "suspensionReason." + error; + } return null; }; @@ -24479,6 +24727,16 @@ $root.org = (function() { break; } } + if (object.banReason != null) { + if (typeof object.banReason !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus.banReason: object expected"); + message.banReason = $root.org.dash.platform.dapi.v0.ContractModerationReason.fromObject(object.banReason); + } + if (object.suspensionReason != null) { + if (typeof object.suspensionReason !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus.suspensionReason: object expected"); + message.suspensionReason = $root.org.dash.platform.dapi.v0.ContractModerationReason.fromObject(object.suspensionReason); + } return message; }; @@ -24504,6 +24762,8 @@ $root.org = (function() { object.suspendedUntil = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; } else object.suspendedUntil = options.longs === String ? "0" : 0; + object.banReason = null; + object.suspensionReason = null; } if (message.banned != null && message.hasOwnProperty("banned")) object.banned = message.banned; @@ -24517,6 +24777,10 @@ $root.org = (function() { for (var j = 0; j < message.lists.length; ++j) object.lists[j] = options.enums === String ? $root.org.dash.platform.dapi.v0.ContractModerationList[message.lists[j]] : message.lists[j]; } + if (message.banReason != null && message.hasOwnProperty("banReason")) + object.banReason = $root.org.dash.platform.dapi.v0.ContractModerationReason.toObject(message.banReason, options); + if (message.suspensionReason != null && message.hasOwnProperty("suspensionReason")) + object.suspensionReason = $root.org.dash.platform.dapi.v0.ContractModerationReason.toObject(message.suspensionReason, options); return object; }; @@ -25549,6 +25813,7 @@ $root.org = (function() { * @interface IContractModerationEntry * @property {Uint8Array|null} [identityId] ContractModerationEntry identityId * @property {number|Long|null} [until] ContractModerationEntry until + * @property {org.dash.platform.dapi.v0.IContractModerationReason|null} [reason] ContractModerationEntry reason */ /** @@ -25582,6 +25847,14 @@ $root.org = (function() { */ ContractModerationEntry.prototype.until = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + /** + * ContractModerationEntry reason. + * @member {org.dash.platform.dapi.v0.IContractModerationReason|null|undefined} reason + * @memberof org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractModerationEntry + * @instance + */ + ContractModerationEntry.prototype.reason = null; + /** * Creates a new ContractModerationEntry instance using the specified properties. * @function create @@ -25610,6 +25883,8 @@ $root.org = (function() { writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.identityId); if (message.until != null && Object.hasOwnProperty.call(message, "until")) writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.until); + if (message.reason != null && Object.hasOwnProperty.call(message, "reason")) + $root.org.dash.platform.dapi.v0.ContractModerationReason.encode(message.reason, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); return writer; }; @@ -25650,6 +25925,9 @@ $root.org = (function() { case 2: message.until = reader.uint64(); break; + case 3: + message.reason = $root.org.dash.platform.dapi.v0.ContractModerationReason.decode(reader, reader.uint32()); + break; default: reader.skipType(tag & 7); break; @@ -25691,6 +25969,11 @@ $root.org = (function() { if (message.until != null && message.hasOwnProperty("until")) if (!$util.isInteger(message.until) && !(message.until && $util.isInteger(message.until.low) && $util.isInteger(message.until.high))) return "until: integer|Long expected"; + if (message.reason != null && message.hasOwnProperty("reason")) { + var error = $root.org.dash.platform.dapi.v0.ContractModerationReason.verify(message.reason); + if (error) + return "reason." + error; + } return null; }; @@ -25720,6 +26003,11 @@ $root.org = (function() { message.until = object.until; else if (typeof object.until === "object") message.until = new $util.LongBits(object.until.low >>> 0, object.until.high >>> 0).toNumber(true); + if (object.reason != null) { + if (typeof object.reason !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractModerationEntry.reason: object expected"); + message.reason = $root.org.dash.platform.dapi.v0.ContractModerationReason.fromObject(object.reason); + } return message; }; @@ -25749,6 +26037,7 @@ $root.org = (function() { object.until = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; } else object.until = options.longs === String ? "0" : 0; + object.reason = 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; @@ -25757,6 +26046,8 @@ $root.org = (function() { object.until = options.longs === String ? String(message.until) : message.until; else object.until = options.longs === String ? $util.Long.prototype.toString.call(message.until) : options.longs === Number ? new $util.LongBits(message.until.low >>> 0, message.until.high >>> 0).toNumber(true) : message.until; + if (message.reason != null && message.hasOwnProperty("reason")) + object.reason = $root.org.dash.platform.dapi.v0.ContractModerationReason.toObject(message.reason, options); return object; }; 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 a348af48663..e517d05b9fe 100644 --- a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js +++ b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js @@ -40,6 +40,7 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.CompactedBlockAddressBalanceC goog.exportSymbol('proto.org.dash.platform.dapi.v0.ContractGroupDocumentTypeMember', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.ContractGroupTokenMember', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.ContractModerationList', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.ContractModerationReason', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetAddressInfoRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetAddressInfoRequest.GetAddressInfoRequestV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetAddressInfoRequest.VersionCase', null, { proto }); @@ -2595,6 +2596,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.org.dash.platform.dapi.v0.GetContractGroupMembersResponse.GetContractGroupMembersResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetContractGroupMembersResponse.GetContractGroupMembersResponseV0'; } +/** + * 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.ContractModerationReason = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.ContractModerationReason, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.ContractModerationReason.displayName = 'proto.org.dash.platform.dapi.v0.ContractModerationReason'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -29157,6 +29179,184 @@ proto.org.dash.platform.dapi.v0.GetContractGroupMembersResponse.prototype.hasV0 + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#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.ContractModerationReason.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.ContractModerationReason.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.ContractModerationReason} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.ContractModerationReason.toObject = function(includeInstance, msg) { + var f, obj = { + code: jspb.Message.getFieldWithDefault(msg, 1, 0), + text: 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.ContractModerationReason} + */ +proto.org.dash.platform.dapi.v0.ContractModerationReason.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.ContractModerationReason; + return proto.org.dash.platform.dapi.v0.ContractModerationReason.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.ContractModerationReason} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.ContractModerationReason} + */ +proto.org.dash.platform.dapi.v0.ContractModerationReason.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.setText(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.ContractModerationReason.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.ContractModerationReason.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.ContractModerationReason} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.ContractModerationReason.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = /** @type {number} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeUint32( + 1, + f + ); + } + f = message.getText(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } +}; + + +/** + * optional uint32 code = 1; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.ContractModerationReason.prototype.getCode = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.ContractModerationReason} returns this + */ +proto.org.dash.platform.dapi.v0.ContractModerationReason.prototype.setCode = function(value) { + return jspb.Message.setField(this, 1, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.ContractModerationReason} returns this + */ +proto.org.dash.platform.dapi.v0.ContractModerationReason.prototype.clearCode = function() { + return jspb.Message.setField(this, 1, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.ContractModerationReason.prototype.hasCode = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional string text = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.ContractModerationReason.prototype.getText = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.ContractModerationReason} returns this + */ +proto.org.dash.platform.dapi.v0.ContractModerationReason.prototype.setText = 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 @@ -29808,7 +30008,9 @@ proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractMode var f, obj = { banned: jspb.Message.getBooleanFieldWithDefault(msg, 1, false), suspendedUntil: jspb.Message.getFieldWithDefault(msg, 2, 0), - listsList: (f = jspb.Message.getRepeatedField(msg, 3)) == null ? undefined : f + listsList: (f = jspb.Message.getRepeatedField(msg, 3)) == null ? undefined : f, + banReason: (f = msg.getBanReason()) && proto.org.dash.platform.dapi.v0.ContractModerationReason.toObject(includeInstance, f), + suspensionReason: (f = msg.getSuspensionReason()) && proto.org.dash.platform.dapi.v0.ContractModerationReason.toObject(includeInstance, f) }; if (includeInstance) { @@ -29859,6 +30061,16 @@ proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractMode msg.addLists(values[i]); } break; + case 4: + var value = new proto.org.dash.platform.dapi.v0.ContractModerationReason; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ContractModerationReason.deserializeBinaryFromReader); + msg.setBanReason(value); + break; + case 5: + var value = new proto.org.dash.platform.dapi.v0.ContractModerationReason; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ContractModerationReason.deserializeBinaryFromReader); + msg.setSuspensionReason(value); + break; default: reader.skipField(); break; @@ -29909,6 +30121,22 @@ proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractMode f ); } + f = message.getBanReason(); + if (f != null) { + writer.writeMessage( + 4, + f, + proto.org.dash.platform.dapi.v0.ContractModerationReason.serializeBinaryToWriter + ); + } + f = message.getSuspensionReason(); + if (f != null) { + writer.writeMessage( + 5, + f, + proto.org.dash.platform.dapi.v0.ContractModerationReason.serializeBinaryToWriter + ); + } }; @@ -30021,6 +30249,80 @@ proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractMode }; +/** + * optional ContractModerationReason ban_reason = 4; + * @return {?proto.org.dash.platform.dapi.v0.ContractModerationReason} + */ +proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus.prototype.getBanReason = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ContractModerationReason} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ContractModerationReason, 4)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ContractModerationReason|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus.prototype.setBanReason = function(value) { + return jspb.Message.setWrapperField(this, 4, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus} returns this + */ +proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus.prototype.clearBanReason = function() { + return this.setBanReason(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus.prototype.hasBanReason = function() { + return jspb.Message.getField(this, 4) != null; +}; + + +/** + * optional ContractModerationReason suspension_reason = 5; + * @return {?proto.org.dash.platform.dapi.v0.ContractModerationReason} + */ +proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus.prototype.getSuspensionReason = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ContractModerationReason} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ContractModerationReason, 5)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ContractModerationReason|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus.prototype.setSuspensionReason = function(value) { + return jspb.Message.setWrapperField(this, 5, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus} returns this + */ +proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus.prototype.clearSuspensionReason = function() { + return this.setSuspensionReason(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus.prototype.hasSuspensionReason = function() { + return jspb.Message.getField(this, 5) != null; +}; + + /** * Oneof group definitions for this message. Each group defines the field @@ -31019,7 +31321,8 @@ proto.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractMod proto.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractModerationEntry.toObject = function(includeInstance, msg) { var f, obj = { identityId: msg.getIdentityId_asB64(), - until: jspb.Message.getFieldWithDefault(msg, 2, 0) + until: jspb.Message.getFieldWithDefault(msg, 2, 0), + reason: (f = msg.getReason()) && proto.org.dash.platform.dapi.v0.ContractModerationReason.toObject(includeInstance, f) }; if (includeInstance) { @@ -31064,6 +31367,11 @@ proto.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractMod var value = /** @type {number} */ (reader.readUint64()); msg.setUntil(value); break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ContractModerationReason; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ContractModerationReason.deserializeBinaryFromReader); + msg.setReason(value); + break; default: reader.skipField(); break; @@ -31107,6 +31415,14 @@ proto.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractMod f ); } + f = message.getReason(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ContractModerationReason.serializeBinaryToWriter + ); + } }; @@ -31188,6 +31504,43 @@ proto.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractMod }; +/** + * optional ContractModerationReason reason = 3; + * @return {?proto.org.dash.platform.dapi.v0.ContractModerationReason} + */ +proto.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractModerationEntry.prototype.getReason = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ContractModerationReason} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ContractModerationReason, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ContractModerationReason|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractModerationEntry} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractModerationEntry.prototype.setReason = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractModerationEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractModerationEntry.prototype.clearReason = function() { + return this.setReason(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractModerationEntry.prototype.hasReason = function() { + return jspb.Message.getField(this, 3) != null; +}; + + /** * List of repeated fields within this message type. 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 cacf121114c..f21e484bfb5 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 @@ -41,6 +41,7 @@ CF_EXTERN_C_BEGIN @class CompactedBlockAddressBalanceChanges; @class ContractGroupDocumentTypeMember; @class ContractGroupTokenMember; +@class ContractModerationReason; @class GPBBytesValue; @class GPBUInt32Value; @class GetAddressInfoRequest_GetAddressInfoRequestV0; @@ -2961,6 +2962,28 @@ GPB_FINAL @interface GetContractGroupMembersResponse_GetContractGroupMembersResp **/ void GetContractGroupMembersResponse_GetContractGroupMembersResponseV0_ClearResultOneOfCase(GetContractGroupMembersResponse_GetContractGroupMembersResponseV0 *message); +#pragma mark - ContractModerationReason + +typedef GPB_ENUM(ContractModerationReason_FieldNumber) { + ContractModerationReason_FieldNumber_Code = 1, + ContractModerationReason_FieldNumber_Text = 2, +}; + +/** + * Why a moderator banned or suspended an identity. Nothing checks what a + * moderator writes. + **/ +GPB_FINAL @interface ContractModerationReason : GPBMessage + +/** Reserved for the ban codes a contract may declare in a later */ +@property(nonatomic, readwrite) uint32_t code; + +@property(nonatomic, readwrite) BOOL hasCode; +/** protocol version; a u16, expected unset today, never checked */ +@property(nonatomic, readwrite, copy, null_resettable) NSString *text; + +@end + #pragma mark - GetContractModerationStatusRequest typedef GPB_ENUM(GetContractModerationStatusRequest_FieldNumber) { @@ -3043,6 +3066,8 @@ typedef GPB_ENUM(GetContractModerationStatusResponse_ContractModerationStatus_Fi GetContractModerationStatusResponse_ContractModerationStatus_FieldNumber_Banned = 1, GetContractModerationStatusResponse_ContractModerationStatus_FieldNumber_SuspendedUntil = 2, GetContractModerationStatusResponse_ContractModerationStatus_FieldNumber_ListsArray = 3, + GetContractModerationStatusResponse_ContractModerationStatus_FieldNumber_BanReason = 4, + GetContractModerationStatusResponse_ContractModerationStatus_FieldNumber_SuspensionReason = 5, }; /** @@ -3068,6 +3093,16 @@ GPB_FINAL @interface GetContractModerationStatusResponse_ContractModerationStatu /** The number of items in @c listsArray without causing the array to be created. */ @property(nonatomic, readonly) NSUInteger listsArray_Count; +/** Set when the identity is banned: why */ +@property(nonatomic, readwrite, strong, null_resettable) ContractModerationReason *banReason; +/** Test to see if @c banReason has been set. */ +@property(nonatomic, readwrite) BOOL hasBanReason; + +/** Set when the identity is suspended: why */ +@property(nonatomic, readwrite, strong, null_resettable) ContractModerationReason *suspensionReason; +/** Test to see if @c suspensionReason has been set. */ +@property(nonatomic, readwrite) BOOL hasSuspensionReason; + @end #pragma mark - GetContractModerationStatusResponse_GetContractModerationStatusResponseV0 @@ -3203,6 +3238,7 @@ void GetContractModerationEntriesResponse_ClearVersionOneOfCase(GetContractModer typedef GPB_ENUM(GetContractModerationEntriesResponse_ContractModerationEntry_FieldNumber) { GetContractModerationEntriesResponse_ContractModerationEntry_FieldNumber_IdentityId = 1, GetContractModerationEntriesResponse_ContractModerationEntry_FieldNumber_Until = 2, + GetContractModerationEntriesResponse_ContractModerationEntry_FieldNumber_Reason = 3, }; GPB_FINAL @interface GetContractModerationEntriesResponse_ContractModerationEntry : GPBMessage @@ -3214,6 +3250,11 @@ GPB_FINAL @interface GetContractModerationEntriesResponse_ContractModerationEntr @property(nonatomic, readwrite) uint64_t until; @property(nonatomic, readwrite) BOOL hasUntil; +/** which it lapses */ +@property(nonatomic, readwrite, strong, null_resettable) ContractModerationReason *reason; +/** Test to see if @c reason has been set. */ +@property(nonatomic, readwrite) BOOL hasReason; + @end #pragma mark - GetContractModerationEntriesResponse_ContractModerationEntries 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 97bc6753894..d4519e6c3bc 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 @@ -41,6 +41,7 @@ GPBObjCClassDeclaration(CompactedBlockAddressBalanceChanges); GPBObjCClassDeclaration(ContractGroupDocumentTypeMember); GPBObjCClassDeclaration(ContractGroupTokenMember); +GPBObjCClassDeclaration(ContractModerationReason); GPBObjCClassDeclaration(GPBBytesValue); GPBObjCClassDeclaration(GPBUInt32Value); GPBObjCClassDeclaration(GetAddressInfoRequest); @@ -6218,6 +6219,62 @@ void GetContractGroupMembersResponse_GetContractGroupMembersResponseV0_ClearResu GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; GPBClearOneof(message, oneof); } +#pragma mark - ContractModerationReason + +@implementation ContractModerationReason + +@dynamic hasCode, code; +@dynamic text; + +typedef struct ContractModerationReason__storage_ { + uint32_t _has_storage_[1]; + uint32_t code; + NSString *text; +} ContractModerationReason__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 = "code", + .dataTypeSpecific.clazz = Nil, + .number = ContractModerationReason_FieldNumber_Code, + .hasIndex = 0, + .offset = (uint32_t)offsetof(ContractModerationReason__storage_, code), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeUInt32, + }, + { + .name = "text", + .dataTypeSpecific.clazz = Nil, + .number = ContractModerationReason_FieldNumber_Text, + .hasIndex = 1, + .offset = (uint32_t)offsetof(ContractModerationReason__storage_, text), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeString, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[ContractModerationReason class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(ContractModerationReason__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + #pragma mark - GetContractModerationStatusRequest @implementation GetContractModerationStatusRequest @@ -6417,10 +6474,14 @@ @implementation GetContractModerationStatusResponse_ContractModerationStatus @dynamic hasBanned, banned; @dynamic hasSuspendedUntil, suspendedUntil; @dynamic listsArray, listsArray_Count; +@dynamic hasBanReason, banReason; +@dynamic hasSuspensionReason, suspensionReason; typedef struct GetContractModerationStatusResponse_ContractModerationStatus__storage_ { uint32_t _has_storage_[1]; GPBEnumArray *listsArray; + ContractModerationReason *banReason; + ContractModerationReason *suspensionReason; uint64_t suspendedUntil; } GetContractModerationStatusResponse_ContractModerationStatus__storage_; @@ -6457,6 +6518,24 @@ + (GPBDescriptor *)descriptor { .flags = (GPBFieldFlags)(GPBFieldRepeated | GPBFieldPacked | GPBFieldHasEnumDescriptor), .dataType = GPBDataTypeEnum, }, + { + .name = "banReason", + .dataTypeSpecific.clazz = GPBObjCClass(ContractModerationReason), + .number = GetContractModerationStatusResponse_ContractModerationStatus_FieldNumber_BanReason, + .hasIndex = 3, + .offset = (uint32_t)offsetof(GetContractModerationStatusResponse_ContractModerationStatus__storage_, banReason), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "suspensionReason", + .dataTypeSpecific.clazz = GPBObjCClass(ContractModerationReason), + .number = GetContractModerationStatusResponse_ContractModerationStatus_FieldNumber_SuspensionReason, + .hasIndex = 4, + .offset = (uint32_t)offsetof(GetContractModerationStatusResponse_ContractModerationStatus__storage_, suspensionReason), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, }; GPBDescriptor *localDescriptor = [GPBDescriptor allocDescriptorForClass:[GetContractModerationStatusResponse_ContractModerationStatus class] @@ -6778,10 +6857,12 @@ @implementation GetContractModerationEntriesResponse_ContractModerationEntry @dynamic identityId; @dynamic hasUntil, until; +@dynamic hasReason, reason; typedef struct GetContractModerationEntriesResponse_ContractModerationEntry__storage_ { uint32_t _has_storage_[1]; NSData *identityId; + ContractModerationReason *reason; uint64_t until; } GetContractModerationEntriesResponse_ContractModerationEntry__storage_; @@ -6809,6 +6890,15 @@ + (GPBDescriptor *)descriptor { .flags = GPBFieldOptional, .dataType = GPBDataTypeUInt64, }, + { + .name = "reason", + .dataTypeSpecific.clazz = GPBObjCClass(ContractModerationReason), + .number = GetContractModerationEntriesResponse_ContractModerationEntry_FieldNumber_Reason, + .hasIndex = 2, + .offset = (uint32_t)offsetof(GetContractModerationEntriesResponse_ContractModerationEntry__storage_, reason), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, }; GPBDescriptor *localDescriptor = [GPBDescriptor allocDescriptorForClass:[GetContractModerationEntriesResponse_ContractModerationEntry class] 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 c0c000bc72c..2ffcac6ee0a 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\"\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\"\x8e\x02\n&GetIdentityKeysRemainingBudgetsRequest\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetIdentityKeysRemainingBudgetsRequest.GetIdentityKeysRemainingBudgetsRequestV0H\x00\x1a_\n(GetIdentityKeysRemainingBudgetsRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x0f\n\x07key_ids\x18\x02 \x03(\r\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\x96\x06\n\'GetIdentityKeysRemainingBudgetsResponse\x12z\n\x02v0\x18\x01 \x01(\x0b\x32l.org.dash.platform.dapi.v0.GetIdentityKeysRemainingBudgetsResponse.GetIdentityKeysRemainingBudgetsResponseV0H\x00\x1a\xe3\x04\n)GetIdentityKeysRemainingBudgetsResponseV0\x12\xa4\x01\n\x16keys_remaining_budgets\x18\x01 \x01(\x0b\x32\x81\x01.org.dash.platform.dapi.v0.GetIdentityKeysRemainingBudgetsResponse.GetIdentityKeysRemainingBudgetsResponseV0.KeysRemainingBudgetsH\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\x61\n\x17KeyRemainingBudgetEntry\x12\x0e\n\x06key_id\x18\x01 \x01(\r\x12!\n\x10remaining_budget\x18\x02 \x01(\x04\x42\x02\x30\x01H\x00\x88\x01\x01\x42\x13\n\x11_remaining_budget\x1a\xaf\x01\n\x14KeysRemainingBudgets\x12\x96\x01\n\x07\x65ntries\x18\x01 \x03(\x0b\x32\x84\x01.org.dash.platform.dapi.v0.GetIdentityKeysRemainingBudgetsResponse.GetIdentityKeysRemainingBudgetsResponseV0.KeyRemainingBudgetEntryB\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\"\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\"\x8c\x02\n%GetDataContractsLatestVersionsRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetDataContractsLatestVersionsRequest.GetDataContractsLatestVersionsRequestV0H\x00\x1a`\n\'GetDataContractsLatestVersionsRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\x19\n\x11include_contracts\x18\x02 \x01(\x08\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xfa\x05\n&GetDataContractsLatestVersionsResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetDataContractsLatestVersionsResponse.GetDataContractsLatestVersionsResponseV0H\x00\x1a\x84\x01\n\x1e\x44\x61taContractLatestVersionEntry\x12\x12\n\nidentifier\x18\x01 \x01(\x0c\x12\x14\n\x07version\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x1a\n\rdata_contract\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x42\n\n\x08_versionB\x10\n\x0e_data_contract\x1a\x90\x01\n\x1b\x44\x61taContractsLatestVersions\x12q\n\x07\x65ntries\x18\x01 \x03(\x0b\x32`.org.dash.platform.dapi.v0.GetDataContractsLatestVersionsResponse.DataContractLatestVersionEntry\x1a\xb0\x02\n(GetDataContractsLatestVersionsResponseV0\x12\x87\x01\n\x1e\x64\x61ta_contracts_latest_versions\x18\x01 \x01(\x0b\x32].org.dash.platform.dapi.v0.GetDataContractsLatestVersionsResponse.DataContractsLatestVersionsH\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\"R\n\x1f\x43ontractGroupDocumentTypeMember\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\"G\n\x18\x43ontractGroupTokenMember\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x16\n\x0etoken_position\x18\x02 \x01(\r\"\xd7\x01\n\x1bGetContractGroupInfoRequest\x12\x62\n\x02v0\x18\x01 \x01(\x0b\x32T.org.dash.platform.dapi.v0.GetContractGroupInfoRequest.GetContractGroupInfoRequestV0H\x00\x1aI\n\x1dGetContractGroupInfoRequestV0\x12\x19\n\x11\x63ontract_group_id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x98\x04\n\x1cGetContractGroupInfoResponse\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetContractGroupInfoResponse.GetContractGroupInfoResponseV0H\x00\x1a~\n\x11\x43ontractGroupInfo\x12\x10\n\x08owner_id\x18\x01 \x01(\x0c\x12\x11\n\tadmin_ids\x18\x02 \x03(\x0c\x12\x11\n\x04name\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x04 \x01(\tH\x01\x88\x01\x01\x42\x07\n\x05_nameB\x0e\n\x0c_description\x1a\x86\x02\n\x1eGetContractGroupInfoResponseV0\x12h\n\x13\x63ontract_group_info\x18\x01 \x01(\x0b\x32I.org.dash.platform.dapi.v0.GetContractGroupInfoResponse.ContractGroupInfoH\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\"\xf8\x06\n\x1eGetContractGroupMembersRequest\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetContractGroupMembersRequest.GetContractGroupMembersRequestV0H\x00\x1a@\n\x14\x43ontractMembersQuery\x12\x18\n\x0bstart_after\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x42\x0e\n\x0c_start_after\x1a\x80\x01\n\x18\x44ocumentTypeMembersQuery\x12T\n\x0bstart_after\x18\x01 \x01(\x0b\x32:.org.dash.platform.dapi.v0.ContractGroupDocumentTypeMemberH\x00\x88\x01\x01\x42\x0e\n\x0c_start_after\x1ar\n\x11TokenMembersQuery\x12M\n\x0bstart_after\x18\x01 \x01(\x0b\x32\x33.org.dash.platform.dapi.v0.ContractGroupTokenMemberH\x00\x88\x01\x01\x42\x0e\n\x0c_start_after\x1a\xa7\x03\n GetContractGroupMembersRequestV0\x12\x19\n\x11\x63ontract_group_id\x18\x01 \x01(\x0c\x12\x63\n\tcontracts\x18\x02 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetContractGroupMembersRequest.ContractMembersQueryH\x00\x12l\n\x0e\x64ocument_types\x18\x03 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetContractGroupMembersRequest.DocumentTypeMembersQueryH\x00\x12]\n\x06tokens\x18\x04 \x01(\x0b\x32K.org.dash.platform.dapi.v0.GetContractGroupMembersRequest.TokenMembersQueryH\x00\x12\x12\n\x05limit\x18\x05 \x01(\rH\x01\x88\x01\x01\x12\r\n\x05prove\x18\x06 \x01(\x08\x42\t\n\x07membersB\x08\n\x06_limitB\t\n\x07version\"\xc9\x06\n\x1fGetContractGroupMembersResponse\x12j\n\x02v0\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetContractGroupMembersResponse.GetContractGroupMembersResponseV0H\x00\x1a\'\n\x0f\x43ontractMembers\x12\x14\n\x0c\x63ontract_ids\x18\x01 \x03(\x0c\x1ai\n\x13\x44ocumentTypeMembers\x12R\n\x0e\x64ocument_types\x18\x01 \x03(\x0b\x32:.org.dash.platform.dapi.v0.ContractGroupDocumentTypeMember\x1aS\n\x0cTokenMembers\x12\x43\n\x06tokens\x18\x01 \x03(\x0b\x32\x33.org.dash.platform.dapi.v0.ContractGroupTokenMember\x1a\xc5\x03\n!GetContractGroupMembersResponseV0\x12_\n\tcontracts\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetContractGroupMembersResponse.ContractMembersH\x00\x12h\n\x0e\x64ocument_types\x18\x02 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetContractGroupMembersResponse.DocumentTypeMembersH\x00\x12Y\n\x06tokens\x18\x03 \x01(\x0b\x32G.org.dash.platform.dapi.v0.GetContractGroupMembersResponse.TokenMembersH\x00\x12\x31\n\x05proof\x18\x04 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x05 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc5\x02\n\"GetContractModerationStatusRequest\x12p\n\x02v0\x18\x01 \x01(\x0b\x32\x62.org.dash.platform.dapi.v0.GetContractModerationStatusRequest.GetContractModerationStatusRequestV0H\x00\x1a\xa1\x01\n$GetContractModerationStatusRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x13\n\x0bidentity_id\x18\x02 \x01(\x0c\x12@\n\x05lists\x18\x03 \x03(\x0e\x32\x31.org.dash.platform.dapi.v0.ContractModerationList\x12\r\n\x05prove\x18\x04 \x01(\x08\x42\t\n\x07version\"\xe6\x04\n#GetContractModerationStatusResponse\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.GetContractModerationStatusResponseV0H\x00\x1a\xae\x01\n\x18\x43ontractModerationStatus\x12\x13\n\x06\x62\x61nned\x18\x01 \x01(\x08H\x00\x88\x01\x01\x12\x1c\n\x0fsuspended_until\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12@\n\x05lists\x18\x03 \x03(\x0e\x32\x31.org.dash.platform.dapi.v0.ContractModerationListB\t\n\x07_bannedB\x12\n\x10_suspended_until\x1a\x8e\x02\n%GetContractModerationStatusResponseV0\x12i\n\x06status\x18\x01 \x01(\x0b\x32W.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatusH\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\x02\n#GetContractModerationEntriesRequest\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.GetContractModerationEntriesRequest.GetContractModerationEntriesRequestV0H\x00\x1a\xd4\x01\n%GetContractModerationEntriesRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12?\n\x04list\x18\x02 \x01(\x0e\x32\x31.org.dash.platform.dapi.v0.ContractModerationList\x12\x18\n\x0bstart_after\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\x05limit\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\x0e\n\x0c_start_afterB\x08\n\x06_limitB\t\n\x07version\"\x92\x05\n$GetContractModerationEntriesResponse\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.GetContractModerationEntriesResponseV0H\x00\x1aL\n\x17\x43ontractModerationEntry\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x12\n\x05until\x18\x02 \x01(\x04H\x00\x88\x01\x01\x42\x08\n\x06_until\x1a\x85\x01\n\x19\x43ontractModerationEntries\x12h\n\x07\x65ntries\x18\x01 \x03(\x0b\x32W.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractModerationEntry\x1a\x92\x02\n&GetContractModerationEntriesResponseV0\x12l\n\x07\x65ntries\x18\x01 \x01(\x0b\x32Y.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractModerationEntriesH\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\"\xf1\x01\n#GetContractGroupsForContractRequest\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.GetContractGroupsForContractRequest.GetContractGroupsForContractRequestV0H\x00\x1aK\n%GetContractGroupsForContractRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xf5\x06\n$GetContractGroupsForContractResponse\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetContractGroupsForContractResponse.GetContractGroupsForContractResponseV0H\x00\x1aQ\n\x17\x44ocumentTypeMemberships\x12\x1a\n\x12\x64ocument_type_name\x18\x01 \x01(\t\x12\x1a\n\x12\x63ontract_group_ids\x18\x02 \x03(\x0c\x1a\x46\n\x10TokenMemberships\x12\x16\n\x0etoken_position\x18\x01 \x01(\r\x12\x1a\n\x12\x63ontract_group_ids\x18\x02 \x03(\x0c\x1a\x89\x02\n\x18\x43ontractGroupMemberships\x12\x1a\n\x12\x63ontract_group_ids\x18\x01 \x03(\x0c\x12o\n\x0e\x64ocument_types\x18\x02 \x03(\x0b\x32W.org.dash.platform.dapi.v0.GetContractGroupsForContractResponse.DocumentTypeMemberships\x12`\n\x06tokens\x18\x03 \x03(\x0b\x32P.org.dash.platform.dapi.v0.GetContractGroupsForContractResponse.TokenMemberships\x1a\xa4\x02\n&GetContractGroupsForContractResponseV0\x12~\n\x1a\x63ontract_group_memberships\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetContractGroupsForContractResponse.ContractGroupMembershipsH\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\"\xad\x02\n\x1eGetDataContractsByRangeRequest\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetDataContractsByRangeRequest.GetDataContractsByRangeRequestV0H\x00\x1a\x95\x01\n GetDataContractsByRangeRequestV0\x12\x12\n\x05limit\x18\x01 \x01(\rH\x01\x88\x01\x01\x12\x15\n\x0bstart_after\x18\x02 \x01(\x0cH\x00\x12\x12\n\x08start_at\x18\x03 \x01(\x0cH\x00\x12\x10\n\x08ids_only\x18\x04 \x01(\x08\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\x07\n\x05startB\x08\n\x06_limitB\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\"\xe0\x1f\n\x13GetDocumentsRequest\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0H\x00\x12R\n\x02v1\x18\x02 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV1H\x00\x1a\xfe\x02\n\x12\x44ocumentFieldValue\x12\x14\n\nbool_value\x18\x01 \x01(\x08H\x00\x12\x19\n\x0bint64_value\x18\x02 \x01(\x12\x42\x02\x30\x01H\x00\x12\x1a\n\x0cuint64_value\x18\x03 \x01(\x04\x42\x02\x30\x01H\x00\x12\x16\n\x0c\x64ouble_value\x18\x04 \x01(\x01H\x00\x12\x0e\n\x04text\x18\x05 \x01(\tH\x00\x12\x15\n\x0b\x62ytes_value\x18\x06 \x01(\x0cH\x00\x12[\n\x04list\x18\x07 \x01(\x0b\x32K.org.dash.platform.dapi.v0.GetDocumentsRequest.DocumentFieldValue.ValueListH\x00\x12\x14\n\nnull_value\x18\x08 \x01(\x08H\x00\x1a^\n\tValueList\x12Q\n\x06values\x18\x01 \x03(\x0b\x32\x41.org.dash.platform.dapi.v0.GetDocumentsRequest.DocumentFieldValueB\t\n\x07variant\x1a\xe2\x02\n\x12TimeRangeSelection\x12\\\n\x08selector\x18\x01 \x01(\x0e\x32J.org.dash.platform.dapi.v0.GetDocumentsRequest.TimeRangeSelection.Selector\x12\x19\n\x08start_ms\x18\x02 \x01(\x04\x42\x02\x30\x01H\x00\x88\x01\x01\x12T\n\x04grid\x18\x03 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetDocumentsRequest.TimeRangeSelection.Grid\x1a>\n\x04Grid\x12\x11\n\x05range\x18\x01 \x01(\x04\x42\x02\x30\x01\x12\x10\n\x04step\x18\x02 \x01(\x04\x42\x02\x30\x01\x12\x11\n\x05phase\x18\x03 \x01(\x04\x42\x02\x30\x01\"0\n\x08Selector\x12\n\n\x06NEWEST\x10\x00\x12\n\n\x06OLDEST\x10\x01\x12\x0c\n\x08\x42Y_START\x10\x02\x42\x0b\n\t_start_ms\x1a\x95\x02\n\x0bWhereClause\x12\r\n\x05\x66ield\x18\x01 \x01(\t\x12N\n\x08operator\x18\x02 \x01(\x0e\x32<.org.dash.platform.dapi.v0.GetDocumentsRequest.WhereOperator\x12P\n\x05value\x18\x03 \x01(\x0b\x32\x41.org.dash.platform.dapi.v0.GetDocumentsRequest.DocumentFieldValue\x12U\n\ntime_range\x18\x04 \x01(\x0b\x32\x41.org.dash.platform.dapi.v0.GetDocumentsRequest.TimeRangeSelection\x1a\xa4\x01\n\x0fHavingAggregate\x12Y\n\x08\x66unction\x18\x01 \x01(\x0e\x32G.org.dash.platform.dapi.v0.GetDocumentsRequest.HavingAggregate.Function\x12\r\n\x05\x66ield\x18\x02 \x01(\t\"\'\n\x08\x46unction\x12\t\n\x05\x43OUNT\x10\x00\x12\x07\n\x03SUM\x10\x01\x12\x07\n\x03\x41VG\x10\x02\x1a\xf9\x03\n\x0cHavingClause\x12Q\n\taggregate\x18\x01 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetDocumentsRequest.HavingAggregate\x12V\n\x08operator\x18\x02 \x01(\x0e\x32\x44.org.dash.platform.dapi.v0.GetDocumentsRequest.HavingClause.Operator\x12R\n\x05value\x18\x03 \x01(\x0b\x32\x41.org.dash.platform.dapi.v0.GetDocumentsRequest.DocumentFieldValueH\x00\"\xe0\x01\n\x08Operator\x12\t\n\x05\x45QUAL\x10\x00\x12\r\n\tNOT_EQUAL\x10\x01\x12\x10\n\x0cGREATER_THAN\x10\x02\x12\x1a\n\x16GREATER_THAN_OR_EQUALS\x10\x03\x12\r\n\tLESS_THAN\x10\x04\x12\x17\n\x13LESS_THAN_OR_EQUALS\x10\x05\x12\x0b\n\x07\x42\x45TWEEN\x10\x06\x12\x1a\n\x16\x42\x45TWEEN_EXCLUDE_BOUNDS\x10\x07\x12\x18\n\x14\x42\x45TWEEN_EXCLUDE_LEFT\x10\x08\x12\x19\n\x15\x42\x45TWEEN_EXCLUDE_RIGHT\x10\t\x12\x06\n\x02IN\x10\nB\x07\n\x05right\x1a\x90\x01\n\x0bOrderClause\x12\x0f\n\x05\x66ield\x18\x01 \x01(\tH\x00\x12S\n\taggregate\x18\x03 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetDocumentsRequest.HavingAggregateH\x00\x12\x11\n\tascending\x18\x02 \x01(\x08\x42\x08\n\x06target\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\x05start\x1a\xa6\x0c\n\x15GetDocumentsRequestV1\x12\x18\n\x10\x64\x61ta_contract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12Q\n\rwhere_clauses\x18\x03 \x03(\x0b\x32:.org.dash.platform.dapi.v0.GetDocumentsRequest.WhereClause\x12L\n\x08order_by\x18\x04 \x03(\x0b\x32:.org.dash.platform.dapi.v0.GetDocumentsRequest.OrderClause\x12\x12\n\x05limit\x18\x05 \x01(\rH\x01\x88\x01\x01\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\x12\\\n\x07selects\x18\t \x03(\x0b\x32K.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV1.Select\x12\x10\n\x08group_by\x18\n \x03(\t\x12K\n\x06having\x18\x0b \x03(\x0b\x32;.org.dash.platform.dapi.v0.GetDocumentsRequest.HavingClause\x12\x13\n\x06offset\x18\x0c \x01(\rH\x02\x88\x01\x01\x12\x61\n\x07\x63hained\x18\r \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV1.ChainedJoin\x12\x62\n\x0bsub_queries\x18\x0e \x03(\x0b\x32M.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV1.SubQuery\x1a\xc9\x01\n\x06Select\x12\x66\n\x08\x66unction\x18\x01 \x01(\x0e\x32T.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV1.Select.Function\x12\r\n\x05\x66ield\x18\x02 \x01(\t\"H\n\x08\x46unction\x12\r\n\tDOCUMENTS\x10\x00\x12\t\n\x05\x43OUNT\x10\x01\x12\x07\n\x03SUM\x10\x02\x12\x07\n\x03\x41VG\x10\x03\x12\x07\n\x03MIN\x10\x04\x12\x07\n\x03MAX\x10\x05\x1a\x41\n\x0b\x43hainedJoin\x12\x15\n\rjoin_property\x18\x01 \x01(\t\x12\x1b\n\x13outer_document_type\x18\x02 \x01(\t\x1a\xa6\x04\n\x08SubQuery\x12\x18\n\x10\x64\x61ta_contract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12Q\n\rwhere_clauses\x18\x03 \x03(\x0b\x32:.org.dash.platform.dapi.v0.GetDocumentsRequest.WhereClause\x12L\n\x08order_by\x18\x04 \x03(\x0b\x32:.org.dash.platform.dapi.v0.GetDocumentsRequest.OrderClause\x12\x12\n\x05limit\x18\x05 \x01(\rH\x00\x88\x01\x01\x12`\n\x04kind\x18\x06 \x01(\x0e\x32R.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV1.SubQuery.Kind\x12\x63\n\x04\x62ind\x18\x07 \x01(\x0b\x32U.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV1.SubQuery.Binding\x1a\x41\n\x07\x42inding\x12\x0e\n\x06source\x18\x01 \x01(\r\x12\x17\n\x0fsource_property\x18\x02 \x01(\t\x12\r\n\x05\x66ield\x18\x03 \x01(\t\" \n\x04Kind\x12\r\n\tDOCUMENTS\x10\x00\x12\t\n\x05\x43OUNT\x10\x01\x42\x08\n\x06_limitB\x07\n\x05startB\x08\n\x06_limitB\t\n\x07_offset\"\xfa\x01\n\rWhereOperator\x12\t\n\x05\x45QUAL\x10\x00\x12\x10\n\x0cGREATER_THAN\x10\x01\x12\x1a\n\x16GREATER_THAN_OR_EQUALS\x10\x02\x12\r\n\tLESS_THAN\x10\x03\x12\x17\n\x13LESS_THAN_OR_EQUALS\x10\x04\x12\x0b\n\x07\x42\x45TWEEN\x10\x05\x12\x1a\n\x16\x42\x45TWEEN_EXCLUDE_BOUNDS\x10\x06\x12\x18\n\x14\x42\x45TWEEN_EXCLUDE_LEFT\x10\x07\x12\x19\n\x15\x42\x45TWEEN_EXCLUDE_RIGHT\x10\x08\x12\x06\n\x02IN\x10\t\x12\x0f\n\x0bSTARTS_WITH\x10\n\x12\x11\n\rIN_TIME_RANGE\x10\x0b\x42\t\n\x07version\"\xc2\x1b\n\x14GetDocumentsResponse\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0H\x00\x12T\n\x02v1\x18\x02 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1H\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\x06result\x1a\xd4\x17\n\x16GetDocumentsResponseV1\x12\x61\n\x04\x64\x61ta\x18\x01 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.ResultDataH\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\x1aL\n\nCountEntry\x12\x13\n\x06in_key\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x0b\n\x03key\x18\x02 \x01(\x0c\x12\x11\n\x05\x63ount\x18\x03 \x01(\x04\x42\x02\x30\x01\x42\t\n\x07_in_key\x1ar\n\x0c\x43ountEntries\x12\x62\n\x07\x65ntries\x18\x01 \x03(\x0b\x32Q.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.CountEntry\x1a\xa0\x01\n\x0c\x43ountResults\x12\x1d\n\x0f\x61ggregate_count\x18\x01 \x01(\x04\x42\x02\x30\x01H\x00\x12\x66\n\x07\x65ntries\x18\x02 \x01(\x0b\x32S.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.CountEntriesH\x00\x42\t\n\x07variant\x1aH\n\x08SumEntry\x12\x13\n\x06in_key\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x0b\n\x03key\x18\x02 \x01(\x0c\x12\x0f\n\x03sum\x18\x03 \x01(\x12\x42\x02\x30\x01\x42\t\n\x07_in_key\x1an\n\nSumEntries\x12`\n\x07\x65ntries\x18\x01 \x03(\x0b\x32O.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.SumEntry\x1a\x9a\x01\n\nSumResults\x12\x1b\n\raggregate_sum\x18\x01 \x01(\x12\x42\x02\x30\x01H\x00\x12\x64\n\x07\x65ntries\x18\x02 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.SumEntriesH\x00\x42\t\n\x07variant\x1a_\n\x0c\x41verageEntry\x12\x13\n\x06in_key\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x0b\n\x03key\x18\x02 \x01(\x0c\x12\x11\n\x05\x63ount\x18\x03 \x01(\x04\x42\x02\x30\x01\x12\x0f\n\x03sum\x18\x04 \x01(\x12\x42\x02\x30\x01\x42\t\n\x07_in_key\x1av\n\x0e\x41verageEntries\x12\x64\n\x07\x65ntries\x18\x01 \x03(\x0b\x32S.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.AverageEntry\x1a\x36\n\x10\x41verageAggregate\x12\x11\n\x05\x63ount\x18\x01 \x01(\x04\x42\x02\x30\x01\x12\x0f\n\x03sum\x18\x02 \x01(\x12\x42\x02\x30\x01\x1a\xfb\x01\n\x0e\x41verageResults\x12t\n\x11\x61ggregate_average\x18\x01 \x01(\x0b\x32W.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.AverageAggregateH\x00\x12h\n\x07\x65ntries\x18\x02 \x01(\x0b\x32U.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.AverageEntriesH\x00\x42\t\n\x07variant\x1az\n\x0bRankedEntry\x12\x0b\n\x03key\x18\x01 \x01(\x0c\x12\x13\n\x05\x63ount\x18\x02 \x01(\x04\x42\x02\x30\x01H\x00\x12\x11\n\x03sum\x18\x03 \x01(\x12\x42\x02\x30\x01H\x00\x12\r\n\x03\x61vg\x18\x04 \x01(\x01H\x00\x12\x13\n\x06in_key\x18\x05 \x01(\x0cH\x01\x88\x01\x01\x42\x07\n\x05valueB\t\n\x07_in_key\x1a\x9a\x01\n\rRankedEntries\x12\x63\n\x07\x65ntries\x18\x01 \x03(\x0b\x32R.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.RankedEntry\x12\x18\n\x07skipped\x18\x02 \x01(\x04\x42\x02\x30\x01H\x00\x88\x01\x01\x42\n\n\x08_skipped\x1a\xf7\x05\n\nResultData\x12\x65\n\tdocuments\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.DocumentsH\x00\x12\x65\n\x06\x63ounts\x18\x02 \x01(\x0b\x32S.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.CountResultsH\x00\x12\x61\n\x04sums\x18\x03 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.SumResultsH\x00\x12i\n\x08\x61verages\x18\x04 \x01(\x0b\x32U.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.AverageResultsH\x00\x12\x66\n\x06ranked\x18\x05 \x01(\x0b\x32T.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.RankedEntriesH\x00\x12j\n\x07\x63hained\x18\x06 \x01(\x0b\x32W.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.ChainedDocumentsH\x00\x12n\n\tcomposite\x18\x07 \x01(\x0b\x32Y.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.CompositeDocumentsH\x00\x42\t\n\x07variant\x1a\x44\n\x10\x43hainedDocuments\x12\x17\n\x0finner_documents\x18\x01 \x03(\x0c\x12\x17\n\x0fouter_documents\x18\x02 \x03(\x0c\x1a\x96\x03\n\x12\x43ompositeDocuments\x12\x16\n\x0epage_documents\x18\x01 \x03(\x0c\x12}\n\x0bsub_results\x18\x02 \x03(\x0b\x32h.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.CompositeDocuments.SubQueryResult\x1a\xe8\x01\n\x0eSubQueryResult\x12\x65\n\tdocuments\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.DocumentsH\x00\x12\x65\n\x06\x63ounts\x18\x02 \x01(\x0b\x32S.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.CountEntriesH\x00\x42\x08\n\x06resultB\x08\n\x06resultB\t\n\x07version\"\xf4\x02\n\x19GetDocumentHistoryRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetDocumentHistoryRequest.GetDocumentHistoryRequestV0H\x00\x1a\xeb\x01\n\x1bGetDocumentHistoryRequestV0\x12\x18\n\x10\x64\x61ta_contract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\x13\n\x0b\x64ocument_id\x18\x03 \x01(\x0c\x12+\n\x05limit\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x05 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x17\n\x0bstart_at_ms\x18\x06 \x01(\x04\x42\x02\x30\x01\x12\r\n\x05prove\x18\x07 \x01(\x08\x42\t\n\x07version\"\xf7\x04\n\x1aGetDocumentHistoryResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetDocumentHistoryResponse.GetDocumentHistoryResponseV0H\x00\x1a\xeb\x03\n\x1cGetDocumentHistoryResponseV0\x12~\n\x10\x64ocument_history\x18\x01 \x01(\x0b\x32\x62.org.dash.platform.dapi.v0.GetDocumentHistoryResponse.GetDocumentHistoryResponseV0.DocumentHistoryH\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\x14\x44ocumentHistoryEntry\x12\x10\n\x04\x64\x61te\x18\x01 \x01(\x04\x42\x02\x30\x01\x12\r\n\x05value\x18\x02 \x01(\x0c\x1a\x95\x01\n\x0f\x44ocumentHistory\x12\x81\x01\n\x10\x64ocument_entries\x18\x01 \x03(\x0b\x32g.org.dash.platform.dapi.v0.GetDocumentHistoryResponse.GetDocumentHistoryResponseV0.DocumentHistoryEntryB\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\"\xbd\x02\n*GetIdentityByNonUniquePublicKeyHashRequest\x12\x80\x01\n\x02v0\x18\x01 \x01(\x0b\x32r.org.dash.platform.dapi.v0.GetIdentityByNonUniquePublicKeyHashRequest.GetIdentityByNonUniquePublicKeyHashRequestV0H\x00\x1a\x80\x01\n,GetIdentityByNonUniquePublicKeyHashRequestV0\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12\x18\n\x0bstart_after\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\x0e\n\x0c_start_afterB\t\n\x07version\"\xd6\x06\n+GetIdentityByNonUniquePublicKeyHashResponse\x12\x82\x01\n\x02v0\x18\x01 \x01(\x0b\x32t.org.dash.platform.dapi.v0.GetIdentityByNonUniquePublicKeyHashResponse.GetIdentityByNonUniquePublicKeyHashResponseV0H\x00\x1a\x96\x05\n-GetIdentityByNonUniquePublicKeyHashResponseV0\x12\x9a\x01\n\x08identity\x18\x01 \x01(\x0b\x32\x85\x01.org.dash.platform.dapi.v0.GetIdentityByNonUniquePublicKeyHashResponse.GetIdentityByNonUniquePublicKeyHashResponseV0.IdentityResponseH\x00\x12\x9d\x01\n\x05proof\x18\x02 \x01(\x0b\x32\x8b\x01.org.dash.platform.dapi.v0.GetIdentityByNonUniquePublicKeyHashResponse.GetIdentityByNonUniquePublicKeyHashResponseV0.IdentityProvedResponseH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x36\n\x10IdentityResponse\x12\x15\n\x08identity\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_identity\x1a\xa6\x01\n\x16IdentityProvedResponse\x12P\n&grovedb_identity_public_key_hash_proof\x18\x01 \x01(\x0b\x32 .org.dash.platform.dapi.v0.Proof\x12!\n\x14identity_proof_bytes\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x17\n\x15_identity_proof_bytesB\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\"\xbf\x02\n\x1dGetFinalizedEpochInfosRequest\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetFinalizedEpochInfosRequest.GetFinalizedEpochInfosRequestV0H\x00\x1a\xaa\x01\n\x1fGetFinalizedEpochInfosRequestV0\x12\x19\n\x11start_epoch_index\x18\x01 \x01(\r\x12\"\n\x1astart_epoch_index_included\x18\x02 \x01(\x08\x12\x17\n\x0f\x65nd_epoch_index\x18\x03 \x01(\r\x12 \n\x18\x65nd_epoch_index_included\x18\x04 \x01(\x08\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\xbd\t\n\x1eGetFinalizedEpochInfosResponse\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetFinalizedEpochInfosResponse.GetFinalizedEpochInfosResponseV0H\x00\x1a\xa5\x08\n GetFinalizedEpochInfosResponseV0\x12\x80\x01\n\x06\x65pochs\x18\x01 \x01(\x0b\x32n.org.dash.platform.dapi.v0.GetFinalizedEpochInfosResponse.GetFinalizedEpochInfosResponseV0.FinalizedEpochInfosH\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\xa4\x01\n\x13\x46inalizedEpochInfos\x12\x8c\x01\n\x15\x66inalized_epoch_infos\x18\x01 \x03(\x0b\x32m.org.dash.platform.dapi.v0.GetFinalizedEpochInfosResponse.GetFinalizedEpochInfosResponseV0.FinalizedEpochInfo\x1a\x9f\x04\n\x12\x46inalizedEpochInfo\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\x1c\n\x10\x66irst_block_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(\r\x12!\n\x15total_blocks_in_epoch\x18\x07 \x01(\x04\x42\x02\x30\x01\x12*\n\"next_epoch_start_core_block_height\x18\x08 \x01(\r\x12!\n\x15total_processing_fees\x18\t \x01(\x04\x42\x02\x30\x01\x12*\n\x1etotal_distributed_storage_fees\x18\n \x01(\x04\x42\x02\x30\x01\x12&\n\x1atotal_created_storage_fees\x18\x0b \x01(\x04\x42\x02\x30\x01\x12\x1e\n\x12\x63ore_block_rewards\x18\x0c \x01(\x04\x42\x02\x30\x01\x12\x81\x01\n\x0f\x62lock_proposers\x18\r \x03(\x0b\x32h.org.dash.platform.dapi.v0.GetFinalizedEpochInfosResponse.GetFinalizedEpochInfosResponseV0.BlockProposer\x1a\x39\n\rBlockProposer\x12\x13\n\x0bproposer_id\x18\x01 \x01(\x0c\x12\x13\n\x0b\x62lock_count\x18\x02 \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\"\xe4\x10\n\x11GetStatusResponse\x12N\n\x02v0\x18\x01 \x01(\x0b\x32@.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0H\x00\x1a\xf3\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\x82\x05\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\xcc\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\x12\x12\n\nnext_epoch\x18\x05 \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\x01\n#GetTokenDirectPurchasePricesRequest\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.GetTokenDirectPurchasePricesRequest.GetTokenDirectPurchasePricesRequestV0H\x00\x1aI\n%GetTokenDirectPurchasePricesRequestV0\x12\x11\n\ttoken_ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x8b\t\n$GetTokenDirectPurchasePricesResponse\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetTokenDirectPurchasePricesResponse.GetTokenDirectPurchasePricesResponseV0H\x00\x1a\xe1\x07\n&GetTokenDirectPurchasePricesResponseV0\x12\xa9\x01\n\x1ctoken_direct_purchase_prices\x18\x01 \x01(\x0b\x32\x80\x01.org.dash.platform.dapi.v0.GetTokenDirectPurchasePricesResponse.GetTokenDirectPurchasePricesResponseV0.TokenDirectPurchasePricesH\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\x33\n\x10PriceForQuantity\x12\x10\n\x08quantity\x18\x01 \x01(\x04\x12\r\n\x05price\x18\x02 \x01(\x04\x1a\xa7\x01\n\x0fPricingSchedule\x12\x93\x01\n\x12price_for_quantity\x18\x01 \x03(\x0b\x32w.org.dash.platform.dapi.v0.GetTokenDirectPurchasePricesResponse.GetTokenDirectPurchasePricesResponseV0.PriceForQuantity\x1a\xe4\x01\n\x1dTokenDirectPurchasePriceEntry\x12\x10\n\x08token_id\x18\x01 \x01(\x0c\x12\x15\n\x0b\x66ixed_price\x18\x02 \x01(\x04H\x00\x12\x90\x01\n\x0evariable_price\x18\x03 \x01(\x0b\x32v.org.dash.platform.dapi.v0.GetTokenDirectPurchasePricesResponse.GetTokenDirectPurchasePricesResponseV0.PricingScheduleH\x00\x42\x07\n\x05price\x1a\xc8\x01\n\x19TokenDirectPurchasePrices\x12\xaa\x01\n\x1btoken_direct_purchase_price\x18\x01 \x03(\x0b\x32\x84\x01.org.dash.platform.dapi.v0.GetTokenDirectPurchasePricesResponse.GetTokenDirectPurchasePricesResponseV0.TokenDirectPurchasePriceEntryB\x08\n\x06resultB\t\n\x07version\"\xce\x01\n\x1bGetTokenContractInfoRequest\x12\x62\n\x02v0\x18\x01 \x01(\x0b\x32T.org.dash.platform.dapi.v0.GetTokenContractInfoRequest.GetTokenContractInfoRequestV0H\x00\x1a@\n\x1dGetTokenContractInfoRequestV0\x12\x10\n\x08token_id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xfb\x03\n\x1cGetTokenContractInfoResponse\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetTokenContractInfoResponse.GetTokenContractInfoResponseV0H\x00\x1a\xe9\x02\n\x1eGetTokenContractInfoResponseV0\x12|\n\x04\x64\x61ta\x18\x01 \x01(\x0b\x32l.org.dash.platform.dapi.v0.GetTokenContractInfoResponse.GetTokenContractInfoResponseV0.TokenContractInfoDataH\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\x1aM\n\x15TokenContractInfoData\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1f\n\x17token_contract_position\x18\x02 \x01(\rB\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\"\x82\x04\n-GetTokenPerpetualDistributionLastClaimRequest\x12\x86\x01\n\x02v0\x18\x01 \x01(\x0b\x32x.org.dash.platform.dapi.v0.GetTokenPerpetualDistributionLastClaimRequest.GetTokenPerpetualDistributionLastClaimRequestV0H\x00\x1aI\n\x11\x43ontractTokenInfo\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1f\n\x17token_contract_position\x18\x02 \x01(\r\x1a\xf1\x01\n/GetTokenPerpetualDistributionLastClaimRequestV0\x12\x10\n\x08token_id\x18\x01 \x01(\x0c\x12v\n\rcontract_info\x18\x02 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetTokenPerpetualDistributionLastClaimRequest.ContractTokenInfoH\x00\x88\x01\x01\x12\x13\n\x0bidentity_id\x18\x04 \x01(\x0c\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\x10\n\x0e_contract_infoB\t\n\x07version\"\x93\x05\n.GetTokenPerpetualDistributionLastClaimResponse\x12\x88\x01\n\x02v0\x18\x01 \x01(\x0b\x32z.org.dash.platform.dapi.v0.GetTokenPerpetualDistributionLastClaimResponse.GetTokenPerpetualDistributionLastClaimResponseV0H\x00\x1a\xca\x03\n0GetTokenPerpetualDistributionLastClaimResponseV0\x12\x9f\x01\n\nlast_claim\x18\x01 \x01(\x0b\x32\x88\x01.org.dash.platform.dapi.v0.GetTokenPerpetualDistributionLastClaimResponse.GetTokenPerpetualDistributionLastClaimResponseV0.LastClaimInfoH\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\rLastClaimInfo\x12\x1a\n\x0ctimestamp_ms\x18\x01 \x01(\x04\x42\x02\x30\x01H\x00\x12\x1a\n\x0c\x62lock_height\x18\x02 \x01(\x04\x42\x02\x30\x01H\x00\x12\x0f\n\x05\x65poch\x18\x03 \x01(\rH\x00\x12\x13\n\traw_bytes\x18\x04 \x01(\x0cH\x00\x42\t\n\x07paid_atB\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\"\xd6\x1e\n\x17GetGroupActionsResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0H\x00\x1a\xd3\x1d\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[\n\tBurnEvent\x12\x0e\n\x06\x61mount\x18\x01 \x01(\x04\x12\x14\n\x0c\x62urn_from_id\x18\x02 \x01(\x0c\x12\x18\n\x0bpublic_note\x18\x03 \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\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\xe6\x03\n\x1eUpdateDirectPurchasePriceEvent\x12\x15\n\x0b\x66ixed_price\x18\x01 \x01(\x04H\x00\x12\x95\x01\n\x0evariable_price\x18\x02 \x01(\x0b\x32{.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UpdateDirectPurchasePriceEvent.PricingScheduleH\x00\x12\x18\n\x0bpublic_note\x18\x03 \x01(\tH\x01\x88\x01\x01\x1a\x33\n\x10PriceForQuantity\x12\x10\n\x08quantity\x18\x01 \x01(\x04\x12\r\n\x05price\x18\x02 \x01(\x04\x1a\xac\x01\n\x0fPricingSchedule\x12\x98\x01\n\x12price_for_quantity\x18\x01 \x03(\x0b\x32|.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UpdateDirectPurchasePriceEvent.PriceForQuantityB\x07\n\x05priceB\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\xd1\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\x12}\n\x10\x65mergency_action\x18\x06 \x01(\x0b\x32\x61.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEventH\x00\x12\x82\x01\n\x13token_config_update\x18\x07 \x01(\x0b\x32\x63.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEventH\x00\x12\x83\x01\n\x0cupdate_price\x18\x08 \x01(\x0b\x32k.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UpdateDirectPurchasePriceEventH\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\"\xb5\x01\n\x15GetAddressInfoRequest\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetAddressInfoRequest.GetAddressInfoRequestV0H\x00\x1a\x39\n\x17GetAddressInfoRequestV0\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x85\x01\n\x10\x41\x64\x64ressInfoEntry\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12J\n\x11\x62\x61lance_and_nonce\x18\x02 \x01(\x0b\x32*.org.dash.platform.dapi.v0.BalanceAndNonceH\x00\x88\x01\x01\x42\x14\n\x12_balance_and_nonce\"1\n\x0f\x42\x61lanceAndNonce\x12\x0f\n\x07\x62\x61lance\x18\x01 \x01(\x04\x12\r\n\x05nonce\x18\x02 \x01(\r\"_\n\x12\x41\x64\x64ressInfoEntries\x12I\n\x14\x61\x64\x64ress_info_entries\x18\x01 \x03(\x0b\x32+.org.dash.platform.dapi.v0.AddressInfoEntry\"m\n\x14\x41\x64\x64ressBalanceChange\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x19\n\x0bset_balance\x18\x02 \x01(\x04\x42\x02\x30\x01H\x00\x12\x1c\n\x0e\x61\x64\x64_to_balance\x18\x03 \x01(\x04\x42\x02\x30\x01H\x00\x42\x0b\n\toperation\"x\n\x1a\x42lockAddressBalanceChanges\x12\x18\n\x0c\x62lock_height\x18\x01 \x01(\x04\x42\x02\x30\x01\x12@\n\x07\x63hanges\x18\x02 \x03(\x0b\x32/.org.dash.platform.dapi.v0.AddressBalanceChange\"k\n\x1b\x41\x64\x64ressBalanceUpdateEntries\x12L\n\rblock_changes\x18\x01 \x03(\x0b\x32\x35.org.dash.platform.dapi.v0.BlockAddressBalanceChanges\"\xe1\x02\n\x16GetAddressInfoResponse\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetAddressInfoResponse.GetAddressInfoResponseV0H\x00\x1a\xe1\x01\n\x18GetAddressInfoResponseV0\x12I\n\x12\x61\x64\x64ress_info_entry\x18\x01 \x01(\x0b\x32+.org.dash.platform.dapi.v0.AddressInfoEntryH\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\"\xc3\x01\n\x18GetAddressesInfosRequest\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetAddressesInfosRequest.GetAddressesInfosRequestV0H\x00\x1a>\n\x1aGetAddressesInfosRequestV0\x12\x11\n\taddresses\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xf1\x02\n\x19GetAddressesInfosResponse\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetAddressesInfosResponse.GetAddressesInfosResponseV0H\x00\x1a\xe8\x01\n\x1bGetAddressesInfosResponseV0\x12M\n\x14\x61\x64\x64ress_info_entries\x18\x01 \x01(\x0b\x32-.org.dash.platform.dapi.v0.AddressInfoEntriesH\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\"\xb5\x01\n\x1dGetAddressesTrunkStateRequest\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetAddressesTrunkStateRequest.GetAddressesTrunkStateRequestV0H\x00\x1a!\n\x1fGetAddressesTrunkStateRequestV0B\t\n\x07version\"\xaa\x02\n\x1eGetAddressesTrunkStateResponse\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetAddressesTrunkStateResponse.GetAddressesTrunkStateResponseV0H\x00\x1a\x92\x01\n GetAddressesTrunkStateResponseV0\x12/\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.Proof\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\t\n\x07version\"\xf0\x01\n\x1eGetAddressesBranchStateRequest\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetAddressesBranchStateRequest.GetAddressesBranchStateRequestV0H\x00\x1aY\n GetAddressesBranchStateRequestV0\x12\x0b\n\x03key\x18\x01 \x01(\x0c\x12\r\n\x05\x64\x65pth\x18\x02 \x01(\r\x12\x19\n\x11\x63heckpoint_height\x18\x03 \x01(\x04\x42\t\n\x07version\"\xd1\x01\n\x1fGetAddressesBranchStateResponse\x12j\n\x02v0\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetAddressesBranchStateResponse.GetAddressesBranchStateResponseV0H\x00\x1a\x37\n!GetAddressesBranchStateResponseV0\x12\x12\n\nmerk_proof\x18\x02 \x01(\x0c\x42\t\n\x07version\"\x9e\x02\n%GetRecentAddressBalanceChangesRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetRecentAddressBalanceChangesRequest.GetRecentAddressBalanceChangesRequestV0H\x00\x1ar\n\'GetRecentAddressBalanceChangesRequestV0\x12\x18\n\x0cstart_height\x18\x01 \x01(\x04\x42\x02\x30\x01\x12\r\n\x05prove\x18\x02 \x01(\x08\x12\x1e\n\x16start_height_exclusive\x18\x03 \x01(\x08\x42\t\n\x07version\"\xb8\x03\n&GetRecentAddressBalanceChangesResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetRecentAddressBalanceChangesResponse.GetRecentAddressBalanceChangesResponseV0H\x00\x1a\x88\x02\n(GetRecentAddressBalanceChangesResponseV0\x12`\n\x1e\x61\x64\x64ress_balance_update_entries\x18\x01 \x01(\x0b\x32\x36.org.dash.platform.dapi.v0.AddressBalanceUpdateEntriesH\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\"G\n\x16\x42lockHeightCreditEntry\x12\x18\n\x0c\x62lock_height\x18\x01 \x01(\x04\x42\x02\x30\x01\x12\x13\n\x07\x63redits\x18\x02 \x01(\x04\x42\x02\x30\x01\"\xb0\x01\n\x1d\x43ompactedAddressBalanceChange\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x19\n\x0bset_credits\x18\x02 \x01(\x04\x42\x02\x30\x01H\x00\x12V\n\x19\x61\x64\x64_to_credits_operations\x18\x03 \x01(\x0b\x32\x31.org.dash.platform.dapi.v0.AddToCreditsOperationsH\x00\x42\x0b\n\toperation\"\\\n\x16\x41\x64\x64ToCreditsOperations\x12\x42\n\x07\x65ntries\x18\x01 \x03(\x0b\x32\x31.org.dash.platform.dapi.v0.BlockHeightCreditEntry\"\xae\x01\n#CompactedBlockAddressBalanceChanges\x12\x1e\n\x12start_block_height\x18\x01 \x01(\x04\x42\x02\x30\x01\x12\x1c\n\x10\x65nd_block_height\x18\x02 \x01(\x04\x42\x02\x30\x01\x12I\n\x07\x63hanges\x18\x03 \x03(\x0b\x32\x38.org.dash.platform.dapi.v0.CompactedAddressBalanceChange\"\x87\x01\n$CompactedAddressBalanceUpdateEntries\x12_\n\x17\x63ompacted_block_changes\x18\x01 \x03(\x0b\x32>.org.dash.platform.dapi.v0.CompactedBlockAddressBalanceChanges\"\xa9\x02\n.GetRecentCompactedAddressBalanceChangesRequest\x12\x88\x01\n\x02v0\x18\x01 \x01(\x0b\x32z.org.dash.platform.dapi.v0.GetRecentCompactedAddressBalanceChangesRequest.GetRecentCompactedAddressBalanceChangesRequestV0H\x00\x1a\x61\n0GetRecentCompactedAddressBalanceChangesRequestV0\x12\x1e\n\x12start_block_height\x18\x01 \x01(\x04\x42\x02\x30\x01\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xf0\x03\n/GetRecentCompactedAddressBalanceChangesResponse\x12\x8a\x01\n\x02v0\x18\x01 \x01(\x0b\x32|.org.dash.platform.dapi.v0.GetRecentCompactedAddressBalanceChangesResponse.GetRecentCompactedAddressBalanceChangesResponseV0H\x00\x1a\xa4\x02\n1GetRecentCompactedAddressBalanceChangesResponseV0\x12s\n(compacted_address_balance_update_entries\x18\x01 \x01(\x0b\x32?.org.dash.platform.dapi.v0.CompactedAddressBalanceUpdateEntriesH\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\"\xf4\x01\n GetShieldedEncryptedNotesRequest\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetShieldedEncryptedNotesRequest.GetShieldedEncryptedNotesRequestV0H\x00\x1aW\n\"GetShieldedEncryptedNotesRequestV0\x12\x13\n\x0bstart_index\x18\x01 \x01(\x04\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xbc\x05\n!GetShieldedEncryptedNotesResponse\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetShieldedEncryptedNotesResponse.GetShieldedEncryptedNotesResponseV0H\x00\x1a\x9b\x04\n#GetShieldedEncryptedNotesResponseV0\x12\x8a\x01\n\x0f\x65ncrypted_notes\x18\x01 \x01(\x0b\x32o.org.dash.platform.dapi.v0.GetShieldedEncryptedNotesResponse.GetShieldedEncryptedNotesResponseV0.EncryptedNotesH\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\x1aW\n\rEncryptedNote\x12\x11\n\tnullifier\x18\x01 \x01(\x0c\x12\x0b\n\x03\x63mx\x18\x02 \x01(\x0c\x12\x16\n\x0e\x65ncrypted_note\x18\x03 \x01(\x0c\x12\x0e\n\x06\x63v_net\x18\x04 \x01(\x0c\x1a\x91\x01\n\x0e\x45ncryptedNotes\x12\x7f\n\x07\x65ntries\x18\x01 \x03(\x0b\x32n.org.dash.platform.dapi.v0.GetShieldedEncryptedNotesResponse.GetShieldedEncryptedNotesResponseV0.EncryptedNoteB\x08\n\x06resultB\t\n\x07version\"\xb4\x01\n\x19GetShieldedAnchorsRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetShieldedAnchorsRequest.GetShieldedAnchorsRequestV0H\x00\x1a,\n\x1bGetShieldedAnchorsRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xb1\x03\n\x1aGetShieldedAnchorsResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetShieldedAnchorsResponse.GetShieldedAnchorsResponseV0H\x00\x1a\xa5\x02\n\x1cGetShieldedAnchorsResponseV0\x12m\n\x07\x61nchors\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetShieldedAnchorsResponse.GetShieldedAnchorsResponseV0.AnchorsH\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\x07\x41nchors\x12\x0f\n\x07\x61nchors\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xd8\x01\n\"GetMostRecentShieldedAnchorRequest\x12p\n\x02v0\x18\x01 \x01(\x0b\x32\x62.org.dash.platform.dapi.v0.GetMostRecentShieldedAnchorRequest.GetMostRecentShieldedAnchorRequestV0H\x00\x1a\x35\n$GetMostRecentShieldedAnchorRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xdc\x02\n#GetMostRecentShieldedAnchorResponse\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.GetMostRecentShieldedAnchorResponse.GetMostRecentShieldedAnchorResponseV0H\x00\x1a\xb5\x01\n%GetMostRecentShieldedAnchorResponseV0\x12\x10\n\x06\x61nchor\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\x01\n\x1bGetShieldedPoolStateRequest\x12\x62\n\x02v0\x18\x01 \x01(\x0b\x32T.org.dash.platform.dapi.v0.GetShieldedPoolStateRequest.GetShieldedPoolStateRequestV0H\x00\x1a.\n\x1dGetShieldedPoolStateRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xcb\x02\n\x1cGetShieldedPoolStateResponse\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetShieldedPoolStateResponse.GetShieldedPoolStateResponseV0H\x00\x1a\xb9\x01\n\x1eGetShieldedPoolStateResponseV0\x12\x1b\n\rtotal_balance\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\"\xc0\x01\n\x1cGetShieldedNotesCountRequest\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetShieldedNotesCountRequest.GetShieldedNotesCountRequestV0H\x00\x1a/\n\x1eGetShieldedNotesCountRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xd3\x02\n\x1dGetShieldedNotesCountResponse\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetShieldedNotesCountResponse.GetShieldedNotesCountResponseV0H\x00\x1a\xbe\x01\n\x1fGetShieldedNotesCountResponseV0\x12\x1f\n\x11total_notes_count\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\"\xd4\x01\n\x1cGetShieldedNullifiersRequest\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetShieldedNullifiersRequest.GetShieldedNullifiersRequestV0H\x00\x1a\x43\n\x1eGetShieldedNullifiersRequestV0\x12\x12\n\nnullifiers\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x86\x05\n\x1dGetShieldedNullifiersResponse\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetShieldedNullifiersResponse.GetShieldedNullifiersResponseV0H\x00\x1a\xf1\x03\n\x1fGetShieldedNullifiersResponseV0\x12\x88\x01\n\x12nullifier_statuses\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetShieldedNullifiersResponse.GetShieldedNullifiersResponseV0.NullifierStatusesH\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\x36\n\x0fNullifierStatus\x12\x11\n\tnullifier\x18\x01 \x01(\x0c\x12\x10\n\x08is_spent\x18\x02 \x01(\x08\x1a\x8e\x01\n\x11NullifierStatuses\x12y\n\x07\x65ntries\x18\x01 \x03(\x0b\x32h.org.dash.platform.dapi.v0.GetShieldedNullifiersResponse.GetShieldedNullifiersResponseV0.NullifierStatusB\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*\x92\x01\n\x16\x43ontractModerationList\x12(\n$CONTRACT_MODERATION_LIST_UNSPECIFIED\x10\x00\x12$\n CONTRACT_MODERATION_LIST_BANLIST\x10\x01\x12(\n$CONTRACT_MODERATION_LIST_SUSPENSIONS\x10\x02\x32\xadN\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\xa8\x01\n\x1fgetIdentityKeysRemainingBudgets\x12\x41.org.dash.platform.dapi.v0.GetIdentityKeysRemainingBudgetsRequest\x1a\x42.org.dash.platform.dapi.v0.GetIdentityKeysRemainingBudgetsResponse\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\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\xa5\x01\n\x1egetDataContractsLatestVersions\x12@.org.dash.platform.dapi.v0.GetDataContractsLatestVersionsRequest\x1a\x41.org.dash.platform.dapi.v0.GetDataContractsLatestVersionsResponse\x12{\n\x10getDataContracts\x12\x32.org.dash.platform.dapi.v0.GetDataContractsRequest\x1a\x33.org.dash.platform.dapi.v0.GetDataContractsResponse\x12\x89\x01\n\x17getDataContractsByRange\x12\x39.org.dash.platform.dapi.v0.GetDataContractsByRangeRequest\x1a\x33.org.dash.platform.dapi.v0.GetDataContractsResponse\x12\x87\x01\n\x14getContractGroupInfo\x12\x36.org.dash.platform.dapi.v0.GetContractGroupInfoRequest\x1a\x37.org.dash.platform.dapi.v0.GetContractGroupInfoResponse\x12\x90\x01\n\x17getContractGroupMembers\x12\x39.org.dash.platform.dapi.v0.GetContractGroupMembersRequest\x1a:.org.dash.platform.dapi.v0.GetContractGroupMembersResponse\x12\x9f\x01\n\x1cgetContractGroupsForContract\x12>.org.dash.platform.dapi.v0.GetContractGroupsForContractRequest\x1a?.org.dash.platform.dapi.v0.GetContractGroupsForContractResponse\x12\x9c\x01\n\x1bgetContractModerationStatus\x12=.org.dash.platform.dapi.v0.GetContractModerationStatusRequest\x1a>.org.dash.platform.dapi.v0.GetContractModerationStatusResponse\x12\x9f\x01\n\x1cgetContractModerationEntries\x12>.org.dash.platform.dapi.v0.GetContractModerationEntriesRequest\x1a?.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse\x12\x81\x01\n\x12getDocumentHistory\x12\x34.org.dash.platform.dapi.v0.GetDocumentHistoryRequest\x1a\x35.org.dash.platform.dapi.v0.GetDocumentHistoryResponse\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\xb4\x01\n#getIdentityByNonUniquePublicKeyHash\x12\x45.org.dash.platform.dapi.v0.GetIdentityByNonUniquePublicKeyHashRequest\x1a\x46.org.dash.platform.dapi.v0.GetIdentityByNonUniquePublicKeyHashResponse\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\x8d\x01\n\x16getFinalizedEpochInfos\x12\x38.org.dash.platform.dapi.v0.GetFinalizedEpochInfosRequest\x1a\x39.org.dash.platform.dapi.v0.GetFinalizedEpochInfosResponse\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\x9f\x01\n\x1cgetTokenDirectPurchasePrices\x12>.org.dash.platform.dapi.v0.GetTokenDirectPurchasePricesRequest\x1a?.org.dash.platform.dapi.v0.GetTokenDirectPurchasePricesResponse\x12\x87\x01\n\x14getTokenContractInfo\x12\x36.org.dash.platform.dapi.v0.GetTokenContractInfoRequest\x1a\x37.org.dash.platform.dapi.v0.GetTokenContractInfoResponse\x12\xb1\x01\n\"getTokenPreProgrammedDistributions\x12\x44.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest\x1a\x45.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse\x12\xbd\x01\n&getTokenPerpetualDistributionLastClaim\x12H.org.dash.platform.dapi.v0.GetTokenPerpetualDistributionLastClaimRequest\x1aI.org.dash.platform.dapi.v0.GetTokenPerpetualDistributionLastClaimResponse\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.GetGroupActionSignersResponse\x12u\n\x0egetAddressInfo\x12\x30.org.dash.platform.dapi.v0.GetAddressInfoRequest\x1a\x31.org.dash.platform.dapi.v0.GetAddressInfoResponse\x12~\n\x11getAddressesInfos\x12\x33.org.dash.platform.dapi.v0.GetAddressesInfosRequest\x1a\x34.org.dash.platform.dapi.v0.GetAddressesInfosResponse\x12\x8d\x01\n\x16getAddressesTrunkState\x12\x38.org.dash.platform.dapi.v0.GetAddressesTrunkStateRequest\x1a\x39.org.dash.platform.dapi.v0.GetAddressesTrunkStateResponse\x12\x90\x01\n\x17getAddressesBranchState\x12\x39.org.dash.platform.dapi.v0.GetAddressesBranchStateRequest\x1a:.org.dash.platform.dapi.v0.GetAddressesBranchStateResponse\x12\xa5\x01\n\x1egetRecentAddressBalanceChanges\x12@.org.dash.platform.dapi.v0.GetRecentAddressBalanceChangesRequest\x1a\x41.org.dash.platform.dapi.v0.GetRecentAddressBalanceChangesResponse\x12\xc0\x01\n\'getRecentCompactedAddressBalanceChanges\x12I.org.dash.platform.dapi.v0.GetRecentCompactedAddressBalanceChangesRequest\x1aJ.org.dash.platform.dapi.v0.GetRecentCompactedAddressBalanceChangesResponse\x12\x96\x01\n\x19getShieldedEncryptedNotes\x12;.org.dash.platform.dapi.v0.GetShieldedEncryptedNotesRequest\x1a<.org.dash.platform.dapi.v0.GetShieldedEncryptedNotesResponse\x12\x81\x01\n\x12getShieldedAnchors\x12\x34.org.dash.platform.dapi.v0.GetShieldedAnchorsRequest\x1a\x35.org.dash.platform.dapi.v0.GetShieldedAnchorsResponse\x12\x9c\x01\n\x1bgetMostRecentShieldedAnchor\x12=.org.dash.platform.dapi.v0.GetMostRecentShieldedAnchorRequest\x1a>.org.dash.platform.dapi.v0.GetMostRecentShieldedAnchorResponse\x12\x87\x01\n\x14getShieldedPoolState\x12\x36.org.dash.platform.dapi.v0.GetShieldedPoolStateRequest\x1a\x37.org.dash.platform.dapi.v0.GetShieldedPoolStateResponse\x12\x8a\x01\n\x15getShieldedNotesCount\x12\x37.org.dash.platform.dapi.v0.GetShieldedNotesCountRequest\x1a\x38.org.dash.platform.dapi.v0.GetShieldedNotesCountResponse\x12\x8a\x01\n\x15getShieldedNullifiers\x12\x37.org.dash.platform.dapi.v0.GetShieldedNullifiersRequest\x1a\x38.org.dash.platform.dapi.v0.GetShieldedNullifiersResponseb\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\"\x8e\x02\n&GetIdentityKeysRemainingBudgetsRequest\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetIdentityKeysRemainingBudgetsRequest.GetIdentityKeysRemainingBudgetsRequestV0H\x00\x1a_\n(GetIdentityKeysRemainingBudgetsRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x0f\n\x07key_ids\x18\x02 \x03(\r\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\x96\x06\n\'GetIdentityKeysRemainingBudgetsResponse\x12z\n\x02v0\x18\x01 \x01(\x0b\x32l.org.dash.platform.dapi.v0.GetIdentityKeysRemainingBudgetsResponse.GetIdentityKeysRemainingBudgetsResponseV0H\x00\x1a\xe3\x04\n)GetIdentityKeysRemainingBudgetsResponseV0\x12\xa4\x01\n\x16keys_remaining_budgets\x18\x01 \x01(\x0b\x32\x81\x01.org.dash.platform.dapi.v0.GetIdentityKeysRemainingBudgetsResponse.GetIdentityKeysRemainingBudgetsResponseV0.KeysRemainingBudgetsH\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\x61\n\x17KeyRemainingBudgetEntry\x12\x0e\n\x06key_id\x18\x01 \x01(\r\x12!\n\x10remaining_budget\x18\x02 \x01(\x04\x42\x02\x30\x01H\x00\x88\x01\x01\x42\x13\n\x11_remaining_budget\x1a\xaf\x01\n\x14KeysRemainingBudgets\x12\x96\x01\n\x07\x65ntries\x18\x01 \x03(\x0b\x32\x84\x01.org.dash.platform.dapi.v0.GetIdentityKeysRemainingBudgetsResponse.GetIdentityKeysRemainingBudgetsResponseV0.KeyRemainingBudgetEntryB\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\"\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\"\x8c\x02\n%GetDataContractsLatestVersionsRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetDataContractsLatestVersionsRequest.GetDataContractsLatestVersionsRequestV0H\x00\x1a`\n\'GetDataContractsLatestVersionsRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\x19\n\x11include_contracts\x18\x02 \x01(\x08\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xfa\x05\n&GetDataContractsLatestVersionsResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetDataContractsLatestVersionsResponse.GetDataContractsLatestVersionsResponseV0H\x00\x1a\x84\x01\n\x1e\x44\x61taContractLatestVersionEntry\x12\x12\n\nidentifier\x18\x01 \x01(\x0c\x12\x14\n\x07version\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x1a\n\rdata_contract\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x42\n\n\x08_versionB\x10\n\x0e_data_contract\x1a\x90\x01\n\x1b\x44\x61taContractsLatestVersions\x12q\n\x07\x65ntries\x18\x01 \x03(\x0b\x32`.org.dash.platform.dapi.v0.GetDataContractsLatestVersionsResponse.DataContractLatestVersionEntry\x1a\xb0\x02\n(GetDataContractsLatestVersionsResponseV0\x12\x87\x01\n\x1e\x64\x61ta_contracts_latest_versions\x18\x01 \x01(\x0b\x32].org.dash.platform.dapi.v0.GetDataContractsLatestVersionsResponse.DataContractsLatestVersionsH\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\"R\n\x1f\x43ontractGroupDocumentTypeMember\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\"G\n\x18\x43ontractGroupTokenMember\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x16\n\x0etoken_position\x18\x02 \x01(\r\"\xd7\x01\n\x1bGetContractGroupInfoRequest\x12\x62\n\x02v0\x18\x01 \x01(\x0b\x32T.org.dash.platform.dapi.v0.GetContractGroupInfoRequest.GetContractGroupInfoRequestV0H\x00\x1aI\n\x1dGetContractGroupInfoRequestV0\x12\x19\n\x11\x63ontract_group_id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x98\x04\n\x1cGetContractGroupInfoResponse\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetContractGroupInfoResponse.GetContractGroupInfoResponseV0H\x00\x1a~\n\x11\x43ontractGroupInfo\x12\x10\n\x08owner_id\x18\x01 \x01(\x0c\x12\x11\n\tadmin_ids\x18\x02 \x03(\x0c\x12\x11\n\x04name\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x04 \x01(\tH\x01\x88\x01\x01\x42\x07\n\x05_nameB\x0e\n\x0c_description\x1a\x86\x02\n\x1eGetContractGroupInfoResponseV0\x12h\n\x13\x63ontract_group_info\x18\x01 \x01(\x0b\x32I.org.dash.platform.dapi.v0.GetContractGroupInfoResponse.ContractGroupInfoH\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\"\xf8\x06\n\x1eGetContractGroupMembersRequest\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetContractGroupMembersRequest.GetContractGroupMembersRequestV0H\x00\x1a@\n\x14\x43ontractMembersQuery\x12\x18\n\x0bstart_after\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x42\x0e\n\x0c_start_after\x1a\x80\x01\n\x18\x44ocumentTypeMembersQuery\x12T\n\x0bstart_after\x18\x01 \x01(\x0b\x32:.org.dash.platform.dapi.v0.ContractGroupDocumentTypeMemberH\x00\x88\x01\x01\x42\x0e\n\x0c_start_after\x1ar\n\x11TokenMembersQuery\x12M\n\x0bstart_after\x18\x01 \x01(\x0b\x32\x33.org.dash.platform.dapi.v0.ContractGroupTokenMemberH\x00\x88\x01\x01\x42\x0e\n\x0c_start_after\x1a\xa7\x03\n GetContractGroupMembersRequestV0\x12\x19\n\x11\x63ontract_group_id\x18\x01 \x01(\x0c\x12\x63\n\tcontracts\x18\x02 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetContractGroupMembersRequest.ContractMembersQueryH\x00\x12l\n\x0e\x64ocument_types\x18\x03 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetContractGroupMembersRequest.DocumentTypeMembersQueryH\x00\x12]\n\x06tokens\x18\x04 \x01(\x0b\x32K.org.dash.platform.dapi.v0.GetContractGroupMembersRequest.TokenMembersQueryH\x00\x12\x12\n\x05limit\x18\x05 \x01(\rH\x01\x88\x01\x01\x12\r\n\x05prove\x18\x06 \x01(\x08\x42\t\n\x07membersB\x08\n\x06_limitB\t\n\x07version\"\xc9\x06\n\x1fGetContractGroupMembersResponse\x12j\n\x02v0\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetContractGroupMembersResponse.GetContractGroupMembersResponseV0H\x00\x1a\'\n\x0f\x43ontractMembers\x12\x14\n\x0c\x63ontract_ids\x18\x01 \x03(\x0c\x1ai\n\x13\x44ocumentTypeMembers\x12R\n\x0e\x64ocument_types\x18\x01 \x03(\x0b\x32:.org.dash.platform.dapi.v0.ContractGroupDocumentTypeMember\x1aS\n\x0cTokenMembers\x12\x43\n\x06tokens\x18\x01 \x03(\x0b\x32\x33.org.dash.platform.dapi.v0.ContractGroupTokenMember\x1a\xc5\x03\n!GetContractGroupMembersResponseV0\x12_\n\tcontracts\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetContractGroupMembersResponse.ContractMembersH\x00\x12h\n\x0e\x64ocument_types\x18\x02 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetContractGroupMembersResponse.DocumentTypeMembersH\x00\x12Y\n\x06tokens\x18\x03 \x01(\x0b\x32G.org.dash.platform.dapi.v0.GetContractGroupMembersResponse.TokenMembersH\x00\x12\x31\n\x05proof\x18\x04 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x05 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"D\n\x18\x43ontractModerationReason\x12\x11\n\x04\x63ode\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x0c\n\x04text\x18\x02 \x01(\tB\x07\n\x05_code\"\xc5\x02\n\"GetContractModerationStatusRequest\x12p\n\x02v0\x18\x01 \x01(\x0b\x32\x62.org.dash.platform.dapi.v0.GetContractModerationStatusRequest.GetContractModerationStatusRequestV0H\x00\x1a\xa1\x01\n$GetContractModerationStatusRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x13\n\x0bidentity_id\x18\x02 \x01(\x0c\x12@\n\x05lists\x18\x03 \x03(\x0e\x32\x31.org.dash.platform.dapi.v0.ContractModerationList\x12\r\n\x05prove\x18\x04 \x01(\x08\x42\t\n\x07version\"\xae\x06\n#GetContractModerationStatusResponse\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.GetContractModerationStatusResponseV0H\x00\x1a\xf6\x02\n\x18\x43ontractModerationStatus\x12\x13\n\x06\x62\x61nned\x18\x01 \x01(\x08H\x00\x88\x01\x01\x12\x1c\n\x0fsuspended_until\x18\x02 \x01(\x04H\x01\x88\x01\x01\x12@\n\x05lists\x18\x03 \x03(\x0e\x32\x31.org.dash.platform.dapi.v0.ContractModerationList\x12L\n\nban_reason\x18\x04 \x01(\x0b\x32\x33.org.dash.platform.dapi.v0.ContractModerationReasonH\x02\x88\x01\x01\x12S\n\x11suspension_reason\x18\x05 \x01(\x0b\x32\x33.org.dash.platform.dapi.v0.ContractModerationReasonH\x03\x88\x01\x01\x42\t\n\x07_bannedB\x12\n\x10_suspended_untilB\r\n\x0b_ban_reasonB\x14\n\x12_suspension_reason\x1a\x8e\x02\n%GetContractModerationStatusResponseV0\x12i\n\x06status\x18\x01 \x01(\x0b\x32W.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatusH\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\x02\n#GetContractModerationEntriesRequest\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.GetContractModerationEntriesRequest.GetContractModerationEntriesRequestV0H\x00\x1a\xd4\x01\n%GetContractModerationEntriesRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12?\n\x04list\x18\x02 \x01(\x0e\x32\x31.org.dash.platform.dapi.v0.ContractModerationList\x12\x18\n\x0bstart_after\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\x05limit\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\x0e\n\x0c_start_afterB\x08\n\x06_limitB\t\n\x07version\"\xd8\x05\n$GetContractModerationEntriesResponse\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.GetContractModerationEntriesResponseV0H\x00\x1a\x91\x01\n\x17\x43ontractModerationEntry\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x12\n\x05until\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x43\n\x06reason\x18\x03 \x01(\x0b\x32\x33.org.dash.platform.dapi.v0.ContractModerationReasonB\x08\n\x06_until\x1a\x85\x01\n\x19\x43ontractModerationEntries\x12h\n\x07\x65ntries\x18\x01 \x03(\x0b\x32W.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractModerationEntry\x1a\x92\x02\n&GetContractModerationEntriesResponseV0\x12l\n\x07\x65ntries\x18\x01 \x01(\x0b\x32Y.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractModerationEntriesH\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\"\xf1\x01\n#GetContractGroupsForContractRequest\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.GetContractGroupsForContractRequest.GetContractGroupsForContractRequestV0H\x00\x1aK\n%GetContractGroupsForContractRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xf5\x06\n$GetContractGroupsForContractResponse\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetContractGroupsForContractResponse.GetContractGroupsForContractResponseV0H\x00\x1aQ\n\x17\x44ocumentTypeMemberships\x12\x1a\n\x12\x64ocument_type_name\x18\x01 \x01(\t\x12\x1a\n\x12\x63ontract_group_ids\x18\x02 \x03(\x0c\x1a\x46\n\x10TokenMemberships\x12\x16\n\x0etoken_position\x18\x01 \x01(\r\x12\x1a\n\x12\x63ontract_group_ids\x18\x02 \x03(\x0c\x1a\x89\x02\n\x18\x43ontractGroupMemberships\x12\x1a\n\x12\x63ontract_group_ids\x18\x01 \x03(\x0c\x12o\n\x0e\x64ocument_types\x18\x02 \x03(\x0b\x32W.org.dash.platform.dapi.v0.GetContractGroupsForContractResponse.DocumentTypeMemberships\x12`\n\x06tokens\x18\x03 \x03(\x0b\x32P.org.dash.platform.dapi.v0.GetContractGroupsForContractResponse.TokenMemberships\x1a\xa4\x02\n&GetContractGroupsForContractResponseV0\x12~\n\x1a\x63ontract_group_memberships\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetContractGroupsForContractResponse.ContractGroupMembershipsH\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\"\xad\x02\n\x1eGetDataContractsByRangeRequest\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetDataContractsByRangeRequest.GetDataContractsByRangeRequestV0H\x00\x1a\x95\x01\n GetDataContractsByRangeRequestV0\x12\x12\n\x05limit\x18\x01 \x01(\rH\x01\x88\x01\x01\x12\x15\n\x0bstart_after\x18\x02 \x01(\x0cH\x00\x12\x12\n\x08start_at\x18\x03 \x01(\x0cH\x00\x12\x10\n\x08ids_only\x18\x04 \x01(\x08\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\x07\n\x05startB\x08\n\x06_limitB\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\"\xe0\x1f\n\x13GetDocumentsRequest\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0H\x00\x12R\n\x02v1\x18\x02 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV1H\x00\x1a\xfe\x02\n\x12\x44ocumentFieldValue\x12\x14\n\nbool_value\x18\x01 \x01(\x08H\x00\x12\x19\n\x0bint64_value\x18\x02 \x01(\x12\x42\x02\x30\x01H\x00\x12\x1a\n\x0cuint64_value\x18\x03 \x01(\x04\x42\x02\x30\x01H\x00\x12\x16\n\x0c\x64ouble_value\x18\x04 \x01(\x01H\x00\x12\x0e\n\x04text\x18\x05 \x01(\tH\x00\x12\x15\n\x0b\x62ytes_value\x18\x06 \x01(\x0cH\x00\x12[\n\x04list\x18\x07 \x01(\x0b\x32K.org.dash.platform.dapi.v0.GetDocumentsRequest.DocumentFieldValue.ValueListH\x00\x12\x14\n\nnull_value\x18\x08 \x01(\x08H\x00\x1a^\n\tValueList\x12Q\n\x06values\x18\x01 \x03(\x0b\x32\x41.org.dash.platform.dapi.v0.GetDocumentsRequest.DocumentFieldValueB\t\n\x07variant\x1a\xe2\x02\n\x12TimeRangeSelection\x12\\\n\x08selector\x18\x01 \x01(\x0e\x32J.org.dash.platform.dapi.v0.GetDocumentsRequest.TimeRangeSelection.Selector\x12\x19\n\x08start_ms\x18\x02 \x01(\x04\x42\x02\x30\x01H\x00\x88\x01\x01\x12T\n\x04grid\x18\x03 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetDocumentsRequest.TimeRangeSelection.Grid\x1a>\n\x04Grid\x12\x11\n\x05range\x18\x01 \x01(\x04\x42\x02\x30\x01\x12\x10\n\x04step\x18\x02 \x01(\x04\x42\x02\x30\x01\x12\x11\n\x05phase\x18\x03 \x01(\x04\x42\x02\x30\x01\"0\n\x08Selector\x12\n\n\x06NEWEST\x10\x00\x12\n\n\x06OLDEST\x10\x01\x12\x0c\n\x08\x42Y_START\x10\x02\x42\x0b\n\t_start_ms\x1a\x95\x02\n\x0bWhereClause\x12\r\n\x05\x66ield\x18\x01 \x01(\t\x12N\n\x08operator\x18\x02 \x01(\x0e\x32<.org.dash.platform.dapi.v0.GetDocumentsRequest.WhereOperator\x12P\n\x05value\x18\x03 \x01(\x0b\x32\x41.org.dash.platform.dapi.v0.GetDocumentsRequest.DocumentFieldValue\x12U\n\ntime_range\x18\x04 \x01(\x0b\x32\x41.org.dash.platform.dapi.v0.GetDocumentsRequest.TimeRangeSelection\x1a\xa4\x01\n\x0fHavingAggregate\x12Y\n\x08\x66unction\x18\x01 \x01(\x0e\x32G.org.dash.platform.dapi.v0.GetDocumentsRequest.HavingAggregate.Function\x12\r\n\x05\x66ield\x18\x02 \x01(\t\"\'\n\x08\x46unction\x12\t\n\x05\x43OUNT\x10\x00\x12\x07\n\x03SUM\x10\x01\x12\x07\n\x03\x41VG\x10\x02\x1a\xf9\x03\n\x0cHavingClause\x12Q\n\taggregate\x18\x01 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetDocumentsRequest.HavingAggregate\x12V\n\x08operator\x18\x02 \x01(\x0e\x32\x44.org.dash.platform.dapi.v0.GetDocumentsRequest.HavingClause.Operator\x12R\n\x05value\x18\x03 \x01(\x0b\x32\x41.org.dash.platform.dapi.v0.GetDocumentsRequest.DocumentFieldValueH\x00\"\xe0\x01\n\x08Operator\x12\t\n\x05\x45QUAL\x10\x00\x12\r\n\tNOT_EQUAL\x10\x01\x12\x10\n\x0cGREATER_THAN\x10\x02\x12\x1a\n\x16GREATER_THAN_OR_EQUALS\x10\x03\x12\r\n\tLESS_THAN\x10\x04\x12\x17\n\x13LESS_THAN_OR_EQUALS\x10\x05\x12\x0b\n\x07\x42\x45TWEEN\x10\x06\x12\x1a\n\x16\x42\x45TWEEN_EXCLUDE_BOUNDS\x10\x07\x12\x18\n\x14\x42\x45TWEEN_EXCLUDE_LEFT\x10\x08\x12\x19\n\x15\x42\x45TWEEN_EXCLUDE_RIGHT\x10\t\x12\x06\n\x02IN\x10\nB\x07\n\x05right\x1a\x90\x01\n\x0bOrderClause\x12\x0f\n\x05\x66ield\x18\x01 \x01(\tH\x00\x12S\n\taggregate\x18\x03 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetDocumentsRequest.HavingAggregateH\x00\x12\x11\n\tascending\x18\x02 \x01(\x08\x42\x08\n\x06target\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\x05start\x1a\xa6\x0c\n\x15GetDocumentsRequestV1\x12\x18\n\x10\x64\x61ta_contract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12Q\n\rwhere_clauses\x18\x03 \x03(\x0b\x32:.org.dash.platform.dapi.v0.GetDocumentsRequest.WhereClause\x12L\n\x08order_by\x18\x04 \x03(\x0b\x32:.org.dash.platform.dapi.v0.GetDocumentsRequest.OrderClause\x12\x12\n\x05limit\x18\x05 \x01(\rH\x01\x88\x01\x01\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\x12\\\n\x07selects\x18\t \x03(\x0b\x32K.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV1.Select\x12\x10\n\x08group_by\x18\n \x03(\t\x12K\n\x06having\x18\x0b \x03(\x0b\x32;.org.dash.platform.dapi.v0.GetDocumentsRequest.HavingClause\x12\x13\n\x06offset\x18\x0c \x01(\rH\x02\x88\x01\x01\x12\x61\n\x07\x63hained\x18\r \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV1.ChainedJoin\x12\x62\n\x0bsub_queries\x18\x0e \x03(\x0b\x32M.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV1.SubQuery\x1a\xc9\x01\n\x06Select\x12\x66\n\x08\x66unction\x18\x01 \x01(\x0e\x32T.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV1.Select.Function\x12\r\n\x05\x66ield\x18\x02 \x01(\t\"H\n\x08\x46unction\x12\r\n\tDOCUMENTS\x10\x00\x12\t\n\x05\x43OUNT\x10\x01\x12\x07\n\x03SUM\x10\x02\x12\x07\n\x03\x41VG\x10\x03\x12\x07\n\x03MIN\x10\x04\x12\x07\n\x03MAX\x10\x05\x1a\x41\n\x0b\x43hainedJoin\x12\x15\n\rjoin_property\x18\x01 \x01(\t\x12\x1b\n\x13outer_document_type\x18\x02 \x01(\t\x1a\xa6\x04\n\x08SubQuery\x12\x18\n\x10\x64\x61ta_contract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12Q\n\rwhere_clauses\x18\x03 \x03(\x0b\x32:.org.dash.platform.dapi.v0.GetDocumentsRequest.WhereClause\x12L\n\x08order_by\x18\x04 \x03(\x0b\x32:.org.dash.platform.dapi.v0.GetDocumentsRequest.OrderClause\x12\x12\n\x05limit\x18\x05 \x01(\rH\x00\x88\x01\x01\x12`\n\x04kind\x18\x06 \x01(\x0e\x32R.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV1.SubQuery.Kind\x12\x63\n\x04\x62ind\x18\x07 \x01(\x0b\x32U.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV1.SubQuery.Binding\x1a\x41\n\x07\x42inding\x12\x0e\n\x06source\x18\x01 \x01(\r\x12\x17\n\x0fsource_property\x18\x02 \x01(\t\x12\r\n\x05\x66ield\x18\x03 \x01(\t\" \n\x04Kind\x12\r\n\tDOCUMENTS\x10\x00\x12\t\n\x05\x43OUNT\x10\x01\x42\x08\n\x06_limitB\x07\n\x05startB\x08\n\x06_limitB\t\n\x07_offset\"\xfa\x01\n\rWhereOperator\x12\t\n\x05\x45QUAL\x10\x00\x12\x10\n\x0cGREATER_THAN\x10\x01\x12\x1a\n\x16GREATER_THAN_OR_EQUALS\x10\x02\x12\r\n\tLESS_THAN\x10\x03\x12\x17\n\x13LESS_THAN_OR_EQUALS\x10\x04\x12\x0b\n\x07\x42\x45TWEEN\x10\x05\x12\x1a\n\x16\x42\x45TWEEN_EXCLUDE_BOUNDS\x10\x06\x12\x18\n\x14\x42\x45TWEEN_EXCLUDE_LEFT\x10\x07\x12\x19\n\x15\x42\x45TWEEN_EXCLUDE_RIGHT\x10\x08\x12\x06\n\x02IN\x10\t\x12\x0f\n\x0bSTARTS_WITH\x10\n\x12\x11\n\rIN_TIME_RANGE\x10\x0b\x42\t\n\x07version\"\xc2\x1b\n\x14GetDocumentsResponse\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0H\x00\x12T\n\x02v1\x18\x02 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1H\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\x06result\x1a\xd4\x17\n\x16GetDocumentsResponseV1\x12\x61\n\x04\x64\x61ta\x18\x01 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.ResultDataH\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\x1aL\n\nCountEntry\x12\x13\n\x06in_key\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x0b\n\x03key\x18\x02 \x01(\x0c\x12\x11\n\x05\x63ount\x18\x03 \x01(\x04\x42\x02\x30\x01\x42\t\n\x07_in_key\x1ar\n\x0c\x43ountEntries\x12\x62\n\x07\x65ntries\x18\x01 \x03(\x0b\x32Q.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.CountEntry\x1a\xa0\x01\n\x0c\x43ountResults\x12\x1d\n\x0f\x61ggregate_count\x18\x01 \x01(\x04\x42\x02\x30\x01H\x00\x12\x66\n\x07\x65ntries\x18\x02 \x01(\x0b\x32S.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.CountEntriesH\x00\x42\t\n\x07variant\x1aH\n\x08SumEntry\x12\x13\n\x06in_key\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x0b\n\x03key\x18\x02 \x01(\x0c\x12\x0f\n\x03sum\x18\x03 \x01(\x12\x42\x02\x30\x01\x42\t\n\x07_in_key\x1an\n\nSumEntries\x12`\n\x07\x65ntries\x18\x01 \x03(\x0b\x32O.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.SumEntry\x1a\x9a\x01\n\nSumResults\x12\x1b\n\raggregate_sum\x18\x01 \x01(\x12\x42\x02\x30\x01H\x00\x12\x64\n\x07\x65ntries\x18\x02 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.SumEntriesH\x00\x42\t\n\x07variant\x1a_\n\x0c\x41verageEntry\x12\x13\n\x06in_key\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x12\x0b\n\x03key\x18\x02 \x01(\x0c\x12\x11\n\x05\x63ount\x18\x03 \x01(\x04\x42\x02\x30\x01\x12\x0f\n\x03sum\x18\x04 \x01(\x12\x42\x02\x30\x01\x42\t\n\x07_in_key\x1av\n\x0e\x41verageEntries\x12\x64\n\x07\x65ntries\x18\x01 \x03(\x0b\x32S.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.AverageEntry\x1a\x36\n\x10\x41verageAggregate\x12\x11\n\x05\x63ount\x18\x01 \x01(\x04\x42\x02\x30\x01\x12\x0f\n\x03sum\x18\x02 \x01(\x12\x42\x02\x30\x01\x1a\xfb\x01\n\x0e\x41verageResults\x12t\n\x11\x61ggregate_average\x18\x01 \x01(\x0b\x32W.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.AverageAggregateH\x00\x12h\n\x07\x65ntries\x18\x02 \x01(\x0b\x32U.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.AverageEntriesH\x00\x42\t\n\x07variant\x1az\n\x0bRankedEntry\x12\x0b\n\x03key\x18\x01 \x01(\x0c\x12\x13\n\x05\x63ount\x18\x02 \x01(\x04\x42\x02\x30\x01H\x00\x12\x11\n\x03sum\x18\x03 \x01(\x12\x42\x02\x30\x01H\x00\x12\r\n\x03\x61vg\x18\x04 \x01(\x01H\x00\x12\x13\n\x06in_key\x18\x05 \x01(\x0cH\x01\x88\x01\x01\x42\x07\n\x05valueB\t\n\x07_in_key\x1a\x9a\x01\n\rRankedEntries\x12\x63\n\x07\x65ntries\x18\x01 \x03(\x0b\x32R.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.RankedEntry\x12\x18\n\x07skipped\x18\x02 \x01(\x04\x42\x02\x30\x01H\x00\x88\x01\x01\x42\n\n\x08_skipped\x1a\xf7\x05\n\nResultData\x12\x65\n\tdocuments\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.DocumentsH\x00\x12\x65\n\x06\x63ounts\x18\x02 \x01(\x0b\x32S.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.CountResultsH\x00\x12\x61\n\x04sums\x18\x03 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.SumResultsH\x00\x12i\n\x08\x61verages\x18\x04 \x01(\x0b\x32U.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.AverageResultsH\x00\x12\x66\n\x06ranked\x18\x05 \x01(\x0b\x32T.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.RankedEntriesH\x00\x12j\n\x07\x63hained\x18\x06 \x01(\x0b\x32W.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.ChainedDocumentsH\x00\x12n\n\tcomposite\x18\x07 \x01(\x0b\x32Y.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.CompositeDocumentsH\x00\x42\t\n\x07variant\x1a\x44\n\x10\x43hainedDocuments\x12\x17\n\x0finner_documents\x18\x01 \x03(\x0c\x12\x17\n\x0fouter_documents\x18\x02 \x03(\x0c\x1a\x96\x03\n\x12\x43ompositeDocuments\x12\x16\n\x0epage_documents\x18\x01 \x03(\x0c\x12}\n\x0bsub_results\x18\x02 \x03(\x0b\x32h.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.CompositeDocuments.SubQueryResult\x1a\xe8\x01\n\x0eSubQueryResult\x12\x65\n\tdocuments\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.DocumentsH\x00\x12\x65\n\x06\x63ounts\x18\x02 \x01(\x0b\x32S.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV1.CountEntriesH\x00\x42\x08\n\x06resultB\x08\n\x06resultB\t\n\x07version\"\xf4\x02\n\x19GetDocumentHistoryRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetDocumentHistoryRequest.GetDocumentHistoryRequestV0H\x00\x1a\xeb\x01\n\x1bGetDocumentHistoryRequestV0\x12\x18\n\x10\x64\x61ta_contract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\x13\n\x0b\x64ocument_id\x18\x03 \x01(\x0c\x12+\n\x05limit\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x05 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x17\n\x0bstart_at_ms\x18\x06 \x01(\x04\x42\x02\x30\x01\x12\r\n\x05prove\x18\x07 \x01(\x08\x42\t\n\x07version\"\xf7\x04\n\x1aGetDocumentHistoryResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetDocumentHistoryResponse.GetDocumentHistoryResponseV0H\x00\x1a\xeb\x03\n\x1cGetDocumentHistoryResponseV0\x12~\n\x10\x64ocument_history\x18\x01 \x01(\x0b\x32\x62.org.dash.platform.dapi.v0.GetDocumentHistoryResponse.GetDocumentHistoryResponseV0.DocumentHistoryH\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\x14\x44ocumentHistoryEntry\x12\x10\n\x04\x64\x61te\x18\x01 \x01(\x04\x42\x02\x30\x01\x12\r\n\x05value\x18\x02 \x01(\x0c\x1a\x95\x01\n\x0f\x44ocumentHistory\x12\x81\x01\n\x10\x64ocument_entries\x18\x01 \x03(\x0b\x32g.org.dash.platform.dapi.v0.GetDocumentHistoryResponse.GetDocumentHistoryResponseV0.DocumentHistoryEntryB\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\"\xbd\x02\n*GetIdentityByNonUniquePublicKeyHashRequest\x12\x80\x01\n\x02v0\x18\x01 \x01(\x0b\x32r.org.dash.platform.dapi.v0.GetIdentityByNonUniquePublicKeyHashRequest.GetIdentityByNonUniquePublicKeyHashRequestV0H\x00\x1a\x80\x01\n,GetIdentityByNonUniquePublicKeyHashRequestV0\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12\x18\n\x0bstart_after\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\x0e\n\x0c_start_afterB\t\n\x07version\"\xd6\x06\n+GetIdentityByNonUniquePublicKeyHashResponse\x12\x82\x01\n\x02v0\x18\x01 \x01(\x0b\x32t.org.dash.platform.dapi.v0.GetIdentityByNonUniquePublicKeyHashResponse.GetIdentityByNonUniquePublicKeyHashResponseV0H\x00\x1a\x96\x05\n-GetIdentityByNonUniquePublicKeyHashResponseV0\x12\x9a\x01\n\x08identity\x18\x01 \x01(\x0b\x32\x85\x01.org.dash.platform.dapi.v0.GetIdentityByNonUniquePublicKeyHashResponse.GetIdentityByNonUniquePublicKeyHashResponseV0.IdentityResponseH\x00\x12\x9d\x01\n\x05proof\x18\x02 \x01(\x0b\x32\x8b\x01.org.dash.platform.dapi.v0.GetIdentityByNonUniquePublicKeyHashResponse.GetIdentityByNonUniquePublicKeyHashResponseV0.IdentityProvedResponseH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x36\n\x10IdentityResponse\x12\x15\n\x08identity\x18\x01 \x01(\x0cH\x00\x88\x01\x01\x42\x0b\n\t_identity\x1a\xa6\x01\n\x16IdentityProvedResponse\x12P\n&grovedb_identity_public_key_hash_proof\x18\x01 \x01(\x0b\x32 .org.dash.platform.dapi.v0.Proof\x12!\n\x14identity_proof_bytes\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x17\n\x15_identity_proof_bytesB\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\"\xbf\x02\n\x1dGetFinalizedEpochInfosRequest\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetFinalizedEpochInfosRequest.GetFinalizedEpochInfosRequestV0H\x00\x1a\xaa\x01\n\x1fGetFinalizedEpochInfosRequestV0\x12\x19\n\x11start_epoch_index\x18\x01 \x01(\r\x12\"\n\x1astart_epoch_index_included\x18\x02 \x01(\x08\x12\x17\n\x0f\x65nd_epoch_index\x18\x03 \x01(\r\x12 \n\x18\x65nd_epoch_index_included\x18\x04 \x01(\x08\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\xbd\t\n\x1eGetFinalizedEpochInfosResponse\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetFinalizedEpochInfosResponse.GetFinalizedEpochInfosResponseV0H\x00\x1a\xa5\x08\n GetFinalizedEpochInfosResponseV0\x12\x80\x01\n\x06\x65pochs\x18\x01 \x01(\x0b\x32n.org.dash.platform.dapi.v0.GetFinalizedEpochInfosResponse.GetFinalizedEpochInfosResponseV0.FinalizedEpochInfosH\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\xa4\x01\n\x13\x46inalizedEpochInfos\x12\x8c\x01\n\x15\x66inalized_epoch_infos\x18\x01 \x03(\x0b\x32m.org.dash.platform.dapi.v0.GetFinalizedEpochInfosResponse.GetFinalizedEpochInfosResponseV0.FinalizedEpochInfo\x1a\x9f\x04\n\x12\x46inalizedEpochInfo\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\x1c\n\x10\x66irst_block_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(\r\x12!\n\x15total_blocks_in_epoch\x18\x07 \x01(\x04\x42\x02\x30\x01\x12*\n\"next_epoch_start_core_block_height\x18\x08 \x01(\r\x12!\n\x15total_processing_fees\x18\t \x01(\x04\x42\x02\x30\x01\x12*\n\x1etotal_distributed_storage_fees\x18\n \x01(\x04\x42\x02\x30\x01\x12&\n\x1atotal_created_storage_fees\x18\x0b \x01(\x04\x42\x02\x30\x01\x12\x1e\n\x12\x63ore_block_rewards\x18\x0c \x01(\x04\x42\x02\x30\x01\x12\x81\x01\n\x0f\x62lock_proposers\x18\r \x03(\x0b\x32h.org.dash.platform.dapi.v0.GetFinalizedEpochInfosResponse.GetFinalizedEpochInfosResponseV0.BlockProposer\x1a\x39\n\rBlockProposer\x12\x13\n\x0bproposer_id\x18\x01 \x01(\x0c\x12\x13\n\x0b\x62lock_count\x18\x02 \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\"\xe4\x10\n\x11GetStatusResponse\x12N\n\x02v0\x18\x01 \x01(\x0b\x32@.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0H\x00\x1a\xf3\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\x82\x05\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\xcc\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\x12\x12\n\nnext_epoch\x18\x05 \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\x01\n#GetTokenDirectPurchasePricesRequest\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.GetTokenDirectPurchasePricesRequest.GetTokenDirectPurchasePricesRequestV0H\x00\x1aI\n%GetTokenDirectPurchasePricesRequestV0\x12\x11\n\ttoken_ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x8b\t\n$GetTokenDirectPurchasePricesResponse\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetTokenDirectPurchasePricesResponse.GetTokenDirectPurchasePricesResponseV0H\x00\x1a\xe1\x07\n&GetTokenDirectPurchasePricesResponseV0\x12\xa9\x01\n\x1ctoken_direct_purchase_prices\x18\x01 \x01(\x0b\x32\x80\x01.org.dash.platform.dapi.v0.GetTokenDirectPurchasePricesResponse.GetTokenDirectPurchasePricesResponseV0.TokenDirectPurchasePricesH\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\x33\n\x10PriceForQuantity\x12\x10\n\x08quantity\x18\x01 \x01(\x04\x12\r\n\x05price\x18\x02 \x01(\x04\x1a\xa7\x01\n\x0fPricingSchedule\x12\x93\x01\n\x12price_for_quantity\x18\x01 \x03(\x0b\x32w.org.dash.platform.dapi.v0.GetTokenDirectPurchasePricesResponse.GetTokenDirectPurchasePricesResponseV0.PriceForQuantity\x1a\xe4\x01\n\x1dTokenDirectPurchasePriceEntry\x12\x10\n\x08token_id\x18\x01 \x01(\x0c\x12\x15\n\x0b\x66ixed_price\x18\x02 \x01(\x04H\x00\x12\x90\x01\n\x0evariable_price\x18\x03 \x01(\x0b\x32v.org.dash.platform.dapi.v0.GetTokenDirectPurchasePricesResponse.GetTokenDirectPurchasePricesResponseV0.PricingScheduleH\x00\x42\x07\n\x05price\x1a\xc8\x01\n\x19TokenDirectPurchasePrices\x12\xaa\x01\n\x1btoken_direct_purchase_price\x18\x01 \x03(\x0b\x32\x84\x01.org.dash.platform.dapi.v0.GetTokenDirectPurchasePricesResponse.GetTokenDirectPurchasePricesResponseV0.TokenDirectPurchasePriceEntryB\x08\n\x06resultB\t\n\x07version\"\xce\x01\n\x1bGetTokenContractInfoRequest\x12\x62\n\x02v0\x18\x01 \x01(\x0b\x32T.org.dash.platform.dapi.v0.GetTokenContractInfoRequest.GetTokenContractInfoRequestV0H\x00\x1a@\n\x1dGetTokenContractInfoRequestV0\x12\x10\n\x08token_id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xfb\x03\n\x1cGetTokenContractInfoResponse\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetTokenContractInfoResponse.GetTokenContractInfoResponseV0H\x00\x1a\xe9\x02\n\x1eGetTokenContractInfoResponseV0\x12|\n\x04\x64\x61ta\x18\x01 \x01(\x0b\x32l.org.dash.platform.dapi.v0.GetTokenContractInfoResponse.GetTokenContractInfoResponseV0.TokenContractInfoDataH\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\x1aM\n\x15TokenContractInfoData\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1f\n\x17token_contract_position\x18\x02 \x01(\rB\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\"\x82\x04\n-GetTokenPerpetualDistributionLastClaimRequest\x12\x86\x01\n\x02v0\x18\x01 \x01(\x0b\x32x.org.dash.platform.dapi.v0.GetTokenPerpetualDistributionLastClaimRequest.GetTokenPerpetualDistributionLastClaimRequestV0H\x00\x1aI\n\x11\x43ontractTokenInfo\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1f\n\x17token_contract_position\x18\x02 \x01(\r\x1a\xf1\x01\n/GetTokenPerpetualDistributionLastClaimRequestV0\x12\x10\n\x08token_id\x18\x01 \x01(\x0c\x12v\n\rcontract_info\x18\x02 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetTokenPerpetualDistributionLastClaimRequest.ContractTokenInfoH\x00\x88\x01\x01\x12\x13\n\x0bidentity_id\x18\x04 \x01(\x0c\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\x10\n\x0e_contract_infoB\t\n\x07version\"\x93\x05\n.GetTokenPerpetualDistributionLastClaimResponse\x12\x88\x01\n\x02v0\x18\x01 \x01(\x0b\x32z.org.dash.platform.dapi.v0.GetTokenPerpetualDistributionLastClaimResponse.GetTokenPerpetualDistributionLastClaimResponseV0H\x00\x1a\xca\x03\n0GetTokenPerpetualDistributionLastClaimResponseV0\x12\x9f\x01\n\nlast_claim\x18\x01 \x01(\x0b\x32\x88\x01.org.dash.platform.dapi.v0.GetTokenPerpetualDistributionLastClaimResponse.GetTokenPerpetualDistributionLastClaimResponseV0.LastClaimInfoH\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\rLastClaimInfo\x12\x1a\n\x0ctimestamp_ms\x18\x01 \x01(\x04\x42\x02\x30\x01H\x00\x12\x1a\n\x0c\x62lock_height\x18\x02 \x01(\x04\x42\x02\x30\x01H\x00\x12\x0f\n\x05\x65poch\x18\x03 \x01(\rH\x00\x12\x13\n\traw_bytes\x18\x04 \x01(\x0cH\x00\x42\t\n\x07paid_atB\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\"\xd6\x1e\n\x17GetGroupActionsResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0H\x00\x1a\xd3\x1d\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[\n\tBurnEvent\x12\x0e\n\x06\x61mount\x18\x01 \x01(\x04\x12\x14\n\x0c\x62urn_from_id\x18\x02 \x01(\x0c\x12\x18\n\x0bpublic_note\x18\x03 \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\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\xe6\x03\n\x1eUpdateDirectPurchasePriceEvent\x12\x15\n\x0b\x66ixed_price\x18\x01 \x01(\x04H\x00\x12\x95\x01\n\x0evariable_price\x18\x02 \x01(\x0b\x32{.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UpdateDirectPurchasePriceEvent.PricingScheduleH\x00\x12\x18\n\x0bpublic_note\x18\x03 \x01(\tH\x01\x88\x01\x01\x1a\x33\n\x10PriceForQuantity\x12\x10\n\x08quantity\x18\x01 \x01(\x04\x12\r\n\x05price\x18\x02 \x01(\x04\x1a\xac\x01\n\x0fPricingSchedule\x12\x98\x01\n\x12price_for_quantity\x18\x01 \x03(\x0b\x32|.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UpdateDirectPurchasePriceEvent.PriceForQuantityB\x07\n\x05priceB\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\xd1\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\x12}\n\x10\x65mergency_action\x18\x06 \x01(\x0b\x32\x61.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEventH\x00\x12\x82\x01\n\x13token_config_update\x18\x07 \x01(\x0b\x32\x63.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEventH\x00\x12\x83\x01\n\x0cupdate_price\x18\x08 \x01(\x0b\x32k.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UpdateDirectPurchasePriceEventH\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\"\xb5\x01\n\x15GetAddressInfoRequest\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetAddressInfoRequest.GetAddressInfoRequestV0H\x00\x1a\x39\n\x17GetAddressInfoRequestV0\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x85\x01\n\x10\x41\x64\x64ressInfoEntry\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12J\n\x11\x62\x61lance_and_nonce\x18\x02 \x01(\x0b\x32*.org.dash.platform.dapi.v0.BalanceAndNonceH\x00\x88\x01\x01\x42\x14\n\x12_balance_and_nonce\"1\n\x0f\x42\x61lanceAndNonce\x12\x0f\n\x07\x62\x61lance\x18\x01 \x01(\x04\x12\r\n\x05nonce\x18\x02 \x01(\r\"_\n\x12\x41\x64\x64ressInfoEntries\x12I\n\x14\x61\x64\x64ress_info_entries\x18\x01 \x03(\x0b\x32+.org.dash.platform.dapi.v0.AddressInfoEntry\"m\n\x14\x41\x64\x64ressBalanceChange\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x19\n\x0bset_balance\x18\x02 \x01(\x04\x42\x02\x30\x01H\x00\x12\x1c\n\x0e\x61\x64\x64_to_balance\x18\x03 \x01(\x04\x42\x02\x30\x01H\x00\x42\x0b\n\toperation\"x\n\x1a\x42lockAddressBalanceChanges\x12\x18\n\x0c\x62lock_height\x18\x01 \x01(\x04\x42\x02\x30\x01\x12@\n\x07\x63hanges\x18\x02 \x03(\x0b\x32/.org.dash.platform.dapi.v0.AddressBalanceChange\"k\n\x1b\x41\x64\x64ressBalanceUpdateEntries\x12L\n\rblock_changes\x18\x01 \x03(\x0b\x32\x35.org.dash.platform.dapi.v0.BlockAddressBalanceChanges\"\xe1\x02\n\x16GetAddressInfoResponse\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetAddressInfoResponse.GetAddressInfoResponseV0H\x00\x1a\xe1\x01\n\x18GetAddressInfoResponseV0\x12I\n\x12\x61\x64\x64ress_info_entry\x18\x01 \x01(\x0b\x32+.org.dash.platform.dapi.v0.AddressInfoEntryH\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\"\xc3\x01\n\x18GetAddressesInfosRequest\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetAddressesInfosRequest.GetAddressesInfosRequestV0H\x00\x1a>\n\x1aGetAddressesInfosRequestV0\x12\x11\n\taddresses\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xf1\x02\n\x19GetAddressesInfosResponse\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetAddressesInfosResponse.GetAddressesInfosResponseV0H\x00\x1a\xe8\x01\n\x1bGetAddressesInfosResponseV0\x12M\n\x14\x61\x64\x64ress_info_entries\x18\x01 \x01(\x0b\x32-.org.dash.platform.dapi.v0.AddressInfoEntriesH\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\"\xb5\x01\n\x1dGetAddressesTrunkStateRequest\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetAddressesTrunkStateRequest.GetAddressesTrunkStateRequestV0H\x00\x1a!\n\x1fGetAddressesTrunkStateRequestV0B\t\n\x07version\"\xaa\x02\n\x1eGetAddressesTrunkStateResponse\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetAddressesTrunkStateResponse.GetAddressesTrunkStateResponseV0H\x00\x1a\x92\x01\n GetAddressesTrunkStateResponseV0\x12/\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.Proof\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\t\n\x07version\"\xf0\x01\n\x1eGetAddressesBranchStateRequest\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetAddressesBranchStateRequest.GetAddressesBranchStateRequestV0H\x00\x1aY\n GetAddressesBranchStateRequestV0\x12\x0b\n\x03key\x18\x01 \x01(\x0c\x12\r\n\x05\x64\x65pth\x18\x02 \x01(\r\x12\x19\n\x11\x63heckpoint_height\x18\x03 \x01(\x04\x42\t\n\x07version\"\xd1\x01\n\x1fGetAddressesBranchStateResponse\x12j\n\x02v0\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetAddressesBranchStateResponse.GetAddressesBranchStateResponseV0H\x00\x1a\x37\n!GetAddressesBranchStateResponseV0\x12\x12\n\nmerk_proof\x18\x02 \x01(\x0c\x42\t\n\x07version\"\x9e\x02\n%GetRecentAddressBalanceChangesRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetRecentAddressBalanceChangesRequest.GetRecentAddressBalanceChangesRequestV0H\x00\x1ar\n\'GetRecentAddressBalanceChangesRequestV0\x12\x18\n\x0cstart_height\x18\x01 \x01(\x04\x42\x02\x30\x01\x12\r\n\x05prove\x18\x02 \x01(\x08\x12\x1e\n\x16start_height_exclusive\x18\x03 \x01(\x08\x42\t\n\x07version\"\xb8\x03\n&GetRecentAddressBalanceChangesResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetRecentAddressBalanceChangesResponse.GetRecentAddressBalanceChangesResponseV0H\x00\x1a\x88\x02\n(GetRecentAddressBalanceChangesResponseV0\x12`\n\x1e\x61\x64\x64ress_balance_update_entries\x18\x01 \x01(\x0b\x32\x36.org.dash.platform.dapi.v0.AddressBalanceUpdateEntriesH\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\"G\n\x16\x42lockHeightCreditEntry\x12\x18\n\x0c\x62lock_height\x18\x01 \x01(\x04\x42\x02\x30\x01\x12\x13\n\x07\x63redits\x18\x02 \x01(\x04\x42\x02\x30\x01\"\xb0\x01\n\x1d\x43ompactedAddressBalanceChange\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x19\n\x0bset_credits\x18\x02 \x01(\x04\x42\x02\x30\x01H\x00\x12V\n\x19\x61\x64\x64_to_credits_operations\x18\x03 \x01(\x0b\x32\x31.org.dash.platform.dapi.v0.AddToCreditsOperationsH\x00\x42\x0b\n\toperation\"\\\n\x16\x41\x64\x64ToCreditsOperations\x12\x42\n\x07\x65ntries\x18\x01 \x03(\x0b\x32\x31.org.dash.platform.dapi.v0.BlockHeightCreditEntry\"\xae\x01\n#CompactedBlockAddressBalanceChanges\x12\x1e\n\x12start_block_height\x18\x01 \x01(\x04\x42\x02\x30\x01\x12\x1c\n\x10\x65nd_block_height\x18\x02 \x01(\x04\x42\x02\x30\x01\x12I\n\x07\x63hanges\x18\x03 \x03(\x0b\x32\x38.org.dash.platform.dapi.v0.CompactedAddressBalanceChange\"\x87\x01\n$CompactedAddressBalanceUpdateEntries\x12_\n\x17\x63ompacted_block_changes\x18\x01 \x03(\x0b\x32>.org.dash.platform.dapi.v0.CompactedBlockAddressBalanceChanges\"\xa9\x02\n.GetRecentCompactedAddressBalanceChangesRequest\x12\x88\x01\n\x02v0\x18\x01 \x01(\x0b\x32z.org.dash.platform.dapi.v0.GetRecentCompactedAddressBalanceChangesRequest.GetRecentCompactedAddressBalanceChangesRequestV0H\x00\x1a\x61\n0GetRecentCompactedAddressBalanceChangesRequestV0\x12\x1e\n\x12start_block_height\x18\x01 \x01(\x04\x42\x02\x30\x01\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xf0\x03\n/GetRecentCompactedAddressBalanceChangesResponse\x12\x8a\x01\n\x02v0\x18\x01 \x01(\x0b\x32|.org.dash.platform.dapi.v0.GetRecentCompactedAddressBalanceChangesResponse.GetRecentCompactedAddressBalanceChangesResponseV0H\x00\x1a\xa4\x02\n1GetRecentCompactedAddressBalanceChangesResponseV0\x12s\n(compacted_address_balance_update_entries\x18\x01 \x01(\x0b\x32?.org.dash.platform.dapi.v0.CompactedAddressBalanceUpdateEntriesH\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\"\xf4\x01\n GetShieldedEncryptedNotesRequest\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetShieldedEncryptedNotesRequest.GetShieldedEncryptedNotesRequestV0H\x00\x1aW\n\"GetShieldedEncryptedNotesRequestV0\x12\x13\n\x0bstart_index\x18\x01 \x01(\x04\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xbc\x05\n!GetShieldedEncryptedNotesResponse\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetShieldedEncryptedNotesResponse.GetShieldedEncryptedNotesResponseV0H\x00\x1a\x9b\x04\n#GetShieldedEncryptedNotesResponseV0\x12\x8a\x01\n\x0f\x65ncrypted_notes\x18\x01 \x01(\x0b\x32o.org.dash.platform.dapi.v0.GetShieldedEncryptedNotesResponse.GetShieldedEncryptedNotesResponseV0.EncryptedNotesH\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\x1aW\n\rEncryptedNote\x12\x11\n\tnullifier\x18\x01 \x01(\x0c\x12\x0b\n\x03\x63mx\x18\x02 \x01(\x0c\x12\x16\n\x0e\x65ncrypted_note\x18\x03 \x01(\x0c\x12\x0e\n\x06\x63v_net\x18\x04 \x01(\x0c\x1a\x91\x01\n\x0e\x45ncryptedNotes\x12\x7f\n\x07\x65ntries\x18\x01 \x03(\x0b\x32n.org.dash.platform.dapi.v0.GetShieldedEncryptedNotesResponse.GetShieldedEncryptedNotesResponseV0.EncryptedNoteB\x08\n\x06resultB\t\n\x07version\"\xb4\x01\n\x19GetShieldedAnchorsRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetShieldedAnchorsRequest.GetShieldedAnchorsRequestV0H\x00\x1a,\n\x1bGetShieldedAnchorsRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xb1\x03\n\x1aGetShieldedAnchorsResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetShieldedAnchorsResponse.GetShieldedAnchorsResponseV0H\x00\x1a\xa5\x02\n\x1cGetShieldedAnchorsResponseV0\x12m\n\x07\x61nchors\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetShieldedAnchorsResponse.GetShieldedAnchorsResponseV0.AnchorsH\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\x07\x41nchors\x12\x0f\n\x07\x61nchors\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xd8\x01\n\"GetMostRecentShieldedAnchorRequest\x12p\n\x02v0\x18\x01 \x01(\x0b\x32\x62.org.dash.platform.dapi.v0.GetMostRecentShieldedAnchorRequest.GetMostRecentShieldedAnchorRequestV0H\x00\x1a\x35\n$GetMostRecentShieldedAnchorRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xdc\x02\n#GetMostRecentShieldedAnchorResponse\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.GetMostRecentShieldedAnchorResponse.GetMostRecentShieldedAnchorResponseV0H\x00\x1a\xb5\x01\n%GetMostRecentShieldedAnchorResponseV0\x12\x10\n\x06\x61nchor\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\x01\n\x1bGetShieldedPoolStateRequest\x12\x62\n\x02v0\x18\x01 \x01(\x0b\x32T.org.dash.platform.dapi.v0.GetShieldedPoolStateRequest.GetShieldedPoolStateRequestV0H\x00\x1a.\n\x1dGetShieldedPoolStateRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xcb\x02\n\x1cGetShieldedPoolStateResponse\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetShieldedPoolStateResponse.GetShieldedPoolStateResponseV0H\x00\x1a\xb9\x01\n\x1eGetShieldedPoolStateResponseV0\x12\x1b\n\rtotal_balance\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\"\xc0\x01\n\x1cGetShieldedNotesCountRequest\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetShieldedNotesCountRequest.GetShieldedNotesCountRequestV0H\x00\x1a/\n\x1eGetShieldedNotesCountRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xd3\x02\n\x1dGetShieldedNotesCountResponse\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetShieldedNotesCountResponse.GetShieldedNotesCountResponseV0H\x00\x1a\xbe\x01\n\x1fGetShieldedNotesCountResponseV0\x12\x1f\n\x11total_notes_count\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\"\xd4\x01\n\x1cGetShieldedNullifiersRequest\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetShieldedNullifiersRequest.GetShieldedNullifiersRequestV0H\x00\x1a\x43\n\x1eGetShieldedNullifiersRequestV0\x12\x12\n\nnullifiers\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x86\x05\n\x1dGetShieldedNullifiersResponse\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetShieldedNullifiersResponse.GetShieldedNullifiersResponseV0H\x00\x1a\xf1\x03\n\x1fGetShieldedNullifiersResponseV0\x12\x88\x01\n\x12nullifier_statuses\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetShieldedNullifiersResponse.GetShieldedNullifiersResponseV0.NullifierStatusesH\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\x36\n\x0fNullifierStatus\x12\x11\n\tnullifier\x18\x01 \x01(\x0c\x12\x10\n\x08is_spent\x18\x02 \x01(\x08\x1a\x8e\x01\n\x11NullifierStatuses\x12y\n\x07\x65ntries\x18\x01 \x03(\x0b\x32h.org.dash.platform.dapi.v0.GetShieldedNullifiersResponse.GetShieldedNullifiersResponseV0.NullifierStatusB\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*\x92\x01\n\x16\x43ontractModerationList\x12(\n$CONTRACT_MODERATION_LIST_UNSPECIFIED\x10\x00\x12$\n CONTRACT_MODERATION_LIST_BANLIST\x10\x01\x12(\n$CONTRACT_MODERATION_LIST_SUSPENSIONS\x10\x02\x32\xadN\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\xa8\x01\n\x1fgetIdentityKeysRemainingBudgets\x12\x41.org.dash.platform.dapi.v0.GetIdentityKeysRemainingBudgetsRequest\x1a\x42.org.dash.platform.dapi.v0.GetIdentityKeysRemainingBudgetsResponse\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\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\xa5\x01\n\x1egetDataContractsLatestVersions\x12@.org.dash.platform.dapi.v0.GetDataContractsLatestVersionsRequest\x1a\x41.org.dash.platform.dapi.v0.GetDataContractsLatestVersionsResponse\x12{\n\x10getDataContracts\x12\x32.org.dash.platform.dapi.v0.GetDataContractsRequest\x1a\x33.org.dash.platform.dapi.v0.GetDataContractsResponse\x12\x89\x01\n\x17getDataContractsByRange\x12\x39.org.dash.platform.dapi.v0.GetDataContractsByRangeRequest\x1a\x33.org.dash.platform.dapi.v0.GetDataContractsResponse\x12\x87\x01\n\x14getContractGroupInfo\x12\x36.org.dash.platform.dapi.v0.GetContractGroupInfoRequest\x1a\x37.org.dash.platform.dapi.v0.GetContractGroupInfoResponse\x12\x90\x01\n\x17getContractGroupMembers\x12\x39.org.dash.platform.dapi.v0.GetContractGroupMembersRequest\x1a:.org.dash.platform.dapi.v0.GetContractGroupMembersResponse\x12\x9f\x01\n\x1cgetContractGroupsForContract\x12>.org.dash.platform.dapi.v0.GetContractGroupsForContractRequest\x1a?.org.dash.platform.dapi.v0.GetContractGroupsForContractResponse\x12\x9c\x01\n\x1bgetContractModerationStatus\x12=.org.dash.platform.dapi.v0.GetContractModerationStatusRequest\x1a>.org.dash.platform.dapi.v0.GetContractModerationStatusResponse\x12\x9f\x01\n\x1cgetContractModerationEntries\x12>.org.dash.platform.dapi.v0.GetContractModerationEntriesRequest\x1a?.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse\x12\x81\x01\n\x12getDocumentHistory\x12\x34.org.dash.platform.dapi.v0.GetDocumentHistoryRequest\x1a\x35.org.dash.platform.dapi.v0.GetDocumentHistoryResponse\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\xb4\x01\n#getIdentityByNonUniquePublicKeyHash\x12\x45.org.dash.platform.dapi.v0.GetIdentityByNonUniquePublicKeyHashRequest\x1a\x46.org.dash.platform.dapi.v0.GetIdentityByNonUniquePublicKeyHashResponse\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\x8d\x01\n\x16getFinalizedEpochInfos\x12\x38.org.dash.platform.dapi.v0.GetFinalizedEpochInfosRequest\x1a\x39.org.dash.platform.dapi.v0.GetFinalizedEpochInfosResponse\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\x9f\x01\n\x1cgetTokenDirectPurchasePrices\x12>.org.dash.platform.dapi.v0.GetTokenDirectPurchasePricesRequest\x1a?.org.dash.platform.dapi.v0.GetTokenDirectPurchasePricesResponse\x12\x87\x01\n\x14getTokenContractInfo\x12\x36.org.dash.platform.dapi.v0.GetTokenContractInfoRequest\x1a\x37.org.dash.platform.dapi.v0.GetTokenContractInfoResponse\x12\xb1\x01\n\"getTokenPreProgrammedDistributions\x12\x44.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest\x1a\x45.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse\x12\xbd\x01\n&getTokenPerpetualDistributionLastClaim\x12H.org.dash.platform.dapi.v0.GetTokenPerpetualDistributionLastClaimRequest\x1aI.org.dash.platform.dapi.v0.GetTokenPerpetualDistributionLastClaimResponse\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.GetGroupActionSignersResponse\x12u\n\x0egetAddressInfo\x12\x30.org.dash.platform.dapi.v0.GetAddressInfoRequest\x1a\x31.org.dash.platform.dapi.v0.GetAddressInfoResponse\x12~\n\x11getAddressesInfos\x12\x33.org.dash.platform.dapi.v0.GetAddressesInfosRequest\x1a\x34.org.dash.platform.dapi.v0.GetAddressesInfosResponse\x12\x8d\x01\n\x16getAddressesTrunkState\x12\x38.org.dash.platform.dapi.v0.GetAddressesTrunkStateRequest\x1a\x39.org.dash.platform.dapi.v0.GetAddressesTrunkStateResponse\x12\x90\x01\n\x17getAddressesBranchState\x12\x39.org.dash.platform.dapi.v0.GetAddressesBranchStateRequest\x1a:.org.dash.platform.dapi.v0.GetAddressesBranchStateResponse\x12\xa5\x01\n\x1egetRecentAddressBalanceChanges\x12@.org.dash.platform.dapi.v0.GetRecentAddressBalanceChangesRequest\x1a\x41.org.dash.platform.dapi.v0.GetRecentAddressBalanceChangesResponse\x12\xc0\x01\n\'getRecentCompactedAddressBalanceChanges\x12I.org.dash.platform.dapi.v0.GetRecentCompactedAddressBalanceChangesRequest\x1aJ.org.dash.platform.dapi.v0.GetRecentCompactedAddressBalanceChangesResponse\x12\x96\x01\n\x19getShieldedEncryptedNotes\x12;.org.dash.platform.dapi.v0.GetShieldedEncryptedNotesRequest\x1a<.org.dash.platform.dapi.v0.GetShieldedEncryptedNotesResponse\x12\x81\x01\n\x12getShieldedAnchors\x12\x34.org.dash.platform.dapi.v0.GetShieldedAnchorsRequest\x1a\x35.org.dash.platform.dapi.v0.GetShieldedAnchorsResponse\x12\x9c\x01\n\x1bgetMostRecentShieldedAnchor\x12=.org.dash.platform.dapi.v0.GetMostRecentShieldedAnchorRequest\x1a>.org.dash.platform.dapi.v0.GetMostRecentShieldedAnchorResponse\x12\x87\x01\n\x14getShieldedPoolState\x12\x36.org.dash.platform.dapi.v0.GetShieldedPoolStateRequest\x1a\x37.org.dash.platform.dapi.v0.GetShieldedPoolStateResponse\x12\x8a\x01\n\x15getShieldedNotesCount\x12\x37.org.dash.platform.dapi.v0.GetShieldedNotesCountRequest\x1a\x38.org.dash.platform.dapi.v0.GetShieldedNotesCountResponse\x12\x8a\x01\n\x15getShieldedNullifiers\x12\x37.org.dash.platform.dapi.v0.GetShieldedNullifiersRequest\x1a\x38.org.dash.platform.dapi.v0.GetShieldedNullifiersResponseb\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=75968, - serialized_end=76058, + serialized_start=76308, + serialized_end=76398, ) _sym_db.RegisterEnumDescriptor(_KEYPURPOSE) @@ -93,8 +93,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=76061, - serialized_end=76207, + serialized_start=76401, + serialized_end=76547, ) _sym_db.RegisterEnumDescriptor(_CONTRACTMODERATIONLIST) @@ -159,8 +159,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=19941, - serialized_end=19989, + serialized_start=20281, + serialized_end=20329, ) _sym_db.RegisterEnumDescriptor(_GETDOCUMENTSREQUEST_TIMERANGESELECTION_SELECTOR) @@ -189,8 +189,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=20410, - serialized_end=20449, + serialized_start=20750, + serialized_end=20789, ) _sym_db.RegisterEnumDescriptor(_GETDOCUMENTSREQUEST_HAVINGAGGREGATE_FUNCTION) @@ -259,8 +259,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=20724, - serialized_end=20948, + serialized_start=21064, + serialized_end=21288, ) _sym_db.RegisterEnumDescriptor(_GETDOCUMENTSREQUEST_HAVINGCLAUSE_OPERATOR) @@ -304,8 +304,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=22149, - serialized_end=22221, + serialized_start=22489, + serialized_end=22561, ) _sym_db.RegisterEnumDescriptor(_GETDOCUMENTSREQUEST_GETDOCUMENTSREQUESTV1_SELECT_FUNCTION) @@ -329,8 +329,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=22799, - serialized_end=22831, + serialized_start=23139, + serialized_end=23171, ) _sym_db.RegisterEnumDescriptor(_GETDOCUMENTSREQUEST_GETDOCUMENTSREQUESTV1_SUBQUERY_KIND) @@ -404,8 +404,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=22874, - serialized_end=23124, + serialized_start=23214, + serialized_end=23464, ) _sym_db.RegisterEnumDescriptor(_GETDOCUMENTSREQUEST_WHEREOPERATOR) @@ -434,8 +434,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=38678, - serialized_end=38751, + serialized_start=39018, + serialized_end=39091, ) _sym_db.RegisterEnumDescriptor(_GETCONTESTEDRESOURCEVOTESTATEREQUEST_GETCONTESTEDRESOURCEVOTESTATEREQUESTV0_RESULTTYPE) @@ -464,8 +464,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=39673, - serialized_end=39752, + serialized_start=40013, + serialized_end=40092, ) _sym_db.RegisterEnumDescriptor(_GETCONTESTEDRESOURCEVOTESTATERESPONSE_GETCONTESTEDRESOURCEVOTESTATERESPONSEV0_FINISHEDVOTEINFO_FINISHEDVOTEOUTCOME) @@ -494,8 +494,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=43381, - serialized_end=43442, + serialized_start=43721, + serialized_end=43782, ) _sym_db.RegisterEnumDescriptor(_GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSE_GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSEV0_RESOURCEVOTECHOICE_VOTECHOICETYPE) @@ -519,8 +519,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=62006, - serialized_end=62044, + serialized_start=62346, + serialized_end=62384, ) _sym_db.RegisterEnumDescriptor(_GETGROUPACTIONSREQUEST_ACTIONSTATUS) @@ -544,8 +544,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=63291, - serialized_end=63326, + serialized_start=63631, + serialized_end=63666, ) _sym_db.RegisterEnumDescriptor(_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_EMERGENCYACTIONEVENT_ACTIONTYPE) @@ -569,8 +569,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=62006, - serialized_end=62044, + serialized_start=62346, + serialized_end=62384, ) _sym_db.RegisterEnumDescriptor(_GETGROUPACTIONSIGNERSREQUEST_ACTIONSTATUS) @@ -4392,6 +4392,50 @@ ) +_CONTRACTMODERATIONREASON = _descriptor.Descriptor( + name='ContractModerationReason', + full_name='org.dash.platform.dapi.v0.ContractModerationReason', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='code', full_name='org.dash.platform.dapi.v0.ContractModerationReason.code', 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='text', full_name='org.dash.platform.dapi.v0.ContractModerationReason.text', 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='_code', full_name='org.dash.platform.dapi.v0.ContractModerationReason._code', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=13843, + serialized_end=13911, +) + + _GETCONTRACTMODERATIONSTATUSREQUEST_GETCONTRACTMODERATIONSTATUSREQUESTV0 = _descriptor.Descriptor( name='GetContractModerationStatusRequestV0', full_name='org.dash.platform.dapi.v0.GetContractModerationStatusRequest.GetContractModerationStatusRequestV0', @@ -4440,8 +4484,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=13997, - serialized_end=14158, + serialized_start=14067, + serialized_end=14228, ) _GETCONTRACTMODERATIONSTATUSREQUEST = _descriptor.Descriptor( @@ -4476,8 +4520,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=13844, - serialized_end=14169, + serialized_start=13914, + serialized_end=14239, ) @@ -4510,6 +4554,20 @@ 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='ban_reason', full_name='org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus.ban_reason', 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='suspension_reason', full_name='org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus.suspension_reason', 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), ], extensions=[ ], @@ -4531,9 +4589,19 @@ index=1, containing_type=None, create_key=_descriptor._internal_create_key, fields=[]), + _descriptor.OneofDescriptor( + name='_ban_reason', full_name='org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus._ban_reason', + index=2, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + _descriptor.OneofDescriptor( + name='_suspension_reason', full_name='org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus._suspension_reason', + index=3, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), ], - serialized_start=14328, - serialized_end=14502, + serialized_start=14398, + serialized_end=14772, ) _GETCONTRACTMODERATIONSTATUSRESPONSE_GETCONTRACTMODERATIONSTATUSRESPONSEV0 = _descriptor.Descriptor( @@ -4582,8 +4650,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=14505, - serialized_end=14775, + serialized_start=14775, + serialized_end=15045, ) _GETCONTRACTMODERATIONSTATUSRESPONSE = _descriptor.Descriptor( @@ -4618,8 +4686,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=14172, - serialized_end=14786, + serialized_start=14242, + serialized_end=15056, ) @@ -4688,8 +4756,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=14945, - serialized_end=15157, + serialized_start=15215, + serialized_end=15427, ) _GETCONTRACTMODERATIONENTRIESREQUEST = _descriptor.Descriptor( @@ -4724,8 +4792,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=14789, - serialized_end=15168, + serialized_start=15059, + serialized_end=15438, ) @@ -4751,6 +4819,13 @@ 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='reason', full_name='org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractModerationEntry.reason', 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=[ ], @@ -4768,8 +4843,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=15329, - serialized_end=15405, + serialized_start=15600, + serialized_end=15745, ) _GETCONTRACTMODERATIONENTRIESRESPONSE_CONTRACTMODERATIONENTRIES = _descriptor.Descriptor( @@ -4799,8 +4874,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=15408, - serialized_end=15541, + serialized_start=15748, + serialized_end=15881, ) _GETCONTRACTMODERATIONENTRIESRESPONSE_GETCONTRACTMODERATIONENTRIESRESPONSEV0 = _descriptor.Descriptor( @@ -4849,8 +4924,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=15544, - serialized_end=15818, + serialized_start=15884, + serialized_end=16158, ) _GETCONTRACTMODERATIONENTRIESRESPONSE = _descriptor.Descriptor( @@ -4885,8 +4960,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=15171, - serialized_end=15829, + serialized_start=15441, + serialized_end=16169, ) @@ -4924,8 +4999,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=15987, - serialized_end=16062, + serialized_start=16327, + serialized_end=16402, ) _GETCONTRACTGROUPSFORCONTRACTREQUEST = _descriptor.Descriptor( @@ -4960,8 +5035,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=15832, - serialized_end=16073, + serialized_start=16172, + serialized_end=16413, ) @@ -4999,8 +5074,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=16234, - serialized_end=16315, + serialized_start=16574, + serialized_end=16655, ) _GETCONTRACTGROUPSFORCONTRACTRESPONSE_TOKENMEMBERSHIPS = _descriptor.Descriptor( @@ -5037,8 +5112,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=16317, - serialized_end=16387, + serialized_start=16657, + serialized_end=16727, ) _GETCONTRACTGROUPSFORCONTRACTRESPONSE_CONTRACTGROUPMEMBERSHIPS = _descriptor.Descriptor( @@ -5082,8 +5157,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=16390, - serialized_end=16655, + serialized_start=16730, + serialized_end=16995, ) _GETCONTRACTGROUPSFORCONTRACTRESPONSE_GETCONTRACTGROUPSFORCONTRACTRESPONSEV0 = _descriptor.Descriptor( @@ -5132,8 +5207,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=16658, - serialized_end=16950, + serialized_start=16998, + serialized_end=17290, ) _GETCONTRACTGROUPSFORCONTRACTRESPONSE = _descriptor.Descriptor( @@ -5168,8 +5243,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=16076, - serialized_end=16961, + serialized_start=16416, + serialized_end=17301, ) @@ -5207,8 +5282,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=17083, - serialized_end=17138, + serialized_start=17423, + serialized_end=17478, ) _GETDATACONTRACTSREQUEST = _descriptor.Descriptor( @@ -5243,8 +5318,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=16964, - serialized_end=17149, + serialized_start=17304, + serialized_end=17489, ) @@ -5313,8 +5388,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=17293, - serialized_end=17442, + serialized_start=17633, + serialized_end=17782, ) _GETDATACONTRACTSBYRANGEREQUEST = _descriptor.Descriptor( @@ -5349,8 +5424,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=17152, - serialized_end=17453, + serialized_start=17492, + serialized_end=17793, ) @@ -5388,8 +5463,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=17578, - serialized_end=17669, + serialized_start=17918, + serialized_end=18009, ) _GETDATACONTRACTSRESPONSE_DATACONTRACTS = _descriptor.Descriptor( @@ -5419,8 +5494,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=17671, - serialized_end=17788, + serialized_start=18011, + serialized_end=18128, ) _GETDATACONTRACTSRESPONSE_GETDATACONTRACTSRESPONSEV0 = _descriptor.Descriptor( @@ -5469,8 +5544,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=17791, - serialized_end=18036, + serialized_start=18131, + serialized_end=18376, ) _GETDATACONTRACTSRESPONSE = _descriptor.Descriptor( @@ -5505,8 +5580,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=17456, - serialized_end=18047, + serialized_start=17796, + serialized_end=18387, ) @@ -5565,8 +5640,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=18188, - serialized_end=18364, + serialized_start=18528, + serialized_end=18704, ) _GETDATACONTRACTHISTORYREQUEST = _descriptor.Descriptor( @@ -5601,8 +5676,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=18050, - serialized_end=18375, + serialized_start=18390, + serialized_end=18715, ) @@ -5640,8 +5715,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=18815, - serialized_end=18874, + serialized_start=19155, + serialized_end=19214, ) _GETDATACONTRACTHISTORYRESPONSE_GETDATACONTRACTHISTORYRESPONSEV0_DATACONTRACTHISTORY = _descriptor.Descriptor( @@ -5671,8 +5746,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=18877, - serialized_end=19047, + serialized_start=19217, + serialized_end=19387, ) _GETDATACONTRACTHISTORYRESPONSE_GETDATACONTRACTHISTORYRESPONSEV0 = _descriptor.Descriptor( @@ -5721,8 +5796,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=18519, - serialized_end=19057, + serialized_start=18859, + serialized_end=19397, ) _GETDATACONTRACTHISTORYRESPONSE = _descriptor.Descriptor( @@ -5757,8 +5832,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=18378, - serialized_end=19068, + serialized_start=18718, + serialized_end=19408, ) @@ -5789,8 +5864,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=19540, - serialized_end=19634, + serialized_start=19880, + serialized_end=19974, ) _GETDOCUMENTSREQUEST_DOCUMENTFIELDVALUE = _descriptor.Descriptor( @@ -5874,8 +5949,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=19263, - serialized_end=19645, + serialized_start=19603, + serialized_end=19985, ) _GETDOCUMENTSREQUEST_TIMERANGESELECTION_GRID = _descriptor.Descriptor( @@ -5919,8 +5994,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=19877, - serialized_end=19939, + serialized_start=20217, + serialized_end=20279, ) _GETDOCUMENTSREQUEST_TIMERANGESELECTION = _descriptor.Descriptor( @@ -5970,8 +6045,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=19648, - serialized_end=20002, + serialized_start=19988, + serialized_end=20342, ) _GETDOCUMENTSREQUEST_WHERECLAUSE = _descriptor.Descriptor( @@ -6022,8 +6097,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=20005, - serialized_end=20282, + serialized_start=20345, + serialized_end=20622, ) _GETDOCUMENTSREQUEST_HAVINGAGGREGATE = _descriptor.Descriptor( @@ -6061,8 +6136,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=20285, - serialized_end=20449, + serialized_start=20625, + serialized_end=20789, ) _GETDOCUMENTSREQUEST_HAVINGCLAUSE = _descriptor.Descriptor( @@ -6112,8 +6187,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=20452, - serialized_end=20957, + serialized_start=20792, + serialized_end=21297, ) _GETDOCUMENTSREQUEST_ORDERCLAUSE = _descriptor.Descriptor( @@ -6162,8 +6237,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=20960, - serialized_end=21104, + serialized_start=21300, + serialized_end=21444, ) _GETDOCUMENTSREQUEST_GETDOCUMENTSREQUESTV0 = _descriptor.Descriptor( @@ -6247,8 +6322,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=21107, - serialized_end=21294, + serialized_start=21447, + serialized_end=21634, ) _GETDOCUMENTSREQUEST_GETDOCUMENTSREQUESTV1_SELECT = _descriptor.Descriptor( @@ -6286,8 +6361,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=22020, - serialized_end=22221, + serialized_start=22360, + serialized_end=22561, ) _GETDOCUMENTSREQUEST_GETDOCUMENTSREQUESTV1_CHAINEDJOIN = _descriptor.Descriptor( @@ -6324,8 +6399,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=22223, - serialized_end=22288, + serialized_start=22563, + serialized_end=22628, ) _GETDOCUMENTSREQUEST_GETDOCUMENTSREQUESTV1_SUBQUERY_BINDING = _descriptor.Descriptor( @@ -6369,8 +6444,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=22732, - serialized_end=22797, + serialized_start=23072, + serialized_end=23137, ) _GETDOCUMENTSREQUEST_GETDOCUMENTSREQUESTV1_SUBQUERY = _descriptor.Descriptor( @@ -6448,8 +6523,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=22291, - serialized_end=22841, + serialized_start=22631, + serialized_end=23181, ) _GETDOCUMENTSREQUEST_GETDOCUMENTSREQUESTV1 = _descriptor.Descriptor( @@ -6585,8 +6660,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=21297, - serialized_end=22871, + serialized_start=21637, + serialized_end=23211, ) _GETDOCUMENTSREQUEST = _descriptor.Descriptor( @@ -6629,8 +6704,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=19071, - serialized_end=23135, + serialized_start=19411, + serialized_end=23475, ) @@ -6661,8 +6736,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=23578, - serialized_end=23608, + serialized_start=23918, + serialized_end=23948, ) _GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV0 = _descriptor.Descriptor( @@ -6711,8 +6786,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=23335, - serialized_end=23618, + serialized_start=23675, + serialized_end=23958, ) _GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV1_DOCUMENTS = _descriptor.Descriptor( @@ -6742,8 +6817,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=23578, - serialized_end=23608, + serialized_start=23918, + serialized_end=23948, ) _GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV1_COUNTENTRY = _descriptor.Descriptor( @@ -6792,8 +6867,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=23892, - serialized_end=23968, + serialized_start=24232, + serialized_end=24308, ) _GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV1_COUNTENTRIES = _descriptor.Descriptor( @@ -6823,8 +6898,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=23970, - serialized_end=24084, + serialized_start=24310, + serialized_end=24424, ) _GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV1_COUNTRESULTS = _descriptor.Descriptor( @@ -6866,8 +6941,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=24087, - serialized_end=24247, + serialized_start=24427, + serialized_end=24587, ) _GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV1_SUMENTRY = _descriptor.Descriptor( @@ -6916,8 +6991,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=24249, - serialized_end=24321, + serialized_start=24589, + serialized_end=24661, ) _GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV1_SUMENTRIES = _descriptor.Descriptor( @@ -6947,8 +7022,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=24323, - serialized_end=24433, + serialized_start=24663, + serialized_end=24773, ) _GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV1_SUMRESULTS = _descriptor.Descriptor( @@ -6990,8 +7065,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=24436, - serialized_end=24590, + serialized_start=24776, + serialized_end=24930, ) _GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV1_AVERAGEENTRY = _descriptor.Descriptor( @@ -7047,8 +7122,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=24592, - serialized_end=24687, + serialized_start=24932, + serialized_end=25027, ) _GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV1_AVERAGEENTRIES = _descriptor.Descriptor( @@ -7078,8 +7153,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=24689, - serialized_end=24807, + serialized_start=25029, + serialized_end=25147, ) _GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV1_AVERAGEAGGREGATE = _descriptor.Descriptor( @@ -7116,8 +7191,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=24809, - serialized_end=24863, + serialized_start=25149, + serialized_end=25203, ) _GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV1_AVERAGERESULTS = _descriptor.Descriptor( @@ -7159,8 +7234,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=24866, - serialized_end=25117, + serialized_start=25206, + serialized_end=25457, ) _GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV1_RANKEDENTRY = _descriptor.Descriptor( @@ -7228,8 +7303,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=25119, - serialized_end=25241, + serialized_start=25459, + serialized_end=25581, ) _GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV1_RANKEDENTRIES = _descriptor.Descriptor( @@ -7271,8 +7346,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=25244, - serialized_end=25398, + serialized_start=25584, + serialized_end=25738, ) _GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV1_RESULTDATA = _descriptor.Descriptor( @@ -7349,8 +7424,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=25401, - serialized_end=26160, + serialized_start=25741, + serialized_end=26500, ) _GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV1_CHAINEDDOCUMENTS = _descriptor.Descriptor( @@ -7387,8 +7462,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=26162, - serialized_end=26230, + serialized_start=26502, + serialized_end=26570, ) _GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV1_COMPOSITEDOCUMENTS_SUBQUERYRESULT = _descriptor.Descriptor( @@ -7430,8 +7505,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=26407, - serialized_end=26639, + serialized_start=26747, + serialized_end=26979, ) _GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV1_COMPOSITEDOCUMENTS = _descriptor.Descriptor( @@ -7468,8 +7543,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=26233, - serialized_end=26639, + serialized_start=26573, + serialized_end=26979, ) _GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV1 = _descriptor.Descriptor( @@ -7518,8 +7593,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=23621, - serialized_end=26649, + serialized_start=23961, + serialized_end=26989, ) _GETDOCUMENTSRESPONSE = _descriptor.Descriptor( @@ -7561,8 +7636,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=23138, - serialized_end=26660, + serialized_start=23478, + serialized_end=27000, ) @@ -7635,8 +7710,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=26789, - serialized_end=27024, + serialized_start=27129, + serialized_end=27364, ) _GETDOCUMENTHISTORYREQUEST = _descriptor.Descriptor( @@ -7671,8 +7746,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=26663, - serialized_end=27035, + serialized_start=27003, + serialized_end=27375, ) @@ -7710,8 +7785,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=27441, - serialized_end=27496, + serialized_start=27781, + serialized_end=27836, ) _GETDOCUMENTHISTORYRESPONSE_GETDOCUMENTHISTORYRESPONSEV0_DOCUMENTHISTORY = _descriptor.Descriptor( @@ -7741,8 +7816,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=27499, - serialized_end=27648, + serialized_start=27839, + serialized_end=27988, ) _GETDOCUMENTHISTORYRESPONSE_GETDOCUMENTHISTORYRESPONSEV0 = _descriptor.Descriptor( @@ -7791,8 +7866,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=27167, - serialized_end=27658, + serialized_start=27507, + serialized_end=27998, ) _GETDOCUMENTHISTORYRESPONSE = _descriptor.Descriptor( @@ -7827,8 +7902,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=27038, - serialized_end=27669, + serialized_start=27378, + serialized_end=28009, ) @@ -7866,8 +7941,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=27821, - serialized_end=27898, + serialized_start=28161, + serialized_end=28238, ) _GETIDENTITYBYPUBLICKEYHASHREQUEST = _descriptor.Descriptor( @@ -7902,8 +7977,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=27672, - serialized_end=27909, + serialized_start=28012, + serialized_end=28249, ) @@ -7953,8 +8028,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=28065, - serialized_end=28247, + serialized_start=28405, + serialized_end=28587, ) _GETIDENTITYBYPUBLICKEYHASHRESPONSE = _descriptor.Descriptor( @@ -7989,8 +8064,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=27912, - serialized_end=28258, + serialized_start=28252, + serialized_end=28598, ) @@ -8040,8 +8115,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=28439, - serialized_end=28567, + serialized_start=28779, + serialized_end=28907, ) _GETIDENTITYBYNONUNIQUEPUBLICKEYHASHREQUEST = _descriptor.Descriptor( @@ -8076,8 +8151,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=28261, - serialized_end=28578, + serialized_start=28601, + serialized_end=28918, ) @@ -8113,8 +8188,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=29191, - serialized_end=29245, + serialized_start=29531, + serialized_end=29585, ) _GETIDENTITYBYNONUNIQUEPUBLICKEYHASHRESPONSE_GETIDENTITYBYNONUNIQUEPUBLICKEYHASHRESPONSEV0_IDENTITYPROVEDRESPONSE = _descriptor.Descriptor( @@ -8156,8 +8231,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=29248, - serialized_end=29414, + serialized_start=29588, + serialized_end=29754, ) _GETIDENTITYBYNONUNIQUEPUBLICKEYHASHRESPONSE_GETIDENTITYBYNONUNIQUEPUBLICKEYHASHRESPONSEV0 = _descriptor.Descriptor( @@ -8206,8 +8281,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=28762, - serialized_end=29424, + serialized_start=29102, + serialized_end=29764, ) _GETIDENTITYBYNONUNIQUEPUBLICKEYHASHRESPONSE = _descriptor.Descriptor( @@ -8242,8 +8317,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=28581, - serialized_end=29435, + serialized_start=28921, + serialized_end=29775, ) @@ -8281,8 +8356,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=29593, - serialized_end=29678, + serialized_start=29933, + serialized_end=30018, ) _WAITFORSTATETRANSITIONRESULTREQUEST = _descriptor.Descriptor( @@ -8317,8 +8392,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=29438, - serialized_end=29689, + serialized_start=29778, + serialized_end=30029, ) @@ -8368,8 +8443,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=29851, - serialized_end=30090, + serialized_start=30191, + serialized_end=30430, ) _WAITFORSTATETRANSITIONRESULTRESPONSE = _descriptor.Descriptor( @@ -8404,8 +8479,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=29692, - serialized_end=30101, + serialized_start=30032, + serialized_end=30441, ) @@ -8443,8 +8518,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=30229, - serialized_end=30289, + serialized_start=30569, + serialized_end=30629, ) _GETCONSENSUSPARAMSREQUEST = _descriptor.Descriptor( @@ -8479,8 +8554,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=30104, - serialized_end=30300, + serialized_start=30444, + serialized_end=30640, ) @@ -8525,8 +8600,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=30431, - serialized_end=30511, + serialized_start=30771, + serialized_end=30851, ) _GETCONSENSUSPARAMSRESPONSE_CONSENSUSPARAMSEVIDENCE = _descriptor.Descriptor( @@ -8570,8 +8645,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=30513, - serialized_end=30611, + serialized_start=30853, + serialized_end=30951, ) _GETCONSENSUSPARAMSRESPONSE_GETCONSENSUSPARAMSRESPONSEV0 = _descriptor.Descriptor( @@ -8608,8 +8683,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=30614, - serialized_end=30832, + serialized_start=30954, + serialized_end=31172, ) _GETCONSENSUSPARAMSRESPONSE = _descriptor.Descriptor( @@ -8644,8 +8719,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=30303, - serialized_end=30843, + serialized_start=30643, + serialized_end=31183, ) @@ -8676,8 +8751,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=31007, - serialized_end=31063, + serialized_start=31347, + serialized_end=31403, ) _GETPROTOCOLVERSIONUPGRADESTATEREQUEST = _descriptor.Descriptor( @@ -8712,8 +8787,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=30846, - serialized_end=31074, + serialized_start=31186, + serialized_end=31414, ) @@ -8744,8 +8819,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=31539, - serialized_end=31689, + serialized_start=31879, + serialized_end=32029, ) _GETPROTOCOLVERSIONUPGRADESTATERESPONSE_GETPROTOCOLVERSIONUPGRADESTATERESPONSEV0_VERSIONENTRY = _descriptor.Descriptor( @@ -8782,8 +8857,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=31691, - serialized_end=31749, + serialized_start=32031, + serialized_end=32089, ) _GETPROTOCOLVERSIONUPGRADESTATERESPONSE_GETPROTOCOLVERSIONUPGRADESTATERESPONSEV0 = _descriptor.Descriptor( @@ -8832,8 +8907,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=31242, - serialized_end=31759, + serialized_start=31582, + serialized_end=32099, ) _GETPROTOCOLVERSIONUPGRADESTATERESPONSE = _descriptor.Descriptor( @@ -8868,8 +8943,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=31077, - serialized_end=31770, + serialized_start=31417, + serialized_end=32110, ) @@ -8914,8 +8989,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=31950, - serialized_end=32053, + serialized_start=32290, + serialized_end=32393, ) _GETPROTOCOLVERSIONUPGRADEVOTESTATUSREQUEST = _descriptor.Descriptor( @@ -8950,8 +9025,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=31773, - serialized_end=32064, + serialized_start=32113, + serialized_end=32404, ) @@ -8982,8 +9057,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=32567, - serialized_end=32742, + serialized_start=32907, + serialized_end=33082, ) _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE_GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSEV0_VERSIONSIGNAL = _descriptor.Descriptor( @@ -9020,8 +9095,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=32744, - serialized_end=32797, + serialized_start=33084, + serialized_end=33137, ) _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE_GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSEV0 = _descriptor.Descriptor( @@ -9070,8 +9145,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=32248, - serialized_end=32807, + serialized_start=32588, + serialized_end=33147, ) _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE = _descriptor.Descriptor( @@ -9106,8 +9181,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=32067, - serialized_end=32818, + serialized_start=32407, + serialized_end=33158, ) @@ -9159,8 +9234,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=32931, - serialized_end=33055, + serialized_start=33271, + serialized_end=33395, ) _GETEPOCHSINFOREQUEST = _descriptor.Descriptor( @@ -9195,8 +9270,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=32821, - serialized_end=33066, + serialized_start=33161, + serialized_end=33406, ) @@ -9227,8 +9302,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=33427, - serialized_end=33544, + serialized_start=33767, + serialized_end=33884, ) _GETEPOCHSINFORESPONSE_GETEPOCHSINFORESPONSEV0_EPOCHINFO = _descriptor.Descriptor( @@ -9293,8 +9368,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=33547, - serialized_end=33713, + serialized_start=33887, + serialized_end=34053, ) _GETEPOCHSINFORESPONSE_GETEPOCHSINFORESPONSEV0 = _descriptor.Descriptor( @@ -9343,8 +9418,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=33183, - serialized_end=33723, + serialized_start=33523, + serialized_end=34063, ) _GETEPOCHSINFORESPONSE = _descriptor.Descriptor( @@ -9379,8 +9454,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=33069, - serialized_end=33734, + serialized_start=33409, + serialized_end=34074, ) @@ -9439,8 +9514,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=33875, - serialized_end=34045, + serialized_start=34215, + serialized_end=34385, ) _GETFINALIZEDEPOCHINFOSREQUEST = _descriptor.Descriptor( @@ -9475,8 +9550,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=33737, - serialized_end=34056, + serialized_start=34077, + serialized_end=34396, ) @@ -9507,8 +9582,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=34482, - serialized_end=34646, + serialized_start=34822, + serialized_end=34986, ) _GETFINALIZEDEPOCHINFOSRESPONSE_GETFINALIZEDEPOCHINFOSRESPONSEV0_FINALIZEDEPOCHINFO = _descriptor.Descriptor( @@ -9622,8 +9697,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=34649, - serialized_end=35192, + serialized_start=34989, + serialized_end=35532, ) _GETFINALIZEDEPOCHINFOSRESPONSE_GETFINALIZEDEPOCHINFOSRESPONSEV0_BLOCKPROPOSER = _descriptor.Descriptor( @@ -9660,8 +9735,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=35194, - serialized_end=35251, + serialized_start=35534, + serialized_end=35591, ) _GETFINALIZEDEPOCHINFOSRESPONSE_GETFINALIZEDEPOCHINFOSRESPONSEV0 = _descriptor.Descriptor( @@ -9710,8 +9785,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=34200, - serialized_end=35261, + serialized_start=34540, + serialized_end=35601, ) _GETFINALIZEDEPOCHINFOSRESPONSE = _descriptor.Descriptor( @@ -9746,8 +9821,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=34059, - serialized_end=35272, + serialized_start=34399, + serialized_end=35612, ) @@ -9785,8 +9860,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=35767, - serialized_end=35836, + serialized_start=36107, + serialized_end=36176, ) _GETCONTESTEDRESOURCESREQUEST_GETCONTESTEDRESOURCESREQUESTV0 = _descriptor.Descriptor( @@ -9882,8 +9957,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=35410, - serialized_end=35870, + serialized_start=35750, + serialized_end=36210, ) _GETCONTESTEDRESOURCESREQUEST = _descriptor.Descriptor( @@ -9918,8 +9993,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=35275, - serialized_end=35881, + serialized_start=35615, + serialized_end=36221, ) @@ -9950,8 +10025,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=36323, - serialized_end=36383, + serialized_start=36663, + serialized_end=36723, ) _GETCONTESTEDRESOURCESRESPONSE_GETCONTESTEDRESOURCESRESPONSEV0 = _descriptor.Descriptor( @@ -10000,8 +10075,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=36022, - serialized_end=36393, + serialized_start=36362, + serialized_end=36733, ) _GETCONTESTEDRESOURCESRESPONSE = _descriptor.Descriptor( @@ -10036,8 +10111,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=35884, - serialized_end=36404, + serialized_start=36224, + serialized_end=36744, ) @@ -10075,8 +10150,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=36917, - serialized_end=36990, + serialized_start=37257, + serialized_end=37330, ) _GETVOTEPOLLSBYENDDATEREQUEST_GETVOTEPOLLSBYENDDATEREQUESTV0_ENDATTIMEINFO = _descriptor.Descriptor( @@ -10113,8 +10188,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=36992, - serialized_end=37059, + serialized_start=37332, + serialized_end=37399, ) _GETVOTEPOLLSBYENDDATEREQUEST_GETVOTEPOLLSBYENDDATEREQUESTV0 = _descriptor.Descriptor( @@ -10199,8 +10274,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=36542, - serialized_end=37118, + serialized_start=36882, + serialized_end=37458, ) _GETVOTEPOLLSBYENDDATEREQUEST = _descriptor.Descriptor( @@ -10235,8 +10310,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=36407, - serialized_end=37129, + serialized_start=36747, + serialized_end=37469, ) @@ -10274,8 +10349,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=37578, - serialized_end=37664, + serialized_start=37918, + serialized_end=38004, ) _GETVOTEPOLLSBYENDDATERESPONSE_GETVOTEPOLLSBYENDDATERESPONSEV0_SERIALIZEDVOTEPOLLSBYTIMESTAMPS = _descriptor.Descriptor( @@ -10312,8 +10387,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=37667, - serialized_end=37882, + serialized_start=38007, + serialized_end=38222, ) _GETVOTEPOLLSBYENDDATERESPONSE_GETVOTEPOLLSBYENDDATERESPONSEV0 = _descriptor.Descriptor( @@ -10362,8 +10437,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=37270, - serialized_end=37892, + serialized_start=37610, + serialized_end=38232, ) _GETVOTEPOLLSBYENDDATERESPONSE = _descriptor.Descriptor( @@ -10398,8 +10473,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=37132, - serialized_end=37903, + serialized_start=37472, + serialized_end=38243, ) @@ -10437,8 +10512,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=38592, - serialized_end=38676, + serialized_start=38932, + serialized_end=39016, ) _GETCONTESTEDRESOURCEVOTESTATEREQUEST_GETCONTESTEDRESOURCEVOTESTATEREQUESTV0 = _descriptor.Descriptor( @@ -10535,8 +10610,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=38065, - serialized_end=38790, + serialized_start=38405, + serialized_end=39130, ) _GETCONTESTEDRESOURCEVOTESTATEREQUEST = _descriptor.Descriptor( @@ -10571,8 +10646,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=37906, - serialized_end=38801, + serialized_start=38246, + serialized_end=39141, ) @@ -10644,8 +10719,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=39301, - serialized_end=39775, + serialized_start=39641, + serialized_end=40115, ) _GETCONTESTEDRESOURCEVOTESTATERESPONSE_GETCONTESTEDRESOURCEVOTESTATERESPONSEV0_CONTESTEDRESOURCECONTENDERS = _descriptor.Descriptor( @@ -10711,8 +10786,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=39778, - serialized_end=40230, + serialized_start=40118, + serialized_end=40570, ) _GETCONTESTEDRESOURCEVOTESTATERESPONSE_GETCONTESTEDRESOURCEVOTESTATERESPONSEV0_CONTENDER = _descriptor.Descriptor( @@ -10766,8 +10841,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=40232, - serialized_end=40339, + serialized_start=40572, + serialized_end=40679, ) _GETCONTESTEDRESOURCEVOTESTATERESPONSE_GETCONTESTEDRESOURCEVOTESTATERESPONSEV0 = _descriptor.Descriptor( @@ -10816,8 +10891,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=38966, - serialized_end=40349, + serialized_start=39306, + serialized_end=40689, ) _GETCONTESTEDRESOURCEVOTESTATERESPONSE = _descriptor.Descriptor( @@ -10852,8 +10927,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=38804, - serialized_end=40360, + serialized_start=39144, + serialized_end=40700, ) @@ -10891,8 +10966,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=38592, - serialized_end=38676, + serialized_start=38932, + serialized_end=39016, ) _GETCONTESTEDRESOURCEVOTERSFORIDENTITYREQUEST_GETCONTESTEDRESOURCEVOTERSFORIDENTITYREQUESTV0 = _descriptor.Descriptor( @@ -10988,8 +11063,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=40547, - serialized_end=41077, + serialized_start=40887, + serialized_end=41417, ) _GETCONTESTEDRESOURCEVOTERSFORIDENTITYREQUEST = _descriptor.Descriptor( @@ -11024,8 +11099,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=40363, - serialized_end=41088, + serialized_start=40703, + serialized_end=41428, ) @@ -11063,8 +11138,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=41628, - serialized_end=41695, + serialized_start=41968, + serialized_end=42035, ) _GETCONTESTEDRESOURCEVOTERSFORIDENTITYRESPONSE_GETCONTESTEDRESOURCEVOTERSFORIDENTITYRESPONSEV0 = _descriptor.Descriptor( @@ -11113,8 +11188,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=41278, - serialized_end=41705, + serialized_start=41618, + serialized_end=42045, ) _GETCONTESTEDRESOURCEVOTERSFORIDENTITYRESPONSE = _descriptor.Descriptor( @@ -11149,8 +11224,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=41091, - serialized_end=41716, + serialized_start=41431, + serialized_end=42056, ) @@ -11188,8 +11263,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=42265, - serialized_end=42362, + serialized_start=42605, + serialized_end=42702, ) _GETCONTESTEDRESOURCEIDENTITYVOTESREQUEST_GETCONTESTEDRESOURCEIDENTITYVOTESREQUESTV0 = _descriptor.Descriptor( @@ -11259,8 +11334,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=41890, - serialized_end=42393, + serialized_start=42230, + serialized_end=42733, ) _GETCONTESTEDRESOURCEIDENTITYVOTESREQUEST = _descriptor.Descriptor( @@ -11295,8 +11370,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=41719, - serialized_end=42404, + serialized_start=42059, + serialized_end=42744, ) @@ -11334,8 +11409,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=42907, - serialized_end=43154, + serialized_start=43247, + serialized_end=43494, ) _GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSE_GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSEV0_RESOURCEVOTECHOICE = _descriptor.Descriptor( @@ -11378,8 +11453,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=43157, - serialized_end=43458, + serialized_start=43497, + serialized_end=43798, ) _GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSE_GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSEV0_CONTESTEDRESOURCEIDENTITYVOTE = _descriptor.Descriptor( @@ -11430,8 +11505,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=43461, - serialized_end=43738, + serialized_start=43801, + serialized_end=44078, ) _GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSE_GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSEV0 = _descriptor.Descriptor( @@ -11480,8 +11555,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=42581, - serialized_end=43748, + serialized_start=42921, + serialized_end=44088, ) _GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSE = _descriptor.Descriptor( @@ -11516,8 +11591,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=42407, - serialized_end=43759, + serialized_start=42747, + serialized_end=44099, ) @@ -11555,8 +11630,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=43923, - serialized_end=43991, + serialized_start=44263, + serialized_end=44331, ) _GETPREFUNDEDSPECIALIZEDBALANCEREQUEST = _descriptor.Descriptor( @@ -11591,8 +11666,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=43762, - serialized_end=44002, + serialized_start=44102, + serialized_end=44342, ) @@ -11642,8 +11717,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=44170, - serialized_end=44359, + serialized_start=44510, + serialized_end=44699, ) _GETPREFUNDEDSPECIALIZEDBALANCERESPONSE = _descriptor.Descriptor( @@ -11678,8 +11753,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=44005, - serialized_end=44370, + serialized_start=44345, + serialized_end=44710, ) @@ -11710,8 +11785,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=44519, - serialized_end=44570, + serialized_start=44859, + serialized_end=44910, ) _GETTOTALCREDITSINPLATFORMREQUEST = _descriptor.Descriptor( @@ -11746,8 +11821,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=44373, - serialized_end=44581, + serialized_start=44713, + serialized_end=44921, ) @@ -11797,8 +11872,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=44734, - serialized_end=44918, + serialized_start=45074, + serialized_end=45258, ) _GETTOTALCREDITSINPLATFORMRESPONSE = _descriptor.Descriptor( @@ -11833,8 +11908,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=44584, - serialized_end=44929, + serialized_start=44924, + serialized_end=45269, ) @@ -11879,8 +11954,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=45048, - serialized_end=45117, + serialized_start=45388, + serialized_end=45457, ) _GETPATHELEMENTSREQUEST = _descriptor.Descriptor( @@ -11915,8 +11990,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=44932, - serialized_end=45128, + serialized_start=45272, + serialized_end=45468, ) @@ -11947,8 +12022,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=45501, - serialized_end=45529, + serialized_start=45841, + serialized_end=45869, ) _GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0 = _descriptor.Descriptor( @@ -11997,8 +12072,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=45251, - serialized_end=45539, + serialized_start=45591, + serialized_end=45879, ) _GETPATHELEMENTSRESPONSE = _descriptor.Descriptor( @@ -12033,8 +12108,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=45131, - serialized_end=45550, + serialized_start=45471, + serialized_end=45890, ) @@ -12058,8 +12133,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=45651, - serialized_end=45671, + serialized_start=45991, + serialized_end=46011, ) _GETSTATUSREQUEST = _descriptor.Descriptor( @@ -12094,8 +12169,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=45553, - serialized_end=45682, + serialized_start=45893, + serialized_end=46022, ) @@ -12150,8 +12225,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=46559, - serialized_end=46653, + serialized_start=46899, + serialized_end=46993, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_VERSION_PROTOCOL_TENDERDASH = _descriptor.Descriptor( @@ -12188,8 +12263,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=46886, - serialized_end=46926, + serialized_start=47226, + serialized_end=47266, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_VERSION_PROTOCOL_DRIVE = _descriptor.Descriptor( @@ -12233,8 +12308,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=46928, - serialized_end=46988, + serialized_start=47268, + serialized_end=47328, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_VERSION_PROTOCOL = _descriptor.Descriptor( @@ -12271,8 +12346,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=46656, - serialized_end=46988, + serialized_start=46996, + serialized_end=47328, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_VERSION = _descriptor.Descriptor( @@ -12309,8 +12384,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=46346, - serialized_end=46988, + serialized_start=46686, + serialized_end=47328, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_TIME = _descriptor.Descriptor( @@ -12376,8 +12451,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=46990, - serialized_end=47117, + serialized_start=47330, + serialized_end=47457, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_NODE = _descriptor.Descriptor( @@ -12419,8 +12494,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=47119, - serialized_end=47179, + serialized_start=47459, + serialized_end=47519, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_CHAIN = _descriptor.Descriptor( @@ -12511,8 +12586,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=47182, - serialized_end=47489, + serialized_start=47522, + serialized_end=47829, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_NETWORK = _descriptor.Descriptor( @@ -12556,8 +12631,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=47491, - serialized_end=47558, + serialized_start=47831, + serialized_end=47898, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_STATESYNC = _descriptor.Descriptor( @@ -12636,8 +12711,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=47561, - serialized_end=47822, + serialized_start=47901, + serialized_end=48162, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0 = _descriptor.Descriptor( @@ -12702,8 +12777,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=45787, - serialized_end=47822, + serialized_start=46127, + serialized_end=48162, ) _GETSTATUSRESPONSE = _descriptor.Descriptor( @@ -12738,8 +12813,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=45685, - serialized_end=47833, + serialized_start=46025, + serialized_end=48173, ) @@ -12763,8 +12838,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=47970, - serialized_end=48002, + serialized_start=48310, + serialized_end=48342, ) _GETCURRENTQUORUMSINFOREQUEST = _descriptor.Descriptor( @@ -12799,8 +12874,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=47836, - serialized_end=48013, + serialized_start=48176, + serialized_end=48353, ) @@ -12845,8 +12920,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=48153, - serialized_end=48223, + serialized_start=48493, + serialized_end=48563, ) _GETCURRENTQUORUMSINFORESPONSE_VALIDATORSETV0 = _descriptor.Descriptor( @@ -12897,8 +12972,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=48226, - serialized_end=48401, + serialized_start=48566, + serialized_end=48741, ) _GETCURRENTQUORUMSINFORESPONSE_GETCURRENTQUORUMSINFORESPONSEV0 = _descriptor.Descriptor( @@ -12956,8 +13031,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=48404, - serialized_end=48678, + serialized_start=48744, + serialized_end=49018, ) _GETCURRENTQUORUMSINFORESPONSE = _descriptor.Descriptor( @@ -12992,8 +13067,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=48016, - serialized_end=48689, + serialized_start=48356, + serialized_end=49029, ) @@ -13038,8 +13113,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=48835, - serialized_end=48925, + serialized_start=49175, + serialized_end=49265, ) _GETIDENTITYTOKENBALANCESREQUEST = _descriptor.Descriptor( @@ -13074,8 +13149,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=48692, - serialized_end=48936, + serialized_start=49032, + serialized_end=49276, ) @@ -13118,8 +13193,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=49375, - serialized_end=49446, + serialized_start=49715, + serialized_end=49786, ) _GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0_TOKENBALANCES = _descriptor.Descriptor( @@ -13149,8 +13224,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=49449, - serialized_end=49603, + serialized_start=49789, + serialized_end=49943, ) _GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0 = _descriptor.Descriptor( @@ -13199,8 +13274,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=49086, - serialized_end=49613, + serialized_start=49426, + serialized_end=49953, ) _GETIDENTITYTOKENBALANCESRESPONSE = _descriptor.Descriptor( @@ -13235,8 +13310,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=48939, - serialized_end=49624, + serialized_start=49279, + serialized_end=49964, ) @@ -13281,8 +13356,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=49776, - serialized_end=49868, + serialized_start=50116, + serialized_end=50208, ) _GETIDENTITIESTOKENBALANCESREQUEST = _descriptor.Descriptor( @@ -13317,8 +13392,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=49627, - serialized_end=49879, + serialized_start=49967, + serialized_end=50219, ) @@ -13361,8 +13436,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=50347, - serialized_end=50429, + serialized_start=50687, + serialized_end=50769, ) _GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0_IDENTITYTOKENBALANCES = _descriptor.Descriptor( @@ -13392,8 +13467,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=50432, - serialized_end=50615, + serialized_start=50772, + serialized_end=50955, ) _GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0 = _descriptor.Descriptor( @@ -13442,8 +13517,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=50035, - serialized_end=50625, + serialized_start=50375, + serialized_end=50965, ) _GETIDENTITIESTOKENBALANCESRESPONSE = _descriptor.Descriptor( @@ -13478,8 +13553,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=49882, - serialized_end=50636, + serialized_start=50222, + serialized_end=50976, ) @@ -13524,8 +13599,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=50773, - serialized_end=50860, + serialized_start=51113, + serialized_end=51200, ) _GETIDENTITYTOKENINFOSREQUEST = _descriptor.Descriptor( @@ -13560,8 +13635,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=50639, - serialized_end=50871, + serialized_start=50979, + serialized_end=51211, ) @@ -13592,8 +13667,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=51285, - serialized_end=51325, + serialized_start=51625, + serialized_end=51665, ) _GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0_TOKENINFOENTRY = _descriptor.Descriptor( @@ -13635,8 +13710,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=51328, - serialized_end=51504, + serialized_start=51668, + serialized_end=51844, ) _GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0_TOKENINFOS = _descriptor.Descriptor( @@ -13666,8 +13741,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=51507, - serialized_end=51645, + serialized_start=51847, + serialized_end=51985, ) _GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0 = _descriptor.Descriptor( @@ -13716,8 +13791,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=51012, - serialized_end=51655, + serialized_start=51352, + serialized_end=51995, ) _GETIDENTITYTOKENINFOSRESPONSE = _descriptor.Descriptor( @@ -13752,8 +13827,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=50874, - serialized_end=51666, + serialized_start=51214, + serialized_end=52006, ) @@ -13798,8 +13873,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=51809, - serialized_end=51898, + serialized_start=52149, + serialized_end=52238, ) _GETIDENTITIESTOKENINFOSREQUEST = _descriptor.Descriptor( @@ -13834,8 +13909,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=51669, - serialized_end=51909, + serialized_start=52009, + serialized_end=52249, ) @@ -13866,8 +13941,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=51285, - serialized_end=51325, + serialized_start=51625, + serialized_end=51665, ) _GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0_TOKENINFOENTRY = _descriptor.Descriptor( @@ -13909,8 +13984,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=52396, - serialized_end=52579, + serialized_start=52736, + serialized_end=52919, ) _GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0_IDENTITYTOKENINFOS = _descriptor.Descriptor( @@ -13940,8 +14015,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=52582, - serialized_end=52733, + serialized_start=52922, + serialized_end=53073, ) _GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0 = _descriptor.Descriptor( @@ -13990,8 +14065,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=52056, - serialized_end=52743, + serialized_start=52396, + serialized_end=53083, ) _GETIDENTITIESTOKENINFOSRESPONSE = _descriptor.Descriptor( @@ -14026,8 +14101,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=51912, - serialized_end=52754, + serialized_start=52252, + serialized_end=53094, ) @@ -14065,8 +14140,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=52876, - serialized_end=52937, + serialized_start=53216, + serialized_end=53277, ) _GETTOKENSTATUSESREQUEST = _descriptor.Descriptor( @@ -14101,8 +14176,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=52757, - serialized_end=52948, + serialized_start=53097, + serialized_end=53288, ) @@ -14145,8 +14220,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=53338, - serialized_end=53406, + serialized_start=53678, + serialized_end=53746, ) _GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0_TOKENSTATUSES = _descriptor.Descriptor( @@ -14176,8 +14251,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=53409, - serialized_end=53545, + serialized_start=53749, + serialized_end=53885, ) _GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0 = _descriptor.Descriptor( @@ -14226,8 +14301,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=53074, - serialized_end=53555, + serialized_start=53414, + serialized_end=53895, ) _GETTOKENSTATUSESRESPONSE = _descriptor.Descriptor( @@ -14262,8 +14337,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=52951, - serialized_end=53566, + serialized_start=53291, + serialized_end=53906, ) @@ -14301,8 +14376,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=53724, - serialized_end=53797, + serialized_start=54064, + serialized_end=54137, ) _GETTOKENDIRECTPURCHASEPRICESREQUEST = _descriptor.Descriptor( @@ -14337,8 +14412,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=53569, - serialized_end=53808, + serialized_start=53909, + serialized_end=54148, ) @@ -14376,8 +14451,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=54298, - serialized_end=54349, + serialized_start=54638, + serialized_end=54689, ) _GETTOKENDIRECTPURCHASEPRICESRESPONSE_GETTOKENDIRECTPURCHASEPRICESRESPONSEV0_PRICINGSCHEDULE = _descriptor.Descriptor( @@ -14407,8 +14482,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=54352, - serialized_end=54519, + serialized_start=54692, + serialized_end=54859, ) _GETTOKENDIRECTPURCHASEPRICESRESPONSE_GETTOKENDIRECTPURCHASEPRICESRESPONSEV0_TOKENDIRECTPURCHASEPRICEENTRY = _descriptor.Descriptor( @@ -14457,8 +14532,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=54522, - serialized_end=54750, + serialized_start=54862, + serialized_end=55090, ) _GETTOKENDIRECTPURCHASEPRICESRESPONSE_GETTOKENDIRECTPURCHASEPRICESRESPONSEV0_TOKENDIRECTPURCHASEPRICES = _descriptor.Descriptor( @@ -14488,8 +14563,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=54753, - serialized_end=54953, + serialized_start=55093, + serialized_end=55293, ) _GETTOKENDIRECTPURCHASEPRICESRESPONSE_GETTOKENDIRECTPURCHASEPRICESRESPONSEV0 = _descriptor.Descriptor( @@ -14538,8 +14613,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=53970, - serialized_end=54963, + serialized_start=54310, + serialized_end=55303, ) _GETTOKENDIRECTPURCHASEPRICESRESPONSE = _descriptor.Descriptor( @@ -14574,8 +14649,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=53811, - serialized_end=54974, + serialized_start=54151, + serialized_end=55314, ) @@ -14613,8 +14688,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=55108, - serialized_end=55172, + serialized_start=55448, + serialized_end=55512, ) _GETTOKENCONTRACTINFOREQUEST = _descriptor.Descriptor( @@ -14649,8 +14724,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=54977, - serialized_end=55183, + serialized_start=55317, + serialized_end=55523, ) @@ -14688,8 +14763,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=55595, - serialized_end=55672, + serialized_start=55935, + serialized_end=56012, ) _GETTOKENCONTRACTINFORESPONSE_GETTOKENCONTRACTINFORESPONSEV0 = _descriptor.Descriptor( @@ -14738,8 +14813,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=55321, - serialized_end=55682, + serialized_start=55661, + serialized_end=56022, ) _GETTOKENCONTRACTINFORESPONSE = _descriptor.Descriptor( @@ -14774,8 +14849,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=55186, - serialized_end=55693, + serialized_start=55526, + serialized_end=56033, ) @@ -14830,8 +14905,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=56126, - serialized_end=56280, + serialized_start=56466, + serialized_end=56620, ) _GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0 = _descriptor.Descriptor( @@ -14892,8 +14967,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=55870, - serialized_end=56308, + serialized_start=56210, + serialized_end=56648, ) _GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST = _descriptor.Descriptor( @@ -14928,8 +15003,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=55696, - serialized_end=56319, + serialized_start=56036, + serialized_end=56659, ) @@ -14967,8 +15042,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=56830, - serialized_end=56892, + serialized_start=57170, + serialized_end=57232, ) _GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0_TOKENTIMEDDISTRIBUTIONENTRY = _descriptor.Descriptor( @@ -15005,8 +15080,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=56895, - serialized_end=57107, + serialized_start=57235, + serialized_end=57447, ) _GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0_TOKENDISTRIBUTIONS = _descriptor.Descriptor( @@ -15036,8 +15111,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=57110, - serialized_end=57305, + serialized_start=57450, + serialized_end=57645, ) _GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0 = _descriptor.Descriptor( @@ -15086,8 +15161,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=56500, - serialized_end=57315, + serialized_start=56840, + serialized_end=57655, ) _GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE = _descriptor.Descriptor( @@ -15122,8 +15197,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=56322, - serialized_end=57326, + serialized_start=56662, + serialized_end=57666, ) @@ -15161,8 +15236,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=57515, - serialized_end=57588, + serialized_start=57855, + serialized_end=57928, ) _GETTOKENPERPETUALDISTRIBUTIONLASTCLAIMREQUEST_GETTOKENPERPETUALDISTRIBUTIONLASTCLAIMREQUESTV0 = _descriptor.Descriptor( @@ -15218,8 +15293,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=57591, - serialized_end=57832, + serialized_start=57931, + serialized_end=58172, ) _GETTOKENPERPETUALDISTRIBUTIONLASTCLAIMREQUEST = _descriptor.Descriptor( @@ -15254,8 +15329,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=57329, - serialized_end=57843, + serialized_start=57669, + serialized_end=58183, ) @@ -15312,8 +15387,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=58364, - serialized_end=58484, + serialized_start=58704, + serialized_end=58824, ) _GETTOKENPERPETUALDISTRIBUTIONLASTCLAIMRESPONSE_GETTOKENPERPETUALDISTRIBUTIONLASTCLAIMRESPONSEV0 = _descriptor.Descriptor( @@ -15362,8 +15437,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=58036, - serialized_end=58494, + serialized_start=58376, + serialized_end=58834, ) _GETTOKENPERPETUALDISTRIBUTIONLASTCLAIMRESPONSE = _descriptor.Descriptor( @@ -15398,8 +15473,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=57846, - serialized_end=58505, + serialized_start=58186, + serialized_end=58845, ) @@ -15437,8 +15512,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=58636, - serialized_end=58699, + serialized_start=58976, + serialized_end=59039, ) _GETTOKENTOTALSUPPLYREQUEST = _descriptor.Descriptor( @@ -15473,8 +15548,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=58508, - serialized_end=58710, + serialized_start=58848, + serialized_end=59050, ) @@ -15519,8 +15594,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=59131, - serialized_end=59251, + serialized_start=59471, + serialized_end=59591, ) _GETTOKENTOTALSUPPLYRESPONSE_GETTOKENTOTALSUPPLYRESPONSEV0 = _descriptor.Descriptor( @@ -15569,8 +15644,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=58845, - serialized_end=59261, + serialized_start=59185, + serialized_end=59601, ) _GETTOKENTOTALSUPPLYRESPONSE = _descriptor.Descriptor( @@ -15605,8 +15680,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=58713, - serialized_end=59272, + serialized_start=59053, + serialized_end=59612, ) @@ -15651,8 +15726,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=59382, - serialized_end=59474, + serialized_start=59722, + serialized_end=59814, ) _GETGROUPINFOREQUEST = _descriptor.Descriptor( @@ -15687,8 +15762,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=59275, - serialized_end=59485, + serialized_start=59615, + serialized_end=59825, ) @@ -15726,8 +15801,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=59843, - serialized_end=59895, + serialized_start=60183, + serialized_end=60235, ) _GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0_GROUPINFOENTRY = _descriptor.Descriptor( @@ -15764,8 +15839,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=59898, - serialized_end=60050, + serialized_start=60238, + serialized_end=60390, ) _GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0_GROUPINFO = _descriptor.Descriptor( @@ -15800,8 +15875,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=60053, - serialized_end=60191, + serialized_start=60393, + serialized_end=60531, ) _GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0 = _descriptor.Descriptor( @@ -15850,8 +15925,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=59599, - serialized_end=60201, + serialized_start=59939, + serialized_end=60541, ) _GETGROUPINFORESPONSE = _descriptor.Descriptor( @@ -15886,8 +15961,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=59488, - serialized_end=60212, + serialized_start=59828, + serialized_end=60552, ) @@ -15925,8 +16000,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=60325, - serialized_end=60442, + serialized_start=60665, + serialized_end=60782, ) _GETGROUPINFOSREQUEST_GETGROUPINFOSREQUESTV0 = _descriptor.Descriptor( @@ -15987,8 +16062,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=60445, - serialized_end=60697, + serialized_start=60785, + serialized_end=61037, ) _GETGROUPINFOSREQUEST = _descriptor.Descriptor( @@ -16023,8 +16098,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=60215, - serialized_end=60708, + serialized_start=60555, + serialized_end=61048, ) @@ -16062,8 +16137,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=59843, - serialized_end=59895, + serialized_start=60183, + serialized_end=60235, ) _GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0_GROUPPOSITIONINFOENTRY = _descriptor.Descriptor( @@ -16107,8 +16182,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=61129, - serialized_end=61324, + serialized_start=61469, + serialized_end=61664, ) _GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0_GROUPINFOS = _descriptor.Descriptor( @@ -16138,8 +16213,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=61327, - serialized_end=61457, + serialized_start=61667, + serialized_end=61797, ) _GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0 = _descriptor.Descriptor( @@ -16188,8 +16263,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=60825, - serialized_end=61467, + serialized_start=61165, + serialized_end=61807, ) _GETGROUPINFOSRESPONSE = _descriptor.Descriptor( @@ -16224,8 +16299,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=60711, - serialized_end=61478, + serialized_start=61051, + serialized_end=61818, ) @@ -16263,8 +16338,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=61597, - serialized_end=61673, + serialized_start=61937, + serialized_end=62013, ) _GETGROUPACTIONSREQUEST_GETGROUPACTIONSREQUESTV0 = _descriptor.Descriptor( @@ -16339,8 +16414,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=61676, - serialized_end=62004, + serialized_start=62016, + serialized_end=62344, ) _GETGROUPACTIONSREQUEST = _descriptor.Descriptor( @@ -16376,8 +16451,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=61481, - serialized_end=62055, + serialized_start=61821, + serialized_end=62395, ) @@ -16427,8 +16502,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=62437, - serialized_end=62528, + serialized_start=62777, + serialized_end=62868, ) _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_BURNEVENT = _descriptor.Descriptor( @@ -16477,8 +16552,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=62530, - serialized_end=62621, + serialized_start=62870, + serialized_end=62961, ) _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_FREEZEEVENT = _descriptor.Descriptor( @@ -16520,8 +16595,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=62623, - serialized_end=62697, + serialized_start=62963, + serialized_end=63037, ) _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_UNFREEZEEVENT = _descriptor.Descriptor( @@ -16563,8 +16638,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=62699, - serialized_end=62775, + serialized_start=63039, + serialized_end=63115, ) _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_DESTROYFROZENFUNDSEVENT = _descriptor.Descriptor( @@ -16613,8 +16688,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=62777, - serialized_end=62879, + serialized_start=63117, + serialized_end=63219, ) _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_SHAREDENCRYPTEDNOTE = _descriptor.Descriptor( @@ -16658,8 +16733,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=62881, - serialized_end=62981, + serialized_start=63221, + serialized_end=63321, ) _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_PERSONALENCRYPTEDNOTE = _descriptor.Descriptor( @@ -16703,8 +16778,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=62983, - serialized_end=63106, + serialized_start=63323, + serialized_end=63446, ) _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_EMERGENCYACTIONEVENT = _descriptor.Descriptor( @@ -16747,8 +16822,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=63109, - serialized_end=63342, + serialized_start=63449, + serialized_end=63682, ) _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENCONFIGUPDATEEVENT = _descriptor.Descriptor( @@ -16790,8 +16865,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=63344, - serialized_end=63444, + serialized_start=63684, + serialized_end=63784, ) _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_UPDATEDIRECTPURCHASEPRICEEVENT_PRICEFORQUANTITY = _descriptor.Descriptor( @@ -16828,8 +16903,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=54298, - serialized_end=54349, + serialized_start=54638, + serialized_end=54689, ) _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_UPDATEDIRECTPURCHASEPRICEEVENT_PRICINGSCHEDULE = _descriptor.Descriptor( @@ -16859,8 +16934,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=63736, - serialized_end=63908, + serialized_start=64076, + serialized_end=64248, ) _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_UPDATEDIRECTPURCHASEPRICEEVENT = _descriptor.Descriptor( @@ -16914,8 +16989,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=63447, - serialized_end=63933, + serialized_start=63787, + serialized_end=64273, ) _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONEVENT = _descriptor.Descriptor( @@ -16964,8 +17039,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=63936, - serialized_end=64316, + serialized_start=64276, + serialized_end=64656, ) _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_DOCUMENTEVENT = _descriptor.Descriptor( @@ -17000,8 +17075,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=64319, - serialized_end=64458, + serialized_start=64659, + serialized_end=64798, ) _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_DOCUMENTCREATEEVENT = _descriptor.Descriptor( @@ -17031,8 +17106,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=64460, - serialized_end=64507, + serialized_start=64800, + serialized_end=64847, ) _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_CONTRACTUPDATEEVENT = _descriptor.Descriptor( @@ -17062,8 +17137,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=64509, - serialized_end=64556, + serialized_start=64849, + serialized_end=64896, ) _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_CONTRACTEVENT = _descriptor.Descriptor( @@ -17098,8 +17173,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=64559, - serialized_end=64698, + serialized_start=64899, + serialized_end=65038, ) _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT = _descriptor.Descriptor( @@ -17183,8 +17258,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=64701, - serialized_end=65678, + serialized_start=65041, + serialized_end=66018, ) _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONENTRY = _descriptor.Descriptor( @@ -17221,8 +17296,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=65681, - serialized_end=65828, + serialized_start=66021, + serialized_end=66168, ) _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONS = _descriptor.Descriptor( @@ -17252,8 +17327,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=65831, - serialized_end=65963, + serialized_start=66171, + serialized_end=66303, ) _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0 = _descriptor.Descriptor( @@ -17302,8 +17377,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=62178, - serialized_end=65973, + serialized_start=62518, + serialized_end=66313, ) _GETGROUPACTIONSRESPONSE = _descriptor.Descriptor( @@ -17338,8 +17413,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=62058, - serialized_end=65984, + serialized_start=62398, + serialized_end=66324, ) @@ -17398,8 +17473,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=66122, - serialized_end=66328, + serialized_start=66462, + serialized_end=66668, ) _GETGROUPACTIONSIGNERSREQUEST = _descriptor.Descriptor( @@ -17435,8 +17510,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=65987, - serialized_end=66379, + serialized_start=66327, + serialized_end=66719, ) @@ -17474,8 +17549,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=66811, - serialized_end=66864, + serialized_start=67151, + serialized_end=67204, ) _GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0_GROUPACTIONSIGNERS = _descriptor.Descriptor( @@ -17505,8 +17580,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=66867, - serialized_end=67012, + serialized_start=67207, + serialized_end=67352, ) _GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0 = _descriptor.Descriptor( @@ -17555,8 +17630,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=66520, - serialized_end=67022, + serialized_start=66860, + serialized_end=67362, ) _GETGROUPACTIONSIGNERSRESPONSE = _descriptor.Descriptor( @@ -17591,8 +17666,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=66382, - serialized_end=67033, + serialized_start=66722, + serialized_end=67373, ) @@ -17630,8 +17705,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=67149, - serialized_end=67206, + serialized_start=67489, + serialized_end=67546, ) _GETADDRESSINFOREQUEST = _descriptor.Descriptor( @@ -17666,8 +17741,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=67036, - serialized_end=67217, + serialized_start=67376, + serialized_end=67557, ) @@ -17710,8 +17785,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=67220, - serialized_end=67353, + serialized_start=67560, + serialized_end=67693, ) @@ -17749,8 +17824,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=67355, - serialized_end=67404, + serialized_start=67695, + serialized_end=67744, ) @@ -17781,8 +17856,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=67406, - serialized_end=67501, + serialized_start=67746, + serialized_end=67841, ) @@ -17832,8 +17907,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=67503, - serialized_end=67612, + serialized_start=67843, + serialized_end=67952, ) @@ -17871,8 +17946,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=67614, - serialized_end=67734, + serialized_start=67954, + serialized_end=68074, ) @@ -17903,8 +17978,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=67736, - serialized_end=67843, + serialized_start=68076, + serialized_end=68183, ) @@ -17954,8 +18029,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=67963, - serialized_end=68188, + serialized_start=68303, + serialized_end=68528, ) _GETADDRESSINFORESPONSE = _descriptor.Descriptor( @@ -17990,8 +18065,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=67846, - serialized_end=68199, + serialized_start=68186, + serialized_end=68539, ) @@ -18029,8 +18104,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=68324, - serialized_end=68386, + serialized_start=68664, + serialized_end=68726, ) _GETADDRESSESINFOSREQUEST = _descriptor.Descriptor( @@ -18065,8 +18140,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=68202, - serialized_end=68397, + serialized_start=68542, + serialized_end=68737, ) @@ -18116,8 +18191,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=68526, - serialized_end=68758, + serialized_start=68866, + serialized_end=69098, ) _GETADDRESSESINFOSRESPONSE = _descriptor.Descriptor( @@ -18152,8 +18227,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=68400, - serialized_end=68769, + serialized_start=68740, + serialized_end=69109, ) @@ -18177,8 +18252,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=68909, - serialized_end=68942, + serialized_start=69249, + serialized_end=69282, ) _GETADDRESSESTRUNKSTATEREQUEST = _descriptor.Descriptor( @@ -18213,8 +18288,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=68772, - serialized_end=68953, + serialized_start=69112, + serialized_end=69293, ) @@ -18252,8 +18327,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=69097, - serialized_end=69243, + serialized_start=69437, + serialized_end=69583, ) _GETADDRESSESTRUNKSTATERESPONSE = _descriptor.Descriptor( @@ -18288,8 +18363,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=68956, - serialized_end=69254, + serialized_start=69296, + serialized_end=69594, ) @@ -18334,8 +18409,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=69397, - serialized_end=69486, + serialized_start=69737, + serialized_end=69826, ) _GETADDRESSESBRANCHSTATEREQUEST = _descriptor.Descriptor( @@ -18370,8 +18445,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=69257, - serialized_end=69497, + serialized_start=69597, + serialized_end=69837, ) @@ -18402,8 +18477,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=69643, - serialized_end=69698, + serialized_start=69983, + serialized_end=70038, ) _GETADDRESSESBRANCHSTATERESPONSE = _descriptor.Descriptor( @@ -18438,8 +18513,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=69500, - serialized_end=69709, + serialized_start=69840, + serialized_end=70049, ) @@ -18484,8 +18559,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=69873, - serialized_end=69987, + serialized_start=70213, + serialized_end=70327, ) _GETRECENTADDRESSBALANCECHANGESREQUEST = _descriptor.Descriptor( @@ -18520,8 +18595,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=69712, - serialized_end=69998, + serialized_start=70052, + serialized_end=70338, ) @@ -18571,8 +18646,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=70166, - serialized_end=70430, + serialized_start=70506, + serialized_end=70770, ) _GETRECENTADDRESSBALANCECHANGESRESPONSE = _descriptor.Descriptor( @@ -18607,8 +18682,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=70001, - serialized_end=70441, + serialized_start=70341, + serialized_end=70781, ) @@ -18646,8 +18721,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=70443, - serialized_end=70514, + serialized_start=70783, + serialized_end=70854, ) @@ -18697,8 +18772,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=70517, - serialized_end=70693, + serialized_start=70857, + serialized_end=71033, ) @@ -18729,8 +18804,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=70695, - serialized_end=70787, + serialized_start=71035, + serialized_end=71127, ) @@ -18775,8 +18850,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=70790, - serialized_end=70964, + serialized_start=71130, + serialized_end=71304, ) @@ -18807,8 +18882,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=70967, - serialized_end=71102, + serialized_start=71307, + serialized_end=71442, ) @@ -18846,8 +18921,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=71294, - serialized_end=71391, + serialized_start=71634, + serialized_end=71731, ) _GETRECENTCOMPACTEDADDRESSBALANCECHANGESREQUEST = _descriptor.Descriptor( @@ -18882,8 +18957,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=71105, - serialized_end=71402, + serialized_start=71445, + serialized_end=71742, ) @@ -18933,8 +19008,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=71598, - serialized_end=71890, + serialized_start=71938, + serialized_end=72230, ) _GETRECENTCOMPACTEDADDRESSBALANCECHANGESRESPONSE = _descriptor.Descriptor( @@ -18969,8 +19044,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=71405, - serialized_end=71901, + serialized_start=71745, + serialized_end=72241, ) @@ -19015,8 +19090,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=72050, - serialized_end=72137, + serialized_start=72390, + serialized_end=72477, ) _GETSHIELDEDENCRYPTEDNOTESREQUEST = _descriptor.Descriptor( @@ -19051,8 +19126,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=71904, - serialized_end=72148, + serialized_start=72244, + serialized_end=72488, ) @@ -19104,8 +19179,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=72595, - serialized_end=72682, + serialized_start=72935, + serialized_end=73022, ) _GETSHIELDEDENCRYPTEDNOTESRESPONSE_GETSHIELDEDENCRYPTEDNOTESRESPONSEV0_ENCRYPTEDNOTES = _descriptor.Descriptor( @@ -19135,8 +19210,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=72685, - serialized_end=72830, + serialized_start=73025, + serialized_end=73170, ) _GETSHIELDEDENCRYPTEDNOTESRESPONSE_GETSHIELDEDENCRYPTEDNOTESRESPONSEV0 = _descriptor.Descriptor( @@ -19185,8 +19260,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=72301, - serialized_end=72840, + serialized_start=72641, + serialized_end=73180, ) _GETSHIELDEDENCRYPTEDNOTESRESPONSE = _descriptor.Descriptor( @@ -19221,8 +19296,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=72151, - serialized_end=72851, + serialized_start=72491, + serialized_end=73191, ) @@ -19253,8 +19328,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=72979, - serialized_end=73023, + serialized_start=73319, + serialized_end=73363, ) _GETSHIELDEDANCHORSREQUEST = _descriptor.Descriptor( @@ -19289,8 +19364,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=72854, - serialized_end=73034, + serialized_start=73194, + serialized_end=73374, ) @@ -19321,8 +19396,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=73423, - serialized_end=73449, + serialized_start=73763, + serialized_end=73789, ) _GETSHIELDEDANCHORSRESPONSE_GETSHIELDEDANCHORSRESPONSEV0 = _descriptor.Descriptor( @@ -19371,8 +19446,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=73166, - serialized_end=73459, + serialized_start=73506, + serialized_end=73799, ) _GETSHIELDEDANCHORSRESPONSE = _descriptor.Descriptor( @@ -19407,8 +19482,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=73037, - serialized_end=73470, + serialized_start=73377, + serialized_end=73810, ) @@ -19439,8 +19514,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=73625, - serialized_end=73678, + serialized_start=73965, + serialized_end=74018, ) _GETMOSTRECENTSHIELDEDANCHORREQUEST = _descriptor.Descriptor( @@ -19475,8 +19550,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=73473, - serialized_end=73689, + serialized_start=73813, + serialized_end=74029, ) @@ -19526,8 +19601,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=73848, - serialized_end=74029, + serialized_start=74188, + serialized_end=74369, ) _GETMOSTRECENTSHIELDEDANCHORRESPONSE = _descriptor.Descriptor( @@ -19562,8 +19637,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=73692, - serialized_end=74040, + serialized_start=74032, + serialized_end=74380, ) @@ -19594,8 +19669,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=74174, - serialized_end=74220, + serialized_start=74514, + serialized_end=74560, ) _GETSHIELDEDPOOLSTATEREQUEST = _descriptor.Descriptor( @@ -19630,8 +19705,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=74043, - serialized_end=74231, + serialized_start=74383, + serialized_end=74571, ) @@ -19681,8 +19756,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=74369, - serialized_end=74554, + serialized_start=74709, + serialized_end=74894, ) _GETSHIELDEDPOOLSTATERESPONSE = _descriptor.Descriptor( @@ -19717,8 +19792,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=74234, - serialized_end=74565, + serialized_start=74574, + serialized_end=74905, ) @@ -19749,8 +19824,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=74702, - serialized_end=74749, + serialized_start=75042, + serialized_end=75089, ) _GETSHIELDEDNOTESCOUNTREQUEST = _descriptor.Descriptor( @@ -19785,8 +19860,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=74568, - serialized_end=74760, + serialized_start=74908, + serialized_end=75100, ) @@ -19836,8 +19911,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=74901, - serialized_end=75091, + serialized_start=75241, + serialized_end=75431, ) _GETSHIELDEDNOTESCOUNTRESPONSE = _descriptor.Descriptor( @@ -19872,8 +19947,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=74763, - serialized_end=75102, + serialized_start=75103, + serialized_end=75442, ) @@ -19911,8 +19986,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=75239, - serialized_end=75306, + serialized_start=75579, + serialized_end=75646, ) _GETSHIELDEDNULLIFIERSREQUEST = _descriptor.Descriptor( @@ -19947,8 +20022,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=75105, - serialized_end=75317, + serialized_start=75445, + serialized_end=75657, ) @@ -19986,8 +20061,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=75746, - serialized_end=75800, + serialized_start=76086, + serialized_end=76140, ) _GETSHIELDEDNULLIFIERSRESPONSE_GETSHIELDEDNULLIFIERSRESPONSEV0_NULLIFIERSTATUSES = _descriptor.Descriptor( @@ -20017,8 +20092,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=75803, - serialized_end=75945, + serialized_start=76143, + serialized_end=76285, ) _GETSHIELDEDNULLIFIERSRESPONSE_GETSHIELDEDNULLIFIERSRESPONSEV0 = _descriptor.Descriptor( @@ -20067,8 +20142,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=75458, - serialized_end=75955, + serialized_start=75798, + serialized_end=76295, ) _GETSHIELDEDNULLIFIERSRESPONSE = _descriptor.Descriptor( @@ -20103,8 +20178,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=75320, - serialized_end=75966, + serialized_start=75660, + serialized_end=76306, ) _GETIDENTITYREQUEST_GETIDENTITYREQUESTV0.containing_type = _GETIDENTITYREQUEST @@ -20495,6 +20570,9 @@ _GETCONTRACTGROUPMEMBERSRESPONSE.oneofs_by_name['version'].fields.append( _GETCONTRACTGROUPMEMBERSRESPONSE.fields_by_name['v0']) _GETCONTRACTGROUPMEMBERSRESPONSE.fields_by_name['v0'].containing_oneof = _GETCONTRACTGROUPMEMBERSRESPONSE.oneofs_by_name['version'] +_CONTRACTMODERATIONREASON.oneofs_by_name['_code'].fields.append( + _CONTRACTMODERATIONREASON.fields_by_name['code']) +_CONTRACTMODERATIONREASON.fields_by_name['code'].containing_oneof = _CONTRACTMODERATIONREASON.oneofs_by_name['_code'] _GETCONTRACTMODERATIONSTATUSREQUEST_GETCONTRACTMODERATIONSTATUSREQUESTV0.fields_by_name['lists'].enum_type = _CONTRACTMODERATIONLIST _GETCONTRACTMODERATIONSTATUSREQUEST_GETCONTRACTMODERATIONSTATUSREQUESTV0.containing_type = _GETCONTRACTMODERATIONSTATUSREQUEST _GETCONTRACTMODERATIONSTATUSREQUEST.fields_by_name['v0'].message_type = _GETCONTRACTMODERATIONSTATUSREQUEST_GETCONTRACTMODERATIONSTATUSREQUESTV0 @@ -20502,6 +20580,8 @@ _GETCONTRACTMODERATIONSTATUSREQUEST.fields_by_name['v0']) _GETCONTRACTMODERATIONSTATUSREQUEST.fields_by_name['v0'].containing_oneof = _GETCONTRACTMODERATIONSTATUSREQUEST.oneofs_by_name['version'] _GETCONTRACTMODERATIONSTATUSRESPONSE_CONTRACTMODERATIONSTATUS.fields_by_name['lists'].enum_type = _CONTRACTMODERATIONLIST +_GETCONTRACTMODERATIONSTATUSRESPONSE_CONTRACTMODERATIONSTATUS.fields_by_name['ban_reason'].message_type = _CONTRACTMODERATIONREASON +_GETCONTRACTMODERATIONSTATUSRESPONSE_CONTRACTMODERATIONSTATUS.fields_by_name['suspension_reason'].message_type = _CONTRACTMODERATIONREASON _GETCONTRACTMODERATIONSTATUSRESPONSE_CONTRACTMODERATIONSTATUS.containing_type = _GETCONTRACTMODERATIONSTATUSRESPONSE _GETCONTRACTMODERATIONSTATUSRESPONSE_CONTRACTMODERATIONSTATUS.oneofs_by_name['_banned'].fields.append( _GETCONTRACTMODERATIONSTATUSRESPONSE_CONTRACTMODERATIONSTATUS.fields_by_name['banned']) @@ -20509,6 +20589,12 @@ _GETCONTRACTMODERATIONSTATUSRESPONSE_CONTRACTMODERATIONSTATUS.oneofs_by_name['_suspended_until'].fields.append( _GETCONTRACTMODERATIONSTATUSRESPONSE_CONTRACTMODERATIONSTATUS.fields_by_name['suspended_until']) _GETCONTRACTMODERATIONSTATUSRESPONSE_CONTRACTMODERATIONSTATUS.fields_by_name['suspended_until'].containing_oneof = _GETCONTRACTMODERATIONSTATUSRESPONSE_CONTRACTMODERATIONSTATUS.oneofs_by_name['_suspended_until'] +_GETCONTRACTMODERATIONSTATUSRESPONSE_CONTRACTMODERATIONSTATUS.oneofs_by_name['_ban_reason'].fields.append( + _GETCONTRACTMODERATIONSTATUSRESPONSE_CONTRACTMODERATIONSTATUS.fields_by_name['ban_reason']) +_GETCONTRACTMODERATIONSTATUSRESPONSE_CONTRACTMODERATIONSTATUS.fields_by_name['ban_reason'].containing_oneof = _GETCONTRACTMODERATIONSTATUSRESPONSE_CONTRACTMODERATIONSTATUS.oneofs_by_name['_ban_reason'] +_GETCONTRACTMODERATIONSTATUSRESPONSE_CONTRACTMODERATIONSTATUS.oneofs_by_name['_suspension_reason'].fields.append( + _GETCONTRACTMODERATIONSTATUSRESPONSE_CONTRACTMODERATIONSTATUS.fields_by_name['suspension_reason']) +_GETCONTRACTMODERATIONSTATUSRESPONSE_CONTRACTMODERATIONSTATUS.fields_by_name['suspension_reason'].containing_oneof = _GETCONTRACTMODERATIONSTATUSRESPONSE_CONTRACTMODERATIONSTATUS.oneofs_by_name['_suspension_reason'] _GETCONTRACTMODERATIONSTATUSRESPONSE_GETCONTRACTMODERATIONSTATUSRESPONSEV0.fields_by_name['status'].message_type = _GETCONTRACTMODERATIONSTATUSRESPONSE_CONTRACTMODERATIONSTATUS _GETCONTRACTMODERATIONSTATUSRESPONSE_GETCONTRACTMODERATIONSTATUSRESPONSEV0.fields_by_name['proof'].message_type = _PROOF _GETCONTRACTMODERATIONSTATUSRESPONSE_GETCONTRACTMODERATIONSTATUSRESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA @@ -20535,6 +20621,7 @@ _GETCONTRACTMODERATIONENTRIESREQUEST.oneofs_by_name['version'].fields.append( _GETCONTRACTMODERATIONENTRIESREQUEST.fields_by_name['v0']) _GETCONTRACTMODERATIONENTRIESREQUEST.fields_by_name['v0'].containing_oneof = _GETCONTRACTMODERATIONENTRIESREQUEST.oneofs_by_name['version'] +_GETCONTRACTMODERATIONENTRIESRESPONSE_CONTRACTMODERATIONENTRY.fields_by_name['reason'].message_type = _CONTRACTMODERATIONREASON _GETCONTRACTMODERATIONENTRIESRESPONSE_CONTRACTMODERATIONENTRY.containing_type = _GETCONTRACTMODERATIONENTRIESRESPONSE _GETCONTRACTMODERATIONENTRIESRESPONSE_CONTRACTMODERATIONENTRY.oneofs_by_name['_until'].fields.append( _GETCONTRACTMODERATIONENTRIESRESPONSE_CONTRACTMODERATIONENTRY.fields_by_name['until']) @@ -22160,6 +22247,7 @@ DESCRIPTOR.message_types_by_name['GetContractGroupInfoResponse'] = _GETCONTRACTGROUPINFORESPONSE DESCRIPTOR.message_types_by_name['GetContractGroupMembersRequest'] = _GETCONTRACTGROUPMEMBERSREQUEST DESCRIPTOR.message_types_by_name['GetContractGroupMembersResponse'] = _GETCONTRACTGROUPMEMBERSRESPONSE +DESCRIPTOR.message_types_by_name['ContractModerationReason'] = _CONTRACTMODERATIONREASON DESCRIPTOR.message_types_by_name['GetContractModerationStatusRequest'] = _GETCONTRACTMODERATIONSTATUSREQUEST DESCRIPTOR.message_types_by_name['GetContractModerationStatusResponse'] = _GETCONTRACTMODERATIONSTATUSRESPONSE DESCRIPTOR.message_types_by_name['GetContractModerationEntriesRequest'] = _GETCONTRACTMODERATIONENTRIESREQUEST @@ -22973,6 +23061,13 @@ _sym_db.RegisterMessage(GetContractGroupMembersResponse.TokenMembers) _sym_db.RegisterMessage(GetContractGroupMembersResponse.GetContractGroupMembersResponseV0) +ContractModerationReason = _reflection.GeneratedProtocolMessageType('ContractModerationReason', (_message.Message,), { + 'DESCRIPTOR' : _CONTRACTMODERATIONREASON, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.ContractModerationReason) + }) +_sym_db.RegisterMessage(ContractModerationReason) + GetContractModerationStatusRequest = _reflection.GeneratedProtocolMessageType('GetContractModerationStatusRequest', (_message.Message,), { 'GetContractModerationStatusRequestV0' : _reflection.GeneratedProtocolMessageType('GetContractModerationStatusRequestV0', (_message.Message,), { @@ -25840,8 +25935,8 @@ index=0, serialized_options=None, create_key=_descriptor._internal_create_key, - serialized_start=76210, - serialized_end=86239, + serialized_start=76550, + serialized_end=86579, methods=[ _descriptor.MethodDescriptor( name='broadcastStateTransition', 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 8dce7f91608..a8946913a7a 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 @@ -2768,6 +2768,32 @@ export namespace GetContractGroupMembersResponse { } } +export class ContractModerationReason extends jspb.Message { + hasCode(): boolean; + clearCode(): void; + getCode(): number; + setCode(value: number): void; + + getText(): string; + setText(value: string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): ContractModerationReason.AsObject; + static toObject(includeInstance: boolean, msg: ContractModerationReason): ContractModerationReason.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: ContractModerationReason, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): ContractModerationReason; + static deserializeBinaryFromReader(message: ContractModerationReason, reader: jspb.BinaryReader): ContractModerationReason; +} + +export namespace ContractModerationReason { + export type AsObject = { + code: number, + text: string, + } +} + export class GetContractModerationStatusRequest extends jspb.Message { hasV0(): boolean; clearV0(): void; @@ -2872,6 +2898,16 @@ export namespace GetContractModerationStatusResponse { setListsList(value: Array): void; addLists(value: ContractModerationListMap[keyof ContractModerationListMap], index?: number): ContractModerationListMap[keyof ContractModerationListMap]; + hasBanReason(): boolean; + clearBanReason(): void; + getBanReason(): ContractModerationReason | undefined; + setBanReason(value?: ContractModerationReason): void; + + hasSuspensionReason(): boolean; + clearSuspensionReason(): void; + getSuspensionReason(): ContractModerationReason | undefined; + setSuspensionReason(value?: ContractModerationReason): void; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): ContractModerationStatus.AsObject; static toObject(includeInstance: boolean, msg: ContractModerationStatus): ContractModerationStatus.AsObject; @@ -2887,6 +2923,8 @@ export namespace GetContractModerationStatusResponse { banned: boolean, suspendedUntil: number, listsList: Array, + banReason?: ContractModerationReason.AsObject, + suspensionReason?: ContractModerationReason.AsObject, } } @@ -3042,6 +3080,11 @@ export namespace GetContractModerationEntriesResponse { getUntil(): number; setUntil(value: number): void; + hasReason(): boolean; + clearReason(): void; + getReason(): ContractModerationReason | undefined; + setReason(value?: ContractModerationReason): void; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): ContractModerationEntry.AsObject; static toObject(includeInstance: boolean, msg: ContractModerationEntry): ContractModerationEntry.AsObject; @@ -3056,6 +3099,7 @@ export namespace GetContractModerationEntriesResponse { export type AsObject = { identityId: Uint8Array | string, until: number, + reason?: ContractModerationReason.AsObject, } } 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 a348af48663..e517d05b9fe 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js @@ -40,6 +40,7 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.CompactedBlockAddressBalanceC goog.exportSymbol('proto.org.dash.platform.dapi.v0.ContractGroupDocumentTypeMember', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.ContractGroupTokenMember', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.ContractModerationList', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.ContractModerationReason', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetAddressInfoRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetAddressInfoRequest.GetAddressInfoRequestV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetAddressInfoRequest.VersionCase', null, { proto }); @@ -2595,6 +2596,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.org.dash.platform.dapi.v0.GetContractGroupMembersResponse.GetContractGroupMembersResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetContractGroupMembersResponse.GetContractGroupMembersResponseV0'; } +/** + * 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.ContractModerationReason = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.ContractModerationReason, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.ContractModerationReason.displayName = 'proto.org.dash.platform.dapi.v0.ContractModerationReason'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -29157,6 +29179,184 @@ proto.org.dash.platform.dapi.v0.GetContractGroupMembersResponse.prototype.hasV0 + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#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.ContractModerationReason.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.ContractModerationReason.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.ContractModerationReason} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.ContractModerationReason.toObject = function(includeInstance, msg) { + var f, obj = { + code: jspb.Message.getFieldWithDefault(msg, 1, 0), + text: 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.ContractModerationReason} + */ +proto.org.dash.platform.dapi.v0.ContractModerationReason.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.ContractModerationReason; + return proto.org.dash.platform.dapi.v0.ContractModerationReason.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.ContractModerationReason} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.ContractModerationReason} + */ +proto.org.dash.platform.dapi.v0.ContractModerationReason.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.setText(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.ContractModerationReason.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.ContractModerationReason.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.ContractModerationReason} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.ContractModerationReason.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = /** @type {number} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeUint32( + 1, + f + ); + } + f = message.getText(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } +}; + + +/** + * optional uint32 code = 1; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.ContractModerationReason.prototype.getCode = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.ContractModerationReason} returns this + */ +proto.org.dash.platform.dapi.v0.ContractModerationReason.prototype.setCode = function(value) { + return jspb.Message.setField(this, 1, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.ContractModerationReason} returns this + */ +proto.org.dash.platform.dapi.v0.ContractModerationReason.prototype.clearCode = function() { + return jspb.Message.setField(this, 1, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.ContractModerationReason.prototype.hasCode = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional string text = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.ContractModerationReason.prototype.getText = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.ContractModerationReason} returns this + */ +proto.org.dash.platform.dapi.v0.ContractModerationReason.prototype.setText = 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 @@ -29808,7 +30008,9 @@ proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractMode var f, obj = { banned: jspb.Message.getBooleanFieldWithDefault(msg, 1, false), suspendedUntil: jspb.Message.getFieldWithDefault(msg, 2, 0), - listsList: (f = jspb.Message.getRepeatedField(msg, 3)) == null ? undefined : f + listsList: (f = jspb.Message.getRepeatedField(msg, 3)) == null ? undefined : f, + banReason: (f = msg.getBanReason()) && proto.org.dash.platform.dapi.v0.ContractModerationReason.toObject(includeInstance, f), + suspensionReason: (f = msg.getSuspensionReason()) && proto.org.dash.platform.dapi.v0.ContractModerationReason.toObject(includeInstance, f) }; if (includeInstance) { @@ -29859,6 +30061,16 @@ proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractMode msg.addLists(values[i]); } break; + case 4: + var value = new proto.org.dash.platform.dapi.v0.ContractModerationReason; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ContractModerationReason.deserializeBinaryFromReader); + msg.setBanReason(value); + break; + case 5: + var value = new proto.org.dash.platform.dapi.v0.ContractModerationReason; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ContractModerationReason.deserializeBinaryFromReader); + msg.setSuspensionReason(value); + break; default: reader.skipField(); break; @@ -29909,6 +30121,22 @@ proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractMode f ); } + f = message.getBanReason(); + if (f != null) { + writer.writeMessage( + 4, + f, + proto.org.dash.platform.dapi.v0.ContractModerationReason.serializeBinaryToWriter + ); + } + f = message.getSuspensionReason(); + if (f != null) { + writer.writeMessage( + 5, + f, + proto.org.dash.platform.dapi.v0.ContractModerationReason.serializeBinaryToWriter + ); + } }; @@ -30021,6 +30249,80 @@ proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractMode }; +/** + * optional ContractModerationReason ban_reason = 4; + * @return {?proto.org.dash.platform.dapi.v0.ContractModerationReason} + */ +proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus.prototype.getBanReason = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ContractModerationReason} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ContractModerationReason, 4)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ContractModerationReason|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus.prototype.setBanReason = function(value) { + return jspb.Message.setWrapperField(this, 4, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus} returns this + */ +proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus.prototype.clearBanReason = function() { + return this.setBanReason(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus.prototype.hasBanReason = function() { + return jspb.Message.getField(this, 4) != null; +}; + + +/** + * optional ContractModerationReason suspension_reason = 5; + * @return {?proto.org.dash.platform.dapi.v0.ContractModerationReason} + */ +proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus.prototype.getSuspensionReason = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ContractModerationReason} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ContractModerationReason, 5)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ContractModerationReason|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus.prototype.setSuspensionReason = function(value) { + return jspb.Message.setWrapperField(this, 5, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus} returns this + */ +proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus.prototype.clearSuspensionReason = function() { + return this.setSuspensionReason(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContractModerationStatusResponse.ContractModerationStatus.prototype.hasSuspensionReason = function() { + return jspb.Message.getField(this, 5) != null; +}; + + /** * Oneof group definitions for this message. Each group defines the field @@ -31019,7 +31321,8 @@ proto.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractMod proto.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractModerationEntry.toObject = function(includeInstance, msg) { var f, obj = { identityId: msg.getIdentityId_asB64(), - until: jspb.Message.getFieldWithDefault(msg, 2, 0) + until: jspb.Message.getFieldWithDefault(msg, 2, 0), + reason: (f = msg.getReason()) && proto.org.dash.platform.dapi.v0.ContractModerationReason.toObject(includeInstance, f) }; if (includeInstance) { @@ -31064,6 +31367,11 @@ proto.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractMod var value = /** @type {number} */ (reader.readUint64()); msg.setUntil(value); break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ContractModerationReason; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ContractModerationReason.deserializeBinaryFromReader); + msg.setReason(value); + break; default: reader.skipField(); break; @@ -31107,6 +31415,14 @@ proto.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractMod f ); } + f = message.getReason(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ContractModerationReason.serializeBinaryToWriter + ); + } }; @@ -31188,6 +31504,43 @@ proto.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractMod }; +/** + * optional ContractModerationReason reason = 3; + * @return {?proto.org.dash.platform.dapi.v0.ContractModerationReason} + */ +proto.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractModerationEntry.prototype.getReason = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ContractModerationReason} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ContractModerationReason, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ContractModerationReason|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractModerationEntry} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractModerationEntry.prototype.setReason = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractModerationEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractModerationEntry.prototype.clearReason = function() { + return this.setReason(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContractModerationEntriesResponse.ContractModerationEntry.prototype.hasReason = function() { + return jspb.Message.getField(this, 3) != null; +}; + + /** * List of repeated fields within this message type. diff --git a/packages/dapi-grpc/protos/platform/v0/platform.proto b/packages/dapi-grpc/protos/platform/v0/platform.proto index 33af0b92c05..b0da5aad0c7 100644 --- a/packages/dapi-grpc/protos/platform/v0/platform.proto +++ b/packages/dapi-grpc/protos/platform/v0/platform.proto @@ -709,6 +709,15 @@ enum ContractModerationList { CONTRACT_MODERATION_LIST_SUSPENSIONS = 2; // Identities barred until a block time } +// Why a moderator banned or suspended an identity. Nothing checks what a +// moderator writes. +message ContractModerationReason { + optional uint32 code = + 1; // Reserved for the ban codes a contract may declare in a later + // protocol version; a u16, expected unset today, never checked + string text = 2; // Free text, at most 1024 bytes of UTF-8, may be empty +} + message GetContractModerationStatusRequest { message GetContractModerationStatusRequestV0 { bytes contract_id = 1; // The 32-byte id of the moderated contract @@ -733,6 +742,10 @@ message GetContractModerationStatusResponse { // when the identity is not suspended or the list was not read repeated ContractModerationList lists = 3; // The lists this status covers, as the request named them + optional ContractModerationReason ban_reason = + 4; // Set when the identity is banned: why + optional ContractModerationReason suspension_reason = + 5; // Set when the identity is suspended: why } message GetContractModerationStatusResponseV0 { @@ -765,6 +778,7 @@ message GetContractModerationEntriesResponse { optional uint64 until = 2; // For a suspension list entry: the block time, in milliseconds, at // which it lapses + ContractModerationReason reason = 3; // Why the identity is on the list } message ContractModerationEntries { diff --git a/packages/js-evo-sdk/src/contracts/facade.ts b/packages/js-evo-sdk/src/contracts/facade.ts index a7814cecd07..95ccbc80aec 100644 --- a/packages/js-evo-sdk/src/contracts/facade.ts +++ b/packages/js-evo-sdk/src/contracts/facade.ts @@ -111,9 +111,11 @@ export class ContractsFacade { /** * Puts an identity on a moderated contract's banlist (protocol version 14). Signed by the * contract owner or a moderator the contract's config names, with a CRITICAL authentication - * key. A banned identity cannot act on the contract at the document level. + * key. A banned identity cannot act on the contract at the document level. `options.reason` + * is required and stored with the entry: a free text of at most 1024 bytes, and an optional + * `code` nothing checks, reserved for ban codes contracts may declare later. */ - async banUser(options: wasm.ContractModerationOptions): Promise { + async banUser(options: wasm.ContractBanOptions): Promise { const w = await this.sdk.getWasmSdkConnected(); return w.contractBanUser(options); } @@ -127,9 +129,9 @@ export class ContractsFacade { /** * Suspends an identity on a moderated contract until the block time `until` (milliseconds), * replacing a suspension it already carries. The suspension is swept by the identity's first - * document transition after it lapses. + * document transition after it lapses. `options.until` and `options.reason` are required. */ - async suspendUser(options: wasm.ContractModerationOptions): Promise { + async suspendUser(options: wasm.ContractSuspendOptions): Promise { const w = await this.sdk.getWasmSdkConnected(); return w.contractSuspendUser(options); } diff --git a/packages/js-evo-sdk/tests/unit/facades/contracts.spec.ts b/packages/js-evo-sdk/tests/unit/facades/contracts.spec.ts index 3933f578b7a..99db0006d1a 100644 --- a/packages/js-evo-sdk/tests/unit/facades/contracts.spec.ts +++ b/packages/js-evo-sdk/tests/unit/facades/contracts.spec.ts @@ -217,39 +217,68 @@ describe('ContractsFacade', () => { // Every moderation transition resolves to the status on the lists its proof covers: both // for a ban, the edited one otherwise. `banned` is only set when `lists` includes `banlist`. + // Each action gets the options the WASM entrypoint accepts for it: a reason for a ban and a + // suspend, `until` for a suspend alone, neither for an unban or an unsuspend. const transitions = [ { facade: 'banUser', wasm: 'contractBanUser', - result: { lists: ['banlist', 'suspensions'], banned: true }, + extraOptions: { reason: { text: 'spam' } }, + result: { lists: ['banlist', 'suspensions'], banned: true, banReason: { text: 'spam' } }, + }, + { + facade: 'unbanUser', + wasm: 'contractUnbanUser', + extraOptions: {}, + result: { lists: ['banlist'], banned: false }, }, - { facade: 'unbanUser', wasm: 'contractUnbanUser', result: { lists: ['banlist'], banned: false } }, { facade: 'suspendUser', wasm: 'contractSuspendUser', - result: { lists: ['suspensions'], suspendedUntil: BigInt(1800000000000) }, + extraOptions: { until: BigInt(1800000000000), reason: { code: 7, text: 'flooding' } }, + result: { + lists: ['suspensions'], + suspendedUntil: BigInt(1800000000000), + suspensionReason: { code: 7, text: 'flooding' }, + }, + }, + { + facade: 'unsuspendUser', + wasm: 'contractUnsuspendUser', + extraOptions: {}, + result: { lists: ['suspensions'] }, }, - { facade: 'unsuspendUser', wasm: 'contractUnsuspendUser', result: { lists: ['suspensions'] } }, ] as const; - transitions.forEach(({ facade, wasm, result }) => { + transitions.forEach(({ + facade, wasm, extraOptions, result, + }) => { it(`should forward ${facade}() to ${wasm}() and return its per-list result`, async function run() { const stub = this.sinon.stub(wasmSdk, wasm).resolves({ contractId, identityId, ...result }); const options = { identity: Object.create(wasmSDKPackage.Identity.prototype), contractId, identityId, - until: BigInt(1800000000000), signer, + ...extraOptions, }; - const moderated = await client.contracts[facade](options); + // The per-action option types differ, so the facade method is called through one + // signature wide enough for all four. + const method = client.contracts[facade].bind(client.contracts) as ( + moderationOptions: typeof options, + ) => Promise; + const moderated = await method(options); expect(stub).to.be.calledOnceWithExactly(options); expect(moderated.lists).to.deep.equal(result.lists); if (!result.lists.includes('banlist')) { expect(moderated.banned).to.equal(undefined); } + expect(moderated.banReason).to.deep.equal('banReason' in result ? result.banReason : undefined); + expect(moderated.suspensionReason).to.deep.equal( + 'suspensionReason' in result ? result.suspensionReason : undefined, + ); }); }); diff --git a/packages/rs-dpp/src/data_contract/config/moderation/mod.rs b/packages/rs-dpp/src/data_contract/config/moderation/mod.rs index 32969f31f0c..612cccb6da3 100644 --- a/packages/rs-dpp/src/data_contract/config/moderation/mod.rs +++ b/packages/rs-dpp/src/data_contract/config/moderation/mod.rs @@ -20,6 +20,9 @@ use serde::{Deserialize, Serialize}; use std::collections::BTreeSet; use std::fmt; +mod reason; +pub use reason::ContractModerationReason; + /// Who may send a `ContractUserModeration` transition for the contract. /// /// The contract owner always may, named or not. A moderator set is fixed in the config and @@ -303,42 +306,64 @@ impl JsonSafeFields for ContractModerationConfig {} #[cfg(feature = "json-conversion")] impl JsonSafeFields for ContractModerationList {} +/// A banlist entry. +#[derive( + Debug, Clone, PartialEq, Eq, Default, Encode, Decode, DecodeUntrusted, Serialize, Deserialize, +)] +#[serde(rename_all = "camelCase")] +pub struct ContractBan { + /// Why the moderator banned the identity. + pub reason: ContractModerationReason, +} + +/// A suspension list entry. +#[derive( + Debug, Clone, PartialEq, Eq, Default, Encode, Decode, DecodeUntrusted, Serialize, Deserialize, +)] +#[serde(rename_all = "camelCase")] +pub struct ContractSuspension { + /// The block time, in milliseconds, at which the suspension lapses. + pub until: TimestampMillis, + /// Why the moderator suspended the identity. + pub reason: ContractModerationReason, +} + /// What a contract's moderation lists say about one identity. #[derive( - Debug, - Clone, - Copy, - PartialEq, - Eq, - Default, - Encode, - Decode, - DecodeUntrusted, - Serialize, - Deserialize, + Debug, Clone, PartialEq, Eq, Default, Encode, Decode, DecodeUntrusted, Serialize, Deserialize, )] #[serde(rename_all = "camelCase")] pub struct ContractModerationStatus { - /// The identity is on the banlist. - pub banned: bool, - /// The identity is on the suspension list, until this block time in milliseconds. A - /// lapsed suspension (at or before the block time) still appears here until it is swept. - pub suspended_until: Option, + /// The identity's banlist entry, `None` when it is not banned. + pub ban: Option, + /// The identity's suspension list entry, `None` when it is not suspended. A lapsed + /// suspension (at or before the block time) still appears here until it is swept. + pub suspension: Option, } impl ContractModerationStatus { + /// Whether the identity is on the banlist. + pub fn banned(&self) -> bool { + self.ban.is_some() + } + + /// The block time, in milliseconds, until which the identity is suspended, lapsed or not. + pub fn suspended_until(&self) -> Option { + self.suspension.as_ref().map(|suspension| suspension.until) + } + /// Whether the identity is barred from acting on the contract at the document level at /// `block_time_ms`: it is banned, or under a suspension that has not lapsed. pub fn is_barred_at(&self, block_time_ms: TimestampMillis) -> bool { - self.banned + self.banned() || self - .suspended_until + .suspended_until() .is_some_and(|until| until > block_time_ms) } /// Whether the identity carries a suspension that has lapsed at `block_time_ms`. pub fn has_lapsed_suspension_at(&self, block_time_ms: TimestampMillis) -> bool { - self.suspended_until + self.suspended_until() .is_some_and(|until| until <= block_time_ms) } } @@ -347,21 +372,21 @@ impl ContractModerationStatus { /// other list. It is what the proof of a moderation transition's execution shows: that proof /// holds the edited entry only, so the other list stays unknown rather than being reported as /// empty (an identity unsuspended a moment ago may well be banned). -#[derive(Debug, Clone, Copy, PartialEq, Eq, Encode, Decode, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Encode, Decode, Serialize, Deserialize)] #[serde(tag = "list", rename_all = "camelCase")] pub enum ContractModerationListStatus { /// The banlist entry #[serde(rename_all = "camelCase")] Banlist { - /// The identity is on the banlist. - banned: bool, + /// The identity's banlist entry, `None` when it is not banned. + ban: Option, }, /// The suspension list entry #[serde(rename_all = "camelCase")] Suspensions { - /// The identity is on the suspension list, until this block time in milliseconds. A - /// lapsed suspension still appears here until it is swept. - suspended_until: Option, + /// The identity's suspension list entry, `None` when it is not suspended. A lapsed + /// suspension still appears here until it is swept. + suspension: Option, }, } @@ -370,10 +395,10 @@ impl ContractModerationListStatus { pub fn from_status(list: ContractModerationList, status: &ContractModerationStatus) -> Self { match list { ContractModerationList::Banlist => Self::Banlist { - banned: status.banned, + ban: status.ban.clone(), }, ContractModerationList::Suspensions => Self::Suspensions { - suspended_until: status.suspended_until, + suspension: status.suspension.clone(), }, } } @@ -409,23 +434,36 @@ impl ContractModerationListStatuses { ) } - /// Whether the identity is banned, `None` when the banlist was not queried. - pub fn banned(&self) -> Option { + /// The identity's banlist entry (`Some(None)`: not banned), `None` when the banlist was + /// not queried. + pub fn ban(&self) -> Option> { self.0.iter().find_map(|status| match status { - ContractModerationListStatus::Banlist { banned } => Some(*banned), + ContractModerationListStatus::Banlist { ban } => Some(ban.as_ref()), ContractModerationListStatus::Suspensions { .. } => None, }) } - /// Until when the identity is suspended (`Some(None)`: not suspended), `None` when the + /// The identity's suspension list entry (`Some(None)`: not suspended), `None` when the /// suspension list was not queried. - pub fn suspended_until(&self) -> Option> { + pub fn suspension(&self) -> Option> { self.0.iter().find_map(|status| match status { ContractModerationListStatus::Banlist { .. } => None, - ContractModerationListStatus::Suspensions { suspended_until } => Some(*suspended_until), + ContractModerationListStatus::Suspensions { suspension } => Some(suspension.as_ref()), }) } + /// Whether the identity is banned, `None` when the banlist was not queried. + pub fn banned(&self) -> Option { + self.ban().map(|ban| ban.is_some()) + } + + /// Until when the identity is suspended (`Some(None)`: not suspended), `None` when the + /// suspension list was not queried. + pub fn suspended_until(&self) -> Option> { + self.suspension() + .map(|suspension| suspension.map(|suspension| suspension.until)) + } + /// Whether one of the lists queried bars the identity at `block_time_ms`. `false` says /// nothing about a list that was not queried. pub fn is_barred_on_queried_lists_at(&self, block_time_ms: TimestampMillis) -> bool { @@ -583,17 +621,65 @@ mod tests { #[test] fn should_tell_barred_from_lapsed() { let banned = ContractModerationStatus { - banned: true, - suspended_until: None, + ban: Some(ContractBan::default()), + suspension: None, }; + assert!(banned.banned()); assert!(banned.is_barred_at(0)); let suspended = ContractModerationStatus { - banned: false, - suspended_until: Some(100), + ban: None, + suspension: Some(ContractSuspension { + until: 100, + reason: ContractModerationReason::from_text("flooding"), + }), }; + assert!(!suspended.banned()); + assert_eq!(suspended.suspended_until(), Some(100)); assert!(suspended.is_barred_at(99)); assert!(!suspended.is_barred_at(100)); assert!(suspended.has_lapsed_suspension_at(100)); assert!(!suspended.has_lapsed_suspension_at(99)); } + + #[test] + fn should_report_only_the_lists_read() { + let status = ContractModerationStatus { + ban: Some(ContractBan { + reason: ContractModerationReason::from_text("spam"), + }), + suspension: None, + }; + + let banlist_only = ContractModerationListStatuses::from_status( + &[ContractModerationList::Banlist], + &status, + ); + assert_eq!(banlist_only.banned(), Some(true)); + assert_eq!( + banlist_only + .ban() + .flatten() + .map(|ban| ban.reason.text.as_str()), + Some("spam") + ); + assert_eq!(banlist_only.suspension(), None); + assert_eq!(banlist_only.suspended_until(), None); + + let both = ContractModerationListStatuses::from_status( + &[ + ContractModerationList::Banlist, + ContractModerationList::Suspensions, + ], + &status, + ); + assert_eq!(both.suspension(), Some(None)); + assert_eq!(both.suspended_until(), Some(None)); + assert_eq!( + serde_json::to_value(&both).expect("to json"), + serde_json::json!([ + {"list": "banlist", "ban": {"reason": {"code": null, "text": "spam"}}}, + {"list": "suspensions", "suspension": null}, + ]) + ); + } } diff --git a/packages/rs-dpp/src/data_contract/config/moderation/reason.rs b/packages/rs-dpp/src/data_contract/config/moderation/reason.rs new file mode 100644 index 00000000000..25103a74c29 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/config/moderation/reason.rs @@ -0,0 +1,124 @@ +use crate::consensus::basic::contract_moderation::ContractModerationReasonTooLongError; +#[cfg(feature = "json-conversion")] +use crate::serialization::JsonSafeFields; +use crate::validation::SimpleConsensusValidationResult; +use bincode::{Decode, DecodeUntrusted, Encode}; +use platform_version::version::PlatformVersion; +use serde::{Deserialize, Serialize}; + +/// Why a moderator banned or suspended an identity. Every ban and every suspension carries +/// one, and it is stored with the entry, so whoever reads the list reads the reason. +/// +/// Nothing checks what a moderator writes: the text is free, and so is the code. +#[derive( + Debug, Clone, PartialEq, Eq, Default, Encode, Decode, DecodeUntrusted, Serialize, Deserialize, +)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct ContractModerationReason { + /// Reserved for the ban codes a contract may declare in a later protocol version. No + /// contract declares any today, so this is expected to be `None`. A value is accepted and + /// stored as written, and is not checked against anything. + #[serde(default)] + pub code: Option, + /// Free text, at most `SystemLimits::max_contract_moderation_reason_length` bytes of + /// UTF-8. May be empty. + pub text: String, +} + +impl ContractModerationReason { + /// A reason without a code. + pub fn from_text(text: impl Into) -> Self { + Self { + code: None, + text: text.into(), + } + } + + /// Checks the length of the text. The code is not checked. + pub fn validate(&self, platform_version: &PlatformVersion) -> SimpleConsensusValidationResult { + let max_length = platform_version + .system_limits + .max_contract_moderation_reason_length; + if self.text.len() > max_length as usize { + return SimpleConsensusValidationResult::new_with_error( + ContractModerationReasonTooLongError::new(self.text.len() as u64, max_length) + .into(), + ); + } + SimpleConsensusValidationResult::new() + } +} + +#[cfg(feature = "json-conversion")] +impl JsonSafeFields for ContractModerationReason {} + +#[cfg(test)] +mod tests { + use super::*; + use crate::consensus::basic::BasicError; + use crate::consensus::ConsensusError; + + #[test] + fn should_round_trip_through_json_with_and_without_a_code() { + let reason = ContractModerationReason { + code: Some(7), + text: "spam".to_string(), + }; + let json = serde_json::to_value(&reason).expect("to json"); + assert_eq!(json, serde_json::json!({"code": 7, "text": "spam"})); + assert_eq!( + serde_json::from_value::(json).expect("from json"), + reason + ); + + // The code may be left out + assert_eq!( + serde_json::from_value::(serde_json::json!({"text": ""})) + .expect("from json"), + ContractModerationReason::from_text("") + ); + } + + #[test] + fn should_refuse_an_unknown_field() { + serde_json::from_value::( + serde_json::json!({"text": "spam", "note": "x"}), + ) + .expect_err("unknown field"); + } + + #[test] + fn should_accept_any_code_and_a_text_up_to_the_limit() { + let platform_version = PlatformVersion::latest(); + let max_length = platform_version + .system_limits + .max_contract_moderation_reason_length as usize; + + let reason = ContractModerationReason { + code: Some(u16::MAX), + text: "é".repeat(max_length / 2), + }; + assert_eq!(reason.text.len(), max_length); + assert!(reason.validate(platform_version).is_valid()); + assert!(ContractModerationReason::default() + .validate(platform_version) + .is_valid()); + } + + #[test] + fn should_refuse_a_text_over_the_limit_counted_in_bytes() { + let platform_version = PlatformVersion::latest(); + let max_length = platform_version + .system_limits + .max_contract_moderation_reason_length; + + // One character under the limit in characters, over it in bytes + let reason = ContractModerationReason::from_text("é".repeat(max_length as usize / 2 + 1)); + let result = reason.validate(platform_version); + assert!(matches!( + result.errors.as_slice(), + [ConsensusError::BasicError(BasicError::ContractModerationReasonTooLongError(error))] + if error.length() == max_length as u64 + 2 && error.max_length() == max_length + )); + } +} 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 f9780ab63d8..b2ccd45784a 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs @@ -12,7 +12,8 @@ use crate::consensus::basic::contract_group::{ RedundantContractGroupMembershipError, }; use crate::consensus::basic::contract_moderation::{ - ContractModerationSelfTargetError, InvalidContractModerationConfigError, + ContractModerationReasonTooLongError, ContractModerationSelfTargetError, + InvalidContractModerationConfigError, }; use crate::consensus::basic::data_contract::data_contract_max_depth_exceed_error::DataContractMaxDepthExceedError; use crate::consensus::basic::data_contract::{ @@ -792,6 +793,9 @@ pub enum BasicError { #[error(transparent)] ContractModerationSelfTargetError(ContractModerationSelfTargetError), + + #[error(transparent)] + ContractModerationReasonTooLongError(ContractModerationReasonTooLongError), } impl From for ConsensusError { @@ -856,5 +860,11 @@ mod tests { )), 190 ); + assert_eq!( + discriminant_of(BasicError::ContractModerationReasonTooLongError( + ContractModerationReasonTooLongError::new(1025, 1024) + )), + 191 + ); } } diff --git a/packages/rs-dpp/src/errors/consensus/basic/contract_moderation/contract_moderation_reason_too_long_error.rs b/packages/rs-dpp/src/errors/consensus/basic/contract_moderation/contract_moderation_reason_too_long_error.rs new file mode 100644 index 00000000000..db9a5891d15 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/contract_moderation/contract_moderation_reason_too_long_error.rs @@ -0,0 +1,58 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::errors::ProtocolError; +use bincode::{Decode, DecodeUntrusted, Encode}; +use platform_serialization_derive::{ + PlatformDeserializeTrusted, PlatformDeserializeUntrusted, PlatformSerialize, +}; +use thiserror::Error; + +#[derive( + Error, + Debug, + Clone, + PartialEq, + Eq, + Encode, + Decode, + PlatformSerialize, + PlatformDeserializeTrusted, + PlatformDeserializeUntrusted, + DecodeUntrusted, +)] +#[error( + "The text of a contract moderation reason is {} bytes long, the maximum is {}", + length, + max_length +)] +#[platform_serialize(unversioned)] +pub struct ContractModerationReasonTooLongError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + length: u64, + max_length: u16, +} + +impl ContractModerationReasonTooLongError { + pub fn new(length: u64, max_length: u16) -> Self { + Self { length, max_length } + } + + /// The length of the text, in bytes of UTF-8 + pub fn length(&self) -> u64 { + self.length + } + + pub fn max_length(&self) -> u16 { + self.max_length + } +} + +impl From for ConsensusError { + fn from(err: ContractModerationReasonTooLongError) -> Self { + Self::BasicError(BasicError::ContractModerationReasonTooLongError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/contract_moderation/mod.rs b/packages/rs-dpp/src/errors/consensus/basic/contract_moderation/mod.rs index 46aad1bf7e6..7037df0d3df 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/contract_moderation/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/contract_moderation/mod.rs @@ -1,5 +1,7 @@ +mod contract_moderation_reason_too_long_error; mod contract_moderation_self_target_error; mod invalid_contract_moderation_config_error; +pub use contract_moderation_reason_too_long_error::*; pub use contract_moderation_self_target_error::*; pub use invalid_contract_moderation_config_error::*; diff --git a/packages/rs-dpp/src/errors/consensus/codes.rs b/packages/rs-dpp/src/errors/consensus/codes.rs index c0a672eb2ab..7e06a451b11 100644 --- a/packages/rs-dpp/src/errors/consensus/codes.rs +++ b/packages/rs-dpp/src/errors/consensus/codes.rs @@ -268,6 +268,7 @@ impl ErrorWithCode for BasicError { Self::InvalidContractModerationConfigError(_) => 10900, Self::ContractModerationSelfTargetError(_) => 10901, // 10902 is reserved for the moderation earnings follow-up. + Self::ContractModerationReasonTooLongError(_) => 10903, } } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/contract_user_moderation_transition/accessors/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/contract_user_moderation_transition/accessors/mod.rs index 90e2d6e29a8..5ecf138b4e2 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/contract_user_moderation_transition/accessors/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/contract_user_moderation_transition/accessors/mod.rs @@ -47,7 +47,7 @@ impl ContractUserModerationTransitionAccessorsV0 for ContractUserModerationTrans } } - fn action(&self) -> ContractUserModerationAction { + fn action(&self) -> &ContractUserModerationAction { match self { ContractUserModerationTransition::V0(transition) => transition.action(), } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/contract_user_moderation_transition/accessors/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/contract_user_moderation_transition/accessors/v0/mod.rs index 59ce6659e11..87249409d35 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/contract_user_moderation_transition/accessors/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/contract_user_moderation_transition/accessors/v0/mod.rs @@ -11,7 +11,7 @@ pub trait ContractUserModerationTransitionAccessorsV0 { fn identity_contract_nonce(&self) -> IdentityNonce; fn set_action(&mut self, action: ContractUserModerationAction); /// What is done, to whom - fn action(&self) -> ContractUserModerationAction; + fn action(&self) -> &ContractUserModerationAction; /// The identity the action targets fn target_identity_id(&self) -> Identifier { self.action().identity_id() diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/contract_user_moderation_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/contract_user_moderation_transition/mod.rs index de4dfc7405e..f9bebd2113a 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/contract_user_moderation_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/contract_user_moderation_transition/mod.rs @@ -114,6 +114,7 @@ impl StateTransitionFieldTypes for ContractUserModerationTransition { #[cfg(test)] mod test { use super::*; + use crate::data_contract::config::moderation::ContractModerationReason; use crate::serialization::{PlatformDeserializableUntrusted, PlatformSerializable}; use crate::state_transition::contract_user_moderation_transition::accessors::ContractUserModerationTransitionAccessorsV0; use crate::state_transition::{ @@ -132,6 +133,7 @@ mod test { action: ContractUserModerationAction::Suspend { identity_id: Identifier::random(), until: 1_800_000_000_000, + reason: ContractModerationReason::from_text("flooding"), }, user_fee_increase: 2, signature_public_key_id: 0, @@ -154,6 +156,10 @@ mod test { for action in [ ContractUserModerationAction::Ban { identity_id: target, + reason: ContractModerationReason { + code: Some(u16::MAX), + text: "spam".to_string(), + }, }, ContractUserModerationAction::Unban { identity_id: target, @@ -161,6 +167,7 @@ mod test { ContractUserModerationAction::Suspend { identity_id: target, until: 5, + reason: ContractModerationReason::default(), }, ContractUserModerationAction::Unsuspend { identity_id: target, @@ -267,6 +274,7 @@ mod test { pub(crate) mod json_convertible_tests { use super::*; + use crate::data_contract::config::moderation::ContractModerationReason; use platform_value::{platform_value, BinaryData, Identifier}; use serde_json::json; @@ -278,6 +286,10 @@ pub(crate) mod json_convertible_tests { action: ContractUserModerationAction::Suspend { identity_id: Identifier::new([0x77; 32]), until: 1_800_000_000_000, + reason: ContractModerationReason { + code: Some(12), + text: "flooding".to_string(), + }, }, user_fee_increase: 4, signature_public_key_id: 6, @@ -301,6 +313,7 @@ pub(crate) mod json_convertible_tests { "$type": "suspend", "identityId": Identifier::new([0x77; 32]), "until": 1_800_000_000_000u64, + "reason": {"code": 12, "text": "flooding"}, }, "userFeeIncrease": 4, "signaturePublicKeyId": 6, @@ -327,6 +340,7 @@ pub(crate) mod json_convertible_tests { "$type": "suspend", "identityId": Identifier::new([0x77; 32]), "until": 1_800_000_000_000u64, + "reason": {"code": 12u16, "text": "flooding"}, }, "userFeeIncrease": 4u16, "signaturePublicKeyId": 6u32, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/contract_user_moderation_transition/state_transition_estimated_fee_validation.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/contract_user_moderation_transition/state_transition_estimated_fee_validation.rs index a80d2c76858..5d02a968f2b 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/contract_user_moderation_transition/state_transition_estimated_fee_validation.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/contract_user_moderation_transition/state_transition_estimated_fee_validation.rs @@ -10,8 +10,11 @@ use crate::ProtocolError; use platform_version::version::PlatformVersion; impl StateTransitionEstimatedFeeValidation for ContractUserModerationTransition { - /// One small contract-scoped write, so the contract update floor is reused rather than a - /// new slot added to the shipped fee schedules. + /// One contract-scoped write, so the contract update floor is reused rather than a new slot + /// added to the shipped fee schedules. It is a floor, not the price: a ban or a suspension + /// stores its reason, up to a kilobyte, and like a document's content that storage is + /// checked against the balance when the fees of the event are validated, from the dry run + /// of the write. fn calculate_min_required_fee( &self, platform_version: &PlatformVersion, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/contract_user_moderation_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/contract_user_moderation_transition/v0/mod.rs index f8e212b7ef3..1c2d80f57d3 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/contract_user_moderation_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/contract_user_moderation_transition/v0/mod.rs @@ -14,13 +14,14 @@ use platform_value::BinaryData; #[cfg(feature = "serde-conversion")] use serde::{Deserialize, Serialize}; +use crate::data_contract::config::moderation::ContractModerationReason; use crate::identity::{KeyID, TimestampMillis}; use crate::prelude::{Identifier, IdentityNonce, UserFeeIncrease}; use crate::ProtocolError; use std::fmt; /// What the moderator does to one identity on the contract. -#[derive(Debug, Clone, Copy, PartialEq, Eq, Encode, Decode, DecodeUntrusted)] +#[derive(Debug, Clone, PartialEq, Eq, Encode, Decode, DecodeUntrusted)] #[cfg_attr( feature = "serde-conversion", derive(Serialize, Deserialize), @@ -31,6 +32,8 @@ pub enum ContractUserModerationAction { Ban { #[cfg_attr(feature = "serde-conversion", serde(rename = "identityId"))] identity_id: Identifier, + /// Why, stored with the banlist entry. + reason: ContractModerationReason, }, /// Takes the identity off the banlist. Unban { @@ -43,6 +46,8 @@ pub enum ContractUserModerationAction { #[cfg_attr(feature = "serde-conversion", serde(rename = "identityId"))] identity_id: Identifier, until: TimestampMillis, + /// Why, stored with the suspension list entry. + reason: ContractModerationReason, }, /// Takes the identity off the suspension list, lapsed or not. Unsuspend { @@ -55,6 +60,7 @@ impl Default for ContractUserModerationAction { fn default() -> Self { ContractUserModerationAction::Ban { identity_id: Identifier::default(), + reason: ContractModerationReason::default(), } } } @@ -63,7 +69,7 @@ impl ContractUserModerationAction { /// The identity the action targets. pub fn identity_id(&self) -> Identifier { match self { - ContractUserModerationAction::Ban { identity_id } + ContractUserModerationAction::Ban { identity_id, .. } | ContractUserModerationAction::Unban { identity_id } | ContractUserModerationAction::Suspend { identity_id, .. } | ContractUserModerationAction::Unsuspend { identity_id } => *identity_id, @@ -78,6 +84,17 @@ impl ContractUserModerationAction { } } + /// The reason a ban or a suspend carries, `None` for an action that takes an identity off + /// a list. + pub fn reason(&self) -> Option<&ContractModerationReason> { + match self { + ContractUserModerationAction::Ban { reason, .. } + | ContractUserModerationAction::Suspend { reason, .. } => Some(reason), + ContractUserModerationAction::Unban { .. } + | ContractUserModerationAction::Unsuspend { .. } => None, + } + } + /// The action's name on the wire. pub fn name(&self) -> &'static str { match self { @@ -92,7 +109,9 @@ impl ContractUserModerationAction { impl fmt::Display for ContractUserModerationAction { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - ContractUserModerationAction::Suspend { identity_id, until } => { + ContractUserModerationAction::Suspend { + identity_id, until, .. + } => { write!(f, "suspend {} until {}", identity_id, until) } other => write!(f, "{} {}", other.name(), other.identity_id()), @@ -101,7 +120,8 @@ impl fmt::Display for ContractUserModerationAction { } // `until` is a u64, but basic structure validation refuses one past -// `SystemLimits::max_contract_suspension_until` (2^53 - 1), so it is exact in JSON. +// `SystemLimits::max_contract_suspension_until` (2^53 - 1), so it is exact in JSON. The +// reason holds a u16 and a string. #[cfg(feature = "json-conversion")] impl JsonSafeFields for ContractUserModerationAction {} @@ -157,6 +177,7 @@ mod test { identity_contract_nonce: 3, action: ContractUserModerationAction::Ban { identity_id: Identifier::random(), + reason: ContractModerationReason::from_text("spam"), }, user_fee_increase: 1, signature_public_key_id: 2, @@ -203,19 +224,37 @@ mod test { #[test] fn should_name_the_action_target() { let target = Identifier::random(); + let reason = ContractModerationReason { + code: Some(4), + text: "flooding".to_string(), + }; let action = ContractUserModerationAction::Suspend { identity_id: target, until: 12, + reason: reason.clone(), }; assert_eq!(action.identity_id(), target); assert_eq!(action.until(), Some(12)); + assert_eq!(action.reason(), Some(&reason)); assert_eq!(action.name(), "suspend"); - assert_eq!( - ContractUserModerationAction::Unban { - identity_id: target - } - .until(), - None + let unban = ContractUserModerationAction::Unban { + identity_id: target, + }; + assert_eq!(unban.until(), None); + assert_eq!(unban.reason(), None); + } + + #[test] + fn should_sign_the_reason() { + let a = make_v0(); + let mut b = a.clone(); + b.action = ContractUserModerationAction::Ban { + identity_id: a.action.identity_id(), + reason: ContractModerationReason::from_text("something else"), + }; + assert_ne!( + a.signable_bytes().expect("signable"), + b.signable_bytes().expect("signable") ); } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/contract/contract_user_moderation_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/contract/contract_user_moderation_transition/v0/v0_methods.rs index 82da604ad02..7004fdb808f 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/contract/contract_user_moderation_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/contract/contract_user_moderation_transition/v0/v0_methods.rs @@ -94,7 +94,7 @@ impl ContractUserModerationTransitionAccessorsV0 for ContractUserModerationTrans self.action = action; } - fn action(&self) -> ContractUserModerationAction { - self.action + fn action(&self) -> &ContractUserModerationAction { + &self.action } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/v0/contract_moderation_gate/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/v0/contract_moderation_gate/mod.rs index 34ee4267c42..03f1b83c48b 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/v0/contract_moderation_gate/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/v0/contract_moderation_gate/mod.rs @@ -150,7 +150,9 @@ mod tests { use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContextMethodsV0; use crate::test::helpers::setup::TestPlatformBuilder; use dpp::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; - use dpp::data_contract::config::moderation::{ContractModerationConfig, ContractModerators}; + use dpp::data_contract::config::moderation::{ + ContractModerationConfig, ContractModerationReason, ContractModerators, + }; use dpp::state_transition::StateTransition; use dpp::tests::fixtures::get_data_contract_fixture; use dpp::version::DefaultForPlatformVersion; @@ -274,6 +276,7 @@ mod tests { .add_contract_ban( contract.id(), identity.id(), + &ContractModerationReason::from_text("spam"), contract.owner_id(), &BlockInfo::default(), true, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/v0/contract_moderation_gate/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/v0/contract_moderation_gate/v0/mod.rs index 632cbb59eab..bdd218d7323 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/v0/contract_moderation_gate/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/v0/contract_moderation_gate/v0/mod.rs @@ -87,11 +87,11 @@ impl BatchTransitionContractModerationGateV0 for BatchTransition { )?; execution_context.add_operation(ValidationOperation::PrecalculatedOperation(fee)); - let barred: Option = if status.banned { + let barred: Option = if status.banned() { Some(ContractUserBannedError::new(data_contract_id, owner_id).into()) } else { status - .suspended_until + .suspended_until() .filter(|until| *until > block_info.time_ms) .map(|until| { ContractUserSuspendedError::new(data_contract_id, owner_id, until).into() diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/contract_user_moderation/basic_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/contract_user_moderation/basic_structure/v0/mod.rs index 72af036d164..6ae520d14b5 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/contract_user_moderation/basic_structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/contract_user_moderation/basic_structure/v0/mod.rs @@ -19,7 +19,9 @@ pub(in crate::execution::validation::state_transition::state_transitions::contra impl ContractUserModerationStateTransitionStructureValidationV0 for ContractUserModerationTransition { - /// An identity can not moderate itself, and a suspension ends within the JSON-safe range. + /// An identity can not moderate itself, a suspension ends within the JSON-safe range, and + /// the text of a ban's or a suspension's reason fits + /// `SystemLimits::max_contract_moderation_reason_length`; the reason's code is not checked. /// Whether the contract keeps the list, who may /// moderate it and what the target's status is all need state, so state validation /// decides those. @@ -46,6 +48,13 @@ impl ContractUserModerationStateTransitionStructureValidationV0 )); } + if let Some(reason) = self.action().reason() { + let result = reason.validate(platform_version); + if !result.is_valid() { + return Ok(result); + } + } + Ok(SimpleConsensusValidationResult::new()) } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/contract_user_moderation/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/contract_user_moderation/state/v0/mod.rs index f03d96cc2af..be93ece1456 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/contract_user_moderation/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/contract_user_moderation/state/v0/mod.rs @@ -52,8 +52,8 @@ impl ContractUserModerationStateTransitionStateValidationV0 for ContractUserMode /// a contract that does not exist included, is paid for by bumping the signer's contract /// nonce. /// - /// The action carries the target's status as read here, so Drive edits the lists without - /// reading them again, and the mempool, which transforms without a state validation stage, + /// The action carries what Drive needs of the target's status as read here, so Drive edits + /// the lists without reading them again, and the mempool, which transforms without a state validation stage, /// refuses with the same consensus codes as a block. fn transform_into_action_v0( &self, @@ -109,7 +109,7 @@ impl ContractUserModerationStateTransitionStateValidationV0 for ContractUserMode }; let contract = &contract_fetch_info.contract; - let list = list_of(&action); + let list = list_of(action); let Some(moderation) = contract.config().moderation() else { return refuse(ContractModerationNotEnabledError::new(contract_id, list).into()); @@ -150,7 +150,7 @@ impl ContractUserModerationStateTransitionStateValidationV0 for ContractUserMode ); } - let lists = lists_to_read(moderation, &action); + let lists = lists_to_read(moderation, action); let (fee, status) = platform.drive.fetch_contract_moderation_status_with_fee( contract_id, target_id, @@ -161,13 +161,13 @@ impl ContractUserModerationStateTransitionStateValidationV0 for ContractUserMode )?; execution_context.add_operation(ValidationOperation::PrecalculatedOperation(fee)); - if let Some(error) = refusal_for_status(&action, &status, contract_id, block_info) { + if let Some(error) = refusal_for_status(action, &status, contract_id, block_info) { return refuse(error); } Ok(ConsensusValidationResult::new_with_data( ContractUserModerationTransitionAction::from_borrowed_transition_with_status( - self, status, + self, &status, ) .into(), )) @@ -211,14 +211,13 @@ fn refusal_for_status( let target_id = action.identity_id(); match action { ContractUserModerationAction::Ban { .. } => status - .banned + .banned() .then(|| ContractUserAlreadyBannedError::new(contract_id, target_id).into()), - ContractUserModerationAction::Unban { .. } => { - (!status.banned).then(|| ContractUserNotBannedError::new(contract_id, target_id).into()) - } + ContractUserModerationAction::Unban { .. } => (!status.banned()) + .then(|| ContractUserNotBannedError::new(contract_id, target_id).into()), ContractUserModerationAction::Suspend { until, .. } => { // A suspend blocked by a ban is not a duplicate ban: it gets the "is banned" code. - if status.banned { + if status.banned() { return Some(ContractUserBannedError::new(contract_id, target_id).into()); } (*until <= block_info.time_ms).then(|| { @@ -232,7 +231,7 @@ fn refusal_for_status( }) } ContractUserModerationAction::Unsuspend { .. } => status - .suspended_until + .suspension .is_none() .then(|| ContractUserNotSuspendedError::new(contract_id, target_id).into()), } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/contract_user_moderation/tests.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/contract_user_moderation/tests.rs index 82fd3415268..e71715cf7b5 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/contract_user_moderation/tests.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/contract_user_moderation/tests.rs @@ -15,8 +15,9 @@ use dpp::consensus::ConsensusError; use dpp::dash_to_credits; use dpp::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; use dpp::data_contract::config::moderation::{ - ContractModerationConfig, ContractModerationList, ContractModerationListStatus, - ContractModerationListStatuses, ContractModerationStatus, ContractModerators, + ContractBan, ContractModerationConfig, ContractModerationList, ContractModerationListStatus, + ContractModerationListStatuses, ContractModerationReason, ContractModerationStatus, + ContractModerators, ContractSuspension, }; use dpp::data_contract::config::v2::DataContractConfigGettersV2; use dpp::data_contract::document_type::random_document::{ @@ -58,6 +59,7 @@ use std::collections::BTreeMap; const DATA_CONTRACT_NOT_PRESENT: u32 = 10400; const CONTRACT_MODERATION_SELF_TARGET: u32 = 10901; +const CONTRACT_MODERATION_REASON_TOO_LONG: u32 = 10903; const OVERFLOW: u32 = 10700; const CONTRACT_MODERATION_NOT_ENABLED: u32 = 41100; const IDENTITY_NOT_CONTRACT_MODERATOR: u32 = 41101; @@ -486,8 +488,39 @@ async fn moderation_by( .expect("expected to build the moderation transition") } +/// The reason `ban_action` gives: a text, no code. +fn ban_reason() -> ContractModerationReason { + ContractModerationReason::from_text("spam") +} + +/// The reason `suspend_action` gives: a text and a code, which nothing checks. +fn suspension_reason() -> ContractModerationReason { + ContractModerationReason { + code: Some(7), + text: "flooding".to_string(), + } +} + +/// The banlist entry `ban_action` leaves. +fn banned() -> Option { + Some(ContractBan { + reason: ban_reason(), + }) +} + +/// The suspension list entry `suspend_action` leaves. +fn suspended(until: TimestampMillis) -> Option { + Some(ContractSuspension { + until, + reason: suspension_reason(), + }) +} + fn ban_action(identity_id: Identifier) -> ContractUserModerationAction { - ContractUserModerationAction::Ban { identity_id } + ContractUserModerationAction::Ban { + identity_id, + reason: ban_reason(), + } } fn unban_action(identity_id: Identifier) -> ContractUserModerationAction { @@ -495,7 +528,11 @@ fn unban_action(identity_id: Identifier) -> ContractUserModerationAction { } fn suspend_action(identity_id: Identifier, until: TimestampMillis) -> ContractUserModerationAction { - ContractUserModerationAction::Suspend { identity_id, until } + ContractUserModerationAction::Suspend { + identity_id, + until, + reason: suspension_reason(), + } } fn unsuspend_action(identity_id: Identifier) -> ContractUserModerationAction { @@ -518,10 +555,8 @@ async fn should_ban_a_user_refuse_its_documents_and_let_them_through_again_after assert_eq!( setup.assert_execution_proved(&ban), ContractModerationListStatuses(vec![ - ContractModerationListStatus::Banlist { banned: true }, - ContractModerationListStatus::Suspensions { - suspended_until: None - }, + ContractModerationListStatus::Banlist { ban: banned() }, + ContractModerationListStatus::Suspensions { suspension: None }, ]) ); @@ -545,9 +580,7 @@ async fn should_ban_a_user_refuse_its_documents_and_let_them_through_again_after setup.commit(transaction); assert_eq!( setup.assert_execution_proved(&unban), - ContractModerationListStatuses(vec![ContractModerationListStatus::Banlist { - banned: false - }]) + ContractModerationListStatuses(vec![ContractModerationListStatus::Banlist { ban: None }]) ); } @@ -566,7 +599,7 @@ async fn should_suspend_until_a_block_time_and_sweep_the_suspension_once_it_laps assert_eq!( setup.assert_execution_proved(&suspend), ContractModerationListStatuses(vec![ContractModerationListStatus::Suspensions { - suspended_until: Some(until) + suspension: suspended(until) }]) ); @@ -614,7 +647,7 @@ async fn should_let_a_named_moderator_moderate_and_refuse_everyone_else() { let by_moderator = setup.moderate(&setup.moderator, ban_action(user_id)).await; assert_success(&setup.process(&by_moderator, &transaction)); - assert!(setup.status(user_id, Some(&transaction)).banned); + assert!(setup.status(user_id, Some(&transaction)).banned()); let owner_bans_moderator = setup.moderate(&setup.owner, ban_action(moderator_id)).await; assert_paid_with_code( @@ -701,7 +734,7 @@ async fn should_refuse_actions_that_do_not_fit_the_targets_status() { .await; assert_success(&setup.process(&suspend_again, &transaction)); assert_eq!( - setup.status(user_id, Some(&transaction)).suspended_until, + setup.status(user_id, Some(&transaction)).suspended_until(), Some(BLOCK_TIME_MS + 50) ); @@ -711,8 +744,8 @@ async fn should_refuse_actions_that_do_not_fit_the_targets_status() { assert_eq!( setup.status(user_id, Some(&transaction)), ContractModerationStatus { - banned: true, - suspended_until: None, + ban: banned(), + suspension: None, } ); let ban_again = setup.moderate(&setup.owner, ban_action(user_id)).await; @@ -894,10 +927,10 @@ async fn should_prove_only_the_edited_list_and_leave_the_other_unknown() { assert_eq!( setup.assert_execution_proved(&unsuspend), ContractModerationListStatuses(vec![ContractModerationListStatus::Suspensions { - suspended_until: None + suspension: None }]) ); - assert!(setup.status(user_id, None).banned); + assert!(setup.status(user_id, None).banned()); } #[tokio::test] @@ -1083,6 +1116,122 @@ async fn should_refuse_a_suspension_ending_past_the_json_safe_range() { assert_success(&setup.process(&latest, &transaction)); } +#[tokio::test] +async fn should_store_the_reason_of_a_ban_and_of_a_suspension_with_any_code() { + let setup = Setup::new(Some(moderation(true, true, THE_MODERATOR))).await; + let user_id = setup.user.id(); + let until = BLOCK_TIME_MS + 10_000; + + // No contract declares ban codes, so nothing checks the code a moderator writes. + let suspension_reason = ContractModerationReason { + code: Some(u16::MAX), + text: "flooding the feed".to_string(), + }; + let transaction = setup.platform.drive.grove.start_transaction(); + let suspend = setup + .moderate( + &setup.moderator, + ContractUserModerationAction::Suspend { + identity_id: user_id, + until, + reason: suspension_reason.clone(), + }, + ) + .await; + assert_success(&setup.process(&suspend, &transaction)); + assert_eq!( + setup.status(user_id, Some(&transaction)), + ContractModerationStatus { + ban: None, + suspension: Some(ContractSuspension { + until, + reason: suspension_reason, + }), + } + ); + + // An empty reason is a reason. + let ban = setup + .moderate( + &setup.owner, + ContractUserModerationAction::Ban { + identity_id: user_id, + reason: ContractModerationReason::default(), + }, + ) + .await; + assert_success(&setup.process(&ban, &transaction)); + assert_eq!( + setup.status(user_id, Some(&transaction)), + ContractModerationStatus { + ban: Some(ContractBan::default()), + suspension: None, + } + ); +} + +#[tokio::test] +async fn should_refuse_a_reason_longer_than_the_limit() { + let setup = Setup::new(Some(moderation(true, true, THE_MODERATOR))).await; + let user_id = setup.user.id(); + let max_length = PlatformVersion::latest() + .system_limits + .max_contract_moderation_reason_length as usize; + + let transaction = setup.platform.drive.grove.start_transaction(); + let too_long = setup + .moderate( + &setup.owner, + ContractUserModerationAction::Ban { + identity_id: user_id, + reason: ContractModerationReason::from_text("x".repeat(max_length + 1)), + }, + ) + .await; + assert_unpaid_with_code( + &setup.process(&too_long, &transaction), + CONTRACT_MODERATION_REASON_TOO_LONG, + ); + let too_long_suspension = setup + .moderate( + &setup.owner, + ContractUserModerationAction::Suspend { + identity_id: user_id, + until: BLOCK_TIME_MS + 10_000, + reason: ContractModerationReason::from_text("x".repeat(max_length + 1)), + }, + ) + .await; + assert_unpaid_with_code( + &setup.process(&too_long_suspension, &transaction), + CONTRACT_MODERATION_REASON_TOO_LONG, + ); + + // The limit itself is fine, and the moderator pays for every byte of it. + let storage_fee_of = |execution: StateTransitionExecutionResult| match execution { + StateTransitionExecutionResult::SuccessfulExecution { fee_result, .. } => { + fee_result.storage_fee + } + other => panic!("expected a successful execution, got {other:?}"), + }; + let short = setup.moderate(&setup.owner, ban_action(user_id)).await; + let short_fee = storage_fee_of(setup.process(&short, &transaction)); + let longest = setup + .moderate( + &setup.owner, + ContractUserModerationAction::Ban { + identity_id: setup.stranger.id(), + reason: ContractModerationReason::from_text("x".repeat(max_length)), + }, + ) + .await; + let longest_fee = storage_fee_of(setup.process(&longest, &transaction)); + assert!( + longest_fee > short_fee, + "{longest_fee} for the longest reason, {short_fee} for a short one" + ); +} + #[tokio::test] async fn should_charge_the_same_fee_whether_or_not_the_contract_is_cached() { let setup = Setup::new(Some(moderation(true, true, THE_MODERATOR))).await; @@ -1193,10 +1342,8 @@ async fn should_prove_that_a_ban_removed_the_suspension() { assert_eq!( setup.assert_execution_proved(&ban), ContractModerationListStatuses(vec![ - ContractModerationListStatus::Banlist { banned: true }, - ContractModerationListStatus::Suspensions { - suspended_until: None - }, + ContractModerationListStatus::Banlist { ban: banned() }, + ContractModerationListStatus::Suspensions { suspension: None }, ]) ); } diff --git a/packages/rs-drive-abci/src/query/contract_moderation_queries/contract_moderation_entries/v0/mod.rs b/packages/rs-drive-abci/src/query/contract_moderation_queries/contract_moderation_entries/v0/mod.rs index be7567ca8f0..9a2d135b36c 100644 --- a/packages/rs-drive-abci/src/query/contract_moderation_queries/contract_moderation_entries/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/contract_moderation_queries/contract_moderation_entries/v0/mod.rs @@ -2,7 +2,9 @@ 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::contract_moderation_queries::{identifier_from_request, list_from_request}; +use crate::query::contract_moderation_queries::{ + identifier_from_request, list_from_request, reason_to_response, +}; use crate::query::response_metadata::CheckpointUsed; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_contract_moderation_entries_request::GetContractModerationEntriesRequestV0; @@ -101,6 +103,7 @@ impl Platform { .map(|entry| ContractModerationEntryProto { identity_id: entry.identity_id.to_vec(), until: entry.until, + reason: Some(reason_to_response(entry.reason)), }) .collect(), }, @@ -118,12 +121,16 @@ impl Platform { mod tests { use super::*; use crate::query::contract_moderation_queries::tests::{ - ban, store_contract, suspend, BANLIST, SUSPENSIONS, + ban, store_contract, suspend, BANLIST, BAN_REASON, SUSPENSIONS, SUSPENSION_REASON, + SUSPENSION_REASON_CODE, }; use crate::query::tests::setup_platform; + use dapi_grpc::platform::v0::ContractModerationReason as ContractModerationReasonProto; use dpp::dashcore::Network; use dpp::data_contract::accessors::v0::DataContractV0Getters; - use dpp::data_contract::config::moderation::ContractModerationList; + use dpp::data_contract::config::moderation::{ + ContractModerationList, ContractModerationReason, + }; use dpp::identifier::Identifier; use drive::drive::contract::moderation::types::ContractModerationEntry; use drive::drive::Drive; @@ -269,30 +276,46 @@ mod tests { }; page.entries .into_iter() - .map(|entry| (entry.identity_id, entry.until)) + .map(|entry| (entry.identity_id, entry.until, entry.reason)) .collect::>() }; + let ban_reason = || { + Some(ContractModerationReasonProto { + code: None, + text: BAN_REASON.to_string(), + }) + }; // No limit is the default page, in identity id order. assert_eq!( entries(BANLIST, None, None), vec![ - (first.to_vec(), None), - (second.to_vec(), None), - (third.to_vec(), None) + (first.to_vec(), None, ban_reason()), + (second.to_vec(), None, ban_reason()), + (third.to_vec(), None, ban_reason()) ] ); assert_eq!( entries(BANLIST, None, Some(2)), - vec![(first.to_vec(), None), (second.to_vec(), None)] + vec![ + (first.to_vec(), None, ban_reason()), + (second.to_vec(), None, ban_reason()) + ] ); assert_eq!( entries(BANLIST, Some(second), Some(2)), - vec![(third.to_vec(), None)] + vec![(third.to_vec(), None, ban_reason())] ); assert_eq!( entries(SUSPENSIONS, None, None), - vec![(second.to_vec(), Some(1_234))] + vec![( + second.to_vec(), + Some(1_234), + Some(ContractModerationReasonProto { + code: Some(SUSPENSION_REASON_CODE as u32), + text: SUSPENSION_REASON.to_string(), + }) + )] ); let result = platform @@ -330,11 +353,13 @@ mod tests { vec![ ContractModerationEntry { identity_id: second, - until: None + until: None, + reason: ContractModerationReason::from_text(BAN_REASON), }, ContractModerationEntry { identity_id: third, - until: None + until: None, + reason: ContractModerationReason::from_text(BAN_REASON), } ] ); diff --git a/packages/rs-drive-abci/src/query/contract_moderation_queries/contract_moderation_status/v0/mod.rs b/packages/rs-drive-abci/src/query/contract_moderation_queries/contract_moderation_status/v0/mod.rs index 8160672b2a5..37714150fbb 100644 --- a/packages/rs-drive-abci/src/query/contract_moderation_queries/contract_moderation_status/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/contract_moderation_queries/contract_moderation_status/v0/mod.rs @@ -3,7 +3,7 @@ use crate::error::Error; use crate::platform_types::platform::Platform; use crate::platform_types::platform_state::PlatformState; use crate::query::contract_moderation_queries::{ - identifier_from_request, list_from_request, list_to_request, + identifier_from_request, list_from_request, list_to_request, reason_to_response, }; use crate::query::response_metadata::CheckpointUsed; use crate::query::QueryValidationResult; @@ -103,8 +103,12 @@ impl Platform { ContractModerationStatusProto { banned: requested .contains(&ContractModerationList::Banlist) - .then_some(status.banned), - suspended_until: status.suspended_until, + .then_some(status.banned()), + suspended_until: status.suspended_until(), + ban_reason: status.ban.map(|ban| reason_to_response(ban.reason)), + suspension_reason: status + .suspension + .map(|suspension| reason_to_response(suspension.reason)), lists: requested .iter() .map(|list| list_to_request(*list)) @@ -123,13 +127,15 @@ impl Platform { mod tests { use super::*; use crate::query::contract_moderation_queries::tests::{ - ban, store_contract, suspend, BANLIST, SUSPENSIONS, + ban, store_contract, suspend, BANLIST, BAN_REASON, SUSPENSIONS, SUSPENSION_REASON, + SUSPENSION_REASON_CODE, }; use crate::query::tests::setup_platform; use dpp::dashcore::Network; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::config::moderation::{ - ContractModerationListStatuses, ContractModerationStatus, + ContractBan, ContractModerationListStatuses, ContractModerationReason, + ContractModerationStatus, ContractSuspension, }; use dpp::identifier::Identifier; use drive::drive::Drive; @@ -264,15 +270,23 @@ mod tests { ( banned, ContractModerationStatus { - banned: true, - suspended_until: None, + ban: Some(ContractBan { + reason: ContractModerationReason::from_text(BAN_REASON), + }), + suspension: None, }, ), ( suspended, ContractModerationStatus { - banned: false, - suspended_until: Some(1_234), + ban: None, + suspension: Some(ContractSuspension { + until: 1_234, + reason: ContractModerationReason { + code: Some(SUSPENSION_REASON_CODE), + text: SUSPENSION_REASON.to_string(), + }, + }), }, ), (clean, ContractModerationStatus::default()), @@ -303,9 +317,23 @@ mod tests { else { panic!("expected a status"); }; - assert_eq!(status.banned, Some(expected.banned)); + assert_eq!(status.banned, Some(expected.banned())); assert_eq!(status.lists, vec![BANLIST, SUSPENSIONS]); - assert_eq!(status.suspended_until, expected.suspended_until); + assert_eq!(status.suspended_until, expected.suspended_until()); + assert_eq!( + status.ban_reason, + expected + .ban + .clone() + .map(|ban| reason_to_response(ban.reason)) + ); + assert_eq!( + status.suspension_reason, + expected + .suspension + .clone() + .map(|suspension| reason_to_response(suspension.reason)) + ); let result = platform .query_contract_moderation_status_v0( diff --git a/packages/rs-drive-abci/src/query/contract_moderation_queries/mod.rs b/packages/rs-drive-abci/src/query/contract_moderation_queries/mod.rs index f4c12ad6c17..9327e9dd011 100644 --- a/packages/rs-drive-abci/src/query/contract_moderation_queries/mod.rs +++ b/packages/rs-drive-abci/src/query/contract_moderation_queries/mod.rs @@ -8,8 +8,9 @@ use crate::error::query::QueryError; use crate::error::Error; use crate::platform_types::platform::Platform; use dapi_grpc::platform::v0::ContractModerationList as ContractModerationListProto; +use dapi_grpc::platform::v0::ContractModerationReason as ContractModerationReasonProto; use dpp::data_contract::accessors::v0::DataContractV0Getters; -use dpp::data_contract::config::moderation::ContractModerationList; +use dpp::data_contract::config::moderation::{ContractModerationList, ContractModerationReason}; use dpp::data_contract::config::v2::DataContractConfigGettersV2; use dpp::identifier::Identifier; use dpp::version::PlatformVersion; @@ -49,6 +50,16 @@ pub(super) fn list_to_request(list: ContractModerationList) -> i32 { } } +/// A reason as the wire carries it. +pub(super) fn reason_to_response( + reason: ContractModerationReason, +) -> ContractModerationReasonProto { + ContractModerationReasonProto { + code: reason.code.map(u32::from), + text: reason.text, + } +} + impl Platform { /// The moderation lists the contract keeps, or a query error when the contract does not /// exist or keeps no list. A list the contract does not keep has no tree, so a query over @@ -87,7 +98,9 @@ pub(super) mod tests { use crate::test::helpers::setup::TempPlatform; use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; - use dpp::data_contract::config::moderation::{ContractModerationConfig, ContractModerators}; + use dpp::data_contract::config::moderation::{ + ContractModerationConfig, ContractModerationReason, ContractModerators, + }; use dpp::data_contract::DataContract; use dpp::identifier::Identifier; use dpp::tests::fixtures::get_data_contract_fixture; @@ -95,6 +108,11 @@ pub(super) mod tests { pub const BANLIST: i32 = 1; pub const SUSPENSIONS: i32 = 2; + /// The reason [`ban`] gives. + pub const BAN_REASON: &str = "spam"; + /// The reason [`suspend`] gives, with a code. + pub const SUSPENSION_REASON: &str = "flooding"; + pub const SUSPENSION_REASON_CODE: u16 = 7; /// Stores a contract that keeps the lists asked for (none: an unmoderated contract). pub fn store_contract( @@ -126,6 +144,7 @@ pub(super) mod tests { .add_contract_ban( contract.id(), target, + &ContractModerationReason::from_text(BAN_REASON), contract.owner_id(), &BlockInfo::default(), true, @@ -148,6 +167,10 @@ pub(super) mod tests { contract.id(), target, until, + &ContractModerationReason { + code: Some(SUSPENSION_REASON_CODE), + text: SUSPENSION_REASON.to_string(), + }, false, contract.owner_id(), &BlockInfo::default(), diff --git a/packages/rs-drive-proof-verifier/src/types/contract_moderation.rs b/packages/rs-drive-proof-verifier/src/types/contract_moderation.rs index 80995bb0a42..ae6a71ae87e 100644 --- a/packages/rs-drive-proof-verifier/src/types/contract_moderation.rs +++ b/packages/rs-drive-proof-verifier/src/types/contract_moderation.rs @@ -6,9 +6,11 @@ use crate::Error; use dapi_grpc::platform::v0::get_contract_moderation_entries_response::ContractModerationEntry as ContractModerationEntryProto; use dapi_grpc::platform::v0::ContractModerationList as ContractModerationListProto; +use dapi_grpc::platform::v0::ContractModerationReason as ContractModerationReasonProto; pub use dpp::data_contract::config::moderation::{ - ContractModerationList, ContractModerationListStatus, ContractModerationListStatuses, - ContractModerationStatus, + ContractBan, ContractModerationList, ContractModerationListStatus, + ContractModerationListStatuses, ContractModerationReason, ContractModerationStatus, + ContractSuspension, }; use dpp::identifier::Identifier; use dpp::version::PlatformVersion; @@ -131,6 +133,28 @@ pub fn entries_query_from_request( }) } +/// The reason of an unproved response. Every ban and every suspension carries one, so a +/// response without it is refused, and so is a code that is not a u16, which no entry of any +/// version can hold. The length of the text is not checked: its limit belongs to a protocol +/// version and may be raised by a later one, the proved path reads whatever the proof holds, +/// and the two must agree on which stored reasons a client can read. +pub fn reason_from_response( + reason: Option, +) -> Result { + let ContractModerationReasonProto { code, text } = + reason.ok_or(Error::ResponseDecodeError { + error: "contract moderation entry holds no reason".to_string(), + })?; + let code = code + .map(|code| { + u16::try_from(code).map_err(|_| Error::ResponseDecodeError { + error: format!("contract moderation reason code {code} is not a u16"), + }) + }) + .transpose()?; + Ok(ContractModerationReason { code, text }) +} + /// The entries of an unproved response. pub fn entries_from_response( entries: Vec, @@ -148,6 +172,7 @@ pub fn entries_from_response( } })?, until: entry.until, + reason: reason_from_response(entry.reason)?, }) }) .collect::, Error>>() @@ -167,8 +192,10 @@ mod tests { // A banned identity, read on the suspension list alone: not suspended, and nothing // said about the banlist. let banned = ContractModerationStatus { - banned: true, - suspended_until: None, + ban: Some(ContractBan { + reason: ContractModerationReason::from_text("spam"), + }), + suspension: None, }; let suspensions_only = ContractModerationListStatuses::from_status( &[ContractModerationList::Suspensions], @@ -191,8 +218,11 @@ mod tests { let suspended = ContractModerationListStatuses::from_status( &[ContractModerationList::Suspensions], &ContractModerationStatus { - banned: false, - suspended_until: Some(10), + ban: None, + suspension: Some(ContractSuspension { + until: 10, + reason: ContractModerationReason::from_text("flooding"), + }), }, ); assert!(suspended.is_barred_on_queried_lists_at(9)); @@ -283,10 +313,18 @@ mod tests { ContractModerationEntryProto { identity_id: id(1).to_vec(), until: None, + reason: Some(ContractModerationReasonProto { + code: None, + text: "spam".to_string(), + }), }, ContractModerationEntryProto { identity_id: id(2).to_vec(), until: Some(99), + reason: Some(ContractModerationReasonProto { + code: Some(3), + text: String::new(), + }), }, ]) .expect("expected entries"); @@ -295,11 +333,16 @@ mod tests { &[ ContractModerationEntry { identity_id: id(1), - until: None + until: None, + reason: ContractModerationReason::from_text("spam"), }, ContractModerationEntry { identity_id: id(2), - until: Some(99) + until: Some(99), + reason: ContractModerationReason { + code: Some(3), + text: String::new(), + }, } ] ); @@ -307,9 +350,35 @@ mod tests { let err = entries_from_response(vec![ContractModerationEntryProto { identity_id: vec![1; 5], until: None, + reason: Some(ContractModerationReasonProto::default()), }]) .unwrap_err(); assert!(matches!(err, Error::ProtocolError { .. }), "got: {err:?}"); + + // Every entry carries a reason + let err = entries_from_response(vec![ContractModerationEntryProto { + identity_id: id(1).to_vec(), + until: None, + reason: None, + }]) + .unwrap_err(); + assert!( + matches!(err, Error::ResponseDecodeError { .. }), + "got: {err:?}" + ); + + // The text is not bounded here: its limit is a protocol version's, and the proved path + // reads whatever the proof holds + let long = entries_from_response(vec![ContractModerationEntryProto { + identity_id: id(1).to_vec(), + until: None, + reason: Some(ContractModerationReasonProto { + code: None, + text: "x".repeat(4096), + }), + }]) + .expect("expected a long reason to decode"); + assert_eq!(long.entries()[0].reason.text.len(), 4096); } #[test] @@ -323,10 +392,12 @@ mod tests { ContractModerationEntry { identity_id: id(1), until: Some(5), + reason: ContractModerationReason::default(), }, ContractModerationEntry { identity_id: id(2), until: Some(6), + reason: ContractModerationReason::default(), }, ]); assert_eq!( @@ -345,6 +416,7 @@ mod tests { let short = ContractModerationEntries(vec![ContractModerationEntry { identity_id: id(1), until: Some(5), + reason: ContractModerationReason::default(), }]); assert_eq!(short.next_query(&query), None); } diff --git a/packages/rs-drive-proof-verifier/src/unproved.rs b/packages/rs-drive-proof-verifier/src/unproved.rs index 67b79657279..26349f0739e 100644 --- a/packages/rs-drive-proof-verifier/src/unproved.rs +++ b/packages/rs-drive-proof-verifier/src/unproved.rs @@ -4,8 +4,9 @@ use crate::types::contract_groups::{ ContractGroupMembershipsForContract, }; use crate::types::contract_moderation::{ - entries_from_response, list_from_request, lists_from_request, ContractModerationEntries, - ContractModerationList, ContractModerationListStatuses, ContractModerationStatus, + entries_from_response, list_from_request, lists_from_request, reason_from_response, + ContractBan, ContractModerationEntries, ContractModerationList, ContractModerationListStatuses, + ContractModerationStatus, ContractSuspension, }; use crate::types::data_contracts_latest_versions::{ DataContractLatestVersion, DataContractsLatestVersions, @@ -934,12 +935,23 @@ impl FromUnproved for ContractMode } None => false, }; + // An entry comes with its reason. Only the lists asked for are decoded, since + // only they are reported. + let ban = (banned && lists.contains(&ContractModerationList::Banlist)) + .then(|| reason_from_response(status.ban_reason)) + .transpose()? + .map(|reason| ContractBan { reason }); + let suspension = status + .suspended_until + .filter(|_| lists.contains(&ContractModerationList::Suspensions)) + .map(|until| { + reason_from_response(status.suspension_reason) + .map(|reason| ContractSuspension { until, reason }) + }) + .transpose()?; Some(ContractModerationListStatuses::from_status( &lists, - &ContractModerationStatus { - banned, - suspended_until: status.suspended_until, - }, + &ContractModerationStatus { ban, suspension }, )) } Some(V0Result::Proof(_)) => { @@ -1393,6 +1405,7 @@ mod contract_groups_tests { #[cfg(test)] mod contract_moderation_tests { use super::*; + use crate::types::contract_moderation::ContractModerationReason; use dapi_grpc::platform::v0::get_contract_moderation_status_request::{ GetContractModerationStatusRequestV0, Version as StatusRequestVersion, }; @@ -1401,6 +1414,7 @@ mod contract_moderation_tests { ContractModerationStatus as ContractModerationStatusProto, GetContractModerationStatusResponseV0, Version as StatusResponseVersion, }; + use dapi_grpc::platform::v0::ContractModerationReason as ContractModerationReasonProto; use dapi_grpc::platform::v0::ResponseMetadata; use dpp::dashcore::Network; use dpp::version::PlatformVersion; @@ -1447,6 +1461,14 @@ mod contract_moderation_tests { banned: Some(true), suspended_until: Some(7), lists: vec![BANLIST, SUSPENSIONS], + ban_reason: Some(ContractModerationReasonProto { + code: None, + text: "spam".to_string(), + }), + suspension_reason: Some(ContractModerationReasonProto { + code: Some(9), + text: "flooding".to_string(), + }), }, ) .expect("expected the status to convert") @@ -1454,6 +1476,58 @@ mod contract_moderation_tests { assert_eq!(statuses.banned(), Some(true)); assert_eq!(statuses.suspended_until(), Some(Some(7))); + assert_eq!( + statuses.ban().flatten().map(|ban| &ban.reason), + Some(&ContractModerationReason::from_text("spam")) + ); + assert_eq!( + statuses.suspension().flatten().map(|entry| &entry.reason), + Some(&ContractModerationReason { + code: Some(9), + text: "flooding".to_string(), + }) + ); + } + + #[test] + fn should_refuse_an_entry_without_a_reason_or_with_a_code_past_u16() { + let no_reason = status( + vec![BANLIST], + ContractModerationStatusProto { + banned: Some(true), + lists: vec![BANLIST], + ..Default::default() + }, + ); + assert!(matches!(no_reason, Err(Error::ResponseDecodeError { .. }))); + + let wide_code = status( + vec![SUSPENSIONS], + ContractModerationStatusProto { + suspended_until: Some(7), + lists: vec![SUSPENSIONS], + suspension_reason: Some(ContractModerationReasonProto { + code: Some(u16::MAX as u32 + 1), + text: String::new(), + }), + ..Default::default() + }, + ); + assert!(matches!(wide_code, Err(Error::ResponseDecodeError { .. }))); + + // A clean identity has no reason to give. + let clean = status( + vec![BANLIST, SUSPENSIONS], + ContractModerationStatusProto { + banned: Some(false), + lists: vec![BANLIST, SUSPENSIONS], + ..Default::default() + }, + ) + .expect("expected the status to convert") + .expect("expected a status"); + assert_eq!(clean.ban(), Some(None)); + assert_eq!(clean.suspension(), Some(None)); } #[test] @@ -1463,9 +1537,8 @@ mod contract_moderation_tests { let uncovered = status( vec![BANLIST, SUSPENSIONS], ContractModerationStatusProto { - banned: None, - suspended_until: None, lists: vec![SUSPENSIONS], + ..Default::default() }, ); assert!(matches!(uncovered, Err(Error::ResponseDecodeError { .. }))); @@ -1473,9 +1546,8 @@ mod contract_moderation_tests { let covered_but_unset = status( vec![BANLIST], ContractModerationStatusProto { - banned: None, - suspended_until: None, lists: vec![BANLIST], + ..Default::default() }, ); assert!(matches!( diff --git a/packages/rs-drive/grovedb-structure.json b/packages/rs-drive/grovedb-structure.json index 4705977f688..61a16026088 100644 --- a/packages/rs-drive/grovedb-structure.json +++ b/packages/rs-drive/grovedb-structure.json @@ -2850,12 +2850,12 @@ "flags": [ "EpochOwned" ], - "flags_note": "The owner is the moderator who added the entry. They pay for it, and are refunded when it is removed.", - "value": "empty; the key carries the information", + "flags_note": "The owner is the moderator who added the entry. They pay for it, and are refunded when it is removed. A suspension replaced with a longer reason passes to the moderator who replaced it, who pays for the added bytes; replaced with a shorter or an equally long one it stays the first moderator's, who is refunded the removed bytes.", + "value": "the moderator's reason: a tag byte (0 no code, 1 a code), the code as a u16 big endian when tagged, then the text as UTF-8 to the end of the value", "since": 14, "presence": "always", "source": "packages/rs-drive/src/drive/contract/paths.rs", - "description": "One ban, until an unban.", + "description": "One ban and why, until an unban.", "children": [] } ] @@ -2894,12 +2894,12 @@ "flags": [ "EpochOwned" ], - "flags_note": "The owner is the moderator who added the entry. They pay for it, and are refunded when it is removed.", - "value": "the block time in milliseconds the suspension runs until, u64 big endian", + "flags_note": "The owner is the moderator who added the entry. They pay for it, and are refunded when it is removed. A suspension replaced with a longer reason passes to the moderator who replaced it, who pays for the added bytes; replaced with a shorter or an equally long one it stays the first moderator's, who is refunded the removed bytes.", + "value": "the block time in milliseconds the suspension runs until, u64 big endian, then the moderator's reason as in a banlist entry", "since": 14, "presence": "always", "source": "packages/rs-drive/src/drive/contract/paths.rs", - "description": "One suspension. A lapsed one stays until the identity's next document transition sweeps it.", + "description": "One suspension and why. A lapsed one stays until the identity's next document transition sweeps it.", "children": [] } ] diff --git a/packages/rs-drive/src/drive/contract/moderation/add_contract_ban/mod.rs b/packages/rs-drive/src/drive/contract/moderation/add_contract_ban/mod.rs index 34f51f08bf4..18cc6d0e4c3 100644 --- a/packages/rs-drive/src/drive/contract/moderation/add_contract_ban/mod.rs +++ b/packages/rs-drive/src/drive/contract/moderation/add_contract_ban/mod.rs @@ -5,6 +5,7 @@ use crate::error::drive::DriveError; use crate::error::Error; use crate::fees::op::LowLevelDriveOperation; use dpp::block::block_info::BlockInfo; +use dpp::data_contract::config::moderation::ContractModerationReason; use dpp::fee::fee_result::FeeResult; use dpp::identifier::Identifier; use dpp::version::PlatformVersion; @@ -13,8 +14,8 @@ use grovedb::{EstimatedLayerInformation, TransactionArg}; use std::collections::HashMap; impl Drive { - /// Puts `identity_id` on the banlist of `contract_id`, paid by `moderator_id`, whose - /// identity the entry's storage flags name for the refund on removal. + /// Puts `identity_id` on the banlist of `contract_id` for `reason`, paid by `moderator_id`, + /// whose identity the entry's storage flags name for the refund on removal. /// /// The caller must have checked that the contract keeps a banlist and that the identity is /// not on it. Applies the operations when `apply` is true, otherwise only estimates. @@ -23,6 +24,7 @@ impl Drive { /// /// * `contract_id`: The moderated contract. /// * `identity_id`: The identity to ban. + /// * `reason`: Why, stored as the entry's value. Its length is the caller's to check. /// * `moderator_id`: The identity that pays for the entry. /// * `block_info`: The current block. /// * `apply`: Whether to apply or only estimate. @@ -38,6 +40,7 @@ impl Drive { &self, contract_id: Identifier, identity_id: Identifier, + reason: &ContractModerationReason, moderator_id: Identifier, block_info: &BlockInfo, apply: bool, @@ -54,6 +57,7 @@ impl Drive { 0 => self.add_contract_ban_v0( contract_id, identity_id, + reason, moderator_id, block_info, apply, @@ -75,6 +79,7 @@ impl Drive { /// /// * `contract_id`: The moderated contract. /// * `identity_id`: The identity to ban. + /// * `reason`: Why, stored as the entry's value. Its length is the caller's to check. /// * `moderator_id`: The identity that pays for the entry. /// * `block_info`: The current block. /// * `estimated_costs_only_with_layer_info`: The estimation map for a dry run. @@ -90,6 +95,7 @@ impl Drive { &self, contract_id: Identifier, identity_id: Identifier, + reason: &ContractModerationReason, moderator_id: Identifier, block_info: &BlockInfo, estimated_costs_only_with_layer_info: &mut Option< @@ -108,6 +114,7 @@ impl Drive { 0 => self.add_contract_ban_operations_v0( contract_id, identity_id, + reason, moderator_id, block_info, estimated_costs_only_with_layer_info, diff --git a/packages/rs-drive/src/drive/contract/moderation/add_contract_ban/v0/mod.rs b/packages/rs-drive/src/drive/contract/moderation/add_contract_ban/v0/mod.rs index 17fc4d32c6b..93f32f77714 100644 --- a/packages/rs-drive/src/drive/contract/moderation/add_contract_ban/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/moderation/add_contract_ban/v0/mod.rs @@ -1,3 +1,4 @@ +use crate::drive::contract::moderation::types::encode_ban; use crate::drive::contract::paths::contract_moderation_list_path; use crate::drive::Drive; use crate::error::Error; @@ -5,7 +6,7 @@ use crate::fees::op::LowLevelDriveOperation; use crate::util::object_size_info::PathKeyElementInfo::PathFixedSizeKeyRefElement; use crate::util::storage_flags::StorageFlags; use dpp::block::block_info::BlockInfo; -use dpp::data_contract::config::moderation::ContractModerationList; +use dpp::data_contract::config::moderation::{ContractModerationList, ContractModerationReason}; use dpp::fee::fee_result::FeeResult; use dpp::identifier::Identifier; use dpp::version::PlatformVersion; @@ -21,6 +22,7 @@ impl Drive { &self, contract_id: Identifier, identity_id: Identifier, + reason: &ContractModerationReason, moderator_id: Identifier, block_info: &BlockInfo, apply: bool, @@ -36,6 +38,7 @@ impl Drive { let batch_operations = self.add_contract_ban_operations_v0( contract_id, identity_id, + reason, moderator_id, block_info, &mut estimated_costs_only_with_layer_info, @@ -62,14 +65,15 @@ impl Drive { ) } - /// A ban is an empty item under the identity's id, flagged with the moderator's identity - /// so the storage refund on removal goes back to whoever paid. + /// A ban is its reason under the identity's id, flagged with the moderator's identity so + /// the storage refund on removal goes back to whoever paid. #[inline(always)] #[allow(clippy::too_many_arguments)] pub(super) fn add_contract_ban_operations_v0( &self, contract_id: Identifier, identity_id: Identifier, + reason: &ContractModerationReason, moderator_id: Identifier, block_info: &BlockInfo, estimated_costs_only_with_layer_info: &mut Option< @@ -98,7 +102,10 @@ impl Drive { ContractModerationList::Banlist, ), identity_id.as_slice(), - Element::new_item_with_flags(vec![], storage_flags.to_some_element_flags()), + Element::new_item_with_flags( + encode_ban(reason), + storage_flags.to_some_element_flags(), + ), )), &mut batch_operations, &platform_version.drive, diff --git a/packages/rs-drive/src/drive/contract/moderation/add_contract_suspension/mod.rs b/packages/rs-drive/src/drive/contract/moderation/add_contract_suspension/mod.rs index e01818795a8..27edb72855a 100644 --- a/packages/rs-drive/src/drive/contract/moderation/add_contract_suspension/mod.rs +++ b/packages/rs-drive/src/drive/contract/moderation/add_contract_suspension/mod.rs @@ -5,6 +5,7 @@ use crate::error::drive::DriveError; use crate::error::Error; use crate::fees::op::LowLevelDriveOperation; use dpp::block::block_info::BlockInfo; +use dpp::data_contract::config::moderation::ContractModerationReason; use dpp::fee::fee_result::FeeResult; use dpp::identifier::Identifier; use dpp::identity::TimestampMillis; @@ -25,6 +26,8 @@ impl Drive { /// * `contract_id`: The moderated contract. /// * `identity_id`: The identity to suspend. /// * `until`: The block time, in milliseconds, at which the suspension lapses. + /// * `reason`: Why, stored after `until` in the entry's value. Its length is the caller's + /// to check. /// * `replaces_existing`: Whether an entry for the identity exists and is replaced. /// * `moderator_id`: The identity that pays for the entry. /// * `block_info`: The current block. @@ -42,6 +45,7 @@ impl Drive { contract_id: Identifier, identity_id: Identifier, until: TimestampMillis, + reason: &ContractModerationReason, replaces_existing: bool, moderator_id: Identifier, block_info: &BlockInfo, @@ -60,6 +64,7 @@ impl Drive { contract_id, identity_id, until, + reason, replaces_existing, moderator_id, block_info, @@ -83,6 +88,8 @@ impl Drive { /// * `contract_id`: The moderated contract. /// * `identity_id`: The identity to suspend. /// * `until`: The block time, in milliseconds, at which the suspension lapses. + /// * `reason`: Why, stored after `until` in the entry's value. Its length is the caller's + /// to check. /// * `replaces_existing`: Whether an entry for the identity exists and is replaced. /// * `moderator_id`: The identity that pays for the entry. /// * `block_info`: The current block. @@ -100,6 +107,7 @@ impl Drive { contract_id: Identifier, identity_id: Identifier, until: TimestampMillis, + reason: &ContractModerationReason, replaces_existing: bool, moderator_id: Identifier, block_info: &BlockInfo, @@ -120,6 +128,7 @@ impl Drive { contract_id, identity_id, until, + reason, replaces_existing, moderator_id, block_info, diff --git a/packages/rs-drive/src/drive/contract/moderation/add_contract_suspension/v0/mod.rs b/packages/rs-drive/src/drive/contract/moderation/add_contract_suspension/v0/mod.rs index 92d8c12363a..e4a41d85867 100644 --- a/packages/rs-drive/src/drive/contract/moderation/add_contract_suspension/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/moderation/add_contract_suspension/v0/mod.rs @@ -1,4 +1,4 @@ -use crate::drive::contract::moderation::types::encode_until; +use crate::drive::contract::moderation::types::encode_suspension; use crate::drive::contract::paths::contract_moderation_list_path; use crate::drive::Drive; use crate::error::Error; @@ -6,7 +6,7 @@ use crate::fees::op::LowLevelDriveOperation; use crate::util::object_size_info::PathKeyElementInfo::PathFixedSizeKeyRefElement; use crate::util::storage_flags::StorageFlags; use dpp::block::block_info::BlockInfo; -use dpp::data_contract::config::moderation::ContractModerationList; +use dpp::data_contract::config::moderation::{ContractModerationList, ContractModerationReason}; use dpp::fee::fee_result::FeeResult; use dpp::identifier::Identifier; use dpp::identity::TimestampMillis; @@ -24,6 +24,7 @@ impl Drive { contract_id: Identifier, identity_id: Identifier, until: TimestampMillis, + reason: &ContractModerationReason, replaces_existing: bool, moderator_id: Identifier, block_info: &BlockInfo, @@ -41,6 +42,7 @@ impl Drive { contract_id, identity_id, until, + reason, replaces_existing, moderator_id, block_info, @@ -68,9 +70,17 @@ impl Drive { ) } - /// A suspension is `until` as eight big-endian bytes under the identity's id, flagged with - /// the moderator's identity so the storage refund on removal goes back to whoever paid. An - /// existing entry is replaced in place; two operations on one key would fail the batch. + /// A suspension is `until` as eight big-endian bytes, then its reason, under the identity's + /// id, flagged with the moderator's identity so the storage refund on removal goes back to + /// whoever paid. An existing entry is replaced in place; two operations on one key would + /// fail the batch. The replacement brings its own reason, so the entry may change size, and + /// its flags follow GroveDB's flag merge: a longer entry passes, with the refund of its + /// removal, to the moderator that replaced it, who pays for the added bytes; a shorter or + /// an equally long one stays the first moderator's, who is refunded the removed bytes. + /// + /// An estimate prices the replacement as a fresh insert. GroveDB's average-case replace + /// assumes an item keeps its size and would price no storage for a longer reason, which + /// the moderator's balance is then not checked against; the whole entry is an upper bound. #[inline(always)] #[allow(clippy::too_many_arguments)] pub(super) fn add_contract_suspension_operations_v0( @@ -78,6 +88,7 @@ impl Drive { contract_id: Identifier, identity_id: Identifier, until: TimestampMillis, + reason: &ContractModerationReason, replaces_existing: bool, moderator_id: Identifier, block_info: &BlockInfo, @@ -87,6 +98,7 @@ impl Drive { _transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result, Error> { + let estimating = estimated_costs_only_with_layer_info.is_some(); if let Some(estimated_costs_only_with_layer_info) = estimated_costs_only_with_layer_info { Drive::add_estimation_costs_for_contract_moderation_entry( contract_id.to_buffer(), @@ -106,13 +118,13 @@ impl Drive { ), identity_id.as_slice(), Element::new_item_with_flags( - encode_until(until), + encode_suspension(until, reason), storage_flags.to_some_element_flags(), ), )); let mut batch_operations: Vec = vec![]; - if replaces_existing { + if replaces_existing && !estimating { self.batch_replace( path_key_element, &mut batch_operations, diff --git a/packages/rs-drive/src/drive/contract/moderation/estimated_costs/v0/mod.rs b/packages/rs-drive/src/drive/contract/moderation/estimated_costs/v0/mod.rs index ae66256e133..d9fcd90ff23 100644 --- a/packages/rs-drive/src/drive/contract/moderation/estimated_costs/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/moderation/estimated_costs/v0/mod.rs @@ -1,4 +1,4 @@ -use crate::drive::contract::moderation::CONTRACT_SUSPENSION_VALUE_SIZE; +use crate::drive::contract::moderation::types::estimated_entry_value_size; use crate::drive::contract::paths::contract_moderation_list_path; use crate::drive::Drive; use crate::error::Error; @@ -44,12 +44,10 @@ impl Drive { drive_version, )?; - let value_size = match list { - ContractModerationList::Banlist => 0, - ContractModerationList::Suspensions => CONTRACT_SUSPENSION_VALUE_SIZE, - }; + // The list itself: one item per barred identity, keyed by identity id. An entry holds a + // reason of any length up to the limit, estimated at a typical one. + let value_size = estimated_entry_value_size(list); - // The list itself: one small item per barred identity, keyed by identity id. estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path(contract_moderation_list_path(&contract_id, list)), EstimatedLayerInformation { diff --git a/packages/rs-drive/src/drive/contract/moderation/fetch_contract_moderation_status/v0/mod.rs b/packages/rs-drive/src/drive/contract/moderation/fetch_contract_moderation_status/v0/mod.rs index 0f088dcf0fc..10f830c6f41 100644 --- a/packages/rs-drive/src/drive/contract/moderation/fetch_contract_moderation_status/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/moderation/fetch_contract_moderation_status/v0/mod.rs @@ -1,4 +1,4 @@ -use crate::drive::contract::moderation::types::decode_until; +use crate::drive::contract::moderation::types::{decode_ban, decode_suspension}; use crate::drive::contract::paths::contract_moderation_list_path; use crate::drive::Drive; use crate::error::drive::DriveError; @@ -32,16 +32,19 @@ impl Drive { drive_operations, &platform_version.drive, )?; + let malformed = |description: String| { + Error::Drive(DriveError::CorruptedDriveState(format!( + "entry of {} on contract {} {} is malformed: {}", + identity_id, contract_id, list, description + ))) + }; match (list, entry) { (_, None) => {} - (ContractModerationList::Banlist, Some(_)) => status.banned = true, + (ContractModerationList::Banlist, Some(value)) => { + status.ban = Some(decode_ban(&value).map_err(malformed)?); + } (ContractModerationList::Suspensions, Some(value)) => { - status.suspended_until = Some(decode_until(&value).map_err(|description| { - Error::Drive(DriveError::CorruptedDriveState(format!( - "suspension of {} on contract {} is malformed: {}", - identity_id, contract_id, description - ))) - })?); + status.suspension = Some(decode_suspension(&value).map_err(malformed)?); } } } diff --git a/packages/rs-drive/src/drive/contract/moderation/mod.rs b/packages/rs-drive/src/drive/contract/moderation/mod.rs index a585374503d..e5ae271ccaa 100644 --- a/packages/rs-drive/src/drive/contract/moderation/mod.rs +++ b/packages/rs-drive/src/drive/contract/moderation/mod.rs @@ -6,11 +6,16 @@ //! └── //! ├── [0] the contract (or its history subtree) //! ├── [1] documents -//! ├── [2] contract version item -//! ├── [3] banlist -> -> Item([]) (when declared) -//! └── [4] suspensions -> -> Item(until, u64 BE millis) (when declared) +//! └── [2] other +//! ├── [64] contract version item +//! ├── [128] banlist -> -> Item(reason) (when declared) +//! └── [192] suspensions -> -> Item(until ‖ reason) (when declared) //! ``` //! +//! `until` is a u64 of block time in milliseconds, big-endian. A reason is a tag byte (`0`: no +//! code, `1`: a code), the code as a big-endian u16 when tagged, and the text as UTF-8 up to +//! the end of the value: see [`types::encode_ban`] and [`types::encode_suspension`]. +//! //! An entry's storage flags name the moderator that wrote it, so the storage refund of its //! deletion goes to that moderator whichever transition deletes it: an explicit unban or //! unsuspend, a ban over a suspension, or the first document transition of the identity that @@ -43,6 +48,3 @@ pub mod types; #[cfg(test)] #[cfg(feature = "server")] mod tests; - -/// The stored size of a suspension entry: `until` as a u64. -pub const CONTRACT_SUSPENSION_VALUE_SIZE: u32 = 8; diff --git a/packages/rs-drive/src/drive/contract/moderation/remove_contract_ban/v0/mod.rs b/packages/rs-drive/src/drive/contract/moderation/remove_contract_ban/v0/mod.rs index 8fc9177d8ee..e7589984294 100644 --- a/packages/rs-drive/src/drive/contract/moderation/remove_contract_ban/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/moderation/remove_contract_ban/v0/mod.rs @@ -1,3 +1,4 @@ +use crate::drive::contract::moderation::types::estimated_entry_value_size; use crate::drive::contract::paths::contract_moderation_list_path; use crate::drive::Drive; use crate::error::Error; @@ -90,7 +91,8 @@ impl Drive { BatchDeleteApplyType::StatelessBatchDelete { in_tree_type: TreeType::NormalTree, estimated_key_size: DEFAULT_HASH_SIZE_U32, - estimated_value_size: StorageFlags::approximate_size(true, None), + estimated_value_size: estimated_entry_value_size(list) + + StorageFlags::approximate_size(true, None), } } else { BatchDeleteApplyType::StatefulBatchDelete { diff --git a/packages/rs-drive/src/drive/contract/moderation/remove_contract_suspension/v0/mod.rs b/packages/rs-drive/src/drive/contract/moderation/remove_contract_suspension/v0/mod.rs index a3a59613a4d..a8c5bf9a6b1 100644 --- a/packages/rs-drive/src/drive/contract/moderation/remove_contract_suspension/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/moderation/remove_contract_suspension/v0/mod.rs @@ -1,4 +1,4 @@ -use crate::drive::contract::moderation::CONTRACT_SUSPENSION_VALUE_SIZE; +use crate::drive::contract::moderation::types::estimated_entry_value_size; use crate::drive::contract::paths::contract_moderation_list_path; use crate::drive::Drive; use crate::error::Error; @@ -91,7 +91,7 @@ impl Drive { BatchDeleteApplyType::StatelessBatchDelete { in_tree_type: TreeType::NormalTree, estimated_key_size: DEFAULT_HASH_SIZE_U32, - estimated_value_size: CONTRACT_SUSPENSION_VALUE_SIZE + estimated_value_size: estimated_entry_value_size(list) + StorageFlags::approximate_size(true, None), } } else { diff --git a/packages/rs-drive/src/drive/contract/moderation/tests.rs b/packages/rs-drive/src/drive/contract/moderation/tests.rs index db8f85ee3cb..1f40de04fd9 100644 --- a/packages/rs-drive/src/drive/contract/moderation/tests.rs +++ b/packages/rs-drive/src/drive/contract/moderation/tests.rs @@ -12,8 +12,8 @@ use dpp::block::block_info::BlockInfo; use dpp::block::epoch::Epoch; use dpp::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; use dpp::data_contract::config::moderation::{ - ContractModerationConfig, ContractModerationList, ContractModerationListStatuses, - ContractModerationStatus, ContractModerators, + ContractBan, ContractModerationConfig, ContractModerationList, ContractModerationListStatuses, + ContractModerationReason, ContractModerationStatus, ContractModerators, ContractSuspension, }; use dpp::data_contract::DataContract; use dpp::identifier::Identifier; @@ -21,6 +21,29 @@ use dpp::tests::fixtures::get_data_contract_fixture; use dpp::version::PlatformVersion; use grovedb::Element; +fn reason(text: &str) -> ContractModerationReason { + ContractModerationReason::from_text(text) +} + +fn banned_for(text: &str) -> ContractModerationStatus { + ContractModerationStatus { + ban: Some(ContractBan { + reason: reason(text), + }), + suspension: None, + } +} + +fn suspended_until(until: u64, text: &str) -> ContractModerationStatus { + ContractModerationStatus { + ban: None, + suspension: Some(ContractSuspension { + until, + reason: reason(text), + }), + } +} + fn identity(seed: u8) -> Identifier { Identifier::from([seed; 32]) } @@ -178,6 +201,7 @@ fn should_keep_the_list_trees_and_their_entries_across_a_contract_update() { .add_contract_ban( contract.id(), target, + &reason("spam"), contract.owner_id(), &BlockInfo::default(), true, @@ -224,10 +248,7 @@ fn should_keep_the_list_trees_and_their_entries_across_a_contract_update() { contract.id(), target, &[ContractModerationList::Banlist], - ContractModerationStatus { - banned: true, - suspended_until: None, - }, + banned_for("spam"), ); } @@ -253,6 +274,7 @@ fn should_ban_and_unban_and_prove_the_status_and_the_entries() { .add_contract_ban( contract_id, target, + &reason("spam"), moderator, &BlockInfo::default(), true, @@ -262,16 +284,7 @@ fn should_ban_and_unban_and_prove_the_status_and_the_entries() { .expect("expected to ban"); assert!(fee.storage_fee > 0, "a ban stores an entry"); - assert_status( - &drive, - contract_id, - target, - &BOTH, - ContractModerationStatus { - banned: true, - suspended_until: None, - }, - ); + assert_status(&drive, contract_id, target, &BOTH, banned_for("spam")); assert_entries( &drive, contract_id, @@ -283,6 +296,7 @@ fn should_ban_and_unban_and_prove_the_status_and_the_entries() { &[ContractModerationEntry { identity_id: target, until: None, + reason: reason("spam"), }], ); @@ -338,6 +352,7 @@ fn should_suspend_replace_and_unsuspend() { contract_id, target, 10, + &reason("flooding"), false, moderator, &BlockInfo::default(), @@ -351,10 +366,7 @@ fn should_suspend_replace_and_unsuspend() { contract_id, target, &lists, - ContractModerationStatus { - banned: false, - suspended_until: Some(10), - }, + suspended_until(10, "flooding"), ); drive @@ -362,6 +374,7 @@ fn should_suspend_replace_and_unsuspend() { contract_id, target, 20, + &reason("flooding again, after a warning"), true, moderator, &BlockInfo::default(), @@ -370,15 +383,13 @@ fn should_suspend_replace_and_unsuspend() { platform_version, ) .expect("expected to replace the suspension"); + // The replacement brings its own reason, of another length. assert_status( &drive, contract_id, target, &lists, - ContractModerationStatus { - banned: false, - suspended_until: Some(20), - }, + suspended_until(20, "flooding again, after a warning"), ); assert_entries( &drive, @@ -391,6 +402,7 @@ fn should_suspend_replace_and_unsuspend() { &[ContractModerationEntry { identity_id: target, until: Some(20), + reason: reason("flooding again, after a warning"), }], ); @@ -428,6 +440,7 @@ fn should_estimate_before_applying_every_writer() { .add_contract_ban( contract_id, target, + &reason("spam"), moderator, &block_info, false, @@ -439,6 +452,7 @@ fn should_estimate_before_applying_every_writer() { .add_contract_ban( contract_id, target, + &reason("spam"), moderator, &block_info, true, @@ -454,6 +468,7 @@ fn should_estimate_before_applying_every_writer() { contract_id, target, 7, + &reason("flooding"), false, moderator, &block_info, @@ -467,6 +482,7 @@ fn should_estimate_before_applying_every_writer() { contract_id, target, 7, + &reason("flooding"), false, moderator, &block_info, @@ -545,6 +561,7 @@ fn should_page_entries_with_a_cursor_and_bound_the_limit() { .add_contract_ban( contract_id, target, + &reason("spam"), moderator, &BlockInfo::default(), true, @@ -556,6 +573,7 @@ fn should_page_entries_with_a_cursor_and_bound_the_limit() { let entry = |identity_id| ContractModerationEntry { identity_id, until: None, + reason: reason("spam"), }; let first_page = ContractModerationEntriesQuery { @@ -618,6 +636,7 @@ fn should_refund_the_first_moderator_when_another_replaces_the_suspension() { contract_id, target, 10, + &reason("flooding"), false, first_moderator, &BlockInfo::default_with_epoch(Epoch::new(0).expect("epoch 0")), @@ -628,14 +647,15 @@ fn should_refund_the_first_moderator_when_another_replaces_the_suspension() { .expect("expected to suspend"); assert!(fee.storage_fee > 0, "a suspension stores an entry"); - // Another moderator, a later epoch. The entry keeps its size, so the replacement stores - // nothing new, and the storage stays the first moderator's. + // Another moderator, a later epoch, a reason of the same length. The entry keeps its size, + // so the replacement stores nothing new, and the storage stays the first moderator's. let later = BlockInfo::default_with_epoch(Epoch::new(3).expect("epoch 3")); let fee = drive .add_contract_suspension( contract_id, target, 20, + &reason("flooding"), true, second_moderator, &later, @@ -644,10 +664,7 @@ fn should_refund_the_first_moderator_when_another_replaces_the_suspension() { platform_version, ) .expect("expected to replace the suspension"); - assert_eq!( - fee.storage_fee, 0, - "a fixed-size replacement stores nothing" - ); + assert_eq!(fee.storage_fee, 0, "a same-size replacement stores nothing"); let fee = drive .remove_contract_suspension(contract_id, target, &later, true, None, platform_version) @@ -666,6 +683,280 @@ fn should_refund_the_first_moderator_when_another_replaces_the_suspension() { ); } +#[test] +fn should_bill_the_replacing_moderator_for_a_longer_reason() { + let platform_version = PlatformVersion::latest(); + let drive = setup_drive_with_initial_state_structure(Some(platform_version)); + let contract = moderated_contract(false, true); + insert(&drive, &contract, platform_version); + let contract_id = contract.id(); + let first_moderator = identity(0x51); + let second_moderator = identity(0x52); + let target = identity(0x53); + + let first_fee = drive + .add_contract_suspension( + contract_id, + target, + 10, + &reason("flooding"), + false, + first_moderator, + &BlockInfo::default_with_epoch(Epoch::new(0).expect("epoch 0")), + true, + None, + platform_version, + ) + .expect("expected to suspend"); + + // Another moderator, a later epoch, a longer reason: the added bytes are the second + // moderator's to pay, and the flags merge as they do when a document changes hands, so + // the replacement does not fail on the two owners. + let later = BlockInfo::default_with_epoch(Epoch::new(3).expect("epoch 3")); + let longer = reason(&"flooding ".repeat(40)); + let second_fee = drive + .add_contract_suspension( + contract_id, + target, + 20, + &longer, + true, + second_moderator, + &later, + true, + None, + platform_version, + ) + .expect("expected to replace the suspension with a longer reason"); + assert!(second_fee.storage_fee > 0, "the added bytes are stored"); + assert!( + second_fee.storage_fee > first_fee.storage_fee, + "the longer reason costs more than the whole first entry" + ); + assert_status( + &drive, + contract_id, + target, + &[ContractModerationList::Suspensions], + ContractModerationStatus { + ban: None, + suspension: Some(ContractSuspension { + until: 20, + reason: longer, + }), + }, + ); + + // The entry, and the refund of its removal, passed to the moderator that replaced it. + let fee = drive + .remove_contract_suspension(contract_id, target, &later, true, None, platform_version) + .expect("expected to unsuspend"); + assert!( + fee.fee_refunds + .calculate_refunds_amount_for_identity(second_moderator) + .is_some(), + "the replacing moderator owns the entry" + ); + assert!( + fee.fee_refunds + .calculate_refunds_amount_for_identity(first_moderator) + .is_none(), + "the first moderator's bytes passed on with the entry" + ); +} + +#[test] +fn should_keep_a_shorter_replacement_with_the_first_moderator() { + let platform_version = PlatformVersion::latest(); + let drive = setup_drive_with_initial_state_structure(Some(platform_version)); + let contract = moderated_contract(false, true); + insert(&drive, &contract, platform_version); + let contract_id = contract.id(); + let first_moderator = identity(0x51); + let second_moderator = identity(0x52); + let target = identity(0x53); + + drive + .add_contract_suspension( + contract_id, + target, + 10, + &reason(&"flooding ".repeat(40)), + false, + first_moderator, + &BlockInfo::default_with_epoch(Epoch::new(0).expect("epoch 0")), + true, + None, + platform_version, + ) + .expect("expected to suspend"); + + // Another moderator, a later epoch, a shorter reason: nothing is added, the removed bytes + // go back to the moderator that paid for them, and the entry stays that moderator's. + let later = BlockInfo::default_with_epoch(Epoch::new(3).expect("epoch 3")); + let fee = drive + .add_contract_suspension( + contract_id, + target, + 20, + &reason("flooding"), + true, + second_moderator, + &later, + true, + None, + platform_version, + ) + .expect("expected to replace the suspension with a shorter reason"); + assert_eq!(fee.storage_fee, 0, "a shorter replacement stores nothing"); + assert!( + fee.fee_refunds + .calculate_refunds_amount_for_identity(first_moderator) + .is_some(), + "the removed bytes are refunded to the moderator that paid for them" + ); + assert!(fee + .fee_refunds + .calculate_refunds_amount_for_identity(second_moderator) + .is_none()); + assert_status( + &drive, + contract_id, + target, + &[ContractModerationList::Suspensions], + suspended_until(20, "flooding"), + ); + + let fee = drive + .remove_contract_suspension(contract_id, target, &later, true, None, platform_version) + .expect("expected to unsuspend"); + assert!( + fee.fee_refunds + .calculate_refunds_amount_for_identity(first_moderator) + .is_some(), + "the first moderator still owns the entry" + ); + assert!(fee + .fee_refunds + .calculate_refunds_amount_for_identity(second_moderator) + .is_none()); +} + +#[test] +fn should_not_estimate_a_replacement_below_what_it_costs() { + let platform_version = PlatformVersion::latest(); + let max_length = platform_version + .system_limits + .max_contract_moderation_reason_length as usize; + + // From the shortest entry to the longest, and the other way: GroveDB's average-case replace + // assumes an item keeps its size, which would price no storage for the longer reason. + for (from, to) in [(0, max_length), (max_length, 0), (8, 8)] { + let drive = setup_drive_with_initial_state_structure(Some(platform_version)); + let contract = moderated_contract(false, true); + insert(&drive, &contract, platform_version); + let contract_id = contract.id(); + let moderator = contract.owner_id(); + let target = identity(0x54); + let suspend = |until: u64, length: usize, replaces_existing: bool, apply: bool| { + drive + .add_contract_suspension( + contract_id, + target, + until, + &reason(&"x".repeat(length)), + replaces_existing, + moderator, + &BlockInfo::default(), + apply, + None, + platform_version, + ) + .expect("expected to suspend") + }; + + suspend(10, from, false, true); + let estimated = suspend(20, to, true, false); + let applied = suspend(20, to, true, true); + assert!( + estimated.storage_fee >= applied.storage_fee, + "{from} -> {to} bytes: estimated storage {} below applied {}", + estimated.storage_fee, + applied.storage_fee + ); + assert!( + estimated.total_base_fee() >= applied.total_base_fee(), + "{from} -> {to} bytes: estimated {} below applied {}", + estimated.total_base_fee(), + applied.total_base_fee() + ); + } +} + +#[test] +fn should_charge_a_ban_by_the_length_of_its_reason() { + let platform_version = PlatformVersion::latest(); + let drive = setup_drive_with_initial_state_structure(Some(platform_version)); + let contract = moderated_contract(true, false); + insert(&drive, &contract, platform_version); + let contract_id = contract.id(); + let moderator = contract.owner_id(); + let max_length = platform_version + .system_limits + .max_contract_moderation_reason_length as usize; + + let ban = |seed: u8, reason: &ContractModerationReason, apply: bool| { + drive + .add_contract_ban( + contract_id, + identity(seed), + reason, + moderator, + &BlockInfo::default(), + apply, + None, + platform_version, + ) + .expect("expected to ban") + }; + + let empty = ban(0x61, &ContractModerationReason::default(), true); + let longest = ContractModerationReason { + code: Some(u16::MAX), + text: "x".repeat(max_length), + }; + let estimated = ban(0x62, &longest, false); + let full = ban(0x62, &longest, true); + + // Two bytes of code and the text, at the storage price of a byte, and the few bytes the + // length prefixes of a longer value grow by. + let per_byte = platform_version + .fee_version + .storage + .storage_disk_usage_credit_per_byte; + let added_bytes = (full.storage_fee - empty.storage_fee) / per_byte; + let reason_bytes = max_length as u64 + 2; + assert!( + (reason_bytes..=reason_bytes + 8).contains(&added_bytes), + "{} bytes added for a reason of {}", + added_bytes, + reason_bytes + ); + assert_eq!(estimated.storage_fee, full.storage_fee, "estimated storage"); + + // The longest entry reads back whole. + assert_status( + &drive, + contract_id, + identity(0x62), + &[ContractModerationList::Banlist], + ContractModerationStatus { + ban: Some(ContractBan { reason: longest }), + suspension: None, + }, + ); +} + #[test] fn should_say_nothing_about_a_list_the_status_proof_does_not_cover() { let platform_version = PlatformVersion::latest(); @@ -677,6 +968,7 @@ fn should_say_nothing_about_a_list_the_status_proof_does_not_cover() { .add_contract_ban( contract.id(), target, + &reason("spam"), contract.owner_id(), &BlockInfo::default(), true, diff --git a/packages/rs-drive/src/drive/contract/moderation/types.rs b/packages/rs-drive/src/drive/contract/moderation/types.rs index be3809ceebd..eac19a11e2b 100644 --- a/packages/rs-drive/src/drive/contract/moderation/types.rs +++ b/packages/rs-drive/src/drive/contract/moderation/types.rs @@ -1,4 +1,6 @@ -use dpp::data_contract::config::moderation::ContractModerationList; +use dpp::data_contract::config::moderation::{ + ContractBan, ContractModerationList, ContractModerationReason, ContractSuspension, +}; use dpp::identity::TimestampMillis; use dpp::platform_value::Identifier; use grovedb::Element; @@ -16,17 +18,18 @@ pub struct ContractModerationEntriesQuery { } /// One entry of a moderation list. -#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[derive(Debug, Clone, PartialEq, Eq)] pub struct ContractModerationEntry { /// The barred identity. pub identity_id: Identifier, /// The end of the suspension for a suspension list entry, `None` for a banlist entry. pub until: Option, + /// Why the moderator banned or suspended the identity. + pub reason: ContractModerationReason, } impl ContractModerationEntry { - /// Decodes one stored entry. A banlist entry is an empty item, a suspension entry holds - /// `until` as eight big-endian bytes. + /// Decodes one stored entry: see [`encode_ban`] and [`encode_suspension`]. pub fn from_key_element( list: ContractModerationList, key: &[u8], @@ -37,23 +40,232 @@ impl ContractModerationEntry { let Element::Item(value, _) = element else { return Err("moderation entry is not an item".to_string()); }; - let until = match list { - ContractModerationList::Banlist => None, - ContractModerationList::Suspensions => Some(decode_until(value)?), - }; - Ok(Self { identity_id, until }) + match list { + ContractModerationList::Banlist => { + let ContractBan { reason } = decode_ban(value)?; + Ok(Self { + identity_id, + until: None, + reason, + }) + } + ContractModerationList::Suspensions => { + let ContractSuspension { until, reason } = decode_suspension(value)?; + Ok(Self { + identity_id, + until: Some(until), + reason, + }) + } + } } } -/// Decodes the `until` of a suspension entry. -pub fn decode_until(value: &[u8]) -> Result { - let bytes: [u8; 8] = value - .try_into() - .map_err(|_| format!("suspension entry holds {} bytes, expected 8", value.len()))?; - Ok(TimestampMillis::from_be_bytes(bytes)) +/// The stored size of the `until` a suspension entry starts with: a u64. +pub const CONTRACT_SUSPENSION_UNTIL_SIZE: usize = 8; + +/// The most bytes a reason's code takes in an entry: the tag and the u16. +pub const CONTRACT_MODERATION_REASON_CODE_MAX_SIZE: u32 = 3; + +/// The length a reason's text is estimated at when it is not known: a sentence. Estimating +/// every entry at the longest reason the protocol admits made the dry-run processing fee of a +/// moderation some 25 times the applied one. +pub const ESTIMATED_CONTRACT_MODERATION_REASON_TEXT_SIZE: u32 = 128; + +/// The size an entry of `list` is estimated at when its value is not known: the entries a +/// write walks past, and the entry a delete removes. An entry being written is priced by its +/// own size. +pub fn estimated_entry_value_size(list: ContractModerationList) -> u32 { + let until_size = match list { + ContractModerationList::Banlist => 0, + ContractModerationList::Suspensions => CONTRACT_SUSPENSION_UNTIL_SIZE as u32, + }; + until_size + + CONTRACT_MODERATION_REASON_CODE_MAX_SIZE + + ESTIMATED_CONTRACT_MODERATION_REASON_TEXT_SIZE +} + +const REASON_WITHOUT_CODE: u8 = 0; +const REASON_WITH_CODE: u8 = 1; + +/// Encodes a banlist entry: its reason. +/// +/// A reason is a tag byte (`0`: no code, `1`: a code), the code as two big-endian bytes when +/// the tag says so, and the text as UTF-8 up to the end of the value. A reason is always +/// written with its tag; a value without one is an entry from before reasons existed and +/// decodes as the empty reason. +pub fn encode_ban(reason: &ContractModerationReason) -> Vec { + let mut value = Vec::with_capacity(reason_encoded_size(reason)); + encode_reason_into(reason, &mut value); + value +} + +/// Decodes a banlist entry. +pub fn decode_ban(value: &[u8]) -> Result { + Ok(ContractBan { + reason: decode_reason(value)?, + }) +} + +/// Encodes a suspension list entry: `until` as eight big-endian bytes, then the reason as in +/// [`encode_ban`]. +pub fn encode_suspension(until: TimestampMillis, reason: &ContractModerationReason) -> Vec { + let mut value = + Vec::with_capacity(CONTRACT_SUSPENSION_UNTIL_SIZE + reason_encoded_size(reason)); + value.extend_from_slice(&until.to_be_bytes()); + encode_reason_into(reason, &mut value); + value +} + +/// Decodes a suspension list entry. +pub fn decode_suspension(value: &[u8]) -> Result { + let Some((until, reason)) = value.split_first_chunk::() else { + return Err(format!( + "suspension entry holds {} bytes, expected at least {}", + value.len(), + CONTRACT_SUSPENSION_UNTIL_SIZE + )); + }; + Ok(ContractSuspension { + until: TimestampMillis::from_be_bytes(*until), + reason: decode_reason(reason)?, + }) } -/// Encodes the `until` of a suspension entry. -pub fn encode_until(until: TimestampMillis) -> Vec { - until.to_be_bytes().to_vec() +fn reason_encoded_size(reason: &ContractModerationReason) -> usize { + 1 + if reason.code.is_some() { 2 } else { 0 } + reason.text.len() +} + +fn encode_reason_into(reason: &ContractModerationReason, value: &mut Vec) { + match reason.code { + None => value.push(REASON_WITHOUT_CODE), + Some(code) => { + value.push(REASON_WITH_CODE); + value.extend_from_slice(&code.to_be_bytes()); + } + } + value.extend_from_slice(reason.text.as_bytes()); +} + +fn decode_reason(value: &[u8]) -> Result { + let (code, text) = match value.split_first() { + Some((&REASON_WITHOUT_CODE, text)) => (None, text), + Some((&REASON_WITH_CODE, rest)) => { + let Some((code, text)) = rest.split_first_chunk::<2>() else { + return Err("moderation reason is cut short inside its code".to_string()); + }; + (Some(u16::from_be_bytes(*code)), text) + } + Some((tag, _)) => return Err(format!("moderation reason has unknown code tag {}", tag)), + // An entry written before entries carried a reason: an empty banlist item, a bare + // `until`. It reads as the empty reason rather than as corrupted state, which would + // turn every document transition of the identity, and its unban, into an internal error. + None => return Ok(ContractModerationReason::default()), + }; + let text = std::str::from_utf8(text) + .map_err(|_| "moderation reason text is not UTF-8".to_string())? + .to_string(); + Ok(ContractModerationReason { code, text }) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn should_round_trip_a_ban_with_and_without_a_code() { + let plain = ContractModerationReason::from_text("spam"); + assert_eq!(encode_ban(&plain), [&[0u8][..], b"spam"].concat()); + assert_eq!( + decode_ban(&encode_ban(&plain)).expect("decode").reason, + plain + ); + + let coded = ContractModerationReason { + code: Some(0x0102), + text: "spam".to_string(), + }; + assert_eq!(encode_ban(&coded), [&[1u8, 1, 2][..], b"spam"].concat()); + assert_eq!( + decode_ban(&encode_ban(&coded)).expect("decode").reason, + coded + ); + + let empty = ContractModerationReason::default(); + assert_eq!(encode_ban(&empty), vec![0]); + assert_eq!(decode_ban(&[0]).expect("decode").reason, empty); + } + + #[test] + fn should_round_trip_a_suspension() { + let reason = ContractModerationReason { + code: Some(9), + text: "flooding, second time".to_string(), + }; + let value = encode_suspension(77, &reason); + assert_eq!(&value[..8], &77u64.to_be_bytes()); + assert_eq!( + decode_suspension(&value).expect("decode"), + ContractSuspension { until: 77, reason } + ); + } + + #[test] + fn should_refuse_a_malformed_entry() { + decode_ban(&[2, b'x']).expect_err("unknown tag"); + decode_ban(&[1, 0]).expect_err("code cut short"); + decode_ban(&[0, 0xff, 0xfe]).expect_err("not utf-8"); + decode_suspension(&[0; 7]).expect_err("until cut short"); + } + + #[test] + fn should_read_an_entry_written_before_reasons_as_the_empty_reason() { + assert_eq!( + decode_ban(&[]).expect("decode"), + ContractBan { + reason: ContractModerationReason::default() + } + ); + assert_eq!( + decode_suspension(&77u64.to_be_bytes()).expect("decode"), + ContractSuspension { + until: 77, + reason: ContractModerationReason::default() + } + ); + } + + #[test] + fn should_decode_an_entry_by_its_list() { + let id = Identifier::from([5; 32]); + let reason = ContractModerationReason::from_text("spam"); + let ban = Element::new_item(encode_ban(&reason)); + assert_eq!( + ContractModerationEntry::from_key_element( + ContractModerationList::Banlist, + id.as_slice(), + &ban + ) + .expect("decode"), + ContractModerationEntry { + identity_id: id, + until: None, + reason: reason.clone(), + } + ); + let suspension = Element::new_item(encode_suspension(12, &reason)); + assert_eq!( + ContractModerationEntry::from_key_element( + ContractModerationList::Suspensions, + id.as_slice(), + &suspension + ) + .expect("decode"), + ContractModerationEntry { + identity_id: id, + until: Some(12), + reason, + } + ); + } } diff --git a/packages/rs-drive/src/drive/contract/paths.rs b/packages/rs-drive/src/drive/contract/paths.rs index 34959bae880..9cbc4398912 100644 --- a/packages/rs-drive/src/drive/contract/paths.rs +++ b/packages/rs-drive/src/drive/contract/paths.rs @@ -185,14 +185,15 @@ pub const CONTRACT_OTHER_KEY: u8 = 2; pub const CONTRACT_VERSION_KEY: u8 = 64; /// The key under a contract's other tree (`[64, id, 2]`) of the banlist a moderated contract -/// keeps (protocol version 14): `identity id -> Item([])`. Present only when the contract's +/// keeps (protocol version 14): `identity id -> Item(reason)`. Present only when the contract's /// config declares a banlist. Read by every document transition on the contract, hence on /// top. pub const CONTRACT_BANLIST_KEY: u8 = 128; /// The key under a contract's other tree (`[64, id, 2]`) of the suspension list a moderated /// contract keeps (protocol version 14): `identity id -> Item(until, u64 big-endian -/// milliseconds)`. Present only when the contract's config declares a suspension list. +/// milliseconds, then the reason)`. Present only when the contract's config declares a +/// suspension list. pub const CONTRACT_SUSPENSIONS_KEY: u8 = 192; /// `[64, contract id, 2]`: the contract's other tree. diff --git a/packages/rs-drive/src/drive/contract/structure.rs b/packages/rs-drive/src/drive/contract/structure.rs index d9dd16c2e84..2dfea307414 100644 --- a/packages/rs-drive/src/drive/contract/structure.rs +++ b/packages/rs-drive/src/drive/contract/structure.rs @@ -11,7 +11,10 @@ const CONTRACT_FLAGS: &str = created in. System contracts created at genesis carry no flags."; const MODERATOR_FLAGS: &str = "The owner is the moderator who added the entry. They pay for it, and are \ - refunded when it is removed."; + refunded when it is removed. A suspension replaced with a longer reason \ + passes to the moderator who replaced it, who pays for the added bytes; \ + replaced with a shorter or an equally long one it stays the first \ + moderator's, who is refunded the removed bytes."; /// Data contracts and their documents pub(crate) fn structure() -> StructureNode { @@ -121,8 +124,12 @@ pub(crate) fn structure() -> StructureNode { ) .kind(ElementKind::Item) .flags(&[FlagsKind::EpochOwned], MODERATOR_FLAGS) - .value("empty; the key carries the information") - .describe("One ban, until an unban."), + .value( + "the moderator's reason: a tag byte (0 no code, 1 a \ + code), the code as a u16 big endian when tagged, \ + then the text as UTF-8 to the end of the value", + ) + .describe("One ban and why, until an unban."), ), StructureNode::fixed( "suspensions", @@ -147,10 +154,11 @@ pub(crate) fn structure() -> StructureNode { .flags(&[FlagsKind::EpochOwned], MODERATOR_FLAGS) .value( "the block time in milliseconds the suspension \ - runs until, u64 big endian", + runs until, u64 big endian, then the moderator's \ + reason as in a banlist entry", ) .describe( - "One suspension. A lapsed one stays until the \ + "One suspension and why. A lapsed one stays until the \ identity's next document transition sweeps it.", ), ), diff --git a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/contract/contract_user_moderation_transition.rs b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/contract/contract_user_moderation_transition.rs index fceb2fe3220..d3d3a553d9c 100644 --- a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/contract/contract_user_moderation_transition.rs +++ b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/contract/contract_user_moderation_transition.rs @@ -29,7 +29,7 @@ impl DriveHighLevelOperationConverter for ContractUserModerationTransitionAction data_contract_id: contract_id, identity_contract_nonce, action, - current_status, + target_is_suspended, .. }, ) = self; @@ -43,9 +43,12 @@ impl DriveHighLevelOperationConverter for ContractUserModerationTransitionAction )]; match action { - ContractUserModerationAction::Ban { identity_id } => { + ContractUserModerationAction::Ban { + identity_id, + reason, + } => { // A ban supersedes a suspension, lapsed or not. - if current_status.suspended_until.is_some() { + if target_is_suspended { operations.push(ContractModerationOperation( ContractModerationOperationType::RemoveSuspension { contract_id, @@ -57,6 +60,7 @@ impl DriveHighLevelOperationConverter for ContractUserModerationTransitionAction ContractModerationOperationType::AddBan { contract_id, identity_id, + reason, moderator_id, }, )); @@ -69,13 +73,18 @@ impl DriveHighLevelOperationConverter for ContractUserModerationTransitionAction }, )); } - ContractUserModerationAction::Suspend { identity_id, until } => { + ContractUserModerationAction::Suspend { + identity_id, + until, + reason, + } => { operations.push(ContractModerationOperation( ContractModerationOperationType::AddSuspension { contract_id, identity_id, until, - replaces_existing: current_status.suspended_until.is_some(), + reason, + replaces_existing: target_is_suspended, moderator_id, }, )); @@ -105,19 +114,19 @@ impl DriveHighLevelOperationConverter for ContractUserModerationTransitionAction #[cfg(test)] mod tests { use super::*; - use dpp::data_contract::config::moderation::ContractModerationStatus; + use dpp::data_contract::config::moderation::ContractModerationReason; use dpp::platform_value::Identifier; fn action( action: ContractUserModerationAction, - current_status: ContractModerationStatus, + target_is_suspended: bool, ) -> ContractUserModerationTransitionAction { ContractUserModerationTransitionAction::V0(ContractUserModerationTransitionActionV0 { moderator_id: Identifier::from([0xAA; 32]), data_contract_id: Identifier::from([0xBB; 32]), identity_contract_nonce: 4, action, - current_status, + target_is_suspended, user_fee_increase: 0, }) } @@ -131,8 +140,9 @@ mod tests { let ops = action( ContractUserModerationAction::Ban { identity_id: target, + reason: ContractModerationReason::from_text("spam"), }, - ContractModerationStatus::default(), + false, ) .into_high_level_drive_operations(&epoch, platform_version) .expect("operations"); @@ -143,8 +153,11 @@ mod tests { )); assert!(matches!( &ops[1], - ContractModerationOperation(ContractModerationOperationType::AddBan { identity_id, .. }) - if *identity_id == target + ContractModerationOperation(ContractModerationOperationType::AddBan { + identity_id, + reason, + .. + }) if *identity_id == target && reason.text == "spam" )); } @@ -157,11 +170,9 @@ mod tests { let ops = action( ContractUserModerationAction::Ban { identity_id: target, + reason: ContractModerationReason::from_text("spam"), }, - ContractModerationStatus { - banned: false, - suspended_until: Some(10), - }, + true, ) .into_high_level_drive_operations(&epoch, platform_version) .expect("operations"); @@ -186,11 +197,9 @@ mod tests { ContractUserModerationAction::Suspend { identity_id: target, until: 99, + reason: ContractModerationReason::from_text("again"), }, - ContractModerationStatus { - banned: false, - suspended_until: Some(10), - }, + true, ) .into_high_level_drive_operations(&epoch, platform_version) .expect("operations"); @@ -199,9 +208,10 @@ mod tests { &ops[1], ContractModerationOperation(ContractModerationOperationType::AddSuspension { until: 99, + reason, replaces_existing: true, .. - }) + }) if reason.text == "again" )); } } diff --git a/packages/rs-drive/src/state_transition_action/contract/contract_user_moderation/mod.rs b/packages/rs-drive/src/state_transition_action/contract/contract_user_moderation/mod.rs index 0aaa3fec43d..71ef39b3adf 100644 --- a/packages/rs-drive/src/state_transition_action/contract/contract_user_moderation/mod.rs +++ b/packages/rs-drive/src/state_transition_action/contract/contract_user_moderation/mod.rs @@ -5,7 +5,6 @@ pub mod v0; use crate::state_transition_action::contract::contract_user_moderation::v0::ContractUserModerationTransitionActionV0; use derive_more::From; -use dpp::data_contract::config::moderation::ContractModerationStatus; use dpp::platform_value::Identifier; use dpp::prelude::{IdentityNonce, UserFeeIncrease}; use dpp::state_transition::contract_user_moderation_transition::ContractUserModerationAction; @@ -42,16 +41,16 @@ impl ContractUserModerationTransitionAction { } /// What is done, to whom - pub fn action(&self) -> ContractUserModerationAction { + pub fn action(&self) -> &ContractUserModerationAction { match self { - ContractUserModerationTransitionAction::V0(action) => action.action, + ContractUserModerationTransitionAction::V0(action) => &action.action, } } - /// The target's status as read when the transition was validated - pub fn current_status(&self) -> ContractModerationStatus { + /// Whether the target carried a suspension when the transition was validated + pub fn target_is_suspended(&self) -> bool { match self { - ContractUserModerationTransitionAction::V0(action) => action.current_status, + ContractUserModerationTransitionAction::V0(action) => action.target_is_suspended, } } diff --git a/packages/rs-drive/src/state_transition_action/contract/contract_user_moderation/transformer.rs b/packages/rs-drive/src/state_transition_action/contract/contract_user_moderation/transformer.rs index 1323b61ca28..c368059c14f 100644 --- a/packages/rs-drive/src/state_transition_action/contract/contract_user_moderation/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/contract/contract_user_moderation/transformer.rs @@ -4,10 +4,11 @@ use dpp::data_contract::config::moderation::ContractModerationStatus; use dpp::state_transition::contract_user_moderation_transition::ContractUserModerationTransition; impl ContractUserModerationTransitionAction { - /// The action of a borrowed transition, carrying the target's status as it is stored + /// The action of a borrowed transition, keeping of the target's stored status what Drive + /// needs: whether it carries a suspension pub fn from_borrowed_transition_with_status( value: &ContractUserModerationTransition, - current_status: ContractModerationStatus, + current_status: &ContractModerationStatus, ) -> Self { match value { ContractUserModerationTransition::V0(v0) => { diff --git a/packages/rs-drive/src/state_transition_action/contract/contract_user_moderation/v0/mod.rs b/packages/rs-drive/src/state_transition_action/contract/contract_user_moderation/v0/mod.rs index 8f7216ad856..1e5c6c0f1a3 100644 --- a/packages/rs-drive/src/state_transition_action/contract/contract_user_moderation/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/contract/contract_user_moderation/v0/mod.rs @@ -1,6 +1,5 @@ mod transformer; -use dpp::data_contract::config::moderation::ContractModerationStatus; use dpp::identifier::Identifier; use dpp::prelude::{IdentityNonce, UserFeeIncrease}; use dpp::state_transition::contract_user_moderation_transition::ContractUserModerationAction; @@ -16,10 +15,10 @@ pub struct ContractUserModerationTransitionActionV0 { pub identity_contract_nonce: IdentityNonce, /// what is done, to whom pub action: ContractUserModerationAction, - /// the target's status as read when the transition was validated, so that Drive knows - /// whether a suspend replaces an entry and whether a ban also removes a suspension, - /// without reading again - pub current_status: ContractModerationStatus, + /// whether the target carried a suspension when the transition was validated, so that + /// Drive knows whether a suspend replaces an entry and whether a ban also removes a + /// suspension, without reading again. The status itself, with its reasons, stays behind. + pub target_is_suspended: bool, /// fee multiplier pub user_fee_increase: UserFeeIncrease, } diff --git a/packages/rs-drive/src/state_transition_action/contract/contract_user_moderation/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/contract/contract_user_moderation/v0/transformer.rs index 1a4e4dfad5d..0b17cee9ca9 100644 --- a/packages/rs-drive/src/state_transition_action/contract/contract_user_moderation/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/contract/contract_user_moderation/v0/transformer.rs @@ -3,10 +3,11 @@ use dpp::data_contract::config::moderation::ContractModerationStatus; use dpp::state_transition::contract_user_moderation_transition::v0::ContractUserModerationTransitionV0; impl ContractUserModerationTransitionActionV0 { - /// The action of a borrowed transition, carrying the target's status as it is stored + /// The action of a borrowed transition, keeping of the target's stored status what Drive + /// needs: whether it carries a suspension pub fn from_borrowed_transition_with_status( value: &ContractUserModerationTransitionV0, - current_status: ContractModerationStatus, + current_status: &ContractModerationStatus, ) -> Self { let ContractUserModerationTransitionV0 { owner_id, @@ -20,8 +21,8 @@ impl ContractUserModerationTransitionActionV0 { moderator_id: *owner_id, data_contract_id: *data_contract_id, identity_contract_nonce: *identity_contract_nonce, - action: *action, - current_status, + action: action.clone(), + target_is_suspended: current_status.suspension.is_some(), user_fee_increase: *user_fee_increase, } } diff --git a/packages/rs-drive/src/structure/tests.rs b/packages/rs-drive/src/structure/tests.rs index 716b3c49008..b62d26029aa 100644 --- a/packages/rs-drive/src/structure/tests.rs +++ b/packages/rs-drive/src/structure/tests.rs @@ -284,7 +284,9 @@ mod fixtures { use dpp::data_contract::associated_token::token_once_per_identity_distribution::TokenOncePerIdentityDistribution; use dpp::data_contract::associated_token::token_pre_programmed_distribution::v0::TokenPreProgrammedDistributionV0; use dpp::data_contract::associated_token::token_pre_programmed_distribution::TokenPreProgrammedDistribution; - use dpp::data_contract::config::moderation::{ContractModerationConfig, ContractModerators}; + use dpp::data_contract::config::moderation::{ + ContractModerationConfig, ContractModerationReason, ContractModerators, + }; use dpp::data_contract::config::v0::{DataContractConfigSettersV0, DataContractConfigV0}; use dpp::data_contract::config::DataContractConfig; use dpp::data_contract::document_type::random_document::CreateRandomDocument; @@ -482,6 +484,7 @@ mod fixtures { .add_contract_ban( contract.id(), Identifier::from([0x21; 32]), + &ContractModerationReason::from_text("spam"), contract.owner_id(), &BlockInfo::default(), true, @@ -494,6 +497,7 @@ mod fixtures { contract.id(), Identifier::from([0x22; 32]), 1_000, + &ContractModerationReason::from_text("flooding"), false, contract.owner_id(), &BlockInfo::default(), diff --git a/packages/rs-drive/src/util/batch/drive_op_batch/contract_moderation.rs b/packages/rs-drive/src/util/batch/drive_op_batch/contract_moderation.rs index 3fd913f163e..2bf86234483 100644 --- a/packages/rs-drive/src/util/batch/drive_op_batch/contract_moderation.rs +++ b/packages/rs-drive/src/util/batch/drive_op_batch/contract_moderation.rs @@ -3,6 +3,7 @@ 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::config::moderation::ContractModerationReason; use dpp::identifier::Identifier; use dpp::identity::TimestampMillis; use grovedb::batch::KeyInfoPath; @@ -19,6 +20,8 @@ pub enum ContractModerationOperationType { contract_id: Identifier, /// The identity to ban. identity_id: Identifier, + /// Why, stored with the entry. + reason: ContractModerationReason, /// The identity that pays for the entry and receives its refund. moderator_id: Identifier, }, @@ -38,6 +41,8 @@ pub enum ContractModerationOperationType { identity_id: Identifier, /// The block time, in milliseconds, at which the suspension lapses. until: TimestampMillis, + /// Why, stored with the entry. + reason: ContractModerationReason, /// Whether the identity already has an entry, which is then replaced. replaces_existing: bool, /// The identity that pays for the entry and receives its refund. @@ -67,10 +72,12 @@ impl DriveLowLevelOperationConverter for ContractModerationOperationType { ContractModerationOperationType::AddBan { contract_id, identity_id, + reason, moderator_id, } => drive.add_contract_ban_operations( contract_id, identity_id, + &reason, moderator_id, block_info, estimated_costs_only_with_layer_info, @@ -92,12 +99,14 @@ impl DriveLowLevelOperationConverter for ContractModerationOperationType { contract_id, identity_id, until, + reason, replaces_existing, moderator_id, } => drive.add_contract_suspension_operations( contract_id, identity_id, until, + &reason, replaces_existing, moderator_id, block_info, diff --git a/packages/rs-drive/src/verify/contract_moderation/verify_contract_moderation_status/v0/mod.rs b/packages/rs-drive/src/verify/contract_moderation/verify_contract_moderation_status/v0/mod.rs index 14b46be8b36..2708ebf305e 100644 --- a/packages/rs-drive/src/verify/contract_moderation/verify_contract_moderation_status/v0/mod.rs +++ b/packages/rs-drive/src/verify/contract_moderation/verify_contract_moderation_status/v0/mod.rs @@ -1,4 +1,4 @@ -use crate::drive::contract::moderation::types::decode_until; +use crate::drive::contract::moderation::types::{decode_ban, decode_suspension}; use crate::drive::contract::paths::{CONTRACT_BANLIST_KEY, CONTRACT_SUSPENSIONS_KEY}; use crate::drive::Drive; use crate::error::proof::ProofError; @@ -48,15 +48,18 @@ impl Drive { "contract moderation entry is not an item".to_string(), ))); }; + let malformed = |description: String| { + Error::Proof(ProofError::CorruptedProof(format!( + "contract moderation entry is malformed: {}", + description + ))) + }; match path.last().map(Vec::as_slice) { - Some([CONTRACT_BANLIST_KEY]) => status.banned = true, + Some([CONTRACT_BANLIST_KEY]) => { + status.ban = Some(decode_ban(&value).map_err(malformed)?); + } Some([CONTRACT_SUSPENSIONS_KEY]) => { - status.suspended_until = Some(decode_until(&value).map_err(|description| { - Error::Proof(ProofError::CorruptedProof(format!( - "contract suspension entry is malformed: {}", - description - ))) - })?); + status.suspension = Some(decode_suspension(&value).map_err(malformed)?); } _ => { return Err(Error::Proof(ProofError::CorruptedProof( 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 7bdf54481e7..e45aaff3b0b 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 @@ -1185,14 +1185,21 @@ impl Drive { platform_version, )?; let as_expected = match transition.action() { - // Banned, and no suspension left behind on a contract that keeps them. - ContractUserModerationAction::Ban { .. } => { - statuses.banned() == Some(true) - && statuses.suspended_until().flatten().is_none() + // Banned for the reason the transition gives, and no suspension left behind + // on a contract that keeps them. + ContractUserModerationAction::Ban { reason, .. } => { + statuses + .ban() + .flatten() + .is_some_and(|ban| ban.reason == *reason) + && statuses.suspension().flatten().is_none() } ContractUserModerationAction::Unban { .. } => statuses.banned() == Some(false), - ContractUserModerationAction::Suspend { until, .. } => { - statuses.suspended_until() == Some(Some(until)) + // Suspended until the time and for the reason the transition gives. + ContractUserModerationAction::Suspend { until, reason, .. } => { + statuses.suspension().flatten().is_some_and(|suspension| { + suspension.until == *until && suspension.reason == *reason + }) } ContractUserModerationAction::Unsuspend { .. } => { statuses.suspended_until() == Some(None) 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 99ad33aa42f..165994bd868 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -577,6 +577,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { max_contract_group_description_length: 256, max_contract_moderators: 16, max_contract_suspension_until: 9_007_199_254_740_991, + max_contract_moderation_reason_length: 1024, max_token_redemption_cycles: 128, max_shielded_transition_actions: 16, max_time_range_overlap_factor: None, 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 977db105cd1..61f990e68a2 100644 --- a/packages/rs-platform-version/src/version/system_limits/mod.rs +++ b/packages/rs-platform-version/src/version/system_limits/mod.rs @@ -115,6 +115,10 @@ pub struct SystemLimits { /// to clients. Read by the `ContractUserModeration` basic structure validation v0 /// (protocol version 14) and never reached before. pub max_contract_suspension_until: u64, + /// Maximum length, in bytes of UTF-8, of the text of the reason a ban or a suspension + /// carries (`ContractModerationReason::text`). Read by the `ContractUserModeration` basic + /// structure validation v0 (protocol version 14) and never reached before. + pub max_contract_moderation_reason_length: u16, // This the max redemption cycles we can process if we don't use a constant distribution // For a constant perpetual distribution this is very cheap since it's just a multiplication // For other distributions we much calculate at each cycle the rewards, so we don't want to 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 ce284e2af21..7eba07e5053 100644 --- a/packages/rs-platform-version/src/version/system_limits/v1.rs +++ b/packages/rs-platform-version/src/version/system_limits/v1.rs @@ -48,6 +48,7 @@ pub const SYSTEM_LIMITS_V1: SystemLimits = SystemLimits { max_contract_group_description_length: 256, max_contract_moderators: 16, max_contract_suspension_until: 9_007_199_254_740_991, + max_contract_moderation_reason_length: 1024, max_token_redemption_cycles: 128, // NOTE: the Halo 2 proof grows with the action count (~2,273 B/action on // top of the 408 B serialized action), so a transition's on-wire size is diff --git a/packages/rs-platform-version/src/version/system_limits/v2.rs b/packages/rs-platform-version/src/version/system_limits/v2.rs index f5fda6fc08e..4f35723113e 100644 --- a/packages/rs-platform-version/src/version/system_limits/v2.rs +++ b/packages/rs-platform-version/src/version/system_limits/v2.rs @@ -29,6 +29,7 @@ pub const SYSTEM_LIMITS_V2: SystemLimits = SystemLimits { max_contract_group_description_length: 256, max_contract_moderators: 16, max_contract_suspension_until: 9_007_199_254_740_991, + max_contract_moderation_reason_length: 1024, max_token_redemption_cycles: 128, // NOTE: the Halo 2 proof grows with the action count (~2,273 B/action on // top of the 408 B serialized action), so a transition's on-wire size is diff --git a/packages/rs-platform-version/src/version/system_limits/v3.rs b/packages/rs-platform-version/src/version/system_limits/v3.rs index 04bfcf991ac..5bdc85019bc 100644 --- a/packages/rs-platform-version/src/version/system_limits/v3.rs +++ b/packages/rs-platform-version/src/version/system_limits/v3.rs @@ -31,6 +31,7 @@ pub const SYSTEM_LIMITS_V3: SystemLimits = SystemLimits { max_contract_group_description_length: 256, max_contract_moderators: 16, max_contract_suspension_until: 9_007_199_254_740_991, + max_contract_moderation_reason_length: 1024, max_token_redemption_cycles: 128, // NOTE: the Halo 2 proof grows with the action count (~2,273 B/action on // top of the 408 B serialized action), so a transition's on-wire size is diff --git a/packages/rs-platform-version/src/version/system_limits/v4.rs b/packages/rs-platform-version/src/version/system_limits/v4.rs index f9c4503265b..dea104ec8a8 100644 --- a/packages/rs-platform-version/src/version/system_limits/v4.rs +++ b/packages/rs-platform-version/src/version/system_limits/v4.rs @@ -45,7 +45,8 @@ use crate::version::system_limits::SystemLimits; /// bounds the members of a change-control `Group` inside a contract, not a contract group. /// * Contract moderation (protocol version 14): a moderated data contract may name at most 16 /// moderator identities, its owner counted when named. A suspension runs until at most -/// 2^53 - 1 milliseconds of block time, the largest value JSON clients read exactly. +/// 2^53 - 1 milliseconds of block time, the largest value JSON clients read exactly. The +/// text of the reason a ban or a suspension carries is at most 1024 bytes. pub const SYSTEM_LIMITS_V4: SystemLimits = SystemLimits { estimated_contract_max_serialized_size: 16384, max_field_value_size: 5120, //5 KiB @@ -71,6 +72,7 @@ pub const SYSTEM_LIMITS_V4: SystemLimits = SystemLimits { max_contract_group_description_length: 256, max_contract_moderators: 16, max_contract_suspension_until: 9_007_199_254_740_991, + max_contract_moderation_reason_length: 1024, max_token_redemption_cycles: 128, // NOTE: the Halo 2 proof grows with the action count (~2,273 B/action on // top of the 408 B serialized action), so a transition's on-wire size is diff --git a/packages/rs-platform-version/src/version/v14.rs b/packages/rs-platform-version/src/version/v14.rs index fea4dd411cc..6b0a0ada5bd 100644 --- a/packages/rs-platform-version/src/version/v14.rs +++ b/packages/rs-platform-version/src/version/v14.rs @@ -331,7 +331,11 @@ pub const PROTOCOL_VERSION_14: ProtocolVersion = 14; /// `CONTRACT_USER_MODERATION_INITIAL_PROTOCOL_VERSION`) bans, unbans, /// suspends until a block time (at most /// `SystemLimits::max_contract_suspension_until`) and unsuspends one -/// identity, signed by the owner or a moderator with a CRITICAL key; +/// identity, signed by the owner or a moderator with a CRITICAL key; a +/// ban and a suspension carry a reason, stored with the entry: a text of +/// at most `SystemLimits::max_contract_moderation_reason_length` bytes and +/// an optional code nothing checks, reserved for ban codes a contract may +/// declare in a later version; /// `DRIVE_ABCI_VALIDATION_VERSIONS_V10` turns its gates on, moves the /// contract update's basic structure to 2 and the contract create and /// update state validation (already 1 here) checks the named moderators. @@ -434,7 +438,7 @@ pub const PLATFORM_V14: PlatformVersion = PlatformVersion { // the shared storage table; it is dead below v14 (the `ttl` grammar // does not parse), so no table fork is needed. fee_version: FEE_VERSION3, // changed: contested document contribution reduced to 0.1 DASH; registration surcharge for once-per-identity token distributions - system_limits: SYSTEM_LIMITS_V4, // changed: daily withdrawal limit becomes 15% of the total credits a day ago + time-range overlap-factor cap (24) + time-range TTL cap (1 week) and per-write drop cap (32) + GroveDB proof envelope floor (V1); max_contract_moderators and max_contract_suspension_until + system_limits: SYSTEM_LIMITS_V4, // changed: daily withdrawal limit becomes 15% of the total credits a day ago + time-range overlap-factor cap (24) + time-range TTL cap (1 week) and per-write drop cap (32) + GroveDB proof envelope floor (V1); max_contract_moderators, max_contract_suspension_until and max_contract_moderation_reason_length consensus: ConsensusVersions { tenderdash_consensus_version: 1, }, diff --git a/packages/rs-sdk/src/mock/requests.rs b/packages/rs-sdk/src/mock/requests.rs index 6aa17e94119..7d8e748867f 100644 --- a/packages/rs-sdk/src/mock/requests.rs +++ b/packages/rs-sdk/src/mock/requests.rs @@ -28,7 +28,7 @@ use drive::grovedb::Element; use drive_proof_verifier::types::identity_keys_remaining_budgets::IdentityKeysRemainingBudgets; use drive_proof_verifier::types::contract_moderation::{ ContractModerationEntries, ContractModerationEntry, ContractModerationListStatus, - ContractModerationListStatuses, + ContractModerationListStatuses, ContractModerationReason, }; use drive_proof_verifier::types::contract_groups::{ ContractGroupInfo, ContractGroupMembersPage, ContractGroupMembershipsForContract, @@ -411,10 +411,10 @@ impl MockResponse for ContractModerationListStatuses { impl MockResponse for ContractModerationEntries { fn mock_serialize(&self, _sdk: &MockDashPlatformSdk) -> Vec { - let entries: Vec<(Identifier, Option)> = self + let entries: Vec<(Identifier, Option, ContractModerationReason)> = self .entries() .iter() - .map(|entry| (entry.identity_id, entry.until)) + .map(|entry| (entry.identity_id, entry.until, entry.reason.clone())) .collect(); bincode::encode_to_vec(entries, BINCODE_CONFIG).expect("encode ContractModerationEntries") } @@ -423,13 +423,17 @@ impl MockResponse for ContractModerationEntries { where Self: Sized, { - let (entries, _): (Vec<(Identifier, Option)>, _) = + let (entries, _): (Vec<(Identifier, Option, ContractModerationReason)>, _) = bincode::decode_from_slice(buf, BINCODE_CONFIG) .expect("decode ContractModerationEntries"); ContractModerationEntries( entries .into_iter() - .map(|(identity_id, until)| ContractModerationEntry { identity_id, until }) + .map(|(identity_id, until, reason)| ContractModerationEntry { + identity_id, + until, + reason, + }) .collect(), ) } diff --git a/packages/rs-sdk/src/platform/transition/contract_user_moderation.rs b/packages/rs-sdk/src/platform/transition/contract_user_moderation.rs index 12a21d7e652..f14437c9bd3 100644 --- a/packages/rs-sdk/src/platform/transition/contract_user_moderation.rs +++ b/packages/rs-sdk/src/platform/transition/contract_user_moderation.rs @@ -7,14 +7,17 @@ //! suspended identity cannot act on the contract at the document level. //! //! ```ignore +//! let reason = ContractModerationReason::from_text("spam"); //! let status = moderator_identity -//! .ban_contract_user(&sdk, contract_id, user_id, None, signer, None) +//! .ban_contract_user(&sdk, contract_id, user_id, reason, None, signer, None) //! .await?; //! ``` use crate::platform::Fetch; use dash_context_provider::ContextProvider; -use dpp::data_contract::config::moderation::ContractModerationListStatuses; +use dpp::data_contract::config::moderation::{ + ContractModerationListStatuses, ContractModerationReason, +}; use dpp::data_contract::DataContract; use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; @@ -90,12 +93,16 @@ pub trait ModerateContractUser: Waitable { settings: Option, ) -> Result; - /// Puts `identity_id` on the banlist of `contract_id`. + /// Puts `identity_id` on the banlist of `contract_id` for `reason`, which is stored with + /// the entry: a text of at most `SystemLimits::max_contract_moderation_reason_length` + /// bytes, and a code nothing checks, reserved for ban codes contracts may declare later. + #[allow(clippy::too_many_arguments)] async fn ban_contract_user + Send>( &self, sdk: &Sdk, contract_id: Identifier, identity_id: Identifier, + reason: ContractModerationReason, signing_key_to_use: Option<&IdentityPublicKey>, signer: S, settings: Option, @@ -103,7 +110,10 @@ pub trait ModerateContractUser: Waitable { self.moderate_contract_user( sdk, contract_id, - ContractUserModerationAction::Ban { identity_id }, + ContractUserModerationAction::Ban { + identity_id, + reason, + }, signing_key_to_use, signer, settings, @@ -133,7 +143,7 @@ pub trait ModerateContractUser: Waitable { } /// Suspends `identity_id` on `contract_id` until the block time `until`, in milliseconds, - /// replacing a suspension it already carries. + /// for `reason` (as for a ban), replacing a suspension it already carries. #[allow(clippy::too_many_arguments)] async fn suspend_contract_user + Send>( &self, @@ -141,6 +151,7 @@ pub trait ModerateContractUser: Waitable { contract_id: Identifier, identity_id: Identifier, until: TimestampMillis, + reason: ContractModerationReason, signing_key_to_use: Option<&IdentityPublicKey>, signer: S, settings: Option, @@ -148,7 +159,11 @@ pub trait ModerateContractUser: Waitable { self.moderate_contract_user( sdk, contract_id, - ContractUserModerationAction::Suspend { identity_id, until }, + ContractUserModerationAction::Suspend { + identity_id, + until, + reason, + }, signing_key_to_use, signer, settings, diff --git a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs index b9b8f51a14e..5b8e0db2516 100644 --- a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs @@ -91,7 +91,8 @@ use dpp::consensus::basic::contract_group::{ InvalidContractGroupAdminsError, RedundantContractGroupMembershipError, }; use dpp::consensus::basic::contract_moderation::{ - ContractModerationSelfTargetError, InvalidContractModerationConfigError, + ContractModerationReasonTooLongError, ContractModerationSelfTargetError, + InvalidContractModerationConfigError, }; use dpp::consensus::state::contract_moderation::{ ContractModerationNotEnabledError, ContractModerationTargetNotAllowedError, @@ -1187,6 +1188,9 @@ fn from_basic_error(basic_error: &BasicError) -> JsValue { BasicError::ContractModerationSelfTargetError(e) => { generic_consensus_error!(ContractModerationSelfTargetError, e).into() } + BasicError::ContractModerationReasonTooLongError(e) => { + generic_consensus_error!(ContractModerationReasonTooLongError, e).into() + } } } diff --git a/packages/wasm-dpp2/src/data_contract/mod.rs b/packages/wasm-dpp2/src/data_contract/mod.rs index 201a8b645b5..1985a429a66 100644 --- a/packages/wasm-dpp2/src/data_contract/mod.rs +++ b/packages/wasm-dpp2/src/data_contract/mod.rs @@ -18,4 +18,7 @@ pub use model::{ }; pub use transitions::create::DataContractCreateTransitionWasm; pub use transitions::update::DataContractUpdateTransitionWasm; -pub use transitions::user_moderation::{ContractUserModerationWasm, moderation_action_from_parts}; +pub use transitions::user_moderation::{ + ContractModerationReasonJs, ContractUserModerationWasm, moderation_action_from_parts, + moderation_reason_to_js, +}; diff --git a/packages/wasm-dpp2/src/data_contract/transitions/user_moderation.rs b/packages/wasm-dpp2/src/data_contract/transitions/user_moderation.rs index 2662f61a523..9544fed2daa 100644 --- a/packages/wasm-dpp2/src/data_contract/transitions/user_moderation.rs +++ b/packages/wasm-dpp2/src/data_contract/transitions/user_moderation.rs @@ -4,6 +4,7 @@ use crate::impl_wasm_conversions_inner; use crate::impl_wasm_type_info; use crate::state_transitions::StateTransitionWasm; use crate::utils::{try_from_options, try_to_u16, try_to_u32, try_to_u64}; +use dpp::data_contract::config::moderation::ContractModerationReason; use dpp::platform_value::BinaryData; use dpp::platform_value::string_encoding::Encoding::{Base64, Hex}; use dpp::platform_value::string_encoding::{decode, encode}; @@ -19,18 +20,34 @@ use dpp::state_transition::{ StateTransitionSingleSigned, }; use serde::Deserialize; +use wasm_bindgen::JsValue; use wasm_bindgen::prelude::wasm_bindgen; #[wasm_bindgen(typescript_custom_section)] const CONTRACT_USER_MODERATION_TS: &str = r#" +/** + * Why a moderator banned or suspended an identity. Every ban and every suspension carries + * one, and it is stored with the entry. Nothing checks what a moderator writes. + */ +export interface ContractModerationReason { + /** + * Reserved for the ban codes a contract may declare in a later protocol version: a u16, + * expected to be left out today. A value is stored as written and never checked. A reason + * read back always carries it, `null` when there is none. + */ + code?: number | null; + /** Free text, at most 1024 bytes of UTF-8. May be empty. */ + text: string; +} + /** * What a moderation transition does to one identity on a contract. The wire shape of the * action, as the transition's `action` field carries it. */ export type ContractUserModerationActionJSON = - | { $type: "ban"; identityId: string } + | { $type: "ban"; identityId: string; reason: ContractModerationReason } | { $type: "unban"; identityId: string } - | { $type: "suspend"; identityId: string; until: number | string } + | { $type: "suspend"; identityId: string; until: number | string; reason: ContractModerationReason } | { $type: "unsuspend"; identityId: string }; /** @@ -51,6 +68,8 @@ export interface ContractUserModerationTransitionOptions { identityId: IdentifierLike; /** For a suspend: the block time, in milliseconds, at which the suspension lapses */ until?: bigint; + /** For a ban and a suspend, which both need one: why. Refused beside another action. */ + reason?: ContractModerationReason; userFeeIncrease?: number; } @@ -61,7 +80,12 @@ export interface ContractUserModerationObject { ownerId: Uint8Array; dataContractId: Uint8Array; identityContractNonce: bigint; - action: { $type: string; identityId: Uint8Array; until?: bigint }; + action: { + $type: string; + identityId: Uint8Array; + until?: bigint; + reason?: ContractModerationReason; + }; userFeeIncrease: number; signature?: Uint8Array; signaturePublicKeyId?: number; @@ -91,6 +115,21 @@ extern "C" { #[wasm_bindgen(typescript_type = "ContractUserModerationJSON")] pub type ContractUserModerationJSONJs; + + #[wasm_bindgen(typescript_type = "ContractModerationReason")] + pub type ContractModerationReasonJs; +} + +/// A reason as the plain object JavaScript reads: `code`, `null` when there is none, and +/// `text`. The shape `toJSON()` and `toObject()` give the reason inside a transition, so a +/// reason compares equal whichever call produced it. +pub fn moderation_reason_to_js(reason: &ContractModerationReason) -> JsValue { + let object = js_sys::Object::new(); + // Setting a property on a fresh plain object cannot fail. + let code = reason.code.map_or(JsValue::NULL, JsValue::from); + let _ = js_sys::Reflect::set(&object, &"code".into(), &code); + let _ = js_sys::Reflect::set(&object, &"text".into(), &JsValue::from_str(&reason.text)); + object.into() } /// Serde struct for the primitive fields of the options @@ -101,6 +140,8 @@ struct ContractUserModerationOptionsInput { action: String, #[serde(default)] until: Option, + #[serde(default)] + reason: Option, /// `undefined` reaches serde as a unit value, so the fee is read as an option and defaulted #[serde(default)] user_fee_increase: Option, @@ -123,11 +164,13 @@ impl From for ContractUserModerationTransition { } } -/// The action for a name and a target, `until` given for a suspend. +/// The action for a name and a target, `until` given for a suspend and `reason` for a ban and +/// a suspend. pub fn moderation_action_from_parts( action: &str, identity_id: dpp::prelude::Identifier, until: Option, + reason: Option, ) -> WasmDppResult { // Only a suspension ends: an `until` beside another action is refused rather than dropped, // or a caller asking for a timed ban would sign a permanent one. @@ -136,13 +179,33 @@ pub fn moderation_action_from_parts( "`until` is only valid for a suspend action, not for `{action}`" ))); } + // The same goes for a reason: only an action that adds an entry stores one, and both + // need it. + let adds_an_entry = matches!(action, "ban" | "suspend"); + if reason.is_some() && !adds_an_entry { + return Err(WasmDppError::invalid_argument(format!( + "`reason` is only valid for a ban or a suspend action, not for `{action}`" + ))); + } + let reason = |action: &str| { + reason.ok_or_else(|| { + WasmDppError::invalid_argument(format!("a {action} action needs a `reason`")) + }) + }; match action { - "ban" => Ok(ContractUserModerationAction::Ban { identity_id }), + "ban" => Ok(ContractUserModerationAction::Ban { + identity_id, + reason: reason("ban")?, + }), "unban" => Ok(ContractUserModerationAction::Unban { identity_id }), "suspend" => { let until = until .ok_or_else(|| WasmDppError::invalid_argument("a suspend action needs `until`"))?; - Ok(ContractUserModerationAction::Suspend { identity_id, until }) + Ok(ContractUserModerationAction::Suspend { + identity_id, + until, + reason: reason("suspend")?, + }) } "unsuspend" => Ok(ContractUserModerationAction::Unsuspend { identity_id }), other => Err(WasmDppError::invalid_argument(format!( @@ -167,7 +230,12 @@ impl ContractUserModerationWasm { serde_wasm_bindgen::from_value(options.into()) .map_err(|e| WasmDppError::invalid_argument(e.to_string()))?; - let action = moderation_action_from_parts(&input.action, identity_id.into(), input.until)?; + let action = moderation_action_from_parts( + &input.action, + identity_id.into(), + input.until, + input.reason, + )?; Ok(ContractUserModerationWasm( ContractUserModerationTransition::V0(ContractUserModerationTransitionV0 { @@ -311,6 +379,15 @@ impl ContractUserModerationWasm { self.0.action().until() } + /// For a ban and a suspend, why + #[wasm_bindgen(getter = "reason")] + pub fn reason(&self) -> Option { + self.0 + .action() + .reason() + .map(|reason| moderation_reason_to_js(reason).into()) + } + #[wasm_bindgen(js_name = "toStateTransition")] pub fn to_state_transition(&self) -> StateTransitionWasm { StateTransitionWasm::from(StateTransition::from(self.0.clone())) diff --git a/packages/wasm-dpp2/src/state_transitions/proof_result/convert.rs b/packages/wasm-dpp2/src/state_transitions/proof_result/convert.rs index dc1b73d969b..e08b1244bc7 100644 --- a/packages/wasm-dpp2/src/state_transitions/proof_result/convert.rs +++ b/packages/wasm-dpp2/src/state_transitions/proof_result/convert.rs @@ -329,18 +329,22 @@ pub fn convert_proof_result( ) => { let mut lists = vec![]; let mut banned = None; + let mut ban_reason = None; let mut suspended_until = None; + let mut suspension_reason = None; for status in statuses.0 { match status { - ContractModerationListStatus::Banlist { banned: is_banned } => { + ContractModerationListStatus::Banlist { ban } => { lists.push("banlist".to_string()); - banned = Some(is_banned); + banned = Some(ban.is_some()); + ban_reason = ban.map(|ban| ban.reason); } - ContractModerationListStatus::Suspensions { - suspended_until: until, - } => { + ContractModerationListStatus::Suspensions { suspension } => { lists.push("suspensions".to_string()); - suspended_until = until; + if let Some(suspension) = suspension { + suspended_until = Some(suspension.until); + suspension_reason = Some(suspension.reason); + } } } } @@ -349,7 +353,9 @@ pub fn convert_proof_result( identity_id: identity_id.into(), lists, banned, + ban_reason, suspended_until, + suspension_reason, } .into() } diff --git a/packages/wasm-dpp2/src/state_transitions/proof_result/data_contract.rs b/packages/wasm-dpp2/src/state_transitions/proof_result/data_contract.rs index 2bf655bcdb6..307de1bd37c 100644 --- a/packages/wasm-dpp2/src/state_transitions/proof_result/data_contract.rs +++ b/packages/wasm-dpp2/src/state_transitions/proof_result/data_contract.rs @@ -4,9 +4,12 @@ use super::helpers::js_obj; use crate::DataContractWasm; use crate::IdentifierWasm; use crate::PlatformVersionLikeJs; -use crate::data_contract::{DataContractJSONJs, DataContractObjectJs}; +use crate::data_contract::{ + ContractModerationReasonJs, DataContractJSONJs, DataContractObjectJs, moderation_reason_to_js, +}; use crate::error::{WasmDppError, WasmDppResult}; use crate::impl_wasm_type_info; +use dpp::data_contract::config::moderation::ContractModerationReason; use wasm_bindgen::JsCast; use wasm_bindgen::JsValue; use wasm_bindgen::prelude::*; @@ -87,14 +90,43 @@ pub struct VerifiedContractModerationListStatusesWasm { pub lists: Vec, /// When `lists` includes `banlist`: the identity is on the banlist pub banned: Option, + #[wasm_bindgen(skip)] + pub ban_reason: Option, /// When `lists` includes `suspensions`: the block time, in milliseconds, until which the /// identity is suspended #[wasm_bindgen(js_name = "suspendedUntil")] pub suspended_until: Option, + #[wasm_bindgen(skip)] + pub suspension_reason: Option, +} + +impl VerifiedContractModerationListStatusesWasm { + fn reason_or_undefined(reason: &Option) -> JsValue { + reason + .as_ref() + .map(moderation_reason_to_js) + .unwrap_or(JsValue::UNDEFINED) + } } #[wasm_bindgen(js_class = VerifiedContractModerationListStatuses)] impl VerifiedContractModerationListStatusesWasm { + /// When the identity is banned: why + #[wasm_bindgen(getter = "banReason")] + pub fn ban_reason(&self) -> Option { + self.ban_reason + .as_ref() + .map(|reason| moderation_reason_to_js(reason).into()) + } + + /// When the identity is suspended: why + #[wasm_bindgen(getter = "suspensionReason")] + pub fn suspension_reason(&self) -> Option { + self.suspension_reason + .as_ref() + .map(|reason| moderation_reason_to_js(reason).into()) + } + #[wasm_bindgen(js_name = toObject)] pub fn to_object(&self) -> WasmDppResult { Ok(js_obj(&[ @@ -114,12 +146,17 @@ impl VerifiedContractModerationListStatusesWasm { .map(JsValue::from_bool) .unwrap_or(JsValue::UNDEFINED), ), + ("banReason", Self::reason_or_undefined(&self.ban_reason)), ( "suspendedUntil", self.suspended_until .map(|until| JsValue::from(js_sys::BigInt::from(until))) .unwrap_or(JsValue::UNDEFINED), ), + ( + "suspensionReason", + Self::reason_or_undefined(&self.suspension_reason), + ), ])) } @@ -148,12 +185,17 @@ impl VerifiedContractModerationListStatusesWasm { .map(JsValue::from_bool) .unwrap_or(JsValue::UNDEFINED), ), + ("banReason", Self::reason_or_undefined(&self.ban_reason)), ( "suspendedUntil", self.suspended_until .map(|until| JsValue::from_f64(until as f64)) .unwrap_or(JsValue::UNDEFINED), ), + ( + "suspensionReason", + Self::reason_or_undefined(&self.suspension_reason), + ), ])) } } diff --git a/packages/wasm-dpp2/tests/unit/ContractUserModerationTransition.spec.ts b/packages/wasm-dpp2/tests/unit/ContractUserModerationTransition.spec.ts index bbf24d64c54..e344ee28888 100644 --- a/packages/wasm-dpp2/tests/unit/ContractUserModerationTransition.spec.ts +++ b/packages/wasm-dpp2/tests/unit/ContractUserModerationTransition.spec.ts @@ -12,18 +12,30 @@ const TARGET_ID = '2QjL594djCH2NyDsn45vd6yQjEDHupMKo7CEGVTHtQxU'; interface ModerationOptions { action?: 'ban' | 'unban' | 'suspend' | 'unsuspend'; until?: bigint; + /** `null` leaves the reason out; left undefined, a ban and a suspend get `REASON` */ + reason?: { code?: number; text: string } | null; identityContractNonce?: bigint; userFeeIncrease?: number; } +const REASON = { text: 'spam' }; + function createTransition(options: ModerationOptions = {}) { + const action = options.action ?? 'ban'; + const addsAnEntry = action === 'ban' || action === 'suspend'; + let { reason } = options; + if (reason === undefined && addsAnEntry) { + reason = REASON; + } + return new wasm.ContractUserModeration({ ownerId: OWNER_ID, dataContractId: CONTRACT_ID, identityContractNonce: options.identityContractNonce ?? BigInt(7), - action: options.action ?? 'ban', + action, identityId: TARGET_ID, until: options.until, + reason: reason ?? undefined, userFeeIncrease: options.userFeeIncrease, }); } @@ -40,14 +52,37 @@ describe('ContractUserModeration', () => { expect(transition.identityId.toString()).to.equal(TARGET_ID); expect(transition.identityContractNonce).to.equal(BigInt(7)); expect(transition.until).to.equal(undefined); + expect(transition.reason).to.deep.equal({ code: null, text: 'spam' }); expect(transition.userFeeIncrease).to.equal(0); }); + it('should keep a reason code as written, and an empty text', () => { + const transition = createTransition({ reason: { code: 65535, text: '' } }); + + expect(transition.reason).to.deep.equal({ code: 65535, text: '' }); + }); + + it('should refuse a ban or a suspension without a reason', () => { + expect(() => createTransition({ action: 'ban', reason: null })).to.throw(); + expect(() => createTransition({ action: 'suspend', until: BigInt(5), reason: null })).to.throw(); + }); + + it('should refuse a reason on an unban or an unsuspend', () => { + (['unban', 'unsuspend'] as const).forEach((action) => { + expect(() => createTransition({ action, reason: REASON })).to.throw(); + }); + }); + + it('should refuse a reason code that is not a u16', () => { + expect(() => createTransition({ reason: { code: 65536, text: 'spam' } })).to.throw(); + }); + it('should create a suspension with its end', () => { const transition = createTransition({ action: 'suspend', until: BigInt(1800000000000) }); expect(transition.action).to.equal('suspend'); expect(transition.until).to.equal(BigInt(1800000000000)); + expect(transition.reason).to.deep.equal({ code: null, text: 'spam' }); }); it('should refuse a suspension without an end', () => { @@ -112,7 +147,14 @@ describe('ContractUserModeration', () => { expect(json.ownerId).to.equal(OWNER_ID); expect(json.dataContractId).to.equal(CONTRACT_ID); expect(json.identityContractNonce).to.equal(7); - expect(json.action).to.deep.equal({ $type: 'suspend', identityId: TARGET_ID, until: 1800000000000 }); + expect(json.action).to.deep.equal({ + $type: 'suspend', + identityId: TARGET_ID, + until: 1800000000000, + reason: { code: null, text: 'spam' }, + }); + // The getter gives the reason the shape it has in the JSON + expect(createTransition({ action: 'suspend', until: BigInt(5) }).reason).to.deep.equal(json.action.reason); expect(json.userFeeIncrease).to.equal(4); expect(json.signature).to.equal(''); expect(json.signaturePublicKeyId).to.equal(0); @@ -125,6 +167,7 @@ describe('ContractUserModeration', () => { const restored = wasm.ContractUserModeration.fromJSON(transition.toJSON()); + expect(restored.reason).to.equal(undefined); expect(restored.action).to.equal('unban'); expect(restored.identityId.toString()).to.equal(TARGET_ID); expect(restored.identityContractNonce).to.equal(BigInt(7)); @@ -135,7 +178,11 @@ describe('ContractUserModeration', () => { describe('toObject() / fromObject()', () => { it('should round trip through a plain object', () => { - const transition = createTransition({ action: 'suspend', until: BigInt(9) }); + const transition = createTransition({ + action: 'suspend', + until: BigInt(9), + reason: { code: 3, text: 'flooding' }, + }); const obj = transition.toObject(); expect(obj.$formatVersion).to.equal('0'); @@ -145,8 +192,11 @@ describe('ContractUserModeration', () => { expect(obj.action.$type).to.equal('suspend'); expect(obj.action.until).to.equal(BigInt(9)); + expect(obj.action.reason).to.deep.equal({ code: 3, text: 'flooding' }); + const restored = wasm.ContractUserModeration.fromObject(obj); expect(restored.until).to.equal(BigInt(9)); + expect(restored.reason).to.deep.equal({ code: 3, text: 'flooding' }); expect(restored.toBytes()).to.deep.equal(transition.toBytes()); }); }); diff --git a/packages/wasm-sdk/src/queries/contract_moderation.rs b/packages/wasm-sdk/src/queries/contract_moderation.rs index 9f7276521d7..b80ae0c8674 100644 --- a/packages/wasm-sdk/src/queries/contract_moderation.rs +++ b/packages/wasm-sdk/src/queries/contract_moderation.rs @@ -16,6 +16,7 @@ use js_sys::Array; use serde::Deserialize; use wasm_bindgen::prelude::wasm_bindgen; use wasm_bindgen::JsValue; +use wasm_dpp2::data_contract::moderation_reason_to_js; use wasm_dpp2::identifier::IdentifierWasm; #[wasm_bindgen(typescript_custom_section)] @@ -49,12 +50,16 @@ export interface ContractModerationStatus { lists: ContractModerationListKind[]; /** Set when `lists` includes `banlist`: the identity is on the banlist. */ banned?: boolean; + /** When the identity is banned: why, as the moderator wrote it. */ + banReason?: ContractModerationReason; /** * When `lists` includes `suspensions`: the block time, in milliseconds, until which the * identity is suspended; undefined when it is not. A lapsed suspension stays until the * identity's next document transition sweeps it. */ suspendedUntil?: bigint; + /** When the identity is suspended: why, as the moderator wrote it. */ + suspensionReason?: ContractModerationReason; } /** @@ -80,6 +85,8 @@ export interface ContractModerationEntry { identityId: string; /** For a suspension list entry: the block time, in milliseconds, at which it lapses. */ until?: bigint; + /** Why the identity is on the list, as the moderator wrote it. */ + reason: ContractModerationReason; } /** @@ -194,7 +201,8 @@ fn parse_entries_query( Ok(page_query) } -/// Sets `lists`, and `banned` and `suspendedUntil` for the lists read, on `target`. Only the +/// Sets `lists`, and `banned` and `suspendedUntil` for the lists read, each with the reason of +/// the entry found, on `target`. Only the /// lists read are reported: the field of a list that was not read stays undefined (unknown) /// rather than reading as "not banned" or "not suspended". The status query and the moderation /// result share the shape, so they share this. @@ -210,14 +218,24 @@ pub(crate) fn set_status_fields( let lists = Array::new(); for status in &statuses.0 { match status { - ContractModerationListStatus::Banlist { banned } => { + ContractModerationListStatus::Banlist { ban } => { lists.push(&"banlist".into()); - set("banned", (*banned).into())?; + set("banned", ban.is_some().into())?; + if let Some(ban) = ban { + set("banReason", moderation_reason_to_js(&ban.reason))?; + } } - ContractModerationListStatus::Suspensions { suspended_until } => { + ContractModerationListStatus::Suspensions { suspension } => { lists.push(&"suspensions".into()); - if let Some(until) = suspended_until { - set("suspendedUntil", js_sys::BigInt::from(*until).into())?; + if let Some(suspension) = suspension { + set( + "suspendedUntil", + js_sys::BigInt::from(suspension.until).into(), + )?; + set( + "suspensionReason", + moderation_reason_to_js(&suspension.reason), + )?; } } } @@ -251,6 +269,7 @@ fn entries_to_js( if let Some(until) = entry.until { set(&js_entry, "until", js_sys::BigInt::from(until).into())?; } + set(&js_entry, "reason", moderation_reason_to_js(&entry.reason))?; entries.push(&js_entry); } set(&result, "entries", entries.into())?; diff --git a/packages/wasm-sdk/src/state_transitions/contract.rs b/packages/wasm-sdk/src/state_transitions/contract.rs index cc347e2affa..bd674eeb62d 100644 --- a/packages/wasm-sdk/src/state_transitions/contract.rs +++ b/packages/wasm-sdk/src/state_transitions/contract.rs @@ -7,6 +7,7 @@ use crate::queries::contract_moderation::set_status_fields; use crate::sdk::WasmSdk; use crate::settings::{get_user_fee_increase, PutSettingsInput}; use dash_sdk::dpp::data_contract::accessors::v0::DataContractV0Getters; +use dash_sdk::dpp::data_contract::config::moderation::ContractModerationReason; use dash_sdk::dpp::data_contract::DataContract; use dash_sdk::dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dash_sdk::dpp::identity::IdentityPublicKey; @@ -247,10 +248,10 @@ impl WasmSdk { #[wasm_bindgen(typescript_custom_section)] const CONTRACT_MODERATION_OPTIONS_TS: &'static str = r#" /** - * Options for banning, unbanning, suspending or unsuspending one identity on a moderated data - * contract (protocol version 14). The signer must hold a CRITICAL authentication key without - * contract bounds of the moderating identity: the contract owner, or a moderator the contract's - * config names. + * Options for moderating one identity on a moderated data contract (protocol version 14): all + * an unban and an unsuspend take, and the base of the options of a ban and a suspend. The signer + * must hold a CRITICAL authentication key without contract bounds of the moderating identity: + * the contract owner, or a moderator the contract's config names. */ export interface ContractModerationOptions { /** The moderating identity: the contract owner or a named moderator */ @@ -259,14 +260,26 @@ export interface ContractModerationOptions { contractId: IdentifierLike; /** The identity to moderate */ identityId: IdentifierLike; - /** For a suspension: the block time, in milliseconds, at which it lapses */ - until?: bigint; /** Signer holding a CRITICAL authentication key without contract bounds of the identity */ signer: IdentitySigner; /** Optional broadcast settings */ settings?: PutSettings; } +/** Options for banning an identity: a ban needs a reason. */ +export interface ContractBanOptions extends ContractModerationOptions { + /** Why. Stored with the banlist entry, so anyone reading the list reads it. */ + reason: ContractModerationReason; +} + +/** Options for suspending an identity: a suspension needs its end and a reason. */ +export interface ContractSuspendOptions extends ContractModerationOptions { + /** The block time, in milliseconds, at which the suspension lapses */ + until: bigint; + /** Why. Stored with the suspension list entry, so anyone reading the list reads it. */ + reason: ContractModerationReason; +} + /** * The moderated identity's status on the lists the moderation touched, as its proof shows it. * A ban proves every list the contract keeps (it removes a suspension too); an unban, a @@ -281,11 +294,15 @@ export interface ContractModerationResult { lists: ContractModerationListKind[]; /** Set when `lists` includes `banlist`: the identity is on the banlist */ banned?: boolean; + /** When the identity is banned: why */ + banReason?: ContractModerationReason; /** * When `lists` includes `suspensions`: the block time, in milliseconds, until which the * identity is suspended; undefined when it is not suspended */ suspendedUntil?: bigint; + /** When the identity is suspended: why */ + suspensionReason?: ContractModerationReason; } "#; @@ -294,6 +311,12 @@ extern "C" { #[wasm_bindgen(typescript_type = "ContractModerationOptions")] pub type ContractModerationOptionsJs; + #[wasm_bindgen(typescript_type = "ContractBanOptions")] + pub type ContractBanOptionsJs; + + #[wasm_bindgen(typescript_type = "ContractSuspendOptions")] + pub type ContractSuspendOptionsJs; + #[wasm_bindgen(typescript_type = "ContractModerationResult")] pub type ContractModerationResultJs; } @@ -303,6 +326,8 @@ extern "C" { struct ContractModerationOptionsInput { #[serde(default)] until: Option, + #[serde(default)] + reason: Option, } impl WasmSdk { @@ -336,7 +361,7 @@ impl WasmSdk { "contract moderation options", )?; - let action = moderation_action_from_parts(action, identity_id, parsed.until) + let action = moderation_action_from_parts(action, identity_id, parsed.until, parsed.reason) .map_err(|e| WasmSdkError::invalid_argument(e.to_string()))?; // The proof of a ban covers every list the contract keeps, which the verifier reads @@ -383,14 +408,15 @@ impl WasmSdk { /// Puts an identity on a moderated contract's banlist. A banned identity cannot act on the /// contract at the document level until it is unbanned. /// - /// @param options - The moderating identity, the contract, the target and the signer + /// @param options - The moderating identity, the contract, the target, the `reason` and the signer /// @returns The target's status on the contract, proved #[wasm_bindgen(js_name = "contractBanUser")] pub async fn contract_ban_user( &self, - options: ContractModerationOptionsJs, + options: ContractBanOptionsJs, ) -> Result { - self.moderate_contract_user(options, "ban").await + self.moderate_contract_user(options.unchecked_into(), "ban") + .await } /// Takes an identity off a moderated contract's banlist. @@ -409,14 +435,15 @@ impl WasmSdk { /// milliseconds, replacing a suspension it already carries. The first document transition /// of the identity after the suspension lapses sweeps it. /// - /// @param options - The moderating identity, the contract, the target, `until` and the signer + /// @param options - The moderating identity, the contract, the target, `until`, the `reason` and the signer /// @returns The target's status on the contract, proved #[wasm_bindgen(js_name = "contractSuspendUser")] pub async fn contract_suspend_user( &self, - options: ContractModerationOptionsJs, + options: ContractSuspendOptionsJs, ) -> Result { - self.moderate_contract_user(options, "suspend").await + self.moderate_contract_user(options.unchecked_into(), "suspend") + .await } /// Takes an identity off a moderated contract's suspension list, lapsed or not.