Contract Tokens#

Contract Token Overview#

The tokens object defines each type of token in the data contract. At a minimum, a token must define conventions. All other fields have sensible defaults. Each token must be assigned a unique position within the contract and follow the token constraints.

Note

The protocol only requires conventions. However, some SDKs (e.g., the JavaScript SDK) may require change control rules to be provided explicitly.

The following example shows a minimal tokens object defining a single token with basic conventions:

{
  "tokens": {
    "0": {
      "$format_version": "0",
      "conventions": {
        "$format_version": "0",
        "localizations": {
          "en": {
            "$format_version": "0",
            "shouldCapitalize": false,
            "singularForm": "credit-token",
            "pluralForm": "credit-tokens"
          }
        },
        "decimals": 8
      }
    }
  }
}

Tokens may also define distribution rules, history tracking, marketplace rules, and various configuration options. Refer to this table for a brief description of the major token sections:

Feature

Description

Conventions

Display properties including localization, decimals, and naming conventions

Configuration

Behavioral settings for token operations, freezing, and emergency actions

Change Control Rules

Authorization rules governing who can modify token parameters

Distribution Rules

Rules for token distribution, minting destinations, and pricing

History Tracking

Configuration for recording token operations in Platform history

Token Creation Fees#

Token creation incurs specific fees based on which token features are used:

Operation

Fee (DASH)

Description

Token registration

0.1

Base fee for adding a token to a contract

Perpetual distribution

0.1

Fee for enabling perpetual distribution

Pre-programmed distribution

0.1

Fee for enabling pre-programmed distribution

Search keyword fee

0.1

Per keyword fee for including search keywords

Assigning Position#

Each token in the tokens object must be assigned a unique position value, with ordering starting at zero and incrementing with each token. The position is used as the key in the tokens object and indicates which token to perform operations on when a contract contains multiple tokens.

{
  "tokens": {
    "0": { /* first token definition */ },
    "1": { /* second token definition */ },
    "2": { /* third token definition */ }
  }
}

Token Conventions#

The conventions object defines the display and formatting properties of a token. It includes localization settings, decimal precision, and naming conventions that determine how the token is presented to users.

Localization#

The localizations object contains language-specific display properties using ISO 639-1 language codes as keys. Each localization entry includes:

Property

Type

Description

$format_version

string

Version of the localization format (currently “0”)

shouldCapitalize

boolean

Whether the token name should be capitalized when displayed

singularForm

string

Singular form of the token name

pluralForm

string

Plural form of the token name

"localizations": {
  "en": {
    "$format_version": "0", 
    "shouldCapitalize": true,
    "singularForm": "loyalty-point",
    "pluralForm": "loyalty-points"
  },
  "es": {
    "$format_version": "0",
    "shouldCapitalize": false,
    "singularForm": "punto-de-lealtad", 
    "pluralForm": "puntos-de-lealtad"
  }
}

Note

An English (en) localization entry is required. Tokens without an en key in the localizations map will fail protocol validation with a MissingDefaultLocalizationError.

Decimal Precision#

The decimals property specifies the number of decimal places for token amounts. This affects how token balances are displayed and calculated. If decimals is set to zero, token operations (e.g., mint, transfer) will only allow integer amounts.

"conventions": {
  "$format_version": "0",
  "localizations": { /* ... */ },
  "decimals": 8  // 8 decimal places (default)
}

Token Configuration#

Token configuration controls behavioral aspects of token operations, including supply management, operational controls, and security features.

General#

Property

Type

Description

description

string

Optional text describing the token’s purpose or behavior (3–100 characters)

Supply Management#

Property

Type

Description

baseSupply

unsigned integer

Initial supply of tokens created at contract deployment

maxSupply

unsigned integer

Maximum number of tokens that can ever exist (null for unlimited)

Operational Controls#

Property

Type

Description

startAsPaused

boolean

Whether the token begins in a paused state where tokens cannot be transferred

allowTransferToFrozenBalance

boolean

Whether transfers to frozen balances are permitted

Control Group Management#

Property

Type

Description

mainControlGroup

unsigned integer

Position assigned to the main control group

mainControlGroupCanBeModified

string

Authorization level for modifying the main control group

Example:

{
  "baseSupply": 1000000,
  "maxSupply": 10000000,
  "startAsPaused": false,
  "allowTransferToFrozenBalance": true,
  "mainControlGroup": null,
  "mainControlGroupCanBeModified": "NoOne"
}

Token Change Control Rules#

Change control rules define authorization requirements for modifying various aspects of a token after deployment. These rules specify who can make changes and under what conditions.

