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

249 lines
10 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]
if (userProfile.tokenSwitch === undefined) { continue }
if (userProfile.tokenSwitch.referralProgram === undefined) { continue }
if (userProfile.tokenSwitch.referralProgram.payload === undefined) { continue }
resetUserReferrals(userProfile.tokenSwitch.referralProgram)
}
for (let i = 0; i < userProfiles.length; i++) {
let userProfile = userProfiles[i]
if (userProfile.tokenSwitch === undefined) { continue }
if (userProfile.tokenSwitch.referralProgram === undefined) { continue }
if (userProfile.tokenSwitch.referralProgram.payload === undefined) { continue }
distributeForReferralProgram(userProfile.tokenSwitch.referralProgram)
}
for (let i = 0; i < userProfiles.length; i++) {
let userProfile = userProfiles[i]
if (userProfile.tokenSwitch === undefined) { continue }
if (userProfile.tokenSwitch.referralProgram === undefined) { continue }
if (userProfile.tokenSwitch.referralProgram.payload === undefined) { continue }
calculateForReferralProgram(userProfile.tokenSwitch.referralProgram)
}
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 === "Referral-Program") {
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.type === 'User Profile' &&
node.tokenSwitch !== undefined &&
node.tokenSwitch.referralProgram !== undefined
) {
resetUserReferrals(node.tokenSwitch.referralProgram)
return
}
/*
If the node is a Referral Program, we will check if it has a User Referrer child defined.
*/
if (
node.type === 'Referral Program' &&
node.userReferrer !== undefined
) {
resetUserReferrals(node.userReferrer)
return
}
/*
If there is a reference parent defined, this means that the referral combinedPower is
transfered to it.
*/
if (
node.type === 'User Referrer' &&
node.payload.referenceParent !== undefined
) {
resetUserReferrals(node.payload.referenceParent)
return
}
}
function distributeForReferralProgram(referralProgram) {
if (referralProgram === undefined || referralProgram.payload === undefined) { return }
let referringPower = referralProgram.payload.tokenPower
let referringCount = 0
referralProgram.payload.referring.ownPower = referringPower
distributeUserReferrals(referralProgram, 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.type === 'Referral Program' &&
node.userReferrer !== undefined
) {
distributeUserReferrals(node.userReferrer, referringPower / 10, 1, 0)
return
}
/*
If there is a reference parent defined, this means that the referral combinedPower is
transfered to it.
*/
if (
node.type === 'User Referrer' &&
node.payload.referenceParent !== undefined
) {
drawUserReferrals(node)
distributeUserReferrals(node.payload.referenceParent, referringPower, 1)
return
}
}
function calculateForReferralProgram(referralProgram) {
if (referralProgram.payload === undefined) { return }
let totalPowerRewardRatio = tokensReward / totalReferralsPower
if (totalPowerRewardRatio < 1) { totalPowerRewardRatio = 1 }
referralProgram.payload.referring.awarded.tokens = referralProgram.payload.referring.referralsPower * totalPowerRewardRatio
drawReferralProgram(referralProgram)
}
function drawUserReferrals(node) {
if (node.payload !== undefined) {
const ownPowerText = new Intl.NumberFormat().format(node.payload.referring.ownPower)
const referralsPowerText = new Intl.NumberFormat().format(node.payload.referring.referralsPower)
const combinedPowerText = new Intl.NumberFormat().format(node.payload.referring.combinedPower)
node.payload.uiObject.valueAngleOffset = 180
node.payload.uiObject.valueAtAngle = true
node.payload.uiObject.setValue( combinedPowerText + ' ' + 'Referring Power')
node.payload.uiObject.statusAngleOffset = 0
node.payload.uiObject.statusAtAngle = false
node.payload.uiObject.setStatus(ownPowerText + ' own RP + ' + referralsPowerText + ' inherited RP = ' + combinedPowerText + ' ' + ' Total RP')
}
}
function drawReferralProgram(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.statusAngleOffset = 0
node.payload.uiObject.statusAtAngle = false
node.payload.uiObject.setStatus("Referring Power = Token Power / 10")
return
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.')
}
}
}
}
}