Merge pull request #2514 from Luis-Fernando-Molina/develop
Contribution: Network Project: Selecting a Node of the P2P network to connect to, implemented.
This commit is contained in:
14 files changed
+390
-622
No files matched your search
+26
-103
@@ -1,126 +1,49 @@
|
||||
exports.newDesktopApp = function newDesktopApp() {
|
||||
|
||||
let thisObject = {
|
||||
socialGraph: undefined,
|
||||
p2pMetwork: undefined,
|
||||
webSocketsClient: undefined,
|
||||
webSocketsInterface: undefined,
|
||||
run: run
|
||||
}
|
||||
|
||||
DK.desktopApp = thisObject
|
||||
|
||||
return thisObject
|
||||
|
||||
async function run() {
|
||||
/*
|
||||
Here we will store our running objects:
|
||||
*/
|
||||
DK.running = {}
|
||||
/*
|
||||
This is the Personal Social Graph for the user running this App.
|
||||
*/
|
||||
DK.running.socialGraph = DK.projects.socialTrading.modules.socialGraph.newSocialTradingModulesSocialGraph()
|
||||
await DK.running.socialGraph.initialize()
|
||||
thisObject.socialGraph = DK.projects.socialTrading.modules.socialGraph.newSocialTradingModulesSocialGraph()
|
||||
await thisObject.socialGraph.initialize()
|
||||
/*
|
||||
We can join now the P2P Network as a client app.
|
||||
*/
|
||||
thisObject.p2pMetwork = SA.projects.network.modules.p2pNetwork.newNetworkModulesP2PNetwork()
|
||||
await thisObject.p2pMetwork.initialize('Network Client')
|
||||
/*
|
||||
Here we will pick a Network Node from all users profiles available that do have a Network Node running.
|
||||
*/
|
||||
let selectedNetworkNode = thisObject.p2pMetwork.p2pNodesToConnect[0]
|
||||
/*
|
||||
This is the Web Sockets client that interacts with the Superalgos Network.
|
||||
*/
|
||||
DK.running.webSocketsClient = SA.projects.network.modules.webSocketsAppClient.newNetworkModulesWebSocketsAppClient()
|
||||
await DK.running.webSocketsClient.initialize()
|
||||
thisObject.webSocketsClient = SA.projects.network.modules.webSocketsNetworkClient.newNetworkModulesWebSocketsNetworkClient()
|
||||
await thisObject.webSocketsClient.initialize('Network Client', selectedNetworkNode)
|
||||
console.log('Desktop Client Connected to Network Node via Web Sockets ................... Connected to port ' + global.env.NETWORK_WEB_SOCKETS_INTERFACE_PORT)
|
||||
|
||||
/* These are the Network Interfaces by which the Web App interacts with this Desktop Client.*/
|
||||
|
||||
DK.running.webSocketsInterface = DK.projects.socialTrading.modules.webSocketsInterface.newDesktopModulesWebSocketsInterface()
|
||||
DK.running.webSocketsInterface.initialize()
|
||||
/*
|
||||
These are the Network Interfaces by which the Web App interacts with this Desktop Client.
|
||||
*/
|
||||
thisObject.webSocketsInterface = DK.projects.socialTrading.modules.webSocketsInterface.newDesktopModulesWebSocketsInterface()
|
||||
thisObject.webSocketsInterface.initialize()
|
||||
console.log('Desktop Client Web Sockets Interface ....................................... Listening at port ' + global.env.DESKTOP_WEB_SOCKETS_INTERFACE_PORT)
|
||||
|
||||
|
||||
DK.running.httpInterface = DK.projects.socialTrading.modules.httpInterface.newDesktopModulesHttpInterface()
|
||||
DK.running.httpInterface.initialize()
|
||||
thisObject.httpInterface = DK.projects.socialTrading.modules.httpInterface.newDesktopModulesHttpInterface()
|
||||
thisObject.httpInterface.initialize()
|
||||
console.log('Desktop Client Http Interface .............................................. Listening at port ' + global.env.DESKTOP_HTTP_INTERFACE_PORT)
|
||||
|
||||
return
|
||||
|
||||
let queryMessage
|
||||
let query
|
||||
/*
|
||||
Test Query User Profiles.
|
||||
*/
|
||||
queryMessage = {
|
||||
queryType: SA.projects.socialTrading.globals.queryTypes.USER_PROFILES,
|
||||
emitterUserProfileId: SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileId,
|
||||
initialIndex: 'Last',
|
||||
amountRequested: 10,
|
||||
direction: 'Past'
|
||||
}
|
||||
|
||||
query = {
|
||||
requestType: 'Query',
|
||||
queryMessage: JSON.stringify(queryMessage)
|
||||
}
|
||||
|
||||
await DK.webSocketsClient.sendMessage(
|
||||
JSON.stringify(query)
|
||||
)
|
||||
.then(showProfiles)
|
||||
.catch(onError)
|
||||
|
||||
async function showProfiles(profiles) {
|
||||
console.log(profiles)
|
||||
|
||||
for (let i = 0; i < profiles.length; i++) {
|
||||
let profile = profiles[i]
|
||||
|
||||
/*
|
||||
Test Following Profiles.
|
||||
*/
|
||||
let eventMessage = {
|
||||
eventId: SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId(),
|
||||
eventType: SA.projects.socialTrading.globals.eventTypes.FOLLOW_USER_PROFILE,
|
||||
emitterUserProfileId: SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileId,
|
||||
targetUserProfileId: profile.userProfileId
|
||||
}
|
||||
|
||||
let event = {
|
||||
requestType: 'Event',
|
||||
eventMessage: JSON.stringify(eventMessage)
|
||||
}
|
||||
|
||||
await DK.webSocketsClient.sendMessage(
|
||||
JSON.stringify(event)
|
||||
)
|
||||
.then(followAdded)
|
||||
.catch(onError)
|
||||
|
||||
function followAdded() {
|
||||
console.log("User Profile " + profile.userProfileHandle + " followed.")
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
Test Query User Profile Stats.
|
||||
*/
|
||||
queryMessage = {
|
||||
queryType: SA.projects.socialTrading.globals.queryTypes.USER_PROFILE_STATS,
|
||||
emitterUserProfileId: SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileId,
|
||||
targetUserProfileId: SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileId
|
||||
}
|
||||
|
||||
query = {
|
||||
requestType: 'Query',
|
||||
queryMessage: JSON.stringify(queryMessage)
|
||||
}
|
||||
|
||||
await DK.webSocketsClient.sendMessage(
|
||||
JSON.stringify(query)
|
||||
)
|
||||
.then(showProfilesStats)
|
||||
.catch(onError)
|
||||
|
||||
function showProfilesStats(profile) {
|
||||
console.log(profile)
|
||||
}
|
||||
|
||||
/*
|
||||
Error Handling
|
||||
*/
|
||||
function onError(errorMessage) {
|
||||
console.log('[ERROR] Query not executed. ' + errorMessage)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@ exports.newNetworkNode = function newNetworkNode() {
|
||||
let thisObject = {
|
||||
socialGraphService: undefined,
|
||||
storage: undefined,
|
||||
p2pMetwork: undefined,
|
||||
run: run
|
||||
}
|
||||
|
||||
@@ -24,5 +25,10 @@ exports.newNetworkNode = function newNetworkNode() {
|
||||
*/
|
||||
thisObject.storage = NT.projects.socialTrading.modules.storage.newSocialTradingModulesStorage()
|
||||
thisObject.storage.initialize()
|
||||
/*
|
||||
We can join now the P2P Network as a new peer there.
|
||||
*/
|
||||
thisObject.p2pMetwork = SA.projects.network.modules.p2pNetwork.newNetworkModulesP2PNetwork()
|
||||
await thisObject.p2pMetwork.initialize('Network Peer')
|
||||
}
|
||||
}
|
||||
+2
-1
@@ -1,4 +1,4 @@
|
||||
function newEducationFunctionLibraryDocsStats() {
|
||||
function newEducationFunctionLibraryDocsStatisticsFunctions() {
|
||||
let thisObject = {
|
||||
printDocsStats: printDocsStats
|
||||
}
|
||||
@@ -23,6 +23,7 @@ function newEducationFunctionLibraryDocsStats() {
|
||||
for (let i = 0; i < UI.projects.education.spaces.docsSpace.searchEngine.docsIndex.length; i++) {
|
||||
documentPage = UI.projects.education.spaces.docsSpace.searchEngine.docsIndex[i]
|
||||
pagesCount += 1
|
||||
let lastValue
|
||||
if (projectStats[documentPage.project] !== undefined) {
|
||||
lastValue = projectStats[documentPage.project]
|
||||
}
|
||||
@@ -127,12 +127,12 @@
|
||||
"id": "f4d39b02-4324-438d-9f74-2bea2b7272ef",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 4797.826086956522,
|
||||
"y": 23340.192378864667
|
||||
"x": 33783.333333333336,
|
||||
"y": 18540.192378864667
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 4647.826086956522,
|
||||
"y": 23600
|
||||
"x": 33633.333333333336,
|
||||
"y": 18800
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -516,12 +516,12 @@
|
||||
"id": "b6e3c87d-a11b-4b2a-b6a6-edc96375f5da",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 4907.633708091854,
|
||||
"y": 23450
|
||||
"x": 33893.14095446867,
|
||||
"y": 18650
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 4647.826086956522,
|
||||
"y": 23600
|
||||
"x": 33633.333333333336,
|
||||
"y": 18800
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -565,12 +565,12 @@
|
||||
"id": "2571cea1-2b6d-40f5-9331-8786bf57c184",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 5575.05716950933,
|
||||
"y": 23082.57653858252
|
||||
"x": 34560.56441588615,
|
||||
"y": 18282.57653858252
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 5497.411455978574,
|
||||
"y": 23372.354286469243
|
||||
"x": 34482.91870235539,
|
||||
"y": 18572.354286469243
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -614,7 +614,7 @@
|
||||
"positionClaimVotes": [
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "Tentacule23 Project Contributor Smidy13 Tentacule23 Governance Project",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "ab341408-2073-46aa-9390-2396bdebf79b",
|
||||
@@ -685,7 +685,7 @@
|
||||
},
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "Tentacule23 1 Project Contributor Tentacle23 Visual Scripting Project",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "ac17837f-37f5-4c27-a1c4-c667afb5153c",
|
||||
@@ -859,7 +859,7 @@
|
||||
"positionClaimVotes": [
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "NAmorim Team Creator Nuno Distribution Team",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "db023ba8-610f-44d8-a72d-62ea45610ef0",
|
||||
@@ -930,7 +930,7 @@
|
||||
},
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "NAmorim Team Member Superalgos Blog Team",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "d584524b-e869-4ab1-92cc-5778e98220e2",
|
||||
@@ -1159,7 +1159,7 @@
|
||||
"positionClaimVotes": [
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "alexandrustefan Team Creator Alexandru Forum Team",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "122bea90-803d-4d2b-9af0-46197571b24d",
|
||||
@@ -1300,7 +1300,7 @@
|
||||
"positionClaimVotes": [
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "alexandrustefan 3 Project Contributors Alexandru cozed-gh(Carl) Quantum8 PLuv Data Mining Project",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "bf243dfe-b8f5-4d74-83a1-c54ec50fe5b9",
|
||||
@@ -1507,7 +1507,7 @@
|
||||
"positionClaimVotes": [
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "harrellbm Project Leader Harrell harrellbm Education Project",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "e481a337-45e6-4107-8c0b-14f9d5210fe6",
|
||||
@@ -1666,7 +1666,7 @@
|
||||
"positionClaimVotes": [
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "harrellbm Team Creator Harrell harrellbm Docs Teams",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "610fcdec-93ef-4451-a037-f3d4249a2a9e",
|
||||
@@ -1831,7 +1831,7 @@
|
||||
"positionClaimVotes": [
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "harrellbm Team Creator Harrell harrellbm Tutorials Team",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "3d923532-2d84-457e-875b-ed0ad9bcd2f6",
|
||||
@@ -1996,7 +1996,7 @@
|
||||
"positionClaimVotes": [
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "harrellbm Team Creator Harrell harrellbm Translations Team",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "4320a3b2-a698-426c-af85-fdb9e7e772df",
|
||||
@@ -2161,7 +2161,7 @@
|
||||
"positionClaimVotes": [
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "harrellbm Team Creator Harrell harrellbm Workspaces Team",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "faa321ab-73a1-434d-bbec-f6d648d0b7a9",
|
||||
@@ -2396,7 +2396,7 @@
|
||||
"positionClaimVotes": [
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "harrellbm Team Creator Harrell harrellbm Setup Team",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "58fb3da1-002b-4574-8155-4949dc269b9b",
|
||||
@@ -2549,7 +2549,7 @@
|
||||
"positionClaimVotes": [
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "harrellbm Team Member Superalgos Blog Team",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "333f1c9a-1d3f-43f6-95af-7f8bacc4fb28",
|
||||
@@ -2784,7 +2784,7 @@
|
||||
"positionClaimVotes": [
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "ssplatt Project Leader Brett Ssplatt Social Bots Project",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "5d6f2c60-849d-4d5e-b697-a1cbe47dccc7",
|
||||
@@ -3119,7 +3119,7 @@
|
||||
"positionClaimVotes": [
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "ssplatt Team Member Twitter Team",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "36950249-4ad4-4f09-9580-7988cb60f1a1",
|
||||
@@ -3296,7 +3296,7 @@
|
||||
"positionClaimVotes": [
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "ssplatt Team Leader Brett Reddit Team",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "0228c2bf-557e-4512-87b9-36318e534b4c",
|
||||
@@ -3555,7 +3555,7 @@
|
||||
"positionClaimVotes": [
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "ssplatt Team Creator Brett Brett Live Streaming and Videos Team",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "9ffbaebf-d903-4985-b009-4e8f854e9606",
|
||||
@@ -3644,7 +3644,7 @@
|
||||
},
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "ssplatt Team Leader Brett Live Streaming and Videos Team",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "12cf50a8-2f36-4068-a771-d8eb04a9270d",
|
||||
@@ -3733,7 +3733,7 @@
|
||||
},
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "ssplatt Team Member Brett Live Streaming and Videos Team",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "3ecebb3b-c21b-4141-baed-2ce0d03cf3b2",
|
||||
@@ -4062,7 +4062,7 @@
|
||||
"positionClaimVotes": [
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "ssplatt Team Creator Brett Sys Admins Team",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "96e4d32a-4e19-489b-82b9-f55ae19e4c21",
|
||||
@@ -4227,7 +4227,7 @@
|
||||
"positionClaimVotes": [
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "ssplatt Team Creator Brett Docker Team",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "816e142a-a1e1-4a6a-8520-5fd143448a5b",
|
||||
@@ -4392,7 +4392,7 @@
|
||||
"positionClaimVotes": [
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "ssplatt Team Leader Brett Github Team",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "5f54dfe8-51af-4356-92a3-f6cb3de62736",
|
||||
@@ -4691,7 +4691,7 @@
|
||||
"positionClaimVotes": [
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "Smidy13 Team Member Icons Team",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "9c58e925-9027-4e87-bb74-d48fb1bc6640",
|
||||
@@ -4762,7 +4762,7 @@
|
||||
},
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "Smidy13 Project Contributor Smidy13 Tentacule23 Governance Project",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "42afa59d-a9a1-4bac-8ff0-d005a97ee3a1",
|
||||
@@ -4972,7 +4972,7 @@
|
||||
"positionClaimVotes": [
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "Raplh2502 Team Member Superalgos Blog Team",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "3fee7769-885c-47e3-b091-436499e09d3e",
|
||||
@@ -5043,7 +5043,7 @@
|
||||
},
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "Raplh2502 ",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "26d27773-1c71-4363-a6b2-446d3d4e7495",
|
||||
@@ -5114,7 +5114,7 @@
|
||||
},
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "Raplh2502 Project Leader Thomas-Raplh2502 Data Mining Project",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "5fee6b1e-3fe5-409b-806c-ecb1fa0cf7e2",
|
||||
@@ -5185,7 +5185,7 @@
|
||||
},
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "Raplh2502 1 Team Member Thomas-Raplh2502 Forum Team",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "1267b7f2-aed2-4d4f-a69e-29ca5ad50a9f",
|
||||
@@ -5326,7 +5326,7 @@
|
||||
"positionClaimVotes": [
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "cozed-gh 3 Project Contributors Alexandru cozed-gh(Carl) Quantum8 PLuv Data Mining Project",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "758285b2-8324-41f0-907a-3c45ad86fada",
|
||||
@@ -5462,7 +5462,7 @@
|
||||
"positionClaimVotes": [
|
||||
{
|
||||
"type": "Position Claim Vote",
|
||||
"name": "PLuv 3 Project Contributors Alexandru cozed-gh(Carl) Quantum8 PLuv Data Mining Project",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "b30458ee-4426-42db-a066-20755146ba49",
|
||||
@@ -5592,12 +5592,12 @@
|
||||
"id": "75487f1d-1ec0-4431-8693-ce9653018e81",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 5757.219077113906,
|
||||
"y": 23222.354286469243
|
||||
"x": 34742.72632349072,
|
||||
"y": 18422.354286469243
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 5497.411455978574,
|
||||
"y": 23372.354286469243
|
||||
"x": 34482.91870235539,
|
||||
"y": 18572.354286469243
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -7689,12 +7689,12 @@
|
||||
"id": "800e3388-1ea6-40ee-ace5-1811a3373e39",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 5982.87542724873,
|
||||
"y": 23222.608483056363
|
||||
"x": 34968.38267362554,
|
||||
"y": 18422.608483056363
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 5787.189203865294,
|
||||
"y": 23450
|
||||
"x": 34772.69645024211,
|
||||
"y": 18650
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -14945,12 +14945,12 @@
|
||||
"id": "aa848510-1260-46ed-a855-6c0fb9dca9eb",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 6062.157880626287,
|
||||
"y": 23330.032392704077
|
||||
"x": 35047.66512700311,
|
||||
"y": 18530.032392704077
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 5787.189203865294,
|
||||
"y": 23450
|
||||
"x": 34772.69645024211,
|
||||
"y": 18650
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -15252,12 +15252,12 @@
|
||||
"id": "12a12abf-c6f9-4a62-a21e-4442b2fbbada",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 6086.979415301814,
|
||||
"y": 23461.2173582829
|
||||
"x": 35072.48666167863,
|
||||
"y": 18661.2173582829
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 5787.189203865294,
|
||||
"y": 23450
|
||||
"x": 34772.69645024211,
|
||||
"y": 18650
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -15370,12 +15370,12 @@
|
||||
"id": "f1ef36d6-3284-408b-9601-aa1bf4875c0a",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 6052.423821916677,
|
||||
"y": 23590.18058848192
|
||||
"x": 35037.931068293496,
|
||||
"y": 18790.18058848192
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 5787.189203865294,
|
||||
"y": 23450
|
||||
"x": 34772.69645024211,
|
||||
"y": 18650
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -15939,12 +15939,12 @@
|
||||
"id": "4ece8c41-7a25-4514-9ff5-de3f609c7a00",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 5965.335259537344,
|
||||
"y": 23691.37933393
|
||||
"x": 34950.84250591416,
|
||||
"y": 18891.37933393
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 5787.189203865294,
|
||||
"y": 23450
|
||||
"x": 34772.69645024211,
|
||||
"y": 18650
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -16103,12 +16103,12 @@
|
||||
"id": "37988155-ac7c-4eb2-937b-6d3b64842a3a",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 5842.962686014169,
|
||||
"y": 23744.769941969986
|
||||
"x": 34828.46993239099,
|
||||
"y": 18944.769941969986
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 5787.189203865294,
|
||||
"y": 23450
|
||||
"x": 34772.69645024211,
|
||||
"y": 18650
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -16162,12 +16162,12 @@
|
||||
"id": "1d398124-3f36-40a1-8b3b-6c77ad489b92",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 5787.189203865294,
|
||||
"y": 23450
|
||||
"x": 34772.69645024211,
|
||||
"y": 18650
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 5497.411455978574,
|
||||
"y": 23372.354286469243
|
||||
"x": 34482.91870235539,
|
||||
"y": 18572.354286469243
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -16188,12 +16188,12 @@
|
||||
"id": "2b8d3ce7-515c-44ad-8d80-3c2be6d7736f",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 5497.411455978574,
|
||||
"y": 23372.354286469243
|
||||
"x": 34482.91870235539,
|
||||
"y": 18572.354286469243
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 5237.603834843242,
|
||||
"y": 23522.354286469243
|
||||
"x": 34223.11108122006,
|
||||
"y": 18722.354286469243
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -16216,12 +16216,12 @@
|
||||
"id": "e9c0e495-7985-4381-bf75-865d87289038",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 5537.603834843242,
|
||||
"y": 23522.354286469243
|
||||
"x": 34523.11108122006,
|
||||
"y": 18722.354286469243
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 5237.603834843242,
|
||||
"y": 23522.354286469243
|
||||
"x": 34223.11108122006,
|
||||
"y": 18722.354286469243
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -16239,12 +16239,12 @@
|
||||
"id": "d5ed432e-78bf-432e-be3b-8649932f7a65",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 5237.603834843242,
|
||||
"y": 23522.354286469243
|
||||
"x": 34223.11108122006,
|
||||
"y": 18722.354286469243
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 4947.826086956522,
|
||||
"y": 23600
|
||||
"x": 33933.333333333336,
|
||||
"y": 18800
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -16400,12 +16400,12 @@
|
||||
"id": "796dd30f-c90d-4b8d-a63d-89867347407b",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 5237.603834843242,
|
||||
"y": 23677.645713530757
|
||||
"x": 34223.11108122006,
|
||||
"y": 18877.645713530757
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 4947.826086956522,
|
||||
"y": 23600
|
||||
"x": 33933.333333333336,
|
||||
"y": 18800
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -16423,12 +16423,12 @@
|
||||
"id": "bb390957-b8a2-4a8a-9fbf-963ea20f6eaf",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 4947.826086956522,
|
||||
"y": 23600
|
||||
"x": 33933.333333333336,
|
||||
"y": 18800
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 4647.826086956522,
|
||||
"y": 23600
|
||||
"x": 33633.333333333336,
|
||||
"y": 18800
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -16463,7 +16463,7 @@
|
||||
"userDelegates": [
|
||||
{
|
||||
"type": "User Delegate",
|
||||
"name": "Tentacule23",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "7afae430-9aae-4321-949c-0faf68b156f6",
|
||||
@@ -16504,7 +16504,7 @@
|
||||
},
|
||||
{
|
||||
"type": "User Delegate",
|
||||
"name": "alexandrustefan",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "da1969ba-e1fc-40f6-a246-41b0102b8e22",
|
||||
@@ -16545,7 +16545,7 @@
|
||||
},
|
||||
{
|
||||
"type": "User Delegate",
|
||||
"name": "NAmorim",
|
||||
"name": "",
|
||||
"config": "{\n \"percentage\": 50\n}",
|
||||
"project": "Governance",
|
||||
"id": "d8d3a46a-bcc6-4fdc-88e0-f9a37a5ebaef",
|
||||
@@ -16617,7 +16617,7 @@
|
||||
"userDelegates": [
|
||||
{
|
||||
"type": "User Delegate",
|
||||
"name": "harrellbm",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "af0bdf1a-acf9-4621-ba01-8cbf7e1be56d",
|
||||
@@ -16711,12 +16711,12 @@
|
||||
"id": "4246052a-0eab-43a6-bdc4-d9a42a9bd694",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 5167.441329227186,
|
||||
"y": 23900
|
||||
"x": 34152.948575604,
|
||||
"y": 19100
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 4907.633708091854,
|
||||
"y": 23750
|
||||
"x": 33893.14095446867,
|
||||
"y": 18950
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -16734,12 +16734,12 @@
|
||||
"id": "ed112539-01ea-4937-85cf-69612ee6115d",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 4907.633708091854,
|
||||
"y": 23750
|
||||
"x": 33893.14095446867,
|
||||
"y": 18950
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 4647.826086956522,
|
||||
"y": 23600
|
||||
"x": 33633.333333333336,
|
||||
"y": 18800
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -16929,12 +16929,12 @@
|
||||
"id": "ba3bc469-3c94-444d-a5d0-8ed851aa3778",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 4797.826086956522,
|
||||
"y": 23859.807621135333
|
||||
"x": 33783.333333333336,
|
||||
"y": 19059.807621135333
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 4647.826086956522,
|
||||
"y": 23600
|
||||
"x": 33633.333333333336,
|
||||
"y": 18800
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -16952,12 +16952,12 @@
|
||||
"id": "f8182a9c-f830-4ec1-a238-ac3a5efd69e6",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 4647.826086956522,
|
||||
"y": 23600
|
||||
"x": 33633.333333333336,
|
||||
"y": 18800
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 4347.826086956522,
|
||||
"y": 23600
|
||||
"x": 33333.333333333336,
|
||||
"y": 18800
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -16979,12 +16979,12 @@
|
||||
"id": "9870ca2a-cefc-484b-b7fc-206d62782ebc",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 4197.826086956522,
|
||||
"y": 23859.807621135333
|
||||
"x": 33183.333333333336,
|
||||
"y": 19059.807621135333
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 4347.826086956522,
|
||||
"y": 23600
|
||||
"x": 33333.333333333336,
|
||||
"y": 18800
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -17007,22 +17007,22 @@
|
||||
{
|
||||
"type": "Signing Account",
|
||||
"name": "New Signing Account",
|
||||
"config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x4f5c0d007a1315fba2eabbab3c1fb4e3f2f457b3a64a263453b5a17a9f4978f6\",\n \"s\": \"0x6d92b391e9382ea649c7d88f1536e545554cf59b925fa23beb78e1695efd5b6e\",\n \"signature\": \"0x4f5c0d007a1315fba2eabbab3c1fb4e3f2f457b3a64a263453b5a17a9f4978f66d92b391e9382ea649c7d88f1536e545554cf59b925fa23beb78e1695efd5b6e1b\"\n }\n}",
|
||||
"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}",
|
||||
"project": "Governance",
|
||||
"signingAccountChild": {
|
||||
"type": "Social Trading Desktop App",
|
||||
"name": "Social Trading Desktop App # 1",
|
||||
"config": "{\n \"codeName\": \"Social-Trading-Desktop-App-1\"\n}",
|
||||
"project": "Governance",
|
||||
"id": "33df9686-6aa8-4d0d-90b6-d86b9be4f97f",
|
||||
"id": "012c74dd-1a61-4784-bc8a-e18555b4974e",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 3666.8977890580672,
|
||||
"y": 23418.508094196695
|
||||
"x": 32588.466416509047,
|
||||
"y": 18618.508094196695
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 3964.33124747021,
|
||||
"y": 23379.35023653068
|
||||
"x": 32885.89987492119,
|
||||
"y": 18579.35023653068
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -17037,15 +17037,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"id": "d1fa780c-673a-442d-af85-6f1e03179a0e",
|
||||
"id": "3863ebb9-c69f-40b2-8bbd-eb8f2b60a49c",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 3964.33124747021,
|
||||
"y": 23379.35023653068
|
||||
"x": 32885.89987492119,
|
||||
"y": 18579.35023653068
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 4261.764705882353,
|
||||
"y": 23340.192378864667
|
||||
"x": 33183.333333333336,
|
||||
"y": 18540.192378864667
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -17063,22 +17063,22 @@
|
||||
{
|
||||
"type": "Signing Account",
|
||||
"name": "New Signing Account",
|
||||
"config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0xb6529251f39c0b1bd87bfb46e12bd266a27ac5217a932f07587a3a306367fc80\",\n \"s\": \"0x3bfd826e7bbc9b15e6a824e54284ce3f4a39d1d480091973953d0bf63c152f46\",\n \"signature\": \"0xb6529251f39c0b1bd87bfb46e12bd266a27ac5217a932f07587a3a306367fc803bfd826e7bbc9b15e6a824e54284ce3f4a39d1d480091973953d0bf63c152f461b\"\n }\n}",
|
||||
"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}",
|
||||
"project": "Governance",
|
||||
"signingAccountChild": {
|
||||
"type": "Social Trading Mobile App",
|
||||
"name": "Social Trading Mobile App # 1",
|
||||
"config": "{\n \"codeName\": \"Social-Trading-Mobile-App-1\"\n}",
|
||||
"project": "Governance",
|
||||
"id": "da524b16-839a-40cd-b90f-4ed40e745594",
|
||||
"id": "2d03d11f-b553-4b01-9291-9e13da15dd54",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 3682.209210108912,
|
||||
"y": 23184.900951803153
|
||||
"x": 32603.777837559894,
|
||||
"y": 18384.900951803153
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 3971.9869579956326,
|
||||
"y": 23262.54666533391
|
||||
"x": 32893.555585446615,
|
||||
"y": 18462.54666533391
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -17093,15 +17093,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"id": "d57afbcc-f711-4e92-9b5e-8fbf86c12acb",
|
||||
"id": "c84e9e64-7527-4dec-ac58-93696e19a756",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 3971.9869579956326,
|
||||
"y": 23262.54666533391
|
||||
"x": 32893.555585446615,
|
||||
"y": 18462.54666533391
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 4261.764705882353,
|
||||
"y": 23340.192378864667
|
||||
"x": 33183.333333333336,
|
||||
"y": 18540.192378864667
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -17119,22 +17119,22 @@
|
||||
{
|
||||
"type": "Signing Account",
|
||||
"name": "New Signing Account",
|
||||
"config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0xd5cb851afd167250a1735e96c03e7e5a4ebe2829b3e45e545f9a6e53c56360a6\",\n \"s\": \"0x4dcf855cd4fe4d711e8d18fc95ec587343457d985b93bdc7560079f3a42a424c\",\n \"signature\": \"0xd5cb851afd167250a1735e96c03e7e5a4ebe2829b3e45e545f9a6e53c56360a64dcf855cd4fe4d711e8d18fc95ec587343457d985b93bdc7560079f3a42a424c1c\"\n }\n}",
|
||||
"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}",
|
||||
"project": "Governance",
|
||||
"signingAccountChild": {
|
||||
"type": "Social Trading Server App",
|
||||
"name": "Social Trading Server App # 1",
|
||||
"config": "{\n \"codeName\": \"Social-Trading-Server-App-1\"\n}",
|
||||
"project": "Governance",
|
||||
"id": "0609495c-0248-4f9b-9006-02f0e02c76aa",
|
||||
"id": "c3d218ee-119f-4bd9-9349-8a194844ecd9",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 3785.752701707612,
|
||||
"y": 22974.935521459432
|
||||
"x": 32707.321329158593,
|
||||
"y": 18174.935521459432
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 4023.7587037949825,
|
||||
"y": 23157.56395016205
|
||||
"x": 32945.327331245964,
|
||||
"y": 18357.56395016205
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -17149,15 +17149,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"id": "42cb9bd7-bfc6-47fe-98f5-f56670f53c5d",
|
||||
"id": "75f17a55-bf33-4e69-b842-b424a6f517e8",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 4023.7587037949825,
|
||||
"y": 23157.56395016205
|
||||
"x": 32945.327331245964,
|
||||
"y": 18357.56395016205
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 4261.764705882353,
|
||||
"y": 23340.192378864667
|
||||
"x": 33183.333333333336,
|
||||
"y": 18540.192378864667
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -17175,22 +17175,22 @@
|
||||
{
|
||||
"type": "Signing Account",
|
||||
"name": "New Signing Account",
|
||||
"config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x171d95f1ff727916737828707fe408d656454598480c1c5793df392ba0be288c\",\n \"s\": \"0x7eb1242017caa74ff48251ea4a5d51345b31758f5054c961fd19199a9fb2eab7\",\n \"signature\": \"0x171d95f1ff727916737828707fe408d656454598480c1c5793df392ba0be288c7eb1242017caa74ff48251ea4a5d51345b31758f5054c961fd19199a9fb2eab71b\"\n }\n}",
|
||||
"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}",
|
||||
"project": "Governance",
|
||||
"signingAccountChild": {
|
||||
"type": "Algo Traders Platform",
|
||||
"name": "Algo Traders Platform # 1",
|
||||
"config": "{\n \"codeName\": \"Algo-Traders-Platform-1\"\n}",
|
||||
"project": "Governance",
|
||||
"id": "baa7d72c-b576-480f-b160-2cc46ce47815",
|
||||
"id": "bcffb701-754d-4685-ad09-8bf3f09265d9",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 3961.764705882353,
|
||||
"y": 22820.577136594
|
||||
"x": 32883.333333333336,
|
||||
"y": 18020.577136594
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 4111.764705882353,
|
||||
"y": 23080.384757729335
|
||||
"x": 33033.333333333336,
|
||||
"y": 18280.384757729335
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -17205,15 +17205,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"id": "47f2db6d-7fe6-456d-aeb0-7128524aaa36",
|
||||
"id": "377ee3ed-49e4-415d-87b3-946024f0a1ef",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 4111.764705882353,
|
||||
"y": 23080.384757729335
|
||||
"x": 33033.333333333336,
|
||||
"y": 18280.384757729335
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 4261.764705882353,
|
||||
"y": 23340.192378864667
|
||||
"x": 33183.333333333336,
|
||||
"y": 18540.192378864667
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -17231,22 +17231,22 @@
|
||||
{
|
||||
"type": "Signing Account",
|
||||
"name": "New Signing Account",
|
||||
"config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0x278999b03f16b7be639bf28e414bb6620f09504fbd5bfe2aa0283044036cdf0c\",\n \"s\": \"0x377237529c066739a79e545d300b911be9c525c0961f8f1edaa7df5e6322d65e\",\n \"signature\": \"0x278999b03f16b7be639bf28e414bb6620f09504fbd5bfe2aa0283044036cdf0c377237529c066739a79e545d300b911be9c525c0961f8f1edaa7df5e6322d65e1c\"\n }\n}",
|
||||
"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}",
|
||||
"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}",
|
||||
"project": "Governance",
|
||||
"id": "7c917c18-f13f-41ca-a739-a440421c7bc4",
|
||||
"id": "bb0f0417-9dfb-47a3-941f-dcfa82fbaea1",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 4183.4489905503215,
|
||||
"y": 22745.325462040382
|
||||
"x": 33105.0176180013,
|
||||
"y": 17945.325462040382
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 4222.606848216337,
|
||||
"y": 23042.758920452525
|
||||
"x": 33144.17547566732,
|
||||
"y": 18242.758920452525
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -17261,15 +17261,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"id": "2a499940-eb6f-4328-9f67-7c915b01b3db",
|
||||
"id": "7c5f14f9-63c2-42fa-98ee-1d4a36590cf4",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 4222.606848216337,
|
||||
"y": 23042.758920452525
|
||||
"x": 33144.17547566732,
|
||||
"y": 18242.758920452525
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 4261.764705882353,
|
||||
"y": 23340.192378864667
|
||||
"x": 33183.333333333336,
|
||||
"y": 18540.192378864667
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -17287,22 +17287,22 @@
|
||||
{
|
||||
"type": "Signing Account",
|
||||
"name": "New Signing Account",
|
||||
"config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1b\",\n \"r\": \"0x901e04cbe4cfd2bdba2429349d74181b953e3c048a9260a9fc27389430de80e2\",\n \"s\": \"0x22f448e151aec1e5cc1c96177fd10e8fea47f3c7a2f001412348b379685728ea\",\n \"signature\": \"0x901e04cbe4cfd2bdba2429349d74181b953e3c048a9260a9fc27389430de80e222f448e151aec1e5cc1c96177fd10e8fea47f3c7a2f001412348b379685728ea1b\"\n }\n}",
|
||||
"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}",
|
||||
"project": "Governance",
|
||||
"signingAccountChild": {
|
||||
"type": "P2P Network Node",
|
||||
"name": "P2P Network Node # 2",
|
||||
"config": "{\n \"codeName\": \"P2P-Network-Node-2\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"18042\"\n}",
|
||||
"config": "{\n \"codeName\": \"P2P-Network-Node-2\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"18043\"\n}",
|
||||
"project": "Governance",
|
||||
"id": "b7b14ba1-da1a-4f8b-8fd0-0929bfb9afdf",
|
||||
"id": "76fa8a24-9ab4-4eaf-82f2-458ba557b204",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 4417.056132943866,
|
||||
"y": 22760.636883091225
|
||||
"x": 33338.62476039485,
|
||||
"y": 17960.636883091225
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 4339.41041941311,
|
||||
"y": 23050.414630977946
|
||||
"x": 33260.97904686409,
|
||||
"y": 18250.414630977946
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -17317,15 +17317,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"id": "93fcdc33-1f94-4a07-8838-50205e305a21",
|
||||
"id": "48544424-5b62-417b-897d-9164b26fcd56",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 4339.41041941311,
|
||||
"y": 23050.414630977946
|
||||
"x": 33260.97904686409,
|
||||
"y": 18250.414630977946
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 4261.764705882353,
|
||||
"y": 23340.192378864667
|
||||
"x": 33183.333333333336,
|
||||
"y": 18540.192378864667
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -17343,22 +17343,22 @@
|
||||
{
|
||||
"type": "Signing Account",
|
||||
"name": "New Signing Account",
|
||||
"config": "{\n \"signature\": {\n \"message\": \"Luis-Fernando-Molina\",\n \"messageHash\": \"0x443abf3389e332a62d21b84dd12e271cb428d334195d3aeb986ca85ee53cccb9\",\n \"v\": \"0x1c\",\n \"r\": \"0xc938ab3cadd77fdca413d882b04f0171a46dac0c0e55c72f3c7a84a9552d94ed\",\n \"s\": \"0x1d42a148e5c1380395e79ec66649515b4220baff0d662bbaebbba90e3b71142f\",\n \"signature\": \"0xc938ab3cadd77fdca413d882b04f0171a46dac0c0e55c72f3c7a84a9552d94ed1d42a148e5c1380395e79ec66649515b4220baff0d662bbaebbba90e3b71142f1c\"\n }\n}",
|
||||
"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}",
|
||||
"project": "Governance",
|
||||
"signingAccountChild": {
|
||||
"type": "P2P Network Node",
|
||||
"name": "P2P Network Node # 3",
|
||||
"config": "{\n \"codeName\": \"P2P-Network-Node-3\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"18042\"\n}",
|
||||
"config": "{\n \"codeName\": \"P2P-Network-Node-3\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"18044\"\n}",
|
||||
"project": "Governance",
|
||||
"id": "47a35fc3-5968-494b-89db-dcbc53d993ea",
|
||||
"id": "297e57c2-3c1a-4170-b710-d2705804205b",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 4627.021563287586,
|
||||
"y": 22864.180374689924
|
||||
"x": 33548.59019073856,
|
||||
"y": 18064.180374689924
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 4444.39313458497,
|
||||
"y": 23102.186376777296
|
||||
"x": 33365.96176203595,
|
||||
"y": 18302.186376777296
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -17373,15 +17373,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"id": "5322bfda-90ae-4f5d-9bd1-3cf2ba67b854",
|
||||
"id": "b39e1c4d-4170-4134-ae85-fc9fa7f3eb47",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 4444.39313458497,
|
||||
"y": 23102.186376777296
|
||||
"x": 33365.96176203595,
|
||||
"y": 18302.186376777296
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 4261.764705882353,
|
||||
"y": 23340.192378864667
|
||||
"x": 33183.333333333336,
|
||||
"y": 18540.192378864667
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -17397,20 +17397,20 @@
|
||||
}
|
||||
}
|
||||
],
|
||||
"id": "1aae1fa4-e5cf-48de-a25e-20001523da70",
|
||||
"id": "ecf6aa0a-bf05-48e4-a7ee-7a714fbdbce2",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 4197.826086956522,
|
||||
"y": 23340.192378864667
|
||||
"x": 33183.333333333336,
|
||||
"y": 18540.192378864667
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 4347.826086956522,
|
||||
"y": 23600
|
||||
"x": 33333.333333333336,
|
||||
"y": 18800
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
"isFrozen": false,
|
||||
"isCollapsed": true,
|
||||
"isCollapsed": false,
|
||||
"angleToParent": 1,
|
||||
"distanceToParent": 3,
|
||||
"arrangementStyle": 0
|
||||
@@ -17423,17 +17423,17 @@
|
||||
"id": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 4347.826086956522,
|
||||
"y": 23600
|
||||
"x": 33333.333333333336,
|
||||
"y": 18800
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 4347.826086956522,
|
||||
"y": 23600
|
||||
"x": 33333.333333333336,
|
||||
"y": 18800
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
"isFrozen": false,
|
||||
"isCollapsed": true,
|
||||
"isCollapsed": false,
|
||||
"angleToParent": 1,
|
||||
"distanceToParent": 3,
|
||||
"arrangementStyle": 0
|
||||
|
||||
@@ -330,6 +330,7 @@ function newGovernanceFunctionLibraryProfileConstructor() {
|
||||
}
|
||||
|
||||
let secret = {
|
||||
signingAccountChildId: signingAccountChild.id,
|
||||
signingAccountChildName: signingAccountChild.name,
|
||||
signingAccountChildType: targetNodeType,
|
||||
signingAccountChildCodeName: codeName,
|
||||
|
||||
@@ -304,7 +304,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock
|
||||
/*
|
||||
The signature gives us the blockchain account, and the account the user profile.
|
||||
*/
|
||||
let witnessUserProfile = SA.projects.network.globals.memory.maps.USER_PROFILES_BY_BLOCHAIN_ACCOUNT.get(caller.blockchainAccount)
|
||||
let witnessUserProfile = SA.projects.network.globals.memory.maps.USER_PROFILES_BY_BLOKCHAIN_ACCOUNT.get(caller.blockchainAccount)
|
||||
|
||||
if (witnessUserProfile === undefined) {
|
||||
let response = {
|
||||
|
||||
@@ -6,9 +6,10 @@ exports.newNetworkGlobalsMemory = function () {
|
||||
maps: {
|
||||
USER_PROFILES_BY_ID: new Map(), // Here we will store the user profiles by User Profile Id.
|
||||
USER_PROFILES_BY_HANDLE: new Map(), // Here we will store the user profiles by User Profile Handle.
|
||||
USER_PROFILES_BY_BLOCHAIN_ACCOUNT: new Map() // Here we will store the user profiles by Blockchain Account.
|
||||
USER_PROFILES_BY_BLOKCHAIN_ACCOUNT: new Map() // Here we will store the user profiles by Blockchain Account.
|
||||
},
|
||||
arrays: {
|
||||
P2P_NETWORK_NODES: [] // Here we will store the p2p nodes deined under Signing Account node types.
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
exports.newNetworkModulesP2PNetwork = function newNetworkModulesP2PNetwork() {
|
||||
/*
|
||||
This module represents the P2P Network and it is needed to enable the connection
|
||||
of this current node to other peers.
|
||||
*/
|
||||
let thisObject = {
|
||||
joinTheNetworkAsNetworkPeer: joinTheNetworkAsNetworkPeer,
|
||||
p2pNodesToConnect: undefined,
|
||||
/* Framework Functions */
|
||||
initialize: initialize,
|
||||
finalize: finalize
|
||||
}
|
||||
|
||||
return thisObject
|
||||
|
||||
function finalize() {
|
||||
thisObject.p2pNodesToConnect = undefined
|
||||
}
|
||||
|
||||
async function initialize(callerRole) {
|
||||
|
||||
switch (callerRole) {
|
||||
case 'Network Client': {
|
||||
thisObject.p2pNodesToConnect = []
|
||||
|
||||
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]
|
||||
thisObject.p2pNodesToConnect.push(p2pNetworkNode)
|
||||
}
|
||||
break
|
||||
}
|
||||
case 'Network Peer': {
|
||||
thisObject.p2pNodesToConnect = []
|
||||
|
||||
let thisP2PNodeId = SA.secrets.map.get(global.env.P2P_NETWORK_NODE_SIGNING_ACCOUNT).signingAccountChildId
|
||||
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) {
|
||||
thisObject.p2pNodesToConnect.push(p2pNetworkNode)
|
||||
}
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function joinTheNetworkAsNetworkPeer() {
|
||||
/*
|
||||
To join the network we will need to thorugh the list of Network Nodes and pick one to connect to.
|
||||
*/
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
exports.newNetworkModulesP2PNetworkNode = function newNetworkModulesP2PNetworkNode() {
|
||||
/*
|
||||
This module represents the P2P Network Node.
|
||||
*/
|
||||
let thisObject = {
|
||||
|
||||
node: undefined,
|
||||
blockchainAccount: undefined,
|
||||
userProfile: undefined,
|
||||
|
||||
/* Framework Functions */
|
||||
initialize: initialize,
|
||||
finalize: finalize
|
||||
}
|
||||
|
||||
return thisObject
|
||||
|
||||
function finalize() {
|
||||
thisObject.node = undefined
|
||||
thisObject.blockchainAccount = undefined
|
||||
thisObject.userProfile = undefined
|
||||
}
|
||||
|
||||
async function initialize(node, userProfile, blockchainAccount) {
|
||||
/*
|
||||
We will setup here the maps and arryas we will need to operate within the P2P Network.
|
||||
*/
|
||||
thisObject.node = node
|
||||
thisObject.userProfile = userProfile
|
||||
thisObject.blockchainAccount = blockchainAccount
|
||||
}
|
||||
}
|
||||
@@ -53,7 +53,7 @@ exports.newNetworkModulesUserProfiles = function newNetworkModulesUserProfiles()
|
||||
|
||||
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_BLOCHAIN_ACCOUNT.set(blockchainAccount, 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 be signed on behalf of the User Profile.
|
||||
@@ -65,7 +65,32 @@ exports.newNetworkModulesUserProfiles = function newNetworkModulesUserProfiles()
|
||||
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_BLOCHAIN_ACCOUNT.set(blockchainAccount, userProfile)
|
||||
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.signingAccountChild.type === "P2P Network Node" &&
|
||||
signingAccount.signingAccountChild.config !== undefined
|
||||
) {
|
||||
let config
|
||||
try {
|
||||
config = JSON.parse(signingAccount.signingAccountChild.config)
|
||||
} catch (err) {
|
||||
console.log('P2P Network Node Config not in JSON format. userProfileHandle = ' + userHandle + ' NodeId = ' + signingAccount.signingAccountChild.id)
|
||||
continue
|
||||
}
|
||||
if (config.host === undefined) {
|
||||
continue
|
||||
}
|
||||
if (config.webSocketsPort === undefined) {
|
||||
continue
|
||||
}
|
||||
|
||||
let p2pNetworkNode = SA.projects.network.modules.p2pNetworkNode.newNetworkModulesP2PNetworkNode()
|
||||
p2pNetworkNode.initialize(signingAccount.signingAccountChild, userProfile, blockchainAccount)
|
||||
SA.projects.network.globals.memory.arrays.P2P_NETWORK_NODES.push(p2pNetworkNode)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,269 +0,0 @@
|
||||
exports.newNetworkModulesWebSocketsAppClient = function newNetworkModulesWebSocketsAppClient() {
|
||||
|
||||
let thisObject = {
|
||||
sendMessage: sendMessage,
|
||||
initialize: initialize,
|
||||
finalize: finalize
|
||||
}
|
||||
|
||||
let socketClient
|
||||
|
||||
let web3
|
||||
let called = {}
|
||||
let selectedNetworkNode // This is a Network Node we pick to try to connect to.
|
||||
let onMessageFunctionsMap = new Map()
|
||||
|
||||
return thisObject
|
||||
|
||||
function finalize() {
|
||||
socketClient.close()
|
||||
socketClient = undefined
|
||||
networkInterface = undefined
|
||||
peerInterface = undefined
|
||||
|
||||
web3 = undefined
|
||||
called = undefined
|
||||
onMessageFunctionsMap = undefined
|
||||
}
|
||||
|
||||
async function initialize() {
|
||||
/*
|
||||
Here we will pick a Network Node from all users profiles available that do have a Network Node running. // TODO
|
||||
In the meantime, we will assume that we have chosen the following Network Node to connect to.
|
||||
*/
|
||||
web3 = new SA.nodeModules.web3()
|
||||
|
||||
selectedNetworkNode = {
|
||||
userProfileHandle: "Luis-Fernando-Molina",
|
||||
blockchainAccount: "0xeBDCB7a73c4796ca9F025d005630eCe773dd9e54",
|
||||
ranking: 0,
|
||||
host: "localhost",
|
||||
port: global.env.NETWORK_WEB_SOCKETS_INTERFACE_PORT
|
||||
}
|
||||
|
||||
socketClient = new SA.nodeModules.ws('ws://' + selectedNetworkNode.host + ':' + selectedNetworkNode.port)
|
||||
|
||||
await setUpWebsocketClient()
|
||||
}
|
||||
|
||||
async function setUpWebsocketClient() {
|
||||
|
||||
return new Promise(connectToNewtwork)
|
||||
|
||||
function connectToNewtwork(resolve, reject) {
|
||||
|
||||
try {
|
||||
|
||||
socketClient.onopen = () => { onConnection() }
|
||||
socketClient.onerror = err => { onError(err) }
|
||||
|
||||
function onConnection() {
|
||||
|
||||
handshakeProcedure()
|
||||
|
||||
function handshakeProcedure() {
|
||||
|
||||
let callerTimestamp
|
||||
|
||||
stepOneRequest()
|
||||
|
||||
function stepOneRequest() {
|
||||
/*
|
||||
Send Handshake Message Step One:
|
||||
|
||||
At Step One we will just say hello, identify ourselves
|
||||
as a Network Client, and send the Network Node our
|
||||
User Profile Handle.
|
||||
|
||||
This Handle will be signed by the Network Node to prove
|
||||
it's own identity, and later we will sign it's own handle
|
||||
to prove ours.
|
||||
*/
|
||||
socketClient.onmessage = socketMessage => { stepOneResponse(socketMessage) }
|
||||
|
||||
callerTimestamp = (new Date()).valueOf()
|
||||
|
||||
let message = {
|
||||
messageType: 'Handshake',
|
||||
callerRole: 'Network Client',
|
||||
callerProfileHandle: SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileHandle,
|
||||
callerTimestamp: callerTimestamp,
|
||||
step: 'One'
|
||||
}
|
||||
socketClient.send(JSON.stringify(message))
|
||||
}
|
||||
|
||||
function stepOneResponse(socketMessage) {
|
||||
let response = JSON.parse(socketMessage.data)
|
||||
|
||||
if (response.result !== 'Ok') {
|
||||
console.log('[ERROR] Web Sockets Client -> stepOneResponse -> response.message = ' + response.message)
|
||||
reject()
|
||||
return
|
||||
}
|
||||
|
||||
let signature = JSON.parse(response.signature)
|
||||
called.blockchainAccount = web3.eth.accounts.recover(signature)
|
||||
/*
|
||||
We will check that the signature received produces a valid Blockchain Account.
|
||||
*/
|
||||
if (called.blockchainAccount === undefined) {
|
||||
console.log('[ERROR] Web Sockets Client -> stepOneResponse -> Signature does not produce a valid Blockchain Account.')
|
||||
reject()
|
||||
return
|
||||
}
|
||||
/*
|
||||
We will check that the blockchain account taken from the signature matches
|
||||
the one we have on record for the user profile of the Network Node we are calling.
|
||||
*/
|
||||
if (called.blockchainAccount !== selectedNetworkNode.blockchainAccount) {
|
||||
console.log('[ERROR] Web Sockets Client -> stepOneResponse -> The Network Node called does not have the expected Profile Handle.')
|
||||
reject()
|
||||
return
|
||||
}
|
||||
|
||||
let signedMessage = JSON.parse(signature.message)
|
||||
/*
|
||||
We will verify that the signature belongs to the signature.message.
|
||||
To do this we will hash the signature.message and see if we get
|
||||
the same hash of the signature.
|
||||
*/
|
||||
let hash = web3.eth.accounts.hashMessage(signature.message)
|
||||
if (hash !== signature.messageHash) {
|
||||
console.log('[ERROR] Web Sockets Client -> stepOneResponse -> signature.message Hashed Does Not Match signature.messageHash.')
|
||||
reject()
|
||||
return
|
||||
}
|
||||
/*
|
||||
We will check that the Network Node that responded has the same User Profile Handle
|
||||
that we have on record, otherwise something is wrong and we should not proceed.
|
||||
*/
|
||||
if (signedMessage.calledProfileHandle !== selectedNetworkNode.userProfileHandle) {
|
||||
console.log('[ERROR] Web Sockets Client -> stepOneResponse -> The Network Node called does not have the expected Profile Handle.')
|
||||
reject()
|
||||
return
|
||||
}
|
||||
/*
|
||||
We will check that the profile handle we sent to the Network Node, is returned at the
|
||||
signed message, to avoid man in the middle attacks.
|
||||
*/
|
||||
if (signedMessage.callerProfileHandle !== SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileHandle) {
|
||||
console.log('[ERROR] Web Sockets Client -> stepOneResponse -> The Network Node callerProfileHandle does not match my own userProfileHandle.')
|
||||
reject()
|
||||
return
|
||||
}
|
||||
/*
|
||||
We will also check that the callerTimestamp we sent to the Network Node, is returned at the
|
||||
signed message, also to avoid man in the middle attacks.
|
||||
*/
|
||||
if (signedMessage.callerTimestamp !== callerTimestamp) {
|
||||
console.log('[ERROR] Web Sockets Client -> stepOneResponse -> The Network Node callerTimestamp does not match my own callerTimestamp.')
|
||||
reject()
|
||||
return
|
||||
}
|
||||
|
||||
/*
|
||||
All validations passed, it seems we can continue with Step Two.
|
||||
*/
|
||||
stepTwoRequest(signedMessage)
|
||||
}
|
||||
|
||||
function stepTwoRequest(signedMessage) {
|
||||
/*
|
||||
Send Handshake Message Step Two:
|
||||
|
||||
Here we will sign a message with the Network Node profile
|
||||
handle and timestamp to prove our own identity.
|
||||
*/
|
||||
socketClient.onmessage = socketMessage => { stepTwoResponse(socketMessage) }
|
||||
|
||||
let signature = web3.eth.accounts.sign(JSON.stringify(signedMessage), SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileHandle)
|
||||
|
||||
let message = {
|
||||
messageType: 'Handshake',
|
||||
signature: JSON.stringify(signature),
|
||||
step: 'Two'
|
||||
}
|
||||
socketClient.send(JSON.stringify(message))
|
||||
}
|
||||
|
||||
function stepTwoResponse(socketMessage) {
|
||||
let response = JSON.parse(socketMessage.data)
|
||||
|
||||
if (response.result !== 'Ok') {
|
||||
console.log('[ERROR] Web Sockets Client -> stepOneResponse -> response.message = ' + response.message)
|
||||
reject()
|
||||
return
|
||||
}
|
||||
/*
|
||||
This was the end of the Handshake procedure. We are connected to the
|
||||
Network Node and from now on, all response messages will be received
|
||||
at this following function.
|
||||
*/
|
||||
socketClient.onmessage = socketMessage => { onMenssage(socketMessage) }
|
||||
resolve()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function onError(err) {
|
||||
console.log('[ERROR] Web Sockets Client -> onError -> err.message = ' + err.message)
|
||||
console.log('[ERROR] Web Sockets Client -> onError -> err.stack = ' + err.stack)
|
||||
}
|
||||
|
||||
} catch (err) {
|
||||
console.log('[ERROR] Web Sockets Client -> setUpWebsocketClient -> err.stack = ' + err.stack)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
function sendMessage(message) {
|
||||
|
||||
return new Promise(sendSocketMessage)
|
||||
|
||||
function sendSocketMessage(resolve, reject) {
|
||||
|
||||
if (socketClient.readyState !== 1) { // 1 means connected and ready.
|
||||
console.log('[ERROR] Web Sockets Client -> sendMessage -> Cannot send message while connection is closed.')
|
||||
reject('Websockets Connection Not Ready.')
|
||||
return
|
||||
}
|
||||
|
||||
let socketMessage = {
|
||||
messageId: SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId(),
|
||||
messageType: 'Request',
|
||||
payload: message
|
||||
}
|
||||
onMessageFunctionsMap.set(socketMessage.messageId, onMenssageFunction)
|
||||
socketClient.send(
|
||||
JSON.stringify(socketMessage)
|
||||
)
|
||||
|
||||
function onMenssageFunction(response) {
|
||||
try {
|
||||
if (response.result === 'Ok') {
|
||||
resolve(response.data)
|
||||
} else {
|
||||
console.log('[ERROR] Web Sockets Client -> onMenssageFunction -> response.message = ' + response.message)
|
||||
reject(response.message)
|
||||
}
|
||||
} catch (err) {
|
||||
callbackFunction = undefined
|
||||
console.log('[ERROR] Web Sockets Client -> err.stack = ' + err.stack)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function onMenssage(socketMessage) {
|
||||
|
||||
let response = JSON.parse(socketMessage.data)
|
||||
/*
|
||||
We get the function that is going to resolve or reject the promise given.
|
||||
*/
|
||||
onMenssageFunction = onMessageFunctionsMap.get(response.messageId)
|
||||
onMessageFunctionsMap.delete(response.messageId)
|
||||
onMenssageFunction(response)
|
||||
}
|
||||
}
|
||||
+13
-23
@@ -10,7 +10,6 @@ exports.newNetworkModulesWebSocketsNetworkClient = function newNetworkModulesWeb
|
||||
|
||||
let web3
|
||||
let called = {}
|
||||
let selectedNetworkNode // This is a Network Node we pick to try to connect to.
|
||||
let onMessageFunctionsMap = new Map()
|
||||
|
||||
return thisObject
|
||||
@@ -26,27 +25,18 @@ exports.newNetworkModulesWebSocketsNetworkClient = function newNetworkModulesWeb
|
||||
onMessageFunctionsMap = undefined
|
||||
}
|
||||
|
||||
async function initialize() {
|
||||
/*
|
||||
Here we will pick a Network Node from all users profiles available that do have a Network Node running. // TODO
|
||||
In the meantime, we will assume that we have chosen the following Network Node to connect to.
|
||||
*/
|
||||
async function initialize(callerRole, p2pNetworkNode) {
|
||||
|
||||
web3 = new SA.nodeModules.web3()
|
||||
|
||||
selectedNetworkNode = {
|
||||
userProfileHandle: "Luis-Fernando-Molina",
|
||||
blockchainAccount: "0xeBDCB7a73c4796ca9F025d005630eCe773dd9e54",
|
||||
ranking: 0,
|
||||
host: "localhost",
|
||||
port: global.env.NETWORK_WEB_SOCKETS_INTERFACE_PORT
|
||||
}
|
||||
let host = JSON.parse(p2pNetworkNode.node.config).host
|
||||
let port = JSON.parse(p2pNetworkNode.node.config).webSocketsPort
|
||||
|
||||
socketClient = new SA.nodeModules.ws('ws://' + selectedNetworkNode.host + ':' + selectedNetworkNode.port)
|
||||
|
||||
await setUpWebsocketClient()
|
||||
socketClient = new SA.nodeModules.ws('ws://' + host + ':' + port)
|
||||
await setUpWebsocketClient(callerRole, p2pNetworkNode)
|
||||
}
|
||||
|
||||
async function setUpWebsocketClient() {
|
||||
async function setUpWebsocketClient(callerRole, p2pNetworkNode) {
|
||||
|
||||
return new Promise(connectToNewtwork)
|
||||
|
||||
@@ -85,8 +75,8 @@ exports.newNetworkModulesWebSocketsNetworkClient = function newNetworkModulesWeb
|
||||
|
||||
let message = {
|
||||
messageType: 'Handshake',
|
||||
callerRole: 'Network Node',
|
||||
callerProfileHandle: SA.secrets.map.get(global.env.P2P_NETWORK_NODE_SIGNING_ACCOUNT).userProfileHandle,
|
||||
callerRole: callerRole,
|
||||
callerProfileHandle: SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileHandle,
|
||||
callerTimestamp: callerTimestamp,
|
||||
step: 'One'
|
||||
}
|
||||
@@ -116,7 +106,7 @@ exports.newNetworkModulesWebSocketsNetworkClient = function newNetworkModulesWeb
|
||||
We will check that the blockchain account taken from the signature matches
|
||||
the one we have on record for the user profile of the Network Node we are calling.
|
||||
*/
|
||||
if (called.blockchainAccount !== selectedNetworkNode.blockchainAccount) {
|
||||
if (called.blockchainAccount !== p2pNetworkNode.blockchainAccount) {
|
||||
console.log('[ERROR] Web Sockets Client -> stepOneResponse -> The Network Node called does not have the expected Profile Handle.')
|
||||
reject()
|
||||
return
|
||||
@@ -138,7 +128,7 @@ exports.newNetworkModulesWebSocketsNetworkClient = function newNetworkModulesWeb
|
||||
We will check that the Network Node that responded has the same User Profile Handle
|
||||
that we have on record, otherwise something is wrong and we should not proceed.
|
||||
*/
|
||||
if (signedMessage.calledProfileHandle !== selectedNetworkNode.userProfileHandle) {
|
||||
if (signedMessage.calledProfileHandle !== p2pNetworkNode.userProfile.userProfileHandle) {
|
||||
console.log('[ERROR] Web Sockets Client -> stepOneResponse -> The Network Node called does not have the expected Profile Handle.')
|
||||
reject()
|
||||
return
|
||||
@@ -147,7 +137,7 @@ exports.newNetworkModulesWebSocketsNetworkClient = function newNetworkModulesWeb
|
||||
We will check that the profile handle we sent to the Network Node, is returned at the
|
||||
signed message, to avoid man in the middle attacks.
|
||||
*/
|
||||
if (signedMessage.callerProfileHandle !== SA.secrets.map.get(global.env.P2P_NETWORK_NODE_SIGNING_ACCOUNT).userProfileHandle) {
|
||||
if (signedMessage.callerProfileHandle !== SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).userProfileHandle) {
|
||||
console.log('[ERROR] Web Sockets Client -> stepOneResponse -> The Network Node callerProfileHandle does not match my own userProfileHandle.')
|
||||
reject()
|
||||
return
|
||||
@@ -177,7 +167,7 @@ exports.newNetworkModulesWebSocketsNetworkClient = function newNetworkModulesWeb
|
||||
*/
|
||||
socketClient.onmessage = socketMessage => { stepTwoResponse(socketMessage) }
|
||||
|
||||
let signature = web3.eth.accounts.sign(JSON.stringify(signedMessage), SA.secrets.map.get(global.env.P2P_NETWORK_NODE_SIGNING_ACCOUNT).privateKey)
|
||||
let signature = web3.eth.accounts.sign(JSON.stringify(signedMessage), SA.secrets.map.get(global.env.DESKTOP_APP_SIGNING_ACCOUNT).privateKey)
|
||||
|
||||
let message = {
|
||||
messageType: 'Handshake',
|
||||
@@ -1093,7 +1093,7 @@
|
||||
{
|
||||
"name": "Docs Statistics Functions",
|
||||
"propertyName": "docsStatisticsFunctions",
|
||||
"functionName": "newEducationFunctionLibraryDocsStats"
|
||||
"functionName": "newEducationFunctionLibraryDocsStatisticsFunctions"
|
||||
}
|
||||
],
|
||||
"utilities": [
|
||||
@@ -1376,12 +1376,6 @@
|
||||
"propertyName": "webSocketsInterface",
|
||||
"functionName": "newNetworkModulesWebSocketsInterface",
|
||||
"fileName": "WebSocketsInterface.js"
|
||||
},
|
||||
{
|
||||
"name": "Web Sockets Network Client",
|
||||
"propertyName": "webSocketsNetworkClient",
|
||||
"functionName": "newNetworkModulesWebSocketsNetworkClient",
|
||||
"fileName": "WebSocketsNetworkClient.js"
|
||||
}
|
||||
],
|
||||
"utilities": []
|
||||
@@ -1397,16 +1391,28 @@
|
||||
],
|
||||
"modules": [
|
||||
{
|
||||
"name": "Web Sockets App Client",
|
||||
"propertyName": "webSocketsAppClient",
|
||||
"functionName": "newNetworkModulesWebSocketsAppClient",
|
||||
"fileName": "WebSocketsAppClient.js"
|
||||
"name": "Web Sockets Network Client",
|
||||
"propertyName": "webSocketsNetworkClient",
|
||||
"functionName": "newNetworkModulesWebSocketsNetworkClient",
|
||||
"fileName": "WebSocketsNetworkClient.js"
|
||||
},
|
||||
{
|
||||
"name": "User Profiles",
|
||||
"propertyName": "userProfiles",
|
||||
"functionName": "newNetworkModulesUserProfiles",
|
||||
"fileName": "UserProfiles.js"
|
||||
},
|
||||
{
|
||||
"name": "P2P Network",
|
||||
"propertyName": "p2pNetwork",
|
||||
"functionName": "newNetworkModulesP2PNetwork",
|
||||
"fileName": "P2PNetwork.js"
|
||||
},
|
||||
{
|
||||
"name": "P2P Network Node",
|
||||
"propertyName": "p2pNetworkNode",
|
||||
"functionName": "newNetworkModulesP2PNetworkNode",
|
||||
"fileName": "P2PNetworkNode.js"
|
||||
}
|
||||
],
|
||||
"utilities": [
|
||||
|
||||
@@ -58,11 +58,11 @@ exports.newSocialTradingModulesWebAppInterface = function newSocialTradingModule
|
||||
response = {
|
||||
result: 'Ok',
|
||||
message: 'Web App Interface Query Processed.',
|
||||
data: await DK.running.webSocketsClient.sendMessage(JSON.stringify(messageHeader))
|
||||
data: await DK.desktopApp.webSocketsClient.sendMessage(JSON.stringify(messageHeader))
|
||||
}
|
||||
} else {
|
||||
|
||||
let events = await DK.running.webSocketsClient.sendMessage(JSON.stringify(messageHeader))
|
||||
let events = await DK.desktopApp.webSocketsClient.sendMessage(JSON.stringify(messageHeader))
|
||||
for (let i = 0; i < events.length; i++) {
|
||||
let event = events[i]
|
||||
if (event.eventType === SA.projects.socialTrading.globals.eventTypes.NEW_USER_POST) {
|
||||
@@ -132,7 +132,7 @@ exports.newSocialTradingModulesWebAppInterface = function newSocialTradingModule
|
||||
let response = {
|
||||
result: 'Ok',
|
||||
message: 'Web App Interface Event Processed.',
|
||||
data: await DK.running.webSocketsClient.sendMessage(JSON.stringify(messageHeader))
|
||||
data: await DK.desktopApp.webSocketsClient.sendMessage(JSON.stringify(messageHeader))
|
||||
}
|
||||
return response
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user