Authorized Parties#

Rules can authorize no one, specific identities, or multiparty groups. The complete set of options defined by DPP is:

Authorized Party

Description

NoOne

No one is authorized

ContractOwner

Only the contract owner is authorized

Identity(Identifier)

Only an identity is authorized

MainGroup

Only the main control group is authorized

Group(<x>)

Only the specific group based in contract position “x” is authorized

Change Rule Structure#

Each rule consists of the following parameters defined in DPP that control its behavior:

Field

Description

authorized_to
_make_change

This is who is authorized to make such a change. Valid values are listed in the authorized parties table.

admin_action_takers

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.

changing_authorized
_action_takers_to
_no_one_allowed

Are we allowed to change to NoOne in the future (default: false)

changing_admin_action
_takers_to_no_one_allowed

Are we allowed to change the admin action takers to NoOne in the future (default: false)

self_changing_admin_
action_takers_allowed

Can the admin action takers change themselves (default: false)

Example

"<rule_name>": {
  "V0": {
    "authorized_to_make_change": "ContractOwner",
    "admin_action_takers": "NoOne",
    "changing_authorized_action_takers_to_no_one_allowed": false,
    "changing_admin_action_takers_to_no_one_allowed": false,
    "self_changing_admin_action_takers_allowed": false
  }
}

Available Change Rules#

Tokens support the following change control rules:

Rule Name

Description

conventionsChangeRules

Controls who can modify token conventions (localization)

maxSupplyChangeRules

Controls who can modify the maximum supply limit

perpetualDistributionRules

Controls who can modify perpetual distribution settings (subset of distributionRules)

newTokensDestinationIdentityRules

Controls who can change where new tokens are sent (subset of distributionRules)

mintingAllowChoosingDestinationRules

Controls who can modify minting destination rules (subset of distributionRules)

changeDirectPurchasePricingRules

Controls who can set direct purchase pricing (subset of distributionRules)

tradeModeChangeRules

Controls who can modify trade mode rules (subset of marketplaceRules)

manualMintingRules

Controls who can manually mint tokens

manualBurningRules

Controls who can manually burn tokens

freezeRules

Controls who can freeze token balances

unfreezeRules

Controls who can unfreeze token balances

destroyFrozenFundsRules

Controls who can destroy frozen funds

emergencyActionRules

Controls who can execute emergency actions

Example:

"manualMintingRules": {
  "V0": {
    "authorized_to_make_change": "ContractOwner",
    "admin_action_takers": "NoOne",
    "changing_authorized_action_takers_to_no_one_allowed": false,
    "changing_admin_action_takers_to_no_one_allowed": false,
    "self_changing_admin_action_takers_allowed": false
  }
}

Token Distribution Rules#

Distribution rules govern how tokens are created, allocated, and priced within the platform. These rules provide flexible mechanisms for token distribution and marketplace integration.

Distribution Properties#

Property

Type

Description

perpetualDistribution

object

Ongoing distribution mechanism for continuous token allocation

perpetualDistributionRules

object

Change control rules for perpetual distribution

newTokensDestinationIdentity

string

Default identity to receive newly minted tokens

newTokensDestinationIdentityRules

object

Change control rules for destination identity

mintingAllowChoosingDestination

boolean

Whether minting operations can specify custom destinations

mintingAllowChoosingDestinationRules

object

Change control rules for destination choice

preProgrammedDistribution

object

Scheduled token allocations at predetermined timestamps

changeDirectPurchasePricingRules

object

Change control rules for direct purchase pricing

Perpetual Distribution#

Perpetual distribution enables ongoing token allocation. The following configuration distributes 100 tokens to the contract owner every 60 minutes (3600000 ms):

"perpetualDistribution": {
  "$format_version": "0",
  "distributionType": {
    "TimeBasedDistribution": {
      "interval": 3600000,
      "function": {
        "FixedAmount": {
          "amount": 100
        }
      }
    }
  },
  "distributionRecipient": "ContractOwner"
}

Distribution Types#

The distributionType field accepts one of three schedule types:

Type

Interval Unit

Description

BlockBasedDistribution

Block height

Emits tokens every N blocks. If start is not set, begins at the block when the data contract is registered.

TimeBasedDistribution

Milliseconds

Emits tokens every N milliseconds. If start is not set, begins at the time of the block when the data contract is registered.

EpochBasedDistribution

Epochs

Emits tokens every N epochs. If start is not set, begins at the epoch of the block when the data contract is registered. Distribution happens at the start of the following epoch. Required when using EvonodesByParticipation as the distribution recipient.

