249 lines
10 KiB
JavaScript
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.')
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |