I set as many of the duration fields to either 1 month or 10 months, and I got consistent results: all of them consider 1 month to be 2_630_016 s.
Update: See the end of this post for the exact sns_init.yaml that I used.
The only fields that I struggled to set to 1 or 10 months were under the Proposals section (namely, initial_voting_period, and maximum_wait_for_quiet_deadline_extension). The largest allowed value in those fields is 30 days.
David, if you could provide more precise instructions for how I can reproduce the discrepancies you are seeing, that would help me to help you.
# You should make a copy of this file, name it sns_init.yaml, and edit it to
# suit your needs.
#
# All principal IDs should almost certainly be changed.
#
# In this file, 1 year is nominally defined to be 365.25 days.
#
# This gets passed to `sns propose`. See propose_sns.sh.
#
# This follows the second configuration file format developed for the `sns`
# CLI. The first format will be supported for a time, but this format will
# eventually become the standard format.
# ------------------------------------------------------------------------------
# UNITS
#
# This SNS configuration file version allows specifying the various
# fields with units that make configuration easier. For instance,
# in the previous version, all fields relating to token values
# had to be specified in e8s (fractions of 10E-8 of a governance token).
# In this version, similar fields can be specified in whole tokens,
# tokens with decimals, or e8s. Below is more information on the type
# of units that can be used.
#
# For fields that represent token values (such as `transaction_fee`
# or `rejection_fee`), devs can specify decimal strings ending in
# "tokens" (plural), decimal strings ending in "token" (singular),
# or integer strings (base 10) ending in "e8s". In the case of
# "tokens" strings, the maximum number of digits after the (optional)
# decimal point is 8. The "_" character may be sprinkled throughout.
# Whitespace around number is insignificant. E.g. " 42 tokens" is
# equivalent to "42tokens".
#
# For fields that represent duration values (such as `initial_voting_period`
# or `minimum_dissolve_delay`), devs can specify durations as a concatenation
# of time spans. Where each time span is an integer number and a suffix.
# Supported suffixes:
# - seconds, second, sec, s
# - minutes, minute, min, m
# - hours, hour, hr, h
# - days, day, d
# - weeks, week, w
# - months, month, M -- defined as 30.44 days
# - years, year, y -- defined as 365.25 days
#
# For example, "1w 2d 3h" gets parsed as
#
# 1 week + 2 days + 3 hours
# =
# (1 * (7 * 24 * 60 * 60) + 2 * 24 * 60 * 60 + 3 * (60 * 60)) seconds
#
# For fields that represent percentage values (such as `bonus`), devs specify
# the value as an integer with a trailing percent sign ('%'). For example,
# `10%`.
#
# For fields that represent time of day (such as `start_time`), devs specify
# the value as a string in form "hh::mm UTC". Where hh is hour, and mm is minute.
# Only the UTC timezone is currently supported.
# ------------------------------------------------------------------------------
# Name of the SNS project. This may differ from the name of the associated
# token. Must be a string of max length = 255.
name: IC Footprint
# Description of the SNS project.
# Must be a string of max length = 2,000.
description: >
A native energy management and sustainability protocol on the Internet Computer
# This is currently a placeholder field and must be left empty for now.
Principals: []
# Path to the SNS Project logo on the local filesystem. The path is relative
# to the configuration file's location, unless an absolute path is given.
# Must have less than 341,334 bytes. The only supported format is PNG.
logo: logo.png
# URL to the dapp controlled by the SNS project.
# Must be a string from 10 to 512 bytes.
url: https://owqnd-biaaa-aaaak-qidaq-cai.icp0.io/
# Metadata for the NNS proposal required to create the SNS. This data will be
# shown only in the NNS proposal.
NnsProposal:
# The title of the NNS proposal. Must be a string of 4 to 256 bytes.
title: "NNS Proposal to create an SNS named 'IC Footprint'"
# The HTTPS address of additional content required to evaluate the NNS
# proposal.
url: "https://forum.dfinity.org/t/PLACEHOLDER"
# The description of the proposal. Must be a string of 10 to 2,000 bytes.
summary: >
## I. Token Distribution
- Total Token Supply - 100,000,000
- Allocated to Treasury - 57,000,000
- Allocated to Decentralisation Sale - 25,000,000
- Allocated to Developer Neurons - 18,000,000
- Founding Team - 15,500,000
- Advisors - 2,500,000
- Ledger Transaction Fee - 0.001 FOOTPRINT
## II. Decentralisation Sale
- Min Participation - 1 ICP
- Max Participation - 50,000 ICP
- Min Participants - 50
- Min to be Raised (not including NF) - 50,000 ICP
- Max to be Raised (not including NF) - 250,000 ICP
- Min Request from NF - 49,955 ICP
- Max Request from NF - 94,937 ICP
- Duration - 14 days
## III. IC Footprint SNS
- Proposal Rejection Fee - 1000 FOOTPRINT
- Initial Voting Period - 4 days
- Wait for Quiet - 1 day
- Minimum Neuron - 5 FOOTPRINT
- Minimum Dissolve Delay - 1 month
- Maximum Dissolve Delay - 2 years
- Maximum Dissolve Delay Bonus - 100%
- Maximum Age for Age Bonus - 6 months
- Maximum Age Bonus - 0%
- Reward Rate - 2.5%
## IV. The DApp
- Frontend : owqnd-biaaa-aaaak-qidaq-cai
- ESG Wallet : o7tg7-xaaaa-aaaak-qidba-cai
- Node Management : jhfj2-iqaaa-aaaak-qddxq-cai
- Cycles Assessment : z52ja-sqaaa-aaaak-aktda-cai
Following a successful SNS, a snapshot of all IC Footprint NFT holder will be taken and a proposal will be made to send 5,000,000 FOOTPRINT (5% of the total supply) tokens to ICP swap where user will be able to claim their allocation.
# If the SNS launch attempt fails, control over the dapp canister(s) is given to
# these principals. In most use cases, this is chosen to be the original set of
# controller(s) of the dapp. Must be a list of PrincipalIds.
fallback_controller_principals:
# For the actual SNS launch, you should replace this with one or more
# principals of your intended fallback controllers.
- wbays-nc4c6-qjbqz-7tw3q-xqiju-zbqdn-dp63o-jb2dx-47ghu-phymf-iae
# The list of dapp canister(s) that will be decentralized if the
# decentralization swap succeeds. These are defined in the form of canister IDs,
# for example, `bnz7o-iuaaa-aaaaa-qaaaa-cai`. For a successful SNS launch,
# these dapp canister(s) must be co-controlled by the NNS Root canister
# (`r7inp-6aaaa-aaaaa-aaabq-cai`) at latest at the time when the NNS proposal to
# create an SNS is adopted (usually this is required even earlier, e.g., to
# convince NNS neurons to vote in favor of your proposal).
dapp_canisters:
# For the actual SNS launch, you should replace this with one or more
# IDs of the canisters comprising your to-be-decentralized dapp.
#
# For testing, propose_sns.sh will fill this in automatically.
- bkyz2-fmaaa-aaaaa-qaaaq-cai
# Configuration of SNS tokens in the SNS Ledger canister deployed as part
# of the SNS.
Token:
# The name of the token issued by the SNS ledger.
# Must be a string of 4 to 255 bytes without leading or trailing spaces.
name: Footprint Token
# The symbol of the token issued by the SNS Ledger.
# Must be a string of 3 to 10 bytes without leading or trailing spaces.
symbol: FOOTPRINT
# SNS ledger transaction fee.
transaction_fee: 10_000 e8s
# Path to the SNS token logo on your local filesystem. The path is relative
# to the configuration file location, unless an absolute path is given.
# Must have less than 341,334 bytes. The only supported format is PNG.
logo: logo.png
# Configures SNS proposal-related fields. These fields define the initial values
# for some of the nervous system parameters related to SNS proposals. This will
# not affect all SNS proposals submitted to the newly created SNS.
Proposals:
# The cost of making an SNS proposal that is rejected by the SNS neuron
# holders. This field is specified as a token. For example: "1 token".
rejection_fee: 1000 tokens
# The initial voting period of an SNS proposal. A proposal's voting period
# may be increased during its lifecycle due to the wait-for-quiet algorithm
# (see details below). This field is specified as a duration. For example
# "4 days".
initial_voting_period: 1 day
# The wait-for-quiet algorithm extends the voting period of a proposal when
# there is a flip in the majority vote during the proposal's voting period.
#
# Without this, there could be an incentive to vote right at the end of a
# proposal's voting period, in order to reduce the chance that people will
# see and have time to react to that.
#
# If this value is set to 1 day, then a change in the majority vote at the
# end of a proposal's original voting period results in an extension of the
# voting period by an additional day. Another change at the end of the
# extended period will cause the voting period to be extended by another
# half-day, etc.
#
# The total extension to the voting period will never be more than twice
# this value.
#
# For more information, please refer to
# https://wiki.internetcomputer.org/wiki/Network_Nervous_System#Proposal_decision_and_wait-for-quiet
#
# This field is specified as a duration. For example: "1 day".
maximum_wait_for_quiet_deadline_extension: 1 hr
# Configuration of SNS voting.
Neurons:
# The minimum amount of SNS tokens to stake a neuron. This field is specified
# as a token. For instance, "1 token".
minimum_creation_stake: 5 tokens
# Configuration of SNS voting.
Voting:
# The minimum dissolve delay a neuron must have to be able to cast votes on
# proposals.
#
# Dissolve delay incentivizes neurons to vote in the long-term interest of
# an SNS, as they are rewarded for longer-term commitment to that SNS.
#
# Users cannot access the SNS tokens used to stake neurons (until the neuron
# is dissolved). This field is specified as a duration. For example: "6 months".
minimum_dissolve_delay: 1 month
# Configuration of voting power bonuses that are applied to neurons to
# incentivize alignment with the best interest of the DAO. Note, these
# bonuses multiply each other, so the increase in voting power due to
# the dissolve delay bonus is used in the equation to increase voting
# power for the age bonus.
MaximumVotingPowerBonuses:
# Users with a higher dissolve delay are incentivized to take the
# long-term interests of the SNS into consideration when voting. To
# reward this long-term commitment, this bonus can be set to a
# percentage greater than zero, which will result in neurons having
# their voting power increased in proportion to their dissolve delay.
#
# For example, if the user has a dissolve delay of 6 months, and
# the maximum dissolve delay duration (defined below as `duration`)
# for the dissolve delay bonus is 12 months, and the maximum bonus
# (defined as `bonus` below) is set to 10%, then that user’s voting
# power will be 105% of their normal voting power based on staked
# tokens (i.e. they will have a bonus of 5%). If the user increased
# their dissolve delay to 9 months, they would get 107.5% of the normal
# voting power of their tokens. And if they increased to 12 months, they
# would get 110%. If they increase further, they get no additional bonus.
#
# If you do not want this bonus to be applied for neurons with higher
# dissolve delay, set `bonus` to `0%` and those neurons will not receive
# higher voting power.
DissolveDelay:
# This parameter sets the maximum dissolve delay a neuron can have.
# When reached, the maximum dissolve delay bonus will be applied.
# This field is specified as a duration. For example: "8 years".
duration: 10 months
# If a neuron's dissolve delay is `duration`, its voting power will
# be increased by the dissolve delay `bonus` amount.
# This field is specified as a percentage. For instance,
# a value of "100%" means that the voting power will be doubled
# (multiplied by 2).
bonus: 100%
# Users with neurons staked in the non-dissolving state for a long
# period of time are incentivized to take the long-term interests of
# the SNS into consideration when voting. To reward this long-term
# commitment, this bonus can be set to a percentage (greater than zero),
# which will result in neurons having their voting power increased in
# proportion to their age.
#
# For example, if the neuron has an age of 6 months, and the maximum age
# duration (defined below as `duration`) for the age bonus is 12 months,
# and the maximum bonus (defined as `bonus` below) is set to 10%, then
# that neuron’s voting power will be 105% of their normal voting power
# based on staked tokens plus dissolve delay bonus (i.e. they will have a
# bonus of 5%). If neuron aged another 3 months to have an age of 9 months,
# the neuron would get 107.5% of the normal voting power. And if the neuron
# aged another 3 months to 12 months, the neuron would get 110%. If the neuron
# ages further, it get no additional bonus.
#
# If this bonus should not be applied for older neurons, set the bonus
# to `0%` and older neurons will not receive higher voting power.
Age:
# This parameter sets the duration of time the neuron must be staked
# in the non-dissolving state, in other words its `age`, to reach
# the maximum age bonus. Once this age is reached, the neuron will
# continue to age, but no more bonus will be applied. This field
# is specified as a duration. For example: "2 years".
duration: 10 months
# If a neuron's age is `duration` or older, its voting power will be
# increased by this age`bonus` amount.
# This field is specified as a percentage. For instance,
# a value of "25%" means that the voting power will increase by a quarter
# (multiplied by 1.25).
bonus: 25%
# Configuration of SNS voting reward parameters.
#
# The voting reward rate controls how quickly the supply of the SNS token
# increases. For example, setting `initial` to `2%` will cause the supply to
# increase by at most `2%` per year. A higher voting reward rate
# incentivizes users to participate in governance, but also results in
# higher inflation.
#
# The initial and final reward rates can be set to have a higher reward rate
# at the launch of the SNS and a lower rate further into the SNS’s lifetime.
# The reward rate falls quadratically from the `initial` rate to the `final`
# rate over the course of `transition_duration`.
#
# Setting both `initial` and `final` to `0%` will result in the system not
# distributing voting rewards at all.
#
# More details on SNS tokenomics can be found in the developer documentation:
# https://internetcomputer.org/docs/current/developer-docs/integrations/sns/tokenomics/rewards/#voting-rewards
RewardRate:
# The initial reward rate at which the SNS voting rewards will increase
# per year. This field is specified as a percentage. For example: "15%".
initial: 3%
# The final reward rate at which the SNS voting rewards will increase
# per year. This rate is reached after `transition_duration` and remains
# at this level unless changed by an SNS proposal. This field is
# specified as a percentage. For example: "5%".
final: 2.5%
# The voting reward rate falls quadratically from `initial` to `final`
# over the time period defined by `transition_duration`.
#
# Values of 0 result in the reward rate always being `final`.
#
# This field is specified as a duration. For example: "8 years".
transition_duration: 1 month
# Configuration of the initial token distribution of the SNS. You can configure
# how SNS tokens are distributed in each of the three groups:
# (1) tokens that are given to the original developers of the dapp,
# (2) treasury tokens that are owned by the SNS governance canister, and
# (3) tokens which are distributed to the decentralization swap participants.
#
# The initial token distribution must satisfy the following preconditions to be
# valid:
# - The sum of all developer tokens in E8s must be less than `u64::MAX`.
# - The Swap's initial balance (see group (3) above) must be greater than 0.
# - The Swap's initial balance (see group (3) above) must be greater than or
# equal to the sum of all developer tokens.
Distribution:
# The initial neurons created when the SNS Governance canister is installed.
# Each element in this list specifies one such neuron, including its stake,
# controlling principal, memo identifying this neuron (every neuron that
# a user has must be identified by a unique memo), dissolve delay, and a
# vesting period. Even though these neurons are distributed at genesis,
# they are locked in a (restricted) pre-initialization mode until the
# decentralization swap is completed. Note that `vesting_period` starts
# right after the SNS creation and thus includes the pre-initialization mode
# period.
#
Neurons:
# For the actual SNS launch, you should replace this with one or more
# principals of your intended genesis neurons.
#
- principal: 5tzzh-kqopl-zychr-jjyoi-cpvu5-y2ai7-ggf3n-icajy-bszp6-2qenk-lae
stake: 3_000_000 tokens
memo: 0
dissolve_delay: 1 month
vesting_period: 1 month
# The initial SNS token balances of the various canisters of the SNS.
InitialBalances:
# The initial SNS token balance of the SNS Governance canister is known
# as the treasury. This is initialized in a special sub-account, as the
# main account of Governance is the minting account of the SNS Ledger.
# This field is specified as a token. For instance, "1 token".
governance: 57_000_000 tokens
# The initial SNS token balance of the Swap canister is what will be
# available for the decentralization swap. These tokens will be swapped
# for ICP. This field is specified as a token. For instance, "1 token".
swap: 25_000_000 tokens
# Checksum of the total number of tokens distributed in this section.
# This field is specified as a token. For instance, "1 token".
# 1_000 (neuron) developers
# 2 million (governance) treasury
# + 500 thousand (swap)
# --------------
total: 85_000_000 tokens
# Configuration of the decentralization swap parameters. Choose these parameters
# carefully, if a decentralization swap fails, the SNS will restore the dapp
# canister(s) to the fallback controllers (defined in
# `fallback_controller_principals`) and you will need to start over.
Swap:
# The minimum number of direct participants that must participate for the
# decentralization swap to succeed. If a decentralization swap finishes due
# to the deadline or the maximum target being reached, and if there are less
# than `minimum_participants` (here, only direct participants are counted),
# the swap will be committed.
minimum_participants: 50
# Minimum amount of ICP from direct participants. This amount is required for
# the swap to succeed. If this amount is not achieved, the swap will be
# aborted (instead of committed) when the due date/time occurs.
# Must be smaller than or equal than `maximum_direct_participation_icp`.
minimum_direct_participation_icp: 50000 tokens
# Maximum amount of ICP from direct participants. If this amount is achieved,
# the swap will finalize immediately, without waiting for the due date/time;
# in this case, the swap would be committed if and only if the number of
# direct participants (`minimum_participants`) is reached (otherwise, it
# would be aborted).
# Must be at least `min_participants * minimum_direct_participation_icp`.
maximum_direct_participation_icp: 250000 tokens
# The minimum amount of ICP that each participant must contribute
# to participate. This field is specified as a token. For instance,
# "1 token".
minimum_participant_icp: 1 tokens
# The maximum amount of ICP that each participant may contribute
# to participate. This field is specified as a token. For instance,
# "1 token".
maximum_participant_icp: 50000 tokens
# The text that swap participants must confirm before they may participate
# in the swap.
#
# This field is optional. If set, must be within 1 to 1,000 characters and
# at most 8,000 bytes.
# confirmation_text: >
# I confirm my understanding of the responsibilities and risks
# associated with participating in this token swap.
# A list of countries from which swap participation should not be allowed.
#
# This field is optional. By default, participants from all countries
# are allowed.
#
# Each list element must be an ISO 3166-1 alpha-2 country code.
restricted_countries:
- AF # Afghanistan
- BY # Belarus
- BA # Bosnia and Herzegovina
- BI # Burundi
- CF # Central African Republic
- KP # North Korea
- CD # Democratic Republic of the Congo
- IR # Iran
- IQ # Iraq
- LB # Lebanon
- LY # Libya
- ML # Mali
- ME # Montenegro
- MM # Myanmar
- NI # Nicaragua
- RU # Russia
- RS # Serbia
- SO # Somalia
- SD # Sudan
- SY # Syria
- UA # Ukraine
- VE # Venezuela
- YE # Yemen
- ZW # Zimbabwe
- US # United States
- UM # United States Minor Outlying Islands
- CU # Cuba
# Configuration of the vesting schedule of the neuron basket, i.e., the SNS
# neurons that a participants will receive from a successful
# decentralization swap.
VestingSchedule:
# The number of events in the vesting schedule. This translates to how
# many neurons will be in each participant's neuron basket. Note that
# the first neuron in each neuron basket will have zero dissolve delay.
# This value should thus be greater than or equal to `2`.
events: 4
# The interval at which the schedule will be increased per event. The
# first neuron in the basket will be unlocked with zero dissolve delay.
# Each other neuron in the schedule will have its dissolve delay
# increased by `interval` compared to the previous one. For example,
# if `events` is set to `3` and `interval` is `1 month`, then each
# participant's neuron basket will have three neurons (with equal stake)
# with dissolve delays zero, 1 month, and 2 months. Note that the notion
# of `Distribution.neurons.vesting_period` applies only to developer
# neurons. While neuron basket neurons do not use `vesting_period`, they
# have a vesting schedule. This field is specified as a duration. For
# example: "1 month".
interval: 1 months
# Absolute time of day when the decentralization swap is supposed to start.
#
# An algorithm will be applied to allow at least 24 hours between the time
# of execution of the CreateServiceNervousSystem proposal and swap start.
# For example, if start_time is 23:30 UTC and the proposal is adopted and
# executed at 23:20 UTC, then the swap start will be at 23:30 UTC the next
# day (i.e., in 24 hours and 10 min from the proposal execution time).
#
# WARNING: Swap start_time works differently on mainnet and in testing.
#
# On mainnet:
# - Setting start_time to some value (e.g., 23:30 UTC) will allow the swap
# participants to be prepared for the swap in advance, e.g.,
# by obtaining ICPs that they would like to participate with.
# - If start_time is not specified, the actual start time of the swap will
# be chosen at random (allowing at least 24 hours and less than 48 hours,
# as described above).
#
# In testing:
# - Setting start_time to some value works the same as explained above.
# - If start_time is not specified, the swap will begin immediately after
# the CreateServiceNervousSystem proposal is executed. This facilitates
# testing in an accelerated manner.
#
# start_time: 23:30 UTC # Intentionally commented out for testing.
# The duration of the decentralization swap. When `start_time` is calculated
# during CreateServiceNervousSystem proposal execution, this `duration` will
# be added to that absolute time and set as the swap's deadline.
duration: 1 month
# Whether Neurons' Fund participation is requested.
neurons_fund_participation: true