Each type wraps an interval (the period length) and a function (the emission pattern from the options below).

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

Fixed Amount

Emits a constant number of tokens per period

Random

Emits a random amount between min and max, using a PRF

Step Decreasing Amount

Emits tokens that decrease in discrete steps at fixed intervals

Linear

Linear growth/decay with integer or fractional precision

Polynomial

Polynomial with integer or fractional exponents or coefficients

Exponential

Emits tokens following an exponential function

Logarithmic

Slows emission over time

Inverted Logarithmic

Slows emission over time

Stepwise

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 and max.

    • 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 and max = 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) = distribution_start_amount * (1 - (decrease_per_interval_numerator / decrease_per_interval_denominator))^((x - start_decreasing_offset) / step_count)

  • Description: Reduces token emissions by a fixed percentage at regular intervals.

    • step_count (u32): number of periods between each step

    • decrease_per_interval_numerator (u16): reduction factor numerator

    • decrease_per_interval_denominator (u16): reduction factor denominator

    • start_decreasing_offset (optional u64): start period offset. If not provided, the contract creation start is used. Before this offset, distribution_start_amount is emitted every interval.

    • distribution_start_amount (TokenAmount): initial token emission amount

    • max_interval_count (optional u16): maximum number of decreasing intervals. Defaults to 128 if not set. After this many cycles, trailing_distribution_interval_amount is emitted per interval. Maximum value: 1024.

    • trailing_distribution_interval_amount (TokenAmount): token emission after all decreasing intervals are exhausted

    • min_value (optional u64): minimum emission floor

  • 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 (start_step): optional start period offset (defaults to contract creation)

      • b (starting_amount): starting emission amount

      • min_value / max_value: optional emission bounds

    • Behavior

      • If a > 0, emissions increase linearly over time

      • If a < 0, emissions decrease linearly over time

      • If a = 0, emissions remain constant at b

  • 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 and n: exponent numerator and denominator, allowing fractional powers (e.g., m = 1, n = 2 → square root)

    • d: divisor to scale the result

    • s (start_moment): optional start period offset

    • o: offset inside the exponent input

    • b: amount added after the curve is computed

    • min_value / max_value: optional boundaries to clamp emissions

  • Use Case:

    • Accelerating Growth: Use a > 0 and m > 1 for quadratic/cubic growth

    • Diminishing Emissions: Use a < 0 and fractional exponents for decaying curves

    • Root-based Models: Use m = 1, n > 1 to slow down early growth

    • Flexibility: 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^(m * (x - s + o) / n)) / d + b

  • Description: Exponential growth or decay depending on parameter signs

  • Use Case: Early contributor boosts or quick emission tapering

Logarithmic#

Logarithmic growth of token emissions.

  • Formula: f(x) = (a * ln(m * (x - s + o) / n)) / d + b

  • Description: Growth slows as x increases (uses natural log)

  • Use Case: Sustainable long-term emission tapering

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 term

    • d: divisor to scale the final result

    • m and n: Control the logarithmic inversion

    • o: offset applied inside the logarithm

    • s (start_moment): optional start period offset (defaults to contract creation time if not provided)

    • b: offset added after scaling

    • min_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

Pre-Programmed Distribution#

Pre-programmed distribution allows scheduling specific token allocations at predetermined times. The following configuration distributes 3 sets of tokens to the same identity at the defined timestamps:

"preProgrammedDistribution": {
  "$format_version": "0",
  "distributions": {
    "1749662152621": {
      "2yZbE3TAZAhLwNVQk7JMUUuBXgrVt1NG172PGjeUfjUo": 100
    },
    "1749665692621": {
      "2yZbE3TAZAhLwNVQk7JMUUuBXgrVt1NG172PGjeUfjUo": 1000
    },
    "1781198092621": {
      "2yZbE3TAZAhLwNVQk7JMUUuBXgrVt1NG172PGjeUfjUo": 1000000
    }
  }
}

Direct Purchase Pricing#

Direct purchase pricing enables tokens to be purchased directly using Platform:

"changeDirectPurchasePricingRules": {
  "V0": {
    "authorized_to_make_change": "ContractOwner",
    "admin_action_takers": "NoOne",
    "changing_authorized_action_takers_to_no_one_allowed": false,
    "changing_admin_action_takers_to_no_one_allowed": false,
    "self_changing_admin_action_takers_allowed": false
  }
}

Token History Tracking#

Token history tracking controls which operations are recorded in Platform’s historical records. This provides audit trails and transparency for token operations.

History Properties#

Property

Type

Default

Description

keepsTransferHistory

boolean

true

Record all token transfers

keepsFreezingHistory

