This document contains design information relating to both FIP-6 and FIP-21https://github.com/fioprotocol/fips/blob/master/fip-0006.md
https://github.com/fioprotocol/fips/blob/master/fip-0021.md
...
Design:
FIP-6:
for FIP-6 There are several important factors
Establish tables to be used to record and account the new locked token model (these are called general locked tokens in this design).
integrate the new tables into the locked token accounting for voting and transferring of tokens. This task is relatively easy as we can use the same pattern of development as the genesis grants, and we can add logic for general locks in the places where the genesis locks are integrated, but we can do this in a way that will NOT impact the genesis locks. (IE: we will make new methods to handle the general locks, and leave the genesis locks untouched).
provide new actions for creating these new locks, this will require 2 new actions, one in the token contract, and one in the system contract (trnsloctoks, and addgenlocked)
integrate the new locking logic into the token contract and the system contract
make can transfer, and computegenerallockedtokens similar to the genesis token accounting, implement the logic specific for the general locks.
integrate the calls to these new methods throughout the token contract and system contract as necessary to ensure voting and transfer update the accounting as expected.
FIP-21:
There are 2 important aspects of the staking incentives being proposed:
Establish and integrate a set of set business rules for when to provide incentives, compute the amount of incentive to provide when incentives are applicable.
We will modify the trnsloctok trnsloctoks (transfer locked tokens) action in the following ways:
it will look for one locking period being present and a duration matching the set of durations specified for the incentive program. The changes will be programmed using a block of constants which will aid in modifications going forward.
Before minting any new tokens,The amount to be added to the grant will be computed according to the table in FIP-21, this will be called Ra. the contents of the total_staking_incentives_granted will be checked, if the total_staking_incentives_granted is less than 20,000,000 then incentives will be added to the grant. if the total_staking_incentives_granted is >= 20,000,000 then NO incentives will be added to the grant. if incentives are being offered for this grant, The amount of incentives remaining will be calculate ad Ri = 20,000,000 - total_staking_incentives_granted . If Ri is less than the amount Ra, the incentive amount to be given will be reset for this grant to become Ri.
Conditional minting logic will be added in order to provide the necessary additional tokens to the locked token grant account. Tokens will be minted to the fio.treasury account and then transferred directly to the token grant account. The total amount of the grant will be increased by the amount of the incentive. Then the locked tokens table entry will be added to the table
Track the total amount of incentives provided by the program, and stop providing incentives once the 20,000,000 FIO threshold is reached.
A new global state table (global4) will be created containing the total_staking_incentives_granted. This table will be updated with any incentive amounts used by adding the computed incentive amount (as stated above) to the previous value of the table, until the 20,000,000 threshold is reached.
...
Summarize changes to fio and fio.contracts
FIP-6
FIP-21
System contract.
fio.system.hpp –
add the global4 table which will hold int32 total_staking_incentives_granted initialized to 0.
fio.system.cpp --
add new action to update staking incentives granted (
updtotstkinc
), special note, auth check that its the fio.token contract calling it.
Token Contract
fio.token.cpp --
modify trnsloctoks to implement the incentives logic, incentive computations, minting and transfer of new tokens, update of total staking incentives granted.
for minting, call issue of fio to the grant holder account for the specified amount of incentive.
call
updtotstkinc
to update incentive rewards accounting in global state.
New contract actions
trnsloctoks
addgenlocked
updtotstkinc
Note changes to structs and ABIs
new global4 table in system.
new actions trnsloctoks in token contract.
addgenlocked
,updtotstkinc
in system contract
Detail any table updates or migrations
no table migrations are necessary.
Summary of risks, impacts and logistics analysis
performance testing of the trnsloctoks should be performed on dev box to ensure this new logic has time to run, if it succeeds on a dev box it should then be fine on other deployments.
functional testing will test this perf concern in all environments (dev local, dev net, test net)
SDK Requirements
Note functional updates needed for SDKs
Functional Test plan
...
FIP-6
FIP-21
...
transfer locked tokens for each specific reward timeframe, note the resulting amounts are correct
...
transfer locked tokens for other timeframes, note no incentives are given (one period, multi period).
...
verify unlocking logic of both incentivized and non incentivized grants.
...
verify the behavior of the total_staking_incentives_granted on a per event basis.
...
verify the behavior of the incentive given when the total_staking_incentives_granted is close to the threshold and less FIO are available than the computed incentive.
...
please refer to the javascript tests, which contain all of the tests for the general locks and staking incentives.
https://github.com/fioprotocol/fio.test/pull/26
Performance Testing plan
send the max number of locking periods (50), do this for 1000 users, verify unlocking occurs without incident for individuals5000 users, then create small incentivized grants for another 5000. once this load is in place perform the functional tests, verify they pass. Do this on the dev net.
Fork Testing plan
this is not a forking change. the chain code modifications associated with FIP-6 will be released at a later time.
Rollout/Release plan6
new actions
removed actions
MSIGs
Rollout/Release verification plan
verification of rollout.
verify the locktokens table is present.
verify the abi for the system and the token contract, verify all new actions are present.
verify using get_actions that the new actions are present.
ToDo:
address bug with domains.
follow up with pawel to discover if we are final for the requirements.