diff --git a/docs/index.md b/docs/index.md
index b81974968..2c9233e51 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -161,6 +161,7 @@ protocol-ref/identity
protocol-ref/data-contract
protocol-ref/state-transition
protocol-ref/document
+protocol-ref/token
protocol-ref/data-trigger
protocol-ref/errors
```
diff --git a/docs/protocol-ref/data-contract-document.md b/docs/protocol-ref/data-contract-document.md
index 7dc97a4e8..df4d8b071 100644
--- a/docs/protocol-ref/data-contract-document.md
+++ b/docs/protocol-ref/data-contract-document.md
@@ -209,13 +209,13 @@ For performance and security reasons, indices have the following constraints. Th
| ----------- | ----- |
| Minimum/maximum length of index `name` | [1](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json#L311) / [32](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json#L312) |
| Maximum number of indices | [10](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json#L390) |
-| Maximum number of unique indices | [10](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/v2.rs#L26) |
+| Maximum number of unique indices | [10](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/v2.rs#L27) |
| Maximum number of contested indices | [1](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/v2.rs#L26) |
| Maximum number of properties in a single index | [10](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json#L331) |
-| Maximum length of indexed string property | [63](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs#L72) |
+| Maximum length of indexed string property | [63](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/mod.rs#L34) |
| Usage of `$id` in an index [disallowed](https://github.com/dashpay/platform/pull/178) | N/A |
-| **Note: Dash Platform [does not allow indices for arrays](https://github.com/dashpay/platform/pull/225).**
Maximum length of indexed byte array property | [255](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs#L73) |
-| **Note: Dash Platform [does not allow indices for arrays](https://github.com/dashpay/platform/pull/225).**
Maximum number of indexed array items | [1024](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs#L74) |
+| **Note: Dash Platform [does not allow indices for arrays](https://github.com/dashpay/platform/pull/225).**
Maximum length of indexed byte array property | [255](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/mod.rs#L35) |
+| **Note: Dash Platform [does not allow indices for arrays](https://github.com/dashpay/platform/pull/225).**
Maximum number of indexed array items | [1024](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/mod.rs#L36) |
**Example**
The following example (excerpt from the DPNS contract's `preorder` document) creates an index named `saltedHash` on the `saltedDomainHash` property that also enforces uniqueness across all documents of that type:
diff --git a/docs/protocol-ref/data-contract-token.md b/docs/protocol-ref/data-contract-token.md
new file mode 100644
index 000000000..334f7d1df
--- /dev/null
+++ b/docs/protocol-ref/data-contract-token.md
@@ -0,0 +1 @@
+# Contract Tokens
diff --git a/docs/protocol-ref/data-contract.md b/docs/protocol-ref/data-contract.md
index a581b4921..e3357a3a2 100644
--- a/docs/protocol-ref/data-contract.md
+++ b/docs/protocol-ref/data-contract.md
@@ -40,7 +40,7 @@ Include the following at the same level as the `properties` keyword to ensure pr
## Data Contract Object
-The data contract object consists of the following fields as defined in the Rust reference client ([rs-dpp](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/data_contract/v1/data_contract.rs#L46-L75)):
+The data contract object consists of the following fields as defined in the Rust reference client ([rs-dpp](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/data_contract/v1/data_contract.rs#L67-L105)):
| Property | Type | Size | Description |
| --------------- | -------------- | ---- | ----------- |
@@ -735,4 +735,5 @@ Data contract state transitions must be signed by a private key associated with
:hidden:
data-contract-document
+data-contract-token
```
diff --git a/docs/protocol-ref/state-transition.md b/docs/protocol-ref/state-transition.md
index 469b07f2c..2edc3f2bb 100644
--- a/docs/protocol-ref/state-transition.md
+++ b/docs/protocol-ref/state-transition.md
@@ -13,7 +13,7 @@
### Fees
-State transition fees are paid via the credits established when an identity is created. Credits are created at a rate of [1000 credits/satoshi](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/balances/credits.rs#L40). Fees for actions vary based on parameters related to storage and computational effort that are defined in [rs-dpp](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/fee/default_costs/constants.rs).
+State transition fees are paid via the credits established when an identity is created. Credits are created at a rate of [1000 credits/satoshi](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/balances/credits.rs#L37). Fees for actions vary based on parameters related to storage and computational effort that are defined in [rs-dpp](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/fee/default_costs/constants.rs).
### Size
@@ -47,7 +47,7 @@ Dash Platform Protocol defines the [state transition types](https://github.com/d
| ownerId | array of bytes | 32 bytes | [Identity](../protocol-ref/identity.md) submitting the document(s) |
| transitions | array of transition objects | Varies | A batch of [document](../protocol-ref/document.md#document-overview) or token actions (up to 10 objects) |
-More detailed information about the `transitions` array can be found in the [document section](../protocol-ref/document.md). See the implementation in [rs-dpp](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/mod.rs#L39-L50).
+More detailed information about the `transitions` array can be found in the [document section](../protocol-ref/document.md). See the implementation in [rs-dpp](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/mod.rs#L29-L37).
### Data Contract Create
diff --git a/docs/protocol-ref/token.md b/docs/protocol-ref/token.md
new file mode 100644
index 000000000..d915de5be
--- /dev/null
+++ b/docs/protocol-ref/token.md
@@ -0,0 +1,161 @@
+# Token
+
+## Token Overview
+
+Dash Platform lets developers create and manage tokens (similar to ERC-20 style assets) without writing smart contracts. Tokens leverage [data contracts](./data-contract.md), [state transitions](./state-transition.md), and built-in access control (via data contract groups) to enable flexible token management. All token operations are completed by submitting them to the platform in a [batch state transition](./state-transition.md#batch).
+
+## Token State Transition Details
+
+All token transitions include the [token base transition fields](#token-base-transition). Most token transitions (.e.g., [token mint](#token-mint-transition)) require additional fields to provide their functionality.
+
+### Token Base Transition
+
+The following fields are included in all token transitions:
+
+| Field | Type | Size | Description |
+| ----- | ---- | ---- | ----------- |
+| $identityContractNonce | unsigned integer | 64 bits | Identity contract nonce |
+| $tokenContractPosition | unsigned integer | 16 bits | Position of the token within the contract |
+| $dataContractId | array | 32 bytes | Data contract ID [generated](../protocol-ref/data-contract.md#data-contract-id) from the data contract's `ownerId` and `entropy` |
+| [$tokenId](#token-id) | array | 32 bytes | Token ID generated from the data contract ID and the token position |
+| usingGroupInfo | [GroupStateTransitionInfo object](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/group/mod.rs#L42-L59) | Varies | Optional field indicating group multi-party authentication rules |
+
+Each token transition must comply with the [token base transition defined in rs-dpp](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_base_transition/v0/mod.rs#L45-L72).
+
+#### Token id
+
+The `$tokenId` is created by double sha256 hashing the token `$dataContractId` and `$tokenContractPosition` with a byte vector of the string "dash_token" as shown in [rs-dpp](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/tokens/mod.rs#L22-L27).
+
+```rust
+// From the Rust reference implementation (rs-dpp)
+// tokens/mod.rs
+pub fn calculate_token_id(contract_id: &[u8; 32], token_pos: TokenContractPosition) -> [u8; 32] {
+ let mut bytes = b"dash_token".to_vec();
+ bytes.extend_from_slice(contract_id);
+ bytes.extend_from_slice(&token_pos.to_be_bytes());
+ hash_double(bytes)
+}
+```
+
+#### Token Transition Action
+
+The token transition actions [defined in rs-dpp](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transition_action_type.rs#L7-L17) indicate what operation platform should perform with the provided transition data.
+
+| Action | Name | Description |
+| :-: | - | - |
+| 0 | [Burn](#token-burn-transition) | Permanently remove a specified amount of tokens from circulation |
+| 1 | [Mint](#token-mint-transition) | Create new tokens |
+| 2 | [Transfer](#token-transfer-transition) | Send tokens from one identity to another |
+| 3 | [Freeze](#token-freeze-transition) | Restrict an identity’s ability to transfer or use tokens |
+| 4 | [Unfreeze](#token-unfreeze-transition) | Lift a freeze restriction on an identity's tokens |
+| 5 | [Destroy Frozen Funds](#token-destroy-frozen-funds-transition) | Remove frozen tokens from an identity's balance |
+| 6 | [Claim](#token-claim-transition) | Retrieve tokens based on a specified distribution method |
+| 7 | [Emergency Action](#token-emergency-action-transition) | Execute an emergency protocol affecting tokens |
+| 8 | [Config Update](#token-config-update-transition) | Modify the configuration settings of a token |
+
+### Token Notes
+
+Some token transitions include optional notes fields. The maximum note length for these fields is [2048 characters](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/tokens/mod.rs#L14).
+
+### Token Burn Transition
+
+The token burn transition extends the [base transition](#token-base-transition) to include the following additional fields:
+
+| Field | Type | Size | Description |
+| ----- | ---- | ---- | ----------- |
+| burnAmount | unsigned integer | 64 bits | Number of tokens to be burned |
+| publicNote | string | [<= 2048 characters](#token-notes) | Optional public note |
+
+Each token burn transition must comply with the [token burn transition defined in rs-dpp](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_burn_transition/v0/mod.rs#L22-L38).
+
+### Token Mint Transition
+
+The token mint transition extends the [base transition](#token-base-transition) to include the following additional fields:
+
+| Field | Type | Size | Description |
+| ----- | ---- | ---- | ----------- |
+| issuedToIdentityId | array | 32 bytes | Optional identity ID receiving the minted tokens. If this is not set then we issue to the identity set in contract settings. |
+| amount | unsigned integer | 64 bits | Number of tokens to mint |
+| publicNote | string | [<= 2048 characters](#token-notes) | Optional public note |
+
+Each token mint transition must comply with the [token mint transition defined in rs-dpp](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_mint_transition/v0/mod.rs#L23-L43).
+
+### Token Transfer Transition
+
+The token transfer transition extends the [base transition](#token-base-transition) to include the following additional fields:
+
+| Field | Type | Size | Description |
+| ----- | ---- | ---- | ----------- |
+| amount | unsigned integer | 64 bits | Number of tokens to transfer |
+| recipientId | array | 32 bytes | Identity ID of the recipient |
+| publicNote | string | [<= 2048 characters](#token-notes) | Optional public note |
+| sharedEncryptedNote | [SharedEncryptedNote object](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/tokens/mod.rs#L15) | [<= 2048 characters](#token-notes) | Optional shared encrypted note |
+| privateEncryptedNote | [PrivateEncryptedNote object](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/tokens/mod.rs#L16-L20) | [<= 2048 characters](#token-notes) | Optional private encrypted note |
+
+Each token transfer transition must comply with the [token transfer transition defined in rs-dpp](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transfer_transition/v0/mod.rs#L30-L61).
+
+### Token Freeze Transition
+
+The token freeze transition extends the [base transition](#token-base-transition) to include the following additional fields:
+
+| Field | Type | Size | Description |
+| ----- | ---- | ---- | ----------- |
+| frozenIdentityId | array | 32 bytes | Identity ID of the account to be frozen |
+| publicNote | string | [<= 2048 characters](#token-notes) | Optional public note |
+
+Each token freeze transition must comply with the [token freeze transition defined in rs-dpp](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_freeze_transition/v0/mod.rs#L19-L35).
+
+### Token Unfreeze Transition
+
+The token unfreeze transition extends the [base transition](#token-base-transition) to include the following additional fields:
+
+| Field | Type | Size | Description |
+| ----- | ---- | ---- | ----------- |
+| frozenIdentityId | array | 32 bytes | Identity ID of the account to be unfrozen |
+| publicNote | string | [<= 2048 characters](#token-notes) | Optional public note |
+
+Each token unfreeze transition must comply with the [token unfreeze transition defined in rs-dpp](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_unfreeze_transition/v0/mod.rs#L19-L35).
+
+### Token Destroy Frozen Funds Transition
+
+The token destroy frozen funds transition extends the [base transition](#token-base-transition) to include the following additional fields:
+
+| Field | Type | Size | Description |
+| ----- | ---- | ---- | ----------- |
+| frozenIdentityId | array | 32 bytes | Identity ID of the account whose frozen balance should be destroyed |
+| publicNote | string | [<= 2048 characters](#token-notes) | Optional public note |
+
+Each token destroy frozen funds transition must comply with the [token destroy frozen funds transition defined in rs-dpp](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_destroy_frozen_funds_transition/v0/mod.rs#L17-L25).
+
+### Token Claim Transition
+
+The token claim transition extends the [base transition](#token-base-transition) to include the following additional fields:
+
+| Field | Type | Size | Description |
+| ----- | ---- | ---- | ----------- |
+| distributionType | [TokenDistributionType enum](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/data_contract/associated_token/token_distribution_key.rs#L18-L25) | Varies | Type of [token distribution](../explanations/tokens.md#distribution-rules) targeted |
+| publicNote | string | [<= 2048 characters](#token-notes) | Optional public note (only saved for historical contracts) |
+
+Each token claim transition must comply with the [token claim transition defined in rs-dpp](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_claim_transition/v0/mod.rs#L18-L26).
+
+### Token Emergency Action Transition
+
+The token emergency action transition extends the [base transition](#token-base-transition) to include the following additional fields:
+
+| Field | Type | Size | Description |
+| ----- | ---- | ---- | ----------- |
+| emergencyAction | [TokenEmergencyAction enum](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/tokens/emergency_action.rs#L14-L18) | Varies | The emergency action to be executed |
+| publicNote | string | [<= 2048 characters](#token-notes) | Optional public note |
+
+Each token emergency action transition must comply with the [token emergency action transition defined in rs-dpp](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_emergency_action_transition/v0/mod.rs#L16-L24).
+
+### Token Config Update Transition
+
+The token config update transition extends the [base transition](#token-base-transition) to include the following additional fields:
+
+| Field | Type | Size | Description |
+| ----- | ---- | ---- | ----------- |
+| updateTokenConfigurationItem | [TokenConfigurationChangeItem object](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/data_contract/associated_token/token_configuration_item.rs#L32-L63) | Varies | Updated token configuration item |
+| publicNote | string | [<= 2048 characters](#token-notes) | Optional public note |
+
+Each token configuration update transition must comply with the [token config update transition defined in rs-dpp](https://github.com/dashpay/platform/blob/v2.0-dev/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_config_update_transition/v0/mod.rs#L19-L27).