boolean

true

Record freeze/unfreeze operations

keepsMintingHistory

boolean

true

Record token minting events

keepsBurningHistory

boolean

true

Record token burning events

keepsDirectPricingHistory

boolean

true

Record direct purchase price changes

keepsDirectPurchaseHistory

boolean

true

Record direct purchase transactions

Example:

"keepsHistory": {
  "$format_version": "0",
  "keepsTransferHistory": true,
  "keepsFreezingHistory": true,
  "keepsMintingHistory": true,
  "keepsBurningHistory": true,
  "keepsDirectPricingHistory": true,
  "keepsDirectPurchaseHistory": false
}

Token Marketplace Rules#

Marketplace rules define how tokens can be traded within Platform’s built-in marketplace system.

Trade Modes#

Mode

Description

NotTradeable

Token cannot be traded on the marketplace

Example:

"marketplaceRules": {
  "$format_version": "0",
  "tradeMode": "NotTradeable",
  "tradeModeChangeRules": {
    "V0": {
      "authorized_to_make_change": "NoOne",
      "admin_action_takers": "NoOne",
      "changing_authorized_action_takers_to_no_one_allowed": false,
      "changing_admin_action_takers_to_no_one_allowed": false,
      "self_changing_admin_action_takers_allowed": false
    }
  }
}

Token Distribution Function Parameters#

The distribution functions use the following parameters defined across various implementations:

Parameter

Type

Default

Description

a

integer

-

Coefficient/scaling factor

b

integer

-

Base offset or constant term

c

integer

-

Additional offset

d

integer

1

Divisor for precision control

m

integer

-

Exponent numerator

n

integer

1

Exponent denominator

o

integer

0

Offset inside function input

s

integer

0

Start period offset

min_value

integer

-

Minimum emission bound

max_value

integer

-

Maximum emission bound

step_count

integer

-

Periods between steps

numerator

integer

-

Reduction factor numerator

denominator

integer

-

Reduction factor denominator

interval

integer

-

Time interval in milliseconds

Note

Parameter sign types vary by function: a is unsigned (u64) for Exponential but signed (i64) for all other functions. m is unsigned (u64) for Logarithmic and InvertedLogarithmic but signed (i64) for Polynomial and Exponential.

Distribution Recipients#

Recipient

Description

ContractOwner

Tokens sent to the contract owner

Identity(Identifier)

Tokens sent to a specific identity

EvonodesByParticipation

Tokens distributed to evonodes proportional to their participation (only valid with EpochBasedDistribution)

See also

For all protocol constants, see Protocol Constants.

Token Constraints#

For performance and security reasons, tokens have the following constraints:

General Constraints#

Parameter

Value

Maximum number of keywords

50

Keyword length

3 to 50 characters

Description length

3 to 100 characters

Maximum note length

2048 bytes

Maximum number of tokens per contract

Only limited by maximum contract size

Convention Constraints#

Parameter

Value

Language code length

2 to 12 characters

Token name length (singular)

3 to 25 characters

Token name length (plural)

3 to 25 characters

Decimal places

0 to 16

Maximum localization entries

Only limited by maximum contract size

Supply Constraints#

Parameter

Value

Maximum token amount

i64::MAX (2^63 - 1 = 9,223,372,036,854,775,807)

Example Syntax#

This example shows the complete structure of a token definition with all major configuration options:

