Pricing Modules

At present there are two contracts deployed as ZNS pricers, managing all domains:

  • Curved Pricing: Calculates the price of a domain based on the character length of that domain's label

  • Fixed Pricing: Provides a fixed price for every subdomain regardless of its character length

The minimum requirements for a compatible price contract are located in IZNSPricer.sol if users are inclined to create them themselves. Users wishing to create their own pricing module must only inherit from this contract, otherwise it will be incompatible with the system.


Both available pricers require some form of configuration to be set.

Fixed Pricer

The fixed price contract is simple in that it only requires two configuration values:

  • Price: The given price of a domain relative to the amount of precision specified by the paymentToken.

    • e.g. If the price is set to 1000 tokens, the resolved number of tokens to transfer in payment will be different for a specified payment token that has 10^18 decimals of precision, versus one that was 10^5 decimals.

  • Stake fee percentage: The registration fee for STAKE type payments represented in percentage as basis points (parts per 10,000), e.g., 2% would be represented as 200. This value can be zero (0) and is not required to be set. As an example, the stake fee percentage can be added when using FixedPricing along with StakePayment, so that a parent domain's owner or beneficiary can receive a payment -- as they will will not receive any of the stake held in the StakePayment contract. If STAKE payment type is not used, this fee will not be charged, even if set.

Curve Pricer

The curved pricing contract is slightly more complex:

  • maxPrice: The maximum price for a domain with a character length <= baseLength.

  • minPrice: The minimum price for a domain with a character length > maxLength.

  • maxLength: The maximum length of a domain name. If the name is longer than this value, minPrice is returned.

  • baseLength: The base character length of a domain name. If the name is less than or equal to this value, maxPrice is returned.

  • precisionMultiplier: The precision multiplier of the price. This multiplier should be picked based on the number of token decimals to calculate properly. This is an optional parameter in ZNSCurvePricer that can be set by a domain's owner or operator to truncate unwanted decimals off the subdomain price. If a domain's owner does not require precision, the precisionMultiplier should be set to 1, which will avoid truncation altogether. If truncation is needed, precisionMultiplier should be calculated as: 10 ^ (tokenDecimals - requiredPrecision) e.g. if the token has 8 decimals and only 2 are desired, the precisionMultiplier would be 10 ^ (8 - 2) = 10 ^ 6. This would result in 1.23456789 TOKEN to being returned as 1.23 TOKEN.

  • feePercentage: The registration fee value percentage as basis points (parts per 10,000) e.g., a 2% value would be represented as 200.

Please note the following:

  • precisionMultiplier is NOT a direct value of desired precision, but rather a result of subtracting the precision value from the value of the chosen token's decimals of the as a power of 10!

  • If truncation is not needed, precisionMultiplier should be set to 1. It will be set to 1 as a default value for all newly minted domains, UNLESS the domain registrant explicitly sets it.

  • The precisionMultiplier cannot be set to 0, lest it would produce a price of 0, disregarding the rest of the config!

  • The precisionMultiplier cannot be set to a value greater than 10 ^ 18!

  • The precisionMultiplier can -- but should NOT -- be set to a value greater than 10 ^ decimals (of the token used for payments and pricing). Doing this would result in an incorrect price calculation followed by the incorrect payment.

  • The correct return from getPrice() is dependent on a domain's owner or operator to set the precisionMultiplier correctly -- or leave it at the default value of 1.

By way of example, consider when baseLength == 3 and maxLength == 30.Domains with the character length 1, 2, or 3 will return the maxPrice. Domains with a character length of 31 or beyond will return the minPrice . Domains with lengths of 4 to 30 will be priced according to the curved pricing formula below:

Mathematically speaking, division and subsequent multiplication of the same number will cancel out, however, this method takes advantage of the way Solidity stores numbers; x * (y / m) is not always the same as (y / m) * x in Solidity.

Because occurs first in this equation, there is a forced truncation of the actual number, followed by multiplication to bring it back to its original values -- only with zeros beyond the specified digits of precision.

Last updated