<img src="https://i.imgur.com/OyL8CcE.jpg" alt="drawing" width="200"/> # Bootstrap ONE-T Nomination Pools Proponent: TurboFlakes KSM Account: H1tAQMm3eizGcmpAhL9aA9gR844kZpQfkU7pkmMiLx9jSzE Contact: Paulo [@turboflakes:matrix.org] Date: 19.06.2021 Requested KSM: ** **20 000 KSM** to be bonded into ONE-T Nomination Pools -- *Short description:* **ONE-T** is a **validator-performance bot for Polkadot and Kusama** networks with special focus on the One Thousand Validator Programme ([TVP](https://wiki.polkadot.network/docs/thousand-validators)). ONE-T Nomination Pools ([one-t.turboflakes.io](https://one-t.turboflakes.io/#/kusama)) are automated, precisely and unbiased with ONE-T bot at its core. From this proposal we aim to use **20 000 KSM from Kusama Treasury funds to provide bonded stake** to two distinct nomination pools (pool_id: 12 and pool_id: 13) for the duration of 6 months. Site: [one-t.turboflakes.io](https://one-t.turboflakes.io/#/kusama) ![](https://i.imgur.com/9TiaB2l.png) ## 1. Context of the proposal ONE-T bot was born after a few ideas gathered by the community, it aims to be an additional tool to the Polkadot ecosystem where TVP validators could be promoted, a tool that could give useful insights to validator operators and nominators about validators performance, a tool to easily understand how well validators are performing compared to their peers, a tool to give a general overview about the state of the Polkadot and Kusama network. #### ONE-T Reports ONE-T is generating reports daily since April 2022. These reports are currently only available on matrix and at the time of writing, for Kusama and Polkadot combined, ONE-T gathered over the past two months **more than 150 members** on both public rooms. There are **more than 200 validator report subscriptions active** and is sending on average more than **500 reports a day** to subscribers. Anyone is welcome to join the public rooms below and subscribe to any of the reports available, *individual validator reports*, *insights report*, *parachains report* or the *para-groups report*: <table style="width:100%;" cellspacing="0" cellpadding="0"> <tr> <td style="width: 100px;"> <img style="width: 80px;" src="https://github.com/turboflakes/one-t/blob/main/assets/one-t-kusama-avatar-128.png?raw=true" /> </td> <td><a href="https://matrix.to/#/%23kusama-one-t-bot:matrix.org" target="_blank">Kusama ONE-T Bot (Public)</a></td> </tr> <tr> <td style="width: 100px;"> <img style="width: 80px;" src="https://github.com/turboflakes/one-t/blob/main/assets/one-t-polkadot-avatar-128.png?raw=true" /> </td> <td><a href="https://matrix.to/#/%23polkadot-one-t-bot:matrix.org" target="_blank">Polkadot ONE-T Bot (Public)</a></td> </tr> </table> The image below shows the *Validator Performance Report* message sent by ONE-T: <p align="left"> <img style="padding: 0px; width: 384px;" src="https://github.com/turboflakes/one-t/blob/main/assets/validator_performance_report_example.png?raw=true"> </p> #### Communnity Tips The project was already reported by community members for a [Tip](https://www.dotreasury.com/ksm/tips/12114700_0xfa0bff722b90af0e2c1b849b474df6f04a06ba636b23be8b3b8afb0cca2bda09) from the Kusama council and a [Tip](https://www.dotreasury.com/dot/tips/10119045_0xb57463139a1c42a76c382bb63f368f894ecd256b7d1f90129a7907577c271789) from the Polkadot council. Both accepted and approved by the respective councillors. #### Open Source ONE-T is open-sourced from day one, repository could be found [here](https://github.com/turboflakes/one-t). ### Nomination Pools [Nomination pools](https://wiki.polkadot.network/docs/learn-nomination-pools) are one of the most exciting features of the Staking system on Polkadot, so when these got available on Kusama, things became even more attractive for nominators and powerful for validator operators. Allowing anyone to explore, promote and further push the bondaries of the staking system on Kusama. ### Team credentials & Other Tools The team behind ONE-T is the same that created **Nomi**, a decision support tool for Nominators in NPoS networks (GitHub projects [backend](https://github.com/turboflakes/turboflakes-backend), [frontend](https://github.com/turboflakes/turboflakes.github.io)), the tool is currently available at [www.turboflakes.io](https://www.turboflakes.io). The tool has received funds from the Kusama Treasury to expand functionalities and is currently under development with some additional features to be released soon. We are also the creators of other bots, **Crunch** and **Scouty**. Crunch is a command-line interface to easily automate payouts of staking rewards for Substrate-based chains (GitHub project [here](https://github.com/turboflakes/crunch)). Crunch has matrix integration built-in so that validator operators can be easily notified about the state of their staking rewards. Scouty is a command-line interface to keep an eye on substrate-based chains and hook things up (GitHub project [here](https://github.com/turboflakes/scouty)). Scouty also has matrix integration built-in so that anyone could get notified about on-chain events and extend functionality as soon as on-chain events linked to Session, Staking, ImOnline and Democracy pallets are emitted. All our tools have been well received by the community and have received Tips from the Kusama Treasury. ## 2. Problem statement The Thousand Validators Programme is an awesome initiative by Web3 Foundation and Parity to further decentralize the validator set and gives an opportunity to everyone that would like to become a Validator operator in the ecosystem to actually participate in active staking. In NPoS networks, there are only two ways for a validator to reach the active set: Or either have the means to back himself. Or has to obtain the trust of nominators - be proactive, build a reputable brand/name, participate in the community, build things. In sense, contributing to the ecosystem, so that nominators could feel comfortable by directing their funds towards these independent validators. It looks like a not so difficult task for a validator, but of it all, the hardest bit is really to be part of the active set and actually validate. Only when a validator is active, is when nominators confidence builds up and trust is obtained, is when research could be made about a validator performance, is where all good things happen and eventually some staked bonds could be diverted to a more diverse and decentralized set. Apart from the TVP initiative (to my knowledge) **there are currently no other community or independent programmes available to further push for a more decentralized set - this proposal aims to change that and bring another platform to bootstrap independent validators with enough bonded stake into the active set**. ## 3. Proposal Objective/solution/s to point 2: ### Our Solution → Nomination Pools + ONE-T ONE-T automation, precisely and unbiased selection of validators aims to help to shape Kusama and bring a fully trusted, performant and highly decentralised network. ONE-T monitors and scores and grade all active validators based on their performance when participating in the parachain consensus. The top performances are then automatically nominated to two distinct nomination pools. Although, this is not a guarantee that the these validators will always be the best performers in subsequent sessions, most likely they will continue to outperform. And the additional fact that only valid TVP validators are potential candidates for these pools aims to increase trust and lower the risks for pool members. The fairly rotation brought by the participation in the TVP programme and the short time span considered - up to 48 sessions on Kusama - gives every validator a chance to be evaluated and be listed among the top best performers every era. With the amount of **20 000 KSM** of funds requested from the Kusama Treasury by this proposal, injected directly into ONE-T Nomination Pools ([one-t.turboflakes.io](https://one-t.turboflakes.io/#/kusama)) we **aim to bootstrap** these **exceptional validators** and help them stay in the active set a few eras more, so long as a new set of good performers come along and the pool nomination is refreshed with a new set of validators. **We aim for ONE-T Nomination Pools to be recognized as pools where nominees are trustfull and exceptional performers, so that any token holder could came here to visit and search for good candidates for their nominators - or even better, to become a member of these pools.** ### 3.1. How does this proposal change the current logic in Kusama? #### 3.1.1 How does ONE-T performance score work ONE-T measure performance strictly when a validator is selected to participate in the parachain consensus. Every new session a random set of active validators are selected to para-validate and is during this critical time that most of the points collected by a validator come from. Parachain consensus uses a few different protocols that are strictly connected with the relay-chain consensus. A big slice of the para-validator (p/v) points come from the Backing process which is currently the main focus of ONE-T. All of the para-validators are tracked on the amount of missed candidate backing votes for parachains and the ones that miss less are performing better. If the validator also performs well during the participation in the other protocols the overall p/v points increase. And for these points to be included in the performance score, ONE-T takes the average of p/v points over an amount of X sessions into the score calculation. By last, the amount of times a validator participates in the parachain consensus is also introduced in the score calculation. Being this fact completely random, it has been given the lowest weight. This insight is very important, because the more assignments a validator has the more chances one have to miss candidate backing votes. Having more p/v sessions it means that the validator has been evaluated more times, increasing the risk of changing the previous score up or down. Having more p/v slightly increases the performance score. #### Who are selected to the Pool ID: 12 *Pool metadata:* 🏆 Top 24 Best Validators Performances (TVP) At the end of each era the performance score is calculated based on the three categories previously described. The backing votes ratio make u bringing allp 75% of the score, average p/v points make up 18% and number of sessions as p/v the remaining 7%. After the performance score is completed a ranking is built by sorting the list of validators by *performance score* in descending order - **higher score means Top-Performance**. The top 24 are than selected as the nominees for the pool ID: 12 nomination. (Score formulas can be found [here](https://github.com/turboflakes/one-t/blob/main/SCORES.md).) #### Who are selected to the Pool ID: 13 *Pool metadata:* 🏅 Top 12 Best Validators Performances (TVP-LC) On top of the performance score, a new score named *commission score* is calculated. Where the current validator commission make up 75% of the score and the rest 25% the validator performance score. A new ranking is built by sorting the list of validators by *commission score* in descending order - **higher score means Top-Performance with the Lowest Commission**. The top 12 are than selected as the nominees for the pool ID: 13 nomination. *Why only 12 and not 24 nominees?* The bonded funds in this pool aims to be more clinical towards the current set of nominees, hoping to have a greater effect in bringing active some of these validators in the next election round. #### Features already implemented: ONE-T is already live and has been running steadily for a few months. Since nomination pools went active on Kusama, the bot is already doing what is proposed on this proposal - it nominates the top best 1KV validators from the last 48 sessions/epochs (2 days) to the respective pools at the begining of each new era. Nominations are always triggered by the pool nominator account and can be verified on-chain [here](https://kusama.subscan.io/account/EkEMJHQzZ2BiVjmK64d5Lk9XCFCbPgvyoPwFWWgG11Nqiee). #### 3.1.2 How do we plan to use Treasury funds into ONE-T Nomination Pools: The idea is to allocate 10 000 KSM to each pool totalizing the amount of 20 000 KSM requested from the Kusama Treasury. Since these funds belong to the Kusama Treasury they should be always controlled by governance and should not be managed directly by us. To achieve the goal of *less trust, more truth* we pretend to use addresses without private keys generated on-chain via the [Anonymous proxy](https://wiki.polkadot.network/docs/learn-proxies#anonymous-proxies) function and without the control from the account that originally create the newly spawned anonymous proxies. With such implementation the ONLY way to access and execute calls on behalf of the new on-chain generated accounts is via Governance. We are proposing the following two tasks to achieve our goal: #### Task 1 First let's create a batch call to generate new addresses on-chain via the `proxy.anonymous` function. The reference of the successful on-chain extrinsic can be found [here](https://kusama.subscan.io/extrinsic/14359985-2). The successful output of the previous call gives us two new addresses: - `FWkxCoVGajKfcBqd6SreVSm4DJZLMRAWSqT26whPrkjqX3m` - `FWKXyqL8YhH7fyazuFiGswDcQEvJNSnbSVjc6mFDGL5i342` Next, let's use `proxy.killAnonymous` to effective remove our control from these accounts. The reference of the successful on-chain extrinsics can be found [here](https://kusama.subscan.io/extrinsic/14360053-4) and [here](https://kusama.subscan.io/extrinsic/14360057-5) respectively removing control from account [FWkxCoVGajKfcBqd6SreVSm4DJZLMRAWSqT26whPrkjqX3m](https://kusama.subscan.io/account/FWkxCoVGajKfcBqd6SreVSm4DJZLMRAWSqT26whPrkjqX3m) and account [FWKXyqL8YhH7fyazuFiGswDcQEvJNSnbSVjc6mFDGL5i342](https://kusama.subscan.io/account/FWKXyqL8YhH7fyazuFiGswDcQEvJNSnbSVjc6mFDGL5i342). From this point onwards the only way to access these accounts is via Governance, so let's give it a try and make some remarks on behalf of these accounts. We propose the following [preimage](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fkusama-rpc.polkadot.io#/extrinsics/decode/0x1802081803000181fd5707c1e314bdccbe80a311121ce074cebdc0dead2bbcb1cb0c127aca5f8e0001544c657373205472757374204d6f72652054727574681803000181a7c6cac2bac3e3fae246e998f1d05eb36aa59c3345fedb09a3828eee7ec762000130457870656374204368616f73) for the proposal to be executed via Governance so we could test governance control over the accounts previously mentioned. The reference of the on-chain preimage can be found [here](https://kusama.subscan.io/extrinsic/14361315-5). *Note: If this proposal passes council vote, add a reference here - in this document of the successfull block number and respective extrinsic. It might be useful for future reference.* *Preimage proposal hash `0x1802081803000181fd5707c1e314bdccbe80a311121ce074cebdc0dead2bbcb1cb0c127aca5f8e0001544c657373205472757374204d6f72652054727574681803000181a7c6cac2bac3e3fae246e998f1d05eb36aa59c3345fedb09a3828eee7ec762000130457870656374204368616f73`* ![](https://i.imgur.com/puvSVg0.jpg) *Note: Both accounts were initially provisioned with `0.1 KSM` so that future calls could be successfully triggered via Governance. The reference of the provision can be found [here](https://kusama.subscan.io/extrinsic/14361158-2).* *(UPDATE - 04/01/2022)* Task 1 by completed. Referendum [230](https://kusama.subsquare.io/democracy/referendum/230) passed community vote. Call was enacted at block [14731200](https://kusama.subscan.io/extrinsic/14731200-0). #### Task 2 (Draft 1) Creation of a single proposal to be submitted by council so that could become later referenda with the goal described by the points below: * Transfer 10,000 KSM from treasury to the anonym proxy account A; * Transfer 10,000 KSM from treasury to the anonym proxy account B; * Make the anonym proxy account A a member of pool 12 by joining with the amount of 9,999 KSM (1 KSM left for transaction fees); * Make the anonym proxy account B a member of pool 13 by joining with the amount of 9,999 KSM (1 KSM left for transaction fees); * Schedule a call after 2,592,000 blocks (6 months) with a batch call: * Claim Payout for the anonym proxy account A from pool 12; * Unbond all funds (9,999 KSM) of the member (anonym proxy account A) from pool 12; * Claim Payout for the anonym proxy account B from pool 13; * Unbond all funds (9,999 KSM) of the member (anonym proxy account B) from pool 13; *Note 1: 6 months is around 2,592,000 blocks (6 30 24 60 10)* *Note 2: If this proposal passes council and referenda vote, add a reference here - in this document of the successfull block number and respective extrinsic. It might be useful for future reference.* *Draft of the initial proposed extrinsic for Task 2:* ``` utility.batchAll(calls) { "calls": [ { "args": { "source": { "Id": "TREASURY_ACCOUNT" }, "dest": { "Id": "ANONYM_PROXY_ACCOUNT_A" }, "value": "10,000,000,000,000,000" }, "method": "forceTransfer", "section": "balances" }, { "args": { "source": { "Id": "TREASURY_ACCOUNT" }, "dest": { "Id": "ANONYM_PROXY_ACCOUNT_B" }, "value": "10,000,000,000,000,000" }, "method": "forceTransfer", "section": "balances" }, { "args": { "real": "ANONYM_PROXY_ACCOUNT_A", "force_proxy_type": null, "call": { "args": { "amount": "9,999,000,000,000,000", "pool_id": "12" }, "method": "join", "section": "nominationPools" } }, "method": "proxy", "section": "proxy" }, { "args": { "real": "ANONYM_PROXY_ACCOUNT_B", "force_proxy_type": null, "call": { "args": { "amount": "9,999,000,000,000,000", "pool_id": "13" }, "method": "join", "section": "nominationPools" } }, "method": "proxy", "section": "proxy" }, { "args": { "after": "2,592,000", "maybe_periodic": null, "priority": "0", "call": { "Value": { "args": { "calls": [ { "args": { "real": "ANONYM_PROXY_ACCOUNT_A", "force_proxy_type": null, "call": { "args": {}, "method": "claimPayout", "section": "nominationPools" } }, "method": "proxy", "section": "proxy" }, { "args": { "real": "ANONYM_PROXY_ACCOUNT_A", "force_proxy_type": null, "call": { "args": { "member_account": "ANONYM_PROXY_ACCOUNT_A", "unbonding_points": "9,999,000,000,000,000" }, "method": "unbond", "section": "nominationPools" } }, "method": "proxy", "section": "proxy" }, { "args": { "real": "ANONYM_PROXY_ACCOUNT_B", "force_proxy_type": null, "call": { "args": {}, "method": "claimPayout", "section": "nominationPools" } }, "method": "proxy", "section": "proxy" }, { "args": { "real": "ANONYM_PROXY_ACCOUNT_B", "force_proxy_type": null, "call": { "args": { "member_account": "ANONYM_PROXY_ACCOUNT_B", "unbonding_points": "9,999,000,000,000,000" }, "method": "unbond", "section": "nominationPools" } }, "method": "proxy", "section": "proxy" } ] }, "method": "batchAll", "section": "utility" } } }, "method": "scheduleAfter", "section": "scheduler" } ] } ``` <!-- #### Task 2 (Draft 2) Creation of two Treasury proposals where the beneficiaries are the accounts created in the previous Task 1. * Create a **Treasury proposal A** where the beneficiary is the **Account A** (FWkxCoVGajKfcBqd6SreVSm4DJZLMRAWSqT26whPrkjqX3m) proposing an amount of 10,000 KSM (10,000,000,000,000,000 PLANKS) * Create a **Treasury proposal B** where the beneficiary is the **Account B** (FWKXyqL8YhH7fyazuFiGswDcQEvJNSnbSVjc6mFDGL5i342) proposing an amount of 10,000 KSM (10,000,000,000,000,000 PLANKS) Creation of a single proposal to be submitted by council so that could become later referenda with the goal described by the points below: * Aprove **Treasury proposal A** (Note: the funds only reach the account 7 days after treasury accepted); * Aprove **Treasury proposal B**; * Execute the following with a delay of 7 days, from which call can this be done? * Make the anonym proxy account A a member of pool 12 by joining with the amount of 9,999 KSM (1 KSM left for transaction fees); * Make the anonym proxy account B a member of pool 13 by joining with the amount of 9,999 KSM (1 KSM left for transaction fees); * Schedule a call after 2,592,000 blocks (6 months) with a batch call: * Claim Payout for the anonym proxy account A from pool 12; * Unbond all funds (9,999 KSM) of the member (anonym proxy account A) from pool 12; * Claim Payout for the anonym proxy account B from pool 13; * Unbond all funds (9,999 KSM) of the member (anonym proxy account B) from pool 13; *Note 1: 6 months is around 2,592,000 blocks (6 30 24 60 10)* *Note 2: If this proposal passes council and referenda vote, add a reference here - in this document of the successfull block number and respective extrinsic. It might be useful for future reference.* *Draft of the initial proposed extrinsic for Task 2:* ``` utility.batchAll(calls) { "calls": [ { "args": { "source": { "Id": "TREASURY_ACCOUNT" }, "dest": { "Id": "ANONYM_PROXY_ACCOUNT_A" }, "value": "10,000,000,000,000,000" }, "method": "forceTransfer", "section": "balances" }, { "args": { "source": { "Id": "TREASURY_ACCOUNT" }, "dest": { "Id": "ANONYM_PROXY_ACCOUNT_B" }, "value": "10,000,000,000,000,000" }, "method": "forceTransfer", "section": "balances" }, { "args": { "real": "ANONYM_PROXY_ACCOUNT_A", "force_proxy_type": null, "call": { "args": { "amount": "9,999,000,000,000,000", "pool_id": "12" }, "method": "join", "section": "nominationPools" } }, "method": "proxy", "section": "proxy" }, { "args": { "real": "ANONYM_PROXY_ACCOUNT_B", "force_proxy_type": null, "call": { "args": { "amount": "9,999,000,000,000,000", "pool_id": "13" }, "method": "join", "section": "nominationPools" } }, "method": "proxy", "section": "proxy" }, { "args": { "after": "2,592,000", "maybe_periodic": null, "priority": "0", "call": { "Value": { "args": { "calls": [ { "args": { "real": "ANONYM_PROXY_ACCOUNT_A", "force_proxy_type": null, "call": { "args": {}, "method": "claimPayout", "section": "nominationPools" } }, "method": "proxy", "section": "proxy" }, { "args": { "real": "ANONYM_PROXY_ACCOUNT_A", "force_proxy_type": null, "call": { "args": { "member_account": "ANONYM_PROXY_ACCOUNT_A", "unbonding_points": "9,999,000,000,000,000" }, "method": "unbond", "section": "nominationPools" } }, "method": "proxy", "section": "proxy" }, { "args": { "real": "ANONYM_PROXY_ACCOUNT_B", "force_proxy_type": null, "call": { "args": {}, "method": "claimPayout", "section": "nominationPools" } }, "method": "proxy", "section": "proxy" }, { "args": { "real": "ANONYM_PROXY_ACCOUNT_B", "force_proxy_type": null, "call": { "args": { "member_account": "ANONYM_PROXY_ACCOUNT_B", "unbonding_points": "9,999,000,000,000,000" }, "method": "unbond", "section": "nominationPools" } }, "method": "proxy", "section": "proxy" } ] }, "method": "batchAll", "section": "utility" } } }, "method": "scheduleAfter", "section": "scheduler" } ] } ``` --> #### What happens to the funds after the end of the 6 months period proposed? We plan to report back how successfully the Treasury funds have been applied into ONE-T Nomination Pools and let the community decide by opening a discussion followed by a new council proposal to either transfer the funds + staking rewards back to the Kusama Treasury or rebond and extend the period for another 6 months. #### Why 20 000 KSM? We think that 20 000 KSM (which is around half of the average of 38 380 KSM from the 23 nominator accounts currently available in the TVP programme) applied to the 36 nominees total stake will most likely not put any validator directly into the active set, but combined with the validators independent nominators and when overlapping with the TVP nomination will certainly give a push to keep part of these validators in the active set. #### Potential Risks Validator slashing is the major risk we foreseen by applying Kusama Treasury Funds into bonded stake. The strict rules applied by the TVP programme alone are aimed to lower the risk of slashing and guarantee that the validators in operation are trusted, secure and have good intentions. Other risks might fall on the ONE-T bot it self while monitoring the network or the nomination could not be triggered every other era - we will try to mitigate this risk as much as we can by continuosly monitoring the bot. ONE-T also reports the status of the nomination to the public room so that community could be aware when the new set of nominees is sent on-chain. ### 3.2. Who does this solution help? - It aims to give more exposure of Nomination Pools on Kusama. - This proposal aims to help good performances and reliable independant validators to be in the active set more frequently. - It aims to build up trust and offer potential nominators credibility about all the validator nominees that are nominated by ONE-T. ### 3.3. Milestones and tasks to include: The proposal is broken into 2 tasks under milestone 0: **Milestone 0** With a help of a council member we plan to start by implementing task 1 as described in [point 3.1.2](https://hackmd.io/@turboflakes/SyqlsRtYc#Task-1). ## 4. Why Kusama? Nomination Pools are already live on Kusama. The barrier for new independant validators to enter is lower. Kusama is our live experimentation of what we would expect Polkadot in the near future to be, so to build and try out something new, we will always do it on Kusama first. ## 5. If you have seen similar proposals before: why are yours different? -- ## 6. Payment conditions: -- ## 7. Comments, Qs&As -- ## 8. We'd love to hear about how you got to know about the Kusama on-chain treasury: let us know, in a few sentences, how did you become familiar with the spending mechanism and the on-chain treasury? We have been around in the community from January 2021, we follow both Direction channels on element where Treasury proposals are discussed and we try to be on top of new proposals and be informed as much as possible on how the spending mechainsm works in Kusama.