211 lines
8.4 KiB
JavaScript
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.')
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |