Liquidity Program added
This commit is contained in:
1 parent
32496a9059
commit
7a1b1f7ff0
8 files changed
+873
-288
No files matched your search
Binary file not shown.
|
After Width: | Height: | Size: 8.0 KiB |
@@ -295,11 +295,11 @@
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 16657.465367689296,
|
||||
"y": 44560.21626285766
|
||||
"y": 44561.21626285766
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 16445.333333333332,
|
||||
"y": 44772.348297213626
|
||||
"y": 44773.348297213626
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -448,11 +448,11 @@
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 16745.333333333332,
|
||||
"y": 44772.348297213626
|
||||
"y": 44773.348297213626
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 16445.333333333332,
|
||||
"y": 44772.348297213626
|
||||
"y": 44773.348297213626
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -483,12 +483,12 @@
|
||||
"id": "5bd09ac2-6c9f-4a7d-a547-c05a8a1e98e2",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 16953.771869867836,
|
||||
"y": 44937.549992057524
|
||||
"x": 16947.243115576017,
|
||||
"y": 44907.83461803883
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 16657.465367689296,
|
||||
"y": 44984.48033156959
|
||||
"y": 44985.48033156959
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -520,12 +520,12 @@
|
||||
"id": "9eb846a4-effb-4380-9487-1a82011b0488",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 17192.069282202316,
|
||||
"y": 45256.87463141332
|
||||
"x": 17237.020863462738,
|
||||
"y": 45140.771758631105
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 16924.767324945806,
|
||||
"y": 45120.67748149145
|
||||
"x": 16947.243115576017,
|
||||
"y": 45063.12604510035
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -544,12 +544,12 @@
|
||||
"id": "80d4f08f-bb7f-48a2-9cef-be12befcac2e",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 16924.767324945806,
|
||||
"y": 45120.67748149145
|
||||
"x": 16947.243115576017,
|
||||
"y": 45063.12604510035
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 16657.465367689296,
|
||||
"y": 44984.48033156959
|
||||
"y": 44985.48033156959
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -581,12 +581,12 @@
|
||||
"id": "d2cf4c65-b4bd-4fa8-b0da-f73a38b8419a",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 16929.859667533023,
|
||||
"y": 45519.08424608261
|
||||
"x": 17081.729436401223,
|
||||
"y": 45409.74440028152
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 16793.66251761116,
|
||||
"y": 45251.7822888261
|
||||
"x": 16869.59740204526,
|
||||
"y": 45197.61236592555
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -605,12 +605,73 @@
|
||||
"id": "68e3f570-4156-4be6-8881-c526a06f85d0",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 16793.66251761116,
|
||||
"y": 45251.7822888261
|
||||
"x": 16869.59740204526,
|
||||
"y": 45197.61236592555
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 16657.465367689296,
|
||||
"y": 44984.48033156959
|
||||
"y": 44985.48033156959
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
"isFrozen": false,
|
||||
"isCollapsed": false,
|
||||
"angleToParent": 2,
|
||||
"distanceToParent": 3,
|
||||
"arrangementStyle": 0
|
||||
},
|
||||
"uiObject": {
|
||||
"isRunning": false
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "Pool Class",
|
||||
"name": "Liquidity Program",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"poolClasses": [],
|
||||
"pools": [
|
||||
{
|
||||
"type": "Pool",
|
||||
"name": "Liquidity Rewards",
|
||||
"config": "{\n \"codeName\": \"Liquidity-Rewards\"\n}",
|
||||
"project": "Governance",
|
||||
"poolClasses": [],
|
||||
"pools": [],
|
||||
"id": "a7651e92-ab96-49fc-af9c-f936682dd7a4",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 16812.75679475081,
|
||||
"y": 45565.03582734303
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 16735.111081220053,
|
||||
"y": 45275.25807945631
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
"isFrozen": false,
|
||||
"isCollapsed": false,
|
||||
"angleToParent": 2,
|
||||
"distanceToParent": 3,
|
||||
"arrangementStyle": 0
|
||||
},
|
||||
"uiObject": {
|
||||
"isRunning": false
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"id": "477faa7a-da4f-4949-9439-a2475ed683de",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 16735.111081220053,
|
||||
"y": 45275.25807945631
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 16657.465367689296,
|
||||
"y": 44985.48033156959
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -642,12 +703,12 @@
|
||||
"id": "24e62dd3-4d7b-4eba-b401-493c155d85d0",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 16563.604688665157,
|
||||
"y": 45577.09333592668
|
||||
"x": 16502.17394062778,
|
||||
"y": 45565.03582734303
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 16610.535028177226,
|
||||
"y": 45280.786833748134
|
||||
"x": 16579.81965415854,
|
||||
"y": 45275.25807945631
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -666,12 +727,12 @@
|
||||
"id": "f09429a2-3f6c-4210-bb73-0c8efd254c82",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 16610.535028177226,
|
||||
"y": 45280.786833748134
|
||||
"x": 16579.81965415854,
|
||||
"y": 45275.25807945631
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 16657.465367689296,
|
||||
"y": 44984.48033156959
|
||||
"y": 44985.48033156959
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -692,11 +753,11 @@
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 16657.465367689296,
|
||||
"y": 44984.48033156959
|
||||
"y": 44985.48033156959
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 16445.333333333332,
|
||||
"y": 44772.348297213626
|
||||
"y": 44773.348297213626
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -717,11 +778,11 @@
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 16445.333333333332,
|
||||
"y": 44772.348297213626
|
||||
"y": 44773.348297213626
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 16145.333333333332,
|
||||
"y": 44772.348297213626
|
||||
"y": 44773.348297213626
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -754,11 +815,11 @@
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 15633.201298977368,
|
||||
"y": 44984.48033156959
|
||||
"y": 44985.48033156959
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 15845.333333333332,
|
||||
"y": 44772.348297213626
|
||||
"y": 44773.348297213626
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -797,11 +858,11 @@
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 15545.333333333332,
|
||||
"y": 44772.348297213626
|
||||
"y": 44773.348297213626
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 15845.333333333332,
|
||||
"y": 44772.348297213626
|
||||
"y": 44773.348297213626
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -840,11 +901,11 @@
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 15633.201298977368,
|
||||
"y": 44560.21626285766
|
||||
"y": 44561.21626285766
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 15845.333333333332,
|
||||
"y": 44772.348297213626
|
||||
"y": 44773.348297213626
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -877,11 +938,11 @@
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 15845.333333333332,
|
||||
"y": 44772.348297213626
|
||||
"y": 44773.348297213626
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 16145.333333333332,
|
||||
"y": 44772.348297213626
|
||||
"y": 44773.348297213626
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -902,11 +963,11 @@
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 16145.333333333332,
|
||||
"y": 44772.348297213626
|
||||
"y": 44773.348297213626
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 16145.333333333332,
|
||||
"y": 44772.348297213626
|
||||
"y": 44773.348297213626
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -18,6 +18,16 @@
|
||||
"relatedUiObject": "Staking Program",
|
||||
"relatedUiObjectProject": "Governance"
|
||||
},
|
||||
{
|
||||
"action": "Add UI Object",
|
||||
"actionProject": "Visual-Scripting",
|
||||
"actionFunction": "payload.executeAction",
|
||||
"disableIfPropertyIsDefined": true,
|
||||
"propertyToCheckFor": "stakingProgram",
|
||||
"label": "Add Liquidity Program",
|
||||
"relatedUiObject": "Liquidity Program",
|
||||
"relatedUiObjectProject": "Governance"
|
||||
},
|
||||
{
|
||||
"action": "Add UI Object",
|
||||
"actionProject": "Visual-Scripting",
|
||||
@@ -58,6 +68,12 @@
|
||||
"childType": "Staking Program",
|
||||
"autoAdd": false
|
||||
},
|
||||
{
|
||||
"name": "liquidityProgram",
|
||||
"type": "node",
|
||||
"childType": "Liquidity Program",
|
||||
"autoAdd": false
|
||||
},
|
||||
{
|
||||
"name": "delegationProgram",
|
||||
"type": "node",
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"type": "Liquidity Program",
|
||||
"menuItems": [
|
||||
{
|
||||
"action": "Configure",
|
||||
"actionFunction": "uiObject.configEditor.activate",
|
||||
"label": "Configure",
|
||||
"iconPathOn": "configuration",
|
||||
"iconPathOff": "configuration"
|
||||
},
|
||||
{
|
||||
"action": "Add UI Object",
|
||||
"actionProject": "Visual-Scripting",
|
||||
"disableIfPropertyIsDefined": true,
|
||||
"propertyToCheckFor": "tokensAwarded",
|
||||
"actionFunction": "payload.executeAction",
|
||||
"label": "Add Tokens Awarded",
|
||||
"relatedUiObject": "Tokens Awarded",
|
||||
"relatedUiObjectProject": "Governance"
|
||||
},
|
||||
{
|
||||
"action": "Delete UI Object",
|
||||
"actionProject": "Visual-Scripting",
|
||||
"askConfirmation": true,
|
||||
"confirmationLabel": "Confirm to Delete",
|
||||
"label": "Delete",
|
||||
"iconPathOn": "delete-entity",
|
||||
"iconPathOff": "delete-entity",
|
||||
"actionFunction": "payload.executeAction"
|
||||
}
|
||||
],
|
||||
"editors": {
|
||||
"config": true
|
||||
},
|
||||
"initialValues": {
|
||||
"config": "{}"
|
||||
},
|
||||
"attachingRules": {
|
||||
"compatibleTypes": "->Financial Programs->"
|
||||
},
|
||||
"addLeftIcons": true,
|
||||
"level": 1,
|
||||
"propertyNameAtParent": "liquidityProgram",
|
||||
"childrenNodesProperties": [
|
||||
{
|
||||
"name": "tokensAwarded",
|
||||
"type": "node",
|
||||
"childType": "Tokens Awarded",
|
||||
"autoAdd": true
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -6,8 +6,8 @@ function newGovernanceFunctionLibraryDistributionProcess() {
|
||||
}
|
||||
|
||||
const DISTRIBUTION_PROCESS_RECALCULATION_DELAY = 5000
|
||||
let loop
|
||||
|
||||
let loop
|
||||
|
||||
return thisObject
|
||||
|
||||
function initialize() {
|
||||
@@ -18,7 +18,7 @@ function newGovernanceFunctionLibraryDistributionProcess() {
|
||||
function finalize() {
|
||||
loop = false
|
||||
}
|
||||
|
||||
|
||||
function calculate() {
|
||||
|
||||
let pools = UI.projects.foundations.spaces.designSpace.workspace.getHierarchyHeadsByNodeType('Pools')
|
||||
@@ -110,6 +110,13 @@ function newGovernanceFunctionLibraryDistributionProcess() {
|
||||
userProfiles
|
||||
)
|
||||
/*
|
||||
Run the Liquidity Program
|
||||
*/
|
||||
UI.projects.governance.functionLibraries.liquidityProgram.calculate(
|
||||
pools,
|
||||
userProfiles
|
||||
)
|
||||
/*
|
||||
Run the Claims Program
|
||||
*/
|
||||
UI.projects.governance.functionLibraries.claimsProgram.calculate(
|
||||
|
||||
@@ -0,0 +1,176 @@
|
||||
function newGovernanceFunctionLibraryLiquidityProgram() {
|
||||
let thisObject = {
|
||||
calculate: calculate
|
||||
}
|
||||
|
||||
return thisObject
|
||||
|
||||
function calculate(
|
||||
pools,
|
||||
userProfiles
|
||||
) {
|
||||
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 Liquidity 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
|
||||
|
||||
/* Scan Pools Until finding the Pool for this program*/
|
||||
for (let i = 0; i < pools.length; i++) {
|
||||
let poolsNode = pools[i]
|
||||
programPoolTokenReward = UI.projects.governance.utilities.pools.findPool(poolsNode, "Liquidity-Rewards")
|
||||
if (programPoolTokenReward !== undefined) { break }
|
||||
}
|
||||
if (programPoolTokenReward === undefined || programPoolTokenReward === 0) { return }
|
||||
|
||||
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, "Liquidity Program")
|
||||
if (program === undefined) { continue }
|
||||
if (program.payload === undefined) { continue }
|
||||
|
||||
resetProgram(program)
|
||||
}
|
||||
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, "Liquidity Program")
|
||||
if (program === undefined) { continue }
|
||||
if (program.payload === undefined) { continue }
|
||||
|
||||
validateProgram(program, 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, "Liquidity Program")
|
||||
if (program === undefined) { continue }
|
||||
if (program.payload === undefined) { continue }
|
||||
if (program.payload.liquidityProgram.isActive === false) { continue }
|
||||
|
||||
distributeProgram(program, 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, "Liquidity Program")
|
||||
if (program === undefined) { continue }
|
||||
if (program.payload === undefined) { continue }
|
||||
if (program.payload.liquidityProgram.isActive === false) { continue }
|
||||
|
||||
calculateProgram(program)
|
||||
}
|
||||
|
||||
function resetProgram(node) {
|
||||
if (node === undefined) { return }
|
||||
if (node.payload === undefined) { return }
|
||||
if (node.payload.liquidityProgram === undefined) {
|
||||
node.payload.liquidityProgram = {
|
||||
count: 0,
|
||||
percentage: 0,
|
||||
outgoingPower: 0,
|
||||
ownPower: 0,
|
||||
incomingPower: 0,
|
||||
awarded: {
|
||||
tokens: 0,
|
||||
percentage: 0
|
||||
}
|
||||
}
|
||||
} else {
|
||||
node.payload.liquidityProgram.count = 0
|
||||
node.payload.liquidityProgram.percentage = 0
|
||||
node.payload.liquidityProgram.outgoingPower = 0
|
||||
node.payload.liquidityProgram.ownPower = 0
|
||||
node.payload.liquidityProgram.incomingPower = 0
|
||||
node.payload.liquidityProgram.awarded = {
|
||||
tokens: 0,
|
||||
percentage: 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function validateProgram(node, userProfile) {
|
||||
/*
|
||||
This program is not going to run unless the Profile has Liquidity Tokens, and for
|
||||
that users needs to execute the setup procedure of signing their Github
|
||||
username with their private key.
|
||||
*/
|
||||
if (
|
||||
userProfile.payload.liquidityTokens === undefined
|
||||
) {
|
||||
node.payload.liquidityProgram.isActive = false
|
||||
userProfile.payload.uiObject.setErrorMessage(
|
||||
"Waiting for liquidity balance. It takes 6 seconds to load the liquidity provided by each profile, bacause you are using a free API provided by BSC Scan.",
|
||||
UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
|
||||
)
|
||||
return
|
||||
} else {
|
||||
userProfile.payload.uiObject.resetErrorMessage()
|
||||
node.payload.liquidityProgram.isActive = true
|
||||
}
|
||||
}
|
||||
|
||||
function distributeProgram(programNode, userProfile) {
|
||||
if (programNode === undefined || programNode.payload === undefined) { return }
|
||||
/*
|
||||
Here we will convert Liquidity Tokens into Liquidity Power.
|
||||
As per system rules Liquidity Powar = userProfile.payload.liquidityTokens
|
||||
*/
|
||||
let programPower = userProfile.payload.liquidityTokens
|
||||
programNode.payload.liquidityProgram.ownPower = programPower
|
||||
|
||||
accumulatedProgramPower = accumulatedProgramPower + programPower
|
||||
}
|
||||
|
||||
function calculateProgram(programNode) {
|
||||
|
||||
if (programNode.payload === undefined) { return }
|
||||
if (programNode.tokensAwarded === undefined || programNode.tokensAwarded.payload === undefined) {
|
||||
programNode.payload.uiObject.setErrorMessage(
|
||||
"Tokens Awarded Node is needed in order for this Program to get Tokens from the Program Pool.",
|
||||
UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
|
||||
)
|
||||
return
|
||||
}
|
||||
/*
|
||||
Here we will calculate which share of the Program Pool this user will get in tokens.
|
||||
To do that, we use the ownPower, to see which proportion of the accumulatedProgramPower
|
||||
represents.
|
||||
*/
|
||||
programNode.payload.liquidityProgram.awarded.percentage = programNode.payload.liquidityProgram.ownPower * 100 / accumulatedProgramPower
|
||||
programNode.payload.liquidityProgram.awarded.tokens = programPoolTokenReward * programNode.payload.liquidityProgram.awarded.percentage / 100
|
||||
|
||||
drawProgram(programNode)
|
||||
}
|
||||
|
||||
function drawProgram(node) {
|
||||
if (node.payload !== undefined) {
|
||||
|
||||
const ownPowerText = parseFloat(node.payload.liquidityProgram.ownPower.toFixed(0)).toLocaleString('en')
|
||||
const percentageText = parseFloat(node.payload.liquidityProgram.awarded.percentage.toFixed(2)).toLocaleString('en')
|
||||
|
||||
node.payload.uiObject.statusAngleOffset = 0
|
||||
node.payload.uiObject.statusAtAngle = false
|
||||
|
||||
node.payload.uiObject.setStatus(ownPowerText + ' Liquidity Power' + ' - ' + percentageText + ' % Pool ', UI.projects.governance.globals.designer.SET_STATUS_COUNTER)
|
||||
}
|
||||
if (node.tokensAwarded !== undefined && node.tokensAwarded.payload !== undefined) {
|
||||
|
||||
const tokensAwardedText = parseFloat(node.payload.liquidityProgram.awarded.tokens.toFixed(0)).toLocaleString('en')
|
||||
const tokensAwardedBTC = ' ≃ ' + UI.projects.governance.utilities.conversions.estimateSATokensInBTC(node.payload.liquidityProgram.awarded.tokens | 0) + ' BTC'
|
||||
|
||||
node.tokensAwarded.payload.uiObject.valueAngleOffset = 0
|
||||
node.tokensAwarded.payload.uiObject.valueAtAngle = false
|
||||
|
||||
node.tokensAwarded.payload.uiObject.setValue(tokensAwardedText + ' SA Tokens' + tokensAwardedBTC, UI.projects.governance.globals.designer.SET_VALUE_COUNTER)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1239,6 +1239,11 @@
|
||||
"propertyName": "stakingProgram",
|
||||
"functionName": "newGovernanceFunctionLibraryStakingProgram"
|
||||
},
|
||||
{
|
||||
"name": "Liquidity Program",
|
||||
"propertyName": "liquidityProgram",
|
||||
"functionName": "newGovernanceFunctionLibraryLiquidityProgram"
|
||||
},
|
||||
{
|
||||
"name": "Profile Constructor",
|
||||
"propertyName": "profileConstructor",
|
||||
|
||||
Reference in new issue
Block a user