From 49b015dca62a19e2a261b3ba0acf46908af9d2d0 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 22 Nov 2021 14:22:14 +0100 Subject: [PATCH 01/19] User Bots Schemas --- Platform/Client/githubServer.js | 5 + Projects/Governance/Icons/trading-bot.png | Bin 0 -> 15217 bytes Projects/Governance/Icons/trading-bots.png | Bin 0 -> 15217 bytes Projects/Governance/Icons/user-bots.png | Bin 0 -> 15217 bytes .../User-Profiles/Luis-Fernando-Molina.json | 397 ++++++++++++------ .../Schemas/App-Schema/trading-bot.json | 36 ++ .../Schemas/App-Schema/trading-bots.json | 50 +++ .../Schemas/App-Schema/user-bots.json | 52 +++ .../Schemas/App-Schema/user-profile.json | 16 + 9 files changed, 429 insertions(+), 127 deletions(-) create mode 100644 Projects/Governance/Icons/trading-bot.png create mode 100644 Projects/Governance/Icons/trading-bots.png create mode 100644 Projects/Governance/Icons/user-bots.png create mode 100644 Projects/Governance/Schemas/App-Schema/trading-bot.json create mode 100644 Projects/Governance/Schemas/App-Schema/trading-bots.json create mode 100644 Projects/Governance/Schemas/App-Schema/user-bots.json diff --git a/Platform/Client/githubServer.js b/Platform/Client/githubServer.js index eff3ebc8d..cdf879457 100644 --- a/Platform/Client/githubServer.js +++ b/Platform/Client/githubServer.js @@ -323,6 +323,11 @@ exports.newGithubServer = function newGithubServer() { if (await validateUserProfileBlockchainAccountDoesNotBelongtoAnotherUserProfile() === false) { continue } if (await validateUserProfileSigningAccountsDoesNotBelongtoAnotherUserProfile() === false) { continue } + /* + TODO: We need to check before merging a User Profile that none of id of the node of the profile hierearchy exists at any other + User Profile already at the repository, to avoid atacts of users highjacking references of other user profiles. + */ + if (await mergePullRequest() === false) { console.log('[WARN] Github Server -> mergeGithubPullRequests -> Merge Failed -> Pull Request "' + pullRequest.title + '" not merged because Github could not merge it. -> mergeResponse.message = ' + mergeResponse.data.message) } else { diff --git a/Projects/Governance/Icons/trading-bot.png b/Projects/Governance/Icons/trading-bot.png new file mode 100644 index 0000000000000000000000000000000000000000..a4ee2a209ae5922e1d49d3686dfabf910a979d02 GIT binary patch literal 15217 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

RpcMz)%$uM4rLoL`Z6O>#hyp!} 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

RpcMz)%$uM4rLoL`Z6O>#hyp!} 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

RpcMz)%$uM4rLoL`Z6O>#hyp!} zk~?Jo7l$6cpqVNOSHaTX#0(6OBq)I)ho<)5NdQcqW4X*uSLW-Y08%)zKy8wTwcTgc zaldh6DNk1$yFk6#OS-=_=iq9W&}%7NiwmjbAj~lRFv#RzCBGqTCGL>5+xL%*U!SXBiPb|1Gjec@*Hqf3Sg2| z+YNTQ168O%HsP@j<3$9vTL~g9VgaR)aLH}=^szzBDR{jEArD_9Xe5}zX=P!?xm@_g zS%}q=H~=OtVV4%l5`%LbIY(<~*S!GH$62Pv3y_#N4h57cn3H13s!4*&dVJENHNb`X*<9Yb`8EIUK3#oAp(-IPY^Eb}{ zPrvjBKv_}v*Wy$*2CLhGv&p3#xsoLW0hPE)*gRAk2j3IM1ueaXWN2XV+_9CU#(DU* zJx9mjsySW+w%oBPCqB(3Bv5;;C;;$F;g7<;xGb751?U!B_gi^9-u4X23uw6t`}7M8 z!&<@~Rs!siOJ#~dLm>DDwMCctZkpjqsDdHaJ^jm^zndrxfG?xMP8u|jp*;I+0Z!-j zOg`Y=R+wf2h=Eqbjj({U!O)t0eK$KFWQ7PVo-m$3D6pq6S|BpcB(C$1k3ORTM=6_*;;MNxS6G`? s;XgsX@9Cd?db;7Trading Bots->" + }, + "propertyNameAtParent": "tradingBots", + "childrenNodesProperties": [ + ] +} \ No newline at end of file diff --git a/Projects/Governance/Schemas/App-Schema/trading-bots.json b/Projects/Governance/Schemas/App-Schema/trading-bots.json new file mode 100644 index 000000000..621ac26b3 --- /dev/null +++ b/Projects/Governance/Schemas/App-Schema/trading-bots.json @@ -0,0 +1,50 @@ +{ + "type": "Trading Bots", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "actionFunction": "payload.executeAction", + "label": "Add Trading Bot", + "relatedUiObject": "Trading Bot", + "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": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->User Bots->" + }, + "propertyNameAtParent": "tradingBots", + "childrenNodesProperties": [ + { + "name": "tradingBots", + "type": "array", + "childType": "Trading Bot", + "autoAdd": false + } + ] +} \ No newline at end of file diff --git a/Projects/Governance/Schemas/App-Schema/user-bots.json b/Projects/Governance/Schemas/App-Schema/user-bots.json new file mode 100644 index 000000000..b6a263642 --- /dev/null +++ b/Projects/Governance/Schemas/App-Schema/user-bots.json @@ -0,0 +1,52 @@ +{ + "type": "User Bots", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "tradingBots", + "actionFunction": "payload.executeAction", + "label": "Add Trading Bots", + "relatedUiObject": "Trading Bots", + "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": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->User Profile->" + }, + "propertyNameAtParent": "userBots", + "childrenNodesProperties": [ + { + "name": "tradingBots", + "type": "node", + "childType": "Trading Bots", + "autoAdd": false + } + ] +} \ No newline at end of file diff --git a/Projects/Governance/Schemas/App-Schema/user-profile.json b/Projects/Governance/Schemas/App-Schema/user-profile.json index adec94dd9..e7f61696c 100644 --- a/Projects/Governance/Schemas/App-Schema/user-profile.json +++ b/Projects/Governance/Schemas/App-Schema/user-profile.json @@ -28,6 +28,16 @@ "relatedUiObject": "Tokens Mined", "relatedUiObjectProject": "Governance" }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "userBots", + "actionFunction": "payload.executeAction", + "label": "Add User Bots", + "relatedUiObject": "User Bots", + "relatedUiObjectProject": "Governance" + }, { "action": "Install as Plugin", "actionProject": "Community-Plugins", @@ -77,6 +87,12 @@ "type": "node", "childType": "Signing Accounts", "autoAdd": false + }, + { + "name": "userBots", + "type": "node", + "childType": "User Bots", + "autoAdd": false } ], "inMapMode": { From f37399a73b0c6055bdc456d1a81da78b1d8376ac Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 22 Nov 2021 14:51:31 +0100 Subject: [PATCH 02/19] Social Personas Schemas done --- Projects/Governance/Icons/social-persona.png | Bin 0 -> 15217 bytes Projects/Governance/Icons/social-personas.png | Bin 0 -> 15217 bytes .../User-Profiles/Luis-Fernando-Molina.json | 274 ++++++++++++------ .../Schemas/App-Schema/social-persona.json | 36 +++ .../Schemas/App-Schema/social-personas.json | 50 ++++ .../Schemas/App-Schema/user-profile.json | 16 + 6 files changed, 285 insertions(+), 91 deletions(-) create mode 100644 Projects/Governance/Icons/social-persona.png create mode 100644 Projects/Governance/Icons/social-personas.png create mode 100644 Projects/Governance/Schemas/App-Schema/social-persona.json create mode 100644 Projects/Governance/Schemas/App-Schema/social-personas.json diff --git a/Projects/Governance/Icons/social-persona.png b/Projects/Governance/Icons/social-persona.png new file mode 100644 index 0000000000000000000000000000000000000000..a4ee2a209ae5922e1d49d3686dfabf910a979d02 GIT binary patch literal 15217 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

RpcMz)%$uM4rLoL`Z6O>#hyp!} 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

RpcMz)%$uM4rLoL`Z6O>#hyp!} zk~?Jo7l$6cpqVNOSHaTX#0(6OBq)I)ho<)5NdQcqW4X*uSLW-Y08%)zKy8wTwcTgc zaldh6DNk1$yFk6#OS-=_=iq9W&}%7NiwmjbAj~lRFv#RzCBGqTCGL>5+xL%*U!SXBiPb|1Gjec@*Hqf3Sg2| z+YNTQ168O%HsP@j<3$9vTL~g9VgaR)aLH}=^szzBDR{jEArD_9Xe5}zX=P!?xm@_g zS%}q=H~=OtVV4%l5`%LbIY(<~*S!GH$62Pv3y_#N4h57cn3H13s!4*&dVJENHNb`X*<9Yb`8EIUK3#oAp(-IPY^Eb}{ zPrvjBKv_}v*Wy$*2CLhGv&p3#xsoLW0hPE)*gRAk2j3IM1ueaXWN2XV+_9CU#(DU* zJx9mjsySW+w%oBPCqB(3Bv5;;C;;$F;g7<;xGb751?U!B_gi^9-u4X23uw6t`}7M8 z!&<@~Rs!siOJ#~dLm>DDwMCctZkpjqsDdHaJ^jm^zndrxfG?xMP8u|jp*;I+0Z!-j zOg`Y=R+wf2h=Eqbjj({U!O)t0eK$KFWQ7PVo-m$3D6pq6S|BpcB(C$1k3ORTM=6_*;;MNxS6G`? s;XgsX@9Cd?db;7Social Personas->" + }, + "propertyNameAtParent": "socialPersonas", + "childrenNodesProperties": [ + ] +} \ No newline at end of file diff --git a/Projects/Governance/Schemas/App-Schema/social-personas.json b/Projects/Governance/Schemas/App-Schema/social-personas.json new file mode 100644 index 000000000..31ac34d3f --- /dev/null +++ b/Projects/Governance/Schemas/App-Schema/social-personas.json @@ -0,0 +1,50 @@ +{ + "type": "Social Personas", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "actionFunction": "payload.executeAction", + "label": "Add Social Persona", + "relatedUiObject": "Social Persona", + "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": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->User Profile->" + }, + "propertyNameAtParent": "userBots", + "childrenNodesProperties": [ + { + "name": "socialPersonas", + "type": "array", + "childType": "Social Persona", + "autoAdd": false + } + ] +} \ No newline at end of file diff --git a/Projects/Governance/Schemas/App-Schema/user-profile.json b/Projects/Governance/Schemas/App-Schema/user-profile.json index e7f61696c..00c2cd39b 100644 --- a/Projects/Governance/Schemas/App-Schema/user-profile.json +++ b/Projects/Governance/Schemas/App-Schema/user-profile.json @@ -38,6 +38,16 @@ "relatedUiObject": "User Bots", "relatedUiObjectProject": "Governance" }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "socialPersonas", + "actionFunction": "payload.executeAction", + "label": "Add Social Personas", + "relatedUiObject": "Social Personas", + "relatedUiObjectProject": "Governance" + }, { "action": "Install as Plugin", "actionProject": "Community-Plugins", @@ -93,6 +103,12 @@ "type": "node", "childType": "User Bots", "autoAdd": false + }, + { + "name": "socialPersonas", + "type": "node", + "childType": "Social Personas", + "autoAdd": false } ], "inMapMode": { From df476b69cffe1c9ea4a1f168b9b4530c447d6075 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 22 Nov 2021 16:40:36 +0100 Subject: [PATCH 03/19] Social Trading Bots --- ...ng-bot.png => social-persona-followed.png} | Bin ...bots.png => social-personas-following.png} | Bin .../Icons/social-trading-bot-followed.png | Bin 0 -> 15217 bytes .../Governance/Icons/social-trading-bot.png | Bin 0 -> 15217 bytes .../Icons/social-trading-bots-following.png | Bin 0 -> 15217 bytes .../Governance/Icons/social-trading-bots.png | Bin 0 -> 15217 bytes .../User-Profiles/Luis-Fernando-Molina.json | 234 ++++++++++++++++-- ...-bot.json => social-persona-followed.json} | 6 +- .../Schemas/App-Schema/social-persona.json | 16 ++ .../App-Schema/social-personas-following.json | 50 ++++ .../social-trading-bot-followed.json | 36 +++ .../App-Schema/social-trading-bot.json | 52 ++++ .../social-trading-bots-following.json | 50 ++++ ...ing-bots.json => social-trading-bots.json} | 12 +- .../Schemas/App-Schema/user-bots.json | 10 +- 15 files changed, 432 insertions(+), 34 deletions(-) rename Projects/Governance/Icons/{trading-bot.png => social-persona-followed.png} (100%) rename Projects/Governance/Icons/{trading-bots.png => social-personas-following.png} (100%) create mode 100644 Projects/Governance/Icons/social-trading-bot-followed.png create mode 100644 Projects/Governance/Icons/social-trading-bot.png create mode 100644 Projects/Governance/Icons/social-trading-bots-following.png create mode 100644 Projects/Governance/Icons/social-trading-bots.png rename Projects/Governance/Schemas/App-Schema/{trading-bot.json => social-persona-followed.json} (84%) create mode 100644 Projects/Governance/Schemas/App-Schema/social-personas-following.json create mode 100644 Projects/Governance/Schemas/App-Schema/social-trading-bot-followed.json create mode 100644 Projects/Governance/Schemas/App-Schema/social-trading-bot.json create mode 100644 Projects/Governance/Schemas/App-Schema/social-trading-bots-following.json rename Projects/Governance/Schemas/App-Schema/{trading-bots.json => social-trading-bots.json} (81%) diff --git a/Projects/Governance/Icons/trading-bot.png b/Projects/Governance/Icons/social-persona-followed.png similarity index 100% rename from Projects/Governance/Icons/trading-bot.png rename to Projects/Governance/Icons/social-persona-followed.png diff --git a/Projects/Governance/Icons/trading-bots.png b/Projects/Governance/Icons/social-personas-following.png similarity index 100% rename from Projects/Governance/Icons/trading-bots.png rename to Projects/Governance/Icons/social-personas-following.png diff --git a/Projects/Governance/Icons/social-trading-bot-followed.png b/Projects/Governance/Icons/social-trading-bot-followed.png new file mode 100644 index 0000000000000000000000000000000000000000..a4ee2a209ae5922e1d49d3686dfabf910a979d02 GIT binary patch literal 15217 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

RpcMz)%$uM4rLoL`Z6O>#hyp!} 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

RpcMz)%$uM4rLoL`Z6O>#hyp!} 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

RpcMz)%$uM4rLoL`Z6O>#hyp!} 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

RpcMz)%$uM4rLoL`Z6O>#hyp!} zk~?Jo7l$6cpqVNOSHaTX#0(6OBq)I)ho<)5NdQcqW4X*uSLW-Y08%)zKy8wTwcTgc zaldh6DNk1$yFk6#OS-=_=iq9W&}%7NiwmjbAj~lRFv#RzCBGqTCGL>5+xL%*U!SXBiPb|1Gjec@*Hqf3Sg2| z+YNTQ168O%HsP@j<3$9vTL~g9VgaR)aLH}=^szzBDR{jEArD_9Xe5}zX=P!?xm@_g zS%}q=H~=OtVV4%l5`%LbIY(<~*S!GH$62Pv3y_#N4h57cn3H13s!4*&dVJENHNb`X*<9Yb`8EIUK3#oAp(-IPY^Eb}{ zPrvjBKv_}v*Wy$*2CLhGv&p3#xsoLW0hPE)*gRAk2j3IM1ueaXWN2XV+_9CU#(DU* zJx9mjsySW+w%oBPCqB(3Bv5;;C;;$F;g7<;xGb751?U!B_gi^9-u4X23uw6t`}7M8 z!&<@~Rs!siOJ#~dLm>DDwMCctZkpjqsDdHaJ^jm^zndrxfG?xMP8u|jp*;I+0Z!-j zOg`Y=R+wf2h=Eqbjj({U!O)t0eK$KFWQ7PVo-m$3D6pq6S|BpcB(C$1k3ORTM=6_*;;MNxS6G`? s;XgsX@9Cd?db;7Trading Bots->" + "compatibleTypes": "->Social Personas Following->" }, - "propertyNameAtParent": "tradingBots", + "propertyNameAtParent": "socialPersonasFollowed", "childrenNodesProperties": [ ] } \ No newline at end of file diff --git a/Projects/Governance/Schemas/App-Schema/social-persona.json b/Projects/Governance/Schemas/App-Schema/social-persona.json index d8ccb2b89..fa48d6320 100644 --- a/Projects/Governance/Schemas/App-Schema/social-persona.json +++ b/Projects/Governance/Schemas/App-Schema/social-persona.json @@ -8,6 +8,16 @@ "iconPathOn": "configuration", "iconPathOff": "configuration" }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "tradingBotsFollowing", + "actionFunction": "payload.executeAction", + "label": "Add Social Personas Following", + "relatedUiObject": "Social Personas Following", + "relatedUiObjectProject": "Governance" + }, { "action": "Delete UI Object", "actionProject": "Visual-Scripting", @@ -32,5 +42,11 @@ }, "propertyNameAtParent": "socialPersonas", "childrenNodesProperties": [ + { + "name": "socialPersonasFollowing", + "type": "node", + "childType": "Social Personas Following", + "autoAdd": false + } ] } \ No newline at end of file diff --git a/Projects/Governance/Schemas/App-Schema/social-personas-following.json b/Projects/Governance/Schemas/App-Schema/social-personas-following.json new file mode 100644 index 000000000..73184792c --- /dev/null +++ b/Projects/Governance/Schemas/App-Schema/social-personas-following.json @@ -0,0 +1,50 @@ +{ + "type": "Social Personas Following", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "actionFunction": "payload.executeAction", + "label": "Add Social Persona Followed", + "relatedUiObject": "Social Persona Followed", + "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": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->Social Persona->" + }, + "propertyNameAtParent": "following", + "childrenNodesProperties": [ + { + "name": "socialPersonasFollowed", + "type": "array", + "childType": "Social Persona Followed", + "autoAdd": false + } + ] +} \ No newline at end of file diff --git a/Projects/Governance/Schemas/App-Schema/social-trading-bot-followed.json b/Projects/Governance/Schemas/App-Schema/social-trading-bot-followed.json new file mode 100644 index 000000000..5ec4d0623 --- /dev/null +++ b/Projects/Governance/Schemas/App-Schema/social-trading-bot-followed.json @@ -0,0 +1,36 @@ +{ + "type": "Social Trading Bot Followed", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "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": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->Social Trading Bots Following->" + }, + "propertyNameAtParent": "socialTradingBotsFollowed", + "childrenNodesProperties": [ + ] +} \ No newline at end of file diff --git a/Projects/Governance/Schemas/App-Schema/social-trading-bot.json b/Projects/Governance/Schemas/App-Schema/social-trading-bot.json new file mode 100644 index 000000000..e2b8218c6 --- /dev/null +++ b/Projects/Governance/Schemas/App-Schema/social-trading-bot.json @@ -0,0 +1,52 @@ +{ + "type": "Social Trading Bot", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "socialTradingBotsFollowing", + "actionFunction": "payload.executeAction", + "label": "Add Social Trading Bots Following", + "relatedUiObject": "Social Trading Bots Following", + "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": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->Social Trading Bots->" + }, + "propertyNameAtParent": "socialTradingBots", + "childrenNodesProperties": [ + { + "name": "socialTradingBotsFollowing", + "type": "node", + "childType": "Social Trading Bots Following", + "autoAdd": false + } + ] +} \ No newline at end of file diff --git a/Projects/Governance/Schemas/App-Schema/social-trading-bots-following.json b/Projects/Governance/Schemas/App-Schema/social-trading-bots-following.json new file mode 100644 index 000000000..53b370894 --- /dev/null +++ b/Projects/Governance/Schemas/App-Schema/social-trading-bots-following.json @@ -0,0 +1,50 @@ +{ + "type": "Social Trading Bots Following", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "actionFunction": "payload.executeAction", + "label": "Add Social Trading Bot Followed", + "relatedUiObject": "Social Trading Bot Followed", + "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": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->Social Trading Bot->" + }, + "propertyNameAtParent": "following", + "childrenNodesProperties": [ + { + "name": "socialTradingBotsFollowed", + "type": "array", + "childType": "Social Trading Bot Followed", + "autoAdd": false + } + ] +} \ No newline at end of file diff --git a/Projects/Governance/Schemas/App-Schema/trading-bots.json b/Projects/Governance/Schemas/App-Schema/social-trading-bots.json similarity index 81% rename from Projects/Governance/Schemas/App-Schema/trading-bots.json rename to Projects/Governance/Schemas/App-Schema/social-trading-bots.json index 621ac26b3..ae7104918 100644 --- a/Projects/Governance/Schemas/App-Schema/trading-bots.json +++ b/Projects/Governance/Schemas/App-Schema/social-trading-bots.json @@ -1,5 +1,5 @@ { - "type": "Trading Bots", + "type": "Social Trading Bots", "menuItems": [ { "action": "Configure", @@ -12,8 +12,8 @@ "action": "Add UI Object", "actionProject": "Visual-Scripting", "actionFunction": "payload.executeAction", - "label": "Add Trading Bot", - "relatedUiObject": "Trading Bot", + "label": "Add Social Trading Bot", + "relatedUiObject": "Social Trading Bot", "relatedUiObjectProject": "Governance" }, { @@ -38,12 +38,12 @@ "attachingRules": { "compatibleTypes": "->User Bots->" }, - "propertyNameAtParent": "tradingBots", + "propertyNameAtParent": "socialTradingBots", "childrenNodesProperties": [ { - "name": "tradingBots", + "name": "socialTradingBots", "type": "array", - "childType": "Trading Bot", + "childType": "Social Trading Bot", "autoAdd": false } ] diff --git a/Projects/Governance/Schemas/App-Schema/user-bots.json b/Projects/Governance/Schemas/App-Schema/user-bots.json index b6a263642..73055f857 100644 --- a/Projects/Governance/Schemas/App-Schema/user-bots.json +++ b/Projects/Governance/Schemas/App-Schema/user-bots.json @@ -12,10 +12,10 @@ "action": "Add UI Object", "actionProject": "Visual-Scripting", "disableIfPropertyIsDefined": true, - "propertyToCheckFor": "tradingBots", + "propertyToCheckFor": "socialTradingBots", "actionFunction": "payload.executeAction", - "label": "Add Trading Bots", - "relatedUiObject": "Trading Bots", + "label": "Add Social Trading Bots", + "relatedUiObject": "Social Trading Bots", "relatedUiObjectProject": "Governance" }, { @@ -43,9 +43,9 @@ "propertyNameAtParent": "userBots", "childrenNodesProperties": [ { - "name": "tradingBots", + "name": "socialTradingBots", "type": "node", - "childType": "Trading Bots", + "childType": "Social Trading Bots", "autoAdd": false } ] From 6e781d876b4e70de76e7389cd73aebe50e811c6c Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 22 Nov 2021 17:25:56 +0100 Subject: [PATCH 04/19] Social Trading Bot upgraded --- .../User-Profiles/Luis-Fernando-Molina.json | 21 ++++++++++++++++++- .../App-Schema/social-persona-followed.json | 6 ++++++ .../Schemas/App-Schema/social-persona.json | 2 +- .../social-trading-bot-followed.json | 6 ++++++ 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json b/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json index 26b04a16a..2e2709326 100644 --- a/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json +++ b/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json @@ -17859,7 +17859,26 @@ }, "uiObject": { "isRunning": false - } + }, + "referenceParent": { + "type": "Social Persona", + "name": "New Social Persona", + "id": "d2502a7d-63af-408e-80d1-52458b9e7aec" + }, + "referenceParentCombinedNodePath": [ + [ + "Luis-Fernando-Molina", + "User Profile" + ], + [ + "New Social Personas", + "Social Personas" + ], + [ + "New Social Persona", + "Social Persona" + ] + ] } } ], diff --git a/Projects/Governance/Schemas/App-Schema/social-persona-followed.json b/Projects/Governance/Schemas/App-Schema/social-persona-followed.json index f832b0f83..d6986fd09 100644 --- a/Projects/Governance/Schemas/App-Schema/social-persona-followed.json +++ b/Projects/Governance/Schemas/App-Schema/social-persona-followed.json @@ -30,7 +30,13 @@ "attachingRules": { "compatibleTypes": "->Social Personas Following->" }, + "referencingRules": { + "compatibleTypes": "->Social Persona->" + }, "propertyNameAtParent": "socialPersonasFollowed", "childrenNodesProperties": [ + ], + "title": [ + "Use Reference Parent" ] } \ No newline at end of file diff --git a/Projects/Governance/Schemas/App-Schema/social-persona.json b/Projects/Governance/Schemas/App-Schema/social-persona.json index fa48d6320..b14766ed8 100644 --- a/Projects/Governance/Schemas/App-Schema/social-persona.json +++ b/Projects/Governance/Schemas/App-Schema/social-persona.json @@ -39,7 +39,7 @@ "level": 2, "attachingRules": { "compatibleTypes": "->Social Personas->" - }, + }, "propertyNameAtParent": "socialPersonas", "childrenNodesProperties": [ { diff --git a/Projects/Governance/Schemas/App-Schema/social-trading-bot-followed.json b/Projects/Governance/Schemas/App-Schema/social-trading-bot-followed.json index 5ec4d0623..b0d56bc0a 100644 --- a/Projects/Governance/Schemas/App-Schema/social-trading-bot-followed.json +++ b/Projects/Governance/Schemas/App-Schema/social-trading-bot-followed.json @@ -30,7 +30,13 @@ "attachingRules": { "compatibleTypes": "->Social Trading Bots Following->" }, + "referencingRules": { + "compatibleTypes": "->Social Trading Bot->" + }, "propertyNameAtParent": "socialTradingBotsFollowed", "childrenNodesProperties": [ + ], + "title": [ + "Use Reference Parent" ] } \ No newline at end of file From d271c1182154aced744c8295a6d1802bcdfa0b1a Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 22 Nov 2021 19:18:44 +0100 Subject: [PATCH 05/19] User Apss Structure Done --- Projects/Governance/Icons/desktop-apps.png | Bin 0 -> 15217 bytes Projects/Governance/Icons/mobile-apps.png | Bin 0 -> 15217 bytes Projects/Governance/Icons/server-apps.png | Bin 0 -> 15217 bytes Projects/Governance/Icons/user-apps.png | Bin 0 -> 15217 bytes .../User-Profiles/Luis-Fernando-Molina.json | 656 +++++++++++++----- .../App-Schema/algo-traders-platform.json | 6 +- .../Schemas/App-Schema/desktop-apps.json | 64 ++ .../Schemas/App-Schema/mobile-apps.json | 50 ++ .../Schemas/App-Schema/server-apps.json | 50 ++ .../Schemas/App-Schema/social-persona.json | 4 +- .../social-trading-desktop-app.json | 4 +- .../App-Schema/social-trading-mobile-app.json | 4 +- .../App-Schema/social-trading-server-app.json | 4 +- .../Schemas/App-Schema/user-apps.json | 84 +++ .../Schemas/App-Schema/user-bots.json | 2 +- .../Schemas/App-Schema/user-profile.json | 16 + 16 files changed, 765 insertions(+), 179 deletions(-) create mode 100644 Projects/Governance/Icons/desktop-apps.png create mode 100644 Projects/Governance/Icons/mobile-apps.png create mode 100644 Projects/Governance/Icons/server-apps.png create mode 100644 Projects/Governance/Icons/user-apps.png create mode 100644 Projects/Governance/Schemas/App-Schema/desktop-apps.json create mode 100644 Projects/Governance/Schemas/App-Schema/mobile-apps.json create mode 100644 Projects/Governance/Schemas/App-Schema/server-apps.json create mode 100644 Projects/Governance/Schemas/App-Schema/user-apps.json diff --git a/Projects/Governance/Icons/desktop-apps.png b/Projects/Governance/Icons/desktop-apps.png new file mode 100644 index 0000000000000000000000000000000000000000..a4ee2a209ae5922e1d49d3686dfabf910a979d02 GIT binary patch literal 15217 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

RpcMz)%$uM4rLoL`Z6O>#hyp!} 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

RpcMz)%$uM4rLoL`Z6O>#hyp!} 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

RpcMz)%$uM4rLoL`Z6O>#hyp!} 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

RpcMz)%$uM4rLoL`Z6O>#hyp!} zk~?Jo7l$6cpqVNOSHaTX#0(6OBq)I)ho<)5NdQcqW4X*uSLW-Y08%)zKy8wTwcTgc zaldh6DNk1$yFk6#OS-=_=iq9W&}%7NiwmjbAj~lRFv#RzCBGqTCGL>5+xL%*U!SXBiPb|1Gjec@*Hqf3Sg2| z+YNTQ168O%HsP@j<3$9vTL~g9VgaR)aLH}=^szzBDR{jEArD_9Xe5}zX=P!?xm@_g zS%}q=H~=OtVV4%l5`%LbIY(<~*S!GH$62Pv3y_#N4h57cn3H13s!4*&dVJENHNb`X*<9Yb`8EIUK3#oAp(-IPY^Eb}{ zPrvjBKv_}v*Wy$*2CLhGv&p3#xsoLW0hPE)*gRAk2j3IM1ueaXWN2XV+_9CU#(DU* zJx9mjsySW+w%oBPCqB(3Bv5;;C;;$F;g7<;xGb751?U!B_gi^9-u4X23uw6t`}7M8 z!&<@~Rs!siOJ#~dLm>DDwMCctZkpjqsDdHaJ^jm^zndrxfG?xMP8u|jp*;I+0Z!-j zOg`Y=R+wf2h=Eqbjj({U!O)t0eK$KFWQ7PVo-m$3D6pq6S|BpcB(C$1k3ORTM=6_*;;MNxS6G`? s;XgsX@9Cd?db;7Signing Account->" + "compatibleTypes": "->Desktop Apps->" }, "childrenNodesProperties": [], - "propertyNameAtParent": "signingAccountChild" + "propertyNameAtParent": "algoTradesPlatform" } \ No newline at end of file diff --git a/Projects/Governance/Schemas/App-Schema/desktop-apps.json b/Projects/Governance/Schemas/App-Schema/desktop-apps.json new file mode 100644 index 000000000..de3f09cc6 --- /dev/null +++ b/Projects/Governance/Schemas/App-Schema/desktop-apps.json @@ -0,0 +1,64 @@ +{ + "type": "Desktop Apps", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "actionFunction": "payload.executeAction", + "label": "Add Social Trading Desktop App", + "relatedUiObject": "Social Trading Desktop App", + "relatedUiObjectProject": "Governance" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "actionFunction": "payload.executeAction", + "label": "Add Algo Traders Platform", + "relatedUiObject": "Algo Traders Platform", + "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": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->User Apps->" + }, + "propertyNameAtParent": "desktopApps", + "childrenNodesProperties": [ + { + "name": "socialTradingDesktopApps", + "type": "array", + "childType": "Social Trading Desktop App", + "autoAdd": false + }, + { + "name": "algoTradesPlatform", + "type": "array", + "childType": "Algo Traders Platform", + "autoAdd": false + } + ] +} \ No newline at end of file diff --git a/Projects/Governance/Schemas/App-Schema/mobile-apps.json b/Projects/Governance/Schemas/App-Schema/mobile-apps.json new file mode 100644 index 000000000..9ae21fbd1 --- /dev/null +++ b/Projects/Governance/Schemas/App-Schema/mobile-apps.json @@ -0,0 +1,50 @@ +{ + "type": "Mobile Apps", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "actionFunction": "payload.executeAction", + "label": "Add Social Trading Mobile App", + "relatedUiObject": "Social Trading Mobile App", + "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": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->User Apps->" + }, + "propertyNameAtParent": "mobileApps", + "childrenNodesProperties": [ + { + "name": "socialTradingMobileApps", + "type": "array", + "childType": "Social Trading Mobile App", + "autoAdd": false + } + ] +} \ No newline at end of file diff --git a/Projects/Governance/Schemas/App-Schema/server-apps.json b/Projects/Governance/Schemas/App-Schema/server-apps.json new file mode 100644 index 000000000..97890a68f --- /dev/null +++ b/Projects/Governance/Schemas/App-Schema/server-apps.json @@ -0,0 +1,50 @@ +{ + "type": "Server Apps", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "actionFunction": "payload.executeAction", + "label": "Add Social Trading Server App", + "relatedUiObject": "Social Trading Server App", + "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": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->User Apps->" + }, + "propertyNameAtParent": "serverApps", + "childrenNodesProperties": [ + { + "name": "socialTradingServerApps", + "type": "array", + "childType": "Social Trading Server App", + "autoAdd": false + } + ] +} \ No newline at end of file diff --git a/Projects/Governance/Schemas/App-Schema/social-persona.json b/Projects/Governance/Schemas/App-Schema/social-persona.json index b14766ed8..4da7d7e81 100644 --- a/Projects/Governance/Schemas/App-Schema/social-persona.json +++ b/Projects/Governance/Schemas/App-Schema/social-persona.json @@ -33,13 +33,13 @@ "config": true }, "initialValues": { - "config": "{}" + "config": "{\"socialHandle\": \"\",\"bio\": \"\"}" }, "addLeftIcons": true, "level": 2, "attachingRules": { "compatibleTypes": "->Social Personas->" - }, + }, "propertyNameAtParent": "socialPersonas", "childrenNodesProperties": [ { diff --git a/Projects/Governance/Schemas/App-Schema/social-trading-desktop-app.json b/Projects/Governance/Schemas/App-Schema/social-trading-desktop-app.json index 32a0a255f..8859ed259 100644 --- a/Projects/Governance/Schemas/App-Schema/social-trading-desktop-app.json +++ b/Projects/Governance/Schemas/App-Schema/social-trading-desktop-app.json @@ -30,8 +30,8 @@ "addLeftIcons": true, "level": 1, "attachingRules": { - "compatibleTypes": "->Signing Account->" + "compatibleTypes": "->Desktop Apps->" }, "childrenNodesProperties": [], - "propertyNameAtParent": "signingAccountChild" + "propertyNameAtParent": "socialTradingDesktopApps" } \ No newline at end of file diff --git a/Projects/Governance/Schemas/App-Schema/social-trading-mobile-app.json b/Projects/Governance/Schemas/App-Schema/social-trading-mobile-app.json index 97202f837..364395b79 100644 --- a/Projects/Governance/Schemas/App-Schema/social-trading-mobile-app.json +++ b/Projects/Governance/Schemas/App-Schema/social-trading-mobile-app.json @@ -30,8 +30,8 @@ "addLeftIcons": true, "level": 1, "attachingRules": { - "compatibleTypes": "->Signing Account->" + "compatibleTypes": "->Mobile Apps->" }, "childrenNodesProperties": [], - "propertyNameAtParent": "signingAccountChild" + "propertyNameAtParent": "socialTradingMobileApps" } \ No newline at end of file diff --git a/Projects/Governance/Schemas/App-Schema/social-trading-server-app.json b/Projects/Governance/Schemas/App-Schema/social-trading-server-app.json index 45d284b28..35e5cd007 100644 --- a/Projects/Governance/Schemas/App-Schema/social-trading-server-app.json +++ b/Projects/Governance/Schemas/App-Schema/social-trading-server-app.json @@ -30,8 +30,8 @@ "addLeftIcons": true, "level": 1, "attachingRules": { - "compatibleTypes": "->Signing Account->" + "compatibleTypes": "->Server Apps->" }, "childrenNodesProperties": [], - "propertyNameAtParent": "signingAccountChild" + "propertyNameAtParent": "socialTradingServerApps" } \ No newline at end of file diff --git a/Projects/Governance/Schemas/App-Schema/user-apps.json b/Projects/Governance/Schemas/App-Schema/user-apps.json new file mode 100644 index 000000000..3d2e45bd1 --- /dev/null +++ b/Projects/Governance/Schemas/App-Schema/user-apps.json @@ -0,0 +1,84 @@ +{ + "type": "User Apps", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "desktopApps", + "actionFunction": "payload.executeAction", + "label": "Add Desktop Apps", + "relatedUiObject": "Desktop Apps", + "relatedUiObjectProject": "Governance" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "mobileApps", + "actionFunction": "payload.executeAction", + "label": "Add Mobile Apps", + "relatedUiObject": "Mobile Apps", + "relatedUiObjectProject": "Governance" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "serverApps", + "actionFunction": "payload.executeAction", + "label": "Add Server Apps", + "relatedUiObject": "Server Apps", + "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": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->User Profile->" + }, + "propertyNameAtParent": "userApps", + "childrenNodesProperties": [ + { + "name": "desktopApps", + "type": "node", + "childType": "Desktop Apps", + "autoAdd": false + }, + { + "name": "mobileApps", + "type": "node", + "childType": "Mobile Apps", + "autoAdd": false + }, + { + "name": "serverApps", + "type": "node", + "childType": "Server Apps", + "autoAdd": false + } + ] +} \ No newline at end of file diff --git a/Projects/Governance/Schemas/App-Schema/user-bots.json b/Projects/Governance/Schemas/App-Schema/user-bots.json index 73055f857..cd691f676 100644 --- a/Projects/Governance/Schemas/App-Schema/user-bots.json +++ b/Projects/Governance/Schemas/App-Schema/user-bots.json @@ -33,7 +33,7 @@ "config": true }, "initialValues": { - "config": "{}" + "config": "{\"socialHandle\": \"\",\"bio\": \"\"}" }, "addLeftIcons": true, "level": 2, diff --git a/Projects/Governance/Schemas/App-Schema/user-profile.json b/Projects/Governance/Schemas/App-Schema/user-profile.json index 00c2cd39b..0881383a0 100644 --- a/Projects/Governance/Schemas/App-Schema/user-profile.json +++ b/Projects/Governance/Schemas/App-Schema/user-profile.json @@ -28,6 +28,16 @@ "relatedUiObject": "Tokens Mined", "relatedUiObjectProject": "Governance" }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "userApps", + "actionFunction": "payload.executeAction", + "label": "Add User Apps", + "relatedUiObject": "User Apps", + "relatedUiObjectProject": "Governance" + }, { "action": "Add UI Object", "actionProject": "Visual-Scripting", @@ -98,6 +108,12 @@ "childType": "Signing Accounts", "autoAdd": false }, + { + "name": "userApps", + "type": "node", + "childType": "User Apps", + "autoAdd": false + }, { "name": "userBots", "type": "node", From 81b93abb6f5d67d5fb681d96ae287b76a60f0a9d Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 23 Nov 2021 15:58:36 +0100 Subject: [PATCH 06/19] P2P Network Nodes --- .../Governance/Icons/p2p-network-nodes.png | Bin 0 -> 15217 bytes .../Schemas/App-Schema/p2p-network-node.json | 4 +- .../Schemas/App-Schema/p2p-network-nodes.json | 50 ++++++++++++++++++ .../Schemas/App-Schema/user-profile.json | 16 ++++++ 4 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 Projects/Governance/Icons/p2p-network-nodes.png create mode 100644 Projects/Governance/Schemas/App-Schema/p2p-network-nodes.json diff --git a/Projects/Governance/Icons/p2p-network-nodes.png b/Projects/Governance/Icons/p2p-network-nodes.png new file mode 100644 index 0000000000000000000000000000000000000000..a4ee2a209ae5922e1d49d3686dfabf910a979d02 GIT binary patch literal 15217 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

