Claims, Votes, Staking and Delegation Reports Implemented

This commit is contained in:
Luis Fernando Molina committed 2021-07-19 09:12:01 +02:00
1 parent 0f93ec2b24
commit 81538898b2
17 files changed
+588 -46

No files matched your search

+5 -1
View File
@@ -880,7 +880,11 @@
#governance-tab5:checked ~ .governance-search-result-content #content5,
#governance-tab6:checked ~ .governance-search-result-content #content6,
#governance-tab7:checked ~ .governance-search-result-content #content7,
#governance-tab8:checked ~ .governance-search-result-content #content8 {
#governance-tab8:checked ~ .governance-search-result-content #content8,
#governance-tab9:checked ~ .governance-search-result-content #content9,
#governance-tab10:checked ~ .governance-search-result-content #content10,
#governance-tab11:checked ~ .governance-search-result-content #content11,
#governance-tab12:checked ~ .governance-search-result-content #content12 {
display: block;
}
@@ -1089,7 +1089,7 @@
}
}
},
"stackingProgram": {
"stakingProgram": {
"type": "Staking Program",
"name": "New Staking Program",
"config": "{}",
@@ -3797,11 +3797,11 @@
},
{
"type": "Token Power Switch",
"name": "Stacking",
"name": "Staking",
"config": "{}",
"project": "Governance",
"tokenPowerSwitch": [],
"stackingProgram": {
"stakingProgram": {
"type": "Staking Program",
"name": "New Staking Program",
"config": "{}",
@@ -851,7 +851,7 @@
"config": "{\n \"percentage\": 10\n}",
"project": "Governance",
"tokenPowerSwitch": [],
"stackingProgram": {
"stakingProgram": {
"type": "Staking Program",
"name": "New Staking Program",
"config": "{}",
@@ -39,7 +39,7 @@
},
"addLeftIcons": true,
"level": 1,
"propertyNameAtParent": "stackingProgram",
"propertyNameAtParent": "stakingProgram",
"childrenNodesProperties": [
{
"name": "tokensAwarded",
@@ -65,7 +65,7 @@
"actionProject": "Foundations",
"actionFunction": "payload.executeAction",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "stackingProgram",
"propertyToCheckFor": "stakingProgram",
"label": "Add Staking Program",
"relatedUiObject": "Staking Program"
},
@@ -139,7 +139,7 @@
"autoAdd": false
},
{
"name": "stackingProgram",
"name": "stakingProgram",
"type": "node",
"childType": "Staking Program",
"autoAdd": false
@@ -47,9 +47,14 @@ function newGovernanceFunctionLibraryDelegationProgram() {
function resetProgram(node) {
if (node === undefined) { return }
if (node.payload === undefined) { return }
node.payload.delegationProgram = {
programPower: 0,
ownPower: 0
if (node.payload.delegationProgram === undefined) {
node.payload.delegationProgram = {
programPower: 0,
ownPower: 0
}
} else {
node.payload.delegationProgram.programPower = 0
node.payload.delegationProgram.ownPower = 0
}
if (node.type === 'User Profile') {
@@ -69,7 +69,7 @@ function newGovernanceFunctionLibraryDistributionProcess() {
userProfiles
)
UI.projects.governance.functionLibraries.stackingProgram.calculate(
UI.projects.governance.functionLibraries.stakingProgram.calculate(
pools,
userProfiles
)
@@ -1,4 +1,4 @@
function newGovernanceFunctionLibraryStackingProgram() {
function newGovernanceFunctionLibraryStakingProgram() {
let thisObject = {
calculate: calculate
}
@@ -12,7 +12,7 @@ function newGovernanceFunctionLibraryStackingProgram() {
let programPoolTokenReward
/*
In order to be able to calculate the share of the Program Pool for each User Profile,
we need to accumulate all the Stacking Power that each User Profile at their Program
we need to accumulate all the Staking Power that each User Profile at their Program
node has, because with that Power is that each Program node gets a share of the pool.
*/
let accumulatedProgramPower = 0
@@ -51,7 +51,7 @@ function newGovernanceFunctionLibraryStackingProgram() {
let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, "Staking Program")
if (program === undefined) { continue }
if (program.payload === undefined) { continue }
if (program.payload.stackingProgram.isActive === false) { continue }
if (program.payload.stakingProgram.isActive === false) { continue }
distributeProgram(program)
}
@@ -62,7 +62,7 @@ function newGovernanceFunctionLibraryStackingProgram() {
let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, "Staking Program")
if (program === undefined) { continue }
if (program.payload === undefined) { continue }
if (program.payload.stackingProgram.isActive === false) { continue }
if (program.payload.stakingProgram.isActive === false) { continue }
calculateProgram(program)
}
@@ -70,13 +70,25 @@ function newGovernanceFunctionLibraryStackingProgram() {
function resetProgram(node) {
if (node === undefined) { return }
if (node.payload === undefined) { return }
node.payload.stackingProgram = {
count: 0,
percentage: 0,
outgoingPower: 0,
ownPower: 0,
incomingPower: 0,
awarded: {
if (node.payload.stakingProgram === undefined) {
node.payload.stakingProgram = {
count: 0,
percentage: 0,
outgoingPower: 0,
ownPower: 0,
incomingPower: 0,
awarded: {
tokens: 0,
percentage: 0
}
}
} else {
node.payload.stakingProgram.count = 0
node.payload.stakingProgram.percentage = 0
node.payload.stakingProgram.outgoingPower = 0
node.payload.stakingProgram.ownPower = 0
node.payload.stakingProgram.incomingPower = 0
node.payload.stakingProgram.awarded = {
tokens: 0,
percentage: 0
}
@@ -92,21 +104,21 @@ function newGovernanceFunctionLibraryStackingProgram() {
if (
userProfile.payload.blockchainTokens === undefined
) {
node.payload.stackingProgram.isActive = false
node.payload.stakingProgram.isActive = false
userProfile.payload.uiObject.setErrorMessage("You need to setup this profile with the Profile Constructor, to access the Token Power of your account at the Blockchain.")
return
}
node.payload.stackingProgram.isActive = true
node.payload.stakingProgram.isActive = true
}
function distributeProgram(programNode) {
if (programNode === undefined || programNode.payload === undefined) { return }
/*
Here we will convert Token Power into Stacking Power.
As per system rules Stacking Powar = tokensPower
Here we will convert Token Power into Staking Power.
As per system rules Staking Powar = tokensPower
*/
let programPower = programNode.payload.tokenPower
programNode.payload.stackingProgram.ownPower = programPower
programNode.payload.stakingProgram.ownPower = programPower
accumulatedProgramPower = accumulatedProgramPower + programPower
}
@@ -132,7 +144,7 @@ function newGovernanceFunctionLibraryStackingProgram() {
programNode.payload.uiObject.setErrorMessage("Tokens Awarded Node is needed in order for this Program to get Tokens from the Program Pool.")
return
}
programNode.payload.stackingProgram.awarded.tokens = programNode.payload.stackingProgram.ownPower * totalPowerRewardRatio
programNode.payload.stakingProgram.awarded.tokens = programNode.payload.stakingProgram.ownPower * totalPowerRewardRatio
drawProgram(programNode)
}
@@ -140,7 +152,7 @@ function newGovernanceFunctionLibraryStackingProgram() {
function drawProgram(node) {
if (node.payload !== undefined) {
const ownPowerText = parseFloat(node.payload.stackingProgram.ownPower.toFixed(2)).toLocaleString('en')
const ownPowerText = parseFloat(node.payload.stakingProgram.ownPower.toFixed(2)).toLocaleString('en')
node.payload.uiObject.statusAngleOffset = 0
node.payload.uiObject.statusAtAngle = false
@@ -149,7 +161,7 @@ function newGovernanceFunctionLibraryStackingProgram() {
}
if (node.tokensAwarded !== undefined && node.tokensAwarded.payload !== undefined) {
const tokensAwardedText = parseFloat(node.payload.stackingProgram.awarded.tokens.toFixed(2)).toLocaleString('en')
const tokensAwardedText = parseFloat(node.payload.stakingProgram.awarded.tokens.toFixed(2)).toLocaleString('en')
node.tokensAwarded.payload.uiObject.valueAngleOffset = 0
node.tokensAwarded.payload.uiObject.valueAtAngle = false
@@ -73,11 +73,18 @@ function newGovernanceFunctionLibraryVotingProgram() {
function resetVotes(node) {
if (node === undefined) { return }
if (node.payload === undefined) { return }
node.payload.votingProgram = {
votes: 0,
ownPower: 0,
incomingPower: 0
if (node.payload.votingProgram === undefined) {
node.payload.votingProgram = {
votes: 0,
ownPower: 0,
incomingPower: 0
}
} else {
node.payload.votingProgram.votes = 0
node.payload.votingProgram.ownPower = 0
node.payload.votingProgram.incomingPower = 0
}
/*
When we reach certain node types, we will halt the distribution, because these are targets for
voting power.
@@ -0,0 +1,112 @@
function newGovernanceReportsClaims() {
let thisObject = {
addHTML: addHTML,
initialize: initialize,
finalize: finalize
}
return thisObject
function initialize() {
}
function finalize() {
}
function addHTML(tabIndex, filters) {
/*
Parameters
*/
let table = 'claims'
let programName = 'Claims Program'
let programPropertyName = 'claimsProgram'
/*
Setup Filters
*/
let filtersObject
if (filters !== undefined) {
try {
filtersObject = JSON.parse(filters)
} catch (err) { }
}
/*
Other Variables
*/
let tableRecords = []
let tableRecordDefinition = {
"properties": [
{
"name": "name",
"label": "User Profile",
"type": "string",
"order": "ascending",
"textAlign": "left"
},
{
"name": "ownPower",
"label": "Claims Power",
"type": "number",
"order": "descending",
"textAlign": "center",
"format": "2 decimals"
},
{
"name": "tokensAwarded",
"label": "Awarded",
"type": "number",
"order": "descending",
"textAlign": "center",
"format": "2 decimals"
}
]
}
/*
Here we get from the workspace all User Profiles.
*/
let userProfiles = UI.projects.foundations.spaces.designSpace.workspace.getHierarchyHeadsByNodeType('User Profile')
/*
Transform the result array into table records.
*/
for (let j = 0; j < userProfiles.length; j++) {
let userProfile = userProfiles[j]
if (userProfile.tokenPowerSwitch === undefined) { continue }
let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, programName)
if (program === undefined) { continue }
if (program.payload === undefined) { continue }
let tableRecord = {
"name": userProfile.name,
"ownPower": program.payload[programPropertyName].ownPower | 0,
"tokensAwarded": program.payload[programPropertyName].awarded.tokens | 0
}
if (UI.projects.governance.utilities.filters.applyFilters(filters, filtersObject, tableRecord) === true) {
tableRecords.push(tableRecord)
}
}
/*
Get the sorting order for this table.
*/
let sortingOrder = UI.projects.governance.spaces.reportsSpace.tablesSortingOrders[table]
/*
Set the default sorting order for this table.
*/
if (sortingOrder === undefined) {
UI.projects.governance.spaces.reportsSpace.tablesSortingOrders[table] = {
property: 'tokensAwarded',
order: 'descending'
}
sortingOrder = UI.projects.governance.spaces.reportsSpace.tablesSortingOrders[table]
}
return UI.projects.governance.utilities.tables.addHTML(
table,
tableRecords,
tableRecordDefinition,
sortingOrder,
tabIndex
)
}
}
@@ -0,0 +1,112 @@
function newGovernanceReportsDelegation() {
let thisObject = {
addHTML: addHTML,
initialize: initialize,
finalize: finalize
}
return thisObject
function initialize() {
}
function finalize() {
}
function addHTML(tabIndex, filters) {
/*
Parameters
*/
let table = 'delegation'
let programName = 'Delegation Program'
let programPropertyName = 'delegationProgram'
/*
Setup Filters
*/
let filtersObject
if (filters !== undefined) {
try {
filtersObject = JSON.parse(filters)
} catch (err) { }
}
/*
Other Variables
*/
let tableRecords = []
let tableRecordDefinition = {
"properties": [
{
"name": "name",
"label": "User Profile",
"type": "string",
"order": "ascending",
"textAlign": "left"
},
{
"name": "ownPower",
"label": "Delegate Power",
"type": "number",
"order": "descending",
"textAlign": "center",
"format": "2 decimals"
},
{
"name": "tokensBonus",
"label": "Bonus",
"type": "number",
"order": "descending",
"textAlign": "center",
"format": "2 decimals"
}
]
}
/*
Here we get from the workspace all User Profiles.
*/
let userProfiles = UI.projects.foundations.spaces.designSpace.workspace.getHierarchyHeadsByNodeType('User Profile')
/*
Transform the result array into table records.
*/
for (let j = 0; j < userProfiles.length; j++) {
let userProfile = userProfiles[j]
if (userProfile.tokenPowerSwitch === undefined) { continue }
let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, programName)
if (program === undefined) { continue }
if (program.payload === undefined) { continue }
let tableRecord = {
"name": userProfile.name,
"ownPower": program.payload[programPropertyName].ownPower | 0,
"tokensBonus": program.payload[programPropertyName].bonus.tokens | 0
}
if (UI.projects.governance.utilities.filters.applyFilters(filters, filtersObject, tableRecord) === true) {
tableRecords.push(tableRecord)
}
}
/*
Get the sorting order for this table.
*/
let sortingOrder = UI.projects.governance.spaces.reportsSpace.tablesSortingOrders[table]
/*
Set the default sorting order for this table.
*/
if (sortingOrder === undefined) {
UI.projects.governance.spaces.reportsSpace.tablesSortingOrders[table] = {
property: 'tokensBonus',
order: 'descending'
}
sortingOrder = UI.projects.governance.spaces.reportsSpace.tablesSortingOrders[table]
}
return UI.projects.governance.utilities.tables.addHTML(
table,
tableRecords,
tableRecordDefinition,
sortingOrder,
tabIndex
)
}
}
@@ -5,7 +5,7 @@ function newGovernanceReportsReportsPage() {
finalize: finalize
}
let lastTabIndex
let lastTabIndex
return thisObject
function initialize() {
@@ -17,20 +17,20 @@ function newGovernanceReportsReportsPage() {
}
function render(tabIndex, filters) {
/* Setup tabIndex */
if (tabIndex === undefined) {
tabIndex = lastTabIndex
} else {
lastTabIndex = tabIndex
}
let resultsArary = []
let initialTime = new Date()
buildHTML()
function buildHTML() {
const tabs = ['Profiles', 'Referrals', 'Supporters', 'Mentors', 'Pools', 'Assets', 'Features', 'Positions']
const tabs = ['Profiles', 'Referrals', 'Supporters', 'Mentors', 'Claims', 'Votes', 'Staking', 'Delegation', 'Pools', 'Assets', 'Features', 'Positions']
let HTML = ''
HTML = HTML + '<section id="governance-report-page-div" class="governance-search-page-container">'
HTML = HTML + UI.projects.governance.spaces.reportsSpace.filtersHeader.addFilterHeader()
@@ -80,26 +80,50 @@ function newGovernanceReportsReportsPage() {
resultCounter = response.resultCounter
break
}
case 'Claims': {
let response = UI.projects.governance.spaces.reportsSpace.claims.addHTML(5, filters)
HTML = HTML + response.HTML
resultCounter = response.resultCounter
break
}
case 'Votes': {
let response = UI.projects.governance.spaces.reportsSpace.votes.addHTML(6, filters)
HTML = HTML + response.HTML
resultCounter = response.resultCounter
break
}
case 'Staking': {
let response = UI.projects.governance.spaces.reportsSpace.staking.addHTML(7, filters)
HTML = HTML + response.HTML
resultCounter = response.resultCounter
break
}
case 'Delegation': {
let response = UI.projects.governance.spaces.reportsSpace.delegation.addHTML(8, filters)
HTML = HTML + response.HTML
resultCounter = response.resultCounter
break
}
case 'Pools': {
let response = UI.projects.governance.spaces.reportsSpace.pools.addHTML(5, filters)
let response = UI.projects.governance.spaces.reportsSpace.pools.addHTML(9, filters)
HTML = HTML + response.HTML
resultCounter = response.resultCounter
break
}
case 'Assets': {
let response = UI.projects.governance.spaces.reportsSpace.assets.addHTML(6, filters)
let response = UI.projects.governance.spaces.reportsSpace.assets.addHTML(10, filters)
HTML = HTML + response.HTML
resultCounter = response.resultCounter
break
}
case 'Features': {
let response = UI.projects.governance.spaces.reportsSpace.features.addHTML(7, filters)
let response = UI.projects.governance.spaces.reportsSpace.features.addHTML(11, filters)
HTML = HTML + response.HTML
resultCounter = response.resultCounter
break
}
case 'Positions': {
let response = UI.projects.governance.spaces.reportsSpace.positions.addHTML(8, filters)
let response = UI.projects.governance.spaces.reportsSpace.positions.addHTML(12, filters)
HTML = HTML + response.HTML
resultCounter = response.resultCounter
break
@@ -11,6 +11,10 @@ function newGobernanceReportsSpace() {
referrals: undefined,
supports: undefined,
mentors: undefined,
claims: undefined,
votes: undefined,
staking: undefined,
delegations: undefined,
pools: undefined,
assets: undefined,
features: undefined,
@@ -68,6 +72,18 @@ function newGobernanceReportsSpace() {
thisObject.mentors.finalize()
thisObject.mentors = undefined
thisObject.claims.finalize()
thisObject.claims = undefined
thisObject.votes.finalize()
thisObject.votes = undefined
thisObject.staking.finalize()
thisObject.staking = undefined
thisObject.delegation.finalize()
thisObject.delegation = undefined
thisObject.pools.finalize()
thisObject.pools = undefined
@@ -104,6 +120,10 @@ function newGobernanceReportsSpace() {
thisObject.referrals = newGovernanceReportsReferrals()
thisObject.supports = newGovernanceReportsSupports()
thisObject.mentors = newGovernanceReportsMentors()
thisObject.claims = newGovernanceReportsClaims()
thisObject.votes = newGovernanceReportsVotes()
thisObject.staking = newGovernanceReportsStaking()
thisObject.delegation = newGovernanceReportsDelegation()
thisObject.pools = newGovernanceReportsPools()
thisObject.assets = newGovernanceReportsAssets()
thisObject.features = newGovernanceReportsFeatures()
@@ -115,6 +135,10 @@ function newGobernanceReportsSpace() {
thisObject.userProfiles.initialize()
thisObject.referrals.initialize()
thisObject.mentors.initialize()
thisObject.claims.initialize()
thisObject.votes.initialize()
thisObject.staking.initialize()
thisObject.delegation.initialize()
thisObject.pools.initialize()
thisObject.assets.initialize()
thisObject.features.initialize()
@@ -0,0 +1,121 @@
function newGovernanceReportsStaking() {
let thisObject = {
addHTML: addHTML,
initialize: initialize,
finalize: finalize
}
return thisObject
function initialize() {
}
function finalize() {
}
function addHTML(tabIndex, filters) {
/*
Parameters
*/
let table = 'staking'
let programName = 'Staking Program'
let programPropertyName = 'stakingProgram'
/*
Setup Filters
*/
let filtersObject
if (filters !== undefined) {
try {
filtersObject = JSON.parse(filters)
} catch (err) { }
}
/*
Other Variables
*/
let tableRecords = []
let tableRecordDefinition = {
"properties": [
{
"name": "name",
"label": "User Profile",
"type": "string",
"order": "ascending",
"textAlign": "left"
},
{
"name": "ownPower",
"label": "Own Power",
"type": "number",
"order": "descending",
"textAlign": "center",
"format": "2 decimals"
},
{
"name": "incoming",
"label": "Incoming",
"type": "number",
"order": "descending",
"textAlign": "center",
"format": "2 decimals"
},
{
"name": "tokensAwarded",
"label": "Awarded",
"type": "number",
"order": "descending",
"textAlign": "center",
"format": "2 decimals"
}
]
}
/*
Here we get from the workspace all User Profiles.
*/
let userProfiles = UI.projects.foundations.spaces.designSpace.workspace.getHierarchyHeadsByNodeType('User Profile')
/*
Transform the result array into table records.
*/
for (let j = 0; j < userProfiles.length; j++) {
let userProfile = userProfiles[j]
if (userProfile.tokenPowerSwitch === undefined) { continue }
let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, programName)
if (program === undefined) { continue }
if (program.payload === undefined) { continue }
let tableRecord = {
"name": userProfile.name,
"ownPower": program.payload[programPropertyName].ownPower | 0,
"incoming": program.payload[programPropertyName].incomingPower | 0,
"tokensAwarded": program.payload[programPropertyName].awarded.tokens | 0
}
if (UI.projects.governance.utilities.filters.applyFilters(filters, filtersObject, tableRecord) === true) {
tableRecords.push(tableRecord)
}
}
/*
Get the sorting order for this table.
*/
let sortingOrder = UI.projects.governance.spaces.reportsSpace.tablesSortingOrders[table]
/*
Set the default sorting order for this table.
*/
if (sortingOrder === undefined) {
UI.projects.governance.spaces.reportsSpace.tablesSortingOrders[table] = {
property: 'tokensAwarded',
order: 'descending'
}
sortingOrder = UI.projects.governance.spaces.reportsSpace.tablesSortingOrders[table]
}
return UI.projects.governance.utilities.tables.addHTML(
table,
tableRecords,
tableRecordDefinition,
sortingOrder,
tabIndex
)
}
}
@@ -0,0 +1,121 @@
function newGovernanceReportsVotes() {
let thisObject = {
addHTML: addHTML,
initialize: initialize,
finalize: finalize
}
return thisObject
function initialize() {
}
function finalize() {
}
function addHTML(tabIndex, filters) {
/*
Parameters
*/
let table = 'votes'
let programName = 'Voting Program'
let programPropertyName = 'votingProgram'
/*
Setup Filters
*/
let filtersObject
if (filters !== undefined) {
try {
filtersObject = JSON.parse(filters)
} catch (err) { }
}
/*
Other Variables
*/
let tableRecords = []
let tableRecordDefinition = {
"properties": [
{
"name": "name",
"label": "User Profile",
"type": "string",
"order": "ascending",
"textAlign": "left"
},
{
"name": "ownPower",
"label": "Own Power",
"type": "number",
"order": "descending",
"textAlign": "center",
"format": "2 decimals"
},
{
"name": "incoming",
"label": "Incoming",
"type": "number",
"order": "descending",
"textAlign": "center",
"format": "2 decimals"
},
{
"name": "tokensBonus",
"label": "Bonus",
"type": "number",
"order": "descending",
"textAlign": "center",
"format": "2 decimals"
}
]
}
/*
Here we get from the workspace all User Profiles.
*/
let userProfiles = UI.projects.foundations.spaces.designSpace.workspace.getHierarchyHeadsByNodeType('User Profile')
/*
Transform the result array into table records.
*/
for (let j = 0; j < userProfiles.length; j++) {
let userProfile = userProfiles[j]
if (userProfile.tokenPowerSwitch === undefined) { continue }
let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, programName)
if (program === undefined) { continue }
if (program.payload === undefined) { continue }
let tableRecord = {
"name": userProfile.name,
"ownPower": program.payload[programPropertyName].ownPower | 0,
"incoming": program.payload[programPropertyName].incomingPower | 0,
"tokensBonus": program.payload[programPropertyName].bonus.tokens | 0
}
if (UI.projects.governance.utilities.filters.applyFilters(filters, filtersObject, tableRecord) === true) {
tableRecords.push(tableRecord)
}
}
/*
Get the sorting order for this table.
*/
let sortingOrder = UI.projects.governance.spaces.reportsSpace.tablesSortingOrders[table]
/*
Set the default sorting order for this table.
*/
if (sortingOrder === undefined) {
UI.projects.governance.spaces.reportsSpace.tablesSortingOrders[table] = {
property: 'tokensBonus',
order: 'descending'
}
sortingOrder = UI.projects.governance.spaces.reportsSpace.tablesSortingOrders[table]
}
return UI.projects.governance.utilities.tables.addHTML(
table,
tableRecords,
tableRecordDefinition,
sortingOrder,
tabIndex
)
}
}
+3 -3
View File
@@ -1038,9 +1038,9 @@
"functionName": "newGovernanceFunctionLibraryMentorshipProgram"
},
{
"name": "Stacking Program",
"propertyName": "stackingProgram",
"functionName": "newGovernanceFunctionLibraryStackingProgram"
"name": "Staking Program",
"propertyName": "stakingProgram",
"functionName": "newGovernanceFunctionLibraryStakingProgram"
},
{
"name": "Profile Constructor",