{
  "tokens": {
    "0": {
      "$format_version": "0",
      "conventions": {
        "$format_version": "0",
        "localizations": {
          "en": {
            "$format_version": "0",
            "shouldCapitalize": true,
            "singularForm": "reward-token",
            "pluralForm": "reward-tokens"
          }
        },
        "decimals": 8
      },
      "conventionsChangeRules": {
        "V0": {
          "authorized_to_make_change": "NoOne",
          "admin_action_takers": "NoOne",
          "changing_authorized_action_takers_to_no_one_allowed": false,
          "changing_admin_action_takers_to_no_one_allowed": false,
          "self_changing_admin_action_takers_allowed": false
        }
      },
      "baseSupply": 1000000,
      "maxSupply": 10000000,
      "keepsHistory": {
        "$format_version": "0",
        "keepsTransferHistory": true,
        "keepsFreezingHistory": true,
        "keepsMintingHistory": true,
        "keepsBurningHistory": true,
        "keepsDirectPricingHistory": true,
        "keepsDirectPurchaseHistory": true
      },
      "startAsPaused": false,
      "allowTransferToFrozenBalance": true,
      "maxSupplyChangeRules": {
        "V0": {
          "authorized_to_make_change": "ContractOwner",
          "admin_action_takers": "NoOne",
          "changing_authorized_action_takers_to_no_one_allowed": false,
          "changing_admin_action_takers_to_no_one_allowed": false,
          "self_changing_admin_action_takers_allowed": false
        }
      },
      "distributionRules": {
        "$format_version": "0",
        "perpetualDistribution": null,
        "perpetualDistributionRules": {
          "V0": {
            "authorized_to_make_change": "NoOne",
            "admin_action_takers": "NoOne",
            "changing_authorized_action_takers_to_no_one_allowed": false,
            "changing_admin_action_takers_to_no_one_allowed": false,
            "self_changing_admin_action_takers_allowed": false
          }
        },
        "preProgrammedDistribution": null,
        "newTokensDestinationIdentity": null,
        "newTokensDestinationIdentityRules": {
          "V0": {
            "authorized_to_make_change": "ContractOwner",
            "admin_action_takers": "NoOne",
            "changing_authorized_action_takers_to_no_one_allowed": false,
            "changing_admin_action_takers_to_no_one_allowed": false,
            "self_changing_admin_action_takers_allowed": false
          }
        },
        "mintingAllowChoosingDestination": true,
        "mintingAllowChoosingDestinationRules": {
          "V0": {
            "authorized_to_make_change": "ContractOwner",
            "admin_action_takers": "NoOne",
            "changing_authorized_action_takers_to_no_one_allowed": false,
            "changing_admin_action_takers_to_no_one_allowed": false,
            "self_changing_admin_action_takers_allowed": false
          }
        },
        "changeDirectPurchasePricingRules": {
          "V0": {
            "authorized_to_make_change": "ContractOwner",
            "admin_action_takers": "NoOne",
            "changing_authorized_action_takers_to_no_one_allowed": false,
            "changing_admin_action_takers_to_no_one_allowed": false,
            "self_changing_admin_action_takers_allowed": false
          }
        }
      },
      "marketplaceRules": {
        "$format_version": "0",
        "tradeMode": "NotTradeable",
        "tradeModeChangeRules": {
          "V0": {
            "authorized_to_make_change": "NoOne",
            "admin_action_takers": "NoOne",
            "changing_authorized_action_takers_to_no_one_allowed": false,
            "changing_admin_action_takers_to_no_one_allowed": false,
            "self_changing_admin_action_takers_allowed": false
          }
        }
      },
      "manualMintingRules": {
        "V0": {
          "authorized_to_make_change": "ContractOwner",
          "admin_action_takers": "NoOne",
          "changing_authorized_action_takers_to_no_one_allowed": false,
          "changing_admin_action_takers_to_no_one_allowed": false,
          "self_changing_admin_action_takers_allowed": false
        }
      },
      "manualBurningRules": {
        "V0": {
          "authorized_to_make_change": "ContractOwner",
          "admin_action_takers": "NoOne",
          "changing_authorized_action_takers_to_no_one_allowed": false,
          "changing_admin_action_takers_to_no_one_allowed": false,
          "self_changing_admin_action_takers_allowed": false
        }
      },
      "freezeRules": {
        "V0": {
          "authorized_to_make_change": "NoOne",
          "admin_action_takers": "NoOne",
          "changing_authorized_action_takers_to_no_one_allowed": false,
          "changing_admin_action_takers_to_no_one_allowed": false,
          "self_changing_admin_action_takers_allowed": false
        }
      },
      "unfreezeRules": {
        "V0": {
          "authorized_to_make_change": "NoOne",
          "admin_action_takers": "NoOne",
          "changing_authorized_action_takers_to_no_one_allowed": false,
          "changing_admin_action_takers_to_no_one_allowed": false,
          "self_changing_admin_action_takers_allowed": false
        }
      },
      "destroyFrozenFundsRules": {
        "V0": {
          "authorized_to_make_change": "NoOne",
          "admin_action_takers": "NoOne",
          "changing_authorized_action_takers_to_no_one_allowed": false,
          "changing_admin_action_takers_to_no_one_allowed": false,
          "self_changing_admin_action_takers_allowed": false
        }
      },
      "emergencyActionRules": {
        "V0": {
          "authorized_to_make_change": "NoOne",
          "admin_action_takers": "NoOne",
          "changing_authorized_action_takers_to_no_one_allowed": false,
          "changing_admin_action_takers_to_no_one_allowed": false,
          "self_changing_admin_action_takers_allowed": false
        }
      },
      "mainControlGroup": null,
      "mainControlGroupCanBeModified": "NoOne",
      "description": "Reward token for customer loyalty program"
    }
  }
}