Merge pull request #1331 from Luis-Fernando-Molina/develop

Contribution: Decendants Bug Fixed, Circular References enables, MAX_GENERATIONS implemented
This commit is contained in:
Luis Fernando Molina authored and GitHub committed 2021-07-25 16:29:01 -04:00
commit 506f4caedc
4 files changed
+599 -488

No files matched your search

File diff suppressed because it is too large. Load diff
@@ -2,6 +2,7 @@ function newGovernanceFunctionLibraryDelegationProgram() {
let thisObject = {
calculate: calculate
}
const MAX_GENERATIONS = 10
return thisObject
@@ -45,49 +46,57 @@ function newGovernanceFunctionLibraryDelegationProgram() {
)
function resetProgram(node) {
if (node === undefined) { return }
if (node.payload === undefined) { return }
if (node.payload.delegationProgram === undefined) {
node.payload.delegationProgram = {
programPower: 0,
ownPower: 0,
usedPower: 0
resetNode(node, 0)
function resetNode(node, generation) {
if (generation >= MAX_GENERATIONS) {
return
}
if (node === undefined) { return }
if (node.payload === undefined) { return }
if (node.payload.delegationProgram === undefined) {
node.payload.delegationProgram = {
programPower: 0,
ownPower: 0,
usedPower: 0
}
} else {
node.payload.delegationProgram.programPower = 0
node.payload.delegationProgram.ownPower = 0
node.payload.delegationProgram.usedPower = 0
}
} else {
node.payload.delegationProgram.programPower = 0
node.payload.delegationProgram.ownPower = 0
node.payload.delegationProgram.usedPower = 0
}
if (node.type === 'User Profile') {
return
}
if (node.payload.referenceParent !== undefined) {
resetProgram(node.payload.referenceParent)
return
}
let schemaDocument = getSchemaDocument(node)
if (schemaDocument === undefined) { return }
if (node.type === 'User Profile') {
return
}
if (node.payload.referenceParent !== undefined) {
resetNode(node.payload.referenceParent, generation + 1)
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]
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]
resetProgram(childNode)
}
break
case 'array': {
let propertyArray = node[property.name]
if (propertyArray !== undefined) {
for (let m = 0; m < propertyArray.length; m++) {
let childNode = propertyArray[m]
resetProgram(childNode)
switch (property.type) {
case 'node': {
let childNode = node[property.name]
resetNode(childNode, generation)
}
break
case 'array': {
let propertyArray = node[property.name]
if (propertyArray !== undefined) {
for (let m = 0; m < propertyArray.length; m++) {
let childNode = propertyArray[m]
resetNode(childNode, generation)
}
}
break
}
break
}
}
}
@@ -106,14 +115,18 @@ function newGovernanceFunctionLibraryDelegationProgram() {
The Own Power is the power generated by the same User Profile tokens, not inherited from others.
*/
programNode.payload.delegationProgram.ownPower = programPower
distributeProgramPower(programNode, programNode, programPower)
distributeProgramPower(programNode, programNode, programPower, undefined, 0)
function distributeProgramPower(
currentProgramNode,
node,
programPower,
percentage
percentage,
generation
) {
if (generation >= MAX_GENERATIONS) {
return
}
if (node === undefined) { return }
if (node.payload === undefined) { return }
if (node.payload.delegationProgram === undefined) { return }
@@ -138,7 +151,13 @@ function newGovernanceFunctionLibraryDelegationProgram() {
node.type === 'User Delegate'
) {
currentProgramNode.payload.delegationProgram.usedPower = currentProgramNode.payload.delegationProgram.usedPower + programPower
distributeProgramPower(currentProgramNode, node.payload.referenceParent, programPower / 10)
distributeProgramPower(
currentProgramNode,
node.payload.referenceParent,
programPower / 10,
undefined,
generation + 1
)
return
}
/*
@@ -214,7 +233,13 @@ function newGovernanceFunctionLibraryDelegationProgram() {
if (percentage === undefined || isNaN(percentage) === true) {
percentage = defaultPercentage
}
distributeProgramPower(currentProgramNode, childNode, programPower * percentage / 100, percentage)
distributeProgramPower(
currentProgramNode,
childNode,
programPower * percentage / 100,
percentage,
generation
)
}
break
case 'array': {
@@ -228,7 +253,13 @@ function newGovernanceFunctionLibraryDelegationProgram() {
if (percentage === undefined || isNaN(percentage) === true) {
percentage = defaultPercentage
}
distributeProgramPower(currentProgramNode, childNode, programPower * percentage / 100, percentage)
distributeProgramPower(
currentProgramNode,
childNode,
programPower * percentage / 100,
percentage,
generation
)
}
}
break
@@ -3,6 +3,7 @@ function newGovernanceFunctionLibraryVotingProgram() {
calculate: calculate,
installMissingVotes: installMissingVotes
}
const MAX_GENERATIONS = 10
return thisObject
@@ -71,100 +72,109 @@ function newGovernanceFunctionLibraryVotingProgram() {
)
function resetVotes(node) {
if (node === undefined) { return }
if (node.payload === undefined) { return }
if (node.payload.votingProgram === undefined) {
node.payload.votingProgram = {
votes: 0,
ownPower: 0,
incomingPower: 0,
usedPower: 0
}
} else {
node.payload.votingProgram.votes = 0
node.payload.votingProgram.ownPower = 0
node.payload.votingProgram.incomingPower = 0
node.payload.votingProgram.usedPower = 0
resetNode(node, 0)
}
function resetNode(node, generation) {
/*
When we reach certain node types, we will halt the distribution, because these are targets for
voting power.
*/
if (
node.type === 'Position' ||
node.type === 'Asset' ||
node.type === 'Feature' ||
node.type === 'Pool' ||
node.type === 'Position Contribution Claim' ||
node.type === 'Asset Contribution Claim' ||
node.type === 'Feature Contribution Claim'
) { return }
/*
For Votes to Profiles there is a special treamtment that needs to be done
so that votes can flow from Profiles to the Program without being affected
by Percentages.
*/
switch (node.type) {
case 'User Profile Vote': {
if (node.payload.referenceParent !== undefined) {
resetVotes(node.payload.referenceParent)
}
break
}
case 'User Profile': {
let program = UI.projects.governance.utilities.validations.onlyOneProgram(node, 'Voting Program')
if (program === undefined) { return }
if (program.payload === undefined) { return }
resetVotes(program)
if (generation >= MAX_GENERATIONS) {
return
}
}
/*
If there is a reference parent defined, this means that the voting power is
transfered to it and not distributed among children.
*/
if (
node.payload.referenceParent !== undefined &&
node.type !== 'Votes Switch' &&
node.type !== 'Claim Votes Switch' &&
node.type !== 'Weight Votes Switch'
) {
resetVotes(node.payload.referenceParent)
return
}
/*
Here we are inside the Voting Program, so we will crawl all it's children.
*/
let schemaDocument = getSchemaDocument(node)
if (schemaDocument === undefined) { return }
if (node === undefined) { return }
if (node.payload === undefined) { return }
if (node.payload.votingProgram === undefined) {
node.payload.votingProgram = {
votes: 0,
ownPower: 0,
incomingPower: 0,
usedPower: 0
}
} else {
node.payload.votingProgram.votes = 0
node.payload.votingProgram.ownPower = 0
node.payload.votingProgram.incomingPower = 0
node.payload.votingProgram.usedPower = 0
if (schemaDocument.childrenNodesProperties !== undefined) {
for (let i = 0; i < schemaDocument.childrenNodesProperties.length; i++) {
let property = schemaDocument.childrenNodesProperties[i]
if (node.type === 'User Profile' && property.name !== "votingProgram") { continue }
switch (property.type) {
case 'node': {
let childNode = node[property.name]
if (childNode === undefined) { continue }
if (childNode.type === 'Tokens Bonus') { continue }
resetVotes(childNode)
}
/*
When we reach certain node types, we will halt the distribution, because these are targets for
voting power.
*/
if (
node.type === 'Position' ||
node.type === 'Asset' ||
node.type === 'Feature' ||
node.type === 'Pool' ||
node.type === 'Position Contribution Claim' ||
node.type === 'Asset Contribution Claim' ||
node.type === 'Feature Contribution Claim'
) { return }
/*
For Votes to Profiles there is a special treamtment that needs to be done
so that votes can flow from Profiles to the Program without being affected
by Percentages.
*/
switch (node.type) {
case 'User Profile Vote': {
if (node.payload.referenceParent !== undefined) {
resetNode(node.payload.referenceParent, generation + 1)
return
}
break
case 'array': {
let propertyArray = node[property.name]
if (propertyArray !== undefined) {
for (let m = 0; m < propertyArray.length; m++) {
let childNode = propertyArray[m]
if (childNode.type === 'Tokens Bonus') { continue }
resetVotes(childNode)
break
}
case 'User Profile': {
let program = UI.projects.governance.utilities.validations.onlyOneProgram(node, 'Voting Program')
if (program === undefined) { return }
if (program.payload === undefined) { return }
resetNode(program, generation)
return
}
}
/*
If there is a reference parent defined, this means that the voting power is
transfered to it and not distributed among children.
*/
if (
node.payload.referenceParent !== undefined &&
node.type !== 'Votes Switch' &&
node.type !== 'Claim Votes Switch' &&
node.type !== 'Weight Votes Switch'
) {
resetNode(node.payload.referenceParent, generation)
return
}
/*
Here we are inside the Voting Program, so we will crawl all it's children.
*/
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]
if (node.type === 'User Profile' && property.name !== "votingProgram") { continue }
switch (property.type) {
case 'node': {
let childNode = node[property.name]
if (childNode === undefined) { continue }
if (childNode.type === 'Tokens Bonus') { continue }
resetNode(childNode, generation)
}
break
case 'array': {
let propertyArray = node[property.name]
if (propertyArray !== undefined) {
for (let m = 0; m < propertyArray.length; m++) {
let childNode = propertyArray[m]
if (childNode.type === 'Tokens Bonus') { continue }
resetNode(childNode, generation)
}
}
break
}
break
}
}
}
@@ -181,14 +191,18 @@ function newGovernanceFunctionLibraryVotingProgram() {
Set this initial votes as own power
*/
programNode.payload.votingProgram.ownPower = votes
distributeProgramPower(programNode, programNode, votes)
distributeProgramPower(programNode, programNode, votes, undefined, 0)
function distributeProgramPower(
currentProgramNode,
node,
votes,
percentage
percentage,
generation
) {
if (generation >= MAX_GENERATIONS) {
return
}
if (node === undefined) { return }
if (node.payload === undefined) { return }
if (node.payload.votingProgram === undefined) { return }
@@ -221,7 +235,13 @@ function newGovernanceFunctionLibraryVotingProgram() {
case 'User Profile Vote': {
if (node.payload.referenceParent !== undefined) {
currentProgramNode.payload.votingProgram.usedPower = currentProgramNode.payload.votingProgram.usedPower + votes
distributeProgramPower(currentProgramNode, node.payload.referenceParent, votes / 10)
distributeProgramPower(
currentProgramNode,
node.payload.referenceParent,
votes / 10,
undefined,
generation + 1
)
}
return
}
@@ -229,7 +249,13 @@ function newGovernanceFunctionLibraryVotingProgram() {
let program = UI.projects.governance.utilities.validations.onlyOneProgram(node, 'Voting Program')
if (program === undefined) { return }
if (program.payload === undefined) { return }
distributeProgramPower(currentProgramNode, program, votes)
distributeProgramPower(
currentProgramNode,
program,
votes,
undefined,
generation
)
return
}
}
@@ -244,7 +270,13 @@ function newGovernanceFunctionLibraryVotingProgram() {
node.type !== 'Weight Votes Switch'
) {
currentProgramNode.payload.votingProgram.usedPower = currentProgramNode.payload.votingProgram.usedPower + votes
distributeProgramPower(currentProgramNode, node.payload.referenceParent, votes)
distributeProgramPower(
currentProgramNode,
node.payload.referenceParent,
votes,
undefined,
generation
)
return
}
/*
@@ -320,7 +352,13 @@ function newGovernanceFunctionLibraryVotingProgram() {
if (percentage === undefined || isNaN(percentage) === true) {
percentage = defaultPercentage
}
distributeProgramPower(currentProgramNode, childNode, votes * percentage / 100, percentage)
distributeProgramPower(
currentProgramNode,
childNode,
votes * percentage / 100,
percentage,
generation
)
}
break
case 'array': {
@@ -334,7 +372,13 @@ function newGovernanceFunctionLibraryVotingProgram() {
if (percentage === undefined || isNaN(percentage) === true) {
percentage = defaultPercentage
}
distributeProgramPower(currentProgramNode, childNode, votes * percentage / 100, percentage)
distributeProgramPower(
currentProgramNode,
childNode,
votes * percentage / 100,
percentage,
generation
)
}
}
break
@@ -7,6 +7,7 @@ function newGovernanceUtilitiesDecendentProgram() {
let thisObject = {
run: run
}
const MAX_GENERATIONS = 10
return thisObject
@@ -87,65 +88,75 @@ function newGovernanceUtilitiesDecendentProgram() {
}
function resetProgram(node) {
if (node === undefined) { return }
if (node.payload === undefined) { return }
if (node.payload[programPropertyName] === undefined) {
node.payload[programPropertyName] = {
count: 0,
percentage: 0,
outgoingPower: 0,
ownPower: 0,
incomingPower: 0,
usedPower: 0,
awarded: {
resetNode(node, 0)
function resetNode(node, generation) {
if (generation >= MAX_GENERATIONS) {
return
}
if (node === undefined) { return }
if (node.payload === undefined) { return }
if (node.payload[programPropertyName] === undefined) {
node.payload[programPropertyName] = {
count: 0,
percentage: 0,
outgoingPower: 0,
ownPower: 0,
incomingPower: 0,
usedPower: 0,
awarded: {
tokens: 0,
percentage: 0
}
}
} else {
node.payload[programPropertyName].count = 0
node.payload[programPropertyName].percentage = 0
node.payload[programPropertyName].outgoingPower = 0
node.payload[programPropertyName].ownPower = 0
node.payload[programPropertyName].incomingPower = 0
node.payload[programPropertyName].usedPower = 0
node.payload[programPropertyName].awarded = {
tokens: 0,
percentage: 0
}
}
} else {
node.payload[programPropertyName].count = 0
node.payload[programPropertyName].percentage = 0
node.payload[programPropertyName].outgoingPower = 0
node.payload[programPropertyName].ownPower = 0
node.payload[programPropertyName].incomingPower = 0
node.payload[programPropertyName].usedPower = 0
node.payload[programPropertyName].awarded = {
tokens: 0,
percentage: 0
if (
node.type === 'User Profile' &&
node.tokenPowerSwitch !== undefined
) {
resetNode(node.tokenPowerSwitch, generation)
return
}
}
if (
node.type === 'User Profile' &&
node.tokenPowerSwitch !== undefined
) {
resetProgram(node.tokenPowerSwitch)
return
}
if (
node.type === 'Token Power Switch' &&
node[programPropertyName] !== undefined
) {
resetProgram(node[programPropertyName])
return
}
if (
node.type === programNodeType &&
node[usersArrayPropertyName] !== undefined
) {
for (let i = 0; i < node[usersArrayPropertyName].length; i++) {
resetProgram(node[usersArrayPropertyName][i])
if (
node.type === 'Token Power Switch' &&
node[programPropertyName] !== undefined
) {
resetNode(node[programPropertyName], generation)
return
}
if (
node.type === programNodeType &&
node[usersArrayPropertyName] !== undefined
) {
for (let i = 0; i < node[usersArrayPropertyName].length; i++) {
resetNode(node[usersArrayPropertyName][i], generation)
}
return
}
if (
node.type === userNodeType &&
node.payload.referenceParent !== undefined
) {
resetNode(node.payload.referenceParent, generation + 1)
return
}
return
}
if (
node.type === userNodeType &&
node.payload.referenceParent !== undefined
) {
resetProgram(node.payload.referenceParent)
return
}
}
function validateProgram(node, userProfile) {
/*
This program is not going to run unless the Profile has Tokens, and for
@@ -185,6 +196,7 @@ function newGovernanceUtilitiesDecendentProgram() {
}
function distributeProgram(programNode) {
if (programNode === undefined || programNode.payload === undefined) { return }
/*
Here we will convert Token Power into programPower.
@@ -200,15 +212,19 @@ function newGovernanceUtilitiesDecendentProgram() {
*/
programNode.payload[programPropertyName].ownPower = programPower
distributeProgramPower(programNode, programNode, programPower, count)
distributeProgramPower(programNode, programNode, programPower, count, undefined, 0)
function distributeProgramPower(
currentProgramNode,
node,
programPower,
count,
percentage
percentage,
generation
) {
if (generation >= MAX_GENERATIONS) {
return
}
if (node === undefined) { return }
if (node.payload === undefined) { return }
if (node.payload[programPropertyName] === undefined) { return }
@@ -281,7 +297,14 @@ function newGovernanceUtilitiesDecendentProgram() {
if (percentage === undefined || isNaN(percentage) === true) {
percentage = defaultPercentage
}
distributeProgramPower(currentProgramNode, childNode, programPower * percentage / 100, 0, percentage)
distributeProgramPower(
currentProgramNode,
childNode,
programPower * percentage / 100,
0,
percentage,
generation
)
}
}
return
@@ -299,7 +322,14 @@ function newGovernanceUtilitiesDecendentProgram() {
currentProgramNode.payload[programPropertyName].usedPower = currentProgramNode.payload[programPropertyName].usedPower - previousOutgoing
currentProgramNode.payload[programPropertyName].usedPower = currentProgramNode.payload[programPropertyName].usedPower + node.payload[programPropertyName].outgoingPower
distributeProgramPower(currentProgramNode, node.payload.referenceParent, programPower / 10, 0)
distributeProgramPower(
currentProgramNode,
node.payload.referenceParent,
programPower / 10,
0,
undefined,
generation + 1
)
}
return
}
@@ -309,7 +339,13 @@ function newGovernanceUtilitiesDecendentProgram() {
if (program.payload === undefined) { return }
if (program.payload[programPropertyName].isActive === false) { return }
distributeProgramPower(program, program, programPower, 0)
distributeProgramPower(
program,
program,
programPower,
0,
undefined,
generation)
return
}
}