RpcMz)%$uM4rLoL`Z6O>#hyp!} zk~?Jo7l$6cpqVNOSHaTX#0(6OBq)I)ho<)5NdQcqW4X*uSLW-Y08%)zKy8wTwcTgc zaldh6DNk1$yFk6#OS-=_=iq9W&}%7NiwmjbAj~lRFv#RzCBGqTCGL>5+xL%*U!SXBiPb|1Gjec@*Hqf3Sg2| z+YNTQ168O%HsP@j<3$9vTL~g9VgaR)aLH}=^szzBDR{jEArD_9Xe5}zX=P!?xm@_g zS%}q=H~=OtVV4%l5`%LbIY(<~*S!GH$62Pv3y_#N4h57cn3H13s!4*&dVJENHNb`X*<9Yb`8EIUK3#oAp(-IPY^Eb}{ zPrvjBKv_}v*Wy$*2CLhGv&p3#xsoLW0hPE)*gRAk2j3IM1ueaXWN2XV+_9CU#(DU* zJx9mjsySW+w%oBPCqB(3Bv5;;C;;$F;g7<;xGb751?U!B_gi^9-u4X23uw6t`}7M8 z!&<@~Rs!siOJ#~dLm>DDwMCctZkpjqsDdHaJ^jm^zndrxfG?xMP8u|jp*;I+0Z!-j zOg`Y=R+wf2h=Eqbjj({U!O)t0eK$KFWQ7PVo-m$3D6pq6S|BpcB(C$1k3ORTM=6_*;;MNxS6G`? s;XgsX@9Cd?db;7Signing Account->" + "compatibleTypes": "->P2P Network Nodes->" }, "childrenNodesProperties": [], - "propertyNameAtParent": "signingAccountChild" + "propertyNameAtParent": "p2pNetworkNodes" } \ No newline at end of file diff --git a/Projects/Governance/Schemas/App-Schema/p2p-network-nodes.json b/Projects/Governance/Schemas/App-Schema/p2p-network-nodes.json new file mode 100644 index 000000000..57e169abb --- /dev/null +++ b/Projects/Governance/Schemas/App-Schema/p2p-network-nodes.json @@ -0,0 +1,50 @@ +{ + "type": "P2P Network Nodes", + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "actionFunction": "payload.executeAction", + "label": "Add P2P Network Node", + "relatedUiObject": "P2P Network Node", + "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": "{}" + }, + "addLeftIcons": true, + "level": 2, + "attachingRules": { + "compatibleTypes": "->User Profile->" + }, + "propertyNameAtParent": "p2pNetworkNodes", + "childrenNodesProperties": [ + { + "name": "p2pNetworkNodes", + "type": "array", + "childType": "P2P Network Node", + "autoAdd": false + } + ] +} \ No newline at end of file diff --git a/Projects/Governance/Schemas/App-Schema/user-profile.json b/Projects/Governance/Schemas/App-Schema/user-profile.json index 0881383a0..e35ae4b87 100644 --- a/Projects/Governance/Schemas/App-Schema/user-profile.json +++ b/Projects/Governance/Schemas/App-Schema/user-profile.json @@ -58,6 +58,16 @@ "relatedUiObject": "Social Personas", "relatedUiObjectProject": "Governance" }, + { + "action": "Add UI Object", + "actionProject": "Visual-Scripting", + "disableIfPropertyIsDefined": true, + "propertyToCheckFor": "p2pNetworkNodes", + "actionFunction": "payload.executeAction", + "label": "Add P2P Network Nodes", + "relatedUiObject": "P2P Network Nodes", + "relatedUiObjectProject": "Governance" + }, { "action": "Install as Plugin", "actionProject": "Community-Plugins", @@ -125,6 +135,12 @@ "type": "node", "childType": "Social Personas", "autoAdd": false + }, + { + "name": "p2pNetworkNodes", + "type": "node", + "childType": "P2P Network Nodes", + "autoAdd": false } ], "inMapMode": { From 04f32998739ba3affffb8ce0b057d4d0b218c001 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 23 Nov 2021 20:17:34 +0100 Subject: [PATCH 07/19] profile constructor being updated --- .../Schemas/App-Schema/signing-account.json | 36 +++---------------- .../Function-Libraries/ProfileConstructor.js | 13 +++++-- 2 files changed, 15 insertions(+), 34 deletions(-) diff --git a/Projects/Governance/Schemas/App-Schema/signing-account.json b/Projects/Governance/Schemas/App-Schema/signing-account.json index 60e9db323..aa93c3f6a 100644 --- a/Projects/Governance/Schemas/App-Schema/signing-account.json +++ b/Projects/Governance/Schemas/App-Schema/signing-account.json @@ -25,6 +25,9 @@ "attachingRules": { "compatibleTypes": "->Signing Accounts->" }, + "referencingRules": { + "compatibleTypes": "->P2P Network Node->Algo Traders Platform->Social Trading Mobile App->Social Trading Desktop App->Social Trading Server App->" + }, "editors": { "config": true }, @@ -32,36 +35,5 @@ "config": "{}" }, "propertyNameAtParent": "signingAccounts", - "childrenNodesProperties": [ - { - "name": "signingAccountChild", - "type": "node", - "childType": "P2P Network Node", - "autoAdd": false - }, - { - "name": "signingAccountChild", - "type": "node", - "childType": "Algo Traders Platform", - "autoAdd": false - }, - { - "name": "signingAccountChild", - "type": "node", - "childType": "Social Trading Mobile App", - "autoAdd": false - }, - { - "name": "signingAccountChild", - "type": "node", - "childType": "Social Trading Desktop App", - "autoAdd": false - }, - { - "name": "signingAccountChild", - "type": "node", - "childType": "Social Trading Server App", - "autoAdd": false - } - ] + "childrenNodesProperties": [] } \ No newline at end of file diff --git a/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js b/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js index 285c171e5..327597641 100644 --- a/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js +++ b/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js @@ -1,6 +1,7 @@ function newGovernanceFunctionLibraryProfileConstructor() { let thisObject = { buildProfile: buildProfile, + installSecrets: installSecrets, addSigningAccount: addSigningAccount } @@ -139,6 +140,10 @@ function newGovernanceFunctionLibraryProfileConstructor() { */ userProfile.payload.uiObject.menu.internalClick('Install as Plugin') userProfile.payload.uiObject.menu.internalClick('Install as Plugin') + /* + Delete the mnemonic from the Profile Constructor config. + */ + node.config = "{}" /* Show nice message. */ @@ -157,6 +162,10 @@ function newGovernanceFunctionLibraryProfileConstructor() { } } + function installSecrets() { + + } + function addSigningAccount( node, rootNodes, @@ -251,11 +260,11 @@ function newGovernanceFunctionLibraryProfileConstructor() { } } - signUserProfileData(response.address, response.privateKey) + signSigningAccountData(response.address, response.privateKey) } } - function signUserProfileData(address, privateKey) { + function signSigningAccountData(address, privateKey) { let request = { url: 'WEB3', From 8c18a8e1bf2f30b623abae43db947bb0759c7eb4 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 23 Nov 2021 21:54:34 +0100 Subject: [PATCH 08/19] Remainder of Superscripts removed --- .../UI/Function-Libraries/SuperScripts.js | 90 ---- .../Function-Libraries/ProfileConstructor.js | 404 ++++++++++-------- 2 files changed, 222 insertions(+), 272 deletions(-) delete mode 100644 Projects/Foundations/UI/Function-Libraries/SuperScripts.js diff --git a/Projects/Foundations/UI/Function-Libraries/SuperScripts.js b/Projects/Foundations/UI/Function-Libraries/SuperScripts.js deleted file mode 100644 index 9a2c7d6e5..000000000 --- a/Projects/Foundations/UI/Function-Libraries/SuperScripts.js +++ /dev/null @@ -1,90 +0,0 @@ -function newFoundationsFunctionLibrarySuperScriptsFunctions() { - let thisObject = { - runSuperScript: runSuperScript - } - - return thisObject - - function runSuperScript(node, rootNodes) { - try { - let clone = UI.projects.visualScripting.functionLibraries.nodeCloning.getNodeClone - let executionResult = true - let superAction = node - - function setup(templateClone, target, exchange, exchangeNodeType, arrayPropertyName) { - spawnPosition.x = target.payload.position.x - spawnPosition.y = target.payload.position.y - - if (exchange === undefined) { - UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.createUiObjectFromNode(templateClone, target, target) - } else { - let definition = getSchemaDocument(target) - for (let i = 0; i < definition.childrenNodesProperties.length; i++) { - let property = definition.childrenNodesProperties[i] - if (property.childType === exchangeNodeType) { - let exchanges = target[property.name] - if (exchanges === undefined) { - exchanges = [] - } - let targetExchange - for (let j = 0; j < exchanges.length; j++) { - let thisExchange = exchanges[j] - if (thisExchange.payload.referenceParent !== undefined) { - if (thisExchange.payload.referenceParent.id === exchange.id) { - targetExchange = thisExchange - } - } - } - if (targetExchange === undefined) { - targetExchange = UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.addUIObject(target, exchangeNodeType) - UI.projects.visualScripting.functionLibraries.attachDetach.referenceAttachNode(targetExchange, exchange) - } - let nodesArray = targetExchange[arrayPropertyName] - nodesArray.push(templateClone) - UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.createUiObjectFromNode(templateClone, targetExchange, targetExchange) - } - } - } - } - - function deleteNode(node) { - UI.projects.visualScripting.functionLibraries.nodeDeleter.deleteUIObject(node, rootNodes) - } - - /* Validations */ - if (executionResult === true && node.payload.parentNode === undefined) { - node.payload.uiObject.setErrorMessage('Super Action node needs a Parent Node.') - executionResult = false - } - if (executionResult === true && node.payload.referenceParent === undefined) { - node.payload.uiObject.setErrorMessage('Super Action node needs to reference a Master Script Node.') - executionResult = false - } - if (executionResult === true && node.payload.referenceParent.javascriptCode === undefined) { - node.payload.uiObject.setErrorMessage('Master Script Node needs to have a child Javascript Code Node.') - executionResult = false - } - - let masterScript = node.payload.referenceParent - - eval(masterScript.javascriptCode.code) - - let masterScriptInstance = newNewMasterScriptInstance() - - if (executionResult === true) { - executionResult = masterScriptInstance.runValidations(superAction, masterScript) - } - if (executionResult === true) { - executionResult = masterScriptInstance.runScript(superAction, masterScript) - } - if (executionResult === true) { - superAction.payload.uiObject.setValue('Execution Completed Successfully') - } else { - superAction.payload.uiObject.setValue('Execution Failed') - } - } catch (err) { - superAction.payload.uiObject.setErrorMessage(err.message) - superAction.payload.uiObject.setValue('Execution Failed') - } - } -} diff --git a/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js b/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js index 327597641..f57c4913b 100644 --- a/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js +++ b/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js @@ -162,210 +162,250 @@ function newGovernanceFunctionLibraryProfileConstructor() { } } - function installSecrets() { - - } - - function addSigningAccount( + function installSecrets( node, - rootNodes, - targetNodeType + rootNodes ) { - let githubUsername = UI.projects.visualScripting.utilities.nodeConfig.loadConfigProperty(node.payload, 'githubUsername') - let mnemonic = UI.projects.visualScripting.utilities.nodeConfig.loadConfigProperty(node.payload, 'mnemonic') - let signingAccounts - - if (githubUsername === undefined || githubUsername === "") { - node.payload.uiObject.setErrorMessage( - "githubUsername config property missing.", - UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR - ) - return - } - + let userProfile = signingAccounts = node.payload.referenceParent /* - Some validations first... + Delete Signing Accounts with all its children, it it exists. */ - if (node.payload.referenceParent === undefined) { - node.payload.uiObject.setErrorMessage( - "The Profile Contstructor needs to reference your User Profile.", - UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR - ) - return + if (userProfile.signingAccounts !== undefined) { + let rootNodes = UI.projects.foundations.spaces.designSpace.workspace.workspaceNode.rootNodes + UI.projects.visualScripting.functionLibraries.nodeDeleter.deleteUIObject(userProfile.signingAccounts, rootNodes) + } + /* + Create Signing Accounts. + */ + let signingAccounts = UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.addUIObject( + node.payload.referenceParent, + 'Signing Accounts', + UI.projects.foundations.spaces.designSpace.workspace.workspaceNode.rootNodes + ) + + let algoTradersPlatform = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(userProfile.userApps, 'Algo Traders Platform') + let socialTradingDesktopApp = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(userProfile.userApps, 'Social Trading Desktop App') + let socialTradingMobileApp = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(userProfile.userApps, 'Social Trading Mobile App') + let socialTradingServerApp = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(userProfile.userApps, 'Social Trading Server App') + let socialTradingBots = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(userProfile.userBots, 'Social Trading Bot') + let socialPersonas = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(userProfile.socialPersonas, 'Social Persona') + let p2pNetworkNodes = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(userProfile.p2pNetworkNodes, 'P2P Network Node') + + addSigningAccounts(algoTradersPlatform) + addSigningAccounts(socialTradingDesktopApp) + addSigningAccounts(socialTradingMobileApp) + addSigningAccounts(socialTradingServerApp) + addSigningAccounts(socialTradingBots) + addSigningAccounts(socialPersonas) + addSigningAccounts(p2pNetworkNodes) + + function addSigningAccounts(nodeArray, targetNodeType) { + for (let i = 0; i < nodeArray.length; i++) { + let currentNode = nodeArray[i] + addSigningAccount(currentNode, targetNodeType) + } } - if (node.payload.referenceParent.signingAccounts === undefined) { - signingAccounts = UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.addUIObject( - node.payload.referenceParent, - 'Signing Accounts', - UI.projects.foundations.spaces.designSpace.workspace.workspaceNode.rootNodes - ) - } else { - signingAccounts = node.payload.referenceParent.signingAccounts - } - - createWallet() - - function createWallet() { - let params + function addSigningAccount( + node, + targetNodeType + ) { + let githubUsername = UI.projects.visualScripting.utilities.nodeConfig.loadConfigProperty(node.payload, 'githubUsername') + let mnemonic = UI.projects.visualScripting.utilities.nodeConfig.loadConfigProperty(node.payload, 'mnemonic') + let signingAccounts + + if (githubUsername === undefined || githubUsername === "") { + node.payload.uiObject.setErrorMessage( + "githubUsername config property missing.", + UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR + ) + return + } + /* - If the user provides a mnemonic then we will get the private key and address from it, - otherwise, we will create a new private key and address. + Some validations first... */ - if (mnemonic === undefined || mnemonic === "") { - params = { - method: 'createWalletAccount', - entropy: node.id + (new Date()).valueOf() - } + if (node.payload.referenceParent === undefined) { + node.payload.uiObject.setErrorMessage( + "The Profile Contstructor needs to reference your User Profile.", + UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR + ) + return + } + + if (node.payload.referenceParent.signingAccounts === undefined) { + signingAccounts = UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.addUIObject( + node.payload.referenceParent, + 'Signing Accounts', + UI.projects.foundations.spaces.designSpace.workspace.workspaceNode.rootNodes + ) } else { - params = { - method: 'mnemonicToPrivateKey', - mnemonic: mnemonic + signingAccounts = node.payload.referenceParent.signingAccounts + } + + createWallet() + + function createWallet() { + let params + /* + If the user provides a mnemonic then we will get the private key and address from it, + otherwise, we will create a new private key and address. + */ + if (mnemonic === undefined || mnemonic === "") { + params = { + method: 'createWalletAccount', + entropy: node.id + (new Date()).valueOf() + } + } else { + params = { + method: 'mnemonicToPrivateKey', + mnemonic: mnemonic + } + } + + let url = 'WEB3' // We will access the default Client WEB3 endpoint. + + httpRequest(JSON.stringify(params), url, onResponse) + + function onResponse(err, data) { + /* Lets check the result of the call through the http interface */ + if (err.result !== GLOBAL.DEFAULT_OK_RESPONSE.result) { + node.payload.uiObject.setErrorMessage( + 'Call via HTTP Interface failed.', + UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR + ) + return + } + + let response = JSON.parse(data) + + /* Lets check the result of the method call */ + if (response.result !== GLOBAL.DEFAULT_OK_RESPONSE.result) { + + if (mnemonic === undefined || mnemonic === "") { + node.payload.uiObject.setErrorMessage( + 'Call to WEB3 Server failed. ' + response.error, + UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR + ) + console.log('Call to WEB3 Server failed. ' + response.error) + return + } else { + node.payload.uiObject.setErrorMessage( + 'Call to WEB3 Server failed. Most likely the Mnemonic provided is not correct or you need to run node setup because a dependency is missing. ' + response.error, + UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR + ) + console.log('Call to WEB3 Server failed. Most likely the Mnemonic provided is not correct or you need to run node setup because a dependency is missing. ' + response.error) + return + } + } + + signSigningAccountData(response.address, response.privateKey) } } - - let url = 'WEB3' // We will access the default Client WEB3 endpoint. - - httpRequest(JSON.stringify(params), url, onResponse) - - function onResponse(err, data) { - /* Lets check the result of the call through the http interface */ - if (err.result !== GLOBAL.DEFAULT_OK_RESPONSE.result) { - node.payload.uiObject.setErrorMessage( - 'Call via HTTP Interface failed.', - UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR - ) - return + + function signSigningAccountData(address, privateKey) { + + let request = { + url: 'WEB3', + params: { + method: "signData", + privateKey: privateKey, + data: githubUsername + } } - - let response = JSON.parse(data) - - /* Lets check the result of the method call */ - if (response.result !== GLOBAL.DEFAULT_OK_RESPONSE.result) { - - if (mnemonic === undefined || mnemonic === "") { + + httpRequest(JSON.stringify(request.params), request.url, onResponse) + + function onResponse(err, data) { + /* Lets check the result of the call through the http interface */ + if (err.result !== GLOBAL.DEFAULT_OK_RESPONSE.result) { + node.payload.uiObject.setErrorMessage( + 'Call via HTTP Interface failed.', + UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR + ) + return + } + + let response = JSON.parse(data) + + /* Lets check the result of the method call */ + if (response.result !== GLOBAL.DEFAULT_OK_RESPONSE.result) { node.payload.uiObject.setErrorMessage( 'Call to WEB3 Server failed. ' + response.error, UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR ) console.log('Call to WEB3 Server failed. ' + response.error) return + } + + createSigningAccount(response.signature) + } + + function createSigningAccount(signature) { + + let signingAccount = UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.addUIObject( + signingAccounts, + 'Signing Account', + UI.projects.foundations.spaces.designSpace.workspace.workspaceNode.rootNodes + ) + + let signingAccountChild = UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.addUIObject( + signingAccount, + targetNodeType, + UI.projects.foundations.spaces.designSpace.workspace.workspaceNode.rootNodes + ) + /* + Let's get a cool name for this node. + */ + let targetNodeTypeCount = 0 + for (let i = 0; i < signingAccounts.signingAccounts.length; i++) { + let singningAccount = signingAccounts.signingAccounts[i] + if (singningAccount.signingAccountChild.type === targetNodeType) { + targetNodeTypeCount++ + } + } + signingAccountChild.name = targetNodeType + " # " + targetNodeTypeCount + let codeName = targetNodeType.replaceAll(' ', '-') + "-" + targetNodeTypeCount + /* + We store at the User Profile the Signed githubUsername + */ + UI.projects.visualScripting.utilities.nodeConfig.saveConfigProperty(signingAccountChild.payload, 'codeName', codeName) + UI.projects.visualScripting.utilities.nodeConfig.saveConfigProperty(signingAccount.payload, 'signature', signature) + + let secrets = UI.projects.visualScripting.utilities.nodeConfig.loadConfigProperty(node.payload, 'secrets', signingAccount.name) + if (secrets === undefined) { + secrets = [] + } + + let secret = { + signingAccountChildId: signingAccountChild.id, + signingAccountChildName: signingAccountChild.name, + signingAccountChildType: targetNodeType, + signingAccountChildCodeName: codeName, + signingAccountNodeId: signingAccount.id, + privateKey: privateKey, + userProfileHandle: githubUsername, + userProfileId: node.payload.referenceParent.id + } + + secrets.push(secret) + + UI.projects.visualScripting.utilities.nodeConfig.saveConfigProperty(node.payload, 'secrets', secrets) + /* + Show nice message. + */ + if (mnemonic === undefined || mnemonic === "") { + node.payload.uiObject.setInfoMessage( + "Signing Account has been successfully created.", + UI.projects.governance.globals.designer.SET_INFO_COUNTER_FACTOR + ) } else { - node.payload.uiObject.setErrorMessage( - 'Call to WEB3 Server failed. Most likely the Mnemonic provided is not correct or you need to run node setup because a dependency is missing. ' + response.error, - UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR + node.payload.uiObject.setInfoMessage( + "Mnemonic successfully imported. Signing Account has been successfully created.", + UI.projects.governance.globals.designer.SET_INFO_COUNTER_FACTOR ) - console.log('Call to WEB3 Server failed. Most likely the Mnemonic provided is not correct or you need to run node setup because a dependency is missing. ' + response.error) - return } } - - signSigningAccountData(response.address, response.privateKey) - } - } - - function signSigningAccountData(address, privateKey) { - - let request = { - url: 'WEB3', - params: { - method: "signData", - privateKey: privateKey, - data: githubUsername - } - } - - httpRequest(JSON.stringify(request.params), request.url, onResponse) - - function onResponse(err, data) { - /* Lets check the result of the call through the http interface */ - if (err.result !== GLOBAL.DEFAULT_OK_RESPONSE.result) { - node.payload.uiObject.setErrorMessage( - 'Call via HTTP Interface failed.', - UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR - ) - return - } - - let response = JSON.parse(data) - - /* Lets check the result of the method call */ - if (response.result !== GLOBAL.DEFAULT_OK_RESPONSE.result) { - node.payload.uiObject.setErrorMessage( - 'Call to WEB3 Server failed. ' + response.error, - UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR - ) - console.log('Call to WEB3 Server failed. ' + response.error) - return - } - - createSigningAccount(response.signature) - } - - function createSigningAccount(signature) { - - let signingAccount = UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.addUIObject( - signingAccounts, - 'Signing Account', - UI.projects.foundations.spaces.designSpace.workspace.workspaceNode.rootNodes - ) - - let signingAccountChild = UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.addUIObject( - signingAccount, - targetNodeType, - UI.projects.foundations.spaces.designSpace.workspace.workspaceNode.rootNodes - ) - /* - Let's get a cool name for this node. - */ - let targetNodeTypeCount = 0 - for (let i = 0; i < signingAccounts.signingAccounts.length; i++) { - let singningAccount = signingAccounts.signingAccounts[i] - if (singningAccount.signingAccountChild.type === targetNodeType) { - targetNodeTypeCount++ - } - } - signingAccountChild.name = targetNodeType +" # " + targetNodeTypeCount - let codeName = targetNodeType.replaceAll(' ', '-') + "-" + targetNodeTypeCount - /* - We store at the User Profile the Signed githubUsername - */ - UI.projects.visualScripting.utilities.nodeConfig.saveConfigProperty(signingAccountChild.payload, 'codeName', codeName) - UI.projects.visualScripting.utilities.nodeConfig.saveConfigProperty(signingAccount.payload, 'signature', signature) - - let secrets = UI.projects.visualScripting.utilities.nodeConfig.loadConfigProperty(node.payload, 'secrets', signingAccount.name) - if (secrets === undefined) { - secrets = [] - } - - let secret = { - signingAccountChildId: signingAccountChild.id, - signingAccountChildName: signingAccountChild.name, - signingAccountChildType: targetNodeType, - signingAccountChildCodeName: codeName, - signingAccountNodeId: signingAccount.id, - privateKey: privateKey, - userProfileHandle: githubUsername, - userProfileId: node.payload.referenceParent.id - } - - secrets.push(secret) - - UI.projects.visualScripting.utilities.nodeConfig.saveConfigProperty(node.payload, 'secrets', secrets) - /* - Show nice message. - */ - if (mnemonic === undefined || mnemonic === "") { - node.payload.uiObject.setInfoMessage( - "Signing Account has been successfully created.", - UI.projects.governance.globals.designer.SET_INFO_COUNTER_FACTOR - ) - } else { - node.payload.uiObject.setInfoMessage( - "Mnemonic successfully imported. Signing Account has been successfully created.", - UI.projects.governance.globals.designer.SET_INFO_COUNTER_FACTOR - ) - } } } } From 5b913251062b57b88a1a253a22ceaf7a73eda4a0 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 24 Nov 2021 12:28:08 +0100 Subject: [PATCH 09/19] Install Secrets Implemented --- .../User-Profiles/Luis-Fernando-Molina.json | 1047 +++++++++-------- .../App-Schema/profile-constructor.json | 48 +- .../Schemas/App-Schema/signing-account.json | 5 +- .../UI/Function-Libraries/ActionSwitch.js | 30 +- .../Function-Libraries/ProfileConstructor.js | 248 ++-- 5 files changed, 695 insertions(+), 683 deletions(-) diff --git a/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json b/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json index ec2b67818..16f1c6c64 100644 --- a/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json +++ b/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json @@ -16462,7 +16462,7 @@ "floatingObject": { "isPinned": false, "isFrozen": false, - "isCollapsed": false, + "isCollapsed": true, "angleToParent": 2, "distanceToParent": 3, "arrangementStyle": 0 @@ -16773,7 +16773,7 @@ "floatingObject": { "isPinned": false, "isFrozen": false, - "isCollapsed": false, + "isCollapsed": true, "angleToParent": 2, "distanceToParent": 3, "arrangementStyle": 0 @@ -16801,12 +16801,12 @@ "id": "5fd55dc1-69c8-473e-9d3d-b39b58818b07", "savedPayload": { "position": { - "x": 5377.381582729962, - "y": 24015.099048196847 + "x": 38529.55549577344, + "y": 19215.099048196847 }, "targetPosition": { - "x": 5087.603834843242, - "y": 23937.45333466609 + "x": 38239.77774788672, + "y": 19137.45333466609 }, "floatingObject": { "isPinned": false, @@ -16824,12 +16824,12 @@ "id": "a081e0a9-ee60-4a56-b5a6-aadb7bd8b052", "savedPayload": { "position": { - "x": 5087.603834843242, - "y": 23937.45333466609 + "x": 38239.77774788672, + "y": 19137.45333466609 }, "targetPosition": { - "x": 4797.826086956522, - "y": 23859.807621135333 + "x": 37950, + "y": 19059.807621135333 }, "floatingObject": { "isPinned": false, @@ -16856,12 +16856,12 @@ "id": "eab98bcc-39ee-411d-95e2-b5c6c33067cc", "savedPayload": { "position": { - "x": 5097.826086956522, - "y": 24379.422863406 + "x": 38250, + "y": 19579.422863406 }, "targetPosition": { - "x": 4947.826086956522, - "y": 24119.615242270665 + "x": 38100, + "y": 19319.615242270665 }, "floatingObject": { "isPinned": false, @@ -16879,12 +16879,12 @@ "id": "68d6085b-3226-4842-b100-80a8c647e7ec", "savedPayload": { "position": { - "x": 4947.826086956522, - "y": 24119.615242270665 + "x": 38100, + "y": 19319.615242270665 }, "targetPosition": { - "x": 4797.826086956522, - "y": 23859.807621135333 + "x": 37950, + "y": 19059.807621135333 }, "floatingObject": { "isPinned": false, @@ -16911,12 +16911,12 @@ "id": "90876ef0-3d01-4a3f-afc8-52914972a040", "savedPayload": { "position": { - "x": 4642.534659895009, - "y": 24439.363116908775 + "x": 37794.708572938485, + "y": 19639.363116908775 }, "targetPosition": { - "x": 4720.1803734257655, - "y": 24149.585369022054 + "x": 37872.35428646924, + "y": 19349.585369022054 }, "floatingObject": { "isPinned": false, @@ -16934,12 +16934,12 @@ "id": "8c213687-2520-41ff-8b89-f5abaf6f2f2e", "savedPayload": { "position": { - "x": 4720.1803734257655, - "y": 24149.585369022054 + "x": 37872.35428646924, + "y": 19349.585369022054 }, "targetPosition": { - "x": 4797.826086956522, - "y": 23859.807621135333 + "x": 37950, + "y": 19059.807621135333 }, "floatingObject": { "isPinned": false, @@ -17008,8 +17008,8 @@ "id": "9870ca2a-cefc-484b-b7fc-206d62782ebc", "savedPayload": { "position": { - "x": 37650, - "y": 19059.807621135333 + "x": 37687.04694055762, + "y": 19034.54944474041 }, "targetPosition": { "x": 37500, @@ -17036,45 +17036,17 @@ { "type": "Signing Account", "name": "New Signing Account", - "config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0xc321c45055b32456d938c214e00cbfb035efe8bda6fa20268be4683b3b89f64b\",\n \"s\": \"0x053be15689ecf8a29369814c9d6d6be0c1238497d56f6edb6be045d07df4dfea\",\n \"signature\": \"0xc321c45055b32456d938c214e00cbfb035efe8bda6fa20268be4683b3b89f64b053be15689ecf8a29369814c9d6d6be0c1238497d56f6edb6be045d07df4dfea1c\"\n }\n}", + "config": "{}", "project": "Governance", - "signingAccountChild": { - "type": "Social Trading Desktop App", - "name": "Social Trading Desktop App # 1", - "config": "{\n \"codeName\": \"Social-Trading-Desktop-App-1\",\n \"host\": \"localhost\",\n \"webPort\": \"33248\",\n \"webSocketsPort\": \"17042\"\n}", - "project": "Governance", - "id": "012c74dd-1a61-4784-bc8a-e18555b4974e", - "savedPayload": { - "position": { - "x": 37751.47836381532, - "y": 19505.69451642177 - }, - "targetPosition": { - "x": 37550.73918190766, - "y": 19282.75106877855 - }, - "floatingObject": { - "isPinned": false, - "isFrozen": false, - "isCollapsed": false, - "angleToParent": 1, - "distanceToParent": 3, - "arrangementStyle": 0 - }, - "uiObject": { - "isRunning": false - } - } - }, - "id": "3863ebb9-c69f-40b2-8bbd-eb8f2b60a49c", + "id": "28cbfc6e-b71e-4351-9994-09b865dab181", "savedPayload": { "position": { - "x": 37550.73918190766, - "y": 19282.75106877855 + "x": 37698.47833786449, + "y": 19232.658962136466 }, "targetPosition": { - "x": 37350, - "y": 19059.807621135333 + "x": 37433.24371981311, + "y": 19092.478373654547 }, "floatingObject": { "isPinned": false, @@ -17086,51 +17058,46 @@ }, "uiObject": { "isRunning": false - } + }, + "referenceParent": { + "type": "Algo Traders Platform", + "name": "Algo Traders Platform # 1", + "id": "0a06a54b-825b-4ff4-93cc-36465348ad26" + }, + "referenceParentCombinedNodePath": [ + [ + "Luis-Fernando-Molina", + "User Profile" + ], + [ + "New User Apps", + "User Apps" + ], + [ + "New Desktop Apps", + "Desktop Apps" + ], + [ + "New Algo Traders Platform", + "Algo Traders Platform" + ] + ] } }, { "type": "Signing Account", "name": "New Signing Account", - "config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x4a48ecc069047c7e29af18652948ca7054c7e1bcf66b7bf657f82a7883631262\",\n \"s\": \"0x3cfef2f134a36a8879d64195e96fd2e22627c0363a05a1b4efb6101699b1a669\",\n \"signature\": \"0x4a48ecc069047c7e29af18652948ca7054c7e1bcf66b7bf657f82a78836312623cfef2f134a36a8879d64195e96fd2e22627c0363a05a1b4efb6101699b1a6691b\"\n }\n}", + "config": "{}", "project": "Governance", - "signingAccountChild": { - "type": "Social Trading Mobile App", - "name": "Social Trading Mobile App # 1", - "config": "{\n \"codeName\": \"Social-Trading-Mobile-App-1\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"15042\"\n}", - "project": "Governance", - "id": "2d03d11f-b553-4b01-9291-9e13da15dd54", - "savedPayload": { - "position": { - "x": 37594.041985845484, - "y": 19607.934895720893 - }, - "targetPosition": { - "x": 37472.02099292274, - "y": 19333.871258428113 - }, - "floatingObject": { - "isPinned": false, - "isFrozen": false, - "isCollapsed": false, - "angleToParent": 1, - "distanceToParent": 3, - "arrangementStyle": 0 - }, - "uiObject": { - "isRunning": false - } - } - }, - "id": "c84e9e64-7527-4dec-ac58-93696e19a756", + "id": "bc2b6446-436f-4e95-b97b-671ad9f28dc0", "savedPayload": { "position": { - "x": 37472.02099292274, - "y": 19333.871258428113 + "x": 37653.15928136206, + "y": 19296.530194985822 }, "targetPosition": { - "x": 37350, - "y": 19059.807621135333 + "x": 37433.24371981311, + "y": 19092.478373654547 }, "floatingObject": { "isPinned": false, @@ -17142,51 +17109,42 @@ }, "uiObject": { "isRunning": false - } + }, + "referenceParent": { + "type": "P2P Network Node", + "name": "P2P Network Node # 1", + "id": "56cc0c90-4a58-4e25-a63f-4f9a6921d0f3" + }, + "referenceParentCombinedNodePath": [ + [ + "Luis-Fernando-Molina", + "User Profile" + ], + [ + "New P2P Network Nodes", + "P2P Network Nodes" + ], + [ + "New P2P Network Node", + "P2P Network Node" + ] + ] } }, { "type": "Signing Account", "name": "New Signing Account", - "config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x3d3791843477eb85b7896ccbc55bfb41189c3fa67f5a098f40e2ddf9a2331ffa\",\n \"s\": \"0x09114da1c09e2d064fb07accf58310f2e13400ae564eb52e471d18d955ea9569\",\n \"signature\": \"0x3d3791843477eb85b7896ccbc55bfb41189c3fa67f5a098f40e2ddf9a2331ffa09114da1c09e2d064fb07accf58310f2e13400ae564eb52e471d18d955ea95691b\"\n }\n}", + "config": "{}", "project": "Governance", - "signingAccountChild": { - "type": "Social Trading Server App", - "name": "Social Trading Server App # 1", - "config": "{\n \"codeName\": \"Social-Trading-Server-App-1\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"16042\"\n}", - "project": "Governance", - "id": "c3d218ee-119f-4bd9-9349-8a194844ecd9", - "savedPayload": { - "position": { - "x": 37412.717077960595, - "y": 19656.520758356295 - }, - "targetPosition": { - "x": 37381.3585389803, - "y": 19358.164189745814 - }, - "floatingObject": { - "isPinned": false, - "isFrozen": false, - "isCollapsed": false, - "angleToParent": 1, - "distanceToParent": 3, - "arrangementStyle": 0 - }, - "uiObject": { - "isRunning": false - } - } - }, - "id": "75f17a55-bf33-4e69-b842-b424a6f517e8", + "id": "34036aa3-97ac-4d6d-9a93-6a758b04c619", "savedPayload": { "position": { - "x": 37381.3585389803, - "y": 19358.164189745814 + "x": 37592.85334276771, + "y": 19346.495633423034 }, "targetPosition": { - "x": 37350, - "y": 19059.807621135333 + "x": 37433.24371981311, + "y": 19092.478373654547 }, "floatingObject": { "isPinned": false, @@ -17198,51 +17156,42 @@ }, "uiObject": { "isRunning": false - } + }, + "referenceParent": { + "type": "P2P Network Node", + "name": "P2P Network Node # 2", + "id": "352cd906-c36c-48c7-8f01-728ff78b78e9" + }, + "referenceParentCombinedNodePath": [ + [ + "Luis-Fernando-Molina", + "User Profile" + ], + [ + "New P2P Network Nodes", + "P2P Network Nodes" + ], + [ + "New P2P Network Node", + "P2P Network Node" + ] + ] } }, { "type": "Signing Account", "name": "New Signing Account", - "config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0x0098b881f17a46a940d6dbb11121217c29330ea1a357ad72ed921448539ceeab\",\n \"s\": \"0x28c9f7cf445ab86caaa01f86d4456f4bdf0a81757dc0a0c80351d481b7df5ad3\",\n \"signature\": \"0x0098b881f17a46a940d6dbb11121217c29330ea1a357ad72ed921448539ceeab28c9f7cf445ab86caaa01f86d4456f4bdf0a81757dc0a0c80351d481b7df5ad31c\"\n }\n}", + "config": "{}", "project": "Governance", - "signingAccountChild": { - "type": "Algo Traders Platform", - "name": "Algo Traders Platform # 1", - "config": "{\n \"codeName\": \"Algo-Traders-Platform-1\"\n}", - "project": "Governance", - "id": "bcffb701-754d-4685-ad09-8bf3f09265d9", - "savedPayload": { - "position": { - "x": 37225.252985509345, - "y": 19646.696181575615 - }, - "targetPosition": { - "x": 37287.62649275467, - "y": 19353.251901355474 - }, - "floatingObject": { - "isPinned": false, - "isFrozen": false, - "isCollapsed": false, - "angleToParent": 2, - "distanceToParent": 3, - "arrangementStyle": 0 - }, - "uiObject": { - "isRunning": false - } - } - }, - "id": "377ee3ed-49e4-415d-87b3-946024f0a1ef", + "id": "9b639fd5-3bab-49fe-8eb0-a5b25aa3f0f5", "savedPayload": { "position": { - "x": 37287.62649275467, - "y": 19353.251901355474 + "x": 37521.670272136376, + "y": 19379.15021539039 }, "targetPosition": { - "x": 37350, - "y": 19059.807621135333 + "x": 37433.24371981311, + "y": 19092.478373654547 }, "floatingObject": { "isPinned": false, @@ -17254,51 +17203,42 @@ }, "uiObject": { "isRunning": false - } + }, + "referenceParent": { + "type": "Social Persona", + "name": "Social Persona # 1", + "id": "ed15b68f-c9e0-447a-9ef7-660db229244c" + }, + "referenceParentCombinedNodePath": [ + [ + "Luis-Fernando-Molina", + "User Profile" + ], + [ + "New Social Personas", + "Social Personas" + ], + [ + "New Social Persona", + "Social Persona" + ] + ] } }, { "type": "Signing Account", "name": "New Signing Account", - "config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0xfd5dfc5b7d84dac898c43880c6234c041142dccc5bf6b57e7eb671497e0cafcf\",\n \"s\": \"0x0bc0cc01159b307fa6d5fa46dbd3a1e71e4fbeca349969177014e1e9d204f9f3\",\n \"signature\": \"0xfd5dfc5b7d84dac898c43880c6234c041142dccc5bf6b57e7eb671497e0cafcf0bc0cc01159b307fa6d5fa46dbd3a1e71e4fbeca349969177014e1e9d204f9f31b\"\n }\n}", + "config": "{}", "project": "Governance", - "signingAccountChild": { - "type": "P2P Network Node", - "name": "P2P Network Node # 1", - "config": "{\n \"codeName\": \"P2P-Network-Node-1\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"18042\",\n \"webPort\": \"31248\"\n}", - "project": "Governance", - "id": "bb0f0417-9dfb-47a3-941f-dcfa82fbaea1", - "savedPayload": { - "position": { - "x": 37050, - "y": 19579.422863406 - }, - "targetPosition": { - "x": 37200, - "y": 19319.615242270665 - }, - "floatingObject": { - "isPinned": false, - "isFrozen": false, - "isCollapsed": false, - "angleToParent": 2, - "distanceToParent": 3, - "arrangementStyle": 0 - }, - "uiObject": { - "isRunning": false - } - } - }, - "id": "7c5f14f9-63c2-42fa-98ee-1d4a36590cf4", + "id": "8ba13c84-3637-4dec-b003-2ec05917e14d", "savedPayload": { "position": { - "x": 37200, - "y": 19319.615242270665 + "x": 37444.46107809601, + "y": 19392.268585091068 }, "targetPosition": { - "x": 37350, - "y": 19059.807621135333 + "x": 37433.24371981311, + "y": 19092.478373654547 }, "floatingObject": { "isPinned": false, @@ -17310,51 +17250,42 @@ }, "uiObject": { "isRunning": false - } + }, + "referenceParent": { + "type": "Social Persona", + "name": "Social Persona # 2", + "id": "01c33294-124f-4d68-8619-8e1d1cca7e0a" + }, + "referenceParentCombinedNodePath": [ + [ + "Luis-Fernando-Molina", + "User Profile" + ], + [ + "New Social Personas", + "Social Personas" + ], + [ + "Luis", + "Social Persona" + ] + ] } }, { "type": "Signing Account", "name": "New Signing Account", - "config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0xa4b34d7c9e7644f4fddf7aa2d969eb7dac3b8dbcc36c559b99fa93bc5ea3c6d3\",\n \"s\": \"0x7a5087de3f5470cb173d73949c05c00438bc16138f43c7aebbe2b80d7d45122b\",\n \"signature\": \"0xa4b34d7c9e7644f4fddf7aa2d969eb7dac3b8dbcc36c559b99fa93bc5ea3c6d37a5087de3f5470cb173d73949c05c00438bc16138f43c7aebbe2b80d7d45122b1c\"\n }\n}", + "config": "{}", "project": "Governance", - "signingAccountChild": { - "type": "P2P Network Node", - "name": "P2P Network Node # 2", - "config": "{\n \"codeName\": \"P2P-Network-Node-2\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"18043\",\n \"webPort\": \"31248\"\n}", - "project": "Governance", - "id": "76fa8a24-9ab4-4eaf-82f2-458ba557b204", - "savedPayload": { - "position": { - "x": 36904.11310471356, - "y": 19461.28598495065 - }, - "targetPosition": { - "x": 37127.05655235678, - "y": 19260.54680304299 - }, - "floatingObject": { - "isPinned": false, - "isFrozen": false, - "isCollapsed": false, - "angleToParent": 2, - "distanceToParent": 3, - "arrangementStyle": 0 - }, - "uiObject": { - "isRunning": false - } - } - }, - "id": "48544424-5b62-417b-897d-9164b26fcd56", + "id": "277378ea-6d5e-4904-b698-e82e6d394d61", "savedPayload": { "position": { - "x": 37127.05655235678, - "y": 19260.54680304299 + "x": 37366.48743962622, + "y": 19384.956747309094 }, "targetPosition": { - "x": 37350, - "y": 19059.807621135333 + "x": 37433.24371981311, + "y": 19092.478373654547 }, "floatingObject": { "isPinned": false, @@ -17366,51 +17297,46 @@ }, "uiObject": { "isRunning": false - } + }, + "referenceParent": { + "type": "Social Trading Desktop App", + "name": "Social Trading Desktop App # 1", + "id": "33c4f8e9-f8a3-4dea-91f4-1539e3aed0d3" + }, + "referenceParentCombinedNodePath": [ + [ + "Luis-Fernando-Molina", + "User Profile" + ], + [ + "New User Apps", + "User Apps" + ], + [ + "New Desktop Apps", + "Desktop Apps" + ], + [ + "New Social Trading Desktop App", + "Social Trading Desktop App" + ] + ] } }, { "type": "Signing Account", "name": "New Signing Account", - "config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0x700e273467c374fda2062fbaf42fadfd74a0c3995498f75ffd1a66c7376e7c60\",\n \"s\": \"0x3531a0c135fcdd578b5069799b3fc246c9cf1cee325a258f6d2960d20f2a98e6\",\n \"signature\": \"0x700e273467c374fda2062fbaf42fadfd74a0c3995498f75ffd1a66c7376e7c603531a0c135fcdd578b5069799b3fc246c9cf1cee325a258f6d2960d20f2a98e61c\"\n }\n}", + "config": "{}", "project": "Governance", - "signingAccountChild": { - "type": "P2P Network Node", - "name": "P2P Network Node # 3", - "config": "{\n \"codeName\": \"P2P-Network-Node-3\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"18044\",\n \"webPort\": \"31248\"\n}", - "project": "Governance", - "id": "297e57c2-3c1a-4170-b710-d2705804205b", - "savedPayload": { - "position": { - "x": 36801.87272541443, - "y": 19303.84960698081 - }, - "targetPosition": { - "x": 37075.936362707216, - "y": 19181.82861405807 - }, - "floatingObject": { - "isPinned": false, - "isFrozen": false, - "isCollapsed": false, - "angleToParent": 2, - "distanceToParent": 3, - "arrangementStyle": 0 - }, - "uiObject": { - "isRunning": false - } - } - }, - "id": "b39e1c4d-4170-4134-ae85-fc9fa7f3eb47", + "id": "93bee05f-72c1-4315-9179-843c4b1dcecb", "savedPayload": { "position": { - "x": 37075.936362707216, - "y": 19181.82861405807 + "x": 37293.06313133119, + "y": 19357.71299170593 }, "targetPosition": { - "x": 37350, - "y": 19059.807621135333 + "x": 37433.24371981311, + "y": 19092.478373654547 }, "floatingObject": { "isPinned": false, @@ -17422,51 +17348,46 @@ }, "uiObject": { "isRunning": false - } + }, + "referenceParent": { + "type": "Social Trading Desktop App", + "name": "Social Trading Desktop App # 2", + "id": "ad887d5f-998f-48c5-9db7-78e17c66f4e4" + }, + "referenceParentCombinedNodePath": [ + [ + "Luis-Fernando-Molina", + "User Profile" + ], + [ + "New User Apps", + "User Apps" + ], + [ + "New Desktop Apps", + "Desktop Apps" + ], + [ + "New Social Trading Desktop App", + "Social Trading Desktop App" + ] + ] } }, { "type": "Signing Account", "name": "New Signing Account", - "config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0xa21640401c1e1ab44678fd6024654d6200025d75998a38d06a2dbb84d2b965b4\",\n \"s\": \"0x7c1308809675605bf120654214f7566a833158cc54471e8eefbee64e8031a5ce\",\n \"signature\": \"0xa21640401c1e1ab44678fd6024654d6200025d75998a38d06a2dbb84d2b965b47c1308809675605bf120654214f7566a833158cc54471e8eefbee64e8031a5ce1b\"\n }\n}", + "config": "{}", "project": "Governance", - "signingAccountChild": { - "type": "Social Trading Desktop App", - "name": "Social Trading Desktop App # 2", - "config": "{\n \"codeName\": \"Social-Trading-Desktop-App-2\",\n \"host\": \"localhost\",\n \"webPort\": \"33249\",\n \"webSocketsPort\": \"17043\"\n}", - "project": "Governance", - "id": "e6f2b6f6-5e40-42d2-92d8-fdd17680a1c7", - "savedPayload": { - "position": { - "x": 36753.28686277903, - "y": 19122.524699095928 - }, - "targetPosition": { - "x": 37051.643431389515, - "y": 19091.16616011563 - }, - "floatingObject": { - "isPinned": false, - "isFrozen": false, - "isCollapsed": false, - "angleToParent": 2, - "distanceToParent": 3, - "arrangementStyle": 0 - }, - "uiObject": { - "isRunning": false - } - } - }, - "id": "530b3376-a820-4710-a7a0-bab877e4c4be", + "id": "18a6b8e1-f3c4-46a8-9a01-ec65d7869428", "savedPayload": { "position": { - "x": 37051.643431389515, - "y": 19091.16616011563 + "x": 37229.19189848183, + "y": 19312.393935203494 }, "targetPosition": { - "x": 37350, - "y": 19059.807621135333 + "x": 37433.24371981311, + "y": 19092.478373654547 }, "floatingObject": { "isPinned": false, @@ -17478,51 +17399,46 @@ }, "uiObject": { "isRunning": false - } + }, + "referenceParent": { + "type": "Social Trading Mobile App", + "name": "Social Trading Mobile App # 1", + "id": "42843263-b1f3-4e4e-885a-5d8b9d7b647a" + }, + "referenceParentCombinedNodePath": [ + [ + "Luis-Fernando-Molina", + "User Profile" + ], + [ + "New User Apps", + "User Apps" + ], + [ + "New Mobile Apps", + "Mobile Apps" + ], + [ + "New Social Trading Mobile App", + "Social Trading Mobile App" + ] + ] } }, { "type": "Signing Account", "name": "New Signing Account", - "config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0x4e4870f2f0061fa5a6e5fca672f1543420e140944a65a294ea25f1c2ef1c5dbe\",\n \"s\": \"0x58ba993a911c9092967b51da47be22ad85062d5ce49c6b2de4f6a593c67850c6\",\n \"signature\": \"0x4e4870f2f0061fa5a6e5fca672f1543420e140944a65a294ea25f1c2ef1c5dbe58ba993a911c9092967b51da47be22ad85062d5ce49c6b2de4f6a593c67850c61c\"\n }\n}", + "config": "{}", "project": "Governance", - "signingAccountChild": { - "type": "Social Trading Desktop App", - "name": "Social Trading Desktop App # 3", - "config": "{\n \"codeName\": \"Social-Trading-Desktop-App-3\",\n \"host\": \"localhost\",\n \"webPort\": \"33250\",\n \"webSocketsPort\": \"17044\"\n}", - "project": "Governance", - "id": "00ca860e-bb19-42b4-8bce-b67f9a1f9af7", - "savedPayload": { - "position": { - "x": 36763.11143955971, - "y": 18935.060606644678 - }, - "targetPosition": { - "x": 37056.555719779855, - "y": 18997.434113890005 - }, - "floatingObject": { - "isPinned": false, - "isFrozen": false, - "isCollapsed": false, - "angleToParent": 2, - "distanceToParent": 3, - "arrangementStyle": 0 - }, - "uiObject": { - "isRunning": false - } - } - }, - "id": "72de2a17-d6f1-491b-847b-4e110a122cf6", + "id": "c6aea3b9-961b-4550-af58-8e4c1cad1ae1", "savedPayload": { "position": { - "x": 37056.555719779855, - "y": 18997.434113890005 + "x": 37179.22646004462, + "y": 19252.08799660915 }, "targetPosition": { - "x": 37350, - "y": 19059.807621135333 + "x": 37433.24371981311, + "y": 19092.478373654547 }, "floatingObject": { "isPinned": false, @@ -17534,15 +17450,140 @@ }, "uiObject": { "isRunning": false - } + }, + "referenceParent": { + "type": "Social Trading Server App", + "name": "Social Trading Server App # 1", + "id": "0216b143-0e46-4da6-b2cb-e95556fc1bfd" + }, + "referenceParentCombinedNodePath": [ + [ + "Luis-Fernando-Molina", + "User Profile" + ], + [ + "New User Apps", + "User Apps" + ], + [ + "New Server Apps", + "Server Apps" + ], + [ + "New Social Trading Server App", + "Social Trading Server App" + ] + ] + } + }, + { + "type": "Signing Account", + "name": "New Signing Account", + "config": "{}", + "project": "Governance", + "id": "6e5d0000-b36d-4271-886a-8a447f656a8b", + "savedPayload": { + "position": { + "x": 37146.571878077266, + "y": 19180.90492597782 + }, + "targetPosition": { + "x": 37433.24371981311, + "y": 19092.478373654547 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Social Trading Bot", + "name": "Social Trading Bot # 1", + "id": "5167a23f-1e17-4cd5-85a7-3c7f2a3019ac" + }, + "referenceParentCombinedNodePath": [ + [ + "Luis-Fernando-Molina", + "User Profile" + ], + [ + "New User Bots", + "User Bots" + ], + [ + "New Social Trading Bots", + "Social Trading Bots" + ], + [ + "New Social Trading Bot", + "Social Trading Bot" + ] + ] + } + }, + { + "type": "Signing Account", + "name": "New Signing Account", + "config": "{}", + "project": "Governance", + "id": "3ad562a0-6593-411d-a07f-8803d053a24d", + "savedPayload": { + "position": { + "x": 37133.45350837659, + "y": 19103.695731937445 + }, + "targetPosition": { + "x": 37433.24371981311, + "y": 19092.478373654547 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Social Trading Bot", + "name": "Social Trading Bot # 2", + "id": "c27748af-db60-44fc-a095-530401057beb" + }, + "referenceParentCombinedNodePath": [ + [ + "Luis-Fernando-Molina", + "User Profile" + ], + [ + "New User Bots", + "User Bots" + ], + [ + "New Social Trading Bots", + "Social Trading Bots" + ], + [ + "Jorgito", + "Social Trading Bot" + ] + ] } } ], - "id": "ecf6aa0a-bf05-48e4-a7ee-7a714fbdbce2", + "id": "4e7e2c46-0ed1-4446-b523-cee698e3bec4", "savedPayload": { "position": { - "x": 37350, - "y": 19059.807621135333 + "x": 37433.24371981311, + "y": 19092.478373654547 }, "targetPosition": { "x": 37500, @@ -17551,7 +17592,7 @@ "floatingObject": { "isPinned": false, "isFrozen": false, - "isCollapsed": true, + "isCollapsed": false, "angleToParent": 1, "distanceToParent": 3, "arrangementStyle": 0 @@ -17574,18 +17615,18 @@ "socialTradingDesktopApps": [ { "type": "Social Trading Desktop App", - "name": "New Social Trading Desktop App", - "config": "{ \n\"codeName\": \"localhost\", \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"17042\"\n}", + "name": "Social Trading Desktop App # 1", + "config": "{\n \"codeName\": \"Social-Trading-Desktop-App-1\",\n \"host\": \"localhost\",\n \"webPort\": \"34248\",\n \"webSocketsPort\": \"17042\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x17c50659b1e04028069e1fdcb1e51ad6cefa8d76b3c65a3581a4bde06b1d74c1\",\n \"s\": \"0x3ab1cfeb49cb3f17ded3d3b13589692ae18c89da57fa05e260abc0c1fdadb7c5\",\n \"signature\": \"0x17c50659b1e04028069e1fdcb1e51ad6cefa8d76b3c65a3581a4bde06b1d74c13ab1cfeb49cb3f17ded3d3b13589692ae18c89da57fa05e260abc0c1fdadb7c51b\"\n }\n}", "project": "Governance", "id": "33c4f8e9-f8a3-4dea-91f4-1539e3aed0d3", "savedPayload": { "position": { - "x": 36987.867965644036, - "y": 19312.132034355964 + "x": 37260.790742777994, + "y": 19483.620781198504 }, "targetPosition": { - "x": 36987.867965644036, - "y": 19012.132034355964 + "x": 37130.625621042724, + "y": 19213.330120827777 }, "floatingObject": { "isPinned": false, @@ -17602,18 +17643,18 @@ }, { "type": "Social Trading Desktop App", - "name": "New Social Trading Desktop App", - "config": "{ \n\"codeName\": \"localhost\", \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"17042\"\n}", + "name": "Social Trading Desktop App # 2", + "config": "{\n \"codeName\": \"Social-Trading-Desktop-App-2\",\n \"host\": \"localhost\",\n \"webPort\": \"34248\",\n \"webSocketsPort\": \"17042\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0x6baf3bb53d031afed105ed82f1b0b9efed9aa9ce36c459ee7ed7974a31ed752e\",\n \"s\": \"0x1d117a6bfb959d68c31f0d3baa9ec99ffa1f66269b1d87796447f8ae37738fbb\",\n \"signature\": \"0x6baf3bb53d031afed105ed82f1b0b9efed9aa9ce36c459ee7ed7974a31ed752e1d117a6bfb959d68c31f0d3baa9ec99ffa1f66269b1d87796447f8ae37738fbb1c\"\n }\n}", "project": "Governance", "id": "ad887d5f-998f-48c5-9db7-78e17c66f4e4", "savedPayload": { "position": { - "x": 36775.73593128807, - "y": 19224.264068711927 + "x": 37031.54190245617, + "y": 19496.495119920288 }, "targetPosition": { - "x": 36987.867965644036, - "y": 19012.132034355964 + "x": 37130.625621042724, + "y": 19213.330120827777 }, "floatingObject": { "isPinned": false, @@ -17632,18 +17673,18 @@ "algoTradesPlatform": [ { "type": "Algo Traders Platform", - "name": "New Algo Traders Platform", - "config": "{ \n\"codeName\": \"localhost\", \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"18041\"\n}", + "name": "Algo Traders Platform # 1", + "config": "{\n \"codeName\": \"Algo-Traders-Platform-1\",\n \"host\": \"localhost\",\n \"webPort\": \"34248\",\n \"webSocketsPort\": \"18041\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0x0de185dd10efc845027591f2f3a0639ab96e50c1b7cf950f58b33fe0f5d0ecff\",\n \"s\": \"0x62c50add24cf74745396e38982d7c7eebf73d298b7f9dbb63498f0d2bf906677\",\n \"signature\": \"0x0de185dd10efc845027591f2f3a0639ab96e50c1b7cf950f58b33fe0f5d0ecff62c50add24cf74745396e38982d7c7eebf73d298b7f9dbb63498f0d2bf9066771c\"\n }\n}", "project": "Governance", "id": "0a06a54b-825b-4ff4-93cc-36465348ad26", "savedPayload": { "position": { - "x": 36687.867965644036, - "y": 19012.132034355964 + "x": 36860.334960672, + "y": 19343.495242563044 }, "targetPosition": { - "x": 36987.867965644036, - "y": 19012.132034355964 + "x": 37130.625621042724, + "y": 19213.330120827777 }, "floatingObject": { "isPinned": false, @@ -17662,12 +17703,12 @@ "id": "abcc6b01-099e-42b4-84cc-24fb6daa7a15", "savedPayload": { "position": { - "x": 36987.867965644036, - "y": 19012.132034355964 + "x": 37130.625621042724, + "y": 19213.330120827777 }, "targetPosition": { - "x": 37200, - "y": 18800 + "x": 37229.70933962928, + "y": 18930.165121735266 }, "floatingObject": { "isPinned": false, @@ -17690,18 +17731,18 @@ "socialTradingMobileApps": [ { "type": "Social Trading Mobile App", - "name": "New Social Trading Mobile App", - "config": "{ \n\"codeName\": \"localhost\", \n\"host\": \"localhost\", \n\"webSocketsPort\": \"15042\"\n}", + "name": "Social Trading Mobile App # 1", + "config": "{\n \"codeName\": \"Social-Trading-Mobile-App-1\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"15042\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0xce473067d8c5c594209127240dcb398b5eb2f0fbcb9d1e408d1ce67d2eb860c2\",\n \"s\": \"0x289eb65ec9ccc122cc279289ccbaf8700933f5293d1915aa8e1e2cfd8b76884b\",\n \"signature\": \"0xce473067d8c5c594209127240dcb398b5eb2f0fbcb9d1e408d1ce67d2eb860c2289eb65ec9ccc122cc279289ccbaf8700933f5293d1915aa8e1e2cfd8b76884b1b\"\n }\n}", "project": "Governance", "id": "42843263-b1f3-4e4e-885a-5d8b9d7b647a", "savedPayload": { "position": { - "x": 36600, - "y": 18800 + "x": 36689.12801888783, + "y": 19190.4953652058 }, "targetPosition": { - "x": 36900, - "y": 18800 + "x": 36959.41867925855, + "y": 19060.330243470533 }, "floatingObject": { "isPinned": false, @@ -17720,12 +17761,12 @@ "id": "de1b0ac7-1bcf-4412-af43-4597443c0ec3", "savedPayload": { "position": { - "x": 36900, - "y": 18800 + "x": 36959.41867925855, + "y": 19060.330243470533 }, "targetPosition": { - "x": 37200, - "y": 18800 + "x": 37229.70933962928, + "y": 18930.165121735266 }, "floatingObject": { "isPinned": false, @@ -17748,18 +17789,18 @@ "socialTradingServerApps": [ { "type": "Social Trading Server App", - "name": "New Social Trading Server App", - "config": "{ \n\"codeName\": \"localhost\", \n\"host\": \"localhost\", \n\"webSocketsPort\": \"16042\"\n}", + "name": "Social Trading Server App # 1", + "config": "{\n \"codeName\": \"Social-Trading-Server-App-1\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"16042\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x530da1dbec5025cdb3ffa3f6479784fde62e680aee5c015bd67967e0fedf339b\",\n \"s\": \"0x54ac2296c9badd0aabc7e3b1fb1b5c45dd1dd20c3e11e77e6629f9f8f2964234\",\n \"signature\": \"0x530da1dbec5025cdb3ffa3f6479784fde62e680aee5c015bd67967e0fedf339b54ac2296c9badd0aabc7e3b1fb1b5c45dd1dd20c3e11e77e6629f9f8f29642341b\"\n }\n}", "project": "Governance", "id": "0216b143-0e46-4da6-b2cb-e95556fc1bfd", "savedPayload": { "position": { - "x": 36775.73593128807, - "y": 18375.735931288073 + "x": 36663.37934144426, + "y": 18731.997684562168 }, "targetPosition": { - "x": 36987.867965644036, - "y": 18587.867965644036 + "x": 36946.54434053677, + "y": 18831.081403148717 }, "floatingObject": { "isPinned": false, @@ -17778,12 +17819,12 @@ "id": "b0db0d19-5529-4b96-ab4f-ac7d54e1e6db", "savedPayload": { "position": { - "x": 36987.867965644036, - "y": 18587.867965644036 + "x": 36946.54434053677, + "y": 18831.081403148717 }, "targetPosition": { - "x": 37200, - "y": 18800 + "x": 37229.70933962928, + "y": 18930.165121735266 }, "floatingObject": { "isPinned": false, @@ -17801,8 +17842,8 @@ "id": "c57bd931-a0e1-4cf2-9270-b33f08839484", "savedPayload": { "position": { - "x": 37200, - "y": 18800 + "x": 37229.70933962928, + "y": 18930.165121735266 }, "targetPosition": { "x": 37500, @@ -17834,8 +17875,8 @@ "socialTradingBots": [ { "type": "Social Trading Bot", - "name": "New Social Trading Bot", - "config": "{}", + "name": "Social Trading Bot # 1", + "config": "{\n \"codeName\": \"Social-Trading-Bot-1\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0x45f316f12bcbc094380fdde58f6d9b6508c9408ae9f47d9408ab8b5f9ff83446\",\n \"s\": \"0x39dac1285fd483f5549536f7dbf349463a7d476505a2dd79b69ec1dc61fcd249\",\n \"signature\": \"0x45f316f12bcbc094380fdde58f6d9b6508c9408ae9f47d9408ab8b5f9ff8344639dac1285fd483f5549536f7dbf349463a7d476505a2dd79b69ec1dc61fcd2491c\"\n }\n}", "project": "Governance", "socialTradingBotsFollowing": { "type": "Social Trading Bots Following", @@ -17851,12 +17892,12 @@ "id": "a9484759-a37e-4c5f-a11a-964bc88371ba", "savedPayload": { "position": { - "x": 36390.60700984261, - "y": 18058.030471260092 + "x": 36165.4101775664, + "y": 18811.89932962496 }, "targetPosition": { - "x": 36680.384757729335, - "y": 17980.384757729335 + "x": 36361.09640094984, + "y": 18584.507812681324 }, "floatingObject": { "isPinned": false, @@ -17879,12 +17920,12 @@ "id": "a8bf7c62-5df7-475b-a43d-77c47cf1af5d", "savedPayload": { "position": { - "x": 36420.577136594, - "y": 17830.384757729335 + "x": 36061.93526179549, + "y": 18606.926840757253 }, "targetPosition": { - "x": 36680.384757729335, - "y": 17980.384757729335 + "x": 36361.09640094984, + "y": 18584.507812681324 }, "floatingObject": { "isPinned": false, @@ -17901,18 +17942,18 @@ }, { "type": "Social Trading Bot Followed", - "name": "Jorgito", + "name": "Social Trading Bot # 2", "config": "{}", "project": "Governance", "id": "30d456e2-e263-4e12-a486-9f1aa5cc2bf1", "savedPayload": { "position": { - "x": 36602.73904419858, - "y": 17690.607009842613 + "x": 36133.704884006205, + "y": 18388.821589297888 }, "targetPosition": { - "x": 36680.384757729335, - "y": 17980.384757729335 + "x": 36361.09640094984, + "y": 18584.507812681324 }, "floatingObject": { "isPinned": false, @@ -17927,7 +17968,7 @@ }, "referenceParent": { "type": "Social Trading Bot", - "name": "Jorgito", + "name": "Social Trading Bot # 2", "id": "c27748af-db60-44fc-a095-530401057beb" }, "referenceParentCombinedNodePath": [ @@ -17950,7 +17991,7 @@ "4809934c-d45d-4565-a686-5d96bd695b4f" ], [ - "Jorgito", + "Social Trading Bot # 2", "Social Trading Bot", "Governance", "c27748af-db60-44fc-a095-530401057beb" @@ -17962,12 +18003,12 @@ "id": "e42dfedc-6906-4833-8737-44d5f45ab82e", "savedPayload": { "position": { - "x": 36680.384757729335, - "y": 17980.384757729335 + "x": 36361.09640094984, + "y": 18584.507812681324 }, "targetPosition": { - "x": 36940.19237886467, - "y": 18130.384757729335 + "x": 36660.2575401042, + "y": 18562.088784605396 }, "floatingObject": { "isPinned": false, @@ -17985,12 +18026,12 @@ "id": "5167a23f-1e17-4cd5-85a7-3c7f2a3019ac", "savedPayload": { "position": { - "x": 36940.19237886467, - "y": 18130.384757729335 + "x": 36660.2575401042, + "y": 18562.088784605396 }, "targetPosition": { - "x": 37200, - "y": 18280.384757729335 + "x": 36959.41867925855, + "y": 18539.669756529467 }, "floatingObject": { "isPinned": false, @@ -18007,18 +18048,18 @@ }, { "type": "Social Trading Bot", - "name": "Jorgito", - "config": "{}", + "name": "Social Trading Bot # 2", + "config": "{\n \"codeName\": \"Social-Trading-Bot-2\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0xd65c72803ae6771a0de78c086a5101648ce63b702bbd2ad549998022d182d921\",\n \"s\": \"0x3e35b58f10605c74726e4ab3fa1f139da3d227f254fa030d467cbd9a7517f012\",\n \"signature\": \"0xd65c72803ae6771a0de78c086a5101648ce63b702bbd2ad549998022d182d9213e35b58f10605c74726e4ab3fa1f139da3d227f254fa030d467cbd9a7517f0121b\"\n }\n}", "project": "Governance", "id": "c27748af-db60-44fc-a095-530401057beb", "savedPayload": { "position": { - "x": 37200, - "y": 17980.384757729335 + "x": 36790.42266183947, + "y": 18291.79812423467 }, "targetPosition": { - "x": 37200, - "y": 18280.384757729335 + "x": 36959.41867925855, + "y": 18539.669756529467 }, "floatingObject": { "isPinned": false, @@ -18037,12 +18078,12 @@ "id": "4809934c-d45d-4565-a686-5d96bd695b4f", "savedPayload": { "position": { - "x": 37200, - "y": 18280.384757729335 + "x": 36959.41867925855, + "y": 18539.669756529467 }, "targetPosition": { - "x": 37350, - "y": 18540.192378864667 + "x": 37229.70933962928, + "y": 18669.834878264734 }, "floatingObject": { "isPinned": false, @@ -18060,8 +18101,8 @@ "id": "54ced611-b518-435f-a284-935666ef47db", "savedPayload": { "position": { - "x": 37350, - "y": 18540.192378864667 + "x": 37229.70933962928, + "y": 18669.834878264734 }, "targetPosition": { "x": 37500, @@ -18088,8 +18129,8 @@ "socialPersonas": [ { "type": "Social Persona", - "name": "New Social Persona", - "config": "{}", + "name": "Social Persona # 1", + "config": "{\n \"codeName\": \"Social-Persona-1\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x0551499d1e74297e96bf7f1990fb9f32591b16e0d5b3d79fb2497ddf15de8355\",\n \"s\": \"0x0d6bf77a10b6dbfce1c55e33145d7b62136a1accd928973957a0cc4ee490648f\",\n \"signature\": \"0x0551499d1e74297e96bf7f1990fb9f32591b16e0d5b3d79fb2497ddf15de83550d6bf77a10b6dbfce1c55e33145d7b62136a1accd928973957a0cc4ee490648f1b\"\n }\n}", "project": "Governance", "socialPersonasFollowing": { "type": "Social Personas Following", @@ -18099,18 +18140,18 @@ "socialPersonasFollowed": [ { "type": "Social Persona Followed", - "name": "Luis", + "name": "Social Persona # 2", "config": "{}", "project": "Governance", "id": "45f1a092-8a89-45f8-b31c-c4c062a56a8a", "savedPayload": { "position": { - "x": 37500, - "y": 17680.384757729335 + "x": 36738.468235414715, + "y": 17979.263950924287 }, "targetPosition": { - "x": 37650, - "y": 17940.192378864667 + "x": 37025.14007715056, + "y": 18067.69050324756 }, "floatingObject": { "isPinned": false, @@ -18125,7 +18166,7 @@ }, "referenceParent": { "type": "Social Persona", - "name": "Luis", + "name": "Social Persona # 2", "id": "01c33294-124f-4d68-8619-8e1d1cca7e0a" }, "referenceParentCombinedNodePath": [ @@ -18142,7 +18183,7 @@ "e453990c-57e2-4886-9dc1-060cd2750467" ], [ - "Luis", + "Social Persona # 2", "Social Persona", "Governance", "01c33294-124f-4d68-8619-8e1d1cca7e0a" @@ -18152,18 +18193,18 @@ }, { "type": "Social Persona Followed", - "name": "Luis", + "name": "Social Persona # 2", "config": "{}", "project": "Governance", "id": "2eb918aa-742f-49c8-bea2-4cdc2d9bd1c7", "savedPayload": { "position": { - "x": 37800, - "y": 17680.384757729335 + "x": 36958.383796963666, + "y": 17775.212129593012 }, "targetPosition": { - "x": 37650, - "y": 17940.192378864667 + "x": 37025.14007715056, + "y": 18067.69050324756 }, "floatingObject": { "isPinned": false, @@ -18178,7 +18219,7 @@ }, "referenceParent": { "type": "Social Persona", - "name": "Luis", + "name": "Social Persona # 2", "id": "01c33294-124f-4d68-8619-8e1d1cca7e0a" }, "referenceParentCombinedNodePath": [ @@ -18195,7 +18236,7 @@ "e453990c-57e2-4886-9dc1-060cd2750467" ], [ - "Luis", + "Social Persona # 2", "Social Persona", "Governance", "01c33294-124f-4d68-8619-8e1d1cca7e0a" @@ -18207,12 +18248,12 @@ "id": "c0e85aee-8f7e-42bf-a2ea-5e3d9414c114", "savedPayload": { "position": { - "x": 37650, - "y": 17940.192378864667 + "x": 37025.14007715056, + "y": 18067.69050324756 }, "targetPosition": { - "x": 37650, - "y": 18240.192378864667 + "x": 37229.19189848183, + "y": 18287.606064796506 }, "floatingObject": { "isPinned": false, @@ -18230,12 +18271,12 @@ "id": "ed15b68f-c9e0-447a-9ef7-660db229244c", "savedPayload": { "position": { - "x": 37650, - "y": 18240.192378864667 + "x": 37229.19189848183, + "y": 18287.606064796506 }, "targetPosition": { - "x": 37650, - "y": 18540.192378864667 + "x": 37433.24371981311, + "y": 18507.521626345453 }, "floatingObject": { "isPinned": false, @@ -18252,18 +18293,18 @@ }, { "type": "Social Persona", - "name": "Luis", - "config": "{\"socialHandle\": \"\",\"bio\": \"\"}", + "name": "Social Persona # 2", + "config": "{\n \"socialHandle\": \"\",\n \"bio\": \"\",\n \"codeName\": \"Social-Persona-2\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x5e4ce5c11d0ad664e8c745ff1dcf212b0cbcce9ae05dc2d9ed27fdc6dfcb07d9\",\n \"s\": \"0x79f2f0112532d95c8f26c71b065a96446b3204e1faf1a75359e592d5d42b345a\",\n \"signature\": \"0x5e4ce5c11d0ad664e8c745ff1dcf212b0cbcce9ae05dc2d9ed27fdc6dfcb07d979f2f0112532d95c8f26c71b065a96446b3204e1faf1a75359e592d5d42b345a1b\"\n }\n}", "project": "Governance", "id": "01c33294-124f-4d68-8619-8e1d1cca7e0a", "savedPayload": { "position": { - "x": 37909.80762113533, - "y": 18390.192378864667 + "x": 37521.670272136376, + "y": 18220.84978460961 }, "targetPosition": { - "x": 37650, - "y": 18540.192378864667 + "x": 37433.24371981311, + "y": 18507.521626345453 }, "floatingObject": { "isPinned": false, @@ -18282,8 +18323,94 @@ "id": "e453990c-57e2-4886-9dc1-060cd2750467", "savedPayload": { "position": { - "x": 37650, - "y": 18540.192378864667 + "x": 37433.24371981311, + "y": 18507.521626345453 + }, + "targetPosition": { + "x": 37500, + "y": 18800 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "p2pNetworkNodes": { + "type": "P2P Network Nodes", + "name": "New P2P Network Nodes", + "config": "{}", + "project": "Governance", + "p2pNetworkNodes": [ + { + "type": "P2P Network Node", + "name": "P2P Network Node # 1", + "config": "{\n \"codeName\": \"P2P-Network-Node-1\",\n \"host\": \"localhost\",\n \"webPort\": \"31248\",\n \"webSocketsPort\": \"18042\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0x026ee6be4eec6e53d66d980d227dbbd4270c8d40235cbbac6b35212d0b43110d\",\n \"s\": \"0x08ef0215e47cb1c6d2e40b53835aaa972d70b5b2e62810b93133a4bfaa2a49db\",\n \"signature\": \"0x026ee6be4eec6e53d66d980d227dbbd4270c8d40235cbbac6b35212d0b43110d08ef0215e47cb1c6d2e40b53835aaa972d70b5b2e62810b93133a4bfaa2a49db1c\"\n }\n}", + "project": "Governance", + "id": "56cc0c90-4a58-4e25-a63f-4f9a6921d0f3", + "savedPayload": { + "position": { + "x": 37731.75962041048, + "y": 18268.801307392052 + }, + "targetPosition": { + "x": 37687.04694055762, + "y": 18565.45055525959 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "P2P Network Node", + "name": "P2P Network Node # 2", + "config": "{\n \"codeName\": \"P2P-Network-Node-2\",\n \"host\": \"localhost\",\n \"webPort\": \"31248\",\n \"webSocketsPort\": \"18042\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0xe5aa6283052addf4f4149bf796692daf0d14646702ffaba341c1c223878014f5\",\n \"s\": \"0x395ac5fd7a8d146555a93c2b1951df8815216c288d9481d26b5a4ce99ee541aa\",\n \"signature\": \"0xe5aa6283052addf4f4149bf796692daf0d14646702ffaba341c1c223878014f5395ac5fd7a8d146555a93c2b1951df8815216c288d9481d26b5a4ce99ee541aa1b\"\n }\n}", + "project": "Governance", + "id": "352cd906-c36c-48c7-8f01-728ff78b78e9", + "savedPayload": { + "position": { + "x": 37966.30906515088, + "y": 18455.84824794967 + }, + "targetPosition": { + "x": 37687.04694055762, + "y": 18565.45055525959 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + } + ], + "id": "da779e56-cb36-4825-bcd5-06692175a982", + "savedPayload": { + "position": { + "x": 37687.04694055762, + "y": 18565.45055525959 }, "targetPosition": { "x": 37500, diff --git a/Projects/Governance/Schemas/App-Schema/profile-constructor.json b/Projects/Governance/Schemas/App-Schema/profile-constructor.json index cf8471fe1..559541991 100644 --- a/Projects/Governance/Schemas/App-Schema/profile-constructor.json +++ b/Projects/Governance/Schemas/App-Schema/profile-constructor.json @@ -20,53 +20,9 @@ "relatedUiObjectProject": "Governance" }, { - "action": "Add Social Trading Desktop App", + "action": "Install Secrets", "actionProject": "Governance", - "label": "Add Social Trading Desktop App", - "askConfirmation": true, - "confirmationLabel": "Confirm to Proceed", - "workDoneLabel": "Done", - "relatedUiObject": "Profile Constructor", - "actionFunction": "payload.executeAction", - "relatedUiObjectProject": "Governance" - }, - { - "action": "Add Social Trading Server App", - "actionProject": "Governance", - "label": "Add Social Trading Server App", - "askConfirmation": true, - "confirmationLabel": "Confirm to Proceed", - "workDoneLabel": "Done", - "relatedUiObject": "Profile Constructor", - "actionFunction": "payload.executeAction", - "relatedUiObjectProject": "Governance" - }, - { - "action": "Add Social Trading Mobile App", - "actionProject": "Governance", - "label": "Add Social Trading Mobile App", - "askConfirmation": true, - "confirmationLabel": "Confirm to Proceed", - "workDoneLabel": "Done", - "relatedUiObject": "Profile Constructor", - "actionFunction": "payload.executeAction", - "relatedUiObjectProject": "Governance" - }, - { - "action": "Add Algo Traders Platform", - "actionProject": "Governance", - "label": "Add Algo Traders Platform", - "askConfirmation": true, - "confirmationLabel": "Confirm to Proceed", - "workDoneLabel": "Done", - "relatedUiObject": "Profile Constructor", - "actionFunction": "payload.executeAction", - "relatedUiObjectProject": "Governance" - }, - { - "action": "Add P2P Network Node", - "actionProject": "Governance", - "label": "Add P2P Network Node", + "label": "Install Secrets", "askConfirmation": true, "confirmationLabel": "Confirm to Proceed", "workDoneLabel": "Done", diff --git a/Projects/Governance/Schemas/App-Schema/signing-account.json b/Projects/Governance/Schemas/App-Schema/signing-account.json index aa93c3f6a..07b8b0526 100644 --- a/Projects/Governance/Schemas/App-Schema/signing-account.json +++ b/Projects/Governance/Schemas/App-Schema/signing-account.json @@ -35,5 +35,8 @@ "config": "{}" }, "propertyNameAtParent": "signingAccounts", - "childrenNodesProperties": [] + "childrenNodesProperties": [], + "title": [ + "Use Reference Parent" + ] } \ No newline at end of file diff --git a/Projects/Governance/UI/Function-Libraries/ActionSwitch.js b/Projects/Governance/UI/Function-Libraries/ActionSwitch.js index 50eabdc4d..5e62addc8 100644 --- a/Projects/Governance/UI/Function-Libraries/ActionSwitch.js +++ b/Projects/Governance/UI/Function-Libraries/ActionSwitch.js @@ -38,29 +38,9 @@ function newGovernanceActionSwitch() { UI.projects.governance.functionLibraries.profileConstructor.buildProfile(action.node, action.rootNodes) break } - case 'Add Social Trading Desktop App': + case 'Install Secrets': { - UI.projects.governance.functionLibraries.profileConstructor.addSigningAccount(action.node, action.rootNodes, 'Social Trading Desktop App') - break - } - case 'Add Social Trading Server App': - { - UI.projects.governance.functionLibraries.profileConstructor.addSigningAccount(action.node, action.rootNodes, 'Social Trading Server App') - break - } - case 'Add Social Trading Mobile App': - { - UI.projects.governance.functionLibraries.profileConstructor.addSigningAccount(action.node, action.rootNodes, 'Social Trading Mobile App') - break - } - case 'Add Algo Traders Platform': - { - UI.projects.governance.functionLibraries.profileConstructor.addSigningAccount(action.node, action.rootNodes, 'Algo Traders Platform') - break - } - case 'Add P2P Network Node': - { - UI.projects.governance.functionLibraries.profileConstructor.addSigningAccount(action.node, action.rootNodes, 'P2P Network Node') + UI.projects.governance.functionLibraries.profileConstructor.installSecrets(action.node, action.rootNodes) break } case 'Add Missing Plugin User Profiles': @@ -69,9 +49,9 @@ function newGovernanceActionSwitch() { } break case 'Add Specified User Profile': - { - UI.projects.governance.functionLibraries.pluginsFunctions.addSpecifiedUserProfile(action.node, action.rootNodes) - } + { + UI.projects.governance.functionLibraries.pluginsFunctions.addSpecifiedUserProfile(action.node, action.rootNodes) + } break case 'Add Missing Plugin Pools': { diff --git a/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js b/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js index f57c4913b..da7ecb296 100644 --- a/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js +++ b/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js @@ -1,8 +1,7 @@ function newGovernanceFunctionLibraryProfileConstructor() { let thisObject = { buildProfile: buildProfile, - installSecrets: installSecrets, - addSigningAccount: addSigningAccount + installSecrets: installSecrets } return thisObject @@ -166,7 +165,29 @@ function newGovernanceFunctionLibraryProfileConstructor() { node, rootNodes ) { - let userProfile = signingAccounts = node.payload.referenceParent + let userProfile = node.payload.referenceParent + /* + Get Message to Sign. + */ + let userProfileHandle = UI.projects.visualScripting.utilities.nodeConfig.loadConfigProperty(userProfile.payload, 'codeName') + + if (userProfileHandle === undefined || userProfileHandle === "") { + node.payload.uiObject.setErrorMessage( + "User Profile codeName config property missing.", + UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR + ) + return + } + /* + Checking the reference to the User Profile... + */ + if (node.payload.referenceParent === undefined) { + node.payload.uiObject.setErrorMessage( + "The Profile Contstructor needs to reference your User Profile.", + UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR + ) + return + } /* Delete Signing Accounts with all its children, it it exists. */ @@ -178,7 +199,7 @@ function newGovernanceFunctionLibraryProfileConstructor() { Create Signing Accounts. */ let signingAccounts = UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.addUIObject( - node.payload.referenceParent, + userProfile, 'Signing Accounts', UI.projects.foundations.spaces.designSpace.workspace.workspaceNode.rootNodes ) @@ -191,131 +212,72 @@ function newGovernanceFunctionLibraryProfileConstructor() { let socialPersonas = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(userProfile.socialPersonas, 'Social Persona') let p2pNetworkNodes = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(userProfile.p2pNetworkNodes, 'P2P Network Node') - addSigningAccounts(algoTradersPlatform) - addSigningAccounts(socialTradingDesktopApp) - addSigningAccounts(socialTradingMobileApp) - addSigningAccounts(socialTradingServerApp) - addSigningAccounts(socialTradingBots) - addSigningAccounts(socialPersonas) - addSigningAccounts(p2pNetworkNodes) + addSigningAccounts(algoTradersPlatform, 'Algo Traders Platform') + addSigningAccounts(socialTradingDesktopApp, 'Social Trading Desktop App') + addSigningAccounts(socialTradingMobileApp, 'Social Trading Mobile App') + addSigningAccounts(socialTradingServerApp, 'Social Trading Server App') + addSigningAccounts(socialTradingBots, 'Social Trading Bot') + addSigningAccounts(socialPersonas, 'Social Persona') + addSigningAccounts(p2pNetworkNodes, 'P2P Network Node') function addSigningAccounts(nodeArray, targetNodeType) { for (let i = 0; i < nodeArray.length; i++) { let currentNode = nodeArray[i] - addSigningAccount(currentNode, targetNodeType) + addSigningAccount(currentNode, targetNodeType, i + 1) } } function addSigningAccount( - node, - targetNodeType + targetNode, + targetNodeType, + targetNodeTypeCount ) { - let githubUsername = UI.projects.visualScripting.utilities.nodeConfig.loadConfigProperty(node.payload, 'githubUsername') - let mnemonic = UI.projects.visualScripting.utilities.nodeConfig.loadConfigProperty(node.payload, 'mnemonic') - let signingAccounts - - if (githubUsername === undefined || githubUsername === "") { - node.payload.uiObject.setErrorMessage( - "githubUsername config property missing.", - UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR - ) - return + let params = { + method: 'createWalletAccount', + entropy: node.id + (new Date()).valueOf() } - - /* - Some validations first... - */ - if (node.payload.referenceParent === undefined) { - node.payload.uiObject.setErrorMessage( - "The Profile Contstructor needs to reference your User Profile.", - UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR - ) - return - } - - if (node.payload.referenceParent.signingAccounts === undefined) { - signingAccounts = UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.addUIObject( - node.payload.referenceParent, - 'Signing Accounts', - UI.projects.foundations.spaces.designSpace.workspace.workspaceNode.rootNodes - ) - } else { - signingAccounts = node.payload.referenceParent.signingAccounts - } - - createWallet() - - function createWallet() { - let params - /* - If the user provides a mnemonic then we will get the private key and address from it, - otherwise, we will create a new private key and address. - */ - if (mnemonic === undefined || mnemonic === "") { - params = { - method: 'createWalletAccount', - entropy: node.id + (new Date()).valueOf() - } - } else { - params = { - method: 'mnemonicToPrivateKey', - mnemonic: mnemonic - } + + let url = 'WEB3' // We will access the default Client WEB3 endpoint. + + httpRequest(JSON.stringify(params), url, onResponse) + + function onResponse(err, data) { + /* Lets check the result of the call through the http interface */ + if (err.result !== GLOBAL.DEFAULT_OK_RESPONSE.result) { + node.payload.uiObject.setErrorMessage( + 'Call via HTTP Interface failed.', + UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR + ) + return } - - let url = 'WEB3' // We will access the default Client WEB3 endpoint. - - httpRequest(JSON.stringify(params), url, onResponse) - - function onResponse(err, data) { - /* Lets check the result of the call through the http interface */ - if (err.result !== GLOBAL.DEFAULT_OK_RESPONSE.result) { - node.payload.uiObject.setErrorMessage( - 'Call via HTTP Interface failed.', - UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR - ) - return - } - - let response = JSON.parse(data) - - /* Lets check the result of the method call */ - if (response.result !== GLOBAL.DEFAULT_OK_RESPONSE.result) { - - if (mnemonic === undefined || mnemonic === "") { - node.payload.uiObject.setErrorMessage( - 'Call to WEB3 Server failed. ' + response.error, - UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR - ) - console.log('Call to WEB3 Server failed. ' + response.error) - return - } else { - node.payload.uiObject.setErrorMessage( - 'Call to WEB3 Server failed. Most likely the Mnemonic provided is not correct or you need to run node setup because a dependency is missing. ' + response.error, - UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR - ) - console.log('Call to WEB3 Server failed. Most likely the Mnemonic provided is not correct or you need to run node setup because a dependency is missing. ' + response.error) - return - } - } - - signSigningAccountData(response.address, response.privateKey) + + let response = JSON.parse(data) + + /* Lets check the result of the method call */ + if (response.result !== GLOBAL.DEFAULT_OK_RESPONSE.result) { + node.payload.uiObject.setErrorMessage( + 'Call to WEB3 Server failed. ' + response.error, + UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR + ) + console.log('Call to WEB3 Server failed. ' + response.error) + return } + signSigningAccountData(response.address, response.privateKey) } - + function signSigningAccountData(address, privateKey) { - + let request = { url: 'WEB3', params: { method: "signData", privateKey: privateKey, - data: githubUsername + data: userProfileHandle } } - + httpRequest(JSON.stringify(request.params), request.url, onResponse) - + function onResponse(err, data) { /* Lets check the result of the call through the http interface */ if (err.result !== GLOBAL.DEFAULT_OK_RESPONSE.result) { @@ -325,9 +287,9 @@ function newGovernanceFunctionLibraryProfileConstructor() { ) return } - + let response = JSON.parse(data) - + /* Lets check the result of the method call */ if (response.result !== GLOBAL.DEFAULT_OK_RESPONSE.result) { node.payload.uiObject.setErrorMessage( @@ -337,74 +299,58 @@ function newGovernanceFunctionLibraryProfileConstructor() { console.log('Call to WEB3 Server failed. ' + response.error) return } - + createSigningAccount(response.signature) } - + function createSigningAccount(signature) { - + let signingAccount = UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.addUIObject( signingAccounts, 'Signing Account', UI.projects.foundations.spaces.designSpace.workspace.workspaceNode.rootNodes ) - - let signingAccountChild = UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.addUIObject( - signingAccount, - targetNodeType, - UI.projects.foundations.spaces.designSpace.workspace.workspaceNode.rootNodes - ) + + signingAccount.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 + + UI.projects.visualScripting.functionLibraries.attachDetach.referenceAttachNode(signingAccount, targetNode) /* Let's get a cool name for this node. */ - let targetNodeTypeCount = 0 - for (let i = 0; i < signingAccounts.signingAccounts.length; i++) { - let singningAccount = signingAccounts.signingAccounts[i] - if (singningAccount.signingAccountChild.type === targetNodeType) { - targetNodeTypeCount++ - } - } - signingAccountChild.name = targetNodeType + " # " + targetNodeTypeCount + targetNode.name = targetNodeType + " # " + targetNodeTypeCount let codeName = targetNodeType.replaceAll(' ', '-') + "-" + targetNodeTypeCount /* - We store at the User Profile the Signed githubUsername + We store at the User Profile the Signed userProfileHandle */ - UI.projects.visualScripting.utilities.nodeConfig.saveConfigProperty(signingAccountChild.payload, 'codeName', codeName) - UI.projects.visualScripting.utilities.nodeConfig.saveConfigProperty(signingAccount.payload, 'signature', signature) - - let secrets = UI.projects.visualScripting.utilities.nodeConfig.loadConfigProperty(node.payload, 'secrets', signingAccount.name) + UI.projects.visualScripting.utilities.nodeConfig.saveConfigProperty(targetNode.payload, 'codeName', codeName) + UI.projects.visualScripting.utilities.nodeConfig.saveConfigProperty(targetNode.payload, 'signature', signature) + + let secrets = UI.projects.visualScripting.utilities.nodeConfig.loadConfigProperty(node.payload, 'secrets') if (secrets === undefined) { secrets = [] } - + let secret = { - signingAccountChildId: signingAccountChild.id, - signingAccountChildName: signingAccountChild.name, - signingAccountChildType: targetNodeType, - signingAccountChildCodeName: codeName, + nodeId: targetNode.id, + nodeName: targetNode.name, + nodeType: targetNodeType, + nodeCodeName: codeName, signingAccountNodeId: signingAccount.id, privateKey: privateKey, - userProfileHandle: githubUsername, - userProfileId: node.payload.referenceParent.id + userProfileHandle: userProfileHandle, + userProfileId: userProfile.id } - + secrets.push(secret) - + UI.projects.visualScripting.utilities.nodeConfig.saveConfigProperty(node.payload, 'secrets', secrets) /* Show nice message. */ - if (mnemonic === undefined || mnemonic === "") { - node.payload.uiObject.setInfoMessage( - "Signing Account has been successfully created.", - UI.projects.governance.globals.designer.SET_INFO_COUNTER_FACTOR - ) - } else { - node.payload.uiObject.setInfoMessage( - "Mnemonic successfully imported. Signing Account has been successfully created.", - UI.projects.governance.globals.designer.SET_INFO_COUNTER_FACTOR - ) - } + node.payload.uiObject.setInfoMessage( + "Signing Account has been successfully created.", + UI.projects.governance.globals.designer.SET_INFO_COUNTER_FACTOR + ) } } } From 0b855bed3e53cf1a1cc4f06e9742994a384cd311 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 24 Nov 2021 15:45:28 +0100 Subject: [PATCH 10/19] Secrets File Being Created --- Environment.js | 1 + Platform/Client/httpInterface.js | 296 +++---- .../User-Profiles/Luis-Fernando-Molina.json | 730 +++++++++--------- .../Function-Libraries/ProfileConstructor.js | 37 +- 4 files changed, 557 insertions(+), 507 deletions(-) diff --git a/Environment.js b/Environment.js index 26a20db91..544f5ffa1 100644 --- a/Environment.js +++ b/Environment.js @@ -28,6 +28,7 @@ exports.newEnvironment = function () { PATH_TO_DESKTOP: './Desktop', PATH_TO_DEFAULT_WORKSPACE: path.join(basePath, './Projects/Foundations/Plugins/Workspaces'), PATH_TO_MY_WORKSPACES: path.join(basePath, './Platform/My-Workspaces'), + PATH_TO_SECRETS: path.join(basePath, './My-Secrets'), PATH_TO_FONTS: path.join(basePath, './Platform/WebServer/Fonts'), DESKTOP_APP_SIGNING_ACCOUNT: 'Social-Trading-Desktop-App-1', DESKTOP_APP_MAX_OUTGOING_PEERS: 1, diff --git a/Platform/Client/httpInterface.js b/Platform/Client/httpInterface.js index d58c87151..1ed5e2a88 100644 --- a/Platform/Client/httpInterface.js +++ b/Platform/Client/httpInterface.js @@ -139,7 +139,7 @@ exports.newHttpInterface = function newHttpInterface() { return } default: { - SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify({error: 'Method ' + params.method + ' is invalid.'}), httpResponse) + SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify({ error: 'Method ' + params.method + ' is invalid.' }), httpResponse) } } } catch (err) { @@ -325,6 +325,42 @@ exports.newHttpInterface = function newHttpInterface() { } } break + case 'Secrets': { + switch (requestPath[2]) { // switch by command + case 'Save-Secrets-File': { + SA.projects.foundations.utilities.httpRequests.getRequestBody(httpRequest, httpResponse, processRequest) + + async function processRequest(body) { + try { + + let filePath = global.env.PATH_TO_SECRETS + '/' + let fileName = "Secrets.json" + + createNewDir(filePath) + SA.nodeModules.fs.writeFileSync(filePath + '/' + fileName, body) + + console.log('[SUCCESS] ' + filePath + '/' + fileName + ' created.') + + SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse) + + } catch (err) { + console.log('[ERROR] httpInterface -> Secrets -> Save-Secrets-File -> Method call produced an error.') + console.log('[ERROR] httpInterface -> Secrets -> Save-Secrets-File -> err.stack = ' + err.stack) + console.log('[ERROR] httpInterface -> Secrets -> Save-Secrets-File -> Params Received = ' + body) + + let error = { + result: 'Fail Because', + message: err.message, + stack: err.stack + } + SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse) + } + } + break + } + } + } + case 'Docs': { switch (requestPath[2]) { // switch by command case 'Save-Node-Schema': { @@ -633,16 +669,6 @@ exports.newHttpInterface = function newHttpInterface() { } } } - - function createNewDir(path) { - try { - fs.mkdirSync(path, {recursive: true}) - } catch (err) { - if (err.message.indexOf('file already exists') < 0) { - throw (err) - } - } - } } return noErrorsDuringSaving @@ -697,7 +723,7 @@ exports.newHttpInterface = function newHttpInterface() { contribute() async function contribute() { - const {lookpath} = SA.nodeModules.lookpath + const { lookpath } = SA.nodeModules.lookpath const gitpath = await lookpath('git') if (gitpath === undefined) { console.log('[ERROR] `git` not installed.') @@ -768,7 +794,7 @@ exports.newHttpInterface = function newHttpInterface() { async function doGithub() { - const {Octokit} = SA.nodeModules.octokit + const { Octokit } = SA.nodeModules.octokit const octokit = new Octokit({ auth: token, @@ -832,7 +858,7 @@ exports.newHttpInterface = function newHttpInterface() { update() async function update() { - const {lookpath} = SA.nodeModules.lookpath + const { lookpath } = SA.nodeModules.lookpath const gitpath = await lookpath('git'); if (gitpath === undefined) { console.log('[ERROR] `git` not installed.') @@ -873,11 +899,11 @@ exports.newHttpInterface = function newHttpInterface() { let message try { message = await git.pull('https://github.com/Superalgos/Superalgos', currentBranch) - return {message: message} + return { message: message } } catch (err) { console.log('[ERROR] Error updating ' + currentBranch) console.log(err.stack) - return {error: err} + return { error: err } } } @@ -903,7 +929,7 @@ exports.newHttpInterface = function newHttpInterface() { checkout() async function checkout() { - const {lookpath} = SA.nodeModules.lookpath + const { lookpath } = SA.nodeModules.lookpath const gitpath = await lookpath('git'); if (gitpath === undefined) { console.log('[ERROR] `git` not installed.') @@ -1001,7 +1027,7 @@ exports.newHttpInterface = function newHttpInterface() { branch() async function branch() { - const {lookpath} = SA.nodeModules.lookpath + const { lookpath } = SA.nodeModules.lookpath const gitpath = await lookpath('git'); if (gitpath === undefined) { console.log('[ERROR] `git` not installed.') @@ -1343,7 +1369,7 @@ exports.newHttpInterface = function newHttpInterface() { async function doGithubUser() { - const {Octokit} = SA.nodeModules.octokit + const { Octokit } = SA.nodeModules.octokit const octokit = new Octokit({ auth: token, @@ -1355,7 +1381,7 @@ exports.newHttpInterface = function newHttpInterface() { const head = username + ':' + contributionsBranch //const base = currentBranch let base = undefined - if(process.env.SA_MODE === 'gitDisable') { + if (process.env.SA_MODE === 'gitDisable') { base = 'develop' } else { base = currentBranch @@ -1435,11 +1461,11 @@ exports.newHttpInterface = function newHttpInterface() { async function getSHA(path) { let sha = '' - const {graphql} = SA.nodeModules.graphql + const { graphql } = SA.nodeModules.graphql try { - const {repository} = await graphql( + const { repository } = await graphql( '{ ' + ' repository(name: "SuperAlgos", owner: "' + username + '") {' + ' object(expression: "develop:' + path + '") {' + @@ -1524,7 +1550,7 @@ exports.newHttpInterface = function newHttpInterface() { return } default: { - SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify({error: 'Method ' + params.method + ' is invalid.'}), httpResponse) + SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify({ error: 'Method ' + params.method + ' is invalid.' }), httpResponse) } } } catch (err) { @@ -1555,132 +1581,132 @@ exports.newHttpInterface = function newHttpInterface() { } break case 'Images': // This means the Images folder. - { - let path = global.env.PATH_TO_PLATFORM + '/WebServer/Images/' + requestPath[2] + { + let path = global.env.PATH_TO_PLATFORM + '/WebServer/Images/' + requestPath[2] - if (requestPath[3] !== undefined) { - path = path + '/' + requestPath[3] + if (requestPath[3] !== undefined) { + path = path + '/' + requestPath[3] + } + + if (requestPath[4] !== undefined) { + path = path + '/' + requestPath[4] + } + + if (requestPath[5] !== undefined) { + path = path + '/' + requestPath[5] + } + + path = unescape(path) + + SA.projects.foundations.utilities.httpResponses.respondWithImage(path, httpResponse) } - - if (requestPath[4] !== undefined) { - path = path + '/' + requestPath[4] - } - - if (requestPath[5] !== undefined) { - path = path + '/' + requestPath[5] - } - - path = unescape(path) - - SA.projects.foundations.utilities.httpResponses.respondWithImage(path, httpResponse) - } break case 'Icons': // This means the Icons folder under Projects. - { - let path = global.env.PATH_TO_PROJECTS + '/' + requestPath[2] + '/Icons' + { + let path = global.env.PATH_TO_PROJECTS + '/' + requestPath[2] + '/Icons' - if (requestPath[3] !== undefined) { - path = path + '/' + requestPath[3] + if (requestPath[3] !== undefined) { + path = path + '/' + requestPath[3] + } + + if (requestPath[4] !== undefined) { + path = path + '/' + requestPath[4] + } + + if (requestPath[5] !== undefined) { + path = path + '/' + requestPath[5] + } + + path = unescape(path) + + SA.projects.foundations.utilities.httpResponses.respondWithImage(path, httpResponse) } - - if (requestPath[4] !== undefined) { - path = path + '/' + requestPath[4] - } - - if (requestPath[5] !== undefined) { - path = path + '/' + requestPath[5] - } - - path = unescape(path) - - SA.projects.foundations.utilities.httpResponses.respondWithImage(path, httpResponse) - } break case 'GIFs': // This means the GIFs folder under Projects. - { - let path = global.env.PATH_TO_PROJECTS + '/' + requestPath[2] + '/GIFs' + { + let path = global.env.PATH_TO_PROJECTS + '/' + requestPath[2] + '/GIFs' - if (requestPath[3] !== undefined) { - path = path + '/' + requestPath[3] + if (requestPath[3] !== undefined) { + path = path + '/' + requestPath[3] + } + + if (requestPath[4] !== undefined) { + path = path + '/' + requestPath[4] + } + + if (requestPath[5] !== undefined) { + path = path + '/' + requestPath[5] + } + + path = unescape(path) + SA.projects.foundations.utilities.httpResponses.respondWithImage(path, httpResponse) } - - if (requestPath[4] !== undefined) { - path = path + '/' + requestPath[4] - } - - if (requestPath[5] !== undefined) { - path = path + '/' + requestPath[5] - } - - path = unescape(path) - SA.projects.foundations.utilities.httpResponses.respondWithImage(path, httpResponse) - } break case 'PNGs': // This means the PNGs folder under Projects. - { - let path = global.env.PATH_TO_PROJECTS + '/' + requestPath[2] + '/PNGs' + { + let path = global.env.PATH_TO_PROJECTS + '/' + requestPath[2] + '/PNGs' - if (requestPath[3] !== undefined) { - path = path + '/' + requestPath[3] + if (requestPath[3] !== undefined) { + path = path + '/' + requestPath[3] + } + + if (requestPath[4] !== undefined) { + path = path + '/' + requestPath[4] + } + + if (requestPath[5] !== undefined) { + path = path + '/' + requestPath[5] + } + + path = unescape(path) + SA.projects.foundations.utilities.httpResponses.respondWithImage(path, httpResponse) } - - if (requestPath[4] !== undefined) { - path = path + '/' + requestPath[4] - } - - if (requestPath[5] !== undefined) { - path = path + '/' + requestPath[5] - } - - path = unescape(path) - SA.projects.foundations.utilities.httpResponses.respondWithImage(path, httpResponse) - } break case 'WebServer': // This means the WebServer folder. - { - SA.projects.foundations.utilities.httpResponses.respondWithFile(global.env.PATH_TO_PLATFORM + '/WebServer/' + requestPath[2], httpResponse) - } + { + SA.projects.foundations.utilities.httpResponses.respondWithFile(global.env.PATH_TO_PLATFORM + '/WebServer/' + requestPath[2], httpResponse) + } break case 'externalScripts': // This means the WebServer folder. - { - // This allows to have sub-folders in externalScripts - let fullPath = '' - for (let i = 2; i < requestPath.length; i++) { - fullPath += requestPath[i] - if (i !== requestPath.length - 1) { - fullPath += '/' + { + // This allows to have sub-folders in externalScripts + let fullPath = '' + for (let i = 2; i < requestPath.length; i++) { + fullPath += requestPath[i] + if (i !== requestPath.length - 1) { + fullPath += '/' + } } + + /** + * Sometimes libs will call fonts/images etc. by themselves thus we should have a filter for file type to respond with the correct content and headers, but from the externalScripts folder + * This code should be improved when needed with specific file types + */ + + let requestedFileExtension = requestPath[requestPath.length - 1].split('.').pop() + switch (requestedFileExtension) { + case 'otf': + case 'ttf': + case 'eot': + case 'woff': + case 'woff2': + SA.projects.foundations.utilities.httpResponses.respondWithFont(global.env.PATH_TO_PLATFORM + '/WebServer/externalScripts/' + fullPath, httpResponse) + break + default: + SA.projects.foundations.utilities.httpResponses.respondWithFile(global.env.PATH_TO_PLATFORM + '/WebServer/externalScripts/' + fullPath, httpResponse) + } + } - - /** - * Sometimes libs will call fonts/images etc. by themselves thus we should have a filter for file type to respond with the correct content and headers, but from the externalScripts folder - * This code should be improved when needed with specific file types - */ - - let requestedFileExtension = requestPath[requestPath.length - 1].split('.').pop() - switch (requestedFileExtension) { - case 'otf': - case 'ttf': - case 'eot': - case 'woff': - case 'woff2': - SA.projects.foundations.utilities.httpResponses.respondWithFont(global.env.PATH_TO_PLATFORM + '/WebServer/externalScripts/' + fullPath, httpResponse) - break - default: - SA.projects.foundations.utilities.httpResponses.respondWithFile(global.env.PATH_TO_PLATFORM + '/WebServer/externalScripts/' + fullPath, httpResponse) - } - - } break case 'Plotters': // This means the plotter folder, not to be confused with the Plotters script! - { - let project = requestPath[2] - let dataMine = requestPath[3] - let codeName = requestPath[4] - let moduleName = requestPath[5] - let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/' + 'Bots-Plotters-Code' + '/' + dataMine + '/plotters/' + codeName + '/' + moduleName - SA.projects.foundations.utilities.httpResponses.respondWithFile(filePath, httpResponse) - } + { + let project = requestPath[2] + let dataMine = requestPath[3] + let codeName = requestPath[4] + let moduleName = requestPath[5] + let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/' + 'Bots-Plotters-Code' + '/' + dataMine + '/plotters/' + codeName + '/' + moduleName + SA.projects.foundations.utilities.httpResponses.respondWithFile(filePath, httpResponse) + } break case 'ChartLayers': { SA.projects.foundations.utilities.httpResponses.respondWithFile(global.env.PATH_TO_PLATFORM + '/UI/' + endpointOrFile + '/' + requestPath[2], httpResponse) @@ -1878,8 +1904,8 @@ exports.newHttpInterface = function newHttpInterface() { fileName ) .then(response => { - SA.projects.foundations.utilities.httpResponses.respondWithContent(response, httpResponse) - } + SA.projects.foundations.utilities.httpResponses.respondWithContent(response, httpResponse) + } ) .catch(err => { let error = { @@ -2059,7 +2085,7 @@ exports.newHttpInterface = function newHttpInterface() { /* Create Dir if it does not exist */ if (!fs.existsSync(dir)) { - fs.mkdirSync(dir, {recursive: true}); + fs.mkdirSync(dir, { recursive: true }); } fs.writeFile(filePath, fileContent, onFileWritten) @@ -2203,4 +2229,14 @@ exports.newHttpInterface = function newHttpInterface() { } } } + + function createNewDir(path) { + try { + SA.nodeModules.fs.mkdirSync(path, { recursive: true }) + } catch (err) { + if (err.message.indexOf('file already exists') < 0) { + throw (err) + } + } + } } diff --git a/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json b/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json index 16f1c6c64..79b492a25 100644 --- a/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json +++ b/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json @@ -17035,18 +17035,18 @@ "signingAccounts": [ { "type": "Signing Account", - "name": "New Signing Account", + "name": "Algo Traders Platform #1", "config": "{}", "project": "Governance", - "id": "28cbfc6e-b71e-4351-9994-09b865dab181", + "id": "17298d63-aaab-44b0-a313-1c76401fd3e9", "savedPayload": { "position": { - "x": 37698.47833786449, - "y": 19232.658962136466 + "x": 37463, + "y": 18845 }, "targetPosition": { - "x": 37433.24371981311, - "y": 19092.478373654547 + "x": 37522, + "y": 18896 }, "floatingObject": { "isPinned": false, @@ -17061,7 +17061,7 @@ }, "referenceParent": { "type": "Algo Traders Platform", - "name": "Algo Traders Platform # 1", + "name": "Algo Traders Platform #1", "id": "0a06a54b-825b-4ff4-93cc-36465348ad26" }, "referenceParentCombinedNodePath": [ @@ -17078,7 +17078,7 @@ "Desktop Apps" ], [ - "New Algo Traders Platform", + "Algo Traders Platform # 1", "Algo Traders Platform" ] ] @@ -17086,206 +17086,18 @@ }, { "type": "Signing Account", - "name": "New Signing Account", + "name": "Social Trading Desktop App #2", "config": "{}", "project": "Governance", - "id": "bc2b6446-436f-4e95-b97b-671ad9f28dc0", + "id": "72f9a1e1-3194-4562-b1c6-16f6d871b009", "savedPayload": { "position": { - "x": 37653.15928136206, - "y": 19296.530194985822 + "x": 37521, + "y": 18986 }, "targetPosition": { - "x": 37433.24371981311, - "y": 19092.478373654547 - }, - "floatingObject": { - "isPinned": false, - "isFrozen": false, - "isCollapsed": false, - "angleToParent": 2, - "distanceToParent": 3, - "arrangementStyle": 0 - }, - "uiObject": { - "isRunning": false - }, - "referenceParent": { - "type": "P2P Network Node", - "name": "P2P Network Node # 1", - "id": "56cc0c90-4a58-4e25-a63f-4f9a6921d0f3" - }, - "referenceParentCombinedNodePath": [ - [ - "Luis-Fernando-Molina", - "User Profile" - ], - [ - "New P2P Network Nodes", - "P2P Network Nodes" - ], - [ - "New P2P Network Node", - "P2P Network Node" - ] - ] - } - }, - { - "type": "Signing Account", - "name": "New Signing Account", - "config": "{}", - "project": "Governance", - "id": "34036aa3-97ac-4d6d-9a93-6a758b04c619", - "savedPayload": { - "position": { - "x": 37592.85334276771, - "y": 19346.495633423034 - }, - "targetPosition": { - "x": 37433.24371981311, - "y": 19092.478373654547 - }, - "floatingObject": { - "isPinned": false, - "isFrozen": false, - "isCollapsed": false, - "angleToParent": 2, - "distanceToParent": 3, - "arrangementStyle": 0 - }, - "uiObject": { - "isRunning": false - }, - "referenceParent": { - "type": "P2P Network Node", - "name": "P2P Network Node # 2", - "id": "352cd906-c36c-48c7-8f01-728ff78b78e9" - }, - "referenceParentCombinedNodePath": [ - [ - "Luis-Fernando-Molina", - "User Profile" - ], - [ - "New P2P Network Nodes", - "P2P Network Nodes" - ], - [ - "New P2P Network Node", - "P2P Network Node" - ] - ] - } - }, - { - "type": "Signing Account", - "name": "New Signing Account", - "config": "{}", - "project": "Governance", - "id": "9b639fd5-3bab-49fe-8eb0-a5b25aa3f0f5", - "savedPayload": { - "position": { - "x": 37521.670272136376, - "y": 19379.15021539039 - }, - "targetPosition": { - "x": 37433.24371981311, - "y": 19092.478373654547 - }, - "floatingObject": { - "isPinned": false, - "isFrozen": false, - "isCollapsed": false, - "angleToParent": 2, - "distanceToParent": 3, - "arrangementStyle": 0 - }, - "uiObject": { - "isRunning": false - }, - "referenceParent": { - "type": "Social Persona", - "name": "Social Persona # 1", - "id": "ed15b68f-c9e0-447a-9ef7-660db229244c" - }, - "referenceParentCombinedNodePath": [ - [ - "Luis-Fernando-Molina", - "User Profile" - ], - [ - "New Social Personas", - "Social Personas" - ], - [ - "New Social Persona", - "Social Persona" - ] - ] - } - }, - { - "type": "Signing Account", - "name": "New Signing Account", - "config": "{}", - "project": "Governance", - "id": "8ba13c84-3637-4dec-b003-2ec05917e14d", - "savedPayload": { - "position": { - "x": 37444.46107809601, - "y": 19392.268585091068 - }, - "targetPosition": { - "x": 37433.24371981311, - "y": 19092.478373654547 - }, - "floatingObject": { - "isPinned": false, - "isFrozen": false, - "isCollapsed": false, - "angleToParent": 2, - "distanceToParent": 3, - "arrangementStyle": 0 - }, - "uiObject": { - "isRunning": false - }, - "referenceParent": { - "type": "Social Persona", - "name": "Social Persona # 2", - "id": "01c33294-124f-4d68-8619-8e1d1cca7e0a" - }, - "referenceParentCombinedNodePath": [ - [ - "Luis-Fernando-Molina", - "User Profile" - ], - [ - "New Social Personas", - "Social Personas" - ], - [ - "Luis", - "Social Persona" - ] - ] - } - }, - { - "type": "Signing Account", - "name": "New Signing Account", - "config": "{}", - "project": "Governance", - "id": "277378ea-6d5e-4904-b698-e82e6d394d61", - "savedPayload": { - "position": { - "x": 37366.48743962622, - "y": 19384.956747309094 - }, - "targetPosition": { - "x": 37433.24371981311, - "y": 19092.478373654547 + "x": 37522, + "y": 18896 }, "floatingObject": { "isPinned": false, @@ -17300,58 +17112,7 @@ }, "referenceParent": { "type": "Social Trading Desktop App", - "name": "Social Trading Desktop App # 1", - "id": "33c4f8e9-f8a3-4dea-91f4-1539e3aed0d3" - }, - "referenceParentCombinedNodePath": [ - [ - "Luis-Fernando-Molina", - "User Profile" - ], - [ - "New User Apps", - "User Apps" - ], - [ - "New Desktop Apps", - "Desktop Apps" - ], - [ - "New Social Trading Desktop App", - "Social Trading Desktop App" - ] - ] - } - }, - { - "type": "Signing Account", - "name": "New Signing Account", - "config": "{}", - "project": "Governance", - "id": "93bee05f-72c1-4315-9179-843c4b1dcecb", - "savedPayload": { - "position": { - "x": 37293.06313133119, - "y": 19357.71299170593 - }, - "targetPosition": { - "x": 37433.24371981311, - "y": 19092.478373654547 - }, - "floatingObject": { - "isPinned": false, - "isFrozen": false, - "isCollapsed": false, - "angleToParent": 2, - "distanceToParent": 3, - "arrangementStyle": 0 - }, - "uiObject": { - "isRunning": false - }, - "referenceParent": { - "type": "Social Trading Desktop App", - "name": "Social Trading Desktop App # 2", + "name": "Social Trading Desktop App #2", "id": "ad887d5f-998f-48c5-9db7-78e17c66f4e4" }, "referenceParentCombinedNodePath": [ @@ -17368,7 +17129,7 @@ "Desktop Apps" ], [ - "New Social Trading Desktop App", + "Social Trading Desktop App # 2", "Social Trading Desktop App" ] ] @@ -17376,69 +17137,18 @@ }, { "type": "Signing Account", - "name": "New Signing Account", + "name": "Social Trading Server App #1", "config": "{}", "project": "Governance", - "id": "18a6b8e1-f3c4-46a8-9a01-ec65d7869428", + "id": "64504ada-f232-41b6-85dd-007c49c65d47", "savedPayload": { "position": { - "x": 37229.19189848183, - "y": 19312.393935203494 + "x": 37453, + "y": 18972 }, "targetPosition": { - "x": 37433.24371981311, - "y": 19092.478373654547 - }, - "floatingObject": { - "isPinned": false, - "isFrozen": false, - "isCollapsed": false, - "angleToParent": 2, - "distanceToParent": 3, - "arrangementStyle": 0 - }, - "uiObject": { - "isRunning": false - }, - "referenceParent": { - "type": "Social Trading Mobile App", - "name": "Social Trading Mobile App # 1", - "id": "42843263-b1f3-4e4e-885a-5d8b9d7b647a" - }, - "referenceParentCombinedNodePath": [ - [ - "Luis-Fernando-Molina", - "User Profile" - ], - [ - "New User Apps", - "User Apps" - ], - [ - "New Mobile Apps", - "Mobile Apps" - ], - [ - "New Social Trading Mobile App", - "Social Trading Mobile App" - ] - ] - } - }, - { - "type": "Signing Account", - "name": "New Signing Account", - "config": "{}", - "project": "Governance", - "id": "c6aea3b9-961b-4550-af58-8e4c1cad1ae1", - "savedPayload": { - "position": { - "x": 37179.22646004462, - "y": 19252.08799660915 - }, - "targetPosition": { - "x": 37433.24371981311, - "y": 19092.478373654547 + "x": 37522, + "y": 18896 }, "floatingObject": { "isPinned": false, @@ -17453,7 +17163,7 @@ }, "referenceParent": { "type": "Social Trading Server App", - "name": "Social Trading Server App # 1", + "name": "Social Trading Server App #1", "id": "0216b143-0e46-4da6-b2cb-e95556fc1bfd" }, "referenceParentCombinedNodePath": [ @@ -17470,7 +17180,7 @@ "Server Apps" ], [ - "New Social Trading Server App", + "Social Trading Server App # 1", "Social Trading Server App" ] ] @@ -17478,18 +17188,120 @@ }, { "type": "Signing Account", - "name": "New Signing Account", + "name": "Social Trading Desktop App #1", "config": "{}", "project": "Governance", - "id": "6e5d0000-b36d-4271-886a-8a447f656a8b", + "id": "31683ad9-4a78-4dbb-be7b-eacd2d9f8a5e", "savedPayload": { "position": { - "x": 37146.571878077266, - "y": 19180.90492597782 + "x": 37616, + "y": 18858 }, "targetPosition": { - "x": 37433.24371981311, - "y": 19092.478373654547 + "x": 37522, + "y": 18896 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Social Trading Desktop App", + "name": "Social Trading Desktop App #1", + "id": "33c4f8e9-f8a3-4dea-91f4-1539e3aed0d3" + }, + "referenceParentCombinedNodePath": [ + [ + "Luis-Fernando-Molina", + "User Profile" + ], + [ + "New User Apps", + "User Apps" + ], + [ + "New Desktop Apps", + "Desktop Apps" + ], + [ + "Social Trading Desktop App # 1", + "Social Trading Desktop App" + ] + ] + } + }, + { + "type": "Signing Account", + "name": "Social Trading Mobile App #1", + "config": "{}", + "project": "Governance", + "id": "be003988-42ee-42fb-ac71-8585badb2df3", + "savedPayload": { + "position": { + "x": 37526, + "y": 18847 + }, + "targetPosition": { + "x": 37522, + "y": 18896 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Social Trading Mobile App", + "name": "Social Trading Mobile App #1", + "id": "42843263-b1f3-4e4e-885a-5d8b9d7b647a" + }, + "referenceParentCombinedNodePath": [ + [ + "Luis-Fernando-Molina", + "User Profile" + ], + [ + "New User Apps", + "User Apps" + ], + [ + "New Mobile Apps", + "Mobile Apps" + ], + [ + "Social Trading Mobile App # 1", + "Social Trading Mobile App" + ] + ] + } + }, + { + "type": "Signing Account", + "name": "Social Trading Bot #1", + "config": "{}", + "project": "Governance", + "id": "675430fc-1b78-4f40-bdcf-c9349b9aac14", + "savedPayload": { + "position": { + "x": 37477, + "y": 18807 + }, + "targetPosition": { + "x": 37522, + "y": 18896 }, "floatingObject": { "isPinned": false, @@ -17504,7 +17316,7 @@ }, "referenceParent": { "type": "Social Trading Bot", - "name": "Social Trading Bot # 1", + "name": "Social Trading Bot #1", "id": "5167a23f-1e17-4cd5-85a7-3c7f2a3019ac" }, "referenceParentCombinedNodePath": [ @@ -17521,7 +17333,7 @@ "Social Trading Bots" ], [ - "New Social Trading Bot", + "Social Trading Bot # 1", "Social Trading Bot" ] ] @@ -17529,18 +17341,18 @@ }, { "type": "Signing Account", - "name": "New Signing Account", + "name": "Social Trading Bot #2", "config": "{}", "project": "Governance", - "id": "3ad562a0-6593-411d-a07f-8803d053a24d", + "id": "bbb007c8-16c4-4b33-9640-bec16deaf413", "savedPayload": { "position": { - "x": 37133.45350837659, - "y": 19103.695731937445 + "x": 37425, + "y": 18815 }, "targetPosition": { - "x": 37433.24371981311, - "y": 19092.478373654547 + "x": 37522, + "y": 18896 }, "floatingObject": { "isPinned": false, @@ -17555,7 +17367,7 @@ }, "referenceParent": { "type": "Social Trading Bot", - "name": "Social Trading Bot # 2", + "name": "Social Trading Bot #2", "id": "c27748af-db60-44fc-a095-530401057beb" }, "referenceParentCombinedNodePath": [ @@ -17572,18 +17384,206 @@ "Social Trading Bots" ], [ - "Jorgito", + "Social Trading Bot # 2", "Social Trading Bot" ] ] } + }, + { + "type": "Signing Account", + "name": "Social Persona #1", + "config": "{}", + "project": "Governance", + "id": "dd6d4c67-d538-40be-b8ad-46582ff4806f", + "savedPayload": { + "position": { + "x": 37611, + "y": 18915 + }, + "targetPosition": { + "x": 37522, + "y": 18896 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Social Persona", + "name": "Social Persona #1", + "id": "ed15b68f-c9e0-447a-9ef7-660db229244c" + }, + "referenceParentCombinedNodePath": [ + [ + "Luis-Fernando-Molina", + "User Profile" + ], + [ + "New Social Personas", + "Social Personas" + ], + [ + "Social Persona # 1", + "Social Persona" + ] + ] + } + }, + { + "type": "Signing Account", + "name": "Social Persona #2", + "config": "{}", + "project": "Governance", + "id": "81181d01-f079-4e44-ae9a-aecb72b2029f", + "savedPayload": { + "position": { + "x": 37517, + "y": 18841 + }, + "targetPosition": { + "x": 37522, + "y": 18896 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Social Persona", + "name": "Social Persona #2", + "id": "01c33294-124f-4d68-8619-8e1d1cca7e0a" + }, + "referenceParentCombinedNodePath": [ + [ + "Luis-Fernando-Molina", + "User Profile" + ], + [ + "New Social Personas", + "Social Personas" + ], + [ + "Social Persona # 2", + "Social Persona" + ] + ] + } + }, + { + "type": "Signing Account", + "name": "P2P Network Node #1", + "config": "{}", + "project": "Governance", + "id": "9ff2cc32-15e8-4f9d-a285-b6da07790f75", + "savedPayload": { + "position": { + "x": 37422, + "y": 18819 + }, + "targetPosition": { + "x": 37522, + "y": 18896 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "P2P Network Node", + "name": "P2P Network Node #1", + "id": "56cc0c90-4a58-4e25-a63f-4f9a6921d0f3" + }, + "referenceParentCombinedNodePath": [ + [ + "Luis-Fernando-Molina", + "User Profile" + ], + [ + "New P2P Network Nodes", + "P2P Network Nodes" + ], + [ + "P2P Network Node # 1", + "P2P Network Node" + ] + ] + } + }, + { + "type": "Signing Account", + "name": "P2P Network Node #2", + "config": "{}", + "project": "Governance", + "id": "747ce055-6b6d-4a2e-97af-5337c7adb148", + "savedPayload": { + "position": { + "x": 37504, + "y": 18850 + }, + "targetPosition": { + "x": 37522, + "y": 18896 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "P2P Network Node", + "name": "P2P Network Node #2", + "id": "352cd906-c36c-48c7-8f01-728ff78b78e9" + }, + "referenceParentCombinedNodePath": [ + [ + "Luis-Fernando-Molina", + "User Profile" + ], + [ + "New P2P Network Nodes", + "P2P Network Nodes" + ], + [ + "P2P Network Node # 2", + "P2P Network Node" + ] + ] + } } ], - "id": "4e7e2c46-0ed1-4446-b523-cee698e3bec4", + "id": "bc7ad965-9157-4bb9-8f54-861ee630a1f7", "savedPayload": { "position": { - "x": 37433.24371981311, - "y": 19092.478373654547 + "x": 37522, + "y": 18896 }, "targetPosition": { "x": 37500, @@ -17615,8 +17615,8 @@ "socialTradingDesktopApps": [ { "type": "Social Trading Desktop App", - "name": "Social Trading Desktop App # 1", - "config": "{\n \"codeName\": \"Social-Trading-Desktop-App-1\",\n \"host\": \"localhost\",\n \"webPort\": \"34248\",\n \"webSocketsPort\": \"17042\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x17c50659b1e04028069e1fdcb1e51ad6cefa8d76b3c65a3581a4bde06b1d74c1\",\n \"s\": \"0x3ab1cfeb49cb3f17ded3d3b13589692ae18c89da57fa05e260abc0c1fdadb7c5\",\n \"signature\": \"0x17c50659b1e04028069e1fdcb1e51ad6cefa8d76b3c65a3581a4bde06b1d74c13ab1cfeb49cb3f17ded3d3b13589692ae18c89da57fa05e260abc0c1fdadb7c51b\"\n }\n}", + "name": "Social Trading Desktop App #1", + "config": "{\n \"codeName\": \"Social-Trading-Desktop-App-1\",\n \"host\": \"localhost\",\n \"webPort\": \"34248\",\n \"webSocketsPort\": \"17042\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0xe763104dfe4b223a8ab48cc86374aaf19477c0680f922481c002133b33cc922a\",\n \"s\": \"0x0c48a8362270bd501d25301f85a975482359932e8723ba69b5b98c03f9eaff48\",\n \"signature\": \"0xe763104dfe4b223a8ab48cc86374aaf19477c0680f922481c002133b33cc922a0c48a8362270bd501d25301f85a975482359932e8723ba69b5b98c03f9eaff481b\"\n }\n}", "project": "Governance", "id": "33c4f8e9-f8a3-4dea-91f4-1539e3aed0d3", "savedPayload": { @@ -17643,8 +17643,8 @@ }, { "type": "Social Trading Desktop App", - "name": "Social Trading Desktop App # 2", - "config": "{\n \"codeName\": \"Social-Trading-Desktop-App-2\",\n \"host\": \"localhost\",\n \"webPort\": \"34248\",\n \"webSocketsPort\": \"17042\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0x6baf3bb53d031afed105ed82f1b0b9efed9aa9ce36c459ee7ed7974a31ed752e\",\n \"s\": \"0x1d117a6bfb959d68c31f0d3baa9ec99ffa1f66269b1d87796447f8ae37738fbb\",\n \"signature\": \"0x6baf3bb53d031afed105ed82f1b0b9efed9aa9ce36c459ee7ed7974a31ed752e1d117a6bfb959d68c31f0d3baa9ec99ffa1f66269b1d87796447f8ae37738fbb1c\"\n }\n}", + "name": "Social Trading Desktop App #2", + "config": "{\n \"codeName\": \"Social-Trading-Desktop-App-2\",\n \"host\": \"localhost\",\n \"webPort\": \"34248\",\n \"webSocketsPort\": \"17042\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x972eb6dcaeef7d683b96e3a32489a609b41f651f59c51e2e302973f4d2f853c8\",\n \"s\": \"0x51d99acaa415a5af0bcf703158053732aee7d0543c19fdc15dd954cc3af4ff31\",\n \"signature\": \"0x972eb6dcaeef7d683b96e3a32489a609b41f651f59c51e2e302973f4d2f853c851d99acaa415a5af0bcf703158053732aee7d0543c19fdc15dd954cc3af4ff311b\"\n }\n}", "project": "Governance", "id": "ad887d5f-998f-48c5-9db7-78e17c66f4e4", "savedPayload": { @@ -17673,8 +17673,8 @@ "algoTradesPlatform": [ { "type": "Algo Traders Platform", - "name": "Algo Traders Platform # 1", - "config": "{\n \"codeName\": \"Algo-Traders-Platform-1\",\n \"host\": \"localhost\",\n \"webPort\": \"34248\",\n \"webSocketsPort\": \"18041\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0x0de185dd10efc845027591f2f3a0639ab96e50c1b7cf950f58b33fe0f5d0ecff\",\n \"s\": \"0x62c50add24cf74745396e38982d7c7eebf73d298b7f9dbb63498f0d2bf906677\",\n \"signature\": \"0x0de185dd10efc845027591f2f3a0639ab96e50c1b7cf950f58b33fe0f5d0ecff62c50add24cf74745396e38982d7c7eebf73d298b7f9dbb63498f0d2bf9066771c\"\n }\n}", + "name": "Algo Traders Platform #1", + "config": "{\n \"codeName\": \"Algo-Traders-Platform-1\",\n \"host\": \"localhost\",\n \"webPort\": \"34248\",\n \"webSocketsPort\": \"18041\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x06f002a54bc4a806d9a353fb40a1355897923bc9879084f84fef7ffde949fc9d\",\n \"s\": \"0x375244b4d774658e641c2508c470a9751d5ffc44fb5e1f5bbc39fb76d5661cff\",\n \"signature\": \"0x06f002a54bc4a806d9a353fb40a1355897923bc9879084f84fef7ffde949fc9d375244b4d774658e641c2508c470a9751d5ffc44fb5e1f5bbc39fb76d5661cff1b\"\n }\n}", "project": "Governance", "id": "0a06a54b-825b-4ff4-93cc-36465348ad26", "savedPayload": { @@ -17731,8 +17731,8 @@ "socialTradingMobileApps": [ { "type": "Social Trading Mobile App", - "name": "Social Trading Mobile App # 1", - "config": "{\n \"codeName\": \"Social-Trading-Mobile-App-1\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"15042\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0xce473067d8c5c594209127240dcb398b5eb2f0fbcb9d1e408d1ce67d2eb860c2\",\n \"s\": \"0x289eb65ec9ccc122cc279289ccbaf8700933f5293d1915aa8e1e2cfd8b76884b\",\n \"signature\": \"0xce473067d8c5c594209127240dcb398b5eb2f0fbcb9d1e408d1ce67d2eb860c2289eb65ec9ccc122cc279289ccbaf8700933f5293d1915aa8e1e2cfd8b76884b1b\"\n }\n}", + "name": "Social Trading Mobile App #1", + "config": "{\n \"codeName\": \"Social-Trading-Mobile-App-1\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"15042\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0x222ade6445cfa7700cdfae78da76bd9b7490b1af64804edd0b4a8919c3ef8b46\",\n \"s\": \"0x52d2352df40e0fb719891e8401be849d24b87a77f2224f5e99a776d8cb504c2b\",\n \"signature\": \"0x222ade6445cfa7700cdfae78da76bd9b7490b1af64804edd0b4a8919c3ef8b4652d2352df40e0fb719891e8401be849d24b87a77f2224f5e99a776d8cb504c2b1c\"\n }\n}", "project": "Governance", "id": "42843263-b1f3-4e4e-885a-5d8b9d7b647a", "savedPayload": { @@ -17789,8 +17789,8 @@ "socialTradingServerApps": [ { "type": "Social Trading Server App", - "name": "Social Trading Server App # 1", - "config": "{\n \"codeName\": \"Social-Trading-Server-App-1\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"16042\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x530da1dbec5025cdb3ffa3f6479784fde62e680aee5c015bd67967e0fedf339b\",\n \"s\": \"0x54ac2296c9badd0aabc7e3b1fb1b5c45dd1dd20c3e11e77e6629f9f8f2964234\",\n \"signature\": \"0x530da1dbec5025cdb3ffa3f6479784fde62e680aee5c015bd67967e0fedf339b54ac2296c9badd0aabc7e3b1fb1b5c45dd1dd20c3e11e77e6629f9f8f29642341b\"\n }\n}", + "name": "Social Trading Server App #1", + "config": "{\n \"codeName\": \"Social-Trading-Server-App-1\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"16042\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0xdf5bff3affde17a7496d3820ae13c5f4d11c3a6c380f627d801b845a7a886c67\",\n \"s\": \"0x48f354db3a33cbe36df613ab67d4c1b3e926546e2aad5d13987fea51411dea40\",\n \"signature\": \"0xdf5bff3affde17a7496d3820ae13c5f4d11c3a6c380f627d801b845a7a886c6748f354db3a33cbe36df613ab67d4c1b3e926546e2aad5d13987fea51411dea401b\"\n }\n}", "project": "Governance", "id": "0216b143-0e46-4da6-b2cb-e95556fc1bfd", "savedPayload": { @@ -17875,8 +17875,8 @@ "socialTradingBots": [ { "type": "Social Trading Bot", - "name": "Social Trading Bot # 1", - "config": "{\n \"codeName\": \"Social-Trading-Bot-1\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0x45f316f12bcbc094380fdde58f6d9b6508c9408ae9f47d9408ab8b5f9ff83446\",\n \"s\": \"0x39dac1285fd483f5549536f7dbf349463a7d476505a2dd79b69ec1dc61fcd249\",\n \"signature\": \"0x45f316f12bcbc094380fdde58f6d9b6508c9408ae9f47d9408ab8b5f9ff8344639dac1285fd483f5549536f7dbf349463a7d476505a2dd79b69ec1dc61fcd2491c\"\n }\n}", + "name": "Social Trading Bot #1", + "config": "{\n \"codeName\": \"Social-Trading-Bot-1\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0xeef6af611301f1edf5e254a98dafa2bab24e4502614b3ebea713eb787dc4d4a1\",\n \"s\": \"0x29b5933f3e756e21d80307399eb0460ecf0ffe4486d5f835942fa5f56b2272a1\",\n \"signature\": \"0xeef6af611301f1edf5e254a98dafa2bab24e4502614b3ebea713eb787dc4d4a129b5933f3e756e21d80307399eb0460ecf0ffe4486d5f835942fa5f56b2272a11b\"\n }\n}", "project": "Governance", "socialTradingBotsFollowing": { "type": "Social Trading Bots Following", @@ -17942,7 +17942,7 @@ }, { "type": "Social Trading Bot Followed", - "name": "Social Trading Bot # 2", + "name": "Social Trading Bot #2", "config": "{}", "project": "Governance", "id": "30d456e2-e263-4e12-a486-9f1aa5cc2bf1", @@ -17968,7 +17968,7 @@ }, "referenceParent": { "type": "Social Trading Bot", - "name": "Social Trading Bot # 2", + "name": "Social Trading Bot #2", "id": "c27748af-db60-44fc-a095-530401057beb" }, "referenceParentCombinedNodePath": [ @@ -17991,7 +17991,7 @@ "4809934c-d45d-4565-a686-5d96bd695b4f" ], [ - "Social Trading Bot # 2", + "Social Trading Bot #2", "Social Trading Bot", "Governance", "c27748af-db60-44fc-a095-530401057beb" @@ -18048,8 +18048,8 @@ }, { "type": "Social Trading Bot", - "name": "Social Trading Bot # 2", - "config": "{\n \"codeName\": \"Social-Trading-Bot-2\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0xd65c72803ae6771a0de78c086a5101648ce63b702bbd2ad549998022d182d921\",\n \"s\": \"0x3e35b58f10605c74726e4ab3fa1f139da3d227f254fa030d467cbd9a7517f012\",\n \"signature\": \"0xd65c72803ae6771a0de78c086a5101648ce63b702bbd2ad549998022d182d9213e35b58f10605c74726e4ab3fa1f139da3d227f254fa030d467cbd9a7517f0121b\"\n }\n}", + "name": "Social Trading Bot #2", + "config": "{\n \"codeName\": \"Social-Trading-Bot-2\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0xd13c9a57a15c372196ef14328f6f4e2e9fbf1e142acc418462b81049ec51613d\",\n \"s\": \"0x7ef65c98ae4e11b7eb9351c563889b207489ee8d2a0900a22f85dddb9a1f436b\",\n \"signature\": \"0xd13c9a57a15c372196ef14328f6f4e2e9fbf1e142acc418462b81049ec51613d7ef65c98ae4e11b7eb9351c563889b207489ee8d2a0900a22f85dddb9a1f436b1c\"\n }\n}", "project": "Governance", "id": "c27748af-db60-44fc-a095-530401057beb", "savedPayload": { @@ -18129,8 +18129,8 @@ "socialPersonas": [ { "type": "Social Persona", - "name": "Social Persona # 1", - "config": "{\n \"codeName\": \"Social-Persona-1\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x0551499d1e74297e96bf7f1990fb9f32591b16e0d5b3d79fb2497ddf15de8355\",\n \"s\": \"0x0d6bf77a10b6dbfce1c55e33145d7b62136a1accd928973957a0cc4ee490648f\",\n \"signature\": \"0x0551499d1e74297e96bf7f1990fb9f32591b16e0d5b3d79fb2497ddf15de83550d6bf77a10b6dbfce1c55e33145d7b62136a1accd928973957a0cc4ee490648f1b\"\n }\n}", + "name": "Social Persona #1", + "config": "{\n \"codeName\": \"Social-Persona-1\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0xe5d7f2a2386182f4126f911c6b9f69a6512b66b8fa3eac9b518093e9c3d2a823\",\n \"s\": \"0x5c828d828f7a4267488c896a87a21c8165708faca57f195eb9a5c6eefba3974d\",\n \"signature\": \"0xe5d7f2a2386182f4126f911c6b9f69a6512b66b8fa3eac9b518093e9c3d2a8235c828d828f7a4267488c896a87a21c8165708faca57f195eb9a5c6eefba3974d1c\"\n }\n}", "project": "Governance", "socialPersonasFollowing": { "type": "Social Personas Following", @@ -18140,7 +18140,7 @@ "socialPersonasFollowed": [ { "type": "Social Persona Followed", - "name": "Social Persona # 2", + "name": "Social Persona #2", "config": "{}", "project": "Governance", "id": "45f1a092-8a89-45f8-b31c-c4c062a56a8a", @@ -18166,7 +18166,7 @@ }, "referenceParent": { "type": "Social Persona", - "name": "Social Persona # 2", + "name": "Social Persona #2", "id": "01c33294-124f-4d68-8619-8e1d1cca7e0a" }, "referenceParentCombinedNodePath": [ @@ -18183,7 +18183,7 @@ "e453990c-57e2-4886-9dc1-060cd2750467" ], [ - "Social Persona # 2", + "Social Persona #2", "Social Persona", "Governance", "01c33294-124f-4d68-8619-8e1d1cca7e0a" @@ -18193,7 +18193,7 @@ }, { "type": "Social Persona Followed", - "name": "Social Persona # 2", + "name": "Social Persona #2", "config": "{}", "project": "Governance", "id": "2eb918aa-742f-49c8-bea2-4cdc2d9bd1c7", @@ -18219,7 +18219,7 @@ }, "referenceParent": { "type": "Social Persona", - "name": "Social Persona # 2", + "name": "Social Persona #2", "id": "01c33294-124f-4d68-8619-8e1d1cca7e0a" }, "referenceParentCombinedNodePath": [ @@ -18236,7 +18236,7 @@ "e453990c-57e2-4886-9dc1-060cd2750467" ], [ - "Social Persona # 2", + "Social Persona #2", "Social Persona", "Governance", "01c33294-124f-4d68-8619-8e1d1cca7e0a" @@ -18293,8 +18293,8 @@ }, { "type": "Social Persona", - "name": "Social Persona # 2", - "config": "{\n \"socialHandle\": \"\",\n \"bio\": \"\",\n \"codeName\": \"Social-Persona-2\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x5e4ce5c11d0ad664e8c745ff1dcf212b0cbcce9ae05dc2d9ed27fdc6dfcb07d9\",\n \"s\": \"0x79f2f0112532d95c8f26c71b065a96446b3204e1faf1a75359e592d5d42b345a\",\n \"signature\": \"0x5e4ce5c11d0ad664e8c745ff1dcf212b0cbcce9ae05dc2d9ed27fdc6dfcb07d979f2f0112532d95c8f26c71b065a96446b3204e1faf1a75359e592d5d42b345a1b\"\n }\n}", + "name": "Social Persona #2", + "config": "{\n \"socialHandle\": \"\",\n \"bio\": \"\",\n \"codeName\": \"Social-Persona-2\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0xf16fc18bee708ee12d97e04b73c2cadf84a3121d537ceaedc3b2427a784ead90\",\n \"s\": \"0x4a255264df25257c03f3bb59be73adcdb699517b6c5b0341e303b65443f0b5ce\",\n \"signature\": \"0xf16fc18bee708ee12d97e04b73c2cadf84a3121d537ceaedc3b2427a784ead904a255264df25257c03f3bb59be73adcdb699517b6c5b0341e303b65443f0b5ce1b\"\n }\n}", "project": "Governance", "id": "01c33294-124f-4d68-8619-8e1d1cca7e0a", "savedPayload": { @@ -18351,8 +18351,8 @@ "p2pNetworkNodes": [ { "type": "P2P Network Node", - "name": "P2P Network Node # 1", - "config": "{\n \"codeName\": \"P2P-Network-Node-1\",\n \"host\": \"localhost\",\n \"webPort\": \"31248\",\n \"webSocketsPort\": \"18042\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0x026ee6be4eec6e53d66d980d227dbbd4270c8d40235cbbac6b35212d0b43110d\",\n \"s\": \"0x08ef0215e47cb1c6d2e40b53835aaa972d70b5b2e62810b93133a4bfaa2a49db\",\n \"signature\": \"0x026ee6be4eec6e53d66d980d227dbbd4270c8d40235cbbac6b35212d0b43110d08ef0215e47cb1c6d2e40b53835aaa972d70b5b2e62810b93133a4bfaa2a49db1c\"\n }\n}", + "name": "P2P Network Node #1", + "config": "{\n \"codeName\": \"P2P-Network-Node-1\",\n \"host\": \"localhost\",\n \"webPort\": \"31248\",\n \"webSocketsPort\": \"18042\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x28d201d302bafe36a08c2f96f82fcd4d563a83cd3bc0de2d2565b268ae2deebe\",\n \"s\": \"0x373aa71e0fed2043f5b406f9fcfb81281b6ff8fa037461ec15de19bc05b9bbd6\",\n \"signature\": \"0x28d201d302bafe36a08c2f96f82fcd4d563a83cd3bc0de2d2565b268ae2deebe373aa71e0fed2043f5b406f9fcfb81281b6ff8fa037461ec15de19bc05b9bbd61b\"\n }\n}", "project": "Governance", "id": "56cc0c90-4a58-4e25-a63f-4f9a6921d0f3", "savedPayload": { @@ -18379,8 +18379,8 @@ }, { "type": "P2P Network Node", - "name": "P2P Network Node # 2", - "config": "{\n \"codeName\": \"P2P-Network-Node-2\",\n \"host\": \"localhost\",\n \"webPort\": \"31248\",\n \"webSocketsPort\": \"18042\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0xe5aa6283052addf4f4149bf796692daf0d14646702ffaba341c1c223878014f5\",\n \"s\": \"0x395ac5fd7a8d146555a93c2b1951df8815216c288d9481d26b5a4ce99ee541aa\",\n \"signature\": \"0xe5aa6283052addf4f4149bf796692daf0d14646702ffaba341c1c223878014f5395ac5fd7a8d146555a93c2b1951df8815216c288d9481d26b5a4ce99ee541aa1b\"\n }\n}", + "name": "P2P Network Node #2", + "config": "{\n \"codeName\": \"P2P-Network-Node-2\",\n \"host\": \"localhost\",\n \"webPort\": \"31248\",\n \"webSocketsPort\": \"18042\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x5f4429345f40964af3011b78b6d54b033e1f27ba59c463ed0e1babcc87a893d6\",\n \"s\": \"0x1aba92cdbdff8ad079218c05f9a85d6be93f5a76c44d7f04fefbb1a025bfc1dc\",\n \"signature\": \"0x5f4429345f40964af3011b78b6d54b033e1f27ba59c463ed0e1babcc87a893d61aba92cdbdff8ad079218c05f9a85d6be93f5a76c44d7f04fefbb1a025bfc1dc1b\"\n }\n}", "project": "Governance", "id": "352cd906-c36c-48c7-8f01-728ff78b78e9", "savedPayload": { @@ -18442,7 +18442,7 @@ "floatingObject": { "isPinned": false, "isFrozen": false, - "isCollapsed": false, + "isCollapsed": true, "angleToParent": 1, "distanceToParent": 3, "arrangementStyle": 0 diff --git a/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js b/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js index da7ecb296..8506b3a3d 100644 --- a/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js +++ b/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js @@ -165,6 +165,9 @@ function newGovernanceFunctionLibraryProfileConstructor() { node, rootNodes ) { + let secretsFile = { + secrets: [] + } let userProfile = node.payload.referenceParent /* Get Message to Sign. @@ -317,7 +320,7 @@ function newGovernanceFunctionLibraryProfileConstructor() { /* Let's get a cool name for this node. */ - targetNode.name = targetNodeType + " # " + targetNodeTypeCount + targetNode.name = targetNodeType + " #" + targetNodeTypeCount let codeName = targetNodeType.replaceAll(' ', '-') + "-" + targetNodeTypeCount /* We store at the User Profile the Signed userProfileHandle @@ -325,10 +328,7 @@ function newGovernanceFunctionLibraryProfileConstructor() { UI.projects.visualScripting.utilities.nodeConfig.saveConfigProperty(targetNode.payload, 'codeName', codeName) UI.projects.visualScripting.utilities.nodeConfig.saveConfigProperty(targetNode.payload, 'signature', signature) - let secrets = UI.projects.visualScripting.utilities.nodeConfig.loadConfigProperty(node.payload, 'secrets') - if (secrets === undefined) { - secrets = [] - } + let secrets = secretsFile.secrets let secret = { nodeId: targetNode.id, @@ -342,15 +342,28 @@ function newGovernanceFunctionLibraryProfileConstructor() { } secrets.push(secret) - - UI.projects.visualScripting.utilities.nodeConfig.saveConfigProperty(node.payload, 'secrets', secrets) /* - Show nice message. + Save Secrets File */ - node.payload.uiObject.setInfoMessage( - "Signing Account has been successfully created.", - UI.projects.governance.globals.designer.SET_INFO_COUNTER_FACTOR - ) + httpRequest(JSON.stringify(secretsFile, undefined, 4), 'Secrets/Save-Secrets-File', onResponse) + function onResponse(err, data) { + /* Lets check the result of the call through the http interface */ + data = JSON.parse(data) + if (err.result != GLOBAL.DEFAULT_OK_RESPONSE.result || data.result != GLOBAL.DEFAULT_OK_RESPONSE.result) { + node.payload.uiObject.setErrorMessage( + "Secrets file could not be created.", + UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR + ) + } else { + /* + Show nice message. + */ + node.payload.uiObject.setInfoMessage( + "Secrets file have been sucessfully created.", + UI.projects.governance.globals.designer.SET_INFO_COUNTER_FACTOR + ) + } + } } } } From aa7c6a01b7382d9659925d616e9a307f64128f96 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 24 Nov 2021 15:48:30 +0100 Subject: [PATCH 11/19] Refactoring --- DesktopRoot.js | 2 +- NetworkRoot.js | 2 +- Projects/Network/SA/Modules/P2PNetwork.js | 2 +- Projects/Network/SA/Modules/UserProfiles.js | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/DesktopRoot.js b/DesktopRoot.js index 5a95acdf1..5dbb2c26b 100644 --- a/DesktopRoot.js +++ b/DesktopRoot.js @@ -64,7 +64,7 @@ exports.newDesktopRoot = function newDesktopRoot() { } for (let i = 0; i < SA.secrets.array.length; i++) { let secret = SA.secrets.array[i] - SA.secrets.map.set (secret.signingAccountChildCodeName, secret) + SA.secrets.map.set (secret.nodeCodeName, secret) } run() diff --git a/NetworkRoot.js b/NetworkRoot.js index eab6a7d4e..4e6a3c927 100644 --- a/NetworkRoot.js +++ b/NetworkRoot.js @@ -62,7 +62,7 @@ exports.newNetworkRoot = function newNetworkRoot() { } for (let i = 0; i < SA.secrets.array.length; i++) { let secret = SA.secrets.array[i] - SA.secrets.map.set(secret.signingAccountChildCodeName, secret) + SA.secrets.map.set(secret.nodeCodeName, secret) } NT.app = require('./Network/NetwokNode.js').newNetworkNode() diff --git a/Projects/Network/SA/Modules/P2PNetwork.js b/Projects/Network/SA/Modules/P2PNetwork.js index 9c660c2e4..e24138935 100644 --- a/Projects/Network/SA/Modules/P2PNetwork.js +++ b/Projects/Network/SA/Modules/P2PNetwork.js @@ -31,7 +31,7 @@ exports.newNetworkModulesP2PNetwork = function newNetworkModulesP2PNetwork() { case 'Network Peer': { thisObject.p2pNodesToConnect = [] - let thisP2PNodeId = SA.secrets.map.get(global.env.P2P_NETWORK_NODE_SIGNING_ACCOUNT).signingAccountChildId + let thisP2PNodeId = SA.secrets.map.get(global.env.P2P_NETWORK_NODE_SIGNING_ACCOUNT).nodeId for (let i = 0; i < SA.projects.network.globals.memory.arrays.P2P_NETWORK_NODES.length; i++) { let p2pNetworkNode = SA.projects.network.globals.memory.arrays.P2P_NETWORK_NODES[i] if (thisP2PNodeId !== p2pNetworkNode.node.id) { diff --git a/Projects/Network/SA/Modules/UserProfiles.js b/Projects/Network/SA/Modules/UserProfiles.js index 09df3e54a..e19369639 100644 --- a/Projects/Network/SA/Modules/UserProfiles.js +++ b/Projects/Network/SA/Modules/UserProfiles.js @@ -18,7 +18,7 @@ exports.newNetworkModulesUserProfiles = function newNetworkModulesUserProfiles() } - async function initialize(signingAccountChildCodeName, p2pNetworkIdentity) { + async function initialize(nodeCodeName, p2pNetworkIdentity) { let pluginFileNames = await SA.projects.communityPlugins.utilities.plugins.getPluginFileNames( 'Governance', @@ -95,7 +95,7 @@ exports.newNetworkModulesUserProfiles = function newNetworkModulesUserProfiles() Now, we will extract the information from the User Profile, specifically of our identity at the p2p network. */ if ( - signingAccount.signingAccountChild.id === SA.secrets.map.get(signingAccountChildCodeName).signingAccountChildId + signingAccount.signingAccountChild.id === SA.secrets.map.get(nodeCodeName).nodeId ) { p2pNetworkIdentity.node = signingAccount.signingAccountChild p2pNetworkIdentity.blockchainAccount = blockchainAccount From 8557b7b02efb411e72f64e52a133fcfc49adb6f0 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 24 Nov 2021 16:35:48 +0100 Subject: [PATCH 12/19] Bug Fixes --- .../User-Profiles/Luis-Fernando-Molina.json | 370 +++++++++--------- .../Function-Libraries/ProfileConstructor.js | 3 +- Projects/Network/SA/Modules/UserProfiles.js | 18 +- 3 files changed, 197 insertions(+), 194 deletions(-) diff --git a/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json b/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json index 79b492a25..ec81052fb 100644 --- a/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json +++ b/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json @@ -17036,17 +17036,17 @@ { "type": "Signing Account", "name": "Algo Traders Platform #1", - "config": "{}", + "config": "{\n \"codeName\": \"Algo-Traders-Platform-1\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0xe4566a497221d797935bf52fcfc4ac379142ff4fd04eb5dab9f895225c5efc3f\",\n \"s\": \"0x169e3cc82bd518811122af751964d4ebaff089bc47b586fd6fa8aab6ff93510e\",\n \"signature\": \"0xe4566a497221d797935bf52fcfc4ac379142ff4fd04eb5dab9f895225c5efc3f169e3cc82bd518811122af751964d4ebaff089bc47b586fd6fa8aab6ff93510e1b\"\n }\n}", "project": "Governance", - "id": "17298d63-aaab-44b0-a313-1c76401fd3e9", + "id": "bc6d5f74-265d-4c43-a1f7-d266ca6f2864", "savedPayload": { "position": { - "x": 37463, - "y": 18845 + "x": 37698.47833786449, + "y": 19232.658962136466 }, "targetPosition": { - "x": 37522, - "y": 18896 + "x": 37433.24371981311, + "y": 19092.478373654547 }, "floatingObject": { "isPinned": false, @@ -17078,77 +17078,26 @@ "Desktop Apps" ], [ - "Algo Traders Platform # 1", + "Algo Traders Platform #1", "Algo Traders Platform" ] ] } }, - { - "type": "Signing Account", - "name": "Social Trading Desktop App #2", - "config": "{}", - "project": "Governance", - "id": "72f9a1e1-3194-4562-b1c6-16f6d871b009", - "savedPayload": { - "position": { - "x": 37521, - "y": 18986 - }, - "targetPosition": { - "x": 37522, - "y": 18896 - }, - "floatingObject": { - "isPinned": false, - "isFrozen": false, - "isCollapsed": false, - "angleToParent": 2, - "distanceToParent": 3, - "arrangementStyle": 0 - }, - "uiObject": { - "isRunning": false - }, - "referenceParent": { - "type": "Social Trading Desktop App", - "name": "Social Trading Desktop App #2", - "id": "ad887d5f-998f-48c5-9db7-78e17c66f4e4" - }, - "referenceParentCombinedNodePath": [ - [ - "Luis-Fernando-Molina", - "User Profile" - ], - [ - "New User Apps", - "User Apps" - ], - [ - "New Desktop Apps", - "Desktop Apps" - ], - [ - "Social Trading Desktop App # 2", - "Social Trading Desktop App" - ] - ] - } - }, { "type": "Signing Account", "name": "Social Trading Server App #1", - "config": "{}", + "config": "{\n \"codeName\": \"Social-Trading-Server-App-1\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x6366189e1139c88e1207a1d7572107e91ee4d022ac327ad10b72fcc409fe170a\",\n \"s\": \"0x3a63f7735b50c54cdd11f4745c63e05567605a8d018a587e2fd5906cf299e137\",\n \"signature\": \"0x6366189e1139c88e1207a1d7572107e91ee4d022ac327ad10b72fcc409fe170a3a63f7735b50c54cdd11f4745c63e05567605a8d018a587e2fd5906cf299e1371b\"\n }\n}", "project": "Governance", - "id": "64504ada-f232-41b6-85dd-007c49c65d47", + "id": "8411cea1-d4f8-4014-91e3-8d25da5a37b9", "savedPayload": { "position": { - "x": 37453, - "y": 18972 + "x": 37653.15928136206, + "y": 19296.530194985822 }, "targetPosition": { - "x": 37522, - "y": 18896 + "x": 37433.24371981311, + "y": 19092.478373654547 }, "floatingObject": { "isPinned": false, @@ -17180,7 +17129,7 @@ "Server Apps" ], [ - "Social Trading Server App # 1", + "Social Trading Server App #1", "Social Trading Server App" ] ] @@ -17189,17 +17138,17 @@ { "type": "Signing Account", "name": "Social Trading Desktop App #1", - "config": "{}", + "config": "{\n \"codeName\": \"Social-Trading-Desktop-App-1\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0xe90c72318a537fa499c2168d0968a77a258d121b79db659a732efb645952c45b\",\n \"s\": \"0x3cdae989d8414d89583e4237771ba1a50246dd594f9426138293c02e0bc8e277\",\n \"signature\": \"0xe90c72318a537fa499c2168d0968a77a258d121b79db659a732efb645952c45b3cdae989d8414d89583e4237771ba1a50246dd594f9426138293c02e0bc8e2771c\"\n }\n}", "project": "Governance", - "id": "31683ad9-4a78-4dbb-be7b-eacd2d9f8a5e", + "id": "79b79d42-906b-4f7e-859f-307c1f59c609", "savedPayload": { "position": { - "x": 37616, - "y": 18858 + "x": 37592.85334276771, + "y": 19346.495633423034 }, "targetPosition": { - "x": 37522, - "y": 18896 + "x": 37433.24371981311, + "y": 19092.478373654547 }, "floatingObject": { "isPinned": false, @@ -17231,77 +17180,26 @@ "Desktop Apps" ], [ - "Social Trading Desktop App # 1", + "Social Trading Desktop App #1", "Social Trading Desktop App" ] ] } }, - { - "type": "Signing Account", - "name": "Social Trading Mobile App #1", - "config": "{}", - "project": "Governance", - "id": "be003988-42ee-42fb-ac71-8585badb2df3", - "savedPayload": { - "position": { - "x": 37526, - "y": 18847 - }, - "targetPosition": { - "x": 37522, - "y": 18896 - }, - "floatingObject": { - "isPinned": false, - "isFrozen": false, - "isCollapsed": false, - "angleToParent": 2, - "distanceToParent": 3, - "arrangementStyle": 0 - }, - "uiObject": { - "isRunning": false - }, - "referenceParent": { - "type": "Social Trading Mobile App", - "name": "Social Trading Mobile App #1", - "id": "42843263-b1f3-4e4e-885a-5d8b9d7b647a" - }, - "referenceParentCombinedNodePath": [ - [ - "Luis-Fernando-Molina", - "User Profile" - ], - [ - "New User Apps", - "User Apps" - ], - [ - "New Mobile Apps", - "Mobile Apps" - ], - [ - "Social Trading Mobile App # 1", - "Social Trading Mobile App" - ] - ] - } - }, { "type": "Signing Account", "name": "Social Trading Bot #1", - "config": "{}", + "config": "{\n \"codeName\": \"Social-Trading-Bot-1\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0x8c4d79e56bad649717fdd43dadea04af3501101828415fec6c8e154a88b9274c\",\n \"s\": \"0x510c3d0eea03e630fed4babbba9733f2f9769a3af46f886ad309ba06b5962f84\",\n \"signature\": \"0x8c4d79e56bad649717fdd43dadea04af3501101828415fec6c8e154a88b9274c510c3d0eea03e630fed4babbba9733f2f9769a3af46f886ad309ba06b5962f841c\"\n }\n}", "project": "Governance", - "id": "675430fc-1b78-4f40-bdcf-c9349b9aac14", + "id": "33e9a11c-fd0f-4a93-94b5-8ec4a0e36872", "savedPayload": { "position": { - "x": 37477, - "y": 18807 + "x": 37521.670272136376, + "y": 19379.15021539039 }, "targetPosition": { - "x": 37522, - "y": 18896 + "x": 37433.24371981311, + "y": 19092.478373654547 }, "floatingObject": { "isPinned": false, @@ -17333,7 +17231,7 @@ "Social Trading Bots" ], [ - "Social Trading Bot # 1", + "Social Trading Bot #1", "Social Trading Bot" ] ] @@ -17341,18 +17239,120 @@ }, { "type": "Signing Account", - "name": "Social Trading Bot #2", - "config": "{}", + "name": "Social Trading Desktop App #2", + "config": "{\n \"codeName\": \"Social-Trading-Desktop-App-2\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0xe954670fce311d449291afd63d2c583801b198f5bffbd354a17dc0953c0d246b\",\n \"s\": \"0x65ce3dbf442db3f5fe4885b9abf30163d1902673cfc422489f670f3691b30513\",\n \"signature\": \"0xe954670fce311d449291afd63d2c583801b198f5bffbd354a17dc0953c0d246b65ce3dbf442db3f5fe4885b9abf30163d1902673cfc422489f670f3691b305131b\"\n }\n}", "project": "Governance", - "id": "bbb007c8-16c4-4b33-9640-bec16deaf413", + "id": "2e7afb68-f902-48e6-862c-fe920cbbf6a0", "savedPayload": { "position": { - "x": 37425, - "y": 18815 + "x": 37444.46107809601, + "y": 19392.268585091068 }, "targetPosition": { - "x": 37522, - "y": 18896 + "x": 37433.24371981311, + "y": 19092.478373654547 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Social Trading Desktop App", + "name": "Social Trading Desktop App #2", + "id": "ad887d5f-998f-48c5-9db7-78e17c66f4e4" + }, + "referenceParentCombinedNodePath": [ + [ + "Luis-Fernando-Molina", + "User Profile" + ], + [ + "New User Apps", + "User Apps" + ], + [ + "New Desktop Apps", + "Desktop Apps" + ], + [ + "Social Trading Desktop App #2", + "Social Trading Desktop App" + ] + ] + } + }, + { + "type": "Signing Account", + "name": "Social Trading Mobile App #1", + "config": "{\n \"codeName\": \"Social-Trading-Mobile-App-1\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x781eefd6933468afc56d0fadbde7e970325963f21538e810a6ca1aad00f20c0e\",\n \"s\": \"0x3f7a4f4ce85e58212da363641f5d4c7362f858f4ebfefe8430b16ac845debc2c\",\n \"signature\": \"0x781eefd6933468afc56d0fadbde7e970325963f21538e810a6ca1aad00f20c0e3f7a4f4ce85e58212da363641f5d4c7362f858f4ebfefe8430b16ac845debc2c1b\"\n }\n}", + "project": "Governance", + "id": "b981e982-39a2-407c-aaee-f83fd149aeed", + "savedPayload": { + "position": { + "x": 37366.48743962622, + "y": 19384.956747309094 + }, + "targetPosition": { + "x": 37433.24371981311, + "y": 19092.478373654547 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Social Trading Mobile App", + "name": "Social Trading Mobile App #1", + "id": "42843263-b1f3-4e4e-885a-5d8b9d7b647a" + }, + "referenceParentCombinedNodePath": [ + [ + "Luis-Fernando-Molina", + "User Profile" + ], + [ + "New User Apps", + "User Apps" + ], + [ + "New Mobile Apps", + "Mobile Apps" + ], + [ + "Social Trading Mobile App #1", + "Social Trading Mobile App" + ] + ] + } + }, + { + "type": "Signing Account", + "name": "Social Trading Bot #2", + "config": "{\n \"codeName\": \"Social-Trading-Bot-2\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0xf0499a689d4b09f8a3ba68dbd748ca757b9d7749eea50a52a3cb9673583b0608\",\n \"s\": \"0x7ca826f7198a2dd15ae23e0fd376c43a4d060fffdd8e293748b6592c450b42e1\",\n \"signature\": \"0xf0499a689d4b09f8a3ba68dbd748ca757b9d7749eea50a52a3cb9673583b06087ca826f7198a2dd15ae23e0fd376c43a4d060fffdd8e293748b6592c450b42e11c\"\n }\n}", + "project": "Governance", + "id": "0c931463-b609-43e6-9353-1b13450895a7", + "savedPayload": { + "position": { + "x": 37293.06313133119, + "y": 19357.71299170593 + }, + "targetPosition": { + "x": 37433.24371981311, + "y": 19092.478373654547 }, "floatingObject": { "isPinned": false, @@ -17384,7 +17384,7 @@ "Social Trading Bots" ], [ - "Social Trading Bot # 2", + "Social Trading Bot #2", "Social Trading Bot" ] ] @@ -17393,17 +17393,17 @@ { "type": "Signing Account", "name": "Social Persona #1", - "config": "{}", + "config": "{\n \"codeName\": \"Social-Persona-1\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0xbd9657c69743d2fd097c5728391f971b00b8bc9d2ea787a13436263b6cfd1423\",\n \"s\": \"0x5b4b7593b3a221f636ff16825c8f49d5bd409c83dcd47f20badc1797596afb27\",\n \"signature\": \"0xbd9657c69743d2fd097c5728391f971b00b8bc9d2ea787a13436263b6cfd14235b4b7593b3a221f636ff16825c8f49d5bd409c83dcd47f20badc1797596afb271b\"\n }\n}", "project": "Governance", - "id": "dd6d4c67-d538-40be-b8ad-46582ff4806f", + "id": "60f58a3e-ce39-4669-8c85-9fbed91ee97a", "savedPayload": { "position": { - "x": 37611, - "y": 18915 + "x": 37229.19189848183, + "y": 19312.393935203494 }, "targetPosition": { - "x": 37522, - "y": 18896 + "x": 37433.24371981311, + "y": 19092.478373654547 }, "floatingObject": { "isPinned": false, @@ -17431,7 +17431,7 @@ "Social Personas" ], [ - "Social Persona # 1", + "Social Persona #1", "Social Persona" ] ] @@ -17440,17 +17440,17 @@ { "type": "Signing Account", "name": "Social Persona #2", - "config": "{}", + "config": "{\n \"codeName\": \"Social-Persona-2\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0xf7e6fde3e7bc19db547a3446c43aaf4e1af8327c72e782a4a68fef2869679cd7\",\n \"s\": \"0x337f8310b83332ea0d50f891dd9f98632854665717888fb39e266173769ad92b\",\n \"signature\": \"0xf7e6fde3e7bc19db547a3446c43aaf4e1af8327c72e782a4a68fef2869679cd7337f8310b83332ea0d50f891dd9f98632854665717888fb39e266173769ad92b1c\"\n }\n}", "project": "Governance", - "id": "81181d01-f079-4e44-ae9a-aecb72b2029f", + "id": "91e8a4a8-e18b-4a8b-8269-1a464b18715d", "savedPayload": { "position": { - "x": 37517, - "y": 18841 + "x": 37179.22646004462, + "y": 19252.08799660915 }, "targetPosition": { - "x": 37522, - "y": 18896 + "x": 37433.24371981311, + "y": 19092.478373654547 }, "floatingObject": { "isPinned": false, @@ -17478,7 +17478,7 @@ "Social Personas" ], [ - "Social Persona # 2", + "Social Persona #2", "Social Persona" ] ] @@ -17487,17 +17487,17 @@ { "type": "Signing Account", "name": "P2P Network Node #1", - "config": "{}", + "config": "{\n \"codeName\": \"P2P-Network-Node-1\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0xfec6d4f26fcbcf624bd218f781fea8a8e78e5501fe167e082288a6bed8b10a9b\",\n \"s\": \"0x0c05a17a4eb6636e2895ac164680e89d1618bd7b42a77b2db61b8e942ee6fc3a\",\n \"signature\": \"0xfec6d4f26fcbcf624bd218f781fea8a8e78e5501fe167e082288a6bed8b10a9b0c05a17a4eb6636e2895ac164680e89d1618bd7b42a77b2db61b8e942ee6fc3a1c\"\n }\n}", "project": "Governance", - "id": "9ff2cc32-15e8-4f9d-a285-b6da07790f75", + "id": "c7ffb93c-a17f-4f62-9c32-600f679c6e98", "savedPayload": { "position": { - "x": 37422, - "y": 18819 + "x": 37146.571878077266, + "y": 19180.90492597782 }, "targetPosition": { - "x": 37522, - "y": 18896 + "x": 37433.24371981311, + "y": 19092.478373654547 }, "floatingObject": { "isPinned": false, @@ -17525,7 +17525,7 @@ "P2P Network Nodes" ], [ - "P2P Network Node # 1", + "P2P Network Node #1", "P2P Network Node" ] ] @@ -17534,17 +17534,17 @@ { "type": "Signing Account", "name": "P2P Network Node #2", - "config": "{}", + "config": "{\n \"codeName\": \"P2P-Network-Node-2\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0x48a8f063db1cca44822eed9f69cb55bf2252d6b2f75fc86b4829f2b657f52a98\",\n \"s\": \"0x7de0368fd6620541fa47ea699c2c06e3266bbe7fb0b8d5093dbf5337ec45541e\",\n \"signature\": \"0x48a8f063db1cca44822eed9f69cb55bf2252d6b2f75fc86b4829f2b657f52a987de0368fd6620541fa47ea699c2c06e3266bbe7fb0b8d5093dbf5337ec45541e1c\"\n }\n}", "project": "Governance", - "id": "747ce055-6b6d-4a2e-97af-5337c7adb148", + "id": "2fbcc3a0-26c1-4ebe-b6b5-2ddecf29175b", "savedPayload": { "position": { - "x": 37504, - "y": 18850 + "x": 37133.45350837659, + "y": 19103.695731937445 }, "targetPosition": { - "x": 37522, - "y": 18896 + "x": 37433.24371981311, + "y": 19092.478373654547 }, "floatingObject": { "isPinned": false, @@ -17572,18 +17572,18 @@ "P2P Network Nodes" ], [ - "P2P Network Node # 2", + "P2P Network Node #2", "P2P Network Node" ] ] } } ], - "id": "bc7ad965-9157-4bb9-8f54-861ee630a1f7", + "id": "6a917b82-f14a-49cb-a233-152ac2053b88", "savedPayload": { "position": { - "x": 37522, - "y": 18896 + "x": 37433.24371981311, + "y": 19092.478373654547 }, "targetPosition": { "x": 37500, @@ -17592,7 +17592,7 @@ "floatingObject": { "isPinned": false, "isFrozen": false, - "isCollapsed": false, + "isCollapsed": true, "angleToParent": 1, "distanceToParent": 3, "arrangementStyle": 0 @@ -17616,7 +17616,7 @@ { "type": "Social Trading Desktop App", "name": "Social Trading Desktop App #1", - "config": "{\n \"codeName\": \"Social-Trading-Desktop-App-1\",\n \"host\": \"localhost\",\n \"webPort\": \"34248\",\n \"webSocketsPort\": \"17042\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0xe763104dfe4b223a8ab48cc86374aaf19477c0680f922481c002133b33cc922a\",\n \"s\": \"0x0c48a8362270bd501d25301f85a975482359932e8723ba69b5b98c03f9eaff48\",\n \"signature\": \"0xe763104dfe4b223a8ab48cc86374aaf19477c0680f922481c002133b33cc922a0c48a8362270bd501d25301f85a975482359932e8723ba69b5b98c03f9eaff481b\"\n }\n}", + "config": "{\n \"codeName\": \"Social-Trading-Desktop-App-1\",\n \"host\": \"localhost\",\n \"webPort\": \"34248\",\n \"webSocketsPort\": \"17042\"\n}", "project": "Governance", "id": "33c4f8e9-f8a3-4dea-91f4-1539e3aed0d3", "savedPayload": { @@ -17644,7 +17644,7 @@ { "type": "Social Trading Desktop App", "name": "Social Trading Desktop App #2", - "config": "{\n \"codeName\": \"Social-Trading-Desktop-App-2\",\n \"host\": \"localhost\",\n \"webPort\": \"34248\",\n \"webSocketsPort\": \"17042\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x972eb6dcaeef7d683b96e3a32489a609b41f651f59c51e2e302973f4d2f853c8\",\n \"s\": \"0x51d99acaa415a5af0bcf703158053732aee7d0543c19fdc15dd954cc3af4ff31\",\n \"signature\": \"0x972eb6dcaeef7d683b96e3a32489a609b41f651f59c51e2e302973f4d2f853c851d99acaa415a5af0bcf703158053732aee7d0543c19fdc15dd954cc3af4ff311b\"\n }\n}", + "config": "{\n \"codeName\": \"Social-Trading-Desktop-App-2\",\n \"host\": \"localhost\",\n \"webPort\": \"34248\",\n \"webSocketsPort\": \"17042\"\n}", "project": "Governance", "id": "ad887d5f-998f-48c5-9db7-78e17c66f4e4", "savedPayload": { @@ -17674,7 +17674,7 @@ { "type": "Algo Traders Platform", "name": "Algo Traders Platform #1", - "config": "{\n \"codeName\": \"Algo-Traders-Platform-1\",\n \"host\": \"localhost\",\n \"webPort\": \"34248\",\n \"webSocketsPort\": \"18041\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x06f002a54bc4a806d9a353fb40a1355897923bc9879084f84fef7ffde949fc9d\",\n \"s\": \"0x375244b4d774658e641c2508c470a9751d5ffc44fb5e1f5bbc39fb76d5661cff\",\n \"signature\": \"0x06f002a54bc4a806d9a353fb40a1355897923bc9879084f84fef7ffde949fc9d375244b4d774658e641c2508c470a9751d5ffc44fb5e1f5bbc39fb76d5661cff1b\"\n }\n}", + "config": "{\n \"codeName\": \"Algo-Traders-Platform-1\",\n \"host\": \"localhost\",\n \"webPort\": \"34248\",\n \"webSocketsPort\": \"18041\"\n}", "project": "Governance", "id": "0a06a54b-825b-4ff4-93cc-36465348ad26", "savedPayload": { @@ -17732,7 +17732,7 @@ { "type": "Social Trading Mobile App", "name": "Social Trading Mobile App #1", - "config": "{\n \"codeName\": \"Social-Trading-Mobile-App-1\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"15042\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0x222ade6445cfa7700cdfae78da76bd9b7490b1af64804edd0b4a8919c3ef8b46\",\n \"s\": \"0x52d2352df40e0fb719891e8401be849d24b87a77f2224f5e99a776d8cb504c2b\",\n \"signature\": \"0x222ade6445cfa7700cdfae78da76bd9b7490b1af64804edd0b4a8919c3ef8b4652d2352df40e0fb719891e8401be849d24b87a77f2224f5e99a776d8cb504c2b1c\"\n }\n}", + "config": "{\n \"codeName\": \"Social-Trading-Mobile-App-1\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"15042\"\n}", "project": "Governance", "id": "42843263-b1f3-4e4e-885a-5d8b9d7b647a", "savedPayload": { @@ -17790,7 +17790,7 @@ { "type": "Social Trading Server App", "name": "Social Trading Server App #1", - "config": "{\n \"codeName\": \"Social-Trading-Server-App-1\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"16042\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0xdf5bff3affde17a7496d3820ae13c5f4d11c3a6c380f627d801b845a7a886c67\",\n \"s\": \"0x48f354db3a33cbe36df613ab67d4c1b3e926546e2aad5d13987fea51411dea40\",\n \"signature\": \"0xdf5bff3affde17a7496d3820ae13c5f4d11c3a6c380f627d801b845a7a886c6748f354db3a33cbe36df613ab67d4c1b3e926546e2aad5d13987fea51411dea401b\"\n }\n}", + "config": "{\n \"codeName\": \"Social-Trading-Server-App-1\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"16042\"\n}", "project": "Governance", "id": "0216b143-0e46-4da6-b2cb-e95556fc1bfd", "savedPayload": { @@ -17852,7 +17852,7 @@ "floatingObject": { "isPinned": false, "isFrozen": false, - "isCollapsed": false, + "isCollapsed": true, "angleToParent": 1, "distanceToParent": 3, "arrangementStyle": 0 @@ -17876,7 +17876,7 @@ { "type": "Social Trading Bot", "name": "Social Trading Bot #1", - "config": "{\n \"codeName\": \"Social-Trading-Bot-1\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0xeef6af611301f1edf5e254a98dafa2bab24e4502614b3ebea713eb787dc4d4a1\",\n \"s\": \"0x29b5933f3e756e21d80307399eb0460ecf0ffe4486d5f835942fa5f56b2272a1\",\n \"signature\": \"0xeef6af611301f1edf5e254a98dafa2bab24e4502614b3ebea713eb787dc4d4a129b5933f3e756e21d80307399eb0460ecf0ffe4486d5f835942fa5f56b2272a11b\"\n }\n}", + "config": "{\n \"codeName\": \"Social-Trading-Bot-1\"\n}", "project": "Governance", "socialTradingBotsFollowing": { "type": "Social Trading Bots Following", @@ -18049,7 +18049,7 @@ { "type": "Social Trading Bot", "name": "Social Trading Bot #2", - "config": "{\n \"codeName\": \"Social-Trading-Bot-2\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0xd13c9a57a15c372196ef14328f6f4e2e9fbf1e142acc418462b81049ec51613d\",\n \"s\": \"0x7ef65c98ae4e11b7eb9351c563889b207489ee8d2a0900a22f85dddb9a1f436b\",\n \"signature\": \"0xd13c9a57a15c372196ef14328f6f4e2e9fbf1e142acc418462b81049ec51613d7ef65c98ae4e11b7eb9351c563889b207489ee8d2a0900a22f85dddb9a1f436b1c\"\n }\n}", + "config": "{\n \"codeName\": \"Social-Trading-Bot-2\"\n}", "project": "Governance", "id": "c27748af-db60-44fc-a095-530401057beb", "savedPayload": { @@ -18111,7 +18111,7 @@ "floatingObject": { "isPinned": false, "isFrozen": false, - "isCollapsed": false, + "isCollapsed": true, "angleToParent": 1, "distanceToParent": 3, "arrangementStyle": 0 @@ -18130,7 +18130,7 @@ { "type": "Social Persona", "name": "Social Persona #1", - "config": "{\n \"codeName\": \"Social-Persona-1\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0xe5d7f2a2386182f4126f911c6b9f69a6512b66b8fa3eac9b518093e9c3d2a823\",\n \"s\": \"0x5c828d828f7a4267488c896a87a21c8165708faca57f195eb9a5c6eefba3974d\",\n \"signature\": \"0xe5d7f2a2386182f4126f911c6b9f69a6512b66b8fa3eac9b518093e9c3d2a8235c828d828f7a4267488c896a87a21c8165708faca57f195eb9a5c6eefba3974d1c\"\n }\n}", + "config": "{\n \"codeName\": \"Social-Persona-1\"\n}", "project": "Governance", "socialPersonasFollowing": { "type": "Social Personas Following", @@ -18294,7 +18294,7 @@ { "type": "Social Persona", "name": "Social Persona #2", - "config": "{\n \"socialHandle\": \"\",\n \"bio\": \"\",\n \"codeName\": \"Social-Persona-2\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0xf16fc18bee708ee12d97e04b73c2cadf84a3121d537ceaedc3b2427a784ead90\",\n \"s\": \"0x4a255264df25257c03f3bb59be73adcdb699517b6c5b0341e303b65443f0b5ce\",\n \"signature\": \"0xf16fc18bee708ee12d97e04b73c2cadf84a3121d537ceaedc3b2427a784ead904a255264df25257c03f3bb59be73adcdb699517b6c5b0341e303b65443f0b5ce1b\"\n }\n}", + "config": "{\n \"socialHandle\": \"\",\n \"bio\": \"\",\n \"codeName\": \"Social-Persona-2\"\n}", "project": "Governance", "id": "01c33294-124f-4d68-8619-8e1d1cca7e0a", "savedPayload": { @@ -18333,7 +18333,7 @@ "floatingObject": { "isPinned": false, "isFrozen": false, - "isCollapsed": false, + "isCollapsed": true, "angleToParent": 1, "distanceToParent": 3, "arrangementStyle": 0 @@ -18352,7 +18352,7 @@ { "type": "P2P Network Node", "name": "P2P Network Node #1", - "config": "{\n \"codeName\": \"P2P-Network-Node-1\",\n \"host\": \"localhost\",\n \"webPort\": \"31248\",\n \"webSocketsPort\": \"18042\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x28d201d302bafe36a08c2f96f82fcd4d563a83cd3bc0de2d2565b268ae2deebe\",\n \"s\": \"0x373aa71e0fed2043f5b406f9fcfb81281b6ff8fa037461ec15de19bc05b9bbd6\",\n \"signature\": \"0x28d201d302bafe36a08c2f96f82fcd4d563a83cd3bc0de2d2565b268ae2deebe373aa71e0fed2043f5b406f9fcfb81281b6ff8fa037461ec15de19bc05b9bbd61b\"\n }\n}", + "config": "{\n \"codeName\": \"P2P-Network-Node-1\",\n \"host\": \"localhost\",\n \"webPort\": \"31248\",\n \"webSocketsPort\": \"18042\"\n}", "project": "Governance", "id": "56cc0c90-4a58-4e25-a63f-4f9a6921d0f3", "savedPayload": { @@ -18380,7 +18380,7 @@ { "type": "P2P Network Node", "name": "P2P Network Node #2", - "config": "{\n \"codeName\": \"P2P-Network-Node-2\",\n \"host\": \"localhost\",\n \"webPort\": \"31248\",\n \"webSocketsPort\": \"18042\",\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x5f4429345f40964af3011b78b6d54b033e1f27ba59c463ed0e1babcc87a893d6\",\n \"s\": \"0x1aba92cdbdff8ad079218c05f9a85d6be93f5a76c44d7f04fefbb1a025bfc1dc\",\n \"signature\": \"0x5f4429345f40964af3011b78b6d54b033e1f27ba59c463ed0e1babcc87a893d61aba92cdbdff8ad079218c05f9a85d6be93f5a76c44d7f04fefbb1a025bfc1dc1b\"\n }\n}", + "config": "{\n \"codeName\": \"P2P-Network-Node-2\",\n \"host\": \"localhost\",\n \"webPort\": \"31248\",\n \"webSocketsPort\": \"18042\"\n}", "project": "Governance", "id": "352cd906-c36c-48c7-8f01-728ff78b78e9", "savedPayload": { @@ -18442,7 +18442,7 @@ "floatingObject": { "isPinned": false, "isFrozen": false, - "isCollapsed": true, + "isCollapsed": false, "angleToParent": 1, "distanceToParent": 3, "arrangementStyle": 0 diff --git a/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js b/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js index 8506b3a3d..53f42bb34 100644 --- a/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js +++ b/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js @@ -326,7 +326,8 @@ function newGovernanceFunctionLibraryProfileConstructor() { We store at the User Profile the Signed userProfileHandle */ UI.projects.visualScripting.utilities.nodeConfig.saveConfigProperty(targetNode.payload, 'codeName', codeName) - UI.projects.visualScripting.utilities.nodeConfig.saveConfigProperty(targetNode.payload, 'signature', signature) + UI.projects.visualScripting.utilities.nodeConfig.saveConfigProperty(signingAccount.payload, 'codeName', codeName) + UI.projects.visualScripting.utilities.nodeConfig.saveConfigProperty(signingAccount.payload, 'signature', signature) let secrets = secretsFile.secrets diff --git a/Projects/Network/SA/Modules/UserProfiles.js b/Projects/Network/SA/Modules/UserProfiles.js index e19369639..5292f4127 100644 --- a/Projects/Network/SA/Modules/UserProfiles.js +++ b/Projects/Network/SA/Modules/UserProfiles.js @@ -56,7 +56,7 @@ exports.newNetworkModulesUserProfiles = function newNetworkModulesUserProfiles() SA.projects.network.globals.memory.maps.USER_PROFILES_BY_BLOKCHAIN_ACCOUNT.set(blockchainAccount, userProfile) /* Each User Profile might have Signing Accounts, meaning - accounts that can be signed on behalf of the User Profile. + accounts that can sign on behalf of the User Profile. */ if (userProfilePlugin.signingAccounts !== undefined) { for (let j = 0; j < userProfilePlugin.signingAccounts.signingAccounts.length; j++) { @@ -70,14 +70,15 @@ exports.newNetworkModulesUserProfiles = function newNetworkModulesUserProfiles() If the Signing Account is for a P2P node, we will add the node to the array of available nodes at the p2p network. */ if ( - signingAccount.signingAccountChild.type === "P2P Network Node" && - signingAccount.signingAccountChild.config !== undefined + signingAccount.referenceParent !== undefined && + signingAccount.referenceParent.type === "P2P Network Node" && + signingAccount.referenceParent.config !== undefined ) { let config try { - config = JSON.parse(signingAccount.signingAccountChild.config) + config = JSON.parse(signingAccount.referenceParent.config) } catch (err) { - console.log('P2P Network Node Config not in JSON format. userProfileHandle = ' + userHandle + ' NodeId = ' + signingAccount.signingAccountChild.id) + console.log('P2P Network Node Config not in JSON format. userProfileHandle = ' + userHandle + ' NodeId = ' + signingAccount.referenceParent.id) continue } if (config.host === undefined) { @@ -88,16 +89,17 @@ exports.newNetworkModulesUserProfiles = function newNetworkModulesUserProfiles() } let p2pNetworkNode = SA.projects.network.modules.p2pNetworkNode.newNetworkModulesP2PNetworkNode() - p2pNetworkNode.initialize(signingAccount.signingAccountChild, userProfile, blockchainAccount) + p2pNetworkNode.initialize(signingAccount.referenceParent, userProfile, blockchainAccount) SA.projects.network.globals.memory.arrays.P2P_NETWORK_NODES.push(p2pNetworkNode) } /* Now, we will extract the information from the User Profile, specifically of our identity at the p2p network. */ if ( - signingAccount.signingAccountChild.id === SA.secrets.map.get(nodeCodeName).nodeId + signingAccount.referenceParent !== undefined && + signingAccount.referenceParent.id === SA.secrets.map.get(nodeCodeName).nodeId ) { - p2pNetworkIdentity.node = signingAccount.signingAccountChild + p2pNetworkIdentity.node = signingAccount.referenceParent p2pNetworkIdentity.blockchainAccount = blockchainAccount p2pNetworkIdentity.userProfile = userProfile } From 88c39584196bb2d1306fe6a13eebfa91b8a454e7 Mon Sep 17 00:00:00 2001 From: Alexandru Stefan Date: Wed, 24 Nov 2021 17:59:46 +0200 Subject: [PATCH 13/19] removed code completion for market/exchange objects due to high memory consumption --- .../Foundations/UI/Spaces/CodeEditor-Space/EditorPage.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Projects/Foundations/UI/Spaces/CodeEditor-Space/EditorPage.js b/Projects/Foundations/UI/Spaces/CodeEditor-Space/EditorPage.js index 1580e85e2..6903592ad 100644 --- a/Projects/Foundations/UI/Spaces/CodeEditor-Space/EditorPage.js +++ b/Projects/Foundations/UI/Spaces/CodeEditor-Space/EditorPage.js @@ -346,9 +346,11 @@ function newFoundationsCodeEditorEditorPage() { * We will provide auto-complete only for assets pair found in Markets * Doing so we will avoid providing completion for assets that are not used in a market */ + + //TODO: Disabled on purpose, causes high memory consumption when multiple exchanges are loaded let market = marketPrefix + baseAsset + dot + quotedAsset + dot + chartObj - stringObjects.push(market) - stringObjects.push(exchangePrefix + exchangeName + dot + market) + // stringObjects.push(market) + // stringObjects.push(exchangePrefix + exchangeName + dot + market) }) }) }) From e31699a3a499097980bee698b7f9ff885f2f4257 Mon Sep 17 00:00:00 2001 From: Alexandru Stefan Date: Wed, 24 Nov 2021 18:03:23 +0200 Subject: [PATCH 14/19] removed the entire loop for market/exchange completion objects --- .../Foundations/UI/Spaces/CodeEditor-Space/EditorPage.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Projects/Foundations/UI/Spaces/CodeEditor-Space/EditorPage.js b/Projects/Foundations/UI/Spaces/CodeEditor-Space/EditorPage.js index 6903592ad..c73040b9d 100644 --- a/Projects/Foundations/UI/Spaces/CodeEditor-Space/EditorPage.js +++ b/Projects/Foundations/UI/Spaces/CodeEditor-Space/EditorPage.js @@ -332,7 +332,7 @@ function newFoundationsCodeEditorEditorPage() { }) // Enrich chart data with market and exchange structure - UI.projects.foundations.spaces.designSpace.workspace.workspaceNode.rootNodes.forEach(node => { +/* UI.projects.foundations.spaces.designSpace.workspace.workspaceNode.rootNodes.forEach(node => { if (node.type === 'Crypto Ecosystem') { node.cryptoExchanges.forEach(cxs => { cxs.exchanges.forEach(exchange => { @@ -342,10 +342,10 @@ function newFoundationsCodeEditorEditorPage() { let baseAsset = marketPair.split('/')[0] let quotedAsset = marketPair.split('/')[1] stringObjects.forEach(chartObj => { - /** + /!** * We will provide auto-complete only for assets pair found in Markets * Doing so we will avoid providing completion for assets that are not used in a market - */ + *!/ //TODO: Disabled on purpose, causes high memory consumption when multiple exchanges are loaded let market = marketPrefix + baseAsset + dot + quotedAsset + dot + chartObj @@ -356,7 +356,7 @@ function newFoundationsCodeEditorEditorPage() { }) }) } - }) + })*/ //Actually building the objects for chart, market and exchange, no need for multiple objects, as one is enough for the autocomplete to work stringObjects.forEach(stringRepresentation => { From 541a269f8073fc1aedeb8a8f8146a0a20211786b Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 24 Nov 2021 19:41:10 +0100 Subject: [PATCH 15/19] Network Node Running Again --- .../Low-Frequency-Trading/Snapshots.js | 2 +- .../Low-Frequency-Trading/TradingEngine.js | 6 +- .../Low-Frequency-Trading/TradingOutput.js | 2 +- .../Low-Frequency-Trading/TradingRecords.js | 2 +- .../TradingSimulation.js | 4 +- .../Low-Frequency-Trading/TradingSystem.js | 2 +- .../API-Data-Fetcher-Bot/FetchingProcess.js | 2 +- .../Indicator-Bot/IndicatorOutput.js | 8 +- .../Indicator-Bot/MultiTimeFrameDaily.js | 2 +- .../Indicator-Bot/MultiTimeFrameMarket.js | 2 +- Projects/Foundations/SA/Globals/Schemas.js | 8 + .../DataDependenciesFunctions.js | 6 +- .../FromOneMinToMultiTimeFrameFunctions.js | 2 +- .../ProcessFilesFunctions.js | 2 +- .../SingleMarketFunctions.js | 12 +- .../Foundations/TS/Globals/TaskConstants.js | 1 - .../TS/Process-Modules/DataDependencies.js | 4 +- .../Foundations/TS/Process-Modules/Dataset.js | 2 +- .../TS/Process-Modules/ProcessOutput.js | 24 +- .../Low-Frequency-Learning/LearningEngine.js | 6 +- .../Low-Frequency-Learning/LearningOutput.js | 2 +- .../Low-Frequency-Learning/LearningRecords.js | 2 +- .../LearningSimulation.js | 4 +- .../Low-Frequency-Learning/LearningSystem.js | 2 +- Projects/Network/SA/Modules/UserProfiles.js | 219 ++++++++++++------ Projects/ProjectsSchema.json | 8 +- .../{TS => SA}/Utilities/NodeFunctions.js | 10 +- TaskServer/TaskServer.js | 4 +- 28 files changed, 220 insertions(+), 130 deletions(-) create mode 100644 Projects/Foundations/SA/Globals/Schemas.js rename Projects/Visual-Scripting/{TS => SA}/Utilities/NodeFunctions.js (93%) diff --git a/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/Snapshots.js b/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/Snapshots.js index a0c7e9de4..db324af90 100644 --- a/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/Snapshots.js +++ b/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/Snapshots.js @@ -150,7 +150,7 @@ exports.newAlgorithmicTradingBotModulesSnapshots = function(processIndex) { } /* Now we go down through all this node children */ - let schemaDocument = TS.projects.foundations.globals.taskConstants.APP_SCHEMA_MAP.get(node.project + '-' + node.type) + let schemaDocument = SA.projects.foundations.globals.schemas.APP_SCHEMA_MAP.get(node.project + '-' + node.type) if (schemaDocument === undefined) { return } if (schemaDocument.childrenNodesProperties !== undefined) { diff --git a/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingEngine.js b/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingEngine.js index ff2312b66..59f511acc 100644 --- a/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingEngine.js +++ b/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingEngine.js @@ -112,7 +112,7 @@ exports.newAlgorithmicTradingBotModulesTradingEngine = function (processIndex) { destinationNode.value = originNode.value /* Now we go down through all the children of the origin node, assuming the destination node has the same children structure*/ - let schemaDocument = TS.projects.foundations.globals.taskConstants.APP_SCHEMA_MAP.get(originNode.project + '-' + originNode.type) + let schemaDocument = SA.projects.foundations.globals.schemas.APP_SCHEMA_MAP.get(originNode.project + '-' + originNode.type) if (schemaDocument === undefined) { return } if (schemaDocument.childrenNodesProperties !== undefined) { @@ -151,7 +151,7 @@ exports.newAlgorithmicTradingBotModulesTradingEngine = function (processIndex) { nodesMap.set(node.id, node) /* Now we go down through all this node children */ - let schemaDocument = TS.projects.foundations.globals.taskConstants.APP_SCHEMA_MAP.get(node.project + '-' + node.type) + let schemaDocument = SA.projects.foundations.globals.schemas.APP_SCHEMA_MAP.get(node.project + '-' + node.type) if (schemaDocument === undefined) { return } if (schemaDocument.childrenNodesProperties !== undefined) { @@ -194,7 +194,7 @@ exports.newAlgorithmicTradingBotModulesTradingEngine = function (processIndex) { } /* Now we go down through all this node children */ - let schemaDocument = TS.projects.foundations.globals.taskConstants.APP_SCHEMA_MAP.get(node.project + '-' + node.type) + let schemaDocument = SA.projects.foundations.globals.schemas.APP_SCHEMA_MAP.get(node.project + '-' + node.type) if (schemaDocument === undefined) { return } if (schemaDocument.childrenNodesProperties !== undefined) { diff --git a/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingOutput.js b/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingOutput.js index 115f3d9b0..71628a8c0 100644 --- a/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingOutput.js +++ b/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingOutput.js @@ -31,7 +31,7 @@ exports.newAlgorithmicTradingBotModulesTradingOutput = function (processIndex) { /* Preparing everything for the Simulation */ let tradingSimulationModuleObject = TS.projects.algorithmicTrading.botModules.tradingSimulation.newAlgorithmicTradingBotModulesTradingSimulation(processIndex) - let outputDatasets = TS.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processOutput, 'Output Dataset') + let outputDatasets = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processOutput, 'Output Dataset') let outputDatasetsMap = new Map() await TS.projects.foundations.functionLibraries.outputManagementFunctions.readFiles( diff --git a/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingRecords.js b/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingRecords.js index 8c8e4877c..fed2368bc 100644 --- a/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingRecords.js +++ b/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingRecords.js @@ -37,7 +37,7 @@ exports.newAlgorithmicTradingBotModulesTradingRecords = function (processIndex) we have a pointer to the node that have the information we need to extract. Later, based on the product record definition we will extract each individual value. */ - let outputDatasets = TS.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processOutput, 'Output Dataset') + let outputDatasets = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processOutput, 'Output Dataset') for (let i = 0; i < outputDatasets.length; i++) { let outputDatasetNode = outputDatasets[i] diff --git a/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingSimulation.js b/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingSimulation.js index 837fdcd0c..83e4c1a30 100644 --- a/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingSimulation.js +++ b/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingSimulation.js @@ -372,8 +372,8 @@ exports.newAlgorithmicTradingBotModulesTradingSimulation = function (processInde } function positionChart(chart) { - let dataDependencies = TS.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processDependencies, 'Data Dependency') - dataDependencies = TS.projects.visualScripting.utilities.nodeFunctions.filterOutNodeWihtoutReferenceParentFromNodeArray(dataDependencies) + let dataDependencies = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processDependencies, 'Data Dependency') + dataDependencies = SA.projects.visualScripting.utilities.nodeFunctions.filterOutNodeWihtoutReferenceParentFromNodeArray(dataDependencies) /* Finding the Current Element on Daily Files */ if (TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_PROCESSING_DAILY_FILES) { diff --git a/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingSystem.js b/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingSystem.js index c451d7d02..606af9450 100644 --- a/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingSystem.js +++ b/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingSystem.js @@ -272,7 +272,7 @@ exports.newAlgorithmicTradingBotModulesTradingSystem = function (processIndex) { } /* Now we go down through all this node children */ - let schemaDocument = TS.projects.foundations.globals.taskConstants.APP_SCHEMA_MAP.get(node.project + '-' + node.type) + let schemaDocument = SA.projects.foundations.globals.schemas.APP_SCHEMA_MAP.get(node.project + '-' + node.type) if (schemaDocument === undefined) { return } if (schemaDocument.childrenNodesProperties !== undefined) { diff --git a/Projects/Data-Mining/TS/Bot-Modules/API-Data-Fetcher-Bot/FetchingProcess.js b/Projects/Data-Mining/TS/Bot-Modules/API-Data-Fetcher-Bot/FetchingProcess.js index 13d8bb576..0489a27fe 100644 --- a/Projects/Data-Mining/TS/Bot-Modules/API-Data-Fetcher-Bot/FetchingProcess.js +++ b/Projects/Data-Mining/TS/Bot-Modules/API-Data-Fetcher-Bot/FetchingProcess.js @@ -201,7 +201,7 @@ exports.newDataMiningBotModulesFetchingProcess = function (processIndex) { if (recordProperty.apiResponseFieldReference !== undefined) { if (recordProperty.apiResponseFieldReference.referenceParent !== undefined) { let apiResponseField = recordProperty.apiResponseFieldReference.referenceParent - let endpointNodeFound = TS.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(apiResponseField, 'API Endpoint') + let endpointNodeFound = SA.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(apiResponseField, 'API Endpoint') /* Every Record Property with an apiResponseFieldReference must be on the path to a certain endpoint. diff --git a/Projects/Data-Mining/TS/Bot-Modules/Indicator-Bot/IndicatorOutput.js b/Projects/Data-Mining/TS/Bot-Modules/Indicator-Bot/IndicatorOutput.js index 6e93538bd..a24c8b723 100644 --- a/Projects/Data-Mining/TS/Bot-Modules/Indicator-Bot/IndicatorOutput.js +++ b/Projects/Data-Mining/TS/Bot-Modules/Indicator-Bot/IndicatorOutput.js @@ -52,13 +52,13 @@ } /* The first phase here is about checking that we have everything we need at the definition level. */ - let dataDependencies = TS.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray( + let dataDependencies = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray( TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processDependencies, 'Data Dependency' ) if (TS.projects.foundations.functionLibraries.singleMarketFunctions.validateDataDependencies(processIndex, dataDependencies, callBackFunction) !== true) { return } - let outputDatasets = TS.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray( + let outputDatasets = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray( TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processOutput, 'Output Dataset' ) if (TS.projects.foundations.functionLibraries.singleMarketFunctions.validateOutputDatasets(processIndex, outputDatasets, callBackFunction) !== true) { return } @@ -138,9 +138,9 @@ contextSummary.dataset = outputDatasetNode.referenceParent.config.codeName contextSummary.product = outputDatasetNode.referenceParent.parentNode.config.codeName - let botNode = TS.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDatasetNode, 'Indicator Bot') + let botNode = SA.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDatasetNode, 'Indicator Bot') contextSummary.bot = botNode.config.codeName - let dataMineNode = TS.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDatasetNode, 'Data Mine') + let dataMineNode = SA.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDatasetNode, 'Data Mine') contextSummary.dataMine = dataMineNode.config.codeName contextSummary.mineType = dataMineNode.type.replace(' ', '-') contextSummary.project = dataMineNode.project diff --git a/Projects/Data-Mining/TS/Bot-Modules/Indicator-Bot/MultiTimeFrameDaily.js b/Projects/Data-Mining/TS/Bot-Modules/Indicator-Bot/MultiTimeFrameDaily.js index f0b3d0d0f..207f3ff2f 100644 --- a/Projects/Data-Mining/TS/Bot-Modules/Indicator-Bot/MultiTimeFrameDaily.js +++ b/Projects/Data-Mining/TS/Bot-Modules/Indicator-Bot/MultiTimeFrameDaily.js @@ -513,7 +513,7 @@ } function writeDataRanges(callBack) { - let outputDatasets = TS.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray( + let outputDatasets = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray( TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processOutput, 'Output Dataset') let outputDatasetIndex = -1; controlLoop() diff --git a/Projects/Data-Mining/TS/Bot-Modules/Indicator-Bot/MultiTimeFrameMarket.js b/Projects/Data-Mining/TS/Bot-Modules/Indicator-Bot/MultiTimeFrameMarket.js index 9fb933475..254a43563 100644 --- a/Projects/Data-Mining/TS/Bot-Modules/Indicator-Bot/MultiTimeFrameMarket.js +++ b/Projects/Data-Mining/TS/Bot-Modules/Indicator-Bot/MultiTimeFrameMarket.js @@ -151,7 +151,7 @@ function writeTimeFramesFiles(callBack) { let outputDatasets = - TS.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processOutput, 'Output Dataset') + SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processOutput, 'Output Dataset') let outputDatasetIndex = -1; controlLoop() diff --git a/Projects/Foundations/SA/Globals/Schemas.js b/Projects/Foundations/SA/Globals/Schemas.js new file mode 100644 index 000000000..6fb91b966 --- /dev/null +++ b/Projects/Foundations/SA/Globals/Schemas.js @@ -0,0 +1,8 @@ +exports.newFoundationsGlobalsSchemas = function () { + + let thisObject = { + APP_SCHEMA_MAP: new Map() + } + + return thisObject +} \ No newline at end of file diff --git a/Projects/Foundations/TS/Function-Libraries/DataDependenciesFunctions.js b/Projects/Foundations/TS/Function-Libraries/DataDependenciesFunctions.js index 41b6192a4..7ac10f433 100644 --- a/Projects/Foundations/TS/Function-Libraries/DataDependenciesFunctions.js +++ b/Projects/Foundations/TS/Function-Libraries/DataDependenciesFunctions.js @@ -375,14 +375,14 @@ exports.newFoundationsFunctionLibrariesDataDependenciesFunctions = function () { THe first thing we do is to build an array of all the declared dependencies of the Bot Process. */ - let dataDependencies = TS.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processDependencies, 'Data Dependency') + let dataDependencies = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processDependencies, 'Data Dependency') /* Then we will filter out declared dependencies that are not referencing nodes currently present at the workspace. This will allow the user to have less Data Mines loaded at the workspace that the ones that a the Bot process depends on. */ - dataDependencies = TS.projects.visualScripting.utilities.nodeFunctions.filterOutNodeWihtoutReferenceParentFromNodeArray(dataDependencies) + dataDependencies = SA.projects.visualScripting.utilities.nodeFunctions.filterOutNodeWihtoutReferenceParentFromNodeArray(dataDependencies) /* We will run some validations to prevent starting the process if all needed config and nodes are not present. @@ -394,7 +394,7 @@ exports.newFoundationsFunctionLibrariesDataDependenciesFunctions = function () { we do it just to be able to validate that all nodes and config are ok before letting this process run too far. */ - let outputDatasets = TS.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processOutput, 'Output Dataset') + let outputDatasets = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processOutput, 'Output Dataset') /* Here we check that all output datasets configs are ok. */ diff --git a/Projects/Foundations/TS/Function-Libraries/FromOneMinToMultiTimeFrameFunctions.js b/Projects/Foundations/TS/Function-Libraries/FromOneMinToMultiTimeFrameFunctions.js index 8ed254b7d..1713b694a 100644 --- a/Projects/Foundations/TS/Function-Libraries/FromOneMinToMultiTimeFrameFunctions.js +++ b/Projects/Foundations/TS/Function-Libraries/FromOneMinToMultiTimeFrameFunctions.js @@ -48,7 +48,7 @@ exports.newFoundationsFunctionLibrariesFromOneMinToMultiTimeFrameFunctions = fun node.dataDependency = dataDependenciesModule.curatedDependencyNodeArray[0] } - let outputDatasets = TS.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray( + let outputDatasets = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray( TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processOutput, 'Output Dataset' ) diff --git a/Projects/Foundations/TS/Function-Libraries/ProcessFilesFunctions.js b/Projects/Foundations/TS/Function-Libraries/ProcessFilesFunctions.js index 81dfc978d..8fdc4e16c 100644 --- a/Projects/Foundations/TS/Function-Libraries/ProcessFilesFunctions.js +++ b/Projects/Foundations/TS/Function-Libraries/ProcessFilesFunctions.js @@ -123,7 +123,7 @@ exports.newFoundationsFunctionLibrariesProcessFilesFunctions = function () { async function writeProcessFiles(processIndex, contextVariables, currentTimeFrame, processDate, statusDependencies) { let fileStorage = TS.projects.foundations.taskModules.fileStorage.newFileStorage(processIndex) - let outputDatasets = TS.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processOutput, 'Output Dataset') + let outputDatasets = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processOutput, 'Output Dataset') await writeTimeFramesFiles() await writeDataRanges() diff --git a/Projects/Foundations/TS/Function-Libraries/SingleMarketFunctions.js b/Projects/Foundations/TS/Function-Libraries/SingleMarketFunctions.js index 11dc25fbf..fa73c9078 100644 --- a/Projects/Foundations/TS/Function-Libraries/SingleMarketFunctions.js +++ b/Projects/Foundations/TS/Function-Libraries/SingleMarketFunctions.js @@ -91,12 +91,12 @@ return } - let botNode = TS.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDatasetNode, 'Indicator Bot') + let botNode = SA.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDatasetNode, 'Indicator Bot') if (botNode === undefined) { - botNode = TS.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDatasetNode, 'Trading Bot') + botNode = SA.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDatasetNode, 'Trading Bot') } if (botNode === undefined) { - botNode = TS.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDatasetNode, 'Learning Bot') + botNode = SA.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDatasetNode, 'Learning Bot') } if (botNode === undefined) { TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, "[ERROR] start -> Product Definition not attached to a Bot. "); @@ -110,11 +110,11 @@ return } - let dataMineNode = TS.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDatasetNode, 'Data Mine') + let dataMineNode = SA.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDatasetNode, 'Data Mine') if (dataMineNode === undefined) { - let tradingMineNode = TS.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDatasetNode, 'Trading Mine') + let tradingMineNode = SA.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDatasetNode, 'Trading Mine') if (tradingMineNode === undefined) { - let learningMineNode = TS.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDatasetNode, 'Learning Mine') + let learningMineNode = SA.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDatasetNode, 'Learning Mine') if (learningMineNode === undefined) { TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, "[ERROR] start -> Bot not attached to a Data Mine, Trading Mine or Learning Mine."); callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_FAIL_RESPONSE); diff --git a/Projects/Foundations/TS/Globals/TaskConstants.js b/Projects/Foundations/TS/Globals/TaskConstants.js index 114787146..a3c8e5cc9 100644 --- a/Projects/Foundations/TS/Globals/TaskConstants.js +++ b/Projects/Foundations/TS/Globals/TaskConstants.js @@ -8,7 +8,6 @@ exports.newFoundationsGlobalsTaskConstants = function () { NETWORK_NODE: undefined, PROJECT_DEFINITION_NODE: undefined, PROJECTS_SCHEMA: undefined, - APP_SCHEMA_MAP: new Map(), EVENT_SERVER_CLIENT_MODULE_OBJECT: undefined, // This is an instance of the Event Server Client pointing to the localhost server TASK_HEARTBEAT_INTERVAL_HANDLER: undefined } diff --git a/Projects/Foundations/TS/Process-Modules/DataDependencies.js b/Projects/Foundations/TS/Process-Modules/DataDependencies.js index 72e77dc56..62df1f3cc 100644 --- a/Projects/Foundations/TS/Process-Modules/DataDependencies.js +++ b/Projects/Foundations/TS/Process-Modules/DataDependencies.js @@ -50,7 +50,7 @@ /* First we will get all the data dependencies of the bot, as defined at the Trading Mine. */ - thisObject.curatedDependencyNodeArray = TS.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processDependencies, 'Data Dependency') + thisObject.curatedDependencyNodeArray = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processDependencies, 'Data Dependency') if (thisObject.curatedDependencyNodeArray.length === 0) { TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, "[ERROR] initialize -> onInitilized -> It is not possible to not have data dependencies at all.") callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_FAIL_RESPONSE) @@ -61,7 +61,7 @@ This will allow the user to have less Data Mines loaded at the workspace that the ones that a Trading Mine depends on. */ - thisObject.curatedDependencyNodeArray = TS.projects.visualScripting.utilities.nodeFunctions.filterOutNodeWihtoutReferenceParentFromNodeArray(thisObject.curatedDependencyNodeArray) + thisObject.curatedDependencyNodeArray = SA.projects.visualScripting.utilities.nodeFunctions.filterOutNodeWihtoutReferenceParentFromNodeArray(thisObject.curatedDependencyNodeArray) } else { TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, "[ERROR] initialize -> onInitilized -> It is not possible not to have process dependencies, which means not data dependencies.") diff --git a/Projects/Foundations/TS/Process-Modules/Dataset.js b/Projects/Foundations/TS/Process-Modules/Dataset.js index 685777744..74c76193a 100644 --- a/Projects/Foundations/TS/Process-Modules/Dataset.js +++ b/Projects/Foundations/TS/Process-Modules/Dataset.js @@ -222,7 +222,7 @@ exports.newFoundationsProcessModulesDataset = function (processIndex) { function scanNodeMesh(startingNode) { if (startingNode === undefined) { return } - let schemaDocument = TS.projects.foundations.globals.taskConstants.APP_SCHEMA_MAP.get(startingNode.project + '-' + startingNode.type) + let schemaDocument = SA.projects.foundations.globals.schemas.APP_SCHEMA_MAP.get(startingNode.project + '-' + startingNode.type) if (schemaDocument === undefined) { return } if (startingNode.id === productDefinition.id) { diff --git a/Projects/Foundations/TS/Process-Modules/ProcessOutput.js b/Projects/Foundations/TS/Process-Modules/ProcessOutput.js index 876af534d..c76eee859 100644 --- a/Projects/Foundations/TS/Process-Modules/ProcessOutput.js +++ b/Projects/Foundations/TS/Process-Modules/ProcessOutput.js @@ -18,23 +18,23 @@ /* We will raise the events for the datasets impacted by the process that just finished. */ if (TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processOutput !== undefined) { - let outputDatasets = TS.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processOutput, 'Output Dataset') + let outputDatasets = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processOutput, 'Output Dataset') for (let j = 0; j < outputDatasets.length; j++) { let outputDataset = outputDatasets[j] - let botNode = TS.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDataset, 'Indicator Bot') + let botNode = SA.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDataset, 'Indicator Bot') if (botNode === undefined) { - botNode = TS.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDataset, 'Trading Bot') + botNode = SA.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDataset, 'Trading Bot') } if (botNode === undefined) { - botNode = TS.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDataset, 'Sensor Bot') + botNode = SA.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDataset, 'Sensor Bot') } if (botNode === undefined) { - botNode = TS.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDataset, 'API Data Fetcher Bot') + botNode = SA.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDataset, 'API Data Fetcher Bot') } if (botNode === undefined) { - botNode = TS.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDataset, 'Learning Bot') + botNode = SA.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDataset, 'Learning Bot') } /* Some validations to verify that everything is in place. */ @@ -112,23 +112,23 @@ function asyncRaiseEvents(lastFile, timeFrames) { if (TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processOutput !== undefined) { - let outputDatasets = TS.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processOutput, 'Output Dataset') + let outputDatasets = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processOutput, 'Output Dataset') for (let j = 0; j < outputDatasets.length; j++) { let outputDataset = outputDatasets[j] - let botNode = TS.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDataset, 'Indicator Bot') + let botNode = SA.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDataset, 'Indicator Bot') if (botNode === undefined) { - botNode = TS.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDataset, 'Trading Bot') + botNode = SA.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDataset, 'Trading Bot') } if (botNode === undefined) { - botNode = TS.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDataset, 'Sensor Bot') + botNode = SA.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDataset, 'Sensor Bot') } if (botNode === undefined) { - botNode = TS.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDataset, 'API Data Fetcher Bot') + botNode = SA.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDataset, 'API Data Fetcher Bot') } if (botNode === undefined) { - botNode = TS.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDataset, 'Learning Bot') + botNode = SA.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(outputDataset, 'Learning Bot') } /* Some validations to verify that everything is in place. */ diff --git a/Projects/Machine-Learning/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningEngine.js b/Projects/Machine-Learning/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningEngine.js index b82a4c8af..0d4d2c691 100644 --- a/Projects/Machine-Learning/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningEngine.js +++ b/Projects/Machine-Learning/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningEngine.js @@ -111,7 +111,7 @@ exports.newMachineLearningBotModulesLearningEngine = function (processIndex) { destinationNode.value = originNode.value /* Now we go down through all the children of the origin node, assuming the destination node has the same children structure*/ - let schemaDocument = TS.projects.foundations.globals.taskConstants.APP_SCHEMA_MAP.get(originNode.project + '-' + originNode.type) + let schemaDocument = SA.projects.foundations.globals.schemas.APP_SCHEMA_MAP.get(originNode.project + '-' + originNode.type) if (schemaDocument === undefined) { return } if (schemaDocument.childrenNodesProperties !== undefined) { @@ -150,7 +150,7 @@ exports.newMachineLearningBotModulesLearningEngine = function (processIndex) { nodesMap.set(node.id, node) /* Now we go down through all this node children */ - let schemaDocument = TS.projects.foundations.globals.taskConstants.APP_SCHEMA_MAP.get(node.project + '-' + node.type) + let schemaDocument = SA.projects.foundations.globals.schemas.APP_SCHEMA_MAP.get(node.project + '-' + node.type) if (schemaDocument === undefined) { return } if (schemaDocument.childrenNodesProperties !== undefined) { @@ -193,7 +193,7 @@ exports.newMachineLearningBotModulesLearningEngine = function (processIndex) { } /* Now we go down through all this node children */ - let schemaDocument = TS.projects.foundations.globals.taskConstants.APP_SCHEMA_MAP.get(node.project + '-' + node.type) + let schemaDocument = SA.projects.foundations.globals.schemas.APP_SCHEMA_MAP.get(node.project + '-' + node.type) if (schemaDocument === undefined) { return } if (schemaDocument.childrenNodesProperties !== undefined) { diff --git a/Projects/Machine-Learning/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningOutput.js b/Projects/Machine-Learning/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningOutput.js index a553ead09..ddae66359 100644 --- a/Projects/Machine-Learning/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningOutput.js +++ b/Projects/Machine-Learning/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningOutput.js @@ -31,7 +31,7 @@ exports.newMachineLearningBotModulesLearningOutput = function (processIndex) { /* Preparing everything for the Simulation */ let learningSimulationModuleObject = TS.projects.machineLearning.botModules.learningSimulation.newMachineLearningBotModulesLearningSimulation(processIndex) - let outputDatasets = TS.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processOutput, 'Output Dataset') + let outputDatasets = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processOutput, 'Output Dataset') let outputDatasetsMap = new Map() await TS.projects.foundations.functionLibraries.outputManagementFunctions.readFiles( diff --git a/Projects/Machine-Learning/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningRecords.js b/Projects/Machine-Learning/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningRecords.js index c7fdbd726..f0d9eb1ed 100644 --- a/Projects/Machine-Learning/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningRecords.js +++ b/Projects/Machine-Learning/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningRecords.js @@ -37,7 +37,7 @@ exports.newMachineLearningBotModulesLearningRecords = function (processIndex) { we have a pointer to the node that have the information we need to extract. Later, based on the product record definition we will extract each individual value. */ - let outputDatasets = TS.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processOutput, 'Output Dataset') + let outputDatasets = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processOutput, 'Output Dataset') for (let i = 0; i < outputDatasets.length; i++) { let outputDatasetNode = outputDatasets[i] diff --git a/Projects/Machine-Learning/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningSimulation.js b/Projects/Machine-Learning/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningSimulation.js index 4ae1809e7..a3e6b2cc6 100644 --- a/Projects/Machine-Learning/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningSimulation.js +++ b/Projects/Machine-Learning/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningSimulation.js @@ -381,8 +381,8 @@ exports.newMachineLearningBotModulesLearningSimulation = function (processIndex) } function positionChart(chart) { - let dataDependencies = TS.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processDependencies, 'Data Dependency') - dataDependencies = TS.projects.visualScripting.utilities.nodeFunctions.filterOutNodeWihtoutReferenceParentFromNodeArray(dataDependencies) + let dataDependencies = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processDependencies, 'Data Dependency') + dataDependencies = SA.projects.visualScripting.utilities.nodeFunctions.filterOutNodeWihtoutReferenceParentFromNodeArray(dataDependencies) /* Finding the Current Element on Market Files */ if (TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_PROCESSING_DAILY_FILES) { diff --git a/Projects/Machine-Learning/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningSystem.js b/Projects/Machine-Learning/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningSystem.js index 32c3539f6..d7c0a8939 100644 --- a/Projects/Machine-Learning/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningSystem.js +++ b/Projects/Machine-Learning/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningSystem.js @@ -292,7 +292,7 @@ exports.newMachineLearningBotModulesLearningSystem = function (processIndex) { } /* Now we go down through all this node children */ - let schemaDocument = TS.projects.foundations.globals.taskConstants.APP_SCHEMA_MAP.get(node.project + '-' + node.type) + let schemaDocument = SA.projects.foundations.globals.schemas.APP_SCHEMA_MAP.get(node.project + '-' + node.type) if (schemaDocument === undefined) { return } if (schemaDocument.childrenNodesProperties !== undefined) { diff --git a/Projects/Network/SA/Modules/UserProfiles.js b/Projects/Network/SA/Modules/UserProfiles.js index 5292f4127..4f2b55195 100644 --- a/Projects/Network/SA/Modules/UserProfiles.js +++ b/Projects/Network/SA/Modules/UserProfiles.js @@ -20,88 +20,161 @@ exports.newNetworkModulesUserProfiles = function newNetworkModulesUserProfiles() async function initialize(nodeCodeName, p2pNetworkIdentity) { - let pluginFileNames = await SA.projects.communityPlugins.utilities.plugins.getPluginFileNames( - 'Governance', - 'User-Profiles' - ) + await loadAppSchemas() + await loadProfiles() - for (let i = 0; i < pluginFileNames.length; i++) { - let pluginFileName = pluginFileNames[i] + async function loadAppSchemas() { - let pluginFileContent = await SA.projects.communityPlugins.utilities.plugins.getPluginFileContent( - 'Governance', - 'User-Profiles', - pluginFileName - ) + let promise = new Promise((resolve, reject) => { - let userProfilePlugin = JSON.parse(pluginFileContent) - let config = JSON.parse(userProfilePlugin.config) - let signatureObject = config.signature - let web3 = new SA.nodeModules.web3() - let blockchainAccount = web3.eth.accounts.recover(signatureObject) - let ranking = 0 // TODO: read the blockchain balance and transactions from the Treasury Account to calculate the profile ranking. - let userProfileId = userProfilePlugin.id - let userHandle = config.signature.message + let project = 'Governance' + let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Schemas/' + let folder = 'App-Schema' - let userProfile = SA.projects.socialTrading.modules.socialGraphUserProfile.newSocialTradingModulesSocialGraphUserProfile() - userProfile.initialize( - userProfileId, - userHandle, - blockchainAccount, - ranking - ) + SA.projects.foundations.utilities.filesAndDirectories.getAllFilesInDirectoryAndSubdirectories(filePath + folder, onFilesReady) - SA.projects.network.globals.memory.maps.USER_PROFILES_BY_ID.set(userProfileId, userProfile) - SA.projects.network.globals.memory.maps.USER_PROFILES_BY_HANDLE.set(userHandle, userProfile) - SA.projects.network.globals.memory.maps.USER_PROFILES_BY_BLOKCHAIN_ACCOUNT.set(blockchainAccount, userProfile) - /* - Each User Profile might have Signing Accounts, meaning - accounts that can sign on behalf of the User Profile. - */ - if (userProfilePlugin.signingAccounts !== undefined) { - for (let j = 0; j < userProfilePlugin.signingAccounts.signingAccounts.length; j++) { - let signingAccount = userProfilePlugin.signingAccounts.signingAccounts[j] - let config = JSON.parse(signingAccount.config) - let signatureObject = config.signature - let web3 = new SA.nodeModules.web3() - let blockchainAccount = web3.eth.accounts.recover(signatureObject) - SA.projects.network.globals.memory.maps.USER_PROFILES_BY_BLOKCHAIN_ACCOUNT.set(blockchainAccount, userProfile) - /* - If the Signing Account is for a P2P node, we will add the node to the array of available nodes at the p2p network. - */ - if ( - signingAccount.referenceParent !== undefined && - signingAccount.referenceParent.type === "P2P Network Node" && - signingAccount.referenceParent.config !== undefined - ) { - let config + function onFilesReady(files) { + + for (let k = 0; k < files.length; k++) { + let name = files[k] + let nameSplitted = name.split(folder) + let fileName = nameSplitted[1] + for (let i = 0; i < 10; i++) { + fileName = fileName.replace('\\', '/') + } + let fileToRead = filePath + folder + fileName + + let fileContent = SA.nodeModules.fs.readFileSync(fileToRead) + let schemaDocument try { - config = JSON.parse(signingAccount.referenceParent.config) + schemaDocument = JSON.parse(fileContent) + SA.projects.foundations.globals.schemas.APP_SCHEMA_MAP.set(project + '-' + schemaDocument.type, schemaDocument) } catch (err) { - console.log('P2P Network Node Config not in JSON format. userProfileHandle = ' + userHandle + ' NodeId = ' + signingAccount.referenceParent.id) - continue + console.log('[WARN] loadAppSchemas -> Error Parsing JSON File: ' + fileToRead + '. Error = ' + err.stack) + return } - if (config.host === undefined) { - continue - } - if (config.webSocketsPort === undefined) { - continue - } - - let p2pNetworkNode = SA.projects.network.modules.p2pNetworkNode.newNetworkModulesP2PNetworkNode() - p2pNetworkNode.initialize(signingAccount.referenceParent, userProfile, blockchainAccount) - SA.projects.network.globals.memory.arrays.P2P_NETWORK_NODES.push(p2pNetworkNode) } - /* - Now, we will extract the information from the User Profile, specifically of our identity at the p2p network. - */ - if ( - signingAccount.referenceParent !== undefined && - signingAccount.referenceParent.id === SA.secrets.map.get(nodeCodeName).nodeId - ) { - p2pNetworkIdentity.node = signingAccount.referenceParent - p2pNetworkIdentity.blockchainAccount = blockchainAccount - p2pNetworkIdentity.userProfile = userProfile + resolve() + } + } + ) + return promise + } + + async function loadProfiles() { + + let pluginFileNames = await SA.projects.communityPlugins.utilities.plugins.getPluginFileNames( + 'Governance', + 'User-Profiles' + ) + + for (let i = 0; i < pluginFileNames.length; i++) { + let pluginFileName = pluginFileNames[i] + + let pluginFileContent = await SA.projects.communityPlugins.utilities.plugins.getPluginFileContent( + 'Governance', + 'User-Profiles', + pluginFileName + ) + + let userProfilePlugin = JSON.parse(pluginFileContent) + let config = JSON.parse(userProfilePlugin.config) + let signatureObject = config.signature + let web3 = new SA.nodeModules.web3() + let blockchainAccount = web3.eth.accounts.recover(signatureObject) + let ranking = 0 // TODO: read the blockchain balance and transactions from the Treasury Account to calculate the profile ranking. + let userProfileId = userProfilePlugin.id + let userHandle = config.signature.message + + let userProfile = SA.projects.socialTrading.modules.socialGraphUserProfile.newSocialTradingModulesSocialGraphUserProfile() + userProfile.initialize( + userProfileId, + userHandle, + blockchainAccount, + ranking + ) + + SA.projects.network.globals.memory.maps.USER_PROFILES_BY_ID.set(userProfileId, userProfile) + SA.projects.network.globals.memory.maps.USER_PROFILES_BY_HANDLE.set(userHandle, userProfile) + SA.projects.network.globals.memory.maps.USER_PROFILES_BY_BLOKCHAIN_ACCOUNT.set(blockchainAccount, userProfile) + /* + Each User Profile might have Signing Accounts, meaning + accounts that can sign on behalf of the User Profile. + */ + if (userProfilePlugin.signingAccounts !== undefined) { + + let algoTradersPlatform = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(userProfilePlugin.userApps, 'Algo Traders Platform') + let socialTradingDesktopApp = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(userProfilePlugin.userApps, 'Social Trading Desktop App') + let socialTradingMobileApp = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(userProfilePlugin.userApps, 'Social Trading Mobile App') + let socialTradingServerApp = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(userProfilePlugin.userApps, 'Social Trading Server App') + let socialTradingBots = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(userProfilePlugin.userBots, 'Social Trading Bot') + let socialPersonas = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(userProfilePlugin.socialPersonas, 'Social Persona') + let p2pNetworkNodes = SA.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(userProfilePlugin.p2pNetworkNodes, 'P2P Network Node') + + let networkClientsMap = new Map() + + addToNetworkClientMap(algoTradersPlatform, 'Algo Traders Platform') + addToNetworkClientMap(socialTradingDesktopApp, 'Social Trading Desktop App') + addToNetworkClientMap(socialTradingMobileApp, 'Social Trading Mobile App') + addToNetworkClientMap(socialTradingServerApp, 'Social Trading Server App') + addToNetworkClientMap(socialTradingBots, 'Social Trading Bot') + addToNetworkClientMap(socialPersonas, 'Social Persona') + addToNetworkClientMap(p2pNetworkNodes, 'P2P Network Node') + + function addToNetworkClientMap(nodeArray) { + for (let i = 0; i < nodeArray.length; i++) { + let currentNode = nodeArray[i] + networkClientsMap.set(currentNode.id, currentNode) + } + } + + for (let j = 0; j < userProfilePlugin.signingAccounts.signingAccounts.length; j++) { + let signingAccount = userProfilePlugin.signingAccounts.signingAccounts[j] + let config = JSON.parse(signingAccount.config) + let signatureObject = config.signature + let web3 = new SA.nodeModules.web3() + let blockchainAccount = web3.eth.accounts.recover(signatureObject) + SA.projects.network.globals.memory.maps.USER_PROFILES_BY_BLOKCHAIN_ACCOUNT.set(blockchainAccount, userProfile) + /* + If the Signing Account is for a P2P node, we will add the node to the array of available nodes at the p2p network. + */ + if (signingAccount.savedPayload === undefined) { continue } + if (signingAccount.savedPayload.referenceParent === undefined) { continue } + signingAccount.referenceParent = networkClientsMap.get(signingAccount.savedPayload.referenceParent.id) + if ( + signingAccount.referenceParent !== undefined && + signingAccount.referenceParent.type === "P2P Network Node" && + signingAccount.referenceParent.config !== undefined + ) { + let config + try { + config = JSON.parse(signingAccount.referenceParent.config) + } catch (err) { + console.log('P2P Network Node Config not in JSON format. userProfileHandle = ' + userHandle + ' NodeId = ' + signingAccount.referenceParent.id) + continue + } + if (config.host === undefined) { + continue + } + if (config.webSocketsPort === undefined) { + continue + } + + let p2pNetworkNode = SA.projects.network.modules.p2pNetworkNode.newNetworkModulesP2PNetworkNode() + p2pNetworkNode.initialize(signingAccount.referenceParent, userProfile, blockchainAccount) + SA.projects.network.globals.memory.arrays.P2P_NETWORK_NODES.push(p2pNetworkNode) + } + /* + Now, we will extract the information from the User Profile, specifically of our identity at the p2p network. + */ + if ( + signingAccount.referenceParent !== undefined && + signingAccount.referenceParent.id === SA.secrets.map.get(nodeCodeName).nodeId + ) { + p2pNetworkIdentity.node = signingAccount.referenceParent + p2pNetworkIdentity.blockchainAccount = blockchainAccount + p2pNetworkIdentity.userProfile = userProfile + } } } } diff --git a/Projects/ProjectsSchema.json b/Projects/ProjectsSchema.json index 95127a643..0d393a901 100644 --- a/Projects/ProjectsSchema.json +++ b/Projects/ProjectsSchema.json @@ -329,7 +329,7 @@ } ] }, - "TS": { + "SA": { "utilities": [ { "name": "Node Functions", @@ -795,6 +795,12 @@ "propertyName": "timeConstants", "functionName": "newFoundationsGlobalsTimeConstants", "fileName": "TimeConstants.js" + }, + { + "name": "Schemas", + "propertyName": "schemas", + "functionName": "newFoundationsGlobalsSchemas", + "fileName": "Schemas.js" } ], "utilities": [ diff --git a/Projects/Visual-Scripting/TS/Utilities/NodeFunctions.js b/Projects/Visual-Scripting/SA/Utilities/NodeFunctions.js similarity index 93% rename from Projects/Visual-Scripting/TS/Utilities/NodeFunctions.js rename to Projects/Visual-Scripting/SA/Utilities/NodeFunctions.js index 0d87560ab..f5d457e1a 100644 --- a/Projects/Visual-Scripting/TS/Utilities/NodeFunctions.js +++ b/Projects/Visual-Scripting/SA/Utilities/NodeFunctions.js @@ -16,7 +16,11 @@ exports.newVisualScriptingUtilitiesNodeFunctions = function () { return resultArray function scanNodeBranch(startingNode) { - let schemaDocument = TS.projects.foundations.globals.taskConstants.APP_SCHEMA_MAP.get(startingNode.project + '-' + startingNode.type) + if (startingNode === undefined) { + return + } + + let schemaDocument = SA.projects.foundations.globals.schemas.APP_SCHEMA_MAP.get(startingNode.project + '-' + startingNode.type) if (schemaDocument === undefined) { return } if (startingNode.type === nodeType) { @@ -60,7 +64,7 @@ exports.newVisualScriptingUtilitiesNodeFunctions = function () { if (startingNode === undefined) { return } if (nodeFound !== undefined) { return } - let schemaDocument = TS.projects.foundations.globals.taskConstants.APP_SCHEMA_MAP.get(startingNode.project + '-' + startingNode.type) + let schemaDocument = SA.projects.foundations.globals.schemas.APP_SCHEMA_MAP.get(startingNode.project + '-' + startingNode.type) if (schemaDocument === undefined) { return } if (startingNode.type === nodeType) { @@ -114,7 +118,7 @@ exports.newVisualScriptingUtilitiesNodeFunctions = function () { function scanNodeMesh(startingNode) { if (startingNode === undefined) { return } - let schemaDocument = TS.projects.foundations.globals.taskConstants.APP_SCHEMA_MAP.get(startingNode.project + '-' + startingNode.type) + let schemaDocument = SA.projects.foundations.globals.schemas.APP_SCHEMA_MAP.get(startingNode.project + '-' + startingNode.type) if (schemaDocument === undefined) { return } if (startingNode.id === nodeId) { diff --git a/TaskServer/TaskServer.js b/TaskServer/TaskServer.js index c9e327ed6..463058c99 100644 --- a/TaskServer/TaskServer.js +++ b/TaskServer/TaskServer.js @@ -76,7 +76,7 @@ exports.newTaskServer = function newTaskServer() { for (let j = 0; j < project.schema.length; j++) { let schemaDocument = project.schema[j] let key = project.name + '-' + schemaDocument.type - TS.projects.foundations.globals.taskConstants.APP_SCHEMA_MAP.set(key, schemaDocument) + SA.projects.foundations.globals.schemas.APP_SCHEMA_MAP.set(key, schemaDocument) } } } @@ -88,7 +88,7 @@ exports.newTaskServer = function newTaskServer() { setupTaskHeartbeats() function initializeProjectDefinitionNode() { - TS.projects.foundations.globals.taskConstants.PROJECT_DEFINITION_NODE = TS.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(TS.projects.foundations.globals.taskConstants.TASK_NODE, 'Project Definition') + TS.projects.foundations.globals.taskConstants.PROJECT_DEFINITION_NODE = SA.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(TS.projects.foundations.globals.taskConstants.TASK_NODE, 'Project Definition') if (TS.projects.foundations.globals.taskConstants.PROJECT_DEFINITION_NODE === undefined) { console.log("[ERROR] Task Server -> Task -> bootingProcess -> Project Definition not found. ") TS.projects.foundations.globals.taskVariables.FATAL_ERROR_MESSAGE = 'Project Definition not found. Fatal Error, can not continue. Fix the problem and try again.' From eea548eeca78ae38dfaabaf85eece77b8ba8e7f9 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 24 Nov 2021 20:24:02 +0100 Subject: [PATCH 16/19] Desktop Running Again --- .../Plugins/User-Profiles/Luis-Fernando-Molina.json | 6 +++--- .../Schemas/App-Schema/social-trading-desktop-app.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json b/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json index ec81052fb..a66be7be8 100644 --- a/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json +++ b/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json @@ -17616,7 +17616,7 @@ { "type": "Social Trading Desktop App", "name": "Social Trading Desktop App #1", - "config": "{\n \"codeName\": \"Social-Trading-Desktop-App-1\",\n \"host\": \"localhost\",\n \"webPort\": \"34248\",\n \"webSocketsPort\": \"17042\"\n}", + "config": "{\n \"codeName\": \"Social-Trading-Desktop-App-1\",\n \"host\": \"localhost\",\n \"webPort\": \"33248\",\n \"webSocketsPort\": \"17042\"\n}", "project": "Governance", "id": "33c4f8e9-f8a3-4dea-91f4-1539e3aed0d3", "savedPayload": { @@ -17644,7 +17644,7 @@ { "type": "Social Trading Desktop App", "name": "Social Trading Desktop App #2", - "config": "{\n \"codeName\": \"Social-Trading-Desktop-App-2\",\n \"host\": \"localhost\",\n \"webPort\": \"34248\",\n \"webSocketsPort\": \"17042\"\n}", + "config": "{\n \"codeName\": \"Social-Trading-Desktop-App-2\",\n \"host\": \"localhost\",\n \"webPort\": \"33248\",\n \"webSocketsPort\": \"17042\"\n}", "project": "Governance", "id": "ad887d5f-998f-48c5-9db7-78e17c66f4e4", "savedPayload": { @@ -17852,7 +17852,7 @@ "floatingObject": { "isPinned": false, "isFrozen": false, - "isCollapsed": true, + "isCollapsed": false, "angleToParent": 1, "distanceToParent": 3, "arrangementStyle": 0 diff --git a/Projects/Governance/Schemas/App-Schema/social-trading-desktop-app.json b/Projects/Governance/Schemas/App-Schema/social-trading-desktop-app.json index 8859ed259..89f6174d3 100644 --- a/Projects/Governance/Schemas/App-Schema/social-trading-desktop-app.json +++ b/Projects/Governance/Schemas/App-Schema/social-trading-desktop-app.json @@ -25,7 +25,7 @@ "config": true }, "initialValues": { - "config": "{ \n\"codeName\": \"localhost\", \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"17042\"\n}" + "config": "{ \n\"codeName\": \"localhost\", \n\"host\": \"localhost\", \n\"webPort\": \"33248\", \n\"webSocketsPort\": \"17042\"\n}" }, "addLeftIcons": true, "level": 1, From 9ea7cfeb2ce909b19179ab089c0360f968282ff0 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 24 Nov 2021 20:37:45 +0100 Subject: [PATCH 17/19] Bug Fixes --- .../Schemas/App-Schema/social-personas-following.json | 2 +- .../Schemas/App-Schema/social-trading-bots-following.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Projects/Governance/Schemas/App-Schema/social-personas-following.json b/Projects/Governance/Schemas/App-Schema/social-personas-following.json index 73184792c..23f435b7a 100644 --- a/Projects/Governance/Schemas/App-Schema/social-personas-following.json +++ b/Projects/Governance/Schemas/App-Schema/social-personas-following.json @@ -38,7 +38,7 @@ "attachingRules": { "compatibleTypes": "->Social Persona->" }, - "propertyNameAtParent": "following", + "propertyNameAtParent": "socialPersonasFollowing", "childrenNodesProperties": [ { "name": "socialPersonasFollowed", diff --git a/Projects/Governance/Schemas/App-Schema/social-trading-bots-following.json b/Projects/Governance/Schemas/App-Schema/social-trading-bots-following.json index 53b370894..a1ed3798e 100644 --- a/Projects/Governance/Schemas/App-Schema/social-trading-bots-following.json +++ b/Projects/Governance/Schemas/App-Schema/social-trading-bots-following.json @@ -38,7 +38,7 @@ "attachingRules": { "compatibleTypes": "->Social Trading Bot->" }, - "propertyNameAtParent": "following", + "propertyNameAtParent": "socialTradingBotsFollowing", "childrenNodesProperties": [ { "name": "socialTradingBotsFollowed", From cfe8511ca12a1e43b5297046065a031030b32ed5 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 24 Nov 2021 20:47:01 +0100 Subject: [PATCH 18/19] DeepScan fixes --- Platform/Client/httpInterface.js | 2 +- .../UI/Function-Libraries/ProfileConstructor.js | 4 ++-- Projects/Network/SA/Modules/UserProfiles.js | 14 +++++++------- .../Visual-Scripting/SA/Utilities/NodeFunctions.js | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Platform/Client/httpInterface.js b/Platform/Client/httpInterface.js index 1ed5e2a88..565afded3 100644 --- a/Platform/Client/httpInterface.js +++ b/Platform/Client/httpInterface.js @@ -360,7 +360,7 @@ exports.newHttpInterface = function newHttpInterface() { } } } - + break case 'Docs': { switch (requestPath[2]) { // switch by command case 'Save-Node-Schema': { diff --git a/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js b/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js index 53f42bb34..ae3f8fe1c 100644 --- a/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js +++ b/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js @@ -265,10 +265,10 @@ function newGovernanceFunctionLibraryProfileConstructor() { console.log('Call to WEB3 Server failed. ' + response.error) return } - signSigningAccountData(response.address, response.privateKey) + signSigningAccountData(response.privateKey) } - function signSigningAccountData(address, privateKey) { + function signSigningAccountData(privateKey) { let request = { url: 'WEB3', diff --git a/Projects/Network/SA/Modules/UserProfiles.js b/Projects/Network/SA/Modules/UserProfiles.js index 4f2b55195..6a1a8aef3 100644 --- a/Projects/Network/SA/Modules/UserProfiles.js +++ b/Projects/Network/SA/Modules/UserProfiles.js @@ -113,13 +113,13 @@ exports.newNetworkModulesUserProfiles = function newNetworkModulesUserProfiles() let networkClientsMap = new Map() - addToNetworkClientMap(algoTradersPlatform, 'Algo Traders Platform') - addToNetworkClientMap(socialTradingDesktopApp, 'Social Trading Desktop App') - addToNetworkClientMap(socialTradingMobileApp, 'Social Trading Mobile App') - addToNetworkClientMap(socialTradingServerApp, 'Social Trading Server App') - addToNetworkClientMap(socialTradingBots, 'Social Trading Bot') - addToNetworkClientMap(socialPersonas, 'Social Persona') - addToNetworkClientMap(p2pNetworkNodes, 'P2P Network Node') + addToNetworkClientMap(algoTradersPlatform) + addToNetworkClientMap(socialTradingDesktopApp) + addToNetworkClientMap(socialTradingMobileApp) + addToNetworkClientMap(socialTradingServerApp) + addToNetworkClientMap(socialTradingBots) + addToNetworkClientMap(socialPersonas) + addToNetworkClientMap(p2pNetworkNodes) function addToNetworkClientMap(nodeArray) { for (let i = 0; i < nodeArray.length; i++) { diff --git a/Projects/Visual-Scripting/SA/Utilities/NodeFunctions.js b/Projects/Visual-Scripting/SA/Utilities/NodeFunctions.js index f5d457e1a..228796ab5 100644 --- a/Projects/Visual-Scripting/SA/Utilities/NodeFunctions.js +++ b/Projects/Visual-Scripting/SA/Utilities/NodeFunctions.js @@ -19,7 +19,7 @@ exports.newVisualScriptingUtilitiesNodeFunctions = function () { if (startingNode === undefined) { return } - + let schemaDocument = SA.projects.foundations.globals.schemas.APP_SCHEMA_MAP.get(startingNode.project + '-' + startingNode.type) if (schemaDocument === undefined) { return } @@ -57,7 +57,7 @@ exports.newVisualScriptingUtilitiesNodeFunctions = function () { returns the first instance found. */ let nodeFound - scanNodeMesh(node, nodeType) + scanNodeMesh(node) return nodeFound function scanNodeMesh(startingNode) { From 21dff1472fef130ad5ad7c26f56d57e7e533f4c6 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 24 Nov 2021 20:49:14 +0100 Subject: [PATCH 19/19] DeepScan fixes2 --- Projects/Visual-Scripting/SA/Utilities/NodeFunctions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Projects/Visual-Scripting/SA/Utilities/NodeFunctions.js b/Projects/Visual-Scripting/SA/Utilities/NodeFunctions.js index 228796ab5..ccd994763 100644 --- a/Projects/Visual-Scripting/SA/Utilities/NodeFunctions.js +++ b/Projects/Visual-Scripting/SA/Utilities/NodeFunctions.js @@ -12,7 +12,7 @@ exports.newVisualScriptingUtilitiesNodeFunctions = function () { function nodeBranchToArray(node, nodeType) { let resultArray = [] - scanNodeBranch(node, nodeType) + scanNodeBranch(node) return resultArray function scanNodeBranch(startingNode) {