Mainnet locks
Overview
High-level description of Token lock-ups and restrictions can be found here. This document defines technical detail on how it was implemented in chain.
Detailed Mainnet locks spec
Tokens in certain accounts will be restricted (locked) and that restriction will unwind over a period of time according to a schedule defined for each type of lock. All locks types and schedules will be hard coded and can only be applied at Mainnet launch. There will be 4 types of locks:
Type 1
Locked tokens cannot be transferred, voted or proxied until unlocked per schedule.
Voting/proxying minimum override. When restricted account is voting the unlock schedule is computed and if unlocked tokens are less than 30% of initial grants, the user can still vote 30% of tokens in initial grant or account balance whichever is lower.
Restricted calls:
/transfer_tokens_pub_key
/vote_producer
/proxy_vote
Locked tokens can be used to pay for FIO Protocol fees
Schedule
Day 0: 0.00%
Day 90: 6.00%
Day 270: 18.80%
Day 450: 18.80%
Day 630: 18.80%
Day 810: 18.80%
Day 990: 18.80%
Application: Founders (Dapix investors, employees, advisors)
Type 2
Locked tokens cannot be transferred until:
Unlocked per schedule
Designated by Foundation as having launched FIO Protocol integration
Restricted calls:
/transfer_tokens_pub_key
100% of locked tokens can be voted and proxied and used to pay for FIO Protocol fees until the following condition is met:
210 days have passed since Mainnet launch and account has not been designated by Foundation as having launched FIO Protocol integration.
Schedule
Day 0: 0.00%
Day 90: 6.00%
Day 270: 18.80%
Day 450: 18.80%
Day 630: 18.80%
Day 810: 18.80%
Day 990: 18.80%
Application: FIO Member incentives
Type 3
Locked tokens cannot be transferred until unlocked per schedule.
100% of locked tokens can be voted and proxied at all times
Restricted calls:
/transfer_tokens_pub_key
Locked tokens can be used to pay for FIO Protocol fees
Schedule
Day 0: 0.00%
Day 90: 6.00%
Day 270: 18.80%
Day 450: 18.80%
Day 630: 18.80%
Day 810: 18.80%
Day 990: 18.80%
Application: Pre-sale investors
Type 4
Locked tokens can never be transferred or voted
Restricted calls:
/transfer_tokens_pub_key
/vote_producer
/proxy_vote
Locked tokens can only be used to pay for FIO Protocol fees
Application: FIO Address Giveaways post Mainnet
Implementation
Each restricted account will store
Total grant amount - recorded once at Genesis
Schedule periods unlocked - updated each time schedule is processed for new period
Lock type - See above
Unlock inhibit flag - if set all funds are considered locked irrespective of schedule (only used for Type 2)
Amount locked - amount which remains locked
Every time a restricted call is made the signer's account on that call will be checked against list of restricted accounts
If account is not restricted, action proceeds uninterupted
If account is restricted
If Type 4
Transaction fails with 400:Insufficient balance
If Type 2 and Unlock inhibit flag is set
Transaction fails with 400:Insufficient balance
Compute unlocked tokens
Based on days since Mainnet determine number of schedule periods that should be unlocked
Example:
Type 1, 180 days after Mainnet
3 periods should be unlocked
Based on Schedule periods unlocked determine how many periods should be unlocked
Example:
Type 1, 180 days after Mainnet, Schedule periods unlocked = 1
2 periods should be unlocked
If 0 periods no new tokens should be unlocked
If > 0 unlock tokens based on corresponding period percentage
Example:
Type 1, 180 days after Mainnet, Schedule periods unlocked = 1
12.375% + 12.375% = 24.75‬% should be unlocked
Update Schedule periods unlocked and Amount locked
Example:
BEFORE: Total grant amount = 100, Schedule periods unlocked = 1, Amount locked = 99
AFTER: Total grant amount = 100, Schedule periods unlocked = 3, Amount locked = 74.25
Determine Unlocked tokens
Subtract Amount locked from account balance
Example:
Amount locked: 74.25
Account balance: 100
Available tokens: 100 - 74.25 = 25.75
Determine Votable Tokens
If Type 1
If 1 - (Amount locked / Total grant amount) <= 0.3 then Votable Tokens is lesser of Account balance or Total grant amount * 0.3
If 1 - (Amount locked) / Total grant amount) > 0.3 then Votable Tokens is Available tokens
If Type 2
If 210 days have passed since Mainnet and Unlock inhibit flag is set, Votable Tokens = Amount balance - Amount locked; else Votable Tokens = Account balance
If Type 3
100% is votable
If /transfer_tokens_pub_key
If amount is > Available tokens it fails with 400:Insufficient balance
If amount is <= Available tokens, action proceeds uninterupted
If /vote_producer or /proxy_vote
Only Votable Tokens are voted or proxied;
If Votable Tokens = 0 transaction fails with 400:Insufficient balance
If paying a FIO Protocol fee and fee is > than Available tokens Amount locked should be reduced by the difference between Available tokens and Amount locked
Example:
Locked tokens: 74.25, Account balance: 100, Available tokens: 25.75
Fee: 30
Locked tokens updated to: 74.25 - (30 - 25.75) = 70
Foundation
Foundation account will be designated at Mainnet launch. This account:
Will receive funds issued to Foundation as defined in Fee Distribution - Foundation
Will be the only account allowed to set Unlock inhibit flag as defined in Token lock mechanism
Setting Unlock inhibit flag
The unlock inhibit flag will be set using the action
inhibitunlck (name: owner, uint32_t value)
 on the system contract. the owner must be the name of the fio account affected, the value should be the desired value of he inhibit_unlocking flag, 0 for false, non zero for true.
Only Foundation account is allowed to make this call
This call ha no fee
If 210 days have passed since Mainnet launch, this call will generate 400:Unlock inhibit flag can no longer be removed