Tokens#
Overview#
Dash Platform lets developers create and manage tokens (similar to ERC-20 style assets) without writing smart contracts. Tokens leverage data contracts, state transitions, and built-in access control (via data contract groups) to enable flexible token management.
Token Features#
Dash Platform’s token functionality provides a straightforward, account-based approach to creating and managing tokens that is much simpler than writing custom smart contracts. Features include:
Flexible Configuration: Localization, supply limits, admin rules, freeze/pause rules, etc.
Access Control Groups: Multi-party groups with user-defined thresholds support complex authorization schemes for token management
Built-in Distribution: Manual minting or scheduled release over time
Seamless Integration: Tokens live alongside documents in a single data contract, enabling additional use cases (e.g., ticketing, digital assets, stablecoins)
The following sections describe the features and configuration options available for token creators using Dash Platform.
Actions#
Note
Authorization for token actions is based on the configuration defined in the data contract. Token creators may disable specific actions or limit the ability to modify the token configuration.
The initial token implementation includes all actions required to create, use, and manage tokens. This table summarizes available actions:
Action |
Description |
---|---|
Mints new tokens to a specified recipient |
|
Transfers tokens to another recipient |
|
Burns (destroys) a specified amount of tokens |
|
Freezes/thaws a specific entity’s tokens |
|
Destroys frozen funds for a specified entity |
|
Performs emergency actions like pausing or resuming the contract |
|
Updates token configuration settings |
Mint#
Creates new tokens to a specified identity or a fixed destination depending on the distribution rules configuration
Requires the sender (or group) to have mint permissions
Transfer#
Moves a given amount of tokens from the sender to a recipient identity. Three types of optional notes can be provided:
Public note (visible to everyone)
Shared encrypted note (only sender & recipient can decrypt)
Private encrypted note (only sender can decrypt)
Burn#
Destroys a specified amount of tokens from the sender’s balance
Can be restricted (i.e., not everyone can burn tokens unless configured)
Freeze and Thaw#
Freeze prevents an identity from transferring tokens. This is typically used by regulated tokens (e.g., stablecoins)
Unfreeze (thaw) removes the restriction and enables transfers for the previously frozen identity
Destroy Frozen#
Destroy tokens from a frozen identity’s balance (e.g., blacklisting stolen tokens in stablecoin systems).
Emergency Action#
Globally pause or unpause an entire token. While paused, no transfers can occur.
Configuration Updates#
Update token configuration parameters, including:
Localization options
Maximum supply
History retention
Group membership
Configuration#
When creating a token, you define its configuration using the following parameters. Most parameters can be configured to allow modifications after data contract registration; however, the base supply is immutable:
Configuration Parameter |
Mutable |
Default |
---|---|---|
Yes |
N/A. Depends on implementation |
|
Yes |
||
No |
||
Yes |
None |
|
Yes |
True |
|
Yes |
False |
|
Yes |
None |
|
Main control group can be modified |
Yes |
NoOne |
Display Conventions#
The token name in multiple languages, how to capitalize it, singular vs. plural form, etc.
How many decimal places the token uses
Token Supply#
Initial supply at launch (base supply)
Maximum supply
No minting is possible if the maximum supply equals the base supply
Token can be configured to allow authorized parties to change the maximum supply
History#
Whether or not to store a complete on-chain log of every token action (e.g., transfers, burns, etc.)
Initial State#
Whether the token starts out paused (no transfers allowed) upon creation
Change Control Rules#
Who (or what group) can change specific parameters later
Whether the authority to change these parameters can be transferred or locked to “no one”
Example: “Only group #1 can update the max supply.” See the Rules section for details.
Main Control Group#
A group that can be referenced in other fields to control multiple aspects of the token with the same group.
Rules#
Token rules assign permissions for various token control and configuration actions. There are levels of authorization defined by rules: Admin and Control.
Admin
Admin level rule settings are used to manage who has permission to perform actions by modifying which user or group is authorized to complete an action. An admin group can also modify who has admin authorization if the data contract has enabled that option.
Control
Control level rule settings define who can perform token actions. This includes actions like mint or burn, as well as token distribution.
Parameters#
Each rule consists of the following parameters defined in DPP that control its behavior:
Field |
Description |
---|---|
|
This is who is authorized to make such a change. Valid values are listed in the authorized parties table. |
|
This is who is authorized to make such a change to the people authorized to make a change. Valid values are listed in the authorized parties table. |
|
Are we allowed to change to |
|
Are we allowed to change the admin action takers to |
|
Can the admin action takers change themselves (default: false) |
Action Rules#
Token action rules can be configured to allow updating who has access to many token actions. The following table summarizes the available action rules:
Configuration Rule |
Can be Changed? |
Default Authorized Party |
---|---|---|
Conventions change rules |
Yes |
NoOne |
Max supply change rules |
Yes |
NoOne |
Manual minting rules |
Yes |
Contract Owner |
Manual burning rules |
Yes |
Contract Owner |
Freeze rules |
Yes |
NoOne |
Unfreeze rules |
Yes |
NoOne |
Destroy frozen funds rules |
Yes |
NoOne |
Emergency_action rules |
Yes |
NoOne |
Main control group can be modified |
Yes |
NoOne |
Distribution Rules#
Tokens have distribution rules to define how new tokens are introduced over time. The three distribution options are summarized below:
Method |
Description |
Example |
Notes |
---|---|---|---|
Manual Minting |
Authorized users/groups can create new tokens until |
On-demand minting |
- Requires proper configuration to enable |
Programmed Distribution |
A fixed number of tokens are automatically minted to designated identities at a specific timestamp |
On Jan 1, 2047, allocate |
- Automates token release at known times |
Scheduled release of tokens based on blocks or time intervals |
Emit 100 tokens every 20 blocks, or Halve the emission every year |
- Offers ongoing, dynamic token emission patterns. |
Dash Platform also supports three options to control the destination for newly minted tokens:
Option |
Description |
Notes |
---|---|---|
Choose Destination |
The minter can dynamically specify which identity receives newly minted tokens at the time of minting. |
- Offers flexibility for varied or on-demand allocation. |
Fixed Destination |
Newly minted tokens are always directed to one predetermined (fixed) identity. |
- Ensures a strict, predictable allocation. |
Combination / Exclusive |
These two approaches can be used exclusively (only one rule active) or combined for more granular control. |
- In a combined setup, some mints could go to a fixed address while others go to a chosen address. |
Perpetual Distribution Options#
A wide variety of emission patterns are provided to cover most common scenarios. The following table summarizes the options and links to further details.
Name |
Description |
---|---|
Emits a constant number of tokens per period |
|
Emits a random amount between |
|
Emits tokens that decrease in discrete steps at fixed intervals |
|
Linear growth/decay with integer or fractional precision |
|
Polynomial with integer or fractional exponents or coefficients |
|
Emits tokens following an exponential function |
|
Slows emission over time |
|
Slows emission over time |
|
Emits constant values within predefined steps |
Fixed Amount#
Emits a constant (fixed) number of tokens for every period.
Formula:
f(x) = n
Use Case:
When a predictable, unchanging reward is desired.
Simplicity and stable emissions.
Example: If
n = 5
tokens per block, then after 3 blocks the total emission is 15 tokens.
Random#
Emits a random number of tokens within a specified range.
Formula:
f(x) ∈ [min, max]
Constraints:
min
must be ≤max
, otherwise the function is invalid.If
min == max
, this behaves like a Fixed Amount function with a constant emission.
Description
This function selects a random token emission amount between
min
andmax
.The value is drawn uniformly between the bounds.
The randomness uses a Pseudo Random Function (PRF) from x.
Use Case
Stochastic Rewards: Introduces randomness into rewards to incentivize unpredictability.
Lottery-Based Systems: Used for randomized emissions, such as block rewards with probabilistic payouts.
Example
Suppose a system emits between 10 and 100 tokens per period.
Random { min: 10, max: 100 }
Period (x)
Emitted Tokens (Random)
1
27
2
94
3
63
4
12
Each period, the function emits a random number of tokens between
min = 10
andmax = 100
.Over time, the average reward trends toward the midpoint
(min + max) / 2
.
Step Decreasing Amount#
Emits tokens that decrease in discrete steps at fixed intervals.
Formula:
f(x) = n * (1 - (numerator / denominator))^((x - s) / step_count)
Description: Reduces token emissions by a fixed percentage at regular intervals. Includes optional start offset and minimum emission floor.
step_count
: number of periods between each stepnumerator
anddenominator
: the reduction factor per steps
: optional start period offset (e.g., start block or time). If not provided, the contract creation start is used.n
: initial token emission amountmin_value
: optional minimum emission value
Use Case: Reward systems with predictable decay—ideal for Bitcoin-style halvings or Dash-style gradual reductions
Example:
Bitcoin: 50% reduction every 210,000 blocks
Dash: ~7% reduction every 210,240 blocks
Linear#
Emits tokens following a linear function that can increase or decrease over time with fractional precision.
Formula:
f(x) = (a * (x - s) / d) + b
Description: Supports both integer and fractional slopes via
a / d
ratio. Enables precise reward schedules without floating-point rounding errors.Parameters
a
: slope numerator (positive = increase, negative = decrease)d
: slope divisor (enables fractional precision)s
: optional start period offset (defaults to contract creation)b
: starting emission amountmin_value
/max_value
: optional emission bounds
Behavior
If
a > 0
, emissions increase linearly over timeIf
a < 0
, emissions decrease linearly over timeIf
a = 0
, emissions remain constant atb
Use Case: Predictable inflation or deflation, gradual reward scaling, clamped emission schedules
Example:
Increasing Linear Emission:
f(x) = (1 * (x - 0) / 1) + 10
Decreasing Linear Emission:
f(x) = (-2 * (x - 0) / 1) + 100
Delayed Start:
f(x) = (5 * (x - 10) / 1) + 50
Clamping Emissions:
f(x) = (2 * (x - 0) / 1) + 50
Polynomial#
A polynomial function using fixed-point arithmetic for fractional or integer exponents.
Formula:
f(x) = (a * (x - s + o)^(m / n)) / d + b
Description:
Emits tokens based on a polynomial curve, where the exponent is defined as a fraction (m / n
). This enables a wide range of growth or decay behaviors—linear, quadratic, root-based, and more—using precise fixed-point logic.
Parameters:a
: coefficient scaling the curve (positive for growth, negative for decay)m
andn
: exponent numerator and denominator, allowing fractional powers (e.g.,m = 1
,n = 2
→ square root)d
: divisor to scale the results
: optional start period offseto
: offset inside the exponent inputb
: amount added after the curve is computedmin_value
/max_value
: optional boundaries to clamp emissions
Use Case:
Accelerating Growth: Use
a > 0
andm > 1
for quadratic/cubic growthDiminishing Emissions: Use
a < 0
and fractional exponents for decaying curvesRoot-based Models: Use
m = 1
,n > 1
to slow down early growthFlexibility: Fine-tune emission behavior with high control over shape
Example:
Increasing Polynomial Growth:
f(x) = (2 * (x - s + o)^2) / d + 10
Decreasing Polynomial Decay:
f(x) = (5 * (x - s + o)^(-1)) / d + 10
Inverted Growth → Decreasing Over Time:
f(x) = (-3 * (x - s + o)^2) / d + 50
Inverted Decay → Slowing Increase:
f(x) = (-10 * (x - s + o)^(-2)) / d + 50
Exponential#
Emits tokens following an exponential function.
Formula:
f(x) = a * e^(b * x) + c
Description:
b
> 0 -> rapid growthb
< 0 -> rapid decay
Use Case: Early contributor boosts or quick emission tapering
Example: f(x) = 100 * e^(-0.693 * x) + 5
Logarithmic#
Logarithmic growth of token emissions.
Formula:
f(x) = a * log_b(x) + c
Description: Growth slows as
x
increasesUse Case: Sustainable long-term emission tapering
Example: f(x) = 20 * log_2(x) + 5
Inverted Logarithmic#
Emits tokens following an inverted logarithmic decay curve.
Formula:
f(x) = (a * log(n / (m * (x - s + o)))) / d + b
Description:
Emits a high number of tokens initially, with emissions decreasing rapidly at first, then slowing over time. Useful when early adoption or front-loaded incentives are desired.
Parameters:a
: scaling factor for the log termd
: divisor to scale the final resultm
andn
: Control the logarithmic inversiono
: offset applied inside the logarithms
: optional start period offset (defaults to contract creation time if not provided)b
: offset added after scalingmin_value
/max_value
: optional bounds to constrain emissions
Use Case:
Gradual Decay of Rewards: Prioritize early users with higher emissions that reduce over time
Resource Draining / Controlled Burn: Designed for token models where supply tapers gradually
Airdrops & Grants: Rewards diminish for late claimants, encouraging early participation
Example:
f(x) = (1000 * log(5000 / (5 * (x - 1000)))) / 10 + 10
Sample outputs:
Period (x)
Emission (f(x))
1000
500 tokens
1500
230 tokens
2000
150 tokens
5000
50 tokens
10,000
20 tokens
50,000
10 tokens
Starts high and decays gradually without hitting zero too fast
Stepwise#
Emits tokens in fixed amounts for specific intervals.
Description: Emissions remain constant within each step
Use Case: Adjust rewards at specific milestones
Example: 100 tokens per block for first 1000 blocks, then 50 tokens thereafter
Groups#
Groups can be used to distribute token configuration and update authorization across multiple identities. Each group defines a set of member identities, the voting power of each member, and the required power threshold to authorize an action.
Each group member is assigned an integer power.
The group itself has a required power threshold to authorize an action.
Groups can have up to 256 members, each with a maximum power of 2^16 - 1 (65536).
Changes to a token (e.g., mint, burn, freeze) can be configured so they require group authorization. This is done by assigning the group under the token rule configuration.
Example
A token’s mint action is protected by a rule that only authorizes a group to mint tokens. Therefore, members of the assigned group must cooperate to complete the action. Once enough members (by power) approve, the network will finalize the action.
For example, a group is defined with a required threshold of 10. The group members are assigned the following powers:
Member A: 6
Member B: 3
Member C: 5
In this group, Member A and Member C have a combined power of 11 and can perform actions without approval from Member B. If Member B proposes an action, Member A and C must both approve to authorize the action.
Token Creation#
Creating a token on Dash Platform consists of creating a data contract, registering it on the network, and then creating tokens based on the schema defined in the data contract.
Contract Setup#
Structurally, there is no difference between contracts incorporating tokens and non-token contracts. While token contracts have a large set of token-specific options, there is no other difference.
Once the data contract design is completed, the contract can be registered on the network in preparation for token minting and use. See the contract registration tutorial for examples of how to register a contract.
Example Contract#
{
"$format_version": "1",
"id": "AcYUCSvAmUwryNsQqkqqD1o3BnFuzepGtR3Mhh2swLk6",
"ownerId": "HLfavpy1B2mVHnpYYDKDVM76eWJRqvPfuuASy7cyJBXC",
"version": 1,
"documentSchemas": {},
"tokens": {
"0": {
"$format_version": "0",
"conventions": {
"$format_version": "0",
"localizations": {
"en": {
"shouldCapitalize": true,
"singularForm": "flurgon",
"pluralForm": "flurgons"
}
},
"decimals": 8
},
"baseSupply": 1000000,
"maxSupply": 5000000,
"transferable": true,
"keepsHistory": false,
"freezeRules": {
"V0": {
"authorized_to_make_change": "ContractOwner",
"admin_action_takers": "ContractOwner",
"changing_authorized_action_takers_to_no_one_allowed": false,
"changing_admin_action_takers_to_no_one_allowed": false,
"self_changing_admin_action_takers_allowed": false
}
},
"unfreezeRules": {
"V0": {
"authorized_to_make_change": "ContractOwner",
"admin_action_takers": "ContractOwner",
"changing_authorized_action_takers_to_no_one_allowed": false,
"changing_admin_action_takers_to_no_one_allowed": false,
"self_changing_admin_action_takers_allowed": false
}
},
"destroyFrozenFundsRules": {
"V0": {
"authorized_to_make_change": "ContractOwner",
"admin_action_takers": "ContractOwner",
"changing_authorized_action_takers_to_no_one_allowed": false,
"changing_admin_action_takers_to_no_one_allowed": false,
"self_changing_admin_action_takers_allowed": false
}
},
"emergencyActionRules": {
"V0": {
"authorized_to_make_change": "ContractOwner",
"admin_action_takers": "ContractOwner",
"changing_authorized_action_takers_to_no_one_allowed": false,
"changing_admin_action_takers_to_no_one_allowed": false,
"self_changing_admin_action_takers_allowed": false
}
}
}
}
}
Token Trading#
A planned token marketplace will support the trading of tokens.