```{eval-rst} .. _reference-dapi-endpoints-platform-grpc: ``` # Platform gRPC Endpoints Please refer to the [gRPC Overview](../reference/dapi-endpoints-grpc-overview.md) for details regarding running the examples shown below, encoding/decoding the request/response data, and clients available for several languages. ## Data Proofs and Metadata Platform gRPC endpoints can provide [proofs](https://github.com/dashpay/platform/blob/master/packages/dapi-grpc/protos/platform/v0/platform.proto#L17-L22) so the data returned for a request can be verified as being valid. When requesting proofs, the data requested will be encoded as part of the proof in the response. Full support is not yet available in the JavaScript client, but can be used via the low level [dapi-grpc library](https://github.com/dashevo/platform/tree/master/packages/dapi-grpc). Some [additional metadata](https://github.com/dashevo/platform/blob/master/packages/dapi-grpc/protos/platform/v0/platform.proto#L48-L55) is also provided with responses: | Metadata field | Description | | :---------------------- | :---------------------------------------------------- | | `height` | Last committed platform chain height | | `coreChainLockedHeight` | Height of the most recent ChainLock on the core chain | | `epoch` | The current Platform epoch | | `timeMs` | Unix timestamp in milliseconds for the response | | `protocolVersion` | Platform protocol version | | `chainId` | Name of the network | ## Versioning Dash Platform 0.25.16 included a [breaking change that added versioning](https://github.com/dashpay/platform/pull/1522) to these endpoints so future updates can be done without creating significant issues for API consumers. ## Endpoint Details ### broadcastStateTransition > 📘 > > **Note:** The [`waitForStateTransitionResult` endpoint](#waitforstatetransitionresult) should be used in conjunction with this one for instances where proof of block confirmation is required. Broadcasts a [state transition](../explanations/platform-protocol-state-transition.md) to the platform via DAPI to make a change to layer 2 data. The `broadcastStateTransition` call returns once the state transition has been accepted into the mempool. **Returns**: Nothing or error **Parameters**: | Name | Type | Required | Description | | ------------------ | -------------- | -------- | -------------------------------------------------------------------- | | `state_transition` | Bytes (Base64) | Yes | A [state transition](../explanations/platform-protocol-state-transition.md) | ```{eval-rst} .. Commented out info [block:html] { "html": "\n\n\n\n" } [/block] ``` **Response**: No response except on error ### getIdentity > 🚧 Breaking changes > > Due to serialization changes in Dash Platform 0.25, using wasm-dpp is recommended when working with identities, data contracts, and documents. **Returns**: [Identity](../explanations/identity.md) information for the requested identity **Parameters**: | Name | Type | Required | Description | | ------- | ------- | -------- | --------------------------------------------------------------------- | | `id` | Bytes | Yes | An identity `id` | | `prove` | Boolean | No | Set to `true` to receive a proof that contains the requested identity | > 📘 > > **Note**: When requesting proofs, the data requested will be encoded as part of the proof in the response. **Example Request and Response** ::::{tab-set} :::{tab-item} JavaScript (dapi-client) :sync: js-dapi-client ```javascript const DAPIClient = require('@dashevo/dapi-client'); const { default: loadDpp, DashPlatformProtocol, Identifier, } = require('@dashevo/wasm-dpp'); loadDpp(); const dpp = new DashPlatformProtocol(); const client = new DAPIClient(); const identityId = Identifier.from('4EfA9Jrvv3nnCFdSf7fad59851iiTRZ6Wcu6YVJ4iSeF'); client.platform.getIdentity(identityId).then((response) => { const identity = dpp.identity.createFromBuffer(response.getIdentity()); console.log(identity.toJSON()); }); ``` ::: :::{tab-item} JavaScript (dapi-grpc) :sync: js-dapi-grpc ```javascript const { v0: { PlatformPromiseClient, GetIdentityRequest }, } = require('@dashevo/dapi-grpc'); const { default: loadDpp, DashPlatformProtocol, Identifier, } = require('@dashevo/wasm-dpp'); loadDpp(); const dpp = new DashPlatformProtocol(null); const platformPromiseClient = new PlatformPromiseClient( 'https://seed-1.testnet.networks.dash.org:1443', ); const id = Identifier.from('4EfA9Jrvv3nnCFdSf7fad59851iiTRZ6Wcu6YVJ4iSeF'); const idBuffer = Buffer.from(id); const getIdentityRequest = new GetIdentityRequest(); getIdentityRequest.setId(idBuffer); getIdentityRequest.setProve(false); platformPromiseClient .getIdentity(getIdentityRequest) .then((response) => { const identity = dpp.identity.createFromBuffer(response.getIdentity()); console.dir(identity.toJSON()); }) .catch((e) => console.error(e)); ``` ::: :::{tab-item} gRPCurl :sync: grpcurl ```shell # `id` must be represented in base64 grpcurl -proto protos/platform/v0/platform.proto \ -d '{ "v0": { "id": "MBLBm5jsADOt2zbNZLf1EGcPKjUaQwS19plBRChu/aw=" } }' \ seed-1.testnet.networks.dash.org:1443 \ org.dash.platform.dapi.v0.Platform/getIdentity ``` ::: :::: ::::{tab-set} :::{tab-item} Response (JavaScript) :sync: js-dapi-client ```json { "$version":"0", "id":"4EfA9Jrvv3nnCFdSf7fad59851iiTRZ6Wcu6YVJ4iSeF", "publicKeys":[ { "$version":"0", "id":0, "purpose":0, "securityLevel":0, "contractBounds":null, "type":0, "readOnly":false, "data":"Asi0dHtSjKxf3femzGNwLuBO19EzKQTghRA0PqANzlRq", "disabledAt":null }, { "$version":"0", "id":1, "purpose":0, "securityLevel":2, "contractBounds":null, "type":0, "readOnly":false, "data":"AgHuKPhPVIU5BWfpOcK1hgELY6aeySyrU13JaoxxkTYC", "disabledAt":null } ], "balance":17912102140, "revision":0 } ``` ::: :::{tab-item} Response (gRPCurl) :sync: grpcurl ```json { "v0": { "identity": "ADASwZuY7AAzrds2zWS39RBnDyo1GkMEtfaZQUQobv2sAgAAAAAAAAAAIQLItHR7UoysX933psxjcC7gTtfRMykE4IUQND6gDc5UagABAAEAAgAAACECAe4o+E9UhTkFZ+k5wrWGAQtjpp7JLKtTXclqjHGRNgIA/QAAAAQrpPz8AA==", "metadata": { "height": "6730", "coreChainLockedHeight": 926904, "epoch": 844, "timeMs": "1701959872131", "protocolVersion": 1, "chainId": "dash-testnet-37" } } } ``` :::: ### getIdentityBalance **Returns**: Credit balance for the requested [Identity](../explanations/identity.md) **Parameters**: | Name | Type | Required | Description | | ------- | ------- | -------- | ------------ | | `id` | Bytes | Yes | An identity ID | `prove` | Boolean | No | Set to `true` to receive a proof that contains the requested identity **Example Request and Response** ::::{tab-set} :::{tab-item} gRPCurl :sync: grpcurl ```shell # `id` must be represented in base64 grpcurl -proto protos/platform/v0/platform.proto \ -d '{ "v0": { "id": "MBLBm5jsADOt2zbNZLf1EGcPKjUaQwS19plBRChu/aw=" } }' \ seed-1.testnet.networks.dash.org:1443 \ org.dash.platform.dapi.v0.Platform/getIdentityBalance ``` ::: :::: ::::{tab-set} :::{tab-item} Response (gRPCurl) :sync: grpcurl ```json { "v0": { "balance": "17912102140", "metadata": { "height": "6858", "coreChainLockedHeight": 927080, "epoch": 850, "timeMs": "1701983632299", "protocolVersion": 1, "chainId": "dash-testnet-37" } } } ``` ::: :::: ### getIdentityBalanceAndRevision **Returns**: Credit balance and identity revision for the requested [Identity](../explanations/identity.md) **Parameters**: | Name | Type | Required | Description | | ------- | ------- | -------- | ------------ | | `id` | Bytes | Yes | An identity ID | `prove` | Boolean | No | Set to `true` to receive a proof that contains the requested identity **Example Request and Response** ::::{tab-set} :::{tab-item} gRPCurl :sync: grpcurl ```shell # `id` must be represented in base64 grpcurl -proto protos/platform/v0/platform.proto \ -d '{ "v0": { "id": "MBLBm5jsADOt2zbNZLf1EGcPKjUaQwS19plBRChu/aw=" } }' \ seed-1.testnet.networks.dash.org:1443 \ org.dash.platform.dapi.v0.Platform/getIdentityBalanceAndRevision ``` ::: :::: ::::{tab-set} :::{tab-item} Response (gRPCurl) :sync: grpcurl ```json { "v0": { "balance_and_revision": { "balance": "17912102140", "revision": "0" }, "metadata": { "height": "6862", "core_chain_locked_height": 927086, "epoch": 851, "time_ms": "1701984361792", "protocol_version": 1, "chain_id": "dash-testnet-37" } } } ``` ::: :::: ### getIdentityByPublicKeyHash **Returns**: An [identity](../explanations/identity.md) associated with the provided public key hash **Parameters**: | Name | Type | Required | Description | | ------- | ------- | -------- | ------------ | | `public_key_hash` | Bytes | Yes | Public key hash (sha256-ripemd160) of identity public key | `prove` | Boolean | No | Set to `true` to receive a proof that contains the requested identity **Example Request and Response** ::::{tab-set} :::{tab-item} gRPCurl :sync: grpcurl ```shell # `id` must be represented in base64 grpcurl -proto protos/platform/v0/platform.proto \ -d '{ "v0": { "public_key_hash": "uNFZGqdNRA4K+cC+FsVbvBQYR/c=" } }' \ seed-1.testnet.networks.dash.org:1443 \ org.dash.platform.dapi.v0.Platform/getIdentityByPublicKeyHash ``` ::: :::: ::::{tab-set} :::{tab-item} Response (gRPCurl) :sync: grpcurl ```json { "v0": { "identity": "ADASwZuY7AAzrds2zWS39RBnDyo1GkMEtfaZQUQobv2sAgAAAAAAAAAAIQLItHR7UoysX933psxjcC7gTtfRMykE4IUQND6gDc5UagABAAEAAgAAACECAe4o+E9UhTkFZ+k5wrWGAQtjpp7JLKtTXclqjHGRNgIA/QAAAAQ8fEg8AA==", "metadata": { "height": "6870", "coreChainLockedHeight": 927094, "epoch": 851, "timeMs": "1701985137472", "protocolVersion": 1, "chainId": "dash-testnet-37" } } } ``` ::: :::: ### getIdentityContractNonce **Returns**: Current contract nonce for the requested [Identity](../explanations/identity.md) **Parameters**: | Name | Type | Required | Description | | ------- | ------- | -------- | ------------ | | `identity_id` | Bytes | Yes | An identity ID | `contract_id` | Bytes | Yes | A contract ID | `prove` | Boolean | No | Set to `true` to receive a proof that contains the requested identity contract nonce **Example Request and Response** ::::{tab-set} :::{tab-item} JavaScript (dapi-client) :sync: js-dapi-client ```javascript const DAPIClient = require('@dashevo/dapi-client'); const { default: loadDpp, DashPlatformProtocol, Identifier, } = require('@dashevo/wasm-dpp'); loadDpp(); const dpp = new DashPlatformProtocol(null); const client = new DAPIClient(); const identityId = Identifier.from('4EfA9Jrvv3nnCFdSf7fad59851iiTRZ6Wcu6YVJ4iSeF'); const contractId = Identifier.from('GWRSAVFMjXx8HpQFaNJMqBV7MBgMK4br5UESsB4S31Ec'); client.platform.getIdentityContractNonce(identityId, contractId).then((response) => { console.log(`Current identity contract nonce: ${response.getIdentityContractNonce()}`); }); ``` ::: :::{tab-item} gRPCurl :sync: grpcurl ```shell # `id` must be represented in base64 grpcurl -proto protos/platform/v0/platform.proto \ -d '{ "v0": { "identity_id": "MBLBm5jsADOt2zbNZLf1EGcPKjUaQwS19plBRChu/aw=", "contract_id": "5mjGWa9mruHnLBht3ntbfgodcSoJxA1XIfYiv1PFMVU=" } }' \ seed-1.testnet.networks.dash.org:1443 \ org.dash.platform.dapi.v0.Platform/getIdentityContractNonce ``` ::: :::: ::::{tab-set} :::{tab-item} Response (dapi-client) :sync: js-dapi-client ```text Current identity contract nonce: 0 ``` ::: :::{tab-item} Response (gRPCurl) :sync: grpcurl ```json { "v0": { "identityContractNonce": "0", "metadata": { "height": "4039", "coreChainLockedHeight": 1021684, "epoch": 200, "timeMs": "1715111140075", "protocolVersion": 1, "chainId": "dash-testnet-45" } } } ``` ::: :::: ### getIdentityKeys **Returns**: Keys for an [Identity](../explanations/identity.md). **Parameters**: | Name | Type | Required | Description | | ------- | ------- | -------- | ------------ | | `identity_td` | String | Yes | An identity ID | `request_type` | [KeyRequestType](#request-types) | Yes | Request all keys (`all_keys`), specific keys (`specific_keys`), search for keys (`search_key`) | `limit` | Integer | Yes | The maximum number of revisions to return | | `offset` | Integer | Yes | The offset of the first revision to return | | `prove` | Boolean | No | Set to `true` to receive a proof that contains the requested identity #### Request Types **All keys** To request all keys for an identity, use the `all_keys` request type: ```json "all_keys": {} ``` **Specific keys** To request specific keys for an identity, use the `specific_keys` request type where `key_ids` is an array containing the key IDs to request: ```json "specific_keys": { "key_ids": [ 1 ] } ``` **Search keys** To search for identity keys, use the `search_keys` request type. The options for `security_Level_map` are "CURRENT_KEY_OF_KIND_REQUEST" and "ALL_KEYS_OF_KIND_REQUEST": ```json "search_key": { "purpose_map": { "0": { "security_level_map": { "0": "ALL_KEYS_OF_KIND_REQUEST" } } } } ``` #### Example Request and Response ::::{tab-set} :::{tab-item} gRPCurl (All keys) ```shell # Request all identity keys # `identityId` must be represented in base64 grpcurl -proto protos/platform/v0/platform.proto \ -d '{ "v0": { "identity_id": "MBLBm5jsADOt2zbNZLf1EGcPKjUaQwS19plBRChu/aw=", "request_type": { "allKeys": {} } } }' \ seed-1.testnet.networks.dash.org:1443 \ org.dash.platform.dapi.v0.Platform/getIdentityKeys ``` ::: :::{tab-item} gRPCurl (Specific keys) ```shell # Request specific keys # `identityId` must be represented in base64 grpcurl -proto protos/platform/v0/platform.proto \ -d '{ "v0": { "identity_id": "MBLBm5jsADOt2zbNZLf1EGcPKjUaQwS19plBRChu/aw=", "request_type": { "specificKeys": { "keyIds": [ 1 ] } } } }' \ seed-1.testnet.networks.dash.org:1443 \ org.dash.platform.dapi.v0.Platform/getIdentityKeys ``` ::: :::{tab-item} gRPCurl (Search keys) ```shell # Search keys # `identityId` must be represented in base64 grpcurl -proto protos/platform/v0/platform.proto \ -d '{ "v0": { "identity_id": "MBLBm5jsADOt2zbNZLf1EGcPKjUaQwS19plBRChu/aw=", "request_type": { "search_key": { "purpose_map": { "0": { "security_level_map": { "0": "ALL_KEYS_OF_KIND_REQUEST" } } } } } } }' \ seed-1.testnet.networks.dash.org:1443 \ org.dash.platform.dapi.v0.Platform/getIdentityKeys ``` ::: :::: ::::{tab-set} :::{tab-item} Response (gRPCurl) :sync: grpcurl ```json // All keys { "v0": { "keys": { "keysBytes": [ "AAAAAAAAACECyLR0e1KMrF/d96bMY3Au4E7X0TMpBOCFEDQ+oA3OVGoA", "AAEAAgAAACECAe4o+E9UhTkFZ+k5wrWGAQtjpp7JLKtTXclqjHGRNgIA" ] }, "metadata": { "height": "9240", "coreChainLockedHeight": 929379, "epoch": 941, "timeMs": "1702309782764", "protocolVersion": 1, "chainId": "dash-testnet-37" } } } ``` ::: :::: ### getIdentityNonce **Returns**: Current nonce for the requested [Identity](../explanations/identity.md) **Parameters**: | Name | Type | Required | Description | | ------- | ------- | -------- | ------------ | | `identity_id` | Bytes | Yes | An identity ID | `prove` | Boolean | No | Set to `true` to receive a proof that contains the requested identity nonce **Example Request and Response** ::::{tab-set} :::{tab-item} JavaScript (dapi-client) :sync: js-dapi-client ```javascript const DAPIClient = require('@dashevo/dapi-client'); const { default: loadDpp, DashPlatformProtocol, Identifier, } = require('@dashevo/wasm-dpp'); loadDpp(); const dpp = new DashPlatformProtocol(null); const client = new DAPIClient(); const identityId = Identifier.from('4EfA9Jrvv3nnCFdSf7fad59851iiTRZ6Wcu6YVJ4iSeF'); client.platform.getIdentityNonce(identityId).then((response) => { console.log(`Current identity nonce: ${response.getIdentityNonce()}`); }); ``` ::: :::{tab-item} gRPCurl :sync: grpcurl ```shell # `id` must be represented in base64 grpcurl -proto protos/platform/v0/platform.proto \ -d '{ "v0": { "identity_id": "MBLBm5jsADOt2zbNZLf1EGcPKjUaQwS19plBRChu/aw=" } }' \ seed-1.testnet.networks.dash.org:1443 \ org.dash.platform.dapi.v0.Platform/getIdentityNonce ``` ::: :::: ::::{tab-set} :::{tab-item} Response (dapi-client) :sync: js-dapi-client ```text Current identity nonce: 0 ``` ::: :::{tab-item} Response (gRPCurl) :sync: grpcurl ```json { "v0": { "identityNonce": "0", "metadata": { "height": "4035", "coreChainLockedHeight": 1021681, "epoch": 200, "timeMs": "1715110406689", "protocolVersion": 1, "chainId": "dash-testnet-45" } } } ``` ::: :::: ### getIdentitiesContractKeys **Returns**: Keys associated to a specific contract for multiple [Identities](../explanations/identity.md). **Parameters**: | Name | Type | Required | Description | |----------------------|-------------------------|----------|-------------| | `identities_ids` | Array of Strings | Yes | An array of identity IDs | | `contract_id` | String | Yes | The ID of the contract | | `document_type_name` | String | No | Name of the document type | | `purposes` | Array of [KeyPurpose](#key-purposes) | No | Array of purposes for which keys are requested | | `prove` | Boolean | No | Set to `true` to receive a proof that contains the requested identity keys | #### Key Purposes **Key Purposes** define the intent of usage for each key. Here are the available purposes: - `AUTHENTICATION` - Keys used for authentication purposes. - `ENCRYPTION` - Keys used for encrypting data. - `DECRYPTION` - Keys used for decrypting data. - `TRANSFER` - Keys used for transferring assets. - `VOTING` - Keys used for voting mechanisms. #### Example Request and Response ::::{tab-set} :::{tab-item} gRPCurl ```shell # Request identity keys associated with the specified contract # `identities_ids` and `contract_id` must be represented in base64 grpcurl -proto protos/platform/v0/platform.proto \ -d '{ "v0": { "identities_ids": [ "MBLBm5jsADOt2zbNZLf1EGcPKjUaQwS19plBRChu/aw=", "NBgQk65dTNttDYDGLZNLrb1QEAWB91jqkqXtK1KU4Dc=" ], "purposes": [], "contract_id": "5mjGWa9mruHnLBht3ntbfgodcSoJxA1XIfYiv1PFMVU=" } }' \ seed-1.testnet.networks.dash.org:1443 \ org.dash.platform.dapi.v0.Platform/getIdentitiesContractKeys ``` ::: :::: ::::{tab-set} :::{tab-item} Response (gRPCurl) :sync: grpcurl ```json { "v0": { "identitiesKeys": {}, "metadata": { "height": "3994", "coreChainLockedHeight": 1021628, "epoch": 198, "timeMs": "1715102626945", "protocolVersion": 1, "chainId": "dash-testnet-45" } } } ``` ::: :::: ### getDataContract > 🚧 Breaking changes > > Due to serialization changes in Dash Platform 0.25, using wasm-dpp is recommended when working with identities, data contracts, and documents. **Returns**: [Data Contract](../explanations/platform-protocol-data-contract.md) information for the requested data contract **Parameters**: | Name | Type | Required | Description | | ------- | ------- | -------- | -------------------------------------------------------------------------- | | `id` | Bytes | Yes | A data contract `id` | | `prove` | Boolean | No | Set to `true` to receive a proof that contains the requested data contract | > 📘 > > **Note**: When requesting proofs, the data requested will be encoded as part of the proof in the response. **Example Request and Response** ::::{tab-set} :::{tab-item} JavaScript (dapi-client) :sync: js-dapi-client ```javascript const DAPIClient = require('@dashevo/dapi-client'); const { default: loadDpp, DashPlatformProtocol, Identifier, } = require('@dashevo/wasm-dpp'); loadDpp(); const dpp = new DashPlatformProtocol(null); const client = new DAPIClient(); const contractId = Identifier.from('GWRSAVFMjXx8HpQFaNJMqBV7MBgMK4br5UESsB4S31Ec'); client.platform.getDataContract(contractId).then((response) => { dpp.dataContract.createFromBuffer(response.getDataContract()).then((dataContract) => { console.dir(dataContract.toJSON(), { depth: 10 }); }); }); ``` ::: :::{tab-item} JavaScript (dapi-grpc) :sync: js-dapi-grpc ```javascript const { v0: { PlatformPromiseClient, GetDataContractRequest }, } = require('@dashevo/dapi-grpc'); const { default: loadDpp, DashPlatformProtocol, Identifier } = require('@dashevo/wasm-dpp'); const platformPromiseClient = new PlatformPromiseClient( 'https://seed-1.testnet.networks.dash.org:1443', ); const contractId = Identifier.from('GWRSAVFMjXx8HpQFaNJMqBV7MBgMK4br5UESsB4S31Ec'); const contractIdBuffer = Buffer.from(contractId); const getDataContractRequest = new GetDataContractRequest(); getDataContractRequest.setId(contractIdBuffer); platformPromiseClient .getDataContract(getDataContractRequest) .then((response) => { dpp.dataContract.createFromBuffer(response.getDataContract()).then((dataContract) => { console.dir(dataContract.toJSON(), { depth: 10 }); }); }) .catch((e) => console.error(e)); ``` ::: :::{tab-item} gRPCurl :sync: grpcurl ```shell # `id` must be represented in base64 grpcurl -proto protos/platform/v0/platform.proto \ -d '{ "v0": { "id":"5mjGWa9mruHnLBht3ntbfgodcSoJxA1XIfYiv1PFMVU=" } }' \ seed-1.testnet.networks.dash.org:1443 \ org.dash.platform.dapi.v0.Platform/getDataContract ``` ::: :::: ::::{tab-set} :::{tab-item} Response (JavaScript) :sync: js-dapi-client ```json { "$format_version":"0", "id":"GWRSAVFMjXx8HpQFaNJMqBV7MBgMK4br5UESsB4S31Ec", "config":{ "$format_version":"0", "canBeDeleted":false, "readonly":false, "keepsHistory":false, "documentsKeepHistoryContractDefault":false, "documentsMutableContractDefault":true, "requiresIdentityEncryptionBoundedKey":null, "requiresIdentityDecryptionBoundedKey":null }, "version":1, "ownerId":"4EfA9Jrvv3nnCFdSf7fad59851iiTRZ6Wcu6YVJ4iSeF", "schemaDefs":null, "documentSchemas":{ "domain":{ "type":"object", "indices":[ { "name":"parentNameAndLabel", "properties":[ { "normalizedParentDomainName":"asc" }, { "normalizedLabel":"asc" } ], "unique":true }, { "name":"dashIdentityId", "properties":[ { "records.dashUniqueIdentityId":"asc" } ], "unique":true }, { "name":"dashAlias", "properties":[ { "records.dashAliasIdentityId":"asc" } ] } ], "properties":{ "label":{ "type":"string", "pattern":"^[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]$", "minLength":3, "maxLength":63, "position":0, "description":"Domain label. e.g. 'Bob'." }, "normalizedLabel":{ "type":"string", "pattern":"^[a-hj-km-np-z0-9][a-hj-km-np-z0-9-]{0,61}[a-hj-km-np-z0-9]$", "maxLength":63, "position":1, "description":"`Domain label converted to lowercase for case-insensitive uniqueness validation. \"o\", \"i\" and \"l\" replaced with \"0\" and \"1\" to mitigate homograph attack. e.g. 'b0b'`", "$comment":"Must be equal to the label in lowercase. \"o\", \"i\" and \"l\" must be replaced with \"0\" and \"1\"." }, "parentDomainName":{ "type":"string", "pattern":"^$|^[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]$", "minLength":0, "maxLength":63, "position":2, "description":"A full parent domain name. e.g. 'dash'." }, "normalizedParentDomainName":{ "type":"string", "pattern":"^$|^[a-hj-km-np-z0-9][a-hj-km-np-z0-9-\\.]{0,61}[a-hj-km-np-z0-9]$", "minLength":0, "maxLength":63, "position":3, "description":"`A parent domain name in lowercase for case-insensitive uniqueness validation. \"o\", \"i\" and \"l\" replaced with \"0\" and \"1\" to mitigate homograph attack. e.g. 'dash'`", "$comment":"Must either be equal to an existing domain or empty to create a top level domain. \"o\", \"i\" and \"l\" must be replaced with \"0\" and \"1\". Only the data contract owner can create top level domains." }, "preorderSalt":{ "type":"array", "byteArray":true, "minItems":32, "maxItems":32, "position":4, "description":"Salt used in the preorder document" }, "records":{ "type":"object", "properties":{ "dashUniqueIdentityId":{ "type":"array", "byteArray":true, "minItems":32, "maxItems":32, "position":0, "contentMediaType":"application/x.dash.dpp.identifier", "description":"Identity ID to be used to create the primary name the Identity", "$comment":"Must be equal to the document owner" }, "dashAliasIdentityId":{ "type":"array", "byteArray":true, "minItems":32, "maxItems":32, "position":1, "contentMediaType":"application/x.dash.dpp.identifier", "description":"Identity ID to be used to create alias names for the Identity", "$comment":"Must be equal to the document owner" } }, "minProperties":1, "maxProperties":1, "position":5, "additionalProperties":false, "$comment":"Constraint with max and min properties ensure that only one identity record is used - either a `dashUniqueIdentityId` or a `dashAliasIdentityId`" }, "subdomainRules":{ "type":"object", "properties":{ "allowSubdomains":{ "type":"boolean", "description":"This option defines who can create subdomains: true - anyone; false - only the domain owner", "$comment":"Only the domain owner is allowed to create subdomains for non top-level domains", "position":0 } }, "position":6, "description":"Subdomain rules allow domain owners to define rules for subdomains", "additionalProperties":false, "required":[ "allowSubdomains" ] } }, "required":[ "label", "normalizedLabel", "normalizedParentDomainName", "preorderSalt", "records", "subdomainRules" ], "additionalProperties":false, "$comment":"In order to register a domain you need to create a preorder. The preorder step is needed to prevent man-in-the-middle attacks. normalizedLabel + '.' + normalizedParentDomain must not be longer than 253 chars length as defined by RFC 1035. Domain documents are immutable: modification and deletion are restricted" }, "preorder":{ "type":"object", "indices":[ { "name":"saltedHash", "properties":[ { "saltedDomainHash":"asc" } ], "unique":true } ], "properties":{ "saltedDomainHash":{ "type":"array", "byteArray":true, "minItems":32, "maxItems":32, "position":0, "description":"Double sha-256 of the concatenation of a 32 byte random salt and a normalized domain name" } }, "required":[ "saltedDomainHash" ], "additionalProperties":false, "$comment":"Preorder documents are immutable: modification and deletion are restricted" } } } ``` ::: :::{tab-item} Response (gRPCurl) :sync: grpcurl ```json { "v0": { "dataContract": "AOZoxlmvZq7h5ywYbd57W34KHXEqCcQNVyH2Ir9TxTFVAAAAAAABAAABMBLBm5jsADOt2zbNZLf1EGcPKjUaQwS19plBRChu/awAAgZkb21haW4WBhIEdHlwZRIGb2JqZWN0EgdpbmRpY2VzFQMWAxIEbmFtZRIScGFyZW50TmFtZUFuZExhYmVsEgpwcm9wZXJ0aWVzFQIWARIabm9ybWFsaXplZFBhcmVudERvbWFpbk5hbWUSA2FzYxYBEg9ub3JtYWxpemVkTGFiZWwSA2FzYxIGdW5pcXVlEwEWAxIEbmFtZRIOZGFzaElkZW50aXR5SWQSCnByb3BlcnRpZXMVARYBEhxyZWNvcmRzLmRhc2hVbmlxdWVJZGVudGl0eUlkEgNhc2MSBnVuaXF1ZRMBFgISBG5hbWUSCWRhc2hBbGlhcxIKcHJvcGVydGllcxUBFgESG3JlY29yZHMuZGFzaEFsaWFzSWRlbnRpdHlJZBIDYXNjEgpwcm9wZXJ0aWVzFgcSBWxhYmVsFgYSBHR5cGUSBnN0cmluZxIHcGF0dGVybhIqXlthLXpBLVowLTldW2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0kEgltaW5MZW5ndGgCAxIJbWF4TGVuZ3RoAj8SCHBvc2l0aW9uAgASC2Rlc2NyaXB0aW9uEhlEb21haW4gbGFiZWwuIGUuZy4gJ0JvYicuEg9ub3JtYWxpemVkTGFiZWwWBhIEdHlwZRIGc3RyaW5nEgdwYXR0ZXJuEjxeW2EtaGota20tbnAtejAtOV1bYS1oai1rbS1ucC16MC05LV17MCw2MX1bYS1oai1rbS1ucC16MC05XSQSCW1heExlbmd0aAI/Eghwb3NpdGlvbgIBEgtkZXNjcmlwdGlvbhKjRG9tYWluIGxhYmVsIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UgZm9yIGNhc2UtaW5zZW5zaXRpdmUgdW5pcXVlbmVzcyB2YWxpZGF0aW9uLiAibyIsICJpIiBhbmQgImwiIHJlcGxhY2VkIHdpdGggIjAiIGFuZCAiMSIgdG8gbWl0aWdhdGUgaG9tb2dyYXBoIGF0dGFjay4gZS5nLiAnYjBiJxIIJGNvbW1lbnQSXE11c3QgYmUgZXF1YWwgdG8gdGhlIGxhYmVsIGluIGxvd2VyY2FzZS4gIm8iLCAiaSIgYW5kICJsIiBtdXN0IGJlIHJlcGxhY2VkIHdpdGggIjAiIGFuZCAiMSIuEhBwYXJlbnREb21haW5OYW1lFgYSBHR5cGUSBnN0cmluZxIHcGF0dGVybhItXiR8XlthLXpBLVowLTldW2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0kEgltaW5MZW5ndGgCABIJbWF4TGVuZ3RoAj8SCHBvc2l0aW9uAgISC2Rlc2NyaXB0aW9uEidBIGZ1bGwgcGFyZW50IGRvbWFpbiBuYW1lLiBlLmcuICdkYXNoJy4SGm5vcm1hbGl6ZWRQYXJlbnREb21haW5OYW1lFgcSBHR5cGUSBnN0cmluZxIHcGF0dGVybhJBXiR8XlthLWhqLWttLW5wLXowLTldW2EtaGota20tbnAtejAtOS1cLl17MCw2MX1bYS1oai1rbS1ucC16MC05XSQSCW1pbkxlbmd0aAIAEgltYXhMZW5ndGgCPxIIcG9zaXRpb24CAxILZGVzY3JpcHRpb24SokEgcGFyZW50IGRvbWFpbiBuYW1lIGluIGxvd2VyY2FzZSBmb3IgY2FzZS1pbnNlbnNpdGl2ZSB1bmlxdWVuZXNzIHZhbGlkYXRpb24uICJvIiwgImkiIGFuZCAibCIgcmVwbGFjZWQgd2l0aCAiMCIgYW5kICIxIiB0byBtaXRpZ2F0ZSBob21vZ3JhcGggYXR0YWNrLiBlLmcuICdkYXNoJxIIJGNvbW1lbnQSwE11c3QgZWl0aGVyIGJlIGVxdWFsIHRvIGFuIGV4aXN0aW5nIGRvbWFpbiBvciBlbXB0eSB0byBjcmVhdGUgYSB0b3AgbGV2ZWwgZG9tYWluLiAibyIsICJpIiBhbmQgImwiIG11c3QgYmUgcmVwbGFjZWQgd2l0aCAiMCIgYW5kICIxIi4gT25seSB0aGUgZGF0YSBjb250cmFjdCBvd25lciBjYW4gY3JlYXRlIHRvcCBsZXZlbCBkb21haW5zLhIMcHJlb3JkZXJTYWx0FgYSBHR5cGUSBWFycmF5EglieXRlQXJyYXkTARIIbWluSXRlbXMCIBIIbWF4SXRlbXMCIBIIcG9zaXRpb24CBBILZGVzY3JpcHRpb24SIlNhbHQgdXNlZCBpbiB0aGUgcHJlb3JkZXIgZG9jdW1lbnQSB3JlY29yZHMWBxIEdHlwZRIGb2JqZWN0Egpwcm9wZXJ0aWVzFgISFGRhc2hVbmlxdWVJZGVudGl0eUlkFggSBHR5cGUSBWFycmF5EglieXRlQXJyYXkTARIIbWluSXRlbXMCIBIIbWF4SXRlbXMCIBIIcG9zaXRpb24CABIQY29udGVudE1lZGlhVHlwZRIhYXBwbGljYXRpb24veC5kYXNoLmRwcC5pZGVudGlmaWVyEgtkZXNjcmlwdGlvbhI+SWRlbnRpdHkgSUQgdG8gYmUgdXNlZCB0byBjcmVhdGUgdGhlIHByaW1hcnkgbmFtZSB0aGUgSWRlbnRpdHkSCCRjb21tZW50EiNNdXN0IGJlIGVxdWFsIHRvIHRoZSBkb2N1bWVudCBvd25lchITZGFzaEFsaWFzSWRlbnRpdHlJZBYIEgR0eXBlEgVhcnJheRIJYnl0ZUFycmF5EwESCG1pbkl0ZW1zAiASCG1heEl0ZW1zAiASCHBvc2l0aW9uAgESEGNvbnRlbnRNZWRpYVR5cGUSIWFwcGxpY2F0aW9uL3guZGFzaC5kcHAuaWRlbnRpZmllchILZGVzY3JpcHRpb24SPUlkZW50aXR5IElEIHRvIGJlIHVzZWQgdG8gY3JlYXRlIGFsaWFzIG5hbWVzIGZvciB0aGUgSWRlbnRpdHkSCCRjb21tZW50EiNNdXN0IGJlIGVxdWFsIHRvIHRoZSBkb2N1bWVudCBvd25lchINbWluUHJvcGVydGllcwIBEg1tYXhQcm9wZXJ0aWVzAgESCHBvc2l0aW9uAgUSFGFkZGl0aW9uYWxQcm9wZXJ0aWVzEwASCCRjb21tZW50EpBDb25zdHJhaW50IHdpdGggbWF4IGFuZCBtaW4gcHJvcGVydGllcyBlbnN1cmUgdGhhdCBvbmx5IG9uZSBpZGVudGl0eSByZWNvcmQgaXMgdXNlZCAtIGVpdGhlciBhIGBkYXNoVW5pcXVlSWRlbnRpdHlJZGAgb3IgYSBgZGFzaEFsaWFzSWRlbnRpdHlJZGASDnN1YmRvbWFpblJ1bGVzFgYSBHR5cGUSBm9iamVjdBIKcHJvcGVydGllcxYBEg9hbGxvd1N1YmRvbWFpbnMWBBIEdHlwZRIHYm9vbGVhbhILZGVzY3JpcHRpb24SW1RoaXMgb3B0aW9uIGRlZmluZXMgd2hvIGNhbiBjcmVhdGUgc3ViZG9tYWluczogdHJ1ZSAtIGFueW9uZTsgZmFsc2UgLSBvbmx5IHRoZSBkb21haW4gb3duZXISCCRjb21tZW50Ek9Pbmx5IHRoZSBkb21haW4gb3duZXIgaXMgYWxsb3dlZCB0byBjcmVhdGUgc3ViZG9tYWlucyBmb3Igbm9uIHRvcC1sZXZlbCBkb21haW5zEghwb3NpdGlvbgIAEghwb3NpdGlvbgIGEgtkZXNjcmlwdGlvbhJCU3ViZG9tYWluIHJ1bGVzIGFsbG93IGRvbWFpbiBvd25lcnMgdG8gZGVmaW5lIHJ1bGVzIGZvciBzdWJkb21haW5zEhRhZGRpdGlvbmFsUHJvcGVydGllcxMAEghyZXF1aXJlZBUBEg9hbGxvd1N1YmRvbWFpbnMSCHJlcXVpcmVkFQYSBWxhYmVsEg9ub3JtYWxpemVkTGFiZWwSGm5vcm1hbGl6ZWRQYXJlbnREb21haW5OYW1lEgxwcmVvcmRlclNhbHQSB3JlY29yZHMSDnN1YmRvbWFpblJ1bGVzEhRhZGRpdGlvbmFsUHJvcGVydGllcxMAEggkY29tbWVudBL7ATdJbiBvcmRlciB0byByZWdpc3RlciBhIGRvbWFpbiB5b3UgbmVlZCB0byBjcmVhdGUgYSBwcmVvcmRlci4gVGhlIHByZW9yZGVyIHN0ZXAgaXMgbmVlZGVkIHRvIHByZXZlbnQgbWFuLWluLXRoZS1taWRkbGUgYXR0YWNrcy4gbm9ybWFsaXplZExhYmVsICsgJy4nICsgbm9ybWFsaXplZFBhcmVudERvbWFpbiBtdXN0IG5vdCBiZSBsb25nZXIgdGhhbiAyNTMgY2hhcnMgbGVuZ3RoIGFzIGRlZmluZWQgYnkgUkZDIDEwMzUuIERvbWFpbiBkb2N1bWVudHMgYXJlIGltbXV0YWJsZTogbW9kaWZpY2F0aW9uIGFuZCBkZWxldGlvbiBhcmUgcmVzdHJpY3RlZAhwcmVvcmRlchYGEgR0eXBlEgZvYmplY3QSB2luZGljZXMVARYDEgRuYW1lEgpzYWx0ZWRIYXNoEgpwcm9wZXJ0aWVzFQEWARIQc2FsdGVkRG9tYWluSGFzaBIDYXNjEgZ1bmlxdWUTARIKcHJvcGVydGllcxYBEhBzYWx0ZWREb21haW5IYXNoFgYSBHR5cGUSBWFycmF5EglieXRlQXJyYXkTARIIbWluSXRlbXMCIBIIbWF4SXRlbXMCIBIIcG9zaXRpb24CABILZGVzY3JpcHRpb24SWURvdWJsZSBzaGEtMjU2IG9mIHRoZSBjb25jYXRlbmF0aW9uIG9mIGEgMzIgYnl0ZSByYW5kb20gc2FsdCBhbmQgYSBub3JtYWxpemVkIGRvbWFpbiBuYW1lEghyZXF1aXJlZBUBEhBzYWx0ZWREb21haW5IYXNoEhRhZGRpdGlvbmFsUHJvcGVydGllcxMAEggkY29tbWVudBJKUHJlb3JkZXIgZG9jdW1lbnRzIGFyZSBpbW11dGFibGU6IG1vZGlmaWNhdGlvbiBhbmQgZGVsZXRpb24gYXJlIHJlc3RyaWN0ZWQ=", "metadata": { "height": "6750", "coreChainLockedHeight": 926935, "epoch": 845, "timeMs": "1701963780843", "protocolVersion": 1, "chainId": "dash-testnet-37" } } } ``` ::: :::: ### getDataContracts **Returns**: [Data Contract](../explanations/platform-protocol-data-contract.md) information for the requested data contracts **Parameters**: | Name | Type | Required | Description | | ------- | ------- | -------- | ----------------------------------------- | | `ids` | Array | Yes | An array of data contract IDs | | `prove` | Boolean | No | Set to `true` to receive a proof that contains the requested data contracts | **Example Request and Response** ::::{tab-set} :::{tab-item} gRPCurl :sync: grpcurl ```shell # `id` must be represented in base64 grpcurl -proto protos/platform/v0/platform.proto \ -d '{ "v0": { "ids": [ "5mjGWa9mruHnLBht3ntbfgodcSoJxA1XIfYiv1PFMVU=" ] } }' \ seed-1.testnet.networks.dash.org:1443 \ org.dash.platform.dapi.v0.Platform/getDataContracts ``` ::: :::: ::::{tab-set} :::{tab-item} Response (gRPCurl) :sync: grpcurl ```json { "v0": { "dataContracts": { "dataContractEntries": [ { "identifier": "5mjGWa9mruHnLBht3ntbfgodcSoJxA1XIfYiv1PFMVU=", "dataContract": "AOZoxlmvZq7h5ywYbd57W34KHXEqCcQNVyH2Ir9TxTFVAAAAAAABAAABMBLBm5jsADOt2zbNZLf1EGcPKjUaQwS19plBRChu/awAAgZkb21haW4WBhIEdHlwZRIGb2JqZWN0EgdpbmRpY2VzFQMWAxIEbmFtZRIScGFyZW50TmFtZUFuZExhYmVsEgpwcm9wZXJ0aWVzFQIWARIabm9ybWFsaXplZFBhcmVudERvbWFpbk5hbWUSA2FzYxYBEg9ub3JtYWxpemVkTGFiZWwSA2FzYxIGdW5pcXVlEwEWAxIEbmFtZRIOZGFzaElkZW50aXR5SWQSCnByb3BlcnRpZXMVARYBEhxyZWNvcmRzLmRhc2hVbmlxdWVJZGVudGl0eUlkEgNhc2MSBnVuaXF1ZRMBFgISBG5hbWUSCWRhc2hBbGlhcxIKcHJvcGVydGllcxUBFgESG3JlY29yZHMuZGFzaEFsaWFzSWRlbnRpdHlJZBIDYXNjEgpwcm9wZXJ0aWVzFgcSBWxhYmVsFgYSBHR5cGUSBnN0cmluZxIHcGF0dGVybhIqXlthLXpBLVowLTldW2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0kEgltaW5MZW5ndGgCAxIJbWF4TGVuZ3RoAj8SCHBvc2l0aW9uAgASC2Rlc2NyaXB0aW9uEhlEb21haW4gbGFiZWwuIGUuZy4gJ0JvYicuEg9ub3JtYWxpemVkTGFiZWwWBhIEdHlwZRIGc3RyaW5nEgdwYXR0ZXJuEjxeW2EtaGota20tbnAtejAtOV1bYS1oai1rbS1ucC16MC05LV17MCw2MX1bYS1oai1rbS1ucC16MC05XSQSCW1heExlbmd0aAI/Eghwb3NpdGlvbgIBEgtkZXNjcmlwdGlvbhKjRG9tYWluIGxhYmVsIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UgZm9yIGNhc2UtaW5zZW5zaXRpdmUgdW5pcXVlbmVzcyB2YWxpZGF0aW9uLiAibyIsICJpIiBhbmQgImwiIHJlcGxhY2VkIHdpdGggIjAiIGFuZCAiMSIgdG8gbWl0aWdhdGUgaG9tb2dyYXBoIGF0dGFjay4gZS5nLiAnYjBiJxIIJGNvbW1lbnQSXE11c3QgYmUgZXF1YWwgdG8gdGhlIGxhYmVsIGluIGxvd2VyY2FzZS4gIm8iLCAiaSIgYW5kICJsIiBtdXN0IGJlIHJlcGxhY2VkIHdpdGggIjAiIGFuZCAiMSIuEhBwYXJlbnREb21haW5OYW1lFgYSBHR5cGUSBnN0cmluZxIHcGF0dGVybhItXiR8XlthLXpBLVowLTldW2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0kEgltaW5MZW5ndGgCABIJbWF4TGVuZ3RoAj8SCHBvc2l0aW9uAgISC2Rlc2NyaXB0aW9uEidBIGZ1bGwgcGFyZW50IGRvbWFpbiBuYW1lLiBlLmcuICdkYXNoJy4SGm5vcm1hbGl6ZWRQYXJlbnREb21haW5OYW1lFgcSBHR5cGUSBnN0cmluZxIHcGF0dGVybhJBXiR8XlthLWhqLWttLW5wLXowLTldW2EtaGota20tbnAtejAtOS1cLl17MCw2MX1bYS1oai1rbS1ucC16MC05XSQSCW1pbkxlbmd0aAIAEgltYXhMZW5ndGgCPxIIcG9zaXRpb24CAxILZGVzY3JpcHRpb24SokEgcGFyZW50IGRvbWFpbiBuYW1lIGluIGxvd2VyY2FzZSBmb3IgY2FzZS1pbnNlbnNpdGl2ZSB1bmlxdWVuZXNzIHZhbGlkYXRpb24uICJvIiwgImkiIGFuZCAibCIgcmVwbGFjZWQgd2l0aCAiMCIgYW5kICIxIiB0byBtaXRpZ2F0ZSBob21vZ3JhcGggYXR0YWNrLiBlLmcuICdkYXNoJxIIJGNvbW1lbnQSwE11c3QgZWl0aGVyIGJlIGVxdWFsIHRvIGFuIGV4aXN0aW5nIGRvbWFpbiBvciBlbXB0eSB0byBjcmVhdGUgYSB0b3AgbGV2ZWwgZG9tYWluLiAibyIsICJpIiBhbmQgImwiIG11c3QgYmUgcmVwbGFjZWQgd2l0aCAiMCIgYW5kICIxIi4gT25seSB0aGUgZGF0YSBjb250cmFjdCBvd25lciBjYW4gY3JlYXRlIHRvcCBsZXZlbCBkb21haW5zLhIMcHJlb3JkZXJTYWx0FgYSBHR5cGUSBWFycmF5EglieXRlQXJyYXkTARIIbWluSXRlbXMCIBIIbWF4SXRlbXMCIBIIcG9zaXRpb24CBBILZGVzY3JpcHRpb24SIlNhbHQgdXNlZCBpbiB0aGUgcHJlb3JkZXIgZG9jdW1lbnQSB3JlY29yZHMWBxIEdHlwZRIGb2JqZWN0Egpwcm9wZXJ0aWVzFgISFGRhc2hVbmlxdWVJZGVudGl0eUlkFggSBHR5cGUSBWFycmF5EglieXRlQXJyYXkTARIIbWluSXRlbXMCIBIIbWF4SXRlbXMCIBIIcG9zaXRpb24CABIQY29udGVudE1lZGlhVHlwZRIhYXBwbGljYXRpb24veC5kYXNoLmRwcC5pZGVudGlmaWVyEgtkZXNjcmlwdGlvbhI+SWRlbnRpdHkgSUQgdG8gYmUgdXNlZCB0byBjcmVhdGUgdGhlIHByaW1hcnkgbmFtZSB0aGUgSWRlbnRpdHkSCCRjb21tZW50EiNNdXN0IGJlIGVxdWFsIHRvIHRoZSBkb2N1bWVudCBvd25lchITZGFzaEFsaWFzSWRlbnRpdHlJZBYIEgR0eXBlEgVhcnJheRIJYnl0ZUFycmF5EwESCG1pbkl0ZW1zAiASCG1heEl0ZW1zAiASCHBvc2l0aW9uAgESEGNvbnRlbnRNZWRpYVR5cGUSIWFwcGxpY2F0aW9uL3guZGFzaC5kcHAuaWRlbnRpZmllchILZGVzY3JpcHRpb24SPUlkZW50aXR5IElEIHRvIGJlIHVzZWQgdG8gY3JlYXRlIGFsaWFzIG5hbWVzIGZvciB0aGUgSWRlbnRpdHkSCCRjb21tZW50EiNNdXN0IGJlIGVxdWFsIHRvIHRoZSBkb2N1bWVudCBvd25lchINbWluUHJvcGVydGllcwIBEg1tYXhQcm9wZXJ0aWVzAgESCHBvc2l0aW9uAgUSFGFkZGl0aW9uYWxQcm9wZXJ0aWVzEwASCCRjb21tZW50EpBDb25zdHJhaW50IHdpdGggbWF4IGFuZCBtaW4gcHJvcGVydGllcyBlbnN1cmUgdGhhdCBvbmx5IG9uZSBpZGVudGl0eSByZWNvcmQgaXMgdXNlZCAtIGVpdGhlciBhIGBkYXNoVW5pcXVlSWRlbnRpdHlJZGAgb3IgYSBgZGFzaEFsaWFzSWRlbnRpdHlJZGASDnN1YmRvbWFpblJ1bGVzFgYSBHR5cGUSBm9iamVjdBIKcHJvcGVydGllcxYBEg9hbGxvd1N1YmRvbWFpbnMWBBIEdHlwZRIHYm9vbGVhbhILZGVzY3JpcHRpb24SW1RoaXMgb3B0aW9uIGRlZmluZXMgd2hvIGNhbiBjcmVhdGUgc3ViZG9tYWluczogdHJ1ZSAtIGFueW9uZTsgZmFsc2UgLSBvbmx5IHRoZSBkb21haW4gb3duZXISCCRjb21tZW50Ek9Pbmx5IHRoZSBkb21haW4gb3duZXIgaXMgYWxsb3dlZCB0byBjcmVhdGUgc3ViZG9tYWlucyBmb3Igbm9uIHRvcC1sZXZlbCBkb21haW5zEghwb3NpdGlvbgIAEghwb3NpdGlvbgIGEgtkZXNjcmlwdGlvbhJCU3ViZG9tYWluIHJ1bGVzIGFsbG93IGRvbWFpbiBvd25lcnMgdG8gZGVmaW5lIHJ1bGVzIGZvciBzdWJkb21haW5zEhRhZGRpdGlvbmFsUHJvcGVydGllcxMAEghyZXF1aXJlZBUBEg9hbGxvd1N1YmRvbWFpbnMSCHJlcXVpcmVkFQYSBWxhYmVsEg9ub3JtYWxpemVkTGFiZWwSGm5vcm1hbGl6ZWRQYXJlbnREb21haW5OYW1lEgxwcmVvcmRlclNhbHQSB3JlY29yZHMSDnN1YmRvbWFpblJ1bGVzEhRhZGRpdGlvbmFsUHJvcGVydGllcxMAEggkY29tbWVudBL7ATdJbiBvcmRlciB0byByZWdpc3RlciBhIGRvbWFpbiB5b3UgbmVlZCB0byBjcmVhdGUgYSBwcmVvcmRlci4gVGhlIHByZW9yZGVyIHN0ZXAgaXMgbmVlZGVkIHRvIHByZXZlbnQgbWFuLWluLXRoZS1taWRkbGUgYXR0YWNrcy4gbm9ybWFsaXplZExhYmVsICsgJy4nICsgbm9ybWFsaXplZFBhcmVudERvbWFpbiBtdXN0IG5vdCBiZSBsb25nZXIgdGhhbiAyNTMgY2hhcnMgbGVuZ3RoIGFzIGRlZmluZWQgYnkgUkZDIDEwMzUuIERvbWFpbiBkb2N1bWVudHMgYXJlIGltbXV0YWJsZTogbW9kaWZpY2F0aW9uIGFuZCBkZWxldGlvbiBhcmUgcmVzdHJpY3RlZAhwcmVvcmRlchYGEgR0eXBlEgZvYmplY3QSB2luZGljZXMVARYDEgRuYW1lEgpzYWx0ZWRIYXNoEgpwcm9wZXJ0aWVzFQEWARIQc2FsdGVkRG9tYWluSGFzaBIDYXNjEgZ1bmlxdWUTARIKcHJvcGVydGllcxYBEhBzYWx0ZWREb21haW5IYXNoFgYSBHR5cGUSBWFycmF5EglieXRlQXJyYXkTARIIbWluSXRlbXMCIBIIbWF4SXRlbXMCIBIIcG9zaXRpb24CABILZGVzY3JpcHRpb24SWURvdWJsZSBzaGEtMjU2IG9mIHRoZSBjb25jYXRlbmF0aW9uIG9mIGEgMzIgYnl0ZSByYW5kb20gc2FsdCBhbmQgYSBub3JtYWxpemVkIGRvbWFpbiBuYW1lEghyZXF1aXJlZBUBEhBzYWx0ZWREb21haW5IYXNoEhRhZGRpdGlvbmFsUHJvcGVydGllcxMAEggkY29tbWVudBJKUHJlb3JkZXIgZG9jdW1lbnRzIGFyZSBpbW11dGFibGU6IG1vZGlmaWNhdGlvbiBhbmQgZGVsZXRpb24gYXJlIHJlc3RyaWN0ZWQ=" } ] }, "metadata": { "height": "6807", "coreChainLockedHeight": 927014, "epoch": 848, "timeMs": "1701973925674", "protocolVersion": 1, "chainId": "dash-testnet-37" } } } ``` ::: :::: ### getDataContractHistory **Returns**: [Data Contract](../explanations/platform-protocol-data-contract.md) information for the requested data contract **Parameters**: | Name | Type | Required | Description | | ------- | -------- | -------- | ---------------------------------------- | | `id` | Bytes | Yes | A data contract `id` | | `start_at_ms` | Integer | Yes | Request revisions starting at this timestamp | | `limit` | Integer | Yes | The maximum number of revisions to return | | `offset` | Integer | Yes | The offset of the first revision to return | | `prove` | Boolean | No | Set to `true` to receive a proof that contains the requested data contract | > 📘 > > **Note**: When requesting proofs, the data requested will be encoded as part of the proof in the response. **Example Request and Response** ::::{tab-set} :::{tab-item} JavaScript (dapi-client) :sync: js-dapi-client ```javascript const DAPIClient = require('@dashevo/dapi-client'); const { default: loadDpp, DashPlatformProtocol, Identifier, } = require('@dashevo/wasm-dpp'); loadDpp(); const dpp = new DashPlatformProtocol(null); const client = new DAPIClient(); const contractId = Identifier.from('2ciAVGRuzogbR2NNtNfbn6YdW7BkLWntC7jrLNRMZN9n'); client.platform.getDataContractHistory(contractId, 0, 2, 0).then((response) => { for (const key in response.getDataContractHistory()) { const revision = response.getDataContractHistory()[key]; dpp.dataContract.createFromBuffer(revision).then((dataContract) => { console.dir(dataContract.toJSON(), { depth: 10 }); }); } }); ``` ::: :::{tab-item} gRPCurl :sync: grpcurl ```shell # `id` must be represented in base64 grpcurl -proto protos/platform/v0/platform.proto \ -d '{ "v0": { "id":"GAGPHaxHbGDQv62LYIMuYbOaYjqD36X/pIXADxTfJvE=", "limit": 2, "offset": 0, "start_at_ms": 0, "prove": false } }' \ seed-1.testnet.networks.dash.org:1443 \ org.dash.platform.dapi.v0.Platform/getDataContractHistory ``` ::: :::: ::::{tab-set} :::{tab-item} Response (JavaScript) :sync: js-dapi-client ```json { "$format_version":"0", "id":"2ciAVGRuzogbR2NNtNfbn6YdW7BkLWntC7jrLNRMZN9n", "config":{ "$format_version":"0", "canBeDeleted":false, "readonly":false, "keepsHistory":true, "documentsKeepHistoryContractDefault":false, "documentsMutableContractDefault":true, "requiresIdentityEncryptionBoundedKey":null, "requiresIdentityDecryptionBoundedKey":null }, "version":1, "ownerId":"EB9eBUQxLjA7XGj71x3Msdd1uNmehKYZff3b6idhnTyV", "schemaDefs":null, "documentSchemas":{ "note":{ "type":"object", "properties":{ "message":{ "type":"string", "position":0 } }, "additionalProperties":false } } }, { "$format_version":"0", "id":"2ciAVGRuzogbR2NNtNfbn6YdW7BkLWntC7jrLNRMZN9n", "config":{ "$format_version":"0", "canBeDeleted":false, "readonly":false, "keepsHistory":true, "documentsKeepHistoryContractDefault":false, "documentsMutableContractDefault":true, "requiresIdentityEncryptionBoundedKey":null, "requiresIdentityDecryptionBoundedKey":null }, "version":2, "ownerId":"EB9eBUQxLjA7XGj71x3Msdd1uNmehKYZff3b6idhnTyV", "schemaDefs":null, "documentSchemas":{ "note":{ "type":"object", "properties":{ "message":{ "type":"string", "position":0 }, "author":{ "type":"string", "position":1 } }, "additionalProperties":false } } } ``` ::: :::{tab-item} Response (gRPCurl) :sync: grpcurl ```json { "v0": { "dataContractHistory": { "dataContractEntries": [ { "date": "1701271990189", "value": "ABgBjx2sR2xg0L+ti2CDLmGzmmI6g9+l/6SFwA8U3ybxAAAAAQABAAABw8GCMyj2ynyRr4i36i1KKHFYdYuPDVwKmo1jmEgT4zwAAQRub3RlFgMSBHR5cGUSBm9iamVjdBIKcHJvcGVydGllcxYBEgdtZXNzYWdlFgISBHR5cGUSBnN0cmluZxIIcG9zaXRpb24DABIUYWRkaXRpb25hbFByb3BlcnRpZXMTAA==" }, { "date": "1701272469813", "value": "ABgBjx2sR2xg0L+ti2CDLmGzmmI6g9+l/6SFwA8U3ybxAAAAAQABAAACw8GCMyj2ynyRr4i36i1KKHFYdYuPDVwKmo1jmEgT4zwAAQRub3RlFgMSBHR5cGUSBm9iamVjdBIKcHJvcGVydGllcxYCEgdtZXNzYWdlFgISBHR5cGUSBnN0cmluZxIIcG9zaXRpb24CABIGYXV0aG9yFgISBHR5cGUSBnN0cmluZxIIcG9zaXRpb24CARIUYWRkaXRpb25hbFByb3BlcnRpZXMTAA==" } ] }, "metadata": { "height": "6776", "coreChainLockedHeight": 926975, "epoch": 846, "timeMs": "1701968396855", "protocolVersion": 1, "chainId": "dash-testnet-37" } } } ``` ::: :::: ### getDocuments > 🚧 Breaking changes > > Due to serialization changes in Dash Platform 0.25, using wasm-dpp is recommended when working with identities, data contracts, and documents. **Returns**: [Document](../explanations/platform-protocol-document.md) information for the requested document(s) **Parameters**: > 📘 Parameter constraints > > **Note**: The `where`, `order_by`, `limit`, `start_at`, and `start_after` parameters must comply with the limits defined on the [Query Syntax](../reference/query-syntax.md) page. > > Additionally, note that `where` and `order_by` must be [CBOR](https://tools.ietf.org/html/rfc7049) encoded. | Name | Type | Required | Description | | ----------------------- | ------- | -------- | ------------------------------------------------------------------------------------------------ | | `data_contract_id` | Bytes | Yes | A data contract `id` | | `document_type` | String | Yes | A document type defined by the data contract (e.g. `preorder` or `domain` for the DPNS contract) | | `where` \* | Bytes | No | Where clause to filter the results (**must be CBOR encoded**) | | `order_by` \* | Bytes | No | Sort records by the field(s) provided (**must be CBOR encoded**) | | `limit` | Integer | No | Maximum number of results to return | | ---------- | | | | | _One_ of the following: | | | | | `start_at` | Integer | No | Return records beginning with the index provided | | `start_after` | Integer | No | Return records beginning after the index provided | | ---------- | | | | | `prove` | Boolean | No | Set to `true` to receive a proof that contains the requested document(s) | > 📘 > > **Note**: When requesting proofs, the data requested will be encoded as part of the proof in the response. **Example Request and Response** ::::{tab-set} :::{tab-item} JavaScript (dapi-client) :sync: js-dapi-client ```javascript const DAPIClient = require('@dashevo/dapi-client'); const { default: loadDpp, DashPlatformProtocol, Identifier, } = require('@dashevo/wasm-dpp'); loadDpp(); const dpp = new DashPlatformProtocol(null); const client = new DAPIClient(); const contractId = Identifier.from('GWRSAVFMjXx8HpQFaNJMqBV7MBgMK4br5UESsB4S31Ec'); const type = 'domain'; const limit = 1; client.platform.getDataContract(contractId).then((contractResponse) => { dpp.dataContract .createFromBuffer(contractResponse.getDataContract()) .then((contract) => { // Get document(s) client.platform .getDocuments(contractId, type, { limit, }) .then((response) => { for (const document of response.documents) { const doc = dpp.document.createExtendedDocumentFromDocumentBuffer( document, type, contract, ); console.log(doc.toJSON()); } }); }); }); ``` ::: :::{tab-item} JavaScript (dapi-grpc) :sync: js-dapi-grpc ```javascript const { v0: { PlatformPromiseClient, GetDataContractRequest, GetDocumentsRequest }, } = require('@dashevo/dapi-grpc'); const { default: loadDpp, DashPlatformProtocol, Identifier } = require('@dashevo/wasm-dpp'); loadDpp(); const dpp = new DashPlatformProtocol(null); const platformPromiseClient = new PlatformPromiseClient( 'https://seed-1.testnet.networks.dash.org:1443', ); const contractId = Identifier.from('GWRSAVFMjXx8HpQFaNJMqBV7MBgMK4br5UESsB4S31Ec'); const contractIdBuffer = Buffer.from(contractId); const getDataContractRequest = new GetDataContractRequest(); getDataContractRequest.setId(contractIdBuffer); platformPromiseClient .getDataContract(getDataContractRequest) .then((contractResponse) => { dpp.dataContract.createFromBuffer(contractResponse.getDataContract()).then((contract) => { // Get documents const getDocumentsRequest = new GetDocumentsRequest(); const type = 'domain'; const limit = 10; getDocumentsRequest.setDataContractId(contractIdBuffer); getDocumentsRequest.setDocumentType(type); // getDocumentsRequest.setWhere(whereSerialized); // getDocumentsRequest.setOrderBy(orderBySerialized); getDocumentsRequest.setLimit(limit); // getDocumentsRequest.setStartAfter(startAfter); // getDocumentsRequest.setStartAt(startAt); platformPromiseClient.getDocuments(getDocumentsRequest).then((response) => { for (const document of response.getDocuments().getDocumentsList()) { const documentBuffer = Buffer.from(document); const doc = dpp.document.createExtendedDocumentFromDocumentBuffer( documentBuffer, type, contract, ); console.log(doc.toJSON()); } }); }); }) .catch((e) => console.error(e)); ``` ::: :::{tab-item} Request (gRPCurl) :sync: grpcurl ```shell # Request documents # `id` must be represented in base64 grpcurl -proto protos/platform/v0/platform.proto \ -d '{ "v0": { "data_contract_id":"5mjGWa9mruHnLBht3ntbfgodcSoJxA1XIfYiv1PFMVU=", "document_type":"domain", "limit":1 } }' \ seed-1.testnet.networks.dash.org:1443 \ org.dash.platform.dapi.v0.Platform/getDocuments ``` ::: :::: ::::{tab-set} :::{tab-item} Response (JavaScript) :sync: js-dapi-client ```json { "$id":"Do3YtBPJG72zG4tCbN5VE8djJ6rLpvx7yvtMWEy89HC", "$ownerId":"4pk6ZhgDtxn9yN2bbB6kfsYLRmUBH7PKUq275cjyzepT", "label":"Chronic", "normalizedLabel":"chr0n1c", "normalizedParentDomainName":"dash", "parentDomainName":"dash", "preorderSalt":"1P9N5qv1Ww2xkv6/XXpsvymyGYychRsLXMhCqvW79Jo=", "records":{ "dashUniqueIdentityId":"OM4WaCQNLedQ0rpbl1UMTZhEbnVeMfL4941ZD08iyFw=" }, "subdomainRules":{ "allowSubdomains":false }, "$revision":1, "$createdAt":null, "$updatedAt":null, "$dataContract":{ "$format_version":"0", "id":"GWRSAVFMjXx8HpQFaNJMqBV7MBgMK4br5UESsB4S31Ec", "config":{ "$format_version":"0", "canBeDeleted":false, "readonly":false, "keepsHistory":false, "documentsKeepHistoryContractDefault":false, "documentsMutableContractDefault":true, "requiresIdentityEncryptionBoundedKey":null, "requiresIdentityDecryptionBoundedKey":null }, "version":1, "ownerId":"4EfA9Jrvv3nnCFdSf7fad59851iiTRZ6Wcu6YVJ4iSeF", "schemaDefs":null, "documentSchemas":{ "domain":[ "Object" ], "preorder":[ "Object" ] } }, "$type":"domain" } ``` ::: :::{tab-item} Response (gRPCurl) :sync: grpcurl ```json { "v0":{ "documents":{ "documents":[ "AANHCCLI23JAM6yPcJwiyAaVouU4btv1kXxaMF0mfXTDOM4WaCQNLedQ0rpbl1UMTZhEbnVeMfL4941ZD08iyFwBAAAHQ2hyb25pYwdjaHIwbjFjAQRkYXNoBGRhc2jU/03mq/VbDbGS/r9demy/KbIZjJyFGwtcyEKq9bv0miIBOM4WaCQNLedQ0rpbl1UMTZhEbnVeMfL4941ZD08iyFwAAQA=" ] }, "metadata":{ "height":"6755", "coreChainLockedHeight":926945, "epoch":845, "timeMs":"1701964691399", "protocolVersion":1, "chainId":"dash-testnet-37" } } } ``` ::: :::: ### getEpochsInfo **Returns**: Information for the requested epoch(s) **Parameters**: | Name | Type | Required | Description | | ------- | ------- | -------- | ----------- | | `start_epoch` | Bytes | No | First epoch being requested | `count` | Integer | No | Number of records to request | `ascending` | Boolean | No | Set to `true` to query in ascending order. Results are returned in descending order by default. | `prove` | Boolean | No | Set to `true` to receive a proof that contains the requested data contracts **Example Request and Response** ::::{tab-set} :::{tab-item} gRPCurl :sync: grpcurl ```shell # `id` must be represented in base64 grpcurl -proto protos/platform/v0/platform.proto \ -d '{ "v0": { "count": 2 } }' \ seed-1.testnet.networks.dash.org:1443 \ org.dash.platform.dapi.v0.Platform/getEpochsInfo ``` ::: :::: ::::{tab-set} :::{tab-item} Response (gRPCurl) :sync: grpcurl ```json { "v0": { "epochs": { "epochInfos": [ { "number": 849, "firstBlockHeight": "6822", "firstCoreBlockHeight": 927030, "startTime": "1701976758619", "feeMultiplier": 2 }, { "number": 850, "firstBlockHeight": "6840", "firstCoreBlockHeight": 927061, "startTime": "1701980303210", "feeMultiplier": 2 } ] }, "metadata": { "height": "6843", "coreChainLockedHeight": 927065, "epoch": 850, "timeMs": "1701980850126", "protocolVersion": 1, "chainId": "dash-testnet-37" } } } ``` ::: :::: ### getProofs **Returns**: Proof information for the requested identities, contracts, and/or document(s) **Parameters**: A combination of one or more of the following are required fields are required: | Field | Type | Required | Description | | - | - | - | - | | `identities` | `IdentityRequest` | No | List of identity requests | `contracts` | `ContractRequest` | No | List of contract requests | `documents` | `DocumentRequest` | No | List of document requests **Request type details** | Field | Type | Required | Description | | - | - | - | - | | **IdentityRequest** | | | | `identity_id` | Bytes | Yes | Identity ID | `request_type` | Type (enum) | Yes | Type of identity proof data to request (options: FULL_IDENTITY, BALANCE, KEYS) | --------------- | | | | **ContractRequest** | | | | `contract_id` | Bytes | Yes | A contract ID | --------------- | | | | **DocumentRequest** | | | | `contract_id` | Bytes | Yes | A contract ID | `document_type` | String | Yes | Type of contract document | `document_type_keeps_history` | Boolean | No |Indicates if the document type maintains a history | `document_id` | Bytes | Yes | Document ID **Example Request and Response** ::::{tab-set} :::{tab-item} gRPCurl :sync: grpcurl ```shell # Request proofs for an identity and a data contract # `identityId` and `contractId` must be represented in base64 grpcurl -proto protos/platform/v0/platform.proto \ -d '{ "v0": { "identities": [ { "request_type": "FULL_IDENTITY", "identity_id": "MBLBm5jsADOt2zbNZLf1EGcPKjUaQwS19plBRChu/aw=" } ], "contracts": [ { "contract_id": "5mjGWa9mruHnLBht3ntbfgodcSoJxA1XIfYiv1PFMVU=" } ], "documents": [] } }' \ seed-1.testnet.networks.dash.org:1443 \ org.dash.platform.dapi.v0.Platform/getProofs ``` ::: :::: ::::{tab-set} :::{tab-item} Response (gRPCurl) :sync: grpcurl ```json // GroveDB proof for the requested identity and contract { "v0": { "proof": { "grovedbProof": "AQYAAQDuAgHx2HzoF4wSud2eE4a+j9LczjcgboCJsEZJK+Bl/97hLAQBIAAkAgEgn2WlCmdZa3aGIz7NDvWCqFa+KfeLcarKW0WH8vLbYZgAAJpItikQWz3TcDudnxxiJSY5h5Ndejq2UOkZPubKDN0QAfhJDycGmgAM67TyQkPU3kuavJLc7wlcbvBD48JEelqeEQQBQAAkAgEgoqG0rG/vIuoqGmjoEjZEs1eHX2tBLBgQkoHBRueycbwA1L5TY2e0nwaAJolrXP7S6qWDVVTGeFpz4cjXIHoOPUoQAY6uNnLUV0nQB1qQqQWBLRyaJZfu/o/kBIBYXq4egeakBAFgAC0EASCfZaUKZ1lrdoYjPs0O9YKoVr4p94txqspbRYfy8tthmP3KiDkEJD0hAACXwGQWS6E+DOmhhxAd6xNjdVGeulgD5i3dNpt5nRiwGxABMwg2kOcA+9xQ3NhoBqze6XaeidN/5COubSCHkp+bZ9wREQEBIN0CAduEoBne86ZfsX2HwXtJ9jM/ghzM4rJqnUNLkRV/wom8As3l9skVhNWf85H1JsVvK8PkRe3fO83N0QjZ9StB5QNQEAFviDbTTGTvt2tyoqGNJydjW32VQs0vs5XVc8d/M5FJpQQgMBLBm5jsADOt2zbNZLf1EGcPKjUaQwS19plBRChu/awACQIBAQIBAwAAAKWXTEBAq5u+FwX5AZapJ7qj7G7SIxP3mYey+otzvhefEAHYJdPBfgqNhf9vXtvya+ip4ZEJR6rubhW79ZMAabO48RERAmKv6d1LDUzhxxrKW1iDGkYD6tZ9TfORRKQKkfWd11g8EAFfm8qRd2+WVybP18udB0457INJ3U11YNIZvdKFY1rQjBECDegFhb6zh0BzQ1pirX6IQGLel/eF8+xv98HZYmkJgBAQAVAO5YGj0RWNmvhmC0NqrtWHwnjSUQNxd6uYRJMjfcPrEQEgMBLBm5jsADOt2zbNZLf1EGcPKjUaQwS19plBRChu/ax/AwEAAAsACAAAAAAAAAAAAAQBAQAFAgEBAQCqh3fBWf3zs2zg6Wt8+AFC1/58xqnqSxC9exEK7kPRhRACKQ9N/X8hOac8dT4zuZC4upFtihZq9JsYfb5UoiGIDyIQAUYZe6LR2JrmXw44tCBxZtK21SAUzHBMVnCCvx29ZfnfEQIBAWUDAQAALQAqAAAAAAAAACECyLR0e1KMrF/d96bMY3Au4E7X0TMpBOCFEDQ+oA3OVGoAAAMBAQAtACoAAQACAAAAIQIB7ij4T1SFOQVn6TnCtYYBC2Omnsksq1NdyWqMcZE2AgAAEAEBQNkCAaylxbCNFaN71X5p+nfqhe5T3e5JDjX3BTp7s2veVhTOAgHZbe7OzqjzwOzXn6NLbzSt8PItwUVj91x8pf3lguQGEAE2pM5PtpHXYchTiDJh5csJWcrbCMX9R548J6lvLkRY1AKghzeA2y1iYD9QJGMD9IAzws0Sh9r+EI5NYy7xhp72chABtgUnjZcfcBf5QBfldwp2LQHKYDCIWImz4Q/4E46nyQMEIOZoxlmvZq7h5ywYbd57W34KHXEqCcQNVyH2Ir9TxTFVAAUCAQEBAPLfdXh4PcRzmCXJPABALtDjvEgBgLJwwOYCf0L54idmEAFJybKFoR6l0GDoa2MQGMKbvM0N4w1AhupCbh4b3NiCWhEC0vjwIA7WA1zKJTmJ6cqaWFgqIs59iDoqcRdSLsZEaLkQAXPWZ9eFJe3P3Uf6GA/WznOBSDg+hIny9UF6gSdQJYiIERERAiDmaMZZr2au4ecsGG3ee1t+Ch1xKgnEDVch9iK/U8UxVf8eAwEAD1gA+1MPAOZoxlmvZq7h5ywYbd57W34KHXEqCcQNVyH2Ir9TxTFVAAAAAAABAAABMBLBm5jsADOt2zbNZLf1EGcPKjUaQwS19plBRChu/awAAgZkb21haW4WBhIEdHlwZRIGb2JqZWN0EgdpbmRpY2VzFQMWAxIEbmFtZRIScGFyZW50TmFtZUFuZExhYmVsEgpwcm9wZXJ0aWVzFQIWARIabm9ybWFsaXplZFBhcmVudERvbWFpbk5hbWUSA2FzYxYBEg9ub3JtYWxpemVkTGFiZWwSA2FzYxIGdW5pcXVlEwEWAxIEbmFtZRIOZGFzaElkZW50aXR5SWQSCnByb3BlcnRpZXMVARYBEhxyZWNvcmRzLmRhc2hVbmlxdWVJZGVudGl0eUlkEgNhc2MSBnVuaXF1ZRMBFgISBG5hbWUSCWRhc2hBbGlhcxIKcHJvcGVydGllcxUBFgESG3JlY29yZHMuZGFzaEFsaWFzSWRlbnRpdHlJZBIDYXNjEgpwcm9wZXJ0aWVzFgcSBWxhYmVsFgYSBHR5cGUSBnN0cmluZxIHcGF0dGVybhIqXlthLXpBLVowLTldW2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0kEgltaW5MZW5ndGgCAxIJbWF4TGVuZ3RoAj8SCHBvc2l0aW9uAgASC2Rlc2NyaXB0aW9uEhlEb21haW4gbGFiZWwuIGUuZy4gJ0JvYicuEg9ub3JtYWxpemVkTGFiZWwWBhIEdHlwZRIGc3RyaW5nEgdwYXR0ZXJuEjxeW2EtaGota20tbnAtejAtOV1bYS1oai1rbS1ucC16MC05LV17MCw2MX1bYS1oai1rbS1ucC16MC05XSQSCW1heExlbmd0aAI/Eghwb3NpdGlvbgIBEgtkZXNjcmlwdGlvbhKjRG9tYWluIGxhYmVsIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UgZm9yIGNhc2UtaW5zZW5zaXRpdmUgdW5pcXVlbmVzcyB2YWxpZGF0aW9uLiAibyIsICJpIiBhbmQgImwiIHJlcGxhY2VkIHdpdGggIjAiIGFuZCAiMSIgdG8gbWl0aWdhdGUgaG9tb2dyYXBoIGF0dGFjay4gZS5nLiAnYjBiJxIIJGNvbW1lbnQSXE11c3QgYmUgZXF1YWwgdG8gdGhlIGxhYmVsIGluIGxvd2VyY2FzZS4gIm8iLCAiaSIgYW5kICJsIiBtdXN0IGJlIHJlcGxhY2VkIHdpdGggIjAiIGFuZCAiMSIuEhBwYXJlbnREb21haW5OYW1lFgYSBHR5cGUSBnN0cmluZxIHcGF0dGVybhItXiR8XlthLXpBLVowLTldW2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0kEgltaW5MZW5ndGgCABIJbWF4TGVuZ3RoAj8SCHBvc2l0aW9uAgISC2Rlc2NyaXB0aW9uEidBIGZ1bGwgcGFyZW50IGRvbWFpbiBuYW1lLiBlLmcuICdkYXNoJy4SGm5vcm1hbGl6ZWRQYXJlbnREb21haW5OYW1lFgcSBHR5cGUSBnN0cmluZxIHcGF0dGVybhJBXiR8XlthLWhqLWttLW5wLXowLTldW2EtaGota20tbnAtejAtOS1cLl17MCw2MX1bYS1oai1rbS1ucC16MC05XSQSCW1pbkxlbmd0aAIAEgltYXhMZW5ndGgCPxIIcG9zaXRpb24CAxILZGVzY3JpcHRpb24SokEgcGFyZW50IGRvbWFpbiBuYW1lIGluIGxvd2VyY2FzZSBmb3IgY2FzZS1pbnNlbnNpdGl2ZSB1bmlxdWVuZXNzIHZhbGlkYXRpb24uICJvIiwgImkiIGFuZCAibCIgcmVwbGFjZWQgd2l0aCAiMCIgYW5kICIxIiB0byBtaXRpZ2F0ZSBob21vZ3JhcGggYXR0YWNrLiBlLmcuICdkYXNoJxIIJGNvbW1lbnQSwE11c3QgZWl0aGVyIGJlIGVxdWFsIHRvIGFuIGV4aXN0aW5nIGRvbWFpbiBvciBlbXB0eSB0byBjcmVhdGUgYSB0b3AgbGV2ZWwgZG9tYWluLiAibyIsICJpIiBhbmQgImwiIG11c3QgYmUgcmVwbGFjZWQgd2l0aCAiMCIgYW5kICIxIi4gT25seSB0aGUgZGF0YSBjb250cmFjdCBvd25lciBjYW4gY3JlYXRlIHRvcCBsZXZlbCBkb21haW5zLhIMcHJlb3JkZXJTYWx0FgYSBHR5cGUSBWFycmF5EglieXRlQXJyYXkTARIIbWluSXRlbXMCIBIIbWF4SXRlbXMCIBIIcG9zaXRpb24CBBILZGVzY3JpcHRpb24SIlNhbHQgdXNlZCBpbiB0aGUgcHJlb3JkZXIgZG9jdW1lbnQSB3JlY29yZHMWBxIEdHlwZRIGb2JqZWN0Egpwcm9wZXJ0aWVzFgISFGRhc2hVbmlxdWVJZGVudGl0eUlkFggSBHR5cGUSBWFycmF5EglieXRlQXJyYXkTARIIbWluSXRlbXMCIBIIbWF4SXRlbXMCIBIIcG9zaXRpb24CABIQY29udGVudE1lZGlhVHlwZRIhYXBwbGljYXRpb24veC5kYXNoLmRwcC5pZGVudGlmaWVyEgtkZXNjcmlwdGlvbhI+SWRlbnRpdHkgSUQgdG8gYmUgdXNlZCB0byBjcmVhdGUgdGhlIHByaW1hcnkgbmFtZSB0aGUgSWRlbnRpdHkSCCRjb21tZW50EiNNdXN0IGJlIGVxdWFsIHRvIHRoZSBkb2N1bWVudCBvd25lchITZGFzaEFsaWFzSWRlbnRpdHlJZBYIEgR0eXBlEgVhcnJheRIJYnl0ZUFycmF5EwESCG1pbkl0ZW1zAiASCG1heEl0ZW1zAiASCHBvc2l0aW9uAgESEGNvbnRlbnRNZWRpYVR5cGUSIWFwcGxpY2F0aW9uL3guZGFzaC5kcHAuaWRlbnRpZmllchILZGVzY3JpcHRpb24SPUlkZW50aXR5IElEIHRvIGJlIHVzZWQgdG8gY3JlYXRlIGFsaWFzIG5hbWVzIGZvciB0aGUgSWRlbnRpdHkSCCRjb21tZW50EiNNdXN0IGJlIGVxdWFsIHRvIHRoZSBkb2N1bWVudCBvd25lchINbWluUHJvcGVydGllcwIBEg1tYXhQcm9wZXJ0aWVzAgESCHBvc2l0aW9uAgUSFGFkZGl0aW9uYWxQcm9wZXJ0aWVzEwASCCRjb21tZW50EpBDb25zdHJhaW50IHdpdGggbWF4IGFuZCBtaW4gcHJvcGVydGllcyBlbnN1cmUgdGhhdCBvbmx5IG9uZSBpZGVudGl0eSByZWNvcmQgaXMgdXNlZCAtIGVpdGhlciBhIGBkYXNoVW5pcXVlSWRlbnRpdHlJZGAgb3IgYSBgZGFzaEFsaWFzSWRlbnRpdHlJZGASDnN1YmRvbWFpblJ1bGVzFgYSBHR5cGUSBm9iamVjdBIKcHJvcGVydGllcxYBEg9hbGxvd1N1YmRvbWFpbnMWBBIEdHlwZRIHYm9vbGVhbhILZGVzY3JpcHRpb24SW1RoaXMgb3B0aW9uIGRlZmluZXMgd2hvIGNhbiBjcmVhdGUgc3ViZG9tYWluczogdHJ1ZSAtIGFueW9uZTsgZmFsc2UgLSBvbmx5IHRoZSBkb21haW4gb3duZXISCCRjb21tZW50Ek9Pbmx5IHRoZSBkb21haW4gb3duZXIgaXMgYWxsb3dlZCB0byBjcmVhdGUgc3ViZG9tYWlucyBmb3Igbm9uIHRvcC1sZXZlbCBkb21haW5zEghwb3NpdGlvbgIAEghwb3NpdGlvbgIGEgtkZXNjcmlwdGlvbhJCU3ViZG9tYWluIHJ1bGVzIGFsbG93IGRvbWFpbiBvd25lcnMgdG8gZGVmaW5lIHJ1bGVzIGZvciBzdWJkb21haW5zEhRhZGRpdGlvbmFsUHJvcGVydGllcxMAEghyZXF1aXJlZBUBEg9hbGxvd1N1YmRvbWFpbnMSCHJlcXVpcmVkFQYSBWxhYmVsEg9ub3JtYWxpemVkTGFiZWwSGm5vcm1hbGl6ZWRQYXJlbnREb21haW5OYW1lEgxwcmVvcmRlclNhbHQSB3JlY29yZHMSDnN1YmRvbWFpblJ1bGVzEhRhZGRpdGlvbmFsUHJvcGVydGllcxMAEggkY29tbWVudBL7ATdJbiBvcmRlciB0byByZWdpc3RlciBhIGRvbWFpbiB5b3UgbmVlZCB0byBjcmVhdGUgYSBwcmVvcmRlci4gVGhlIHByZW9yZGVyIHN0ZXAgaXMgbmVlZGVkIHRvIHByZXZlbnQgbWFuLWluLXRoZS1taWRkbGUgYXR0YWNrcy4gbm9ybWFsaXplZExhYmVsICsgJy4nICsgbm9ybWFsaXplZFBhcmVudERvbWFpbiBtdXN0IG5vdCBiZSBsb25nZXIgdGhhbiAyNTMgY2hhcnMgbGVuZ3RoIGFzIGRlZmluZWQgYnkgUkZDIDEwMzUuIERvbWFpbiBkb2N1bWVudHMgYXJlIGltbXV0YWJsZTogbW9kaWZpY2F0aW9uIGFuZCBkZWxldGlvbiBhcmUgcmVzdHJpY3RlZAhwcmVvcmRlchYGEgR0eXBlEgZvYmplY3QSB2luZGljZXMVARYDEgRuYW1lEgpzYWx0ZWRIYXNoEgpwcm9wZXJ0aWVzFQEWARIQc2FsdGVkRG9tYWluSGFzaBIDYXNjEgZ1bmlxdWUTARIKcHJvcGVydGllcxYBEhBzYWx0ZWREb21haW5IYXNoFgYSBHR5cGUSBWFycmF5EglieXRlQXJyYXkTARIIbWluSXRlbXMCIBIIbWF4SXRlbXMCIBIIcG9zaXRpb24CABILZGVzY3JpcHRpb24SWURvdWJsZSBzaGEtMjU2IG9mIHRoZSBjb25jYXRlbmF0aW9uIG9mIGEgMzIgYnl0ZSByYW5kb20gc2FsdCBhbmQgYSBub3JtYWxpemVkIGRvbWFpbiBuYW1lEghyZXF1aXJlZBUBEhBzYWx0ZWREb21haW5IYXNoEhRhZGRpdGlvbmFsUHJvcGVydGllcxMAEggkY29tbWVudBJKUHJlb3JkZXIgZG9jdW1lbnRzIGFyZSBpbW11dGFibGU6IG1vZGlmaWNhdGlvbiBhbmQgZGVsZXRpb24gYXJlIHJlc3RyaWN0ZWQAAjfsugQjtjFH1tziawxcHm6Itrtfd4HxFXit+EBuIEGCEAIBYN8CAb/jxzcNWFZEpbAUm+m8bHmGDiDoIp0nmnAVzK1RREtVAtYIgZuRPU70BrwnGYqsfr3rqOmCvT+uOZn5JD+z2Fb7EAHRk0v0/UW0amfTj5Q3RgNXsCy34jIVuLie5yXuiKURfQQgMBLBm5jsADOt2zbNZLf1EGcPKjUaQwS19plBRChu/awACwP9eCCC7wkAAAAApQ40uU7eIE6Lc7gSiikQMybwd7ICds9JRkR7mN9dsKsQAS6QXX9hmpIEs9jEW3eAXNz9stWYGeSq/BnIm9Y+L8XMERECiTcgqXvEL2837Y7t1JcjkYGVIFZ7NkS80ZLVeDUZzS0QAfdYjSzg2BIkhpiPAHQ5W4aN0OlpO7pNjwx46JLVtF5HEQLIaUC5PRYEMoQrfMJnG3PgKokrA37sdKCgo7Hxar/TcRABMapwxTKSfBkDooZq35By87R1c8Y4h4LvZXgOwY+CNfQR", "quorumHash": "AAAAu4I2BiBDnydSZOLs2bV45yWb+vJFEKQi9wTc3hg=", "signature": "t6IYrtqREmhCMGQva67DMYpqoY+4fIPB0245y/vhrs0L4qqv7+jDYFoppC7TzFCnCpXLxwOL15u8AOmGFsuMn7FA7qtz/rzJT0124Va1EL5ioeD0DwPVVCAEfQcN/7+6", "round": 1, "blockIdHash": "R6LgAhbTCMP2bbiktIm1nLnJ4csO0UvaK6vArGJ2ghs=", "quorumType": 6 }, "metadata": { "height": "9350", "coreChainLockedHeight": 929436, "epoch": 943, "timeMs": "1702317747792", "protocolVersion": 1, "chainId": "dash-testnet-37" } } } ``` ::: :::: ### getProtocolVersionUpgradeState **Returns**: The number of votes cast for each protocol version. **Parameters**: | Name | Type | Required | Description | | ------- | ------- | -------- | ------------ | | `prove` | Boolean | No | Set to `true` to receive a proof that contains the requested identity **Example Request and Response** ::::{tab-set} :::{tab-item} gRPCurl :sync: grpcurl ```shell grpcurl -proto protos/platform/v0/platform.proto \ -d '{ "v0": { } }' \ seed-1.testnet.networks.dash.org:1443 \ org.dash.platform.dapi.v0.Platform/getProtocolVersionUpgradeState ``` ::: :::: ::::{tab-set} :::{tab-item} Response (gRPCurl) :sync: grpcurl ```json { "v0": { "versions": { "versions": [ { "versionNumber": 1, "voteCount": 28 } ] }, "metadata": { "height": "10649", "coreChainLockedHeight": 930014, "epoch": 965, "timeMs": "1702397313265", "protocolVersion": 1, "chainId": "dash-testnet-37" } } } ``` ::: :::: ### getProtocolVersionUpgradeVoteStatus **Returns**: Protocol version upgrade status. **Parameters**: | Name | Type | Required | Description | | ------- | ------- | -------- | ------------ | | `start_pro_tx_hash` | String | No | Protx hash of an evonode | `count` | Integer | No | Number of records to request | `prove` | Boolean | No | Set to `true` to receive a proof that contains the requested identity **Example Request and Response** ::::{tab-set} :::{tab-item} gRPCurl :sync: grpcurl ```shell # `start_pro_tx_hash` must be represented in base64 if present grpcurl -proto protos/platform/v0/platform.proto \ -d '{ "v0": { "count": 2 } }' \ seed-1.testnet.networks.dash.org:1443 \ org.dash.platform.dapi.v0.Platform/getProtocolVersionUpgradeVoteStatus ``` ::: :::: ::::{tab-set} :::{tab-item} Response (gRPCurl) :sync: grpcurl ```json { "v0": { "versions": { "versionSignals": [ { "proTxHash": "WyRggLpkNQaF/jAtPXkPW7I4y2GZINRiMMhE8HmUSiM=", "version": 1 }, { "proTxHash": "XGVCdmYVOHGDcV2VipJVUkcvkzNfoWEogEI+S72u9DY=", "version": 1 } ] }, "metadata": { "height": "10662", "coreChainLockedHeight": 930024, "epoch": 966, "timeMs": "1702398582963", "protocolVersion": 1, "chainId": "dash-testnet-37" } } } ``` ::: :::: ### waitForStateTransitionResult **Returns**: The state transition hash and either a proof that the state transition was confirmed in a block or an error. **Parameters**: | Name | Type | Required | Description | | ----------------------- | ------- | -------- | -------------------------------- | | `state_transition_hash` | Bytes | Yes | Hash of the state transition | | `prove` | Boolean | Yes | Set to `true` to request a proof | > 📘 > > **Note**: When requesting proofs, the data requested will be encoded as part of the proof in the response. **Example Request** ```{eval-rst} .. Commented out info [block:html] { "html": "\n\n\n\n" } [/block] ``` ::::{tab-set} :::{tab-item} JavaScript (dapi-client) :sync: js-dapi-client ```javascript const DAPIClient = require('@dashevo/dapi-client'); const client = new DAPIClient(); // Replace with your actual hash const hash = ; client.platform.waitForStateTransitionResult(hash, { prove: true }) .then((response) => { console.log(response); }); ``` ::: :::{tab-item} Request (gRPCurl) :sync: grpcurl ```shell # Replace `your_state_transition_hash` with your own before running # `your_state_transition_hash` must be represented in base64 # Example: wEiwFu9WvAtylrwTph5v0uXQm743N+75C+C9DhmZBkw= grpcurl -proto protos/platform/v0/platform.proto \ -d '{ "v0": { "state_transition_hash":your_state_transition_hash, "prove": "true" } }' \ seed-1.testnet.networks.dash.org:1443 \ org.dash.platform.dapi.v0.Platform/waitForStateTransitionResult ``` ::: :::: ```{eval-rst} .. Commented out info [block:html] { "html": "\n\n" } [/block] ``` ## Deprecated Endpoints The following endpoints were recently deprecated. See the [previous version of documentation](https://docs.dash.org/projects/platform/en/0.25.0/docs/reference/dapi-endpoints-platform-endpoints.html) for additional information on these endpoints. ### getIdentities *Deprecated in Dash Platform v1.0.0-dev.12* **Returns**: [Identity](../explanations/identity.md) information for the requested identities **Parameters**: | Name | Type | Required | Description | | ------- | ------- | -------- | ------------ | | `ids` | Array | Yes | An array of identity IDs | `prove` | Boolean | No | Set to `true` to receive a proof that contains the requested identity ### getIdentitiesByPublicKeyHashes *Deprecated in Dash Platform v1.0.0-dev.12* **Returns**: An array of [identities](../explanations/identity.md) associated with the provided public key hashes **Parameters**: | Name | Type | Required | Description | | ------------------- | ------- | -------- | ----------------------------------------------------------------------- | | `public_key_hashes` | Bytes | Yes | Public key hashes (sha256-ripemd160) of identity public keys | | `prove` | Boolean | No | Set to `true` to receive a proof that contains the requested identities | ## Code Reference Implementation details related to the information on this page can be found in: * The [Platform repository](https://github.com/dashevo/platform/tree/master/packages/dapi) `packages/dapi/lib/grpcServer/handlers/core` folder * The [Platform repository](https://github.com/dashevo/platform/tree/master/packages/dapi-grpc) `packages/dapi-grpc/protos` folder