Add contract method for non sustainable action reward

Non Sustainable Action Rewards Counted as a Sustainable Action

Background

Apps can distribute rewards from their X2EarnRewardsPool for different purposes, for example:

  • Reward for a sustainable action
  • Endorser reward
  • Streak or Leaderboard rewards
  • Other “bonus” type rewards

However all these type of rewards are counted as a “action” in the users passport. This means non sustainable action rewards count towards keeping a passport eligible/active.

During some community analysis on the Mugshot channel on Discord, it was observed that a significant number of passports are being only kept active through mugshot leaderboard rewards, but are not doing any sustainable actions.

The purpose therefore of this post is to discuss possible solutions to this, with one potential solution outlined for further thoughts.

Problem Statement

Passports should remain active only if they do sustainable actions, and other types of rewards should not count towards passport validity.

Indexers are not distinguishing different types of rewards, and counting rewards with no-sustainable proof as a “action” in that app. This can affect the apps metrics and the DAOs metrics overall.

Potential Solution

Different reward types should be modelled into the “distribute” smart contract methods in the X2EarnRewardsPool. At the moment apps can use:

  • distributeReward
  • distributeRewardWithProof
  • distributeRewardWithProofAndMetaData

these all count towards a the receivers passport regardless of if a proof is supplied. These functions all emit the RewardDistributed event which may or may not contain a proof.

The potential solution is:

  • Add a new function distributeNonProofReward → this does not count towards the receivers passport, and generates a different on-chain event to above
  • Deprecate function distributeReward (which does not require a proof)
  • Make a proof mandatory for distributeRewardWithProof and distributeRewardWithProofAndMetaData

The new function distributeNonProofReward takes an enum that categorises the non-sustainable action reward, for example endorser, leaderboard, streak, cashback etc. It also generates a new event NonProofRewardDistributed

Conclusion

With this potential solution, passports will that are only kept active from leaderboard rewards but are not doing sustainable action will eventually become inactive.

Indexers can then index the NonProofRewardDistributed for non sustainable action rewards.

Thanks!

From VeBetterStats db, this shows how many RewardDistributed events dont have any proofs for rounds 95 to 98:

I suppose those are still “proofs” emited as a description or custom json? Would be nice to see if it completly without proofs or just custom ones (like “rewarded for being an endorser”).

Regarding the proposal, adding new functions that distribute rewads without proofs that do not inrease the actions in the passport of the user can be easily achieved. We can do it without a proposal. If instead this need to be enforced on apps, that a proposal would be required.

I think apps use that distributeRewards for 2 main reasons:

  • still allow users to see that funds were transfered for the pool to reward someone (even if no proof or no impact), eg: pay endorsers, pay for leaderboard, whatever; otherwise with a normal transfer it would look like a withdraw from the owner of the app and would look bad
  • allow their users to see those transactions, correctly labelled in veworld and vebetterdao with also the possibility to see the “proof” that says stuff like “rewarded for being 1st in the leaderboar”.

For both things I suppose the indexer would need to be updated, because it is currently fetching the RewardsDistributed events. If we are okey with keeping that event also in the new functions, and just not increase the passport actions, then it would be even easier: just adding the new functions in the contract and asking apps to use those.

Yeah i think the first part is to fix the passport counting

Second part is really audit trail, when DistributeReward is called with no proof - or no impacts and a custom description - tools like WalletWatch / VeBetter stats cannot classify that transaction - this is why imho an enum is needed, so that its well defined.

for A ZeLoop spotter, we use the **VeBetterDAO Reward Distribution (**VeBetterDAO Reward Distribution) tool to sent additional rewards for specific contests, such as “more than 5 actions in a week” and other. The reason is clearly given along the distribution, and actions remain related to sustainability, but it is not tagged as such. How to tag it?

Theres two parts here:

  1. Users passports should only remain active if they do sustainable actions - and not kept alive by Leaderboard or other bonus type rewards

  2. How to actually classify bonus type rewards. This is important for data structure of the DAO - if the “type” of the reward is just free text in a description, this makes it alot more complex for indexers. To this end its proposed a new function be added including an enum for reward classification