Merge pull request #2622 from Luis-Fernando-Molina/develop

Contribution: Governance System, bug fixes for web3 calls.
This commit is contained in:
Luis Fernando Molina authored and GitHub committed 2021-11-14 09:03:02 -04:00
commit 1641fa3926
22 files changed
+471 -87

No files matched your search

+1
View File
@@ -17,6 +17,7 @@ exports.newEnvironment = function () {
DESKTOP_WEB_SOCKETS_INTERFACE_HOST: 'localhost', DESKTOP_WEB_SOCKETS_INTERFACE_HOST: 'localhost',
PLATFORM_HTTP_INTERFACE_PORT: 34248, PLATFORM_HTTP_INTERFACE_PORT: 34248,
DESKTOP_HTTP_INTERFACE_PORT: 33248, DESKTOP_HTTP_INTERFACE_PORT: 33248,
NETWORK_HTTP_INTERFACE_PORT: 31248,
PATH_TO_DATA_STORAGE: path.join(basePath, './Platform/My-Data-Storage'), PATH_TO_DATA_STORAGE: path.join(basePath, './Platform/My-Data-Storage'),
PATH_TO_PROJECTS: path.join(basePath, './Projects'), PATH_TO_PROJECTS: path.join(basePath, './Projects'),
PATH_TO_LOG_FILES: path.join(basePath, './Platform/My-Log-Files'), PATH_TO_LOG_FILES: path.join(basePath, './Platform/My-Log-Files'),
+7
View File
@@ -6,6 +6,7 @@ exports.newNetworkNode = function newNetworkNode() {
p2pNetworkPeers: undefined, p2pNetworkPeers: undefined,
p2pNetworkNode: undefined, p2pNetworkNode: undefined,
webSocketsInterface: undefined, webSocketsInterface: undefined,
httpInterface: undefined,
socialGraphService: undefined, socialGraphService: undefined,
storage: undefined, storage: undefined,
run: run run: run
@@ -65,6 +66,12 @@ exports.newNetworkNode = function newNetworkNode() {
thisObject.webSocketsInterface = NT.projects.network.modules.webSocketsInterface.newNetworkModulesWebSocketsInterface() thisObject.webSocketsInterface = NT.projects.network.modules.webSocketsInterface.newNetworkModulesWebSocketsInterface()
thisObject.webSocketsInterface.initialize() thisObject.webSocketsInterface.initialize()
console.log('Network Node Web Sockets Interface ........................................... Listening at port ' + JSON.parse(NT.networkNode.p2pNetworkNode.node.config).webSocketsPort) console.log('Network Node Web Sockets Interface ........................................... Listening at port ' + JSON.parse(NT.networkNode.p2pNetworkNode.node.config).webSocketsPort)
/*
Other Network Nodes and Client Apps will communicate with this Network Node via it's HTTP Interface.
*/
thisObject.httpInterface = NT.projects.network.modules.httpInterface.newNetworkModulesHttpInterface()
thisObject.httpInterface.initialize()
console.log('Network Node Http Interface .................................................. Listening at port ' + JSON.parse(NT.networkNode.p2pNetworkNode.node.config).webPort)
} }
} }
} }
+1
View File
@@ -47,6 +47,7 @@ exports.newNetworkRoot = function newNetworkRoot() {
fs: require('fs'), fs: require('fs'),
path: require('path'), path: require('path'),
util: require('util'), util: require('util'),
http: require('http'),
nodeFetch: require('node-fetch'), nodeFetch: require('node-fetch'),
web3: require('web3'), web3: require('web3'),
ws: require('ws'), ws: require('ws'),
+9 -6
View File
@@ -90,7 +90,7 @@ exports.newWeb3Server = function newWeb3Server() {
let balance let balance
let ABI = [{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"amount","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"listAddress","type":"address"},{"name":"isBlackListed","type":"bool"}],"name":"blackListAddress","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_decimals","type":"uint256"},{"name":"_supply","type":"uint256"},{"name":"tokenOwner","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"burner","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"blackListed","type":"address"},{"indexed":false,"name":"value","type":"bool"}],"name":"Blacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}]Line truncated let ABI = [{ "constant": true, "inputs": [], "name": "name", "outputs": [{ "name": "", "type": "string" }], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [{ "name": "_spender", "type": "address" }, { "name": "_value", "type": "uint256" }], "name": "approve", "outputs": [{ "name": "", "type": "bool" }], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [], "name": "totalSupply", "outputs": [{ "name": "", "type": "uint256" }], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [{ "name": "_from", "type": "address" }, { "name": "_to", "type": "address" }, { "name": "_value", "type": "uint256" }], "name": "transferFrom", "outputs": [{ "name": "", "type": "bool" }], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [], "name": "decimals", "outputs": [{ "name": "", "type": "uint256" }], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [], "name": "unpause", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [{ "name": "account", "type": "address" }, { "name": "amount", "type": "uint256" }], "name": "mint", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [{ "name": "_value", "type": "uint256" }], "name": "burn", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [], "name": "paused", "outputs": [{ "name": "", "type": "bool" }], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [{ "name": "_spender", "type": "address" }, { "name": "_subtractedValue", "type": "uint256" }], "name": "decreaseApproval", "outputs": [{ "name": "success", "type": "bool" }], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [{ "name": "_owner", "type": "address" }], "name": "balanceOf", "outputs": [{ "name": "balance", "type": "uint256" }], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [{ "name": "listAddress", "type": "address" }, { "name": "isBlackListed", "type": "bool" }], "name": "blackListAddress", "outputs": [{ "name": "success", "type": "bool" }], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [], "name": "pause", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [], "name": "owner", "outputs": [{ "name": "", "type": "address" }], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "symbol", "outputs": [{ "name": "", "type": "string" }], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [{ "name": "_to", "type": "address" }, { "name": "_value", "type": "uint256" }], "name": "transfer", "outputs": [{ "name": "", "type": "bool" }], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [{ "name": "_spender", "type": "address" }, { "name": "_addedValue", "type": "uint256" }], "name": "increaseApproval", "outputs": [{ "name": "success", "type": "bool" }], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [{ "name": "_owner", "type": "address" }, { "name": "_spender", "type": "address" }], "name": "allowance", "outputs": [{ "name": "", "type": "uint256" }], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [{ "name": "newOwner", "type": "address" }], "name": "transferOwnership", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "name": "_name", "type": "string" }, { "name": "_symbol", "type": "string" }, { "name": "_decimals", "type": "uint256" }, { "name": "_supply", "type": "uint256" }, { "name": "tokenOwner", "type": "address" }], "payable": false, "stateMutability": "nonpayable", "type": "constructor" }, { "anonymous": false, "inputs": [{ "indexed": true, "name": "from", "type": "address" }, { "indexed": true, "name": "to", "type": "address" }, { "indexed": false, "name": "value", "type": "uint256" }], "name": "Mint", "type": "event" }, { "anonymous": false, "inputs": [{ "indexed": true, "name": "burner", "type": "address" }, { "indexed": false, "name": "value", "type": "uint256" }], "name": "Burn", "type": "event" }, { "anonymous": false, "inputs": [], "name": "Pause", "type": "event" }, { "anonymous": false, "inputs": [], "name": "Unpause", "type": "event" }, { "anonymous": false, "inputs": [{ "indexed": true, "name": "previousOwner", "type": "address" }, { "indexed": true, "name": "newOwner", "tLine truncated
const contractInst = new web3.eth.Contract(ABI, contractAddress) const contractInst = new web3.eth.Contract(ABI, contractAddress)
@@ -101,8 +101,11 @@ exports.newWeb3Server = function newWeb3Server() {
await getBalance() await getBalance()
return balance return {
walletAddress: walletAddress,
balance: balance,
result: 'Ok'
}
} }
async function getWalletBalances(host, port, interface, walletDefinition) { async function getWalletBalances(host, port, interface, walletDefinition) {
@@ -326,7 +329,7 @@ exports.newWeb3Server = function newWeb3Server() {
async function sendTokens(number, userProfile, fromAddress, toAddress, tokenAmount) { async function sendTokens(number, userProfile, fromAddress, toAddress, tokenAmount) {
try { try {
tokenAmount = Math.trunc(tokenAmount / 1000000000000000000) tokenAmount = Math.trunc(tokenAmount / 1000000000000000000)
console.log('') console.log('')
@@ -384,12 +387,12 @@ exports.newWeb3Server = function newWeb3Server() {
console.log('Transaction:', rawTransaction) console.log('Transaction:', rawTransaction)
let result let result
result = await web3.eth.sendSignedTransaction('0x' + transaction.serialize().toString('hex')) result = await web3.eth.sendSignedTransaction('0x' + transaction.serialize().toString('hex'))
.catch(err => { .catch(err => {
console.log('[ERROR] sendSignedTransaction -> err =' + JSON.stringify(err)) console.log('[ERROR] sendSignedTransaction -> err =' + JSON.stringify(err))
}) })
console.log('Result:', result) console.log('Result:', result)
return result return result
} catch (err) { } catch (err) {
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

@@ -24,7 +24,7 @@ function newFoundationsTopSpace() {
logoImage = new Image() logoImage = new Image()
loadImage('superalgos-header-background', backgroundImage) loadImage('superalgos-header-background', backgroundImage)
loadImage('sa-beta12-logo-horiz-dark', logoImage) loadImage('sa-v10-logo-horiz-dark', logoImage)
function loadImage(name, image) { function loadImage(name, image) {
const PATH = 'Images/' const PATH = 'Images/'
@@ -17236,7 +17236,7 @@
"signingAccountChild": { "signingAccountChild": {
"type": "P2P Network Node", "type": "P2P Network Node",
"name": "P2P Network Node # 1", "name": "P2P Network Node # 1",
"config": "{\n \"codeName\": \"P2P-Network-Node-1\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"18042\"\n}", "config": "{\n \"codeName\": \"P2P-Network-Node-1\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"18042\",\n \"webPort\": \"31248\"\n}",
"project": "Governance", "project": "Governance",
"id": "bb0f0417-9dfb-47a3-941f-dcfa82fbaea1", "id": "bb0f0417-9dfb-47a3-941f-dcfa82fbaea1",
"savedPayload": { "savedPayload": {
@@ -17292,7 +17292,7 @@
"signingAccountChild": { "signingAccountChild": {
"type": "P2P Network Node", "type": "P2P Network Node",
"name": "P2P Network Node # 2", "name": "P2P Network Node # 2",
"config": "{\n \"codeName\": \"P2P-Network-Node-2\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"18043\"\n}", "config": "{\n \"codeName\": \"P2P-Network-Node-2\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"18043\",\n \"webPort\": \"31248\"\n}",
"project": "Governance", "project": "Governance",
"id": "76fa8a24-9ab4-4eaf-82f2-458ba557b204", "id": "76fa8a24-9ab4-4eaf-82f2-458ba557b204",
"savedPayload": { "savedPayload": {
@@ -17348,7 +17348,7 @@
"signingAccountChild": { "signingAccountChild": {
"type": "P2P Network Node", "type": "P2P Network Node",
"name": "P2P Network Node # 3", "name": "P2P Network Node # 3",
"config": "{\n \"codeName\": \"P2P-Network-Node-3\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"18044\"\n}", "config": "{\n \"codeName\": \"P2P-Network-Node-3\",\n \"host\": \"localhost\",\n \"webSocketsPort\": \"18044\",\n \"webPort\": \"31248\"\n}",
"project": "Governance", "project": "Governance",
"id": "297e57c2-3c1a-4170-b710-d2705804205b", "id": "297e57c2-3c1a-4170-b710-d2705804205b",
"savedPayload": { "savedPayload": {
@@ -25,7 +25,7 @@
"config": true "config": true
}, },
"initialValues": { "initialValues": {
"config": "{ \n\"codeName\": \"localhost\", \n\"host\": \"localhost\", \n\"webSocketsPort\": \"18042\"\n}" "config": "{ \n\"codeName\": \"localhost\", \n\"host\": \"localhost\", \n\"webPort\": \"31248\", \n\"webSocketsPort\": \"18042\"\n}"
}, },
"addLeftIcons": true, "addLeftIcons": true,
"level": 1, "level": 1,
@@ -484,10 +484,15 @@ function newGovernanceUserProfileSpace() {
console.log('[WARN] Error fetching blockchain tokens of user profile ' + userProfile.name) console.log('[WARN] Error fetching blockchain tokens of user profile ' + userProfile.name)
userProfile.payload.blockchainTokens = undefined userProfile.payload.blockchainTokens = undefined
} else { } else {
let commandResponse = JSON.parse(data)
if (commandResponse.result !== "Ok") {
console.log('[WARN] Web3 Error fetching blockchain tokens of user profile ' + userProfile.name)
return
}
userProfile.payload.uiObject.setInfoMessage('Blockchain Balance Successfully Loaded.', userProfile.payload.uiObject.setInfoMessage('Blockchain Balance Successfully Loaded.',
UI.projects.governance.globals.designer.SET_INFO_COUNTER_FACTOR UI.projects.governance.globals.designer.SET_INFO_COUNTER_FACTOR
) )
userProfile.payload.blockchainTokens = Number(data) userProfile.payload.blockchainTokens = Number(commandResponse.balance)
console.log('[INFO] SA Balance of ' + userProfile.name + ' is ', userProfile.payload.blockchainTokens) console.log('[INFO] SA Balance of ' + userProfile.name + ' is ', userProfile.payload.blockchainTokens)
userProfile.payload.reputation = Math.min(reputationByAddress.get(blockchainAccount.toLowerCase()) | 0, userProfile.payload.blockchainTokens) userProfile.payload.reputation = Math.min(reputationByAddress.get(blockchainAccount.toLowerCase()) | 0, userProfile.payload.blockchainTokens)
console.log('[INFO] Reputation of ' + userProfile.name + ' is ', userProfile.payload.reputation) console.log('[INFO] Reputation of ' + userProfile.name + ' is ', userProfile.payload.reputation)
@@ -514,10 +519,15 @@ function newGovernanceUserProfileSpace() {
console.log('[WARN] Error fetching liquidity tokens for asset ' + asset + ' of user profile ' + userProfile.name) console.log('[WARN] Error fetching liquidity tokens for asset ' + asset + ' of user profile ' + userProfile.name)
userProfile.payload.blockchainTokens = undefined userProfile.payload.blockchainTokens = undefined
} else { } else {
let commandResponse = JSON.parse(data)
if (commandResponse.result !== "Ok") {
console.log('[WARN] Web3 Error fetching liquidity tokens for asset ' + asset + ' of user profile ' + userProfile.name)
return
}
userProfile.payload.uiObject.setInfoMessage('Pancake Balance Successfully Loaded for asset ' + asset, userProfile.payload.uiObject.setInfoMessage('Pancake Balance Successfully Loaded for asset ' + asset,
UI.projects.governance.globals.designer.SET_INFO_COUNTER_FACTOR UI.projects.governance.globals.designer.SET_INFO_COUNTER_FACTOR
) )
userProfile.payload.liquidityTokens[asset] = Number(data) userProfile.payload.liquidityTokens[asset] = Number(commandResponse.balance)
console.log('[INFO] Liquidity of ' + userProfile.name + ' for asset ' + asset + ' is ', userProfile.payload.liquidityTokens[asset]) console.log('[INFO] Liquidity of ' + userProfile.name + ' for asset ' + asset + ' is ', userProfile.payload.liquidityTokens[asset])
} }
} }
+4 -2
View File
@@ -4,12 +4,14 @@ exports.newNetworkGlobalsMemory = function () {
*/ */
let thisObject = { let thisObject = {
maps: { maps: {
EVENTS: new Map() // This is the registry of all events received that prevents processing them more than once. EVENTS: new Map(), // This is the registry of all events received that prevents processing them more than once.
SIGNALS: new Map() // This is the registry of all signals received that prevents processing them more than once.
}, },
arrays: { arrays: {
NETWORK_CLIENTS: [], // These are the Network Clients connected to this Network Node ordered by Ranking. NETWORK_CLIENTS: [], // These are the Network Clients connected to this Network Node ordered by Ranking.
NETWORK_PEERS: [], // These are the Network Peers connected to this Network Node ordered by Ranking. NETWORK_PEERS: [], // These are the Network Peers connected to this Network Node ordered by Ranking.
EVENTS: [] // This is the registry of all events in order that prevents ordering them more than once. EVENTS: [], // This is the registry of all events in order that prevents ordering them more than once.
SIGNALS: [] // This is the registry of all signals in order that prevents ordering them more than once.
} }
} }
@@ -0,0 +1,52 @@
exports.newNetworkModulesHttpInterface = function newNetworkModulesHttpInterface() {
/*
This module represent the HTTP API of the
NNetwork Node. All HTTP request are processed
by this module.
*/
let thisObject = {
initialize: initialize,
finalize: finalize
}
return thisObject
function finalize() {
}
function initialize() {
let port = JSON.parse(NT.networkNode.p2pNetworkNode.node.config).webPort
/*
We will create an HTTP Server and leave it running forever.
*/
SA.nodeModules.http.createServer(onHttpRequest).listen(port)
}
async function onHttpRequest(httpRequest, httpResponse) {
try {
let requestPathAndParameters = httpRequest.url.split('?') // Remove version information
let requestPath = requestPathAndParameters[0].split('/')
let endpointOrFile = requestPath[1]
switch (endpointOrFile) {
case 'Signal':
{
let message = requestPath[2]
let response = await thisObject.clientInterface.messageReceived(message)
SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(response), httpResponse)
}
break
case 'Stats':
{
SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify([]), httpResponse)
}
break
default:
{
}
}
} catch (err) {
console.log(err.stack)
}
}
}
+31 -1
View File
@@ -1389,6 +1389,12 @@
"propertyName": "webSocketsInterface", "propertyName": "webSocketsInterface",
"functionName": "newNetworkModulesWebSocketsInterface", "functionName": "newNetworkModulesWebSocketsInterface",
"fileName": "WebSocketsInterface.js" "fileName": "WebSocketsInterface.js"
},
{
"name": "Http Interface",
"propertyName": "httpInterface",
"functionName": "newNetworkModulesHttpInterface",
"fileName": "HttpInterface.js"
} }
], ],
"utilities": [] "utilities": []
@@ -1528,6 +1534,12 @@
"functionName": "newSocialTradingModulesEvent", "functionName": "newSocialTradingModulesEvent",
"fileName": "Event.js" "fileName": "Event.js"
}, },
{
"name": "Signal",
"propertyName": "signal",
"functionName": "newSocialTradingModulesSignal",
"fileName": "Signal.js"
},
{ {
"name": "Client Interface", "name": "Client Interface",
"propertyName": "clientInterface", "propertyName": "clientInterface",
@@ -1595,6 +1607,24 @@
"propertyName": "eventTypes", "propertyName": "eventTypes",
"functionName": "newSocialTradingGlobalsEventTypes", "functionName": "newSocialTradingGlobalsEventTypes",
"fileName": "EventTypes.js" "fileName": "EventTypes.js"
},
{
"name": "Signal Types",
"propertyName": "eventTypes",
"functionName": "newSocialTradingGlobalsSignalTypes",
"fileName": "SignalTypes.js"
},
{
"name": "Post Types",
"propertyName": "postTypes",
"functionName": "newSocialTradingGlobalsPostTypes",
"fileName": "PostTypes.js"
},
{
"name": "Reaction Types",
"propertyName": "reactionTypes",
"functionName": "newSocialTradingGlobalsReactionTypes",
"fileName": "ReactionTypes.js"
} }
] ]
}, },
@@ -1605,7 +1635,7 @@
"name": "Http Interface", "name": "Http Interface",
"propertyName": "httpInterface", "propertyName": "httpInterface",
"functionName": "newDesktopModulesHttpInterface", "functionName": "newDesktopModulesHttpInterface",
"fileName": "httpInterface.js" "fileName": "HttpInterface.js"
}, },
{ {
"name": "Web Sockets Interface", "name": "Web Sockets Interface",
@@ -1,15 +1,16 @@
exports.newSocialTradingModulesClientInterface = function newSocialTradingModulesClientInterface() { exports.newSocialTradingModulesClientInterface = function newSocialTradingModulesClientInterface() {
/* /*
This module represents the Interface the Network Node have This module represents the Interface the Network Node have
with Network Clients connected to it. There are two things with Network Clients connected to it. There are 3 things
Network Clients can do with this Network Node: Network Clients can do with this Network Node:
* Send an Event that happened at the Network Client to the Network.
* Make a Query to the Network Node for info needed at the Network Client. * Make a Query to the Network Node for info needed at the Network Client.
* Send an Event that happened at the Network Client to the Network.
* Send a Signal that needs to be distributed.
This interface is one layer above the communication protocol interface This interface is one layer above the communication protocol interface
where actual messages are received through, like for instance the where actual messages are received through, like for instance the
websockets interface. websockets interface or http interface.
*/ */
let thisObject = { let thisObject = {
messageReceived: messageReceived, messageReceived: messageReceived,
@@ -47,7 +48,7 @@ exports.newSocialTradingModulesClientInterface = function newSocialTradingModule
return response return response
} }
if (messageHeader.requestType !== 'Event' && messageHeader.requestType !== 'Query') { if (messageHeader.requestType !== 'Event' && messageHeader.requestType !== 'Query' && messageHeader.requestType !== 'Signal') {
let response = { let response = {
result: 'Error', result: 'Error',
message: 'Client Interface requestType Not Supported.' message: 'Client Interface requestType Not Supported.'
@@ -56,15 +57,99 @@ exports.newSocialTradingModulesClientInterface = function newSocialTradingModule
} }
switch (messageHeader.requestType) { switch (messageHeader.requestType) {
case 'Query': {
return await queryReceived(messageHeader.queryMessage, userProfile)
}
case 'Event': { case 'Event': {
return await eventReceived(messageHeader.eventMessage, userProfile) return await eventReceived(messageHeader.eventMessage, userProfile)
} }
case 'Query': { case 'Signal': {
return await queryReceived(messageHeader.queryMessage, userProfile) return await signalReceived(messageHeader.eventMessage)
} }
} }
} }
async function queryReceived(queryMessage, userProfile) {
/*
We expect here a JSON string with some or all of the following properties:
{
"queryType": 10,
"emitterUserProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
"targetUserProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
"emitterUserProfileHandle": "Luis-Fernando-Molina",
"targetUserProfileHandle": "Luis-Fernando-Molina",
"emitterBotProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
"targetBBotProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
"emitterPostHash": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
"targetPostHash": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
"timestamp": 124234234234,
"botAsset": "BTC",
"botExchange": "Binance",
"botEnabled": true,
"initialIndex": 35,
"amountRequested": 50,
"direction": "Past"
}
*/
let queryReceived
try {
queryReceived = JSON.parse(queryMessage)
} catch (err) {
let response = {
result: 'Error',
message: 'Client Interface queryMessage Not Correct JSON Format.'
}
return response
}
/*
At the Client Interface, queries need to be emitted by the same userProfile that is
connected at the Network Node.
*/
if (queryReceived.emitterUserProfileId !== userProfile.userProfileId) {
let response = {
result: 'Error',
message: 'Client Interface emitterUserProfileId !== userProfileId Connected to Network Node.'
}
return response
}
/*
Here we will process the query. This does not change the state of the Social Graph.
*/
try {
let query = NT.projects.socialTrading.modules.query.newSocialTradingModulesQuery()
query.initialize(queryReceived)
// console.log((new Date()).toISOString(), '- Client Interface', '- Query Message Received', queryMessage)
let response = {
result: 'Ok',
message: 'Client Interface Query Processed.',
data: query.execute()
}
// console.log((new Date()).toISOString(), '- Client Interface', '- Query Response Sent', JSON.stringify(response))
return response
} catch (err) {
/*
Any exception that happens while trying to execute the query.
*/
if (err.stack !== undefined) {
console.log('[ERROR] Client Interface -> err.stack = ' + err.stack)
}
let errorMessage = err.message
if (errorMessage === undefined) { errorMessage = err }
let response = {
result: 'Error',
message: 'Client Interface ' + errorMessage
}
return response
}
}
async function eventReceived(eventMessage, userProfile) { async function eventReceived(eventMessage, userProfile) {
/* /*
We expect here a JSON string with some or all of the following properties: We expect here a JSON string with some or all of the following properties:
@@ -160,16 +245,15 @@ exports.newSocialTradingModulesClientInterface = function newSocialTradingModule
} }
} }
async function queryReceived(queryMessage, userProfile) { async function signalReceived(signalMessage) {
/* /*
We expect here a JSON string with some or all of the following properties: We expect here a JSON string with some or all of the following properties:
{ {
"queryType": 10, "signalId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
"signalType": 10,
"emitterUserProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", "emitterUserProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
"targetUserProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", "targetUserProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
"emitterUserProfileHandle": "Luis-Fernando-Molina",
"targetUserProfileHandle": "Luis-Fernando-Molina",
"emitterBotProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", "emitterBotProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
"targetBBotProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", "targetBBotProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
"emitterPostHash": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", "emitterPostHash": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
@@ -177,56 +261,60 @@ exports.newSocialTradingModulesClientInterface = function newSocialTradingModule
"timestamp": 124234234234, "timestamp": 124234234234,
"botAsset": "BTC", "botAsset": "BTC",
"botExchange": "Binance", "botExchange": "Binance",
"botEnabled": true, "botEnabled": true
"initialIndex": 35,
"amountRequested": 50,
"direction": "Past"
} }
*/ */
let queryReceived let signalReceived
try { try {
queryReceived = JSON.parse(queryMessage) signalReceived = JSON.parse(signalMessage)
} catch (err) { } catch (err) {
let response = { let response = {
result: 'Error', result: 'Error',
message: 'Client Interface queryMessage Not Correct JSON Format.' message: 'Client Interface signalMessage Not Correct JSON Format.'
} }
return response return response
} }
/* /*
At the Client Interface, queries need to be emitted by the same userProfile that is We will not accept signals that don't have an signalId.
connected at the Network Node.
*/ */
if (queryReceived.emitterUserProfileId !== userProfile.userProfileId) { if (signalReceived.signalId === undefined) {
let response = { let response = {
result: 'Error', result: 'Error',
message: 'Client Interface emitterUserProfileId !== userProfileId Connected to Network Node.' message: 'signalId Not Provided.'
} }
return response return response
} }
/* /*
Here we will process the query. This does not change the state of the Social Graph. We will not accept signals that have already been processed.
*/
if (NT.projects.network.globals.memory.maps.SIGNALS.get(signalReceived.signalId) !== undefined) {
let response = {
result: 'Error',
message: 'Client Interface Signal Already Exists.'
}
return response
}
/*
Here we will process the signal and change the state of the Social Graph.
*/ */
try { try {
let query = NT.projects.socialTrading.modules.query.newSocialTradingModulesQuery() let signal = NT.projects.socialTrading.modules.signal.newSocialTradingModulesSignal()
query.initialize(queryReceived) signal.initialize(signalReceived)
NT.projects.network.globals.memory.maps.SIGNALS.set(signalReceived.eventId, signal)
// console.log((new Date()).toISOString(), '- Client Interface', '- Query Message Received', queryMessage) NT.projects.network.globals.memory.arrays.SIGNALS.push(signal)
let response = { let response = {
result: 'Ok', result: 'Ok',
message: 'Client Interface Query Processed.', message: 'Client Interface Signal Processed.'
data: query.execute()
} }
// console.log((new Date()).toISOString(), '- Client Interface', '- Query Response Sent', JSON.stringify(response))
return response return response
} catch (err) { } catch (err) {
/* /*
Any exception that happens while trying to execute the query. Any exception that happens while trying to change the state of the Social Graph,
will be returned to the caller without doing anything else here.
*/ */
if (err.stack !== undefined) { if (err.stack !== undefined) {
console.log('[ERROR] Client Interface -> err.stack = ' + err.stack) console.log('[ERROR] Client Interface -> err.stack = ' + err.stack)
+6 -7
View File
@@ -1,8 +1,7 @@
exports.newSocialTradingModulesEvent = function newSocialTradingModulesEvent() { exports.newSocialTradingModulesEvent = function newSocialTradingModulesEvent() {
/* /*
An Event is anything that happens system wide that An Event is an action taken by users that triggers a
needs to be delivered to relevant entities via change at the social graph.
the Superalgos Network.
An Event (in contrast to a Query) produces a change An Event (in contrast to a Query) produces a change
on the state of the social graph. on the state of the social graph.
@@ -115,7 +114,7 @@ exports.newSocialTradingModulesEvent = function newSocialTradingModulesEvent() {
function postingEvents() { function postingEvents() {
/* /*
Is is related to Posting? Is it related to Posting?
*/ */
if ( if (
thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.NEW_USER_POST || thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.NEW_USER_POST ||
@@ -202,7 +201,7 @@ exports.newSocialTradingModulesEvent = function newSocialTradingModulesEvent() {
function followingEvents() { function followingEvents() {
/* /*
Is is a following? Is it a following?
*/ */
if ( if (
thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.FOLLOW_USER_PROFILE || thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.FOLLOW_USER_PROFILE ||
@@ -292,7 +291,7 @@ exports.newSocialTradingModulesEvent = function newSocialTradingModulesEvent() {
function reactionEvents() { function reactionEvents() {
/* /*
Is is a Reaction? Is it a Reaction?
*/ */
let targetPost let targetPost
@@ -346,7 +345,7 @@ exports.newSocialTradingModulesEvent = function newSocialTradingModulesEvent() {
function botEvents() { function botEvents() {
/* /*
Is is a Bot? Is it a Bot?
*/ */
if ( if (
thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.ADD_BOT || thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.ADD_BOT ||
@@ -72,6 +72,8 @@ exports.newSocialTradingModulesQueriesPostReplies = function newSocialTradingMod
targetPostHash: post.targetPostHash, targetPostHash: post.targetPostHash,
postType: post.postType, postType: post.postType,
timestamp: post.timestamp, timestamp: post.timestamp,
signalType: post.signalType,
signalData: post.signalData,
repliesCount: post.replies.size, repliesCount: post.replies.size,
reactions: Array.from(post.reactions) reactions: Array.from(post.reactions)
} }
@@ -67,6 +67,8 @@ exports.newSocialTradingModulesQueriesUserProfileStats = function newSocialTradi
targetPostHash: post.targetPostHash, targetPostHash: post.targetPostHash,
postType: post.postType, postType: post.postType,
timestamp: post.timestamp, timestamp: post.timestamp,
signalType: post.signalType,
signalData: post.signalData,
repliesCount: post.replies.size, repliesCount: post.replies.size,
reactions: Array.from(post.reactions) reactions: Array.from(post.reactions)
} }
@@ -0,0 +1,153 @@
exports.newSocialTradingModulesSignal = function newSocialTradingModulesSignal() {
/*
A Signal is an action taken by a bot that needs to be
delivered to all the followers of that bot respecting
the rule to deliver it fist to the bots belonging to
users with the highers ranking.
An Signal is attached to the Social Graph as a new post
from the Bot producing the signal.
*/
let thisObject = {
/* Unique Key */
signalId: undefined,
/* Referenced Entities Unique Keys */
emitterUserProfileId: undefined,
targetUserProfileId: undefined,
emitterBotProfileId: undefined,
targetBotProfileId: undefined,
emitterPostHash: undefined,
targetPostHash: undefined,
/* Signal Unique Properties */
signalType: undefined,
signalData: undefined,
timestamp: undefined,
/* Bot Related Properties */
botAsset: undefined,
botExchange: undefined,
botEnabled: undefined,
/* Framework Functions */
initialize: initialize,
finalize: finalize
}
return thisObject
function finalize() {
}
function initialize(signalReceived) {
/*
Store the message properties into this object properties.
*/
thisObject.signalId = signalReceived.signalId
thisObject.emitterUserProfileId = signalReceived.emitterUserProfileId
thisObject.targetUserProfileId = signalReceived.targetUserProfileId
thisObject.emitterBotProfileId = signalReceived.emitterBotProfileId
thisObject.targetBotProfileId = signalReceived.targetBotProfileId
thisObject.emitterPostHash = signalReceived.emitterPostHash
thisObject.targetPostHash = signalReceived.targetPostHash
thisObject.signalType = signalReceived.signalType
thisObject.signalData = signalReceived.signalData
thisObject.timestamp = signalReceived.timestamp
thisObject.botAsset = signalReceived.botAsset
thisObject.botExchange = signalReceived.botExchange
thisObject.botEnabled = signalReceived.botEnabled
/*
Local Variables
*/
let emitterUserProfile
let targetUserProfile
let emitterBotProfile
let targetBotProfile
/*
Validate Emitter User Profile.
*/
if (thisObject.emitterUserProfileId === undefined) {
throw ('Emitter User Profile Id Not Provided.')
}
emitterUserProfile = SA.projects.network.globals.memory.maps.USER_PROFILES_BY_ID.get(thisObject.emitterUserProfileId)
if (emitterUserProfile === undefined) {
throw ('Emitter User Profile Not Found.')
}
/*
Validate Target User Profile.
*/
if (thisObject.targetUserProfileId !== undefined) {
targetUserProfile = SA.projects.network.globals.memory.maps.USER_PROFILES_BY_ID.get(thisObject.targetUserProfileId)
if (targetUserProfile === undefined) {
throw ('Target User Profile Not Found.')
}
}
/*
Validate Emitter Bot Profile.
*/
if (thisObject.emitterBotProfileId !== undefined) {
emitterBotProfile = emitterUserProfile.bots.get(thisObject.emitterBotProfileId)
if (emitterBotProfile === undefined) {
throw ('Emitter Bot Profile Not Found.')
}
}
/*
Validate Target Bot Profile.
*/
if (thisObject.targetBotProfileId !== undefined) {
targetBotProfile = emitterUserProfile.bots.get(thisObject.targetBotProfileId)
if (targetBotProfile === undefined) {
throw ('Target Bot Profile Not Found.')
}
}
if (tradingSignals()) {
signalCounters()
return
}
function tradingSignals() {
/*
Is it related to Trading?
*/
if (
thisObject.signalType === SA.projects.socialTrading.globals.signalTypes.TRIGGER_ON ||
thisObject.signalType === SA.projects.socialTrading.globals.signalTypes.TRIGGER_OFF ||
thisObject.signalType === SA.projects.socialTrading.globals.signalTypes.TAKE_POSITION ||
thisObject.signalType === SA.projects.socialTrading.globals.signalTypes.CLOSE_POSITION
) {
/*
We will create a new Bot Post with the Signal info attached to it.
*/
if (emitterBotProfile === undefined) {
throw ('Emitter Bot Profile Id Not Provided.')
}
emitterBotProfile.addPost(
thisObject.emitterUserProfileId,
thisObject.targetUserProfileId,
thisObject.emitterBotProfileId,
thisObject.targetBotProfileId,
thisObject.emitterPostHash,
thisObject.targetPostHash,
SA.projects.socialTrading.globals.postTypes.SIGNAL_POST,
thisObject.timestamp,
thisObject.signalType,
thisObject.signalData
)
return true
}
}
function signalCounters() {
emitterUserProfile.emitterSignalsCount++
if (targetUserProfile !== undefined) {
targetUserProfile.targetSignalsCount++
}
if (emitterBotProfile !== undefined) {
emitterUserProfile.emitterSignalsCount++
}
if (targetBotProfile !== undefined) {
targetBotProfile.targetSignalsCount++
}
}
}
}
@@ -0,0 +1,13 @@
exports.newSocialTradingGlobalsPostTypes = function () {
let thisObject = {
/* Post Types */
NEW_POST: 0,
REPLY_TO_POST: 1,
REPOST: 2,
QUOTE_REPOST: 3,
SIGNAL_POST: 4
}
return thisObject
}
@@ -0,0 +1,15 @@
exports.newSocialTradingGlobalsReactionTypes = function () {
let thisObject = {
/* Reaction Types */
REACTION_LIKE: 0,
REACTION_LOVE: 1,
REACTION_HAHA: 2,
REACTION_WOW: 3,
REACTION_SAD: 4,
REACTION_ANGRY: 5,
REACTION_CARE: 6
}
return thisObject
}
@@ -0,0 +1,12 @@
exports.newSocialTradingGlobalsSignalTypes = function () {
let thisObject = {
/* Trading Signals */
TRIGGER_ON: 10,
TRIGGER_OFF: 11,
TAKE_POSITION: 12,
CLOSE_POSITION: 13
}
return thisObject
}
@@ -75,7 +75,9 @@ exports.newSocialTradingModulesSocialGraphBotProfile = function newSocialTrading
emitterPostHash, emitterPostHash,
targetPostHash, targetPostHash,
postType, postType,
timestamp timestamp,
signalType,
signalData
) { ) {
if (thisObject.posts.get(emitterPostHash) !== undefined) { if (thisObject.posts.get(emitterPostHash) !== undefined) {
throw ('Post Already Exists.') throw ('Post Already Exists.')
@@ -89,7 +91,9 @@ exports.newSocialTradingModulesSocialGraphBotProfile = function newSocialTrading
emitterPostHash, emitterPostHash,
targetPostHash, targetPostHash,
postType, postType,
timestamp timestamp,
signalType,
signalData
) )
thisObject.posts.set(emitterPostHash, post) thisObject.posts.set(emitterPostHash, post)
@@ -1,6 +1,6 @@
exports.newSocialTradingModulesSocialGraphPost = function newSocialTradingModulesSocialGraphPost() { exports.newSocialTradingModulesSocialGraphPost = function newSocialTradingModulesSocialGraphPost() {
/* /*
Posts represent a collection of multimedia content sorted somewhere else Posts represent a collection of multimedia content stored somewhere else
and identified by that content hash. Posts might belong to: and identified by that content hash. Posts might belong to:
* a User Profile. * a User Profile.
* a Bot Profile. * a Bot Profile.
@@ -23,6 +23,9 @@ exports.newSocialTradingModulesSocialGraphPost = function newSocialTradingModule
/* Post Unique Properties */ /* Post Unique Properties */
postType: undefined, postType: undefined,
timestamp: undefined, timestamp: undefined,
/* Signal Related Properties */
signalType: undefined,
signalData: undefined,
/* Maps */ /* Maps */
replies: undefined, replies: undefined,
reactions: undefined, reactions: undefined,
@@ -34,33 +37,16 @@ exports.newSocialTradingModulesSocialGraphPost = function newSocialTradingModule
finalize: finalize finalize: finalize
} }
const POST_TYPES = {
NEW_POST: 0,
REPLY_TO_POST: 1,
REPOST_: 2,
QUOTE_REPOST_: 3
}
const REACTION_TYPES = {
REACTION_LIKE: 0,
REACTION_LOVE: 1,
REACTION_HAHA: 2,
REACTION_WOW: 3,
REACTION_SAD: 4,
REACTION_ANGRY: 5,
REACTION_CARE: 6
}
thisObject.replies = new Map() thisObject.replies = new Map()
thisObject.reactions = new Map() thisObject.reactions = new Map()
thisObject.reactions.set(REACTION_TYPES.REACTION_LIKE, 0) thisObject.reactions.set(SA.projects.socialTrading.globals.reactionTypes.REACTION_LIKE, 0)
thisObject.reactions.set(REACTION_TYPES.REACTION_LOVE, 0) thisObject.reactions.set(SA.projects.socialTrading.globals.reactionTypes.REACTION_LOVE, 0)
thisObject.reactions.set(REACTION_TYPES.REACTION_HAHA, 0) thisObject.reactions.set(SA.projects.socialTrading.globals.reactionTypes.REACTION_HAHA, 0)
thisObject.reactions.set(REACTION_TYPES.REACTION_WOW, 0) thisObject.reactions.set(SA.projects.socialTrading.globals.reactionTypes.REACTION_WOW, 0)
thisObject.reactions.set(REACTION_TYPES.REACTION_SAD, 0) thisObject.reactions.set(SA.projects.socialTrading.globals.reactionTypes.REACTION_SAD, 0)
thisObject.reactions.set(REACTION_TYPES.REACTION_ANGRY, 0) thisObject.reactions.set(SA.projects.socialTrading.globals.reactionTypes.REACTION_ANGRY, 0)
thisObject.reactions.set(REACTION_TYPES.REACTION_CARE, 0) thisObject.reactions.set(SA.projects.socialTrading.globals.reactionTypes.REACTION_CARE, 0)
return thisObject return thisObject
@@ -77,7 +63,9 @@ exports.newSocialTradingModulesSocialGraphPost = function newSocialTradingModule
emitterPostHash, emitterPostHash,
targetPostHash, targetPostHash,
postType, postType,
timestamp timestamp,
signalType,
signalData
) { ) {
thisObject.emitterUserProfileId = emitterUserProfileId thisObject.emitterUserProfileId = emitterUserProfileId
@@ -88,13 +76,15 @@ exports.newSocialTradingModulesSocialGraphPost = function newSocialTradingModule
thisObject.targetPostHash = targetPostHash thisObject.targetPostHash = targetPostHash
thisObject.postType = postType thisObject.postType = postType
thisObject.timestamp = timestamp thisObject.timestamp = timestamp
thisObject.signalType = signalType
thisObject.signalData = signalData
/* /*
Let's find the Target Post Let's find the Target Post
*/ */
if ( if (
thisObject.postType === POST_TYPES.REPLY_TO_POST || thisObject.postType === SA.projects.socialTrading.globals.postTypes.REPLY_TO_POST ||
thisObject.postType === POST_TYPES.REPOST_ || thisObject.postType === SA.projects.socialTrading.globals.postTypes.REPOST ||
thisObject.postType === POST_TYPES.QUOTE_REPOST_ thisObject.postType === SA.projects.socialTrading.globals.postTypes.QUOTE_REPOST
) { ) {
/* /*
Validate Target User Profile. Validate Target User Profile.
@@ -113,7 +103,7 @@ exports.newSocialTradingModulesSocialGraphPost = function newSocialTradingModule
Let's add this post to the replies of the Target Post Let's add this post to the replies of the Target Post
*/ */
if ( if (
thisObject.postType === POST_TYPES.REPLY_TO_POST thisObject.postType === SA.projects.socialTrading.globals.postTypes.REPLY_TO_POST
) { ) {
targetPost.replies.set(thisObject.targetPostHash, thisObject.targetPostHash) targetPost.replies.set(thisObject.targetPostHash, thisObject.targetPostHash)
} }