Files
Superalgos/Projects/Governance/UI/Function-Libraries/UserReferrals.js
T

211 lines
8.4 KiB
JavaScript

function newGovernanceFunctionLibraryUserReferrals() {
let thisObject = {
calculate: calculate
}
return thisObject
function calculate(
pools,
userProfiles
) {
let tokensReward
let totalReferralsPower = 0
/* Scan Pools Until finding the User-Referrlas Pool */
for (let i = 0; i < pools.length; i++) {
let poolsNode = pools[i]
findPool(poolsNode)
}
if (tokensReward === undefined || tokensReward === 0) { return }
/*
We will first reset all the referral combinedPower, and then distribute it.
*/
for (let i = 0; i < userProfiles.length; i++) {
let userProfile = userProfiles[i]
resetUserReferrals(userProfile)
}
for (let i = 0; i < userProfiles.length; i++) {
let userProfile = userProfiles[i]
distributeForProfile(userProfile)
}
for (let i = 0; i < userProfiles.length; i++) {
let userProfile = userProfiles[i]
calculateAwardedForProfile(userProfile)
}
function findPool(node) {
if (node === undefined) { return }
if (node.payload === undefined) { return }
/*
When we reach certain node types, we will halt the distribution, because these are targets for
voting combinedPower.
*/
if (
node.type === 'Pool'
) {
let codeName = UI.projects.foundations.utilities.nodeConfig.loadConfigProperty(node.payload, 'codeName')
if (codeName === "User-Referrals") {
tokensReward = node.payload.tokens
return
}
}
let schemaDocument = getSchemaDocument(node)
if (schemaDocument === undefined) { return }
if (schemaDocument.childrenNodesProperties !== undefined) {
for (let i = 0; i < schemaDocument.childrenNodesProperties.length; i++) {
let property = schemaDocument.childrenNodesProperties[i]
switch (property.type) {
case 'node': {
let childNode = node[property.name]
findPool(childNode)
}
break
case 'array': {
let propertyArray = node[property.name]
if (propertyArray !== undefined) {
for (let m = 0; m < propertyArray.length; m++) {
let childNode = propertyArray[m]
findPool(childNode)
}
}
break
}
}
}
}
}
function resetUserReferrals(node) {
if (node === undefined) { return }
if (node.payload === undefined) { return }
node.payload.referring = {
count: 0,
combinedPower: 0,
ownPower: 0,
referralsPower: 0,
awarded: {
tokens: 0,
percentage: 0
}
}
/*
If the node is a User Profile, we will check if it has a User Referrer child defined.
*/
if (
node.userReferrer !== undefined &&
node.type === 'User Profile'
) {
resetUserReferrals(node.userReferrer)
return
}
/*
If there is a reference parent defined, this means that the referral combinedPower is
transfered to it.
*/
if (
node.payload.referenceParent !== undefined &&
node.type === 'User Referrer'
) {
resetUserReferrals(node.payload.referenceParent)
return
}
}
function distributeForProfile(userProfile) {
if (userProfile === undefined || userProfile.payload === undefined) { return }
let referringPower = UI.projects.foundations.utilities.nodeConfig.loadConfigProperty(userProfile.payload, 'tokens')
let referringCount = 0
userProfile.payload.referring.ownPower = referringPower
distributeUserReferrals(userProfile, referringPower, referringCount)
}
function distributeUserReferrals(node, referringPower, referringCount) {
if (node === undefined) { return }
if (node.payload === undefined) { return }
node.payload.referring.count = node.payload.referring.count + referringCount
node.payload.referring.combinedPower = node.payload.referring.combinedPower + referringPower
/*
If the node is a User Profile, we will check if it has a User Referrer child defined.
*/
totalReferralsPower = totalReferralsPower - node.payload.referring.referralsPower
node.payload.referring.referralsPower = node.payload.referring.combinedPower - node.payload.referring.ownPower
totalReferralsPower = totalReferralsPower + node.payload.referring.referralsPower
if (
node.userReferrer !== undefined &&
node.type === 'User Profile'
) {
distributeUserReferrals(node.userReferrer, referringPower, 1, 0)
return
}
/*
If there is a reference parent defined, this means that the referral combinedPower is
transfered to it.
*/
if (
node.payload.referenceParent !== undefined &&
node.type === 'User Referrer'
) {
drawUserReferrals(node)
distributeUserReferrals(node.payload.referenceParent, referringPower / 10, 1)
return
}
}
function calculateAwardedForProfile(userProfile) {
let totalPowerRewardRation = tokensReward / totalReferralsPower
if (totalPowerRewardRation < 1) { totalPowerRewardRation = 1 }
userProfile.payload.referring.awarded.tokens = userProfile.payload.referring.referralsPower * totalPowerRewardRation
drawUserProfiles(userProfile)
}
function drawUserReferrals(node) {
if (node.payload !== undefined) {
const powerText = new Intl.NumberFormat().format(node.payload.referring.combinedPower)
node.payload.uiObject.valueAngleOffset = 0
node.payload.uiObject.valueAtAngle = false
node.payload.uiObject.setStatus(powerText + ' ' + 'Combined Referring Power')
return
}
}
function drawUserProfiles(node) {
if (node.payload !== undefined) {
const powerText = new Intl.NumberFormat().format(node.payload.referring.combinedPower)
const awardedTokens = new Intl.NumberFormat().format(node.payload.referring.awarded.tokens)
const referralPower = new Intl.NumberFormat().format(node.payload.referring.referralsPower)
node.payload.uiObject.valueAngleOffset = 0
node.payload.uiObject.valueAtAngle = false
if (
(
node.userReferrer !== undefined &&
node.userReferrer.payload !== undefined &&
node.userReferrer.payload.referenceParent !== undefined)
||
node.payload.referring.combinedPower >= 10000000
) {
let status =
powerText + ' ' + 'Combined Referring Power' + ' - ' +
node.payload.referring.count + ' Referrals' + ' - ' +
referralPower + ' Referrals Power' + ' - ' +
awardedTokens + ' ' + 'SA Tokens Awarded'
node.payload.uiObject.setStatus(status)
return
} else {
node.payload.referring.awarded.tokens = 0
node.payload.uiObject.setStatus(awardedTokens + ' SA Tokens not Awarded, because you have not defined your referrer yet.')
}
}
}
}
}