diff --git a/Projects/Governance/Icons/Programs/delegation-program.png b/Projects/Governance/Icons/Programs/delegation-program.png new file mode 100644 index 000000000..9b3b41696 Binary files /dev/null and b/Projects/Governance/Icons/Programs/delegation-program.png differ diff --git a/Projects/Governance/Icons/Votes/claim-votes-switch.png b/Projects/Governance/Icons/Switches/claim-votes-switch.png similarity index 100% rename from Projects/Governance/Icons/Votes/claim-votes-switch.png rename to Projects/Governance/Icons/Switches/claim-votes-switch.png diff --git a/Projects/Governance/Icons/Votes/votes-distribution.png b/Projects/Governance/Icons/Switches/delegate-power-switch.png similarity index 100% rename from Projects/Governance/Icons/Votes/votes-distribution.png rename to Projects/Governance/Icons/Switches/delegate-power-switch.png diff --git a/Projects/Governance/Icons/token-power-switch.png b/Projects/Governance/Icons/Switches/token-power-switch.png similarity index 100% rename from Projects/Governance/Icons/token-power-switch.png rename to Projects/Governance/Icons/Switches/token-power-switch.png diff --git a/Projects/Governance/Icons/Votes/user-profile-votes-switch.png b/Projects/Governance/Icons/Switches/user-profile-votes-switch.png similarity index 100% rename from Projects/Governance/Icons/Votes/user-profile-votes-switch.png rename to Projects/Governance/Icons/Switches/user-profile-votes-switch.png diff --git a/Projects/Governance/Icons/Votes/votes-switch.png b/Projects/Governance/Icons/Switches/votes-switch.png similarity index 100% rename from Projects/Governance/Icons/Votes/votes-switch.png rename to Projects/Governance/Icons/Switches/votes-switch.png diff --git a/Projects/Governance/Icons/Votes/weight-votes-switch.png b/Projects/Governance/Icons/Switches/weight-votes-switch.png similarity index 100% rename from Projects/Governance/Icons/Votes/weight-votes-switch.png rename to Projects/Governance/Icons/Switches/weight-votes-switch.png diff --git a/Projects/Governance/Icons/User/user-delegate.png b/Projects/Governance/Icons/User/user-delegate.png new file mode 100644 index 000000000..8fcb79a35 Binary files /dev/null and b/Projects/Governance/Icons/User/user-delegate.png differ diff --git a/Projects/Governance/Plugins/Pools/Superalgos.json b/Projects/Governance/Plugins/Pools/Superalgos.json index 356b1e55e..a1b4e514a 100644 --- a/Projects/Governance/Plugins/Pools/Superalgos.json +++ b/Projects/Governance/Plugins/Pools/Superalgos.json @@ -1327,19 +1327,19 @@ }, { "type": "Pool Class", - "name": "Liquid Democracy Program", + "name": "Staking Program", "config": "{}", "project": "Governance", "poolClasses": [], "pools": [ { "type": "Pool", - "name": "Liquid Democracy Bonus", - "config": "{\n \"codeName\": \"Liquid-Democracy-Bonus\"\n}", + "name": "Staking Rewards", + "config": "{\n \"codeName\": \"Staking-Rewards\"\n}", "project": "Governance", "poolClasses": [], "pools": [], - "id": "24e62dd3-4d7b-4eba-b401-493c155d85d0", + "id": "d2cf4c65-b4bd-4fa8-b0da-f73a38b8419a", "savedPayload": { "position": { "x": 25719.864024962837, @@ -1363,7 +1363,7 @@ } } ], - "id": "f09429a2-3f6c-4210-bb73-0c8efd254c82", + "id": "68e3f570-4156-4be6-8881-c526a06f85d0", "savedPayload": { "position": { "x": 25430.086277076116, @@ -1388,19 +1388,19 @@ }, { "type": "Pool Class", - "name": "Staking Program", + "name": "Delegation Program", "config": "{}", "project": "Governance", "poolClasses": [], "pools": [ { "type": "Pool", - "name": "Staking Rewards", - "config": "{\n \"codeName\": \"Staking-Rewards\"\n}", + "name": "Delegation Bonus", + "config": "{\n \"codeName\": \"Delegation-Bonus\"\n}", "project": "Governance", "poolClasses": [], "pools": [], - "id": "d2cf4c65-b4bd-4fa8-b0da-f73a38b8419a", + "id": "24e62dd3-4d7b-4eba-b401-493c155d85d0", "savedPayload": { "position": { "x": 25735.17544601368, @@ -1424,7 +1424,7 @@ } } ], - "id": "68e3f570-4156-4be6-8881-c526a06f85d0", + "id": "f09429a2-3f6c-4210-bb73-0c8efd254c82", "savedPayload": { "position": { "x": 25437.741987601537, diff --git a/Projects/Governance/Plugins/User-Profiles/Julian-Molina.json b/Projects/Governance/Plugins/User-Profiles/Julian-Molina.json index 57de0fa65..1543d7ada 100644 --- a/Projects/Governance/Plugins/User-Profiles/Julian-Molina.json +++ b/Projects/Governance/Plugins/User-Profiles/Julian-Molina.json @@ -673,14 +673,14 @@ }, { "type": "Weight Votes Switch", - "name": "Liquid Democracy Program Pool Class", + "name": "Delegation Program Pool Class", "config": "{}", "project": "Governance", "weightVotesSwitch": [], "poolWeightVotes": [ { "type": "Pool Weight Vote", - "name": "Liquid Democracy Participation Bonus Pool", + "name": "Delegation Participation Bonus Pool", "config": "{}", "project": "Governance", "id": "1b9107f6-63b6-4e90-bc78-d84d2f360b29", @@ -704,7 +704,7 @@ "uiObject": {}, "referenceParent": { "type": "Pool", - "name": "Liquid Democracy Participation Bonus", + "name": "Delegation Participation Bonus", "id": "24e62dd3-4d7b-4eba-b401-493c155d85d0" } } @@ -736,7 +736,7 @@ }, "referenceParent": { "type": "Pool Class", - "name": "Liquid Democracy Program", + "name": "Delegation Program", "id": "f09429a2-3f6c-4210-bb73-0c8efd254c82" } } diff --git a/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json b/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json index 8bbad4855..5fec52fb6 100644 --- a/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json +++ b/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json @@ -22,12 +22,12 @@ "id": "fb0a076c-b0a8-4f16-9a47-10a3f3489a0a", "savedPayload": { "position": { - "x": 30695.66511087198, - "y": 22950.386032869752 + "x": 30642.937064065492, + "y": 22910.704105890647 }, "targetPosition": { - "x": 30550.54944474041, - "y": 23212.953059442378 + "x": 30528.132034355964, + "y": 23187.867965644033 }, "floatingObject": { "isPinned": false, @@ -53,12 +53,12 @@ "id": "56ac3eb9-2d72-4a8d-99bc-3221819ce995", "savedPayload": { "position": { - "x": 30785.098889480818, - "y": 23025.90611888476 + "x": 30740.264068711927, + "y": 22975.73593128807 }, "targetPosition": { - "x": 30550.54944474041, - "y": 23212.953059442378 + "x": 30528.132034355964, + "y": 23187.867965644033 }, "floatingObject": { "isPinned": false, @@ -78,12 +78,12 @@ "id": "2d205ae2-9158-4b36-a8cb-f9d5c5061342", "savedPayload": { "position": { - "x": 30838.82464132394, - "y": 23129.902406014924 + "x": 30805.29589410935, + "y": 23073.062935934508 }, "targetPosition": { - "x": 30550.54944474041, - "y": 23212.953059442378 + "x": 30528.132034355964, + "y": 23187.867965644033 }, "floatingObject": { "isPinned": false, @@ -99,8 +99,8 @@ "id": "43a24543-03cf-4511-b670-63566159dbd7", "savedPayload": { "position": { - "x": 30550.54944474041, - "y": 23212.953059442378 + "x": 30528.132034355964, + "y": 23187.867965644033 }, "targetPosition": { "x": 30316, @@ -133,12 +133,12 @@ "id": "2a038796-fccd-4a5a-b943-116ccca91b1d", "savedPayload": { "position": { - "x": 30904.23967921002, - "y": 23416.50441319547 + "x": 30893.163859753386, + "y": 23285.19497029047 }, "targetPosition": { - "x": 30608.478373654547, - "y": 23466.75628018689 + "x": 30616, + "y": 23399.999999999996 }, "floatingObject": { "isPinned": false, @@ -164,12 +164,12 @@ "id": "c6367a1d-4bc7-4348-8309-a3e6f3fcdd50", "savedPayload": { "position": { - "x": 30900.956747309094, - "y": 23533.512560373787 + "x": 30916, + "y": 23399.999999999996 }, "targetPosition": { - "x": 30608.478373654547, - "y": 23466.75628018689 + "x": 30616, + "y": 23399.999999999996 }, "floatingObject": { "isPinned": false, @@ -189,12 +189,12 @@ "id": "3d5e14b8-8187-4f3b-8142-8daa540977a7", "savedPayload": { "position": { - "x": 30853.146634342324, - "y": 23640.357669040834 + "x": 30893.163859753386, + "y": 23514.805029709525 }, "targetPosition": { - "x": 30608.478373654547, - "y": 23466.75628018689 + "x": 30616, + "y": 23399.999999999996 }, "floatingObject": { "isPinned": false, @@ -210,8 +210,8 @@ "id": "91d82012-4362-4fe0-b02b-0eb3b394ace5", "savedPayload": { "position": { - "x": 30608.478373654547, - "y": 23466.75628018689 + "x": 30616, + "y": 23399.999999999996 }, "targetPosition": { "x": 30316, @@ -244,12 +244,12 @@ "id": "97483d0f-35ec-4471-a981-0d22565e0d63", "savedPayload": { "position": { - "x": 30684.8524863998, - "y": 23852.02767352297 + "x": 30813.44898924451, + "y": 23704.837132668443 }, "targetPosition": { - "x": 30446.165121735266, - "y": 23670.290660370723 + "x": 30528.132034355964, + "y": 23612.13203435596 }, "floatingObject": { "isPinned": false, @@ -275,12 +275,12 @@ "id": "8adecfda-c803-400c-acde-c34bda09e39b", "savedPayload": { "position": { - "x": 30617.010469685803, - "y": 23916.891283005098 + "x": 30770.837132668446, + "y": 23788.467610043703 }, "targetPosition": { - "x": 30446.165121735266, - "y": 23670.290660370723 + "x": 30528.132034355964, + "y": 23612.13203435596 }, "floatingObject": { "isPinned": false, @@ -306,12 +306,12 @@ "id": "09648f99-1bf8-4d53-9d20-f15cc8c71508", "savedPayload": { "position": { - "x": 30532.444919964873, - "y": 23957.615905376202 + "x": 30704.467610043706, + "y": 23854.837132668443 }, "targetPosition": { - "x": 30446.165121735266, - "y": 23670.290660370723 + "x": 30528.132034355964, + "y": 23612.13203435596 }, "floatingObject": { "isPinned": false, @@ -331,12 +331,12 @@ "id": "4113b77f-b7f4-41d2-8603-3784b2b65412", "savedPayload": { "position": { - "x": 30439.433702446524, - "y": 23970.215130853474 + "x": 30620.837132668446, + "y": 23897.448989244505 }, "targetPosition": { - "x": 30446.165121735266, - "y": 23670.290660370723 + "x": 30528.132034355964, + "y": 23612.13203435596 }, "floatingObject": { "isPinned": false, @@ -352,8 +352,8 @@ "id": "8af4af68-62bf-4ad2-bf84-f1124cba0abf", "savedPayload": { "position": { - "x": 30446.165121735266, - "y": 23670.290660370723 + "x": 30528.132034355964, + "y": 23612.13203435596 }, "targetPosition": { "x": 30316, @@ -400,12 +400,12 @@ "id": "edf1a5c9-7802-4856-918c-3cd5a7a9caf7", "savedPayload": { "position": { - "x": 30298.31782969946, - "y": 24540.985747266444 + "x": 30795.124077346074, + "y": 24435.664643173153 }, "targetPosition": { - "x": 30214.18961290766, - "y": 24253.023174803577 + "x": 30594.384895438416, + "y": 24212.721195529935 }, "floatingObject": { "isPinned": false, @@ -427,12 +427,12 @@ "id": "ebad23ed-1a02-4edf-a9d7-fc4b2fd0dacb", "savedPayload": { "position": { - "x": 30214.18961290766, - "y": 24253.023174803577 + "x": 30594.384895438416, + "y": 24212.721195529935 }, "targetPosition": { - "x": 30130.06139611586, - "y": 23965.06060234071 + "x": 30393.645713530757, + "y": 23989.777747886717 }, "floatingObject": { "isPinned": false, @@ -462,12 +462,12 @@ "id": "e745f3cd-4cd9-421b-b9ab-f62650fb56f8", "savedPayload": { "position": { - "x": 30121.086756265042, - "y": 24264.92633202576 + "x": 30515.666706453496, + "y": 24263.841385179498 }, "targetPosition": { - "x": 30130.06139611586, - "y": 23965.06060234071 + "x": 30393.645713530757, + "y": 23989.777747886717 }, "floatingObject": { "isPinned": false, @@ -497,12 +497,12 @@ "id": "3ae7f0f9-be37-4e6c-b3b1-4343e51f80a9", "savedPayload": { "position": { - "x": 30028.862399901012, - "y": 24247.47654233898 + "x": 30425.004252511055, + "y": 24288.1343164972 }, "targetPosition": { - "x": 30130.06139611586, - "y": 23965.06060234071 + "x": 30393.645713530757, + "y": 23989.777747886717 }, "floatingObject": { "isPinned": false, @@ -532,12 +532,12 @@ "id": "d8ab7844-f98f-4ce1-a634-c0ff98af28ca", "savedPayload": { "position": { - "x": 29946.544106381356, - "y": 24202.381912737612 + "x": 30331.27220628543, + "y": 24283.22202810686 }, "targetPosition": { - "x": 30130.06139611586, - "y": 23965.06060234071 + "x": 30393.645713530757, + "y": 23989.777747886717 }, "floatingObject": { "isPinned": false, @@ -562,12 +562,12 @@ "id": "f8a482c4-dee0-475a-831b-7514fd255ba6", "savedPayload": { "position": { - "x": 30130.06139611586, - "y": 23965.06060234071 + "x": 30393.645713530757, + "y": 23989.777747886717 }, "targetPosition": { - "x": 30185.834878264734, - "y": 23670.290660370723 + "x": 30316, + "y": 23699.999999999996 }, "floatingObject": { "isPinned": false, @@ -596,12 +596,12 @@ "id": "5011109c-3f87-471a-b786-5fd371f53853", "savedPayload": { "position": { - "x": 29990.148654881297, - "y": 23897.68217731436 + "x": 30238.354286469243, + "y": 23989.777747886717 }, "targetPosition": { - "x": 30185.834878264734, - "y": 23670.290660370723 + "x": 30316, + "y": 23699.999999999996 }, "floatingObject": { "isPinned": false, @@ -617,8 +617,8 @@ "id": "796dd30f-c90d-4b8d-a63d-89867347407b", "savedPayload": { "position": { - "x": 30185.834878264734, - "y": 23670.290660370723 + "x": 30316, + "y": 23699.999999999996 }, "targetPosition": { "x": 30316, @@ -667,12 +667,12 @@ "id": "4381f059-44c8-4843-9cac-8a7cf41fa14c", "savedPayload": { "position": { - "x": 29439.067762384868, - "y": 24114.971388205784 + "x": 29953.867965644036, + "y": 24471.939655491293 }, "targetPosition": { - "x": 29598.67738533947, - "y": 23860.954128437297 + "x": 29953.867965644036, + "y": 24171.939655491293 }, "floatingObject": { "isPinned": false, @@ -694,12 +694,12 @@ "id": "d69739f9-958e-480e-95e3-a72bb5f6ceab", "savedPayload": { "position": { - "x": 29598.67738533947, - "y": 23860.954128437297 + "x": 29953.867965644036, + "y": 24171.939655491293 }, "targetPosition": { - "x": 29758.28700829407, - "y": 23606.93686866881 + "x": 29953.867965644036, + "y": 23871.939655491293 }, "floatingObject": { "isPinned": false, @@ -2165,14 +2165,14 @@ }, { "type": "Weight Votes Switch", - "name": "Liquid Democracy Program Pool Class", + "name": "Delegation Program Pool Class", "config": "{}", "project": "Governance", "weightVotesSwitch": [], "poolWeightVotes": [ { "type": "Pool Weight Vote", - "name": "Liquid Democracy Bonus Pool", + "name": "Delegation Bonus Pool", "config": "{}", "project": "Governance", "id": "9a5d6e82-f4e8-45e4-bc53-f656a6ecc3ad", @@ -2196,7 +2196,7 @@ "uiObject": {}, "referenceParent": { "type": "Pool", - "name": "Liquid Democracy Bonus", + "name": "Delegation Bonus", "id": "24e62dd3-4d7b-4eba-b401-493c155d85d0" } } @@ -2228,7 +2228,7 @@ }, "referenceParent": { "type": "Pool Class", - "name": "Liquid Democracy Program", + "name": "Delegation Program", "id": "f09429a2-3f6c-4210-bb73-0c8efd254c82" } } @@ -2344,12 +2344,12 @@ "id": "e059f5c4-9132-4d76-9f3e-1060658fa704", "savedPayload": { "position": { - "x": 29193.26217880617, - "y": 23735.90009886783 + "x": 29544.060344508704, + "y": 24281.747276626626 }, "targetPosition": { - "x": 29458.49679685755, - "y": 23595.719510385912 + "x": 29694.060344508704, + "y": 24021.939655491293 }, "floatingObject": { "isPinned": false, @@ -2381,12 +2381,12 @@ "id": "7607658c-f3ad-42de-a316-35dd052e0477", "savedPayload": { "position": { - "x": 29204.479537089064, - "y": 23436.10988743131 + "x": 29394.060344508704, + "y": 24021.939655491293 }, "targetPosition": { - "x": 29458.49679685755, - "y": 23595.719510385912 + "x": 29694.060344508704, + "y": 24021.939655491293 }, "floatingObject": { "isPinned": false, @@ -2409,12 +2409,12 @@ "id": "1d398124-3f36-40a1-8b3b-6c77ad489b92", "savedPayload": { "position": { - "x": 29458.49679685755, - "y": 23595.719510385912 + "x": 29694.060344508704, + "y": 24021.939655491293 }, "targetPosition": { - "x": 29758.28700829407, - "y": 23606.93686866881 + "x": 29953.867965644036, + "y": 23871.939655491293 }, "floatingObject": { "isPinned": false, @@ -2434,12 +2434,12 @@ "id": "2b8d3ce7-515c-44ad-8d80-3c2be6d7736f", "savedPayload": { "position": { - "x": 29758.28700829407, - "y": 23606.93686866881 + "x": 29953.867965644036, + "y": 23871.939655491293 }, "targetPosition": { - "x": 30023.521626345453, - "y": 23466.75628018689 + "x": 30103.867965644036, + "y": 23612.13203435596 }, "floatingObject": { "isPinned": false, @@ -2462,12 +2462,12 @@ "id": "e9c0e495-7985-4381-bf75-865d87289038", "savedPayload": { "position": { - "x": 29723.731414908932, - "y": 23455.538921903993 + "x": 29844.060344508704, + "y": 23762.13203435596 }, "targetPosition": { - "x": 30023.521626345453, - "y": 23466.75628018689 + "x": 30103.867965644036, + "y": 23612.13203435596 }, "floatingObject": { "isPinned": false, @@ -2483,8 +2483,8 @@ "id": "d5ed432e-78bf-432e-be3b-8649932f7a65", "savedPayload": { "position": { - "x": 30023.521626345453, - "y": 23466.75628018689 + "x": 30103.867965644036, + "y": 23612.13203435596 }, "targetPosition": { "x": 30316, @@ -2515,12 +2515,12 @@ "id": "928e9ccb-1e90-48a9-af77-b3089225fc4f", "savedPayload": { "position": { - "x": 29846.901110519182, - "y": 23025.90611888476 + "x": 29716, + "y": 23399.999999999996 }, "targetPosition": { - "x": 30081.45055525959, - "y": 23212.953059442378 + "x": 30016, + "y": 23399.999999999996 }, "floatingObject": { "isPinned": false, @@ -2536,8 +2536,212 @@ "id": "b046f4e4-40b1-4e47-8fed-75a6a5c6029d", "savedPayload": { "position": { - "x": 30081.45055525959, - "y": 23212.953059442378 + "x": 30016, + "y": 23399.999999999996 + }, + "targetPosition": { + "x": 30316, + "y": 23399.999999999996 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "delegationProgram": { + "type": "Delegation Program", + "name": "New Delegation Program", + "config": "{}", + "project": "Governance", + "delegatePowerSwitch": [ + { + "type": "Delegate Power Switch", + "name": "New Delegate Power Switch", + "config": "{}", + "project": "Governance", + "delegatePowerSwitch": [ + { + "type": "Delegate Power Switch", + "name": "New Delegate Power Switch", + "config": "{}", + "project": "Governance", + "delegatePowerSwitch": [], + "userDelegates": [], + "id": "b78715ee-cbcf-4fce-914a-d3efa55d7849", + "savedPayload": { + "position": { + "x": 29524.312469870594, + "y": 23187.867965644033 + }, + "targetPosition": { + "x": 29814.090217757315, + "y": 23110.222252113275 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Delegate Power Switch", + "name": "New Delegate Power Switch", + "config": "{}", + "project": "Governance", + "delegatePowerSwitch": [], + "userDelegates": [ + { + "type": "User Delegate", + "name": "Julian-Molina", + "config": "{}", + "project": "Governance", + "id": "d684a95b-fc8a-4545-8db5-601128a924cf", + "savedPayload": { + "position": { + "x": 29312.18043551463, + "y": 22820.444504226554 + }, + "targetPosition": { + "x": 29601.95818340135, + "y": 22898.09021775731 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": {}, + "referenceParent": { + "type": "User Profile", + "name": "Julian-Molina", + "id": "1fd95e41-4b22-48d5-be3a-904c37afcb11" + } + } + }, + { + "type": "User Delegate", + "name": "", + "config": "{}", + "project": "Governance", + "id": "bfb493fb-ac94-4be4-9433-38c24bb5f254", + "savedPayload": { + "position": { + "x": 29524.312469870594, + "y": 22608.31246987059 + }, + "targetPosition": { + "x": 29601.95818340135, + "y": 22898.09021775731 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": {} + } + } + ], + "id": "477c0363-96ff-464c-bdda-ed40fa20df12", + "savedPayload": { + "position": { + "x": 29601.95818340135, + "y": 22898.09021775731 + }, + "targetPosition": { + "x": 29814.090217757315, + "y": 23110.222252113275 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + } + ], + "userDelegates": [], + "id": "681ff42a-d5af-4fed-971e-935398dac2aa", + "savedPayload": { + "position": { + "x": 29814.090217757315, + "y": 23110.222252113275 + }, + "targetPosition": { + "x": 30103.867965644036, + "y": 23187.867965644033 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + } + ], + "tokensBonus": { + "type": "Tokens Bonus", + "name": "New Tokens Bonus", + "project": "Governance", + "id": "e4be3ce4-3569-4d97-8d54-95bb4cfcb0c5", + "savedPayload": { + "position": { + "x": 30026.22225211328, + "y": 22898.09021775731 + }, + "targetPosition": { + "x": 30103.867965644036, + "y": 23187.867965644033 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": {} + } + }, + "id": "3ff7f410-911d-4cb8-9094-d816dee4dccb", + "savedPayload": { + "position": { + "x": 30103.867965644036, + "y": 23187.867965644033 }, "targetPosition": { "x": 30316, diff --git a/Projects/Governance/Schemas/App-Schema/delegate-power-switch.json b/Projects/Governance/Schemas/App-Schema/delegate-power-switch.json new file mode 100644 index 000000000..2f9333dfd --- /dev/null +++ b/Projects/Governance/Schemas/App-Schema/delegate-power-switch.json @@ -0,0 +1,62 @@ +{ + "type": "Delegate Power Switch", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Add UI Object", + "actionProject": "Foundations", + "actionFunction": "payload.executeAction", + "label": "Add Delegate Power Switch", + "relatedUiObject": "Delegate Power Switch" + }, + { + "action": "Add UI Object", + "actionProject": "Foundations", + "actionFunction": "payload.executeAction", + "label": "Add User Delegate", + "relatedUiObject": "User Delegate" + }, + { + "action": "Delete UI Object", + "actionProject": "Foundations", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "editors": { + "config": true + }, + "initialValues": { + "config": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->Delegate Power Switch->Delegation Program->" + }, + "propertyNameAtParent": "delegatePowerSwitch", + "childrenNodesProperties": [ + { + "name": "delegatePowerSwitch", + "type": "array", + "childType": "Delegate Power Switch", + "autoAdd": false + }, + { + "name": "userDelegates", + "type": "array", + "childType": "User Delegate", + "autoAdd": false + } + ] +} \ No newline at end of file diff --git a/Projects/Governance/Schemas/App-Schema/delegation-program.json b/Projects/Governance/Schemas/App-Schema/delegation-program.json new file mode 100644 index 000000000..d5db7615c --- /dev/null +++ b/Projects/Governance/Schemas/App-Schema/delegation-program.json @@ -0,0 +1,64 @@ +{ + "type": "Delegation Program", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Add UI Object", + "actionProject": "Foundations", + "actionFunction": "payload.executeAction", + "label": "Add Delegate Power Switch", + "relatedUiObject": "Delegate Power Switch" + }, + { + "action": "Add UI Object", + "actionProject": "Foundations", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "tokensBonus", + "actionFunction": "payload.executeAction", + "label": "Add Tokens Bonus", + "relatedUiObject": "Tokens Bonus" + }, + { + "action": "Delete UI Object", + "actionProject": "Foundations", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "editors": { + "config": true + }, + "initialValues": { + "config": "{}" + }, + "attachingRules": { + "compatibleTypes": "->Token Power Switch->" + }, + "addLeftIcons": true, + "level": 1, + "propertyNameAtParent": "delegationProgram", + "childrenNodesProperties": [ + { + "name": "delegatePowerSwitch", + "type": "array", + "childType": "Delegate Power Switch", + "autoAdd": false + }, + { + "name": "tokensBonus", + "type": "node", + "childType": "Tokens Bonus", + "autoAdd": true + } + ] +} \ No newline at end of file diff --git a/Projects/Governance/Schemas/App-Schema/token-power-switch.json b/Projects/Governance/Schemas/App-Schema/token-power-switch.json index 323b15701..a06248a63 100644 --- a/Projects/Governance/Schemas/App-Schema/token-power-switch.json +++ b/Projects/Governance/Schemas/App-Schema/token-power-switch.json @@ -62,6 +62,15 @@ "label": "Add Staking Program", "relatedUiObject": "Staking Program" }, + { + "action": "Add UI Object", + "actionProject": "Foundations", + "actionFunction": "payload.executeAction", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "delegationProgram", + "label": "Add Delegation Program", + "relatedUiObject": "Delegation Program" + }, { "action": "Delete UI Object", "actionProject": "Foundations", @@ -121,6 +130,12 @@ "type": "node", "childType": "Staking Program", "autoAdd": true + }, + { + "name": "delegationProgram", + "type": "node", + "childType": "Delegation Program", + "autoAdd": true } ] } \ No newline at end of file diff --git a/Projects/Governance/Schemas/App-Schema/user-delegate.json b/Projects/Governance/Schemas/App-Schema/user-delegate.json new file mode 100644 index 000000000..fbf5c964a --- /dev/null +++ b/Projects/Governance/Schemas/App-Schema/user-delegate.json @@ -0,0 +1,40 @@ +{ + "type": "User Delegate", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Delete UI Object", + "actionProject": "Foundations", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity", + "actionFunction": "payload.executeAction" + } + ], + "title": [ + "Use Reference Parent" + ], + "editors": { + "config": true + }, + "initialValues": { + "config": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->Delegating Power Switch->" + }, + "referencingRules": { + "compatibleTypes": "->User Profile->" + }, + "propertyNameAtParent": "userDelegates" +} \ No newline at end of file diff --git a/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Vote-Transfer/user-vote-transfer.json b/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Vote-Transfer/user-vote-transfer.json index f4c0b3929..0084e1129 100644 --- a/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Vote-Transfer/user-vote-transfer.json +++ b/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Vote-Transfer/user-vote-transfer.json @@ -1,7 +1,7 @@ { "type": "User Profile Vote", "definition": { - "text": "This node allows users to transfer some of their voting power to other users, effectively creating a Liquid Democracy. Votes received by users are then flowed through the recipient user's token streams, increasing their size.", + "text": "This node allows users to transfer some of their voting power to other users, effectively creating a Delegation. Votes received by users are then flowed through the recipient user's token streams, increasing their size.", "updated": 1622989097099 }, "paragraphs": [ diff --git a/Projects/Governance/UI/Function-Libraries/DelegationProgram.js b/Projects/Governance/UI/Function-Libraries/DelegationProgram.js new file mode 100644 index 000000000..30c288612 --- /dev/null +++ b/Projects/Governance/UI/Function-Libraries/DelegationProgram.js @@ -0,0 +1,229 @@ +function newGovernanceFunctionLibraryDelegationProgram() { + let thisObject = { + calculate: calculate + } + + return thisObject + + function calculate( + pools, + userProfiles + ) { + + /* Bonus Calculation is here */ + UI.projects.governance.utilities.bonusProgram.run( + pools, + userProfiles, + "delegationProgram", + "Liquid-Democracy-Bonus" + ) + /* + We will first reset all the delegate power, and then distribute it. + */ + for (let i = 0; i < userProfiles.length; i++) { + let userProfile = userProfiles[i] + + if (userProfile.tokenPowerSwitch === undefined) { continue } + if (userProfile.tokenPowerSwitch.delegationProgram === undefined) { continue } + if (userProfile.tokenPowerSwitch.delegationProgram.payload === undefined) { continue } + + resetProgram(userProfile.tokenPowerSwitch.delegationProgram) + } + for (let i = 0; i < userProfiles.length; i++) { + let userProfile = userProfiles[i] + + if (userProfile.tokenPowerSwitch === undefined) { continue } + if (userProfile.tokenPowerSwitch.delegationProgram === undefined) { continue } + if (userProfile.tokenPowerSwitch.delegationProgram.payload === undefined) { continue } + + userProfile.tokenPowerSwitch.delegationProgram.payload.delegationProgram.programPower = userProfile.tokenPowerSwitch.delegationProgram.payload.tokenPower + + distributeProgram(userProfile.tokenPowerSwitch.delegationProgram) + } + + function resetProgram(programNode) { + if (programNode === undefined) { return } + if (programNode.payload === undefined) { return } + programNode.payload.delegationProgram = { + programPower: 0, + ownPower: 0 + } + } + + function distributeProgram(programNode) { + if (programNode.payload === undefined) { return } + + /* + Here we will convert Token Power into programPower. + As per system rules programPower = tokensPower + */ + let programPower = programNode.payload.tokenPower + /* + The Own Power is the power generated by the same User Profile tokens, not inherited from others. + */ + programNode.payload.delegationProgram.ownPower = programPower + distributeProgramPower(programNode, programPower) + } + + function distributeProgramPower(node, programPower, percentage) { + if (node === undefined) { return } + if (node.payload === undefined) { return } + if (node.payload.delegationProgram === undefined) {return} + + node.payload.delegationProgram.programPower = node.payload.delegationProgram.programPower + programPower + drawPower(node, node.payload.delegationProgram.programPower, percentage) + /* + When we reach certain node types, we will halt the distribution, because these are targets for + delegate power. + */ + if ( + node.type === 'User Profile' + ) { return } + /* + If there is a reference parent defined, this means that the delegate power is + transfered to it and not distributed among children. + */ + if ( + node.payload.referenceParent !== undefined && + node.type === 'User Delegate' + ) { + distributeProgramPower(node.payload.referenceParent, programPower) + return + } + /* + If there is no reference parent we will redistribute delegate power among children. + */ + let schemaDocument = getSchemaDocument(node) + if (schemaDocument === undefined) { return } + + if (schemaDocument.childrenNodesProperties !== undefined) { + /* + Before distributing the delegate power, we will calculate how the power + is going to be switched between all nodes. The first pass is about + scanning all sibling nodes to see which ones have a percentage defined + at their config, and check that all percentages don't add more than 100. + */ + let totalPercentage = 0 + let totalNodesWithoutPercentage = 0 + for (let i = 0; i < schemaDocument.childrenNodesProperties.length; i++) { + let property = schemaDocument.childrenNodesProperties[i] + + switch (property.type) { + case 'node': { + let childNode = node[property.name] + if (childNode === undefined) { continue } + if (childNode.type === 'Tokens Bonus') { continue } + let percentage = UI.projects.foundations.utilities.nodeConfig.loadConfigProperty(childNode.payload, 'percentage') + if (percentage !== undefined && isNaN(percentage) !== true) { + totalPercentage = totalPercentage + percentage + } else { + totalNodesWithoutPercentage++ + } + } + 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 === undefined) { continue } + if (childNode.type === 'Tokens Bonus') { continue } + let percentage = UI.projects.foundations.utilities.nodeConfig.loadConfigProperty(childNode.payload, 'percentage') + if (percentage !== undefined && isNaN(percentage) !== true) { + totalPercentage = totalPercentage + percentage + } else { + totalNodesWithoutPercentage++ + } + } + } + break + } + } + } + if (totalPercentage > 100) { + node.payload.uiObject.setErrorMessage('Delegate Power Switching Error. Total Percentage of children nodes is grater that 100.') + return + } + let defaultPercentage = 0 + if (totalNodesWithoutPercentage > 0) { + defaultPercentage = (100 - totalPercentage) / totalNodesWithoutPercentage + } + /* + Here we do the actual distribution. + */ + for (let i = 0; i < schemaDocument.childrenNodesProperties.length; i++) { + let property = schemaDocument.childrenNodesProperties[i] + + switch (property.type) { + case 'node': { + let childNode = node[property.name] + if (childNode === undefined) { continue } + if (childNode.type === 'Tokens Bonus') { continue } + let percentage = UI.projects.foundations.utilities.nodeConfig.loadConfigProperty(childNode.payload, 'percentage') + if (percentage === undefined || isNaN(percentage) === true) { + percentage = defaultPercentage + } + distributeProgramPower(childNode, programPower * percentage / 100, percentage) + } + 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 === undefined) { continue } + if (childNode.type === 'Tokens Bonus') { continue } + let percentage = UI.projects.foundations.utilities.nodeConfig.loadConfigProperty(childNode.payload, 'percentage') + if (percentage === undefined || isNaN(percentage) === true) { + percentage = defaultPercentage + } + distributeProgramPower(childNode, programPower * percentage / 100, percentage) + } + } + break + } + } + } + } + } + + function drawPower(node, programPower, percentage) { + + if (node.payload !== undefined) { + + if (node.type === 'Delegation Program') { + drawProgram(node) + + if (percentage !== undefined) { + node.payload.uiObject.setPercentage(percentage.toFixed(2)) + } + return + } + node.payload.uiObject.valueAngleOffset = 180 + node.payload.uiObject.valueAtAngle = true + node.payload.uiObject.percentageAngleOffset = 180 + node.payload.uiObject.percentageAtAngle = true + let voteType = 'Delegate Power' + + const programPowerText = parseFloat(programPower.toFixed(2)).toLocaleString('en') + ' ' + voteType + node.payload.uiObject.setValue(programPowerText) + + if (percentage !== undefined) { + node.payload.uiObject.setPercentage(percentage.toFixed(2)) + } + } + + function drawProgram(node) { + if (node.payload !== undefined) { + + const ownPowerText = parseFloat(node.payload.delegationProgram.ownPower.toFixed(2)).toLocaleString('en') + + node.payload.uiObject.statusAngleOffset = 0 + node.payload.uiObject.statusAtAngle = false + + node.payload.uiObject.setStatus(ownPowerText + ' Delegate Power') + } + } + } + } +} \ 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 c279ceab2..8fd6d33a7 100644 --- a/Projects/Governance/UI/Function-Libraries/DistributionProcess.js +++ b/Projects/Governance/UI/Function-Libraries/DistributionProcess.js @@ -17,6 +17,11 @@ function newGovernanceFunctionLibraryDistributionProcess() { userProfiles ) + UI.projects.governance.functionLibraries.delegationProgram.calculate( + pools, + userProfiles + ) + UI.projects.governance.functionLibraries.votingProgram.calculate( pools, features, diff --git a/Projects/Governance/UI/Function-Libraries/VotingProgram.js b/Projects/Governance/UI/Function-Libraries/VotingProgram.js index 9a23718e0..73d3f52da 100644 --- a/Projects/Governance/UI/Function-Libraries/VotingProgram.js +++ b/Projects/Governance/UI/Function-Libraries/VotingProgram.js @@ -148,6 +148,8 @@ function newGovernanceFunctionLibraryVotingProgram() { function distributeProgramPower(node, votes, percentage) { if (node === undefined) { return } if (node.payload === undefined) { return } + if (node.payload.votingProgram === undefined) {return} + node.payload.votingProgram.votes = node.payload.votingProgram.votes + votes drawVotes(node, node.payload.votingProgram.votes, percentage) /* @@ -195,19 +197,16 @@ function newGovernanceFunctionLibraryVotingProgram() { 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': { - if (node.type === 'User Profile' && property.name === "votingProgram") { - let childNode = node[property.name] - if (childNode === undefined) { continue } - let percentage = UI.projects.foundations.utilities.nodeConfig.loadConfigProperty(childNode.payload, 'percentage') - if (percentage !== undefined && isNaN(percentage) !== true) { - totalPercentage = totalPercentage + percentage - } else { - totalNodesWithoutPercentage++ - } + let childNode = node[property.name] + if (childNode === undefined) { continue } + if (childNode.type === 'Tokens Bonus') { continue } + let percentage = UI.projects.foundations.utilities.nodeConfig.loadConfigProperty(childNode.payload, 'percentage') + if (percentage !== undefined && isNaN(percentage) !== true) { + totalPercentage = totalPercentage + percentage + } else { + totalNodesWithoutPercentage++ } } break @@ -217,6 +216,7 @@ function newGovernanceFunctionLibraryVotingProgram() { for (let m = 0; m < propertyArray.length; m++) { let childNode = propertyArray[m] if (childNode === undefined) { continue } + if (childNode.type === 'Tokens Bonus') { continue } let percentage = UI.projects.foundations.utilities.nodeConfig.loadConfigProperty(childNode.payload, 'percentage') if (percentage !== undefined && isNaN(percentage) !== true) { totalPercentage = totalPercentage + percentage @@ -243,19 +243,16 @@ function newGovernanceFunctionLibraryVotingProgram() { 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': { - if (node.type === 'User Profile' && property.name === "votingProgram") { - let childNode = node[property.name] - if (childNode === undefined) { continue } - let percentage = UI.projects.foundations.utilities.nodeConfig.loadConfigProperty(childNode.payload, 'percentage') - if (percentage === undefined || isNaN(percentage) === true) { - percentage = defaultPercentage - } - distributeProgramPower(childNode, votes * percentage / 100, percentage) + let childNode = node[property.name] + if (childNode === undefined) { continue } + if (childNode.type === 'Tokens Bonus') { continue } + let percentage = UI.projects.foundations.utilities.nodeConfig.loadConfigProperty(childNode.payload, 'percentage') + if (percentage === undefined || isNaN(percentage) === true) { + percentage = defaultPercentage } + distributeProgramPower(childNode, votes * percentage / 100, percentage) } break case 'array': { @@ -264,6 +261,7 @@ function newGovernanceFunctionLibraryVotingProgram() { for (let m = 0; m < propertyArray.length; m++) { let childNode = propertyArray[m] if (childNode === undefined) { continue } + if (childNode.type === 'Tokens Bonus') { continue } let percentage = UI.projects.foundations.utilities.nodeConfig.loadConfigProperty(childNode.payload, 'percentage') if (percentage === undefined || isNaN(percentage) === true) { percentage = defaultPercentage diff --git a/Projects/ProjectsSchema.json b/Projects/ProjectsSchema.json index 9a134882c..fa8be55b1 100644 --- a/Projects/ProjectsSchema.json +++ b/Projects/ProjectsSchema.json @@ -973,6 +973,11 @@ "propertyName": "votingProgram", "functionName": "newGovernanceFunctionLibraryVotingProgram" }, + { + "name": "Delegation Program", + "propertyName": "delegationProgram", + "functionName": "newGovernanceFunctionLibraryDelegationProgram" + }, { "name": "Tokens", "propertyName": "tokens",