diff --git a/Projects/Governance/Icons/tokens-mined.png b/Projects/Governance/Icons/tokens-mined.png new file mode 100644 index 000000000..5bd381b2b Binary files /dev/null and b/Projects/Governance/Icons/tokens-mined.png differ diff --git a/Projects/Governance/Plugins/User-Profiles/Julian-Molina.json b/Projects/Governance/Plugins/User-Profiles/Julian-Molina.json index 18311fa52..72a7a2e99 100644 --- a/Projects/Governance/Plugins/User-Profiles/Julian-Molina.json +++ b/Projects/Governance/Plugins/User-Profiles/Julian-Molina.json @@ -1223,6 +1223,33 @@ } } }, + "tokensMined": { + "type": "Tokens Mined", + "name": "New Tokens Mined", + "project": "Governance", + "id": "02c80886-9f64-451a-a8a6-e23fadb26d97", + "savedPayload": { + "position": { + "x": 24663.166666666664, + "y": 23058.100619195047 + }, + "targetPosition": { + "x": 24963.166666666664, + "y": 23058.100619195047 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, "id": "1fd95e41-4b22-48d5-be3a-904c37afcb11", "savedPayload": { "position": { diff --git a/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json b/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json index ad2afd49c..6387faa0f 100644 --- a/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json +++ b/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json @@ -4142,6 +4142,33 @@ } } }, + "tokensMined": { + "type": "Tokens Mined", + "name": "New Tokens Mined", + "project": "Governance", + "id": "ab419614-d76c-4820-ace3-970c8282daa6", + "savedPayload": { + "position": { + "x": 30016, + "y": 23099.999999999996 + }, + "targetPosition": { + "x": 30316, + "y": 23099.999999999996 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, "id": "148911b3-b2f3-44fb-8cb4-017991789132", "savedPayload": { "position": { diff --git a/Projects/Governance/Plugins/User-Profiles/harrellbm.json b/Projects/Governance/Plugins/User-Profiles/harrellbm.json index afb6d09de..b0b65e424 100644 --- a/Projects/Governance/Plugins/User-Profiles/harrellbm.json +++ b/Projects/Governance/Plugins/User-Profiles/harrellbm.json @@ -534,12 +534,12 @@ "id": "c2ad753c-49b6-4675-9fdd-02b6967aaab2", "savedPayload": { "position": { - "x": 14643.944089716459, - "y": 23180.59258456338 + "x": 14844.076124072424, + "y": 23593.280114692785 }, "targetPosition": { - "x": 14566.298376185703, - "y": 23470.3703324501 + "x": 14554.298376185703, + "y": 23515.634401162028 }, "floatingObject": { "isPinned": false, @@ -572,12 +572,12 @@ "id": "578d894c-20a7-4a79-b90e-ba383740d29d", "savedPayload": { "position": { - "x": 15068.208158428388, - "y": 23180.59258456338 + "x": 14844.076124072422, + "y": 24017.544183404712 }, "targetPosition": { - "x": 14856.076124072424, - "y": 23392.724618919343 + "x": 14631.944089716459, + "y": 23805.41214904875 }, "floatingObject": { "isPinned": false, @@ -600,12 +600,12 @@ "id": "0cfaa435-6615-4df8-9d31-1fe5f21e0e61", "savedPayload": { "position": { - "x": 15145.853871959145, - "y": 23470.3703324501 + "x": 14554.298376185703, + "y": 24095.18989693547 }, "targetPosition": { - "x": 14856.076124072424, - "y": 23392.724618919343 + "x": 14631.944089716459, + "y": 23805.41214904875 }, "floatingObject": { "isPinned": false, @@ -623,12 +623,12 @@ "id": "4ac11744-6d87-413d-813e-f0963b156d8c", "savedPayload": { "position": { - "x": 14856.076124072424, - "y": 23392.724618919343 + "x": 14631.944089716459, + "y": 23805.41214904875 }, "targetPosition": { - "x": 14566.298376185703, - "y": 23470.3703324501 + "x": 14554.298376185703, + "y": 23515.634401162028 }, "floatingObject": { "isPinned": false, @@ -646,12 +646,12 @@ "id": "fcceb17d-2c2a-4e24-ab5d-e2a8a2798f90", "savedPayload": { "position": { - "x": 14566.298376185703, - "y": 23470.3703324501 + "x": 14554.298376185703, + "y": 23515.634401162028 }, "targetPosition": { - "x": 14354.16634182974, - "y": 23682.502366806064 + "x": 14342.16634182974, + "y": 23303.502366806064 }, "floatingObject": { "isPinned": false, @@ -802,12 +802,12 @@ "id": "055d1919-2b4b-40f2-8793-9cc5eb765a88", "savedPayload": { "position": { - "x": 14954.16634182974, - "y": 23682.502366806064 + "x": 14342.16634182974, + "y": 23903.502366806064 }, "targetPosition": { - "x": 14654.16634182974, - "y": 23682.502366806064 + "x": 14342.16634182974, + "y": 23603.502366806064 }, "floatingObject": { "isPinned": false, @@ -825,12 +825,12 @@ "id": "450eb600-3080-4d37-b8a2-12f71120573c", "savedPayload": { "position": { - "x": 14654.16634182974, - "y": 23682.502366806064 + "x": 14342.16634182974, + "y": 23603.502366806064 }, "targetPosition": { - "x": 14354.16634182974, - "y": 23682.502366806064 + "x": 14342.16634182974, + "y": 23303.502366806064 }, "floatingObject": { "isPinned": false, @@ -886,12 +886,12 @@ "id": "02e75b99-0944-44dd-a434-9e307bdc7935", "savedPayload": { "position": { - "x": 14778.430410541667, - "y": 24106.76643551799 + "x": 13917.902273117812, + "y": 23727.76643551799 }, "targetPosition": { - "x": 14566.298376185703, - "y": 23894.634401162028 + "x": 14130.034307473776, + "y": 23515.634401162028 }, "floatingObject": { "isPinned": false, @@ -909,12 +909,12 @@ "id": "8f44d9ab-8ce6-4336-8b0e-0323d7440e75", "savedPayload": { "position": { - "x": 14566.298376185703, - "y": 23894.634401162028 + "x": 14130.034307473776, + "y": 23515.634401162028 }, "targetPosition": { - "x": 14354.16634182974, - "y": 23682.502366806064 + "x": 14342.16634182974, + "y": 23303.502366806064 }, "floatingObject": { "isPinned": false, @@ -933,15 +933,42 @@ "id": "d5ad1e6a-c6ea-465e-ae14-99fb54534baa", "savedPayload": { "position": { - "x": 14354.16634182974, - "y": 23682.502366806064 + "x": 14342.16634182974, + "y": 23303.502366806064 }, "targetPosition": { "x": 14342.16634182974, "y": 23003.502366806064 }, "floatingObject": { - "isPinned": true, + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "tokensMined": { + "type": "Tokens Mined", + "name": "New Tokens Mined", + "project": "Governance", + "id": "9f832420-03f7-4e4b-8973-c3520bd6f263", + "savedPayload": { + "position": { + "x": 14042.16634182974, + "y": 23003.502366806064 + }, + "targetPosition": { + "x": 14342.16634182974, + "y": 23003.502366806064 + }, + "floatingObject": { + "isPinned": false, "isFrozen": false, "isCollapsed": false, "angleToParent": 1, diff --git a/Projects/Governance/Schemas/App-Schema/tokens-mined.json b/Projects/Governance/Schemas/App-Schema/tokens-mined.json new file mode 100644 index 000000000..a3432d4b5 --- /dev/null +++ b/Projects/Governance/Schemas/App-Schema/tokens-mined.json @@ -0,0 +1,21 @@ +{ + "type": "Tokens Mined", + "menuItems": [ + { + "action": "Delete UI Object", + "actionProject": "Foundations", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->User Profile->" + }, + "propertyNameAtParent": "tokensMined" +} \ No newline at end of file diff --git a/Projects/Governance/Schemas/App-Schema/user-profile.json b/Projects/Governance/Schemas/App-Schema/user-profile.json index e77884227..d7185c344 100644 --- a/Projects/Governance/Schemas/App-Schema/user-profile.json +++ b/Projects/Governance/Schemas/App-Schema/user-profile.json @@ -17,6 +17,15 @@ "label": "Add Token Power Switch", "relatedUiObject": "Token Power Switch" }, + { + "action": "Add UI Object", + "actionProject": "Foundations", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "tokensMined", + "actionFunction": "payload.executeAction", + "label": "Add Tokens Mined", + "relatedUiObject": "Tokens Mined" + }, { "action": "Delete UI Object", "actionProject": "Foundations", @@ -44,6 +53,12 @@ "type": "node", "childType": "Token Power Switch", "autoAdd": true + }, + { + "name": "tokensMined", + "type": "node", + "childType": "Tokens Mined", + "autoAdd": true } ] } \ No newline at end of file diff --git a/Projects/Governance/UI/Function-Libraries/DistributionProcess.js b/Projects/Governance/UI/Function-Libraries/DistributionProcess.js index c62ad5a76..a48a320bc 100644 --- a/Projects/Governance/UI/Function-Libraries/DistributionProcess.js +++ b/Projects/Governance/UI/Function-Libraries/DistributionProcess.js @@ -97,5 +97,12 @@ function newGovernanceFunctionLibraryDistributionProcess() { positions, userProfiles ) + /* + After all the programs were ran, we can calculate the tokens mining + calculation each profile. + */ + UI.projects.governance.functionLibraries.tokenMining.calculate( + userProfiles + ) } } \ No newline at end of file diff --git a/Projects/Governance/UI/Function-Libraries/TokenMining.js b/Projects/Governance/UI/Function-Libraries/TokenMining.js new file mode 100644 index 000000000..e5511662c --- /dev/null +++ b/Projects/Governance/UI/Function-Libraries/TokenMining.js @@ -0,0 +1,150 @@ +function newGovernanceFunctionLibraryTokenMining() { + let thisObject = { + calculate: calculate + } + + return thisObject + + function calculate( + userProfiles + ) { + for (let i = 0; i < userProfiles.length; i++) { + let userProfile = userProfiles[i] + if (userProfile.tokenPowerSwitch === undefined) { continue } + resetTokensMined(userProfile) + } + for (let i = 0; i < userProfiles.length; i++) { + let userProfile = userProfiles[i] + + if (userProfile.tokenPowerSwitch === undefined) { continue } + let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, "Referral Program") + if (program === undefined) { continue } + if (program.payload === undefined) { continue } + + calculateProgram(userProfile, program, "referralProgram") + } + for (let i = 0; i < userProfiles.length; i++) { + let userProfile = userProfiles[i] + + if (userProfile.tokenPowerSwitch === undefined) { continue } + let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, "Support Program") + if (program === undefined) { continue } + if (program.payload === undefined) { continue } + + calculateProgram(userProfile, program, "supportProgram") + } + for (let i = 0; i < userProfiles.length; i++) { + let userProfile = userProfiles[i] + + if (userProfile.tokenPowerSwitch === undefined) { continue } + let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, "Mentorship Program") + if (program === undefined) { continue } + if (program.payload === undefined) { continue } + + calculateProgram(userProfile, program, "mentorshipProgram") + } + for (let i = 0; i < userProfiles.length; i++) { + let userProfile = userProfiles[i] + + if (userProfile.tokenPowerSwitch === undefined) { continue } + let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, "Claims Program") + if (program === undefined) { continue } + if (program.payload === undefined) { continue } + + calculateProgram(userProfile, program, "claimsProgram") + } + for (let i = 0; i < userProfiles.length; i++) { + let userProfile = userProfiles[i] + + if (userProfile.tokenPowerSwitch === undefined) { continue } + let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, "Voting Program") + if (program === undefined) { continue } + if (program.payload === undefined) { continue } + + calculateProgram(userProfile, program, "votingProgram") + } + for (let i = 0; i < userProfiles.length; i++) { + let userProfile = userProfiles[i] + + if (userProfile.tokenPowerSwitch === undefined) { continue } + let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, "Staking Program") + if (program === undefined) { continue } + if (program.payload === undefined) { continue } + + calculateProgram(userProfile, program, "stakingProgram") + } + for (let i = 0; i < userProfiles.length; i++) { + let userProfile = userProfiles[i] + + if (userProfile.tokenPowerSwitch === undefined) { continue } + let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, "Delegation Program") + if (program === undefined) { continue } + if (program.payload === undefined) { continue } + + calculateProgram(userProfile, program, "delegationProgram") + } + + for (let i = 0; i < userProfiles.length; i++) { + let userProfile = userProfiles[i] + + if (userProfile.tokenPowerSwitch === undefined) { continue } + + drawTokensMined(userProfile) + } + + function resetTokensMined(userProfile) { + if (userProfile === undefined) { return } + if (userProfile.payload === undefined) { return } + if (userProfile.tokensMined === undefined) { return } + if (userProfile.tokensMined.payload.tokensMined === undefined) { + userProfile.tokensMined.payload.tokensMined = { + awarded: 0, + bonus: 0, + total: 0 + } + } else { + userProfile.tokensMined.payload.tokensMined.awarded = 0 + userProfile.tokensMined.payload.tokensMined.bonus = 0 + userProfile.tokensMined.payload.tokensMined.total = 0 + } + } + + function calculateProgram(userProfile, programNode, programPropertyName) { + /* + Here we will look into the program node and add their token awarded and token bonus + to the subtotals at the Tokens Mined node. + */ + if (userProfile === undefined) { return } + if (userProfile.payload === undefined) { return } + if (userProfile.tokensMined === undefined) { return } + if (programNode.payload === undefined) { return } + if (programNode.payload[programPropertyName] === undefined) { return } + + if (programNode.tokensAwarded !== undefined && programNode.payload[programPropertyName].awarded !== undefined) { + let awarded = programNode.payload[programPropertyName].awarded.tokens | 0 + userProfile.tokensMined.payload.tokensMined.awarded = userProfile.tokensMined.payload.tokensMined.awarded + awarded + } + if (programNode.tokensBonus !== undefined && programNode.payload[programPropertyName].bonus !== undefined) { + let bonus = programNode.payload[programPropertyName].bonus.tokens | 0 + userProfile.tokensMined.payload.tokensMined.bonus = userProfile.tokensMined.payload.tokensMined.bonus + bonus + } + userProfile.tokensMined.payload.tokensMined.total = userProfile.tokensMined.payload.tokensMined.awarded + userProfile.tokensMined.payload.tokensMined.bonus + } + + function drawTokensMined(userProfile) { + if (userProfile === undefined) { return } + if (userProfile.payload === undefined) { return } + if (userProfile.tokensMined === undefined) { return } + + const awarded = parseFloat(userProfile.tokensMined.payload.tokensMined.awarded.toFixed(2)).toLocaleString('en') + const bonus = parseFloat(userProfile.tokensMined.payload.tokensMined.bonus.toFixed(2)).toLocaleString('en') + const total = parseFloat(userProfile.tokensMined.payload.tokensMined.total.toFixed(2)).toLocaleString('en') + + userProfile.tokensMined.payload.uiObject.valueAngleOffset = 0 + userProfile.tokensMined.payload.uiObject.valueAtAngle = true + + userProfile.tokensMined.payload.uiObject.setStatus(awarded + ' Awarded + ' + bonus + ' Bonus') + userProfile.tokensMined.payload.uiObject.setValue(total + ' SA Tokens') + } + } +} \ No newline at end of file diff --git a/Projects/Governance/UI/Function-Libraries/TokenPower.js b/Projects/Governance/UI/Function-Libraries/TokenPower.js index 0a987cbf3..0f43e7a5a 100644 --- a/Projects/Governance/UI/Function-Libraries/TokenPower.js +++ b/Projects/Governance/UI/Function-Libraries/TokenPower.js @@ -174,6 +174,7 @@ function newGovernanceFunctionLibraryTokenPower() { let childNode = node[property.name] if (childNode === undefined) { continue } if (childNode.type === "Delegation Program" && excludeDelegationProgram === true) { continue } + if (childNode.type === "Tokens Mined") { continue } let percentage = getPercentage(childNode) @@ -191,6 +192,7 @@ function newGovernanceFunctionLibraryTokenPower() { let childNode = propertyArray[m] if (childNode === undefined) { continue } if (childNode.type === "Delegation Program" && excludeDelegationProgram === true) { continue } + if (childNode.type === "Tokens Mined") { continue } let percentage = getPercentage(childNode) if (percentage !== undefined && isNaN(percentage) !== true) { @@ -223,6 +225,7 @@ function newGovernanceFunctionLibraryTokenPower() { let childNode = node[property.name] if (childNode === undefined) { continue } if (childNode.type === "Delegation Program" && excludeDelegationProgram === true) { continue } + if (childNode.type === "Tokens Mined") { continue } let percentage = getPercentage(childNode) if (percentage === undefined || isNaN(percentage) === true) { @@ -243,6 +246,7 @@ function newGovernanceFunctionLibraryTokenPower() { let childNode = propertyArray[m] if (childNode === undefined) { continue } if (childNode.type === "Delegation Program" && excludeDelegationProgram === true) { continue } + if (childNode.type === "Tokens Mined") { continue } let percentage = getPercentage(childNode) if (percentage === undefined || isNaN(percentage) === true) { diff --git a/Projects/ProjectsSchema.json b/Projects/ProjectsSchema.json index dde7bf381..18b8a465a 100644 --- a/Projects/ProjectsSchema.json +++ b/Projects/ProjectsSchema.json @@ -983,10 +983,15 @@ "functionName": "newGovernanceFunctionLibraryAssets" }, { - "name": "TokenPower", + "name": "Token Power", "propertyName": "tokenPower", "functionName": "newGovernanceFunctionLibraryTokenPower" }, + { + "name": "Token Mining", + "propertyName": "tokenMining", + "functionName": "newGovernanceFunctionLibraryTokenMining" + }, { "name": "Voting Program", "propertyName": "votingProgram",