diff --git a/.gitignore b/.gitignore
index 3d0bf0240..0ec8e557c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,3 +12,4 @@ Projects/Foundations/Icons/Thumbs.db
*.exe
node_modules
launch.json
+.idea
diff --git a/.vscode/Desktop.code-workspace b/.vscode/Desktop.code-workspace
new file mode 100644
index 000000000..97e2d4c8f
--- /dev/null
+++ b/.vscode/Desktop.code-workspace
@@ -0,0 +1,10 @@
+{
+ "folders": [
+ {
+ "path": "C:\\Superalgos"
+ }
+ ],
+ "settings": {
+ "search.maintainFileSearchCache": true
+ }
+}
\ No newline at end of file
diff --git a/.vscode/Network.code-workspace b/.vscode/Network.code-workspace
new file mode 100644
index 000000000..97e2d4c8f
--- /dev/null
+++ b/.vscode/Network.code-workspace
@@ -0,0 +1,10 @@
+{
+ "folders": [
+ {
+ "path": "C:\\Superalgos"
+ }
+ ],
+ "settings": {
+ "search.maintainFileSearchCache": true
+ }
+}
\ No newline at end of file
diff --git a/.vscode/Superalgos.code-workspace b/.vscode/Superalgos.code-workspace
new file mode 100644
index 000000000..97e2d4c8f
--- /dev/null
+++ b/.vscode/Superalgos.code-workspace
@@ -0,0 +1,10 @@
+{
+ "folders": [
+ {
+ "path": "C:\\Superalgos"
+ }
+ ],
+ "settings": {
+ "search.maintainFileSearchCache": true
+ }
+}
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 0bf7da203..e94f27f6f 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -10,6 +10,7 @@
"**/Data-Storage": true,
"**/Documentation": true,
"**/Log-Files": true,
+ "**/node_modules": true,
"**/Deprecated-Code": true
},
"search.maintainFileSearchCache": true
diff --git a/Client/MultiProject.js b/Client/MultiProject.js
deleted file mode 100644
index ba4ce0182..000000000
--- a/Client/MultiProject.js
+++ /dev/null
@@ -1,72 +0,0 @@
-exports.newMultiProject = function () {
-
- let thisObject = {
- initialize: initialize
- }
-
- return thisObject;
-
- function initialize() {
- /*
- First thing is to load the project schema file.
- */
- let PROJECTS_SCHEMA = require(global.env.PATH_TO_PROJECTS_REQUIRED + '/' + 'ProjectsSchema.json')
-
- /*
- Here we will setup the CL object, with all the
- projects and modules that will have inside.
- */
- CL.projects = {}
-
- for (let i = 0; i < PROJECTS_SCHEMA.length; i++) {
- let projectDefinition = PROJECTS_SCHEMA[i]
- global.CL.projects[projectDefinition.propertyName] = {}
- let projectInstance = global.CL.projects[projectDefinition.propertyName]
-
- projectInstance.utilities = {}
- projectInstance.globals = {}
- projectInstance.functionLibraries = {}
- projectInstance.taskModules = {}
- projectInstance.processModules = {}
- projectInstance.botModules = {}
-
- if (projectDefinition.CL === undefined) { continue }
-
- /* Set up Utilities of this Project */
- if (projectDefinition.CL.utilities !== undefined) {
- for (let j = 0; j < projectDefinition.CL.utilities.length; j++) {
- let utilityDefinition = projectDefinition.CL.utilities[j]
- let path = global.env.PATH_TO_PROJECTS_REQUIRED + '/' + projectDefinition.name + '/' + 'CL' + '/' + 'Utilities' + '/' + utilityDefinition.fileName
-
- let requiredObject = require(path)
- let requiredFunction = requiredObject[utilityDefinition.functionName]
- projectInstance.utilities[utilityDefinition.propertyName] = requiredFunction.call()
- }
- }
-
- /* Set up Globals of this Project */
- if (projectDefinition.CL.globals !== undefined) {
- for (let j = 0; j < projectDefinition.CL.globals.length; j++) {
- let globalDefinition = projectDefinition.CL.globals[j]
- let path = global.env.PATH_TO_PROJECTS_REQUIRED + '/' + projectDefinition.name + '/' + 'CL' + '/' + 'Globals' + '/' + globalDefinition.fileName
-
- let requiredObject = require(path)
- let requiredFunction = requiredObject[globalDefinition.functionName]
- projectInstance.globals[globalDefinition.propertyName] = requiredFunction.call()
- }
- }
-
- /* Set up Function Libraries of this Project */
- if (projectDefinition.CL.functionLibraries !== undefined) {
- for (let j = 0; j < projectDefinition.CL.functionLibraries.length; j++) {
- let functionLibraryDefinition = projectDefinition.CL.functionLibraries[j]
- let path = global.env.PATH_TO_PROJECTS_REQUIRED + '/' + projectDefinition.name + '/' + 'CL' + '/' + 'Function-Libraries' + '/' + functionLibraryDefinition.fileName
-
- let requiredObject = require(path)
- let requiredFunction = requiredObject[functionLibraryDefinition.functionName]
- projectInstance.functionLibraries[functionLibraryDefinition.propertyName] = requiredFunction.call()
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/Client/WebServer/suite-dummy.html b/Client/WebServer/suite-dummy.html
deleted file mode 100644
index 78b108803..000000000
--- a/Client/WebServer/suite-dummy.html
+++ /dev/null
@@ -1,54 +0,0 @@
-
Trading Engine
-
-
-
-
-
-
-
-The trading engine hierarchy is the data structure used by the trading bot to keep runtime information highly accessible and exposed to others.
-
-
-
-You will use this hierarchy for two main purposes:
-
-The hierarchy exposes—literally—all the information processed by the trading bot, providing a comprehensive feedback loop to trading systems and analysis capabilities to users. The hierarchy exposes—literally—all the information processed by the trading bot, providing a comprehensive feedback loop to trading systems and analysis capabilities to users.
-
-
-
- To let your trading systems: This allows strategies to keep track of and react to current and past events—including those involving the exchange, such as orders placed or filled—as the bot is running.
-
-
- To keep track of the actions: By analyzing runtime information, you may gain a detailed understanding of what happens, when, and why, throughout a trading session.
-
-
-
-The hierarchy exposes—literally—all the information processed by the trading bot, providing a comprehensive feedback loop to trading systems and analysis capabilities to users.
-
-Este callout se usa para resaltar una idea particularmente importante. Algo se sobresale, como una conclusion, o algo por el estilo.
-
-The hierarchy exposes all the information processed by the trading bot, providing a comprehensive feedback loop to trading systems and analysis capabilities to users. The hierarchy exposes all the information processed by the trading bot, providing a comprehensive feedback loop to trading systems and analysis capabilities to users.
-
- Note: Esto es una nota, algo noteworthy.
-
- Tip: Esto es un tip.
-
- Important: Esto es algo importante.
-
- Warning: Esto es una aviso de alerta.
-
-Adding a Trading Engine Node
-
-Calculo que con este segundo nivel de titulo alcanza.
-
-
-
-
-
-
-
-
-
-The trading engine hierarchy is the data structure used by the trading bot to keep runtime information highly accessible and exposed to others.
-
-
diff --git a/Client/httpInterface.js b/Client/httpInterface.js
deleted file mode 100644
index 7d89e508e..000000000
--- a/Client/httpInterface.js
+++ /dev/null
@@ -1,2123 +0,0 @@
-exports.newHttpInterface = function newHttpInterface() {
-
- /*
- IMPORTANT: If you are reviewing the code of the project please note
- that this file is the single file in the whole system that accumulated
- more technical debt by far. I did not have the time yet to pay the
- technical debt, and therefore there is a lot to reorganize in here.
- I will remove this note once this job is done.
- */
- let thisObject = {
- initialize: initialize,
- finalize: finalize,
- run: run
- }
-
- const open = require('open')
-
- let port = global.env.HTTP_INTERFACE_PORT
-
- let http = require('http')
- let isHttpServerStarted = false
-
- let webhook = new Map()
-
- return thisObject
-
- function finalize() {
-
- }
-
- function initialize() {
-
- }
-
- function run() {
- startHtttpServer()
- }
-
- function startHtttpServer() {
-
- try {
- if (isHttpServerStarted === false) {
- gWebServer = http.createServer(onBrowserRequest).listen(port)
- isHttpServerStarted = true
- /* Starting the browser now is optional */
- if (process.argv.includes("noBrowser")) {
- //Running Client only with no UI.
- } else {
- open('http://localhost:' + port)
- }
-
- }
- } catch (err) {
- console.log('[ERROR] httpInterface -> startHtttpServer -> Error = ' + err.stack)
- }
- }
-
- function onBrowserRequest(httpRequest, httpResponse) {
-
- function getBody(callback) { // Gets the de body from a POST httpRequest to the web server
- try {
-
- let body = ''
-
- httpRequest.on('data', function (data) {
- body += data
- // Too much POST data
- //if (body.length > 1e6) {
- // httpRequest.connection.destroy()
- //}
- })
-
- httpRequest.on('end', function () {
- callback(body)
- })
-
- httpRequest.on('error', function (err) {
- console.log('[INFO] httpInterface -> onBrowserRequest -> getBody -> err = ' + err.stack)
- respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
- })
- } catch (err) {
- console.log('[INFO] httpInterface -> onBrowserRequest -> getBody -> err = ' + err.stack)
- respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
- }
- }
-
- let requestParameters = httpRequest.url.split('/')
-
- requestParameters = httpRequest.url.split('?') // Remove version information
- requestParameters = requestParameters[0].split('/')
-
- switch (requestParameters[1]) {
-
- case 'WEB3':
- {
- getBody(processRequest)
-
- async function processRequest(body) {
- try {
- let params = JSON.parse(body)
-
- switch (params.method) {
- case 'getNetworkClientStatus': {
-
- let serverResponse = await CL.servers.WEB3_SERVER.getNetworkClientStatus(
- params.host,
- params.port,
- params.interface
- )
-
- respondWithContent(JSON.stringify(serverResponse), httpResponse)
- return
- }
- case 'createWalletAccount': {
-
- let serverResponse = await CL.servers.WEB3_SERVER.createWalletAccount(
- params.entropy
- )
-
- respondWithContent(JSON.stringify(serverResponse), httpResponse)
- return
- }
- case 'getWalletBalances': {
-
- let serverResponse = await CL.servers.WEB3_SERVER.getWalletBalances(
- params.host,
- params.port,
- params.interface,
- params.walletDefinition
- )
-
- respondWithContent(JSON.stringify(serverResponse), httpResponse)
- return
- }
- case 'signData': {
-
- let serverResponse = await CL.servers.WEB3_SERVER.signData(
- params.privateKey,
- params.data
- )
-
- respondWithContent(JSON.stringify(serverResponse), httpResponse)
- return
- }
- case 'recoverAddress': {
-
- let serverResponse = await CL.servers.WEB3_SERVER.recoverAddress(
- params.signature
- )
-
- respondWithContent(JSON.stringify(serverResponse), httpResponse)
- return
- }
- case 'mnemonicToPrivateKey': {
-
- let serverResponse = await CL.servers.WEB3_SERVER.mnemonicToPrivateKey(
- params.mnemonic
- )
-
- respondWithContent(JSON.stringify(serverResponse), httpResponse)
- return
- }
- default: {
- respondWithContent(JSON.stringify({ error: 'Method ' + params.method + ' is invalid.' }), httpResponse)
- }
- }
- } catch (err) {
- console.log('[ERROR] httpInterface -> WEB3s -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> WEB3s -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> WEB3s -> Params Received = ' + body)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- }
- break
- }
-
- case 'CCXT':
- {
- getBody(processRequest)
-
- async function processRequest(body) {
- try {
- let params = JSON.parse(body)
-
- const ccxt = require('ccxt')
-
- switch (params.method) {
- case 'fetchMarkets': {
-
- const exchangeClass = ccxt[params.exchangeId]
- const exchangeConstructorParams = {
- 'timeout': 30000,
- 'enableRateLimit': true,
- verbose: false
- }
-
- let ccxtExchange = new exchangeClass(exchangeConstructorParams)
- let ccxtMarkets = []
-
- if (ccxtExchange.has.fetchMarkets === true) {
- ccxtMarkets = await ccxtExchange.fetchMarkets()
- }
- respondWithContent(JSON.stringify(ccxtMarkets), httpResponse)
- return
- }
- case 'listExchanges': {
- let exchanges = []
- for (let i = 0; i < ccxt.exchanges.length; i++) {
- let exchangeId = ccxt.exchanges[i]
-
- const exchangeClass = ccxt[exchangeId]
- const exchangeConstructorParams = {
- 'timeout': 30000,
- 'enableRateLimit': true,
- verbose: false
- }
- let ccxtExchange
- try { ccxtExchange = new exchangeClass(exchangeConstructorParams) }
- catch (err) { }
- if (ccxtExchange === undefined) { continue }
-
-
- if (ccxtExchange.has.fetchOHLCV === params.has.fetchOHLCV) {
- if (ccxtExchange.has.fetchMarkets === params.has.fetchMarkets) {
- if (ccxtExchange.timeframes['1m'] !== undefined) {
- let exchange = {
- name: ccxtExchange.name,
- id: ccxtExchange.id
- }
- exchanges.push(exchange)
- }
- }
- }
- }
- respondWithContent(JSON.stringify(exchanges), httpResponse)
- return
- }
- }
-
- let content = {
- err: global.DEFAULT_FAIL_RESPONSE // method not supported
- }
- } catch (err) {
- console.log('[INFO] httpInterface -> CCXT FetchMarkets -> Could not fetch markets.')
- let error = {
- result: 'Fail Because',
- message: err.message
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- }
- break
- }
- break
-
- case 'Webhook':
- {
- switch (requestParameters[2]) { // switch by command
- case 'Fetch-Messages': {
- let exchange = requestParameters[3]
- let market = requestParameters[4]
-
- /* Some validations */
- if (exchange === undefined) {
- console.log('[WARN] httpInterface -> Webhook -> Fetch-Messages -> Message with no Exchange received -> messageReceived = ' + messageReceived)
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- return
- }
- if (market === undefined) {
- console.log('[WARN] httpInterface -> Webhook -> Fetch-Messages -> Message with no market received -> messageReceived = ' + messageReceived)
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- return
- }
-
- let key = exchange + '-' + market
-
- let webhookMessages = webhook.get(key)
- if (webhookMessages === undefined) {
- webhookMessages = []
- }
-
- console.log('[INFO] httpInterface -> Webhook -> Fetch-Messages -> Exchange-Market = ' + exchange + '-' + market)
- console.log('[INFO] httpInterface -> Webhook -> Fetch-Messages -> Messeges Fetched by Webhooks Sensor Bot = ' + webhookMessages.length)
-
- respondWithContent(JSON.stringify(webhookMessages), httpResponse)
- webhookMessages = []
-
- webhook.set(key, webhookMessages)
- break
- }
- case 'New-Message': {
- getBody(processRequest)
-
- function processRequest(messageReceived) {
- let timestamp = (new Date()).valueOf()
- let source = requestParameters[3]
- let exchange = requestParameters[4]
- let market = requestParameters[5]
-
- /* Some validations */
- if (source === undefined) {
- console.log('[WARN] httpInterface -> Webhook -> New-Message -> Message with no Source received -> messageReceived = ' + messageReceived)
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- return
- }
- if (exchange === undefined) {
- console.log('[WARN] httpInterface -> Webhook -> New-Message -> Message with no Exchange received -> messageReceived = ' + messageReceived)
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- return
- }
- if (market === undefined) {
- console.log('[WARN] httpInterface -> Webhook -> New-Message -> Message with no market received -> messageReceived = ' + messageReceived)
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- return
- }
-
- let key = exchange + '-' + market
-
- let webhookMessages = webhook.get(key)
- if (webhookMessages === undefined) {
- webhookMessages = []
- }
-
- webhookMessages.push([timestamp, source, messageReceived])
- webhook.set(key, webhookMessages)
-
- console.log('[INFO] httpInterface -> Webhook -> New-Message -> Exchange-Market = ' + exchange + '-' + market)
- console.log('[INFO] httpInterface -> Webhook -> New-Message -> messageReceived = ' + messageReceived)
- console.log('[INFO] httpInterface -> Webhook -> New-Message -> Messeges waiting to be Fetched by Webhooks Sensor Bot = ' + webhookMessages.length)
- respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
- }
- break
- }
- }
- break
- }
- break
-
- case 'Docs':
- {
- switch (requestParameters[2]) { // switch by command
- case 'Save-Node-Schema': {
- getBody(processRequest)
-
- async function processRequest(body) {
- try {
- let docsSchema = JSON.parse(body)
- let project = requestParameters[3]
- let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Schemas/Docs-Nodes'
-
- if (checkAllSchmemaDocuments('Node', docsSchema, filePath) === true) {
- respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
- } else {
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- }
-
- } catch (err) {
- console.log('[ERROR] httpInterface -> Docs -> Save-Node-Schema -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> Docs -> Save-Node-Schema -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> Docs -> Save-Node-Schema -> Params Received = ' + body)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- }
- break
- }
-
- case 'Save-Concept-Schema': {
- getBody(processRequest)
-
- async function processRequest(body) {
- try {
- let docsSchema = JSON.parse(body)
- let project = requestParameters[3]
- let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Schemas/Docs-Concepts'
-
- if (checkAllSchmemaDocuments('Concept', docsSchema, filePath) === true) {
- respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
- } else {
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- }
-
- } catch (err) {
- console.log('[ERROR] httpInterface -> Docs -> Save-Concept-Schema -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> Docs -> Save-Concept-Schema -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> Docs -> Save-Concept-Schema -> Params Received = ' + body)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- }
- break
- }
-
- case 'Save-Topic-Schema': {
- getBody(processRequest)
-
- async function processRequest(body) {
- try {
- let docsSchema = JSON.parse(body)
- let project = requestParameters[3]
- let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Schemas/Docs-Topics'
-
- if (checkAllSchmemaDocuments('Topic', docsSchema, filePath) === true) {
- respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
- } else {
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- }
-
- } catch (err) {
- console.log('[ERROR] httpInterface -> Docs -> Save-Topic-Schema -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> Docs -> Save-Topic-Schema -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> Docs -> Save-Topic-Schema -> Params Received = ' + body)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- }
- break
- }
-
- case 'Save-Tutorial-Schema': {
- getBody(processRequest)
-
- async function processRequest(body) {
- try {
- let docsSchema = JSON.parse(body)
- let project = requestParameters[3]
- let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Schemas/Docs-Tutorials'
-
- if (checkAllSchmemaDocuments('Tutorial', docsSchema, filePath) === true) {
- respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
- } else {
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- }
-
- } catch (err) {
- console.log('[ERROR] httpInterface -> Docs -> Save-Tutorial-Schema -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> Docs -> Save-Tutorial-Schema -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> Docs -> Save-Tutorial-Schema -> Params Received = ' + body)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- }
- break
- }
-
- case 'Save-Review-Schema': {
- getBody(processRequest)
-
- async function processRequest(body) {
- try {
- let docsSchema = JSON.parse(body)
- let project = requestParameters[3]
- let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Schemas/Docs-Reviews'
-
- if (checkAllSchmemaDocuments('Review', docsSchema, filePath) === true) {
- respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
- } else {
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- }
-
- } catch (err) {
- console.log('[ERROR] httpInterface -> Docs -> Save-Review-Schema -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> Docs -> Save-Review-Schema -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> Docs -> Save-Review-Schema -> Params Received = ' + body)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- }
- break
- }
-
- case 'Save-Book-Schema': {
- getBody(processRequest)
-
- async function processRequest(body) {
- try {
- let docsSchema = JSON.parse(body)
- let project = requestParameters[3]
- let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Schemas/Docs-Books'
-
- if (checkAllSchmemaDocuments('Book', docsSchema, filePath) === true) {
- respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
- } else {
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- }
-
- } catch (err) {
- console.log('[ERROR] httpInterface -> Docs -> Save-Book-Schema -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> Docs -> Save-Book-Schema -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> Docs -> Save-Book-Schema -> Params Received = ' + body)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- }
- break
- }
- }
-
- function checkAllSchmemaDocuments(category, docsSchema, filePath) {
- const fs = require('fs')
- let noErrorsDuringSaving = true
-
- for (let i = 0; i < docsSchema.length; i++) {
- let schemaDocument = docsSchema[i]
- /*
- For some type of schemas we will save the file at an extra
- folder derived from the document's type.
- */
- let fileName = schemaDocument.type.toLowerCase()
- for (let j = 0; j < 10; j++) {
- fileName = cleanFileName(fileName)
- }
- let pageNumber = '00' + schemaDocument.pageNumber
- let newFilepath = filePath
- switch (category) {
- case 'Topic': {
- fileName = schemaDocument.topic.toLowerCase() + '-' + pageNumber.substring(pageNumber.length - 3, pageNumber.length) + '-' + schemaDocument.type.toLowerCase()
- fileName = cleanFileName(fileName)
- newFilepath = createPrefixDirectories(filePath, schemaDocument.topic)
- break
- }
- case 'Tutorial': {
- fileName = schemaDocument.tutorial.toLowerCase() + '-' + pageNumber.substring(pageNumber.length - 3, pageNumber.length) + '-' + schemaDocument.type.toLowerCase()
- fileName = cleanFileName(fileName)
- newFilepath = createPrefixDirectories(filePath, schemaDocument.tutorial)
- break
- }
- case 'Review': {
- fileName = schemaDocument.review.toLowerCase() + '-' + pageNumber.substring(pageNumber.length - 3, pageNumber.length) + '-' + schemaDocument.type.toLowerCase()
- fileName = cleanFileName(fileName)
- newFilepath = createPrefixDirectories(filePath, schemaDocument.review)
- break
- }
- case 'Node': {
- newFilepath = createPrefixDirectories(filePath, schemaDocument.type)
- break
- }
- case 'Concept': {
- newFilepath = createPrefixDirectories(filePath, schemaDocument.type)
- break
- }
- }
-
- function createPrefixDirectories(filePath, schemaTextToUse) {
- let firstLetter = schemaTextToUse.substring(0, 1)
- createNewDir(filePath + '/' + firstLetter)
- let extraWord = schemaTextToUse.split(' ')[0]
- createNewDir(filePath + '/' + firstLetter + '/' + extraWord)
- return filePath + '/' + firstLetter + '/' + extraWord + '/' + cleanFileName(schemaTextToUse)
- }
-
- fileName = fileName + '.json'
-
- if (schemaDocument.deleted === true) {
- try {
- fs.unlinkSync(newFilepath + '/' + fileName)
- console.log('[SUCCESS] ' + newFilepath + '/' + fileName + ' deleted.')
- } catch (err) {
- noErrorsDuringSaving = false
- console.log('[ERROR] httpInterface -> Docs -> Delete -> ' + newFilepath + '/' + fileName + ' could not be deleted.')
- console.log('[ERROR] httpInterface -> Docs -> Delete -> Resolve the issue that is preventing the Client to delete this file. Look at the error message below as a guide. At the UI you will need to delete this page again in order for the Client to retry next time you execute the docs.save command.')
- console.log('[ERROR] httpInterface -> Docs -> Delete -> err.stack = ' + err.stack)
- }
- } else {
- if (schemaDocument.updated === true || schemaDocument.created === true) {
- try {
- let created = schemaDocument.created
- let updated = schemaDocument.updated
- schemaDocument.updated = undefined
- schemaDocument.created = undefined
- let fileContent = JSON.stringify(schemaDocument, undefined, 4)
- createNewDir(newFilepath)
- fs.writeFileSync(newFilepath + '/' + fileName, fileContent)
- if (created === true) {
- console.log('[SUCCESS] ' + newFilepath + '/' + fileName + ' created.')
- } else {
- if (updated === true) {
- console.log('[SUCCESS] ' + newFilepath + '/' + fileName + ' updated.')
- }
- }
- } catch (err) {
- noErrorsDuringSaving = false
- console.log('[ERROR] httpInterface -> Docs -> Save -> ' + newFilepath + '/' + fileName + ' could not be created / updated.')
- console.log('[ERROR] httpInterface -> Docs -> Save -> err.stack = ' + err.stack)
- }
- }
- }
-
- function createNewDir(path) {
- try {
- fs.mkdirSync(path)
- } catch (err) {
- if (err.message.indexOf('file already exists') < 0) {
- throw (err)
- }
- }
- }
- }
-
- return noErrorsDuringSaving
- }
-
- function cleanFileName(fileName) {
- for (let i = 0; i < 100; i++) {
- fileName = fileName
- .replace(' ', '-')
- .replace('--', '-')
- .replace('?', '')
- .replace('#', '')
- .replace('$', '')
- .replace('%', '')
- .replace('^', '')
- .replace('&', '')
- .replace('*', '')
- .replace('(', '')
- .replace(')', '')
- .replace('!', '')
- .replace('..', '.')
- .replace(',', '')
- .replace('\'', '')
- }
- return fileName
- }
- }
- break
-
- case 'App': {
- switch (requestParameters[2]) { // switch by command
- case 'Contribute': {
- try {
- let commitMessage = unescape(requestParameters[3])
- const username = unescape(requestParameters[4])
- const token = unescape(requestParameters[5])
- const currentBranch = unescape(requestParameters[6])
- const contributionsBranch = unescape(requestParameters[7])
- let error
-
- /* Unsavping # */
- for (let i = 0; i < 10; i++) {
- commitMessage = commitMessage.replace('_SLASH_', '/')
- commitMessage = commitMessage.replace('_HASHTAG_', '#')
- }
-
- contribute()
-
- async function contribute() {
- const { lookpath } = require('lookpath');
- const gitpath = await lookpath('git');
- if (gitpath === undefined) {
- console.log('[ERROR] `git` not installed.')
- } else {
- await doGit()
- if (error !== undefined) {
-
- let docs = {
- project: 'Foundations',
- category: 'Topic',
- type: 'App Error - Contribution Not Sent',
- anchor: undefined,
- placeholder: {}
- }
-
- respondWithDocsObject(docs, error)
- return
- }
-
- await doGithub()
- if (error !== undefined) {
-
- let docs = {
- project: 'Foundations',
- category: 'Topic',
- type: 'App Error - Contribution Not Sent',
- anchor: undefined,
- placeholder: {}
- }
- console.log('respond with docs ')
-
- respondWithDocsObject(docs, error)
- return
- }
- respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
- }
- }
-
- async function doGit() {
- const simpleGit = require('simple-git');
- const options = {
- baseDir: process.cwd(),
- binary: 'git',
- maxConcurrentProcesses: 6,
- }
- const git = simpleGit(options)
-
- try {
- await git.add('./*')
- await git.commit(commitMessage)
- await git.push('origin', currentBranch)
- } catch (err) {
- console.log('[ERROR] httpInterface -> App -> Contribute -> doGit -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> App -> Contribute -> doGit -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> App -> Contribute -> doGit -> commitMessage = ' + commitMessage)
- console.log('[ERROR] httpInterface -> App -> Contribute -> doGit -> currentBranch = ' + currentBranch)
- console.log('[ERROR] httpInterface -> App -> Contribute -> doGit -> contributionsBranch = ' + contributionsBranch)
- console.log('')
- console.log('Torubleshooting Tips:')
- console.log('')
- console.log('1. Make sure that you have set up your Github Username and Token at the APIs -> Github API node at the workspace.')
- console.log('2. Make sure you are running the latest version of Git available for your OS.')
- console.log('3. Make sure that you have cloned your Superalgos repository fork, and not the main Superalgos repository.')
- console.log('4. If your fork is old, you might need to do an app.update and also a node setup at every branch. If you just reforked all is good.')
- error = err
- }
- }
-
- async function doGithub() {
-
- const { Octokit } = require("@octokit/rest")
-
- const octokit = new Octokit({
- auth: token,
- userAgent: 'Superalgos Beta 11'
- })
-
- const repo = 'Superalgos'
- const owner = 'Superalgos'
- const head = username + ':' + contributionsBranch
- const base = currentBranch
- const title = 'Contribution: ' + commitMessage
-
- try {
- await octokit.pulls.create({
- owner,
- repo,
- title,
- head,
- base,
- });
- } catch (err) {
- if (err.stack.indexOf('A pull request already exists') >= 0) {
- return
- } else {
- console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> commitMessage = ' + commitMessage)
- console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> username = ' + username)
- console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> token starts with = ' + token.substring(0, 10) + '...')
- console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> token ends with = ' + '...' + token.substring(token.length - 10))
- console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> currentBranch = ' + currentBranch)
- console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> contributionsBranch = ' + contributionsBranch)
- error = err
- }
- }
- }
-
- } catch (err) {
- console.log('[ERROR] httpInterface -> App -> Contribute -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> App -> Contribute -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> App -> Contribute -> commitMessage = ' + commitMessage)
- console.log('[ERROR] httpInterface -> App -> Contribute -> username = ' + username)
- console.log('[ERROR] httpInterface -> App -> Contribute -> token starts with = ' + token.substring(0, 10) + '...')
- console.log('[ERROR] httpInterface -> App -> Contribute -> token ends with = ' + '...' + token.substring(token.length - 10))
- console.log('[ERROR] httpInterface -> App -> Contribute -> currentBranch = ' + currentBranch)
- console.log('[ERROR] httpInterface -> App -> Contribute -> contributionsBranch = ' + contributionsBranch)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- break
- }
-
- case 'Update': {
- try {
- const currentBranch = unescape(requestParameters[3])
- update()
-
- async function update() {
- const { lookpath } = require('lookpath');
- const gitpath = await lookpath('git');
- if (gitpath === undefined) {
- console.log('[ERROR] `git` not installed.')
- } else {
- let result = await doGit()
-
- if (result.error === undefined) {
- let customResponse = {
- result: global.CUSTOM_OK_RESPONSE.result,
- message: result.message
- }
- respondWithContent(JSON.stringify(customResponse), httpResponse)
- } else {
-
- let docs = {
- project: 'Foundations',
- category: 'Topic',
- type: 'App Error - Update Failed',
- anchor: undefined,
- placeholder: {}
- }
-
- respondWithDocsObject(docs, result.error)
-
- }
- }
- }
-
- async function doGit() {
- const simpleGit = require('simple-git');
- const options = {
- baseDir: process.cwd(),
- binary: 'git',
- maxConcurrentProcesses: 6,
- }
- const git = simpleGit(options)
-
- let message
- try {
- message = await git.pull('https://github.com/Superalgos/Superalgos', currentBranch)
- return { message: message }
- } catch (err) {
- console.log('[ERROR] Error updating ' + currentBranch)
- console.log(err.stack)
- return { error: err }
- }
- }
-
- } catch (err) {
- console.log('[ERROR] httpInterface -> App -> Update -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> App -> Update -> err.stack = ' + err.stack)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- break
- }
-
- case 'Checkout': {
- try {
- const currentBranch = unescape(requestParameters[3])
- let error
-
- checkout()
-
- async function checkout() {
- const { lookpath } = require('lookpath');
- const gitpath = await lookpath('git');
- if (gitpath === undefined) {
- console.log('[ERROR] `git` not installed.')
- } else {
- await doGit()
-
- if (error === undefined) {
- respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
- } else {
- let docs = {
- project: 'Foundations',
- category: 'Topic',
- type: 'Switching Branches - Current Branch Not Changed',
- anchor: undefined,
- placeholder: {}
- }
-
- respondWithDocsObject(docs, error)
- }
- }
- }
-
- async function doGit() {
- const simpleGit = require('simple-git');
- const options = {
- baseDir: process.cwd(),
- binary: 'git',
- maxConcurrentProcesses: 6,
- }
- const git = simpleGit(options)
- try {
- await git.checkout(currentBranch)
- } catch (err) {
- console.log('[ERROR] Error changing current branch to ' + currentBranch)
- console.log(err.stack)
- error = err
- }
- }
-
- } catch (err) {
- console.log('[ERROR] httpInterface -> App -> Update -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> App -> Update -> err.stack = ' + err.stack)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- break
- }
-
- case 'Branch': {
- try {
- branch()
-
- async function branch() {
- const { lookpath } = require('lookpath');
- const gitpath = await lookpath('git');
- if (gitpath === undefined) {
- console.log('[ERROR] `git` not installed.')
- } else {
- let result = await doGit()
-
- if (result.error === undefined) {
- let customResponse = {
- result: global.CUSTOM_OK_RESPONSE.result,
- message: result
- }
- respondWithContent(JSON.stringify(customResponse), httpResponse)
- } else {
- let docs = {
- project: 'Foundations',
- category: 'Topic',
- type: 'App Error - Could Not Get Current Branch',
- anchor: undefined,
- placeholder: {}
- }
-
- respondWithDocsObject(docs, error)
- }
- }
- }
-
- async function doGit() {
- const simpleGit = require('simple-git');
- const options = {
- baseDir: process.cwd(),
- binary: 'git',
- maxConcurrentProcesses: 6,
- }
- const git = simpleGit(options)
- try {
- return await git.branch()
- } catch (err) {
- console.log('[ERROR] Error reading current branch.')
- console.log(err.stack)
- }
- }
-
- } catch (err) {
- console.log('[ERROR] httpInterface -> App -> Update -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> App -> Update -> err.stack = ' + err.stack)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- break
- }
- }
-
- function respondWithDocsObject(docs, error) {
-
- if (error.message !== undefined) {
- docs.placeholder.errorMessage = {
- style: 'Error',
- text: error.message
- }
- }
- if (error.stack !== undefined) {
- docs.placeholder.errorStack = {
- style: 'Javascript',
- text: error.stack
- }
- }
- if (error.code !== undefined) {
- docs.placeholder.errorCode = {
- style: 'Json',
- text: error.code
- }
- }
-
- docs.placeholder.errorDetails = {
- style: 'Json',
- text: JSON.stringify(error, undefined, 4)
- }
-
- let customResponse = {
- result: global.CUSTOM_FAIL_RESPONSE.result,
- docs: docs
- }
-
- respondWithContent(JSON.stringify(customResponse), httpResponse)
-
- }
- }
- break
-
- case 'GOV': {
- /*
- This is the Governance endpoint at the Http Interface. All methods
- related to the Governance System are implemented here and routed
- to the backend Servers that can process them.
- */
- getBody(processRequest)
-
- async function processRequest(body) {
- try {
- let params = JSON.parse(body)
-
- switch (params.method) {
- case 'getGithubStars': {
-
- let serverResponse = await CL.servers.GITHUB_SERVER.getGithubStars(
- params.repository,
- params.username,
- params.token
- )
-
- respondWithContent(JSON.stringify(serverResponse), httpResponse)
- return
- }
- case 'getGithubWatchers': {
-
- let serverResponse = await CL.servers.GITHUB_SERVER.getGithubWatchers(
- params.repository,
- params.username,
- params.token
- )
-
- respondWithContent(JSON.stringify(serverResponse), httpResponse)
- return
- }
- case 'getGithubForks': {
-
- let serverResponse = await CL.servers.GITHUB_SERVER.getGithubForks(
- params.repository,
- params.username,
- params.token
- )
-
- respondWithContent(JSON.stringify(serverResponse), httpResponse)
- return
- }
- case 'mergePullRequests': {
-
- let serverResponse = await CL.servers.GITHUB_SERVER.mergePullRequests(
- params.commitMessage,
- params.username,
- params.token
- )
-
- respondWithContent(JSON.stringify(serverResponse), httpResponse)
- return
- }
- case 'payContributors': {
-
- let serverResponse = await CL.servers.WEB3_SERVER.payContributors(
- params.contractAddress,
- params.contractAbi,
- params.paymentsArray,
- params.mnemonic
- )
-
- respondWithContent(JSON.stringify(serverResponse), httpResponse)
- return
- }
- default: {
- respondWithContent(JSON.stringify({ error: 'Method ' + params.method + ' is invalid.' }), httpResponse)
- }
- }
- } catch (err) {
- console.log('[ERROR] httpInterface -> GOV -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> GOV -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> GOV -> Params Received = ' + body)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- }
- break
- }
-
- case 'LegacyPlotter.js':
- {
- respondWithFile(global.env.PATH_TO_CLIENT + 'WebServer/LegacyPlotter.js', httpResponse)
- }
- break
-
- case 'PlotterPanel.js':
- {
- respondWithFile(global.env.PATH_TO_CLIENT + 'WebServer/PlotterPanel.js', httpResponse)
- }
- break
-
- case 'Images': // This means the Images folder.
- {
- let path = global.env.PATH_TO_CLIENT + 'WebServer/Images/' + requestParameters[2]
-
- if (requestParameters[3] !== undefined) {
- path = path + '/' + requestParameters[3]
- }
-
- if (requestParameters[4] !== undefined) {
- path = path + '/' + requestParameters[4]
- }
-
- if (requestParameters[5] !== undefined) {
- path = path + '/' + requestParameters[5]
- }
-
- path = unescape(path)
-
- respondWithImage(path, httpResponse)
- }
- break
-
- case 'Icons': // This means the Icons folder under Projects.
- {
- let path = global.env.PATH_TO_PROJECTS + '/' + requestParameters[2] + '/Icons'
-
- if (requestParameters[3] !== undefined) {
- path = path + '/' + requestParameters[3]
- }
-
- if (requestParameters[4] !== undefined) {
- path = path + '/' + requestParameters[4]
- }
-
- if (requestParameters[5] !== undefined) {
- path = path + '/' + requestParameters[5]
- }
-
- path = unescape(path)
-
- respondWithImage(path, httpResponse)
- }
- break
-
- case 'GIFs': // This means the GIFs folder under Projects.
- {
- let path = global.env.PATH_TO_PROJECTS + '/' + requestParameters[2] + '/GIFs'
-
- if (requestParameters[3] !== undefined) {
- path = path + '/' + requestParameters[3]
- }
-
- if (requestParameters[4] !== undefined) {
- path = path + '/' + requestParameters[4]
- }
-
- if (requestParameters[5] !== undefined) {
- path = path + '/' + requestParameters[5]
- }
-
- path = unescape(path)
- respondWithImage(path, httpResponse)
- }
- break
-
- case 'PNGs': // This means the PNGs folder under Projects.
- {
- let path = global.env.PATH_TO_PROJECTS + '/' + requestParameters[2] + '/PNGs'
-
- if (requestParameters[3] !== undefined) {
- path = path + '/' + requestParameters[3]
- }
-
- if (requestParameters[4] !== undefined) {
- path = path + '/' + requestParameters[4]
- }
-
- if (requestParameters[5] !== undefined) {
- path = path + '/' + requestParameters[5]
- }
-
- path = unescape(path)
- respondWithImage(path, httpResponse)
- }
- break
-
- case 'favicon.ico': // This means the Scripts folder.
- {
- respondWithImage(global.env.PATH_TO_CLIENT + 'WebServer/Images/' + 'favicon.ico', httpResponse)
- }
- break
-
- case 'WebServer': // This means the WebServer folder.
- {
- respondWithFile(global.env.PATH_TO_CLIENT + 'WebServer/' + requestParameters[2], httpResponse)
- }
- break
-
- case 'externalScripts': // This means the WebServer folder.
- {
- respondWithFile(global.env.PATH_TO_CLIENT + 'WebServer/externalScripts/' + requestParameters[2], httpResponse)
- }
- break
-
- case 'Plotters': // This means the plotter folder, not to be confused with the Plotters script!
- {
- let project = requestParameters[2]
- let dataMine = requestParameters[3]
- let codeName = requestParameters[4]
- let moduleName = requestParameters[5]
- let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/' + 'Bots-Plotters-Code' + '/' + dataMine + '/plotters/' + codeName + '/' + moduleName
- respondWithFile(filePath, httpResponse)
- }
- break
-
- case 'ChartLayers':
- {
- respondWithFile(global.env.PATH_TO_UI + '/' + requestParameters[1] + '/' + requestParameters[2], httpResponse)
- }
- break
-
- case 'Files':
- {
- respondWithFile(global.env.PATH_TO_DATA_FILES + '/' + requestParameters[2], httpResponse)
- }
- break
-
- case 'Fonts':
- {
- respondWithFont(global.env.PATH_TO_FONTS + '/' + requestParameters[2], httpResponse)
- }
- break
-
- case 'Schema':
- {
- sendSchema(global.env.PATH_TO_PROJECTS + '/' + requestParameters[2] + '/Schemas/', requestParameters[3])
- }
- break
-
- case 'DirContent':
- {
- let folderPath = unescape(requestParameters[2])
- if (requestParameters[3] !== undefined) {
- folderPath = folderPath + '/' + requestParameters[3]
- }
-
- if (requestParameters[4] !== undefined) {
- folderPath = folderPath + '/' + requestParameters[4]
- }
-
- if (requestParameters[5] !== undefined) {
- folderPath = folderPath + '/' + requestParameters[5]
- }
- let folder
- if (requestParameters[2] === 'Root') {
- folder = folderPath.replace('Root', '../Superalgos/')
- } else {
- folder = global.env.PATH_TO_PROJECTS + '/' + folderPath
- }
-
- getAllFilesInDirectoryAndSubdirectories(folder, onFilesReady)
-
- function onFilesReady(files) {
- respondWithContent(JSON.stringify(files), httpResponse)
- }
- }
- break
-
- case 'IconNames':
- {
- let projects = getDirectories(global.env.PATH_TO_PROJECTS)
- let icons = []
- let totalProjects = projects.length
- let projectCounter = 0
-
- for (let i = 0; i < projects.length; i++) {
- let project = projects[i]
-
- const folder = global.env.PATH_TO_PROJECTS + '/' + project + '/Icons/'
-
- getAllFilesInDirectoryAndSubdirectories(folder, onFilesReady)
-
- function onFilesReady(files) {
- for (let j = 0; j < files.length; j++) {
- let file = files[j]
- for (let i = 0; i < 10; i++) {
- file = file.replace('/', '\\')
- }
- icons.push([project, file])
- }
-
- projectCounter++
- if (projectCounter === totalProjects) {
- respondWithContent(JSON.stringify(icons), httpResponse)
- }
- }
- }
- }
- break
-
- case 'PluginFileNames':
- {
- processRequest()
-
- async function processRequest(body) {
- try {
- let project = unescape(requestParameters[2])
- let folder = unescape(requestParameters[3])
-
- let response = await CL.projects.foundations.utilities.plugins.getPluginFileNames(
- project,
- folder
- )
-
- respondWithContent(JSON.stringify(response), httpResponse)
-
- } catch (err) {
- console.log('[ERROR] httpInterface -> PluginFileNames -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> PluginFileNames -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> PluginFileNames -> Params Received = ' + body)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- }
- break
- }
-
- case 'LoadPlugin':
-
- {
- processRequest()
-
- async function processRequest(body) {
- try {
- let project = unescape(requestParameters[2])
- let folder = unescape(requestParameters[3])
- let fileName = unescape(requestParameters[4])
-
- let response = await CL.projects.foundations.utilities.plugins.getPluginFileContent(
- project,
- folder,
- fileName
- ).catch(err => {
- let error = {
- result: 'Fail Because',
- message: err
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- return
- })
-
- respondWithContent(response, httpResponse)
-
- } catch (err) {
- console.log('[ERROR] httpInterface -> LoadPlugin -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> LoadPlugin -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> LoadPlugin -> Params Received = ' + body)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- }
- break
- }
-
- case 'SavePlugin':
- getBody(processRequest)
-
- async function processRequest(body) {
- try {
- let plugin = JSON.parse(body)
- let project = requestParameters[2]
- let folder = requestParameters[3]
- let fileName = requestParameters[4]
- let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Plugins/' + folder
- let fileContent = JSON.stringify(plugin, undefined, 4)
- const fs = require('fs')
- fs.writeFileSync(filePath + '/' + fileName + '.json', fileContent)
- respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
- } catch (err) {
- console.log('[ERROR] httpInterface -> SavePlugin -> Method call produced an error.')
- console.log('[ERROR] httpInterface -> SavePlugin -> err.stack = ' + err.stack)
- console.log('[ERROR] httpInterface -> SavePlugin -> Params Received = ' + body)
-
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- }
- break
-
- case 'Workspace.js':
- {
- let fs = require('fs')
-
- try {
- let filePath = global.env.PATH_TO_DEFAULT_WORKSPACE + '/Getting-Started-Tutorials.json'
- fs.readFile(filePath, onFileRead)
- } catch (e) {
- console.log('[ERROR] Error reading the Workspace.', e)
- }
-
- function onFileRead(err, workspace) {
- if (err) {
- respondWithContent(undefined, httpResponse)
- } else {
- let responseContent = 'function getWorkspace(){ return ' + workspace + '}'
- respondWithContent(responseContent, httpResponse)
- }
- }
- }
- break
-
- case 'ListWorkspaces':
- {
- let allWorkspaces = []
- let projects = getDirectories(global.env.PATH_TO_PROJECTS)
- let projectsCount = 0
-
- for (let i = 0; i < projects.length; i++) {
- let project = projects[i]
- readPluginWorkspaces()
- function readPluginWorkspaces() {
- let dirPath = global.env.PATH_TO_PROJECTS + '/' + project + '/Plugins/Workspaces'
- try {
- let fs = require('fs')
- fs.readdir(dirPath, onDirRead)
-
- function onDirRead(err, fileList) {
- let updatedFileList = []
-
- if (err) {
- /*
- If we have a problem reading this folder we will assume that it is
- because this project does not need this folder and that's it.
- */
- //console.log('[WARN] Error reading a directory content. filePath = ' + dirPath)
- } else {
- for (let i = 0; i < fileList.length; i++) {
- let name = 'Plugin \u2192 ' + fileList[i]
- updatedFileList.push([project, name])
- }
- }
- allWorkspaces = allWorkspaces.concat(updatedFileList)
- projectsCount++
- if (projectsCount === projects.length) {
- readMyWorkspaces()
- }
- }
- } catch (err) {
- console.log('[ERROR] Error reading a directory content. filePath = ' + dirPath)
- console.log('[ERROR] err.stack = ' + err.stack)
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- return
- }
- }
- }
-
- function readMyWorkspaces() {
- let dirPath = global.env.PATH_TO_MY_WORKSPACES
- try {
- let fs = require('fs')
- fs.readdir(dirPath, onDirRead)
-
- function onDirRead(err, fileList) {
- if (err) {
- // This happens the first time you run the software.
- respondWithContent(JSON.stringify(allWorkspaces), httpResponse)
- return
- } else {
- let updatedFileList = []
- for (let i = 0; i < fileList.length; i++) {
- let name = fileList[i]
- updatedFileList.push(['', name])
- }
- allWorkspaces = allWorkspaces.concat(updatedFileList)
- respondWithContent(JSON.stringify(allWorkspaces), httpResponse)
- return
- }
- }
- } catch (err) {
- console.log('[ERROR] Error reading a directory content. filePath = ' + dirPath)
- console.log('[ERROR] err.stack = ' + err.stack)
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- return
- }
- }
- }
- break
-
- case 'LoadMyWorkspace':
- {
- let fileName = unescape(requestParameters[2])
- let filePath = global.env.PATH_TO_MY_WORKSPACES + '/' + fileName + '.json'
- respondWithFile(filePath, httpResponse)
- }
- break
-
- case 'SaveWorkspace':
- {
- getBody(processRequest)
-
- async function processRequest(body) {
-
- let fileContent = body
- let fileName = unescape(requestParameters[2])
- let filePath = global.env.PATH_TO_MY_WORKSPACES + '/' + fileName + '.json'
-
- try {
- let fs = require('fs')
- let dir = global.env.PATH_TO_MY_WORKSPACES;
-
- /* Create Dir if it does not exist */
- if (!fs.existsSync(dir)) {
- fs.mkdirSync(dir);
- }
-
- fs.writeFile(filePath, fileContent, onFileWritten)
-
- function onFileWritten(err) {
- if (err) {
- console.log('[ERROR] SaveWorkspace -> onFileWritten -> Error writing the Workspace file. fileName = ' + fileName)
- console.log('[ERROR] SaveWorkspace -> onFileWritten -> err.stack = ' + err.stack)
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- } else {
- respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
- }
- }
-
- } catch (err) {
- console.log('[ERROR] SaveWorkspace -> Error writing the Workspace file. fileName = ' + fileName)
- console.log('[ERROR] SaveWorkspace -> err.stack = ' + err.stack)
- let error = {
- result: 'Fail Because',
- message: err.message,
- stack: err.stack
- }
- respondWithContent(JSON.stringify(error), httpResponse)
- }
- }
- }
- break
-
- case 'ListFunctionLibraries':
- {
- returnProjectFolderFileList('Function-Libraries')
- }
- break
-
- case 'ProjectsSchema':
- {
- let path = global.env.PATH_TO_PROJECTS + '/' + 'ProjectsSchema.json'
- respondWithFile(path, httpResponse)
- }
- break
-
- case 'ListSpaceFiles':
- {
- let fs = require('fs')
- let allFiles = []
- let projects = getDirectories(global.env.PATH_TO_PROJECTS)
- let dirCount = 0
- let totalDirs = 0
-
- for (let i = 0; i < projects.length; i++) {
- let project = projects[i]
-
- let dirPath = project + '/UI/Spaces'
- let spaces = getDirectories(global.env.PATH_TO_PROJECTS + '/' + dirPath)
-
- for (let j = 0; j < spaces.length; j++) {
- let space = spaces[j]
- readDirectory(dirPath + '/' + space)
- }
-
- function readDirectory(path) {
- try {
-
- totalDirs++
- fs.readdir(global.env.PATH_TO_PROJECTS + '/' + path, onDirRead)
-
- let otherDirs = getDirectories(global.env.PATH_TO_PROJECTS + '/' + path)
- for (let m = 0; m < otherDirs.length; m++) {
- let otherDir = otherDirs[m]
- readDirectory(path + '/' + otherDir)
- }
-
- function onDirRead(err, fileList) {
- if (err) {
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- } else {
- let updatedFileList = []
- for (let k = 0; k < fileList.length; k++) {
- let name = fileList[k]
- if (name.indexOf('.js') < 0) { continue }
- updatedFileList.push(path + '/' + name)
- }
- allFiles = allFiles.concat(updatedFileList)
- dirCount++
- if (dirCount === totalDirs) {
- respondWithContent(JSON.stringify(allFiles), httpResponse)
- }
- }
- }
- } catch (err) {
- console.log('[ERROR] Error reading a directory content. filePath = ' + path)
- console.log('[ERROR] err.stack = ' + err.stack)
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- return
- }
- }
- }
- }
- break
-
- case 'ListUtilitiesFiles':
- {
- returnProjectFolderFileList('Utilities')
- }
- break
-
- case 'ListGlobalFiles':
- {
- returnProjectFolderFileList('Globals')
- }
- break
-
- case 'Projects':
- {
- let path = ''
- for (let i = 2; i < 10; i++) {
- if (requestParameters[i] !== undefined) {
- let parameter = unescape(requestParameters[i])
- path = path + '/' + parameter
- }
-
- }
- let filePath = global.env.PATH_TO_PROJECTS + path
- respondWithFile(filePath, httpResponse)
- }
- break
-
- case 'Storage':
- {
- let pathToFile = httpRequest.url.substring(9)
- /* Unsavping # */
- for (let i = 0; i < 10; i++) {
- pathToFile = pathToFile.replace('_HASHTAG_', '#')
- }
- respondWithFile(global.env.PATH_TO_DATA_STORAGE + '/' + pathToFile, httpResponse)
- }
- break
-
- case 'main.css':
- {
- sendStyleSheet('main.css')
- }
- break
-
- case 'tutorial.css':
- {
- sendStyleSheet('tutorial.css')
- }
- break
-
- case 'docs.css':
- {
- sendStyleSheet('docs.css')
- }
- break
-
- case 'governance.css':
- {
- sendStyleSheet('governance.css')
- }
- break
-
- case 'context-menu.css':
- {
- sendStyleSheet('context-menu.css')
- }
- break
-
- case 'credits.css':
- {
- sendStyleSheet('credits.css')
- }
- break
-
- case 'docs.css':
- {
- sendStyleSheet('docs.css')
- }
- break
-
- case 'font-awasome.css':
- {
- sendStyleSheet('font-awasome.css')
- }
- break
-
- case 'prism.css':
- {
- sendStyleSheet('prism.css')
- }
- break
-
- case 'ExecuteTerminalCommand':
- {
- let command = unescape(requestParameters[2])
- executeTerminalCommand(command)
- }
- break
- default:
- {
- homePage()
- }
- }
-
- function returnProjectFolderFileList(projectFolderName) {
- {
- let allLibraries = []
- let projects = getDirectories(global.env.PATH_TO_PROJECTS)
- let projectsCount = 0
-
- for (let i = 0; i < projects.length; i++) {
- let project = projects[i]
-
- let dirPath = global.env.PATH_TO_PROJECTS + '/' + project + '/' + 'UI' + '/' + projectFolderName
- try {
- let fs = require('fs')
- fs.readdir(dirPath, onDirRead)
-
- function onDirRead(err, fileList) {
- let updatedFileList = []
- if (err) {
- /*
- If we have a problem reading this folder we will assume that it is
- because this project does not need this folder and that's it.
- */
- // console.log('[WARN] Error reading a directory content. filePath = ' + dirPath)
- } else {
- for (let i = 0; i < fileList.length; i++) {
- let name = fileList[i]
- updatedFileList.push([project, name])
- }
- }
- allLibraries = allLibraries.concat(updatedFileList)
- projectsCount++
- if (projectsCount === projects.length) {
- respondWithContent(JSON.stringify(allLibraries), httpResponse)
- }
- }
- } catch (err) {
- console.log('[ERROR] Error reading a directory content. filePath = ' + dirPath)
- console.log('[ERROR] err.stack = ' + err.stack)
-
- respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
- return
- }
- }
- }
- }
-
- function executeTerminalCommand(command) {
- const util = require('util');
- const exec = util.promisify(require('child_process').exec);
- async function lsWithGrep() {
- try {
- const { stdout, stderr } = await exec(command);
- console.log('stdout:', stdout);
- console.log('stderr:', stderr);
- } catch (err) {
- console.error(err.stack);
- };
- };
- lsWithGrep();
- }
-
- function sendSchema(filePath, schemaType) {
- let fs = require('fs')
- try {
- let folder = ''
- switch (schemaType) {
- case 'AppSchema': {
- folder = 'App-Schema'
- break
- }
- case 'DocsNodeSchema': {
- folder = 'Docs-Nodes'
- break
- }
- case 'DocsConceptSchema': {
- folder = 'Docs-Concepts'
- break
- }
- case 'DocsTopicSchema': {
- folder = 'Docs-Topics'
- break
- }
- case 'DocsTutorialSchema': {
- folder = 'Docs-Tutorials'
- break
- }
- case 'DocsReviewSchema': {
- folder = 'Docs-Reviews'
- break
- }
- case 'DocsBookSchema': {
- folder = 'Docs-Books'
- break
- }
- }
- getAllFilesInDirectoryAndSubdirectories(filePath + folder, onFilesReady)
- function onFilesReady(files) {
-
- let schemaArray = []
- for (let k = 0; k < files.length; k++) {
- let name = files[k]
- let nameSplitted = name.split(folder)
- let fileName = nameSplitted[1]
- for (let i = 0; i < 10; i++) {
- fileName = fileName.replace('\\', '/')
- }
- let fileToRead = filePath + folder + fileName
-
- let fileContent = fs.readFileSync(fileToRead)
- let schemaDocument
- try {
- schemaDocument = JSON.parse(fileContent)
- } catch (err) {
- console.log('[ERROR] httpInterface -> sendSchema -> Error Parsing JSON File: ' + fileToRead + ' .Error = ' + err.stack)
- respondWithContent("[]", httpResponse)
- return
- }
- schemaArray.push(schemaDocument)
- }
- let schema = JSON.stringify(schemaArray)
- respondWithContent(schema, httpResponse)
- }
- } catch (err) {
- if (err.message.indexOf('no such file or directory') < 0) {
- console.log('Could not send Schema:', filePath, schemaType)
- console.log(err.stack)
- }
- respondWithContent("[]", httpResponse)
- }
-
- }
-
- function sendStyleSheet(fileName) {
- let fs = require('fs')
- try {
- let filePath = global.env.PATH_TO_CLIENT + 'WebServer/css/' + fileName
- fs.readFile(filePath, onFileRead)
-
- function onFileRead(err, file) {
- try {
- let fileContent = file.toString()
-
- fileContent = fileContent.replace('HTTP_INTERFACE_PORT', global.env.HTTP_INTERFACE_PORT)
- fileContent = fileContent.replace('HTTP_INTERFACE_PORT', global.env.HTTP_INTERFACE_PORT)
- fileContent = fileContent.replace('HTTP_INTERFACE_PORT', global.env.HTTP_INTERFACE_PORT)
- respondWithContent(fileContent, httpResponse, 'text/css')
- } catch (err) {
- console.log('[ERROR] httpInterface -> mainCSS -> File Not Found: ' + fileName + ' or Error = ' + err.stack)
- }
- }
- } catch (err) {
- console.log(err)
- }
- }
-
- function homePage() {
- if (requestParameters[1] === '') {
- let fs = require('fs')
- try {
- let fileName = global.env.PATH_TO_CLIENT + 'WebServer/index.html'
- fs.readFile(fileName, onFileRead)
-
- function onFileRead(err, file) {
- try {
- let fileContent = file.toString()
-
- fileContent = fileContent.replace('HTTP_INTERFACE_PORT', global.env.HTTP_INTERFACE_PORT)
- respondWithContent(fileContent, httpResponse)
- } catch (err) {
- console.log('[ERROR] httpInterface -> homePage -> File Not Found: ' + fileName + ' or Error = ' + err.stack)
- }
- }
- } catch (err) {
- console.log(err)
- }
- } else {
- respondWithFile(global.env.PATH_TO_UI + '/' + requestParameters[1], httpResponse)
- }
- }
- }
-
- function respondWithFile(fileName, httpResponse) {
- let fs = require('fs')
- if (fileName.indexOf('undefined') > 0) {
- console.log('[WRN] httpInterface -> respondWithFile -> Received httpRequest for undefined file. ')
- respondWithContent(undefined, httpResponse)
- } else {
- try {
- fs.readFile(fileName, onFileRead)
-
- function onFileRead(err, file) {
- if (!err) {
- respondWithContent(file.toString(), httpResponse)
- } else {
- //console.log('File requested not found: ' + fileName)
- respondWithContent(undefined, httpResponse)
- }
- }
- } catch (err) {
- returnEmptyArray()
- }
- }
- }
-
- function respondWithContent(content, httpResponse, contentType) {
- try {
- httpResponse.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate') // HTTP 1.1.
- httpResponse.setHeader('Pragma', 'no-cache') // HTTP 1.0.
- httpResponse.setHeader('Expires', '0') // Proxies.
- httpResponse.setHeader('Access-Control-Allow-Origin', '*') // Allows to access data from other domains.
-
- if (content !== undefined) {
- if (contentType !== undefined) {
- httpResponse.writeHead(200, { 'Content-Type': contentType })
- } else {
- httpResponse.writeHead(200, { 'Content-Type': 'text/html' })
- }
- httpResponse.write(content)
- } else {
- httpResponse.writeHead(404, { 'Content-Type': 'text/html' })
- httpResponse.write('The specified key does not exist.')
- }
- httpResponse.end('\n')
- } catch (err) {
- returnEmptyArray(httpResponse)
- }
- }
-
- function respondWithImage(fileName, httpResponse) {
- let fs = require('fs')
- try {
- fs.readFile(fileName, onFileRead)
-
- function onFileRead(err, file) {
- if (err) {
- console.log('[ERROR] httpInterface -> respondWithImage -> onFileRead -> File Not Found: ' + fileName + ' or Error = ' + err.stack)
- return
- }
- try {
- httpResponse.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate') // HTTP 1.1.
- httpResponse.setHeader('Pragma', 'no-cache') // HTTP 1.0.
- httpResponse.setHeader('Expires', '0') // Proxies.
- httpResponse.setHeader('Access-Control-Allow-Origin', '*') // Allows to access data from other domains.
-
- httpResponse.writeHead(200, { 'Content-Type': 'image/png' })
- httpResponse.end(file, 'binary')
- } catch (err) {
- console.log('[ERROR] httpInterface -> respondWithImage -> onFileRead -> File Not Found: ' + fileName + ' or Error = ' + err.stack)
- }
- }
- } catch (err) {
- console.log('[ERROR] httpInterface -> respondWithImage -> err = ' + err.stack)
- }
- }
-
- function respondWithFont(fileName, httpResponse) {
- let fs = require('fs')
- try {
- fs.readFile(fileName, onFileRead)
-
- function onFileRead(err, file) {
- try {
- if (err) {
- console.log('[ERROR] httpInterface -> respondWithBinary -> onFileRead -> File Not Found: ' + fileName + ' or Error = ' + err.stack)
- return
- }
- httpResponse.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate') // HTTP 1.1.
- httpResponse.setHeader('Pragma', 'no-cache') // HTTP 1.0.
- httpResponse.setHeader('Expires', '0') // Proxies.
- httpResponse.setHeader('Access-Control-Allow-Origin', '*') // Allows to access data from other domains.
-
- if (fileName.indexOf('2') < 0) {
- httpResponse.writeHead(200, { 'Content-Type': 'font/woff' })
- } else {
- httpResponse.writeHead(200, { 'Content-Type': 'font/woff2' })
- }
- httpResponse.end(file, 'binary')
- } catch (err) {
- console.log('[ERROR] httpInterface -> respondWithBinary -> onFileRead -> File Not Found: ' + fileName + ' or Error = ' + err.stack)
- }
- }
- } catch (err) {
- console.log('[ERROR] httpInterface -> respondWithBinary -> err = ' + err.stack)
- }
- }
-
- function returnEmptyArray(httpResponse) {
- try {
- httpResponse.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate') // HTTP 1.1.
- httpResponse.setHeader('Pragma', 'no-cache') // HTTP 1.0.
- httpResponse.setHeader('Expires', '0') // Proxies.
-
- httpResponse.writeHead(200, { 'Content-Type': 'text/html' })
- httpResponse.write('[]')
- httpResponse.end('\n')
- } catch (err) {
- console.log('[ERROR] httpInterface -> returnEmptyArray -> err.stack ' + err.stack)
- }
- }
-
- function getDirectories(path) {
- try {
- const fs = require('fs')
- return fs.readdirSync(path).filter(function (file) {
- return fs.statSync(path + '/' + file).isDirectory();
- });
- } catch (err) {
- return []
- }
- }
-
- function getAllFilesInDirectoryAndSubdirectories(dir, callback) {
- const { promisify } = require('util');
- const { resolve } = require('path');
- const fs = require('fs');
- const readdir = promisify(fs.readdir);
- const stat = promisify(fs.stat);
-
- getFiles(dir)
- .then(files => {
- let splittedDir = dir.split('/')
- let lastFolder = splittedDir[splittedDir.length - 2]
- let pathAndNames = []
- for (let i = 0; i < files.length; i++) {
- let file = files[i]
- let pathName = file.substring(file.indexOf(lastFolder) + lastFolder.length, file.length)
- pathName = pathName.substring(1, pathName.length)
- pathAndNames.push(pathName)
- }
- callback(pathAndNames)
- })
- .catch(e => {
- callback([])
- });
-
- async function getFiles(dir) {
- const subdirs = await readdir(dir);
- const files = await Promise.all(subdirs.map(async (subdir) => {
- const res = resolve(dir, subdir);
- return (await stat(res)).isDirectory() ? getFiles(res) : res;
- }));
- return files.reduce((a, f) => a.concat(f), []);
- }
- }
-}
diff --git a/Client/package-lock.json b/Client/package-lock.json
deleted file mode 100644
index 119b3c164..000000000
--- a/Client/package-lock.json
+++ /dev/null
@@ -1,3552 +0,0 @@
-{
- "name": "client",
- "version": "0.0.6",
- "lockfileVersion": 1,
- "requires": true,
- "dependencies": {
- "@ethereumjs/common": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.4.0.tgz",
- "integrity": "sha512-UdkhFWzWcJCZVsj1O/H8/oqj/0RVYjLc1OhPjBrQdALAkQHpCp8xXI4WLnuGTADqTdJZww0NtgwG+TRPkXt27w==",
- "requires": {
- "crc-32": "^1.2.0",
- "ethereumjs-util": "^7.1.0"
- }
- },
- "@ethereumjs/tx": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.0.tgz",
- "integrity": "sha512-yTwEj2lVzSMgE6Hjw9Oa1DZks/nKTWM8Wn4ykDNapBPua2f4nXO3qKnni86O6lgDj5fVNRqbDsD0yy7/XNGDEA==",
- "requires": {
- "@ethereumjs/common": "^2.4.0",
- "ethereumjs-util": "^7.1.0"
- }
- },
- "@ethersproject/abi": {
- "version": "5.0.7",
- "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.7.tgz",
- "integrity": "sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw==",
- "requires": {
- "@ethersproject/address": "^5.0.4",
- "@ethersproject/bignumber": "^5.0.7",
- "@ethersproject/bytes": "^5.0.4",
- "@ethersproject/constants": "^5.0.4",
- "@ethersproject/hash": "^5.0.4",
- "@ethersproject/keccak256": "^5.0.3",
- "@ethersproject/logger": "^5.0.5",
- "@ethersproject/properties": "^5.0.3",
- "@ethersproject/strings": "^5.0.4"
- }
- },
- "@ethersproject/abstract-provider": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.4.1.tgz",
- "integrity": "sha512-3EedfKI3LVpjSKgAxoUaI+gB27frKsxzm+r21w9G60Ugk+3wVLQwhi1LsEJAKNV7WoZc8CIpNrATlL1QFABjtQ==",
- "requires": {
- "@ethersproject/bignumber": "^5.4.0",
- "@ethersproject/bytes": "^5.4.0",
- "@ethersproject/logger": "^5.4.0",
- "@ethersproject/networks": "^5.4.0",
- "@ethersproject/properties": "^5.4.0",
- "@ethersproject/transactions": "^5.4.0",
- "@ethersproject/web": "^5.4.0"
- }
- },
- "@ethersproject/abstract-signer": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.4.1.tgz",
- "integrity": "sha512-SkkFL5HVq1k4/25dM+NWP9MILgohJCgGv5xT5AcRruGz4ILpfHeBtO/y6j+Z3UN/PAjDeb4P7E51Yh8wcGNLGA==",
- "requires": {
- "@ethersproject/abstract-provider": "^5.4.0",
- "@ethersproject/bignumber": "^5.4.0",
- "@ethersproject/bytes": "^5.4.0",
- "@ethersproject/logger": "^5.4.0",
- "@ethersproject/properties": "^5.4.0"
- }
- },
- "@ethersproject/address": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.4.0.tgz",
- "integrity": "sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q==",
- "requires": {
- "@ethersproject/bignumber": "^5.4.0",
- "@ethersproject/bytes": "^5.4.0",
- "@ethersproject/keccak256": "^5.4.0",
- "@ethersproject/logger": "^5.4.0",
- "@ethersproject/rlp": "^5.4.0"
- }
- },
- "@ethersproject/base64": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.4.0.tgz",
- "integrity": "sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ==",
- "requires": {
- "@ethersproject/bytes": "^5.4.0"
- }
- },
- "@ethersproject/basex": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.4.0.tgz",
- "integrity": "sha512-J07+QCVJ7np2bcpxydFVf/CuYo9mZ7T73Pe7KQY4c1lRlrixMeblauMxHXD0MPwFmUHZIILDNViVkykFBZylbg==",
- "requires": {
- "@ethersproject/bytes": "^5.4.0",
- "@ethersproject/properties": "^5.4.0"
- }
- },
- "@ethersproject/bignumber": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.4.1.tgz",
- "integrity": "sha512-fJhdxqoQNuDOk6epfM7yD6J8Pol4NUCy1vkaGAkuujZm0+lNow//MKu1hLhRiYV4BsOHyBv5/lsTjF+7hWwhJg==",
- "requires": {
- "@ethersproject/bytes": "^5.4.0",
- "@ethersproject/logger": "^5.4.0",
- "bn.js": "^4.11.9"
- }
- },
- "@ethersproject/bytes": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz",
- "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==",
- "requires": {
- "@ethersproject/logger": "^5.4.0"
- }
- },
- "@ethersproject/constants": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.4.0.tgz",
- "integrity": "sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==",
- "requires": {
- "@ethersproject/bignumber": "^5.4.0"
- }
- },
- "@ethersproject/contracts": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.4.1.tgz",
- "integrity": "sha512-m+z2ZgPy4pyR15Je//dUaymRUZq5MtDajF6GwFbGAVmKz/RF+DNIPwF0k5qEcL3wPGVqUjFg2/krlCRVTU4T5w==",
- "requires": {
- "@ethersproject/abi": "^5.4.0",
- "@ethersproject/abstract-provider": "^5.4.0",
- "@ethersproject/abstract-signer": "^5.4.0",
- "@ethersproject/address": "^5.4.0",
- "@ethersproject/bignumber": "^5.4.0",
- "@ethersproject/bytes": "^5.4.0",
- "@ethersproject/constants": "^5.4.0",
- "@ethersproject/logger": "^5.4.0",
- "@ethersproject/properties": "^5.4.0",
- "@ethersproject/transactions": "^5.4.0"
- },
- "dependencies": {
- "@ethersproject/abi": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.4.0.tgz",
- "integrity": "sha512-9gU2H+/yK1j2eVMdzm6xvHSnMxk8waIHQGYCZg5uvAyH0rsAzxkModzBSpbAkAuhKFEovC2S9hM4nPuLym8IZw==",
- "requires": {
- "@ethersproject/address": "^5.4.0",
- "@ethersproject/bignumber": "^5.4.0",
- "@ethersproject/bytes": "^5.4.0",
- "@ethersproject/constants": "^5.4.0",
- "@ethersproject/hash": "^5.4.0",
- "@ethersproject/keccak256": "^5.4.0",
- "@ethersproject/logger": "^5.4.0",
- "@ethersproject/properties": "^5.4.0",
- "@ethersproject/strings": "^5.4.0"
- }
- }
- }
- },
- "@ethersproject/hash": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.4.0.tgz",
- "integrity": "sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA==",
- "requires": {
- "@ethersproject/abstract-signer": "^5.4.0",
- "@ethersproject/address": "^5.4.0",
- "@ethersproject/bignumber": "^5.4.0",
- "@ethersproject/bytes": "^5.4.0",
- "@ethersproject/keccak256": "^5.4.0",
- "@ethersproject/logger": "^5.4.0",
- "@ethersproject/properties": "^5.4.0",
- "@ethersproject/strings": "^5.4.0"
- }
- },
- "@ethersproject/hdnode": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.4.0.tgz",
- "integrity": "sha512-pKxdS0KAaeVGfZPp1KOiDLB0jba11tG6OP1u11QnYfb7pXn6IZx0xceqWRr6ygke8+Kw74IpOoSi7/DwANhy8Q==",
- "requires": {
- "@ethersproject/abstract-signer": "^5.4.0",
- "@ethersproject/basex": "^5.4.0",
- "@ethersproject/bignumber": "^5.4.0",
- "@ethersproject/bytes": "^5.4.0",
- "@ethersproject/logger": "^5.4.0",
- "@ethersproject/pbkdf2": "^5.4.0",
- "@ethersproject/properties": "^5.4.0",
- "@ethersproject/sha2": "^5.4.0",
- "@ethersproject/signing-key": "^5.4.0",
- "@ethersproject/strings": "^5.4.0",
- "@ethersproject/transactions": "^5.4.0",
- "@ethersproject/wordlists": "^5.4.0"
- }
- },
- "@ethersproject/json-wallets": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.4.0.tgz",
- "integrity": "sha512-igWcu3fx4aiczrzEHwG1xJZo9l1cFfQOWzTqwRw/xcvxTk58q4f9M7cjh51EKphMHvrJtcezJ1gf1q1AUOfEQQ==",
- "requires": {
- "@ethersproject/abstract-signer": "^5.4.0",
- "@ethersproject/address": "^5.4.0",
- "@ethersproject/bytes": "^5.4.0",
- "@ethersproject/hdnode": "^5.4.0",
- "@ethersproject/keccak256": "^5.4.0",
- "@ethersproject/logger": "^5.4.0",
- "@ethersproject/pbkdf2": "^5.4.0",
- "@ethersproject/properties": "^5.4.0",
- "@ethersproject/random": "^5.4.0",
- "@ethersproject/strings": "^5.4.0",
- "@ethersproject/transactions": "^5.4.0",
- "aes-js": "3.0.0",
- "scrypt-js": "3.0.1"
- }
- },
- "@ethersproject/keccak256": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.4.0.tgz",
- "integrity": "sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A==",
- "requires": {
- "@ethersproject/bytes": "^5.4.0",
- "js-sha3": "0.5.7"
- }
- },
- "@ethersproject/logger": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.0.tgz",
- "integrity": "sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ=="
- },
- "@ethersproject/networks": {
- "version": "5.4.2",
- "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.4.2.tgz",
- "integrity": "sha512-eekOhvJyBnuibfJnhtK46b8HimBc5+4gqpvd1/H9LEl7Q7/qhsIhM81dI9Fcnjpk3jB1aTy6bj0hz3cifhNeYw==",
- "requires": {
- "@ethersproject/logger": "^5.4.0"
- }
- },
- "@ethersproject/pbkdf2": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.4.0.tgz",
- "integrity": "sha512-x94aIv6tiA04g6BnazZSLoRXqyusawRyZWlUhKip2jvoLpzJuLb//KtMM6PEovE47pMbW+Qe1uw+68ameJjB7g==",
- "requires": {
- "@ethersproject/bytes": "^5.4.0",
- "@ethersproject/sha2": "^5.4.0"
- }
- },
- "@ethersproject/properties": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.4.0.tgz",
- "integrity": "sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A==",
- "requires": {
- "@ethersproject/logger": "^5.4.0"
- }
- },
- "@ethersproject/providers": {
- "version": "5.4.3",
- "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.4.3.tgz",
- "integrity": "sha512-VURwkaWPoUj7jq9NheNDT5Iyy64Qcyf6BOFDwVdHsmLmX/5prNjFrgSX3GHPE4z1BRrVerDxe2yayvXKFm/NNg==",
- "requires": {
- "@ethersproject/abstract-provider": "^5.4.0",
- "@ethersproject/abstract-signer": "^5.4.0",
- "@ethersproject/address": "^5.4.0",
- "@ethersproject/basex": "^5.4.0",
- "@ethersproject/bignumber": "^5.4.0",
- "@ethersproject/bytes": "^5.4.0",
- "@ethersproject/constants": "^5.4.0",
- "@ethersproject/hash": "^5.4.0",
- "@ethersproject/logger": "^5.4.0",
- "@ethersproject/networks": "^5.4.0",
- "@ethersproject/properties": "^5.4.0",
- "@ethersproject/random": "^5.4.0",
- "@ethersproject/rlp": "^5.4.0",
- "@ethersproject/sha2": "^5.4.0",
- "@ethersproject/strings": "^5.4.0",
- "@ethersproject/transactions": "^5.4.0",
- "@ethersproject/web": "^5.4.0",
- "bech32": "1.1.4",
- "ws": "7.4.6"
- }
- },
- "@ethersproject/random": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.4.0.tgz",
- "integrity": "sha512-pnpWNQlf0VAZDEOVp1rsYQosmv2o0ITS/PecNw+mS2/btF8eYdspkN0vIXrCMtkX09EAh9bdk8GoXmFXM1eAKw==",
- "requires": {
- "@ethersproject/bytes": "^5.4.0",
- "@ethersproject/logger": "^5.4.0"
- }
- },
- "@ethersproject/rlp": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.4.0.tgz",
- "integrity": "sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg==",
- "requires": {
- "@ethersproject/bytes": "^5.4.0",
- "@ethersproject/logger": "^5.4.0"
- }
- },
- "@ethersproject/sha2": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.4.0.tgz",
- "integrity": "sha512-siheo36r1WD7Cy+bDdE1BJ8y0bDtqXCOxRMzPa4bV1TGt/eTUUt03BHoJNB6reWJD8A30E/pdJ8WFkq+/uz4Gg==",
- "requires": {
- "@ethersproject/bytes": "^5.4.0",
- "@ethersproject/logger": "^5.4.0",
- "hash.js": "1.1.7"
- }
- },
- "@ethersproject/signing-key": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.4.0.tgz",
- "integrity": "sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A==",
- "requires": {
- "@ethersproject/bytes": "^5.4.0",
- "@ethersproject/logger": "^5.4.0",
- "@ethersproject/properties": "^5.4.0",
- "bn.js": "^4.11.9",
- "elliptic": "6.5.4",
- "hash.js": "1.1.7"
- }
- },
- "@ethersproject/solidity": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.4.0.tgz",
- "integrity": "sha512-XFQTZ7wFSHOhHcV1DpcWj7VXECEiSrBuv7JErJvB9Uo+KfCdc3QtUZV+Vjh/AAaYgezUEKbCtE6Khjm44seevQ==",
- "requires": {
- "@ethersproject/bignumber": "^5.4.0",
- "@ethersproject/bytes": "^5.4.0",
- "@ethersproject/keccak256": "^5.4.0",
- "@ethersproject/sha2": "^5.4.0",
- "@ethersproject/strings": "^5.4.0"
- }
- },
- "@ethersproject/strings": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.4.0.tgz",
- "integrity": "sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA==",
- "requires": {
- "@ethersproject/bytes": "^5.4.0",
- "@ethersproject/constants": "^5.4.0",
- "@ethersproject/logger": "^5.4.0"
- }
- },
- "@ethersproject/transactions": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.4.0.tgz",
- "integrity": "sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ==",
- "requires": {
- "@ethersproject/address": "^5.4.0",
- "@ethersproject/bignumber": "^5.4.0",
- "@ethersproject/bytes": "^5.4.0",
- "@ethersproject/constants": "^5.4.0",
- "@ethersproject/keccak256": "^5.4.0",
- "@ethersproject/logger": "^5.4.0",
- "@ethersproject/properties": "^5.4.0",
- "@ethersproject/rlp": "^5.4.0",
- "@ethersproject/signing-key": "^5.4.0"
- }
- },
- "@ethersproject/units": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.4.0.tgz",
- "integrity": "sha512-Z88krX40KCp+JqPCP5oPv5p750g+uU6gopDYRTBGcDvOASh6qhiEYCRatuM/suC4S2XW9Zz90QI35MfSrTIaFg==",
- "requires": {
- "@ethersproject/bignumber": "^5.4.0",
- "@ethersproject/constants": "^5.4.0",
- "@ethersproject/logger": "^5.4.0"
- }
- },
- "@ethersproject/wallet": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.4.0.tgz",
- "integrity": "sha512-wU29majLjM6AjCjpat21mPPviG+EpK7wY1+jzKD0fg3ui5fgedf2zEu1RDgpfIMsfn8fJHJuzM4zXZ2+hSHaSQ==",
- "requires": {
- "@ethersproject/abstract-provider": "^5.4.0",
- "@ethersproject/abstract-signer": "^5.4.0",
- "@ethersproject/address": "^5.4.0",
- "@ethersproject/bignumber": "^5.4.0",
- "@ethersproject/bytes": "^5.4.0",
- "@ethersproject/hash": "^5.4.0",
- "@ethersproject/hdnode": "^5.4.0",
- "@ethersproject/json-wallets": "^5.4.0",
- "@ethersproject/keccak256": "^5.4.0",
- "@ethersproject/logger": "^5.4.0",
- "@ethersproject/properties": "^5.4.0",
- "@ethersproject/random": "^5.4.0",
- "@ethersproject/signing-key": "^5.4.0",
- "@ethersproject/transactions": "^5.4.0",
- "@ethersproject/wordlists": "^5.4.0"
- }
- },
- "@ethersproject/web": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.4.0.tgz",
- "integrity": "sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og==",
- "requires": {
- "@ethersproject/base64": "^5.4.0",
- "@ethersproject/bytes": "^5.4.0",
- "@ethersproject/logger": "^5.4.0",
- "@ethersproject/properties": "^5.4.0",
- "@ethersproject/strings": "^5.4.0"
- }
- },
- "@ethersproject/wordlists": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.4.0.tgz",
- "integrity": "sha512-FemEkf6a+EBKEPxlzeVgUaVSodU7G0Na89jqKjmWMlDB0tomoU8RlEMgUvXyqtrg8N4cwpLh8nyRnm1Nay1isA==",
- "requires": {
- "@ethersproject/bytes": "^5.4.0",
- "@ethersproject/hash": "^5.4.0",
- "@ethersproject/logger": "^5.4.0",
- "@ethersproject/properties": "^5.4.0",
- "@ethersproject/strings": "^5.4.0"
- }
- },
- "@kwsites/file-exists": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz",
- "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==",
- "requires": {
- "debug": "^4.1.1"
- },
- "dependencies": {
- "debug": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
- "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
- "requires": {
- "ms": "2.1.2"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- }
- }
- },
- "@kwsites/promise-deferred": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz",
- "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw=="
- },
- "@octokit/auth-token": {
- "version": "2.4.5",
- "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.5.tgz",
- "integrity": "sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA==",
- "requires": {
- "@octokit/types": "^6.0.3"
- }
- },
- "@octokit/core": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.5.1.tgz",
- "integrity": "sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw==",
- "requires": {
- "@octokit/auth-token": "^2.4.4",
- "@octokit/graphql": "^4.5.8",
- "@octokit/request": "^5.6.0",
- "@octokit/request-error": "^2.0.5",
- "@octokit/types": "^6.0.3",
- "before-after-hook": "^2.2.0",
- "universal-user-agent": "^6.0.0"
- }
- },
- "@octokit/endpoint": {
- "version": "6.0.12",
- "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz",
- "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==",
- "requires": {
- "@octokit/types": "^6.0.3",
- "is-plain-object": "^5.0.0",
- "universal-user-agent": "^6.0.0"
- }
- },
- "@octokit/graphql": {
- "version": "4.6.4",
- "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.6.4.tgz",
- "integrity": "sha512-SWTdXsVheRmlotWNjKzPOb6Js6tjSqA2a8z9+glDJng0Aqjzti8MEWOtuT8ZSu6wHnci7LZNuarE87+WJBG4vg==",
- "requires": {
- "@octokit/request": "^5.6.0",
- "@octokit/types": "^6.0.3",
- "universal-user-agent": "^6.0.0"
- }
- },
- "@octokit/openapi-types": {
- "version": "9.4.0",
- "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-9.4.0.tgz",
- "integrity": "sha512-rKRkXikOJgDNImPl49IJuECLVXjj+t4qOXHhl8SBjMQCGGp1w4m5Ud/0kfdUx+zCpTvBN8vaOUDF4nnboZoOtQ=="
- },
- "@octokit/plugin-paginate-rest": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.7.0.tgz",
- "integrity": "sha512-+zARyncLjt9b0FjqPAbJo4ss7HOlBi1nprq+cPlw5vu2+qjy7WvlXhtXFdRHQbSL1Pt+bfAKaLADEkkvg8sP8w==",
- "requires": {
- "@octokit/types": "^6.0.1"
- }
- },
- "@octokit/plugin-request-log": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.2.tgz",
- "integrity": "sha512-oTJSNAmBqyDR41uSMunLQKMX0jmEXbwD1fpz8FG27lScV3RhtGfBa1/BBLym+PxcC16IBlF7KH9vP1BUYxA+Eg=="
- },
- "@octokit/plugin-rest-endpoint-methods": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.7.0.tgz",
- "integrity": "sha512-G7sgccWRYQMwcHJXkDY/sDxbXeKiZkFQqUtzBCwmrzCNj2GQf3VygQ4T/BFL2crLVpIbenkE/c0ErhYOte2MPw==",
- "requires": {
- "@octokit/types": "^6.24.0",
- "deprecation": "^2.3.1"
- }
- },
- "@octokit/request": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.0.tgz",
- "integrity": "sha512-4cPp/N+NqmaGQwbh3vUsYqokQIzt7VjsgTYVXiwpUP2pxd5YiZB2XuTedbb0SPtv9XS7nzAKjAuQxmY8/aZkiA==",
- "requires": {
- "@octokit/endpoint": "^6.0.1",
- "@octokit/request-error": "^2.1.0",
- "@octokit/types": "^6.16.1",
- "is-plain-object": "^5.0.0",
- "node-fetch": "^2.6.1",
- "universal-user-agent": "^6.0.0"
- }
- },
- "@octokit/request-error": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz",
- "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==",
- "requires": {
- "@octokit/types": "^6.0.3",
- "deprecation": "^2.0.0",
- "once": "^1.4.0"
- }
- },
- "@octokit/rest": {
- "version": "18.9.0",
- "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.9.0.tgz",
- "integrity": "sha512-VrmrE8gjpuOoDAGjrQq2j9ZhOE6LxaqxaQg0yMrrEnnQZy2ZcAnr5qbVfKsMF0up/48PRV/VFS/2GSMhA7nTdA==",
- "requires": {
- "@octokit/core": "^3.5.0",
- "@octokit/plugin-paginate-rest": "^2.6.2",
- "@octokit/plugin-request-log": "^1.0.2",
- "@octokit/plugin-rest-endpoint-methods": "5.7.0"
- }
- },
- "@octokit/types": {
- "version": "6.24.0",
- "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.24.0.tgz",
- "integrity": "sha512-MfEimJeQ8AV1T2nI5kOfHqsqPHaAnG0Dw3MVoHSEsEq6iLKx2N91o+k2uAgXhPYeSE76LVBqjgTShnFFgNwe0A==",
- "requires": {
- "@octokit/openapi-types": "^9.4.0"
- }
- },
- "@sindresorhus/is": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
- "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ=="
- },
- "@szmarczak/http-timer": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
- "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
- "requires": {
- "defer-to-connect": "^1.0.1"
- }
- },
- "@types/bn.js": {
- "version": "4.11.6",
- "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz",
- "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/node": {
- "version": "12.20.19",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.19.tgz",
- "integrity": "sha512-niAuZrwrjKck4+XhoCw6AAVQBENHftpXw9F4ryk66fTgYaKQ53R4FI7c9vUGGw5vQis1HKBHDR1gcYI/Bq1xvw=="
- },
- "@types/pbkdf2": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz",
- "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/secp256k1": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz",
- "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==",
- "requires": {
- "@types/node": "*"
- }
- },
- "accepts": {
- "version": "1.3.7",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
- "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
- "requires": {
- "mime-types": "~2.1.24",
- "negotiator": "0.6.2"
- }
- },
- "aes-js": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz",
- "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0="
- },
- "ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- }
- },
- "array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
- },
- "asn1": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
- "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
- "requires": {
- "safer-buffer": "~2.1.0"
- }
- },
- "asn1.js": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
- "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
- "requires": {
- "bn.js": "^4.0.0",
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0",
- "safer-buffer": "^2.1.0"
- }
- },
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
- },
- "async-limiter": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
- "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
- },
- "asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
- },
- "available-typed-arrays": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz",
- "integrity": "sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA=="
- },
- "aws-sign2": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
- },
- "aws4": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
- "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
- },
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
- "base-x": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz",
- "integrity": "sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==",
- "requires": {
- "safe-buffer": "^5.0.1"
- }
- },
- "base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
- },
- "bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
- "requires": {
- "tweetnacl": "^0.14.3"
- }
- },
- "bech32": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz",
- "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ=="
- },
- "before-after-hook": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz",
- "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ=="
- },
- "bignumber.js": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz",
- "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA=="
- },
- "blakejs": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.1.tgz",
- "integrity": "sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg=="
- },
- "bluebird": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
- "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
- },
- "bn.js": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
- },
- "body-parser": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
- "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
- "requires": {
- "bytes": "3.1.0",
- "content-type": "~1.0.4",
- "debug": "2.6.9",
- "depd": "~1.1.2",
- "http-errors": "1.7.2",
- "iconv-lite": "0.4.24",
- "on-finished": "~2.3.0",
- "qs": "6.7.0",
- "raw-body": "2.4.0",
- "type-is": "~1.6.17"
- }
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "brorand": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
- "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
- },
- "browserify-aes": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
- "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
- "requires": {
- "buffer-xor": "^1.0.3",
- "cipher-base": "^1.0.0",
- "create-hash": "^1.1.0",
- "evp_bytestokey": "^1.0.3",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "browserify-cipher": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
- "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
- "requires": {
- "browserify-aes": "^1.0.4",
- "browserify-des": "^1.0.0",
- "evp_bytestokey": "^1.0.0"
- }
- },
- "browserify-des": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
- "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
- "requires": {
- "cipher-base": "^1.0.1",
- "des.js": "^1.0.0",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.1.2"
- }
- },
- "browserify-rsa": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
- "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
- "requires": {
- "bn.js": "^5.0.0",
- "randombytes": "^2.0.1"
- },
- "dependencies": {
- "bn.js": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz",
- "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw=="
- }
- }
- },
- "browserify-sign": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
- "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
- "requires": {
- "bn.js": "^5.1.1",
- "browserify-rsa": "^4.0.1",
- "create-hash": "^1.2.0",
- "create-hmac": "^1.1.7",
- "elliptic": "^6.5.3",
- "inherits": "^2.0.4",
- "parse-asn1": "^5.1.5",
- "readable-stream": "^3.6.0",
- "safe-buffer": "^5.2.0"
- },
- "dependencies": {
- "bn.js": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz",
- "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw=="
- },
- "safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
- }
- }
- },
- "bs58": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz",
- "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=",
- "requires": {
- "base-x": "^3.0.2"
- }
- },
- "bs58check": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz",
- "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==",
- "requires": {
- "bs58": "^4.0.0",
- "create-hash": "^1.1.0",
- "safe-buffer": "^5.1.2"
- }
- },
- "buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
- "requires": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
- }
- },
- "buffer-to-arraybuffer": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz",
- "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo="
- },
- "buffer-xor": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
- "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
- },
- "bufferutil": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz",
- "integrity": "sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==",
- "requires": {
- "node-gyp-build": "^4.2.0"
- }
- },
- "bytes": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
- "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
- },
- "cacheable-request": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
- "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
- "requires": {
- "clone-response": "^1.0.2",
- "get-stream": "^5.1.0",
- "http-cache-semantics": "^4.0.0",
- "keyv": "^3.0.0",
- "lowercase-keys": "^2.0.0",
- "normalize-url": "^4.1.0",
- "responselike": "^1.0.2"
- },
- "dependencies": {
- "get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
- "requires": {
- "pump": "^3.0.0"
- }
- },
- "lowercase-keys": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
- "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="
- }
- }
- },
- "call-bind": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
- "requires": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
- }
- },
- "caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
- },
- "ccxt": {
- "version": "1.51.98",
- "resolved": "https://registry.npmjs.org/ccxt/-/ccxt-1.51.98.tgz",
- "integrity": "sha512-3sgRDrOnD6IE06yGr+F0YcQh22eNyKiZ3nQP+QdZt8W/zUUsl4CaHT5I7Zqqz7ObKdv4YcdMCv8j9khTpBNz4w=="
- },
- "child_process": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz",
- "integrity": "sha1-sffn/HPSXn/R1FWtyU4UODAYK1o="
- },
- "chownr": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
- "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
- },
- "cids": {
- "version": "0.7.5",
- "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz",
- "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==",
- "requires": {
- "buffer": "^5.5.0",
- "class-is": "^1.1.0",
- "multibase": "~0.6.0",
- "multicodec": "^1.0.0",
- "multihashes": "~0.4.15"
- },
- "dependencies": {
- "multicodec": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz",
- "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==",
- "requires": {
- "buffer": "^5.6.0",
- "varint": "^5.0.0"
- }
- }
- }
- },
- "cipher-base": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
- "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
- "requires": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "class-is": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz",
- "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw=="
- },
- "clone-response": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
- "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
- "requires": {
- "mimic-response": "^1.0.0"
- }
- },
- "combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "requires": {
- "delayed-stream": "~1.0.0"
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "content-disposition": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
- "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
- "requires": {
- "safe-buffer": "5.1.2"
- }
- },
- "content-hash": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz",
- "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==",
- "requires": {
- "cids": "^0.7.1",
- "multicodec": "^0.5.5",
- "multihashes": "^0.4.15"
- }
- },
- "content-type": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
- "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
- },
- "cookie": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
- "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
- },
- "cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
- },
- "cookiejar": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz",
- "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA=="
- },
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
- },
- "cors": {
- "version": "2.8.5",
- "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
- "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
- "requires": {
- "object-assign": "^4",
- "vary": "^1"
- }
- },
- "crc-32": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz",
- "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==",
- "requires": {
- "exit-on-epipe": "~1.0.1",
- "printj": "~1.1.0"
- }
- },
- "create-ecdh": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
- "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
- "requires": {
- "bn.js": "^4.1.0",
- "elliptic": "^6.5.3"
- }
- },
- "create-hash": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
- "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
- "requires": {
- "cipher-base": "^1.0.1",
- "inherits": "^2.0.1",
- "md5.js": "^1.3.4",
- "ripemd160": "^2.0.1",
- "sha.js": "^2.4.0"
- }
- },
- "create-hmac": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
- "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
- "requires": {
- "cipher-base": "^1.0.3",
- "create-hash": "^1.1.0",
- "inherits": "^2.0.1",
- "ripemd160": "^2.0.0",
- "safe-buffer": "^5.0.1",
- "sha.js": "^2.4.8"
- }
- },
- "crypto-browserify": {
- "version": "3.12.0",
- "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
- "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
- "requires": {
- "browserify-cipher": "^1.0.0",
- "browserify-sign": "^4.0.0",
- "create-ecdh": "^4.0.0",
- "create-hash": "^1.1.0",
- "create-hmac": "^1.1.0",
- "diffie-hellman": "^5.0.0",
- "inherits": "^2.0.1",
- "pbkdf2": "^3.0.3",
- "public-encrypt": "^4.0.0",
- "randombytes": "^2.0.0",
- "randomfill": "^1.0.3"
- }
- },
- "d": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
- "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
- "requires": {
- "es5-ext": "^0.10.50",
- "type": "^1.0.1"
- }
- },
- "dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "decode-uri-component": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
- "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
- },
- "decompress-response": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
- "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
- "requires": {
- "mimic-response": "^1.0.0"
- }
- },
- "defer-to-connect": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
- "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ=="
- },
- "define-properties": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
- "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
- "requires": {
- "object-keys": "^1.0.12"
- }
- },
- "delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
- },
- "depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
- },
- "deprecation": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
- "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ=="
- },
- "des.js": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
- "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
- "requires": {
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0"
- }
- },
- "destroy": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
- "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
- },
- "diffie-hellman": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
- "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
- "requires": {
- "bn.js": "^4.1.0",
- "miller-rabin": "^4.0.0",
- "randombytes": "^2.0.0"
- }
- },
- "dom-walk": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
- "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
- },
- "duplexer3": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
- "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
- },
- "ecc-jsbn": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
- "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
- "requires": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
- }
- },
- "ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
- },
- "elliptic": {
- "version": "6.5.4",
- "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
- "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
- "requires": {
- "bn.js": "^4.11.9",
- "brorand": "^1.1.0",
- "hash.js": "^1.0.0",
- "hmac-drbg": "^1.0.1",
- "inherits": "^2.0.4",
- "minimalistic-assert": "^1.0.1",
- "minimalistic-crypto-utils": "^1.0.1"
- }
- },
- "encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
- },
- "end-of-stream": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
- "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
- "requires": {
- "once": "^1.4.0"
- }
- },
- "es-abstract": {
- "version": "1.18.5",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz",
- "integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==",
- "requires": {
- "call-bind": "^1.0.2",
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.2",
- "internal-slot": "^1.0.3",
- "is-callable": "^1.2.3",
- "is-negative-zero": "^2.0.1",
- "is-regex": "^1.1.3",
- "is-string": "^1.0.6",
- "object-inspect": "^1.11.0",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.2",
- "string.prototype.trimend": "^1.0.4",
- "string.prototype.trimstart": "^1.0.4",
- "unbox-primitive": "^1.0.1"
- }
- },
- "es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "requires": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- }
- },
- "es5-ext": {
- "version": "0.10.53",
- "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
- "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
- "requires": {
- "es6-iterator": "~2.0.3",
- "es6-symbol": "~3.1.3",
- "next-tick": "~1.0.0"
- }
- },
- "es6-iterator": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
- "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
- "requires": {
- "d": "1",
- "es5-ext": "^0.10.35",
- "es6-symbol": "^3.1.1"
- }
- },
- "es6-symbol": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
- "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
- "requires": {
- "d": "^1.0.1",
- "ext": "^1.1.2"
- }
- },
- "escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
- },
- "etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
- },
- "eth-ens-namehash": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz",
- "integrity": "sha1-IprEbsqG1S4MmR58sq74P/D2i88=",
- "requires": {
- "idna-uts46-hx": "^2.3.1",
- "js-sha3": "^0.5.7"
- }
- },
- "eth-lib": {
- "version": "0.1.29",
- "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz",
- "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==",
- "requires": {
- "bn.js": "^4.11.6",
- "elliptic": "^6.4.0",
- "nano-json-stream-parser": "^0.1.2",
- "servify": "^0.1.12",
- "ws": "^3.0.0",
- "xhr-request-promise": "^0.1.2"
- },
- "dependencies": {
- "ws": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
- "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
- "requires": {
- "async-limiter": "~1.0.0",
- "safe-buffer": "~5.1.0",
- "ultron": "~1.1.0"
- }
- }
- }
- },
- "ethereum-bloom-filters": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz",
- "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==",
- "requires": {
- "js-sha3": "^0.8.0"
- },
- "dependencies": {
- "js-sha3": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
- "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q=="
- }
- }
- },
- "ethereum-cryptography": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz",
- "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==",
- "requires": {
- "@types/pbkdf2": "^3.0.0",
- "@types/secp256k1": "^4.0.1",
- "blakejs": "^1.1.0",
- "browserify-aes": "^1.2.0",
- "bs58check": "^2.1.2",
- "create-hash": "^1.2.0",
- "create-hmac": "^1.1.7",
- "hash.js": "^1.1.7",
- "keccak": "^3.0.0",
- "pbkdf2": "^3.0.17",
- "randombytes": "^2.1.0",
- "safe-buffer": "^5.1.2",
- "scrypt-js": "^3.0.0",
- "secp256k1": "^4.0.1",
- "setimmediate": "^1.0.5"
- }
- },
- "ethereumjs-common": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz",
- "integrity": "sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA=="
- },
- "ethereumjs-tx": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz",
- "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==",
- "requires": {
- "ethereumjs-common": "^1.5.0",
- "ethereumjs-util": "^6.0.0"
- },
- "dependencies": {
- "ethereumjs-util": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz",
- "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==",
- "requires": {
- "@types/bn.js": "^4.11.3",
- "bn.js": "^4.11.0",
- "create-hash": "^1.1.2",
- "elliptic": "^6.5.2",
- "ethereum-cryptography": "^0.1.3",
- "ethjs-util": "0.1.6",
- "rlp": "^2.2.3"
- }
- }
- }
- },
- "ethereumjs-util": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.0.tgz",
- "integrity": "sha512-kR+vhu++mUDARrsMMhsjjzPduRVAeundLGXucGRHF3B4oEltOUspfgCVco4kckucj3FMlLaZHUl9n7/kdmr6Tw==",
- "requires": {
- "@types/bn.js": "^5.1.0",
- "bn.js": "^5.1.2",
- "create-hash": "^1.1.2",
- "ethereum-cryptography": "^0.1.3",
- "ethjs-util": "0.1.6",
- "rlp": "^2.2.4"
- },
- "dependencies": {
- "@types/bn.js": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz",
- "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==",
- "requires": {
- "@types/node": "*"
- }
- },
- "bn.js": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz",
- "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw=="
- }
- }
- },
- "ethers": {
- "version": "5.4.4",
- "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.4.4.tgz",
- "integrity": "sha512-zaTs8yaDjfb0Zyj8tT6a+/hEkC+kWAA350MWRp6yP5W7NdGcURRPMOpOU+6GtkfxV9wyJEShWesqhE/TjdqpMA==",
- "requires": {
- "@ethersproject/abi": "5.4.0",
- "@ethersproject/abstract-provider": "5.4.1",
- "@ethersproject/abstract-signer": "5.4.1",
- "@ethersproject/address": "5.4.0",
- "@ethersproject/base64": "5.4.0",
- "@ethersproject/basex": "5.4.0",
- "@ethersproject/bignumber": "5.4.1",
- "@ethersproject/bytes": "5.4.0",
- "@ethersproject/constants": "5.4.0",
- "@ethersproject/contracts": "5.4.1",
- "@ethersproject/hash": "5.4.0",
- "@ethersproject/hdnode": "5.4.0",
- "@ethersproject/json-wallets": "5.4.0",
- "@ethersproject/keccak256": "5.4.0",
- "@ethersproject/logger": "5.4.0",
- "@ethersproject/networks": "5.4.2",
- "@ethersproject/pbkdf2": "5.4.0",
- "@ethersproject/properties": "5.4.0",
- "@ethersproject/providers": "5.4.3",
- "@ethersproject/random": "5.4.0",
- "@ethersproject/rlp": "5.4.0",
- "@ethersproject/sha2": "5.4.0",
- "@ethersproject/signing-key": "5.4.0",
- "@ethersproject/solidity": "5.4.0",
- "@ethersproject/strings": "5.4.0",
- "@ethersproject/transactions": "5.4.0",
- "@ethersproject/units": "5.4.0",
- "@ethersproject/wallet": "5.4.0",
- "@ethersproject/web": "5.4.0",
- "@ethersproject/wordlists": "5.4.0"
- },
- "dependencies": {
- "@ethersproject/abi": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.4.0.tgz",
- "integrity": "sha512-9gU2H+/yK1j2eVMdzm6xvHSnMxk8waIHQGYCZg5uvAyH0rsAzxkModzBSpbAkAuhKFEovC2S9hM4nPuLym8IZw==",
- "requires": {
- "@ethersproject/address": "^5.4.0",
- "@ethersproject/bignumber": "^5.4.0",
- "@ethersproject/bytes": "^5.4.0",
- "@ethersproject/constants": "^5.4.0",
- "@ethersproject/hash": "^5.4.0",
- "@ethersproject/keccak256": "^5.4.0",
- "@ethersproject/logger": "^5.4.0",
- "@ethersproject/properties": "^5.4.0",
- "@ethersproject/strings": "^5.4.0"
- }
- }
- }
- },
- "ethjs-unit": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz",
- "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=",
- "requires": {
- "bn.js": "4.11.6",
- "number-to-bn": "1.7.0"
- },
- "dependencies": {
- "bn.js": {
- "version": "4.11.6",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
- "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU="
- }
- }
- },
- "ethjs-util": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz",
- "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==",
- "requires": {
- "is-hex-prefixed": "1.0.0",
- "strip-hex-prefix": "1.0.0"
- }
- },
- "eventemitter3": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz",
- "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ=="
- },
- "evp_bytestokey": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
- "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
- "requires": {
- "md5.js": "^1.3.4",
- "safe-buffer": "^5.1.1"
- }
- },
- "exit-on-epipe": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
- "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw=="
- },
- "express": {
- "version": "4.17.1",
- "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
- "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
- "requires": {
- "accepts": "~1.3.7",
- "array-flatten": "1.1.1",
- "body-parser": "1.19.0",
- "content-disposition": "0.5.3",
- "content-type": "~1.0.4",
- "cookie": "0.4.0",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "~1.1.2",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "~1.1.2",
- "fresh": "0.5.2",
- "merge-descriptors": "1.0.1",
- "methods": "~1.1.2",
- "on-finished": "~2.3.0",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
- "proxy-addr": "~2.0.5",
- "qs": "6.7.0",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.1.2",
- "send": "0.17.1",
- "serve-static": "1.14.1",
- "setprototypeof": "1.1.1",
- "statuses": "~1.5.0",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- }
- },
- "ext": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz",
- "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==",
- "requires": {
- "type": "^2.0.0"
- },
- "dependencies": {
- "type": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz",
- "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw=="
- }
- }
- },
- "extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
- },
- "extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
- },
- "fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
- },
- "fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
- },
- "finalhandler": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
- "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
- "requires": {
- "debug": "2.6.9",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "on-finished": "~2.3.0",
- "parseurl": "~1.3.3",
- "statuses": "~1.5.0",
- "unpipe": "~1.0.0"
- }
- },
- "foreach": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
- "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k="
- },
- "forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
- },
- "form-data": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
- "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- }
- },
- "forwarded": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
- },
- "fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
- },
- "fs-extra": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
- "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
- "requires": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- }
- },
- "fs-minipass": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
- "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
- "requires": {
- "minipass": "^2.6.0"
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
- },
- "function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
- },
- "get-intrinsic": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
- "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
- "requires": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1"
- }
- },
- "get-stream": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
- "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
- "requires": {
- "pump": "^3.0.0"
- }
- },
- "getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "global": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
- "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
- "requires": {
- "min-document": "^2.19.0",
- "process": "^0.11.10"
- }
- },
- "got": {
- "version": "9.6.0",
- "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
- "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
- "requires": {
- "@sindresorhus/is": "^0.14.0",
- "@szmarczak/http-timer": "^1.1.2",
- "cacheable-request": "^6.0.0",
- "decompress-response": "^3.3.0",
- "duplexer3": "^0.1.4",
- "get-stream": "^4.1.0",
- "lowercase-keys": "^1.0.1",
- "mimic-response": "^1.0.1",
- "p-cancelable": "^1.0.0",
- "to-readable-stream": "^1.0.0",
- "url-parse-lax": "^3.0.0"
- }
- },
- "graceful-fs": {
- "version": "4.2.6",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
- "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ=="
- },
- "har-schema": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
- "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
- },
- "har-validator": {
- "version": "5.1.5",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
- "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
- "requires": {
- "ajv": "^6.12.3",
- "har-schema": "^2.0.0"
- }
- },
- "has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "requires": {
- "function-bind": "^1.1.1"
- }
- },
- "has-bigints": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
- "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA=="
- },
- "has-symbol-support-x": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz",
- "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw=="
- },
- "has-symbols": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
- "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw=="
- },
- "has-to-string-tag-x": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz",
- "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==",
- "requires": {
- "has-symbol-support-x": "^1.4.1"
- }
- },
- "hash-base": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
- "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
- "requires": {
- "inherits": "^2.0.4",
- "readable-stream": "^3.6.0",
- "safe-buffer": "^5.2.0"
- },
- "dependencies": {
- "safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
- }
- }
- },
- "hash.js": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
- "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
- "requires": {
- "inherits": "^2.0.3",
- "minimalistic-assert": "^1.0.1"
- }
- },
- "hmac-drbg": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
- "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
- "requires": {
- "hash.js": "^1.0.3",
- "minimalistic-assert": "^1.0.0",
- "minimalistic-crypto-utils": "^1.0.1"
- }
- },
- "http-cache-semantics": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
- "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
- },
- "http-errors": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
- "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
- "requires": {
- "depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.1",
- "statuses": ">= 1.5.0 < 2",
- "toidentifier": "1.0.0"
- },
- "dependencies": {
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- }
- }
- },
- "http-https": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz",
- "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs="
- },
- "http-signature": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
- "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
- "requires": {
- "assert-plus": "^1.0.0",
- "jsprim": "^1.2.2",
- "sshpk": "^1.7.0"
- }
- },
- "iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3"
- }
- },
- "idna-uts46-hx": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz",
- "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==",
- "requires": {
- "punycode": "2.1.0"
- },
- "dependencies": {
- "punycode": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
- "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0="
- }
- }
- },
- "ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
- "internal-slot": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
- "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
- "requires": {
- "get-intrinsic": "^1.1.0",
- "has": "^1.0.3",
- "side-channel": "^1.0.4"
- }
- },
- "ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
- },
- "is-arguments": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz",
- "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==",
- "requires": {
- "call-bind": "^1.0.0"
- }
- },
- "is-bigint": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz",
- "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA=="
- },
- "is-boolean-object": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz",
- "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==",
- "requires": {
- "call-bind": "^1.0.2"
- }
- },
- "is-callable": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz",
- "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ=="
- },
- "is-date-object": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz",
- "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A=="
- },
- "is-function": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz",
- "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ=="
- },
- "is-generator-function": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.9.tgz",
- "integrity": "sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A=="
- },
- "is-hex-prefixed": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz",
- "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ="
- },
- "is-negative-zero": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
- "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w=="
- },
- "is-number-object": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz",
- "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw=="
- },
- "is-object": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz",
- "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA=="
- },
- "is-plain-obj": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
- "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
- },
- "is-plain-object": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
- "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
- },
- "is-regex": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz",
- "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==",
- "requires": {
- "call-bind": "^1.0.2",
- "has-symbols": "^1.0.2"
- }
- },
- "is-retry-allowed": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz",
- "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg=="
- },
- "is-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
- },
- "is-string": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz",
- "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w=="
- },
- "is-symbol": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
- "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
- "requires": {
- "has-symbols": "^1.0.2"
- }
- },
- "is-typed-array": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.5.tgz",
- "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==",
- "requires": {
- "available-typed-arrays": "^1.0.2",
- "call-bind": "^1.0.2",
- "es-abstract": "^1.18.0-next.2",
- "foreach": "^2.0.5",
- "has-symbols": "^1.0.1"
- }
- },
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
- },
- "is-wsl": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
- "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0="
- },
- "isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
- },
- "isurl": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz",
- "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==",
- "requires": {
- "has-to-string-tag-x": "^1.2.0",
- "is-object": "^1.0.1"
- }
- },
- "js-sha3": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz",
- "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc="
- },
- "jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
- },
- "json-buffer": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
- "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg="
- },
- "json-schema": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
- "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
- },
- "json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
- },
- "json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
- },
- "jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
- "requires": {
- "graceful-fs": "^4.1.6"
- }
- },
- "jsprim": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
- "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
- "requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.2.3",
- "verror": "1.10.0"
- }
- },
- "keccak": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz",
- "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==",
- "requires": {
- "node-addon-api": "^2.0.0",
- "node-gyp-build": "^4.2.0"
- }
- },
- "keyv": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
- "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
- "requires": {
- "json-buffer": "3.0.0"
- }
- },
- "lookpath": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/lookpath/-/lookpath-1.2.2.tgz",
- "integrity": "sha512-k2Gmn8iV6qdME3ztZC2spubmQISimFOPLuQKiPaLcVdRz0IpdxrNClVepMlyTJlhodm/zG/VfbkWERm3kUIh+Q=="
- },
- "lowercase-keys": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
- "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
- },
- "md5.js": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
- "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
- "requires": {
- "hash-base": "^3.0.0",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.1.2"
- }
- },
- "media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
- },
- "merge-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
- },
- "methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
- },
- "miller-rabin": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
- "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
- "requires": {
- "bn.js": "^4.0.0",
- "brorand": "^1.0.1"
- }
- },
- "mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
- },
- "mime-db": {
- "version": "1.49.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz",
- "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA=="
- },
- "mime-types": {
- "version": "2.1.32",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz",
- "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==",
- "requires": {
- "mime-db": "1.49.0"
- }
- },
- "mimic-response": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
- "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
- },
- "min-document": {
- "version": "2.19.0",
- "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
- "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=",
- "requires": {
- "dom-walk": "^0.1.0"
- }
- },
- "minimalistic-assert": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
- "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
- },
- "minimalistic-crypto-utils": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
- "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
- },
- "minipass": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
- "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
- "requires": {
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.0"
- }
- },
- "minizlib": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
- "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
- "requires": {
- "minipass": "^2.9.0"
- }
- },
- "mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
- },
- "mkdirp-promise": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz",
- "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=",
- "requires": {
- "mkdirp": "*"
- }
- },
- "mock-fs": {
- "version": "4.14.0",
- "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz",
- "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw=="
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "multibase": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz",
- "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==",
- "requires": {
- "base-x": "^3.0.8",
- "buffer": "^5.5.0"
- }
- },
- "multicodec": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz",
- "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==",
- "requires": {
- "varint": "^5.0.0"
- }
- },
- "multihashes": {
- "version": "0.4.21",
- "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz",
- "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==",
- "requires": {
- "buffer": "^5.5.0",
- "multibase": "^0.7.0",
- "varint": "^5.0.0"
- },
- "dependencies": {
- "multibase": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz",
- "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==",
- "requires": {
- "base-x": "^3.0.8",
- "buffer": "^5.5.0"
- }
- }
- }
- },
- "nano-json-stream-parser": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz",
- "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18="
- },
- "negotiator": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
- "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
- },
- "next-tick": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
- "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
- },
- "node-addon-api": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz",
- "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA=="
- },
- "node-fetch": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
- "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
- },
- "node-gyp-build": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz",
- "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg=="
- },
- "normalize-url": {
- "version": "4.5.1",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz",
- "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA=="
- },
- "number-to-bn": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz",
- "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=",
- "requires": {
- "bn.js": "4.11.6",
- "strip-hex-prefix": "1.0.0"
- },
- "dependencies": {
- "bn.js": {
- "version": "4.11.6",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
- "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU="
- }
- }
- },
- "oauth-sign": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
- "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
- },
- "object-inspect": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
- "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg=="
- },
- "object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
- },
- "object.assign": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
- "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
- "requires": {
- "call-bind": "^1.0.0",
- "define-properties": "^1.1.3",
- "has-symbols": "^1.0.1",
- "object-keys": "^1.1.1"
- }
- },
- "oboe": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz",
- "integrity": "sha1-VVQoTFQ6ImbXo48X4HOCH73jk80=",
- "requires": {
- "http-https": "^1.0.0"
- }
- },
- "on-finished": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
- "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
- "requires": {
- "ee-first": "1.1.1"
- }
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "requires": {
- "wrappy": "1"
- }
- },
- "open": {
- "version": "6.4.0",
- "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz",
- "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==",
- "requires": {
- "is-wsl": "^1.1.0"
- }
- },
- "p-cancelable": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
- "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw=="
- },
- "p-finally": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
- "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
- },
- "p-timeout": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz",
- "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=",
- "requires": {
- "p-finally": "^1.0.0"
- }
- },
- "parse-asn1": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
- "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
- "requires": {
- "asn1.js": "^5.2.0",
- "browserify-aes": "^1.0.0",
- "evp_bytestokey": "^1.0.0",
- "pbkdf2": "^3.0.3",
- "safe-buffer": "^5.1.1"
- }
- },
- "parse-headers": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.4.tgz",
- "integrity": "sha512-psZ9iZoCNFLrgRjZ1d8mn0h9WRqJwFxM9q3x7iUjN/YT2OksthDJ5TiPCu2F38kS4zutqfW+YdVVkBZZx3/1aw=="
- },
- "parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
- },
- "path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
- },
- "pbkdf2": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
- "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
- "requires": {
- "create-hash": "^1.1.2",
- "create-hmac": "^1.1.4",
- "ripemd160": "^2.0.1",
- "safe-buffer": "^5.0.1",
- "sha.js": "^2.4.8"
- }
- },
- "performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
- },
- "prepend-http": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
- "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc="
- },
- "printj": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz",
- "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ=="
- },
- "process": {
- "version": "0.11.10",
- "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
- "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
- },
- "proxy-addr": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
- "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
- "requires": {
- "forwarded": "0.2.0",
- "ipaddr.js": "1.9.1"
- }
- },
- "psl": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
- "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
- },
- "public-encrypt": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
- "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
- "requires": {
- "bn.js": "^4.1.0",
- "browserify-rsa": "^4.0.0",
- "create-hash": "^1.1.0",
- "parse-asn1": "^5.0.0",
- "randombytes": "^2.0.1",
- "safe-buffer": "^5.1.2"
- }
- },
- "pump": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
- "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "requires": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
- "punycode": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
- },
- "qs": {
- "version": "6.7.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
- "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
- },
- "query-string": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz",
- "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==",
- "requires": {
- "decode-uri-component": "^0.2.0",
- "object-assign": "^4.1.0",
- "strict-uri-encode": "^1.0.0"
- }
- },
- "randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "requires": {
- "safe-buffer": "^5.1.0"
- }
- },
- "randomfill": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
- "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
- "requires": {
- "randombytes": "^2.0.5",
- "safe-buffer": "^5.1.0"
- }
- },
- "range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
- },
- "raw-body": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
- "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
- "requires": {
- "bytes": "3.1.0",
- "http-errors": "1.7.2",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- }
- },
- "readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "requires": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- }
- },
- "request": {
- "version": "2.88.2",
- "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
- "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
- "requires": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "har-validator": "~5.1.3",
- "http-signature": "~1.2.0",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "oauth-sign": "~0.9.0",
- "performance-now": "^2.1.0",
- "qs": "~6.5.2",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "~2.5.0",
- "tunnel-agent": "^0.6.0",
- "uuid": "^3.3.2"
- },
- "dependencies": {
- "qs": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
- "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
- }
- }
- },
- "responselike": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
- "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
- "requires": {
- "lowercase-keys": "^1.0.0"
- }
- },
- "rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "ripemd160": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
- "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
- "requires": {
- "hash-base": "^3.0.0",
- "inherits": "^2.0.1"
- }
- },
- "rlp": {
- "version": "2.2.6",
- "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz",
- "integrity": "sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==",
- "requires": {
- "bn.js": "^4.11.1"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
- },
- "scrypt-js": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz",
- "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA=="
- },
- "secp256k1": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz",
- "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==",
- "requires": {
- "elliptic": "^6.5.2",
- "node-addon-api": "^2.0.0",
- "node-gyp-build": "^4.2.0"
- }
- },
- "send": {
- "version": "0.17.1",
- "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
- "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
- "requires": {
- "debug": "2.6.9",
- "depd": "~1.1.2",
- "destroy": "~1.0.4",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "~1.7.2",
- "mime": "1.6.0",
- "ms": "2.1.1",
- "on-finished": "~2.3.0",
- "range-parser": "~1.2.1",
- "statuses": "~1.5.0"
- },
- "dependencies": {
- "ms": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
- "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
- }
- }
- },
- "serve-static": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
- "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
- "requires": {
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.17.1"
- }
- },
- "servify": {
- "version": "0.1.12",
- "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz",
- "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==",
- "requires": {
- "body-parser": "^1.16.0",
- "cors": "^2.8.1",
- "express": "^4.14.0",
- "request": "^2.79.0",
- "xhr": "^2.3.3"
- }
- },
- "setimmediate": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
- "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
- },
- "setprototypeof": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
- "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
- },
- "sha.js": {
- "version": "2.4.11",
- "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
- "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
- "requires": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
- "requires": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
- }
- },
- "simple-concat": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
- "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="
- },
- "simple-get": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz",
- "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==",
- "requires": {
- "decompress-response": "^3.3.0",
- "once": "^1.3.1",
- "simple-concat": "^1.0.0"
- }
- },
- "simple-git": {
- "version": "2.42.0",
- "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.42.0.tgz",
- "integrity": "sha512-illpUX0bcrdB3AyvBGLz0ToRVP7lXNJOGVybGVuVk7PpivPNK5YKJx2aagKdKbveaMtt0DCLK4/jfjDb6b2M2g==",
- "requires": {
- "@kwsites/file-exists": "^1.1.1",
- "@kwsites/promise-deferred": "^1.1.1",
- "debug": "^4.3.1"
- },
- "dependencies": {
- "debug": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
- "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
- "requires": {
- "ms": "2.1.2"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- }
- }
- },
- "sshpk": {
- "version": "1.16.1",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
- "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
- "requires": {
- "asn1": "~0.2.3",
- "assert-plus": "^1.0.0",
- "bcrypt-pbkdf": "^1.0.0",
- "dashdash": "^1.12.0",
- "ecc-jsbn": "~0.1.1",
- "getpass": "^0.1.1",
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.0.2",
- "tweetnacl": "~0.14.0"
- }
- },
- "statuses": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
- },
- "strict-uri-encode": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
- "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM="
- },
- "string.prototype.trimend": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
- "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3"
- }
- },
- "string.prototype.trimstart": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
- "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3"
- }
- },
- "string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "requires": {
- "safe-buffer": "~5.2.0"
- },
- "dependencies": {
- "safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
- }
- }
- },
- "strip-hex-prefix": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz",
- "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=",
- "requires": {
- "is-hex-prefixed": "1.0.0"
- }
- },
- "swarm-js": {
- "version": "0.1.40",
- "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz",
- "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==",
- "requires": {
- "bluebird": "^3.5.0",
- "buffer": "^5.0.5",
- "eth-lib": "^0.1.26",
- "fs-extra": "^4.0.2",
- "got": "^7.1.0",
- "mime-types": "^2.1.16",
- "mkdirp-promise": "^5.0.1",
- "mock-fs": "^4.1.0",
- "setimmediate": "^1.0.5",
- "tar": "^4.0.2",
- "xhr-request": "^1.0.1"
- },
- "dependencies": {
- "get-stream": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
- "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
- },
- "got": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz",
- "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==",
- "requires": {
- "decompress-response": "^3.2.0",
- "duplexer3": "^0.1.4",
- "get-stream": "^3.0.0",
- "is-plain-obj": "^1.1.0",
- "is-retry-allowed": "^1.0.0",
- "is-stream": "^1.0.0",
- "isurl": "^1.0.0-alpha5",
- "lowercase-keys": "^1.0.0",
- "p-cancelable": "^0.3.0",
- "p-timeout": "^1.1.1",
- "safe-buffer": "^5.0.1",
- "timed-out": "^4.0.0",
- "url-parse-lax": "^1.0.0",
- "url-to-options": "^1.0.1"
- }
- },
- "p-cancelable": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz",
- "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw=="
- },
- "prepend-http": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
- "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
- },
- "url-parse-lax": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
- "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
- "requires": {
- "prepend-http": "^1.0.1"
- }
- }
- }
- },
- "tar": {
- "version": "4.4.15",
- "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.15.tgz",
- "integrity": "sha512-ItbufpujXkry7bHH9NpQyTXPbJ72iTlXgkBAYsAjDXk3Ds8t/3NfO5P4xZGy7u+sYuQUbimgzswX4uQIEeNVOA==",
- "requires": {
- "chownr": "^1.1.1",
- "fs-minipass": "^1.2.5",
- "minipass": "^2.8.6",
- "minizlib": "^1.2.1",
- "mkdirp": "^0.5.0",
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.3"
- },
- "dependencies": {
- "mkdirp": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
- "requires": {
- "minimist": "^1.2.5"
- }
- }
- }
- },
- "timed-out": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
- "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8="
- },
- "to-readable-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
- "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q=="
- },
- "toidentifier": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
- "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
- },
- "tough-cookie": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
- "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
- "requires": {
- "psl": "^1.1.28",
- "punycode": "^2.1.1"
- }
- },
- "tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
- "requires": {
- "safe-buffer": "^5.0.1"
- }
- },
- "tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
- },
- "type": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
- "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
- },
- "type-is": {
- "version": "1.6.18",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
- "requires": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
- }
- },
- "typedarray-to-buffer": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
- "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
- "requires": {
- "is-typedarray": "^1.0.0"
- }
- },
- "ultron": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
- "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og=="
- },
- "unbox-primitive": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
- "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
- "requires": {
- "function-bind": "^1.1.1",
- "has-bigints": "^1.0.1",
- "has-symbols": "^1.0.2",
- "which-boxed-primitive": "^1.0.2"
- }
- },
- "universal-user-agent": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz",
- "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w=="
- },
- "universalify": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
- "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
- },
- "unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
- },
- "uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "requires": {
- "punycode": "^2.1.0"
- }
- },
- "url-parse-lax": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
- "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
- "requires": {
- "prepend-http": "^2.0.0"
- }
- },
- "url-set-query": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz",
- "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk="
- },
- "url-to-options": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz",
- "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k="
- },
- "utf-8-validate": {
- "version": "5.0.5",
- "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.5.tgz",
- "integrity": "sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ==",
- "requires": {
- "node-gyp-build": "^4.2.0"
- }
- },
- "utf8": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz",
- "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ=="
- },
- "util": {
- "version": "0.12.4",
- "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz",
- "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==",
- "requires": {
- "inherits": "^2.0.3",
- "is-arguments": "^1.0.4",
- "is-generator-function": "^1.0.7",
- "is-typed-array": "^1.1.3",
- "safe-buffer": "^5.1.2",
- "which-typed-array": "^1.1.2"
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- },
- "utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
- },
- "uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
- },
- "varint": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz",
- "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow=="
- },
- "vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
- },
- "verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
- "requires": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
- }
- },
- "web3": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/web3/-/web3-1.5.0.tgz",
- "integrity": "sha512-p6mOU+t11tV5Z0W9ISO2ReZlbB1ICp755ogl3OXOWZ+/oWy12wwnIva+z+ypsZc3P8gaoGaTvEwSfXM9NF164w==",
- "requires": {
- "web3-bzz": "1.5.0",
- "web3-core": "1.5.0",
- "web3-eth": "1.5.0",
- "web3-eth-personal": "1.5.0",
- "web3-net": "1.5.0",
- "web3-shh": "1.5.0",
- "web3-utils": "1.5.0"
- }
- },
- "web3-bzz": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.5.0.tgz",
- "integrity": "sha512-IqlecWpwTMO/O5qa0XZZubQh4GwAtO/CR+e2FQ/7oB5eXQyre3DZ/MYu8s5HCLxCR33Fcqda9q2dbNtm1wSQYw==",
- "requires": {
- "@types/node": "^12.12.6",
- "got": "9.6.0",
- "swarm-js": "^0.1.40"
- }
- },
- "web3-core": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.5.0.tgz",
- "integrity": "sha512-1o/etaPSK8tFOWTA6df3t9J6ez4epeyzlNmyh/gx8uHasfa16XLKD8//A9T+O/TmvyQAaA4hWAsQcvlRcuaZ8Q==",
- "requires": {
- "@types/bn.js": "^4.11.5",
- "@types/node": "^12.12.6",
- "bignumber.js": "^9.0.0",
- "web3-core-helpers": "1.5.0",
- "web3-core-method": "1.5.0",
- "web3-core-requestmanager": "1.5.0",
- "web3-utils": "1.5.0"
- }
- },
- "web3-core-helpers": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.5.0.tgz",
- "integrity": "sha512-7s5SrJbG5O0C0Oi9mqKLYchco72djZhk59B7kTla5vUorAxMc99SY7k9BoDgwbFl2dlZon2GtFUEW2RXUNkb1g==",
- "requires": {
- "web3-eth-iban": "1.5.0",
- "web3-utils": "1.5.0"
- }
- },
- "web3-core-method": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.5.0.tgz",
- "integrity": "sha512-izPhpjbn9jVBjMeFcsU7a5+/nqni9hS5oU+d00HJGTVbp8KV6zplhYw4GjkRqyy6OQzooO8Gx2MMUyRdv5x1wg==",
- "requires": {
- "@ethersproject/transactions": "^5.0.0-beta.135",
- "web3-core-helpers": "1.5.0",
- "web3-core-promievent": "1.5.0",
- "web3-core-subscriptions": "1.5.0",
- "web3-utils": "1.5.0"
- }
- },
- "web3-core-promievent": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.5.0.tgz",
- "integrity": "sha512-7GkbOIMtcp1qN8LRMMmwIhulzEldT+3Mu7ii2WgAcFFKT1yzUl6Gmycf8mmoEKpAuADAQ9Qeyk0PskTR6rTYlQ==",
- "requires": {
- "eventemitter3": "4.0.4"
- }
- },
- "web3-core-requestmanager": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.5.0.tgz",
- "integrity": "sha512-Sr5T2JuXOAsINJ2tf7Rgi2a+Dy2suBDKT8eMc1pcspPmaBhvTKOQfM9XdsO4yjJKYw6tt/Tagw4GKZm4IOx7mw==",
- "requires": {
- "util": "^0.12.0",
- "web3-core-helpers": "1.5.0",
- "web3-providers-http": "1.5.0",
- "web3-providers-ipc": "1.5.0",
- "web3-providers-ws": "1.5.0"
- }
- },
- "web3-core-subscriptions": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.5.0.tgz",
- "integrity": "sha512-dx9P1mZvJkQRiYpSo9SvFhYNzy5E9GHeLOc3uqxPaDxKU7Cu9fJnFHo/P6+wfD6ZhGIP23ZLK/uyor5UpdTqDQ==",
- "requires": {
- "eventemitter3": "4.0.4",
- "web3-core-helpers": "1.5.0"
- }
- },
- "web3-eth": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.5.0.tgz",
- "integrity": "sha512-31ni3YliTDYLKuWt8naitZ4Ru86whZlqvz6kFzCaBaCR/EumzA9ejzNbcX9okio9zUtKSHH37Bk0+WogfU9Jqg==",
- "requires": {
- "web3-core": "1.5.0",
- "web3-core-helpers": "1.5.0",
- "web3-core-method": "1.5.0",
- "web3-core-subscriptions": "1.5.0",
- "web3-eth-abi": "1.5.0",
- "web3-eth-accounts": "1.5.0",
- "web3-eth-contract": "1.5.0",
- "web3-eth-ens": "1.5.0",
- "web3-eth-iban": "1.5.0",
- "web3-eth-personal": "1.5.0",
- "web3-net": "1.5.0",
- "web3-utils": "1.5.0"
- }
- },
- "web3-eth-abi": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.5.0.tgz",
- "integrity": "sha512-rfT/SvfZY9+SNJRzTHxLFaebQRBhS67tGqUqLxlyy6EsAcEmIs/g4mAUH5atYwPE9bOQeiVoLKLbwJEBIcw86w==",
- "requires": {
- "@ethersproject/abi": "5.0.7",
- "web3-utils": "1.5.0"
- }
- },
- "web3-eth-accounts": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.5.0.tgz",
- "integrity": "sha512-tqvF2bKECaS6jDux8h1dkdsrfb5SHIVVA6hu2lJmZNlTBqFIq2A8rfOkqcanie6Vh5n5U7Dnc2LUoN9rxgaSSg==",
- "requires": {
- "@ethereumjs/common": "^2.3.0",
- "@ethereumjs/tx": "^3.2.1",
- "crypto-browserify": "3.12.0",
- "eth-lib": "0.2.8",
- "ethereumjs-util": "^7.0.10",
- "scrypt-js": "^3.0.1",
- "uuid": "3.3.2",
- "web3-core": "1.5.0",
- "web3-core-helpers": "1.5.0",
- "web3-core-method": "1.5.0",
- "web3-utils": "1.5.0"
- },
- "dependencies": {
- "eth-lib": {
- "version": "0.2.8",
- "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
- "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
- "requires": {
- "bn.js": "^4.11.6",
- "elliptic": "^6.4.0",
- "xhr-request-promise": "^0.1.2"
- }
- },
- "uuid": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
- "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
- }
- }
- },
- "web3-eth-contract": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.5.0.tgz",
- "integrity": "sha512-v4laiJRzdcoDwvqaMCzJH1BUosbTVsd01Qp+9v05Q94KycjkdeahPRXX6PEcUNW/ZF8N006iExUweGjajTZnTA==",
- "requires": {
- "@types/bn.js": "^4.11.5",
- "web3-core": "1.5.0",
- "web3-core-helpers": "1.5.0",
- "web3-core-method": "1.5.0",
- "web3-core-promievent": "1.5.0",
- "web3-core-subscriptions": "1.5.0",
- "web3-eth-abi": "1.5.0",
- "web3-utils": "1.5.0"
- }
- },
- "web3-eth-ens": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.5.0.tgz",
- "integrity": "sha512-NiaGfOnsCqP+3hOCeP3Q9IrlV/1ZCDiv8VmN1yF5Ya6n6YeO4TJU9MKP8i5038RFETjLIfGtXr5fthbsob30hA==",
- "requires": {
- "content-hash": "^2.5.2",
- "eth-ens-namehash": "2.0.8",
- "web3-core": "1.5.0",
- "web3-core-helpers": "1.5.0",
- "web3-core-promievent": "1.5.0",
- "web3-eth-abi": "1.5.0",
- "web3-eth-contract": "1.5.0",
- "web3-utils": "1.5.0"
- }
- },
- "web3-eth-iban": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.5.0.tgz",
- "integrity": "sha512-cFfiPA8xs4lemMJjDb9KfXzPvs6rBrRl8y4rgvh/JWlZZgKolzo7KLXq4NR3oFd/C81s0Lslvz2st1EREp5CNA==",
- "requires": {
- "bn.js": "^4.11.9",
- "web3-utils": "1.5.0"
- }
- },
- "web3-eth-personal": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.5.0.tgz",
- "integrity": "sha512-FYBrzMS6q/df8ud1kAN1p6lqdP/pd0szogcuyrVyi++bFQiovnR+QosudFsbn/aAZPDHOEh0UV4P3KVKbLqw9g==",
- "requires": {
- "@types/node": "^12.12.6",
- "web3-core": "1.5.0",
- "web3-core-helpers": "1.5.0",
- "web3-core-method": "1.5.0",
- "web3-net": "1.5.0",
- "web3-utils": "1.5.0"
- }
- },
- "web3-net": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.5.0.tgz",
- "integrity": "sha512-oGgEtO2fRtJjAp0K1/fvH247MeeDemFL+5tF+PxII9b/gBxnVe+MzP+oNLr4dTrweromjv34tioR3kUgsqwCWg==",
- "requires": {
- "web3-core": "1.5.0",
- "web3-core-method": "1.5.0",
- "web3-utils": "1.5.0"
- }
- },
- "web3-providers-http": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.5.0.tgz",
- "integrity": "sha512-y1RuxsCGrWdsIUyuZBEN+3F8trl3bDZNajwLS2KYBGlB99sWYZHPmvbAsBpaW1d/I12W0fQiWOVzp63L7KPTow==",
- "requires": {
- "web3-core-helpers": "1.5.0",
- "xhr2-cookies": "1.1.0"
- }
- },
- "web3-providers-ipc": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.5.0.tgz",
- "integrity": "sha512-Hda9wlOaIJC9/qMOVkayK+fbBHDZBmPcoL7TfjQX7hrtZn8V3+gR27ciyRXmuW7QD3hDg7CJfe5uRK8brh3nSA==",
- "requires": {
- "oboe": "2.1.5",
- "web3-core-helpers": "1.5.0"
- }
- },
- "web3-providers-ws": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.5.0.tgz",
- "integrity": "sha512-TCwOhu5WbuQCSUoar+U+7N1NqI4A6MlcdZqsC7AhTogYYtnXOPRWfiHMZtUP7Qw50GKJ37FIH3YDItcHTNHd6A==",
- "requires": {
- "eventemitter3": "4.0.4",
- "web3-core-helpers": "1.5.0",
- "websocket": "^1.0.32"
- }
- },
- "web3-shh": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.5.0.tgz",
- "integrity": "sha512-TwpcxXNh+fBnyRcCPPqVqaCB4IjSpVL2/5OR2WwCnZwejs1ife+pej8DYVZWm0m1tSzIDRTdNbsJf/DN0cAxYQ==",
- "requires": {
- "web3-core": "1.5.0",
- "web3-core-method": "1.5.0",
- "web3-core-subscriptions": "1.5.0",
- "web3-net": "1.5.0"
- }
- },
- "web3-utils": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.5.0.tgz",
- "integrity": "sha512-hNyw7Oxi6TM3ivXmv4hK5Cvyi9ML3UoKtcCYvLF9woPWh5v2dwCCVO1U3Iq5HHK7Dqq28t1d4CxWHqUfOfAkgg==",
- "requires": {
- "bn.js": "^4.11.9",
- "eth-lib": "0.2.8",
- "ethereum-bloom-filters": "^1.0.6",
- "ethjs-unit": "0.1.6",
- "number-to-bn": "1.7.0",
- "randombytes": "^2.1.0",
- "utf8": "3.0.0"
- },
- "dependencies": {
- "eth-lib": {
- "version": "0.2.8",
- "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
- "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
- "requires": {
- "bn.js": "^4.11.6",
- "elliptic": "^6.4.0",
- "xhr-request-promise": "^0.1.2"
- }
- }
- }
- },
- "websocket": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz",
- "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==",
- "requires": {
- "bufferutil": "^4.0.1",
- "debug": "^2.2.0",
- "es5-ext": "^0.10.50",
- "typedarray-to-buffer": "^3.1.5",
- "utf-8-validate": "^5.0.2",
- "yaeti": "^0.0.6"
- }
- },
- "which-boxed-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
- "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
- "requires": {
- "is-bigint": "^1.0.1",
- "is-boolean-object": "^1.1.0",
- "is-number-object": "^1.0.4",
- "is-string": "^1.0.5",
- "is-symbol": "^1.0.3"
- }
- },
- "which-typed-array": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz",
- "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==",
- "requires": {
- "available-typed-arrays": "^1.0.2",
- "call-bind": "^1.0.0",
- "es-abstract": "^1.18.0-next.1",
- "foreach": "^2.0.5",
- "function-bind": "^1.1.1",
- "has-symbols": "^1.0.1",
- "is-typed-array": "^1.1.3"
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- },
- "ws": {
- "version": "7.4.6",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
- "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A=="
- },
- "xhr": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz",
- "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==",
- "requires": {
- "global": "~4.4.0",
- "is-function": "^1.0.1",
- "parse-headers": "^2.0.0",
- "xtend": "^4.0.0"
- }
- },
- "xhr-request": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz",
- "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==",
- "requires": {
- "buffer-to-arraybuffer": "^0.0.5",
- "object-assign": "^4.1.1",
- "query-string": "^5.0.1",
- "simple-get": "^2.7.0",
- "timed-out": "^4.0.1",
- "url-set-query": "^1.0.0",
- "xhr": "^2.0.4"
- }
- },
- "xhr-request-promise": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz",
- "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==",
- "requires": {
- "xhr-request": "^1.1.0"
- }
- },
- "xhr2-cookies": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz",
- "integrity": "sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=",
- "requires": {
- "cookiejar": "^2.1.1"
- }
- },
- "xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
- },
- "yaeti": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz",
- "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc="
- },
- "yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
- }
- }
-}
diff --git a/Desktop/DesktopApp.js b/Desktop/DesktopApp.js
new file mode 100644
index 000000000..d2bb686db
--- /dev/null
+++ b/Desktop/DesktopApp.js
@@ -0,0 +1,125 @@
+exports.newDesktopApp = function newDesktopApp() {
+
+ let thisObject = {
+ run: run
+ }
+
+ return thisObject
+
+ async function run() {
+ /*
+ let socialGraphService = NT.projects.network.modules.socialGraph.newSocialGraph()
+ await socialGraphService.initialize()
+ */
+
+ /*
+ This is the Web Sockets client that interacts with the Superalgos Network.
+ */
+ //DK.webSocketsClient = SA.projects.network.modules.webSocketsClient.newNetworkModulesWebSocketsClient()
+ //await DK.webSocketsClient.initialize()
+
+ /* These are the Network Interfaces by which the UI interacts with the Desktop App.*/
+ //let WEB_SOCKETS_INTERFACE = require('./webSocketsInterface.js')
+ let HTTP_INTERFACE = require('./httpInterface.js')
+
+ /*
+ WEB_SOCKETS_INTERFACE = WEB_SOCKETS_INTERFACE.newWebSocketsInterface()
+ WEB_SOCKETS_INTERFACE.initialize()
+ console.log('Web Sockets Interface ....................................... Listening at port ' + global.env.CLIENT_WEB_SOCKETS_INTERFACE_PORT)
+ */
+
+ HTTP_INTERFACE = HTTP_INTERFACE.newHttpInterface()
+ HTTP_INTERFACE.initialize()
+ console.log('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: DK.TEST_NETWORK_CLIENT_USER_PROFILE_ID,
+ 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: DK.TEST_NETWORK_CLIENT_USER_PROFILE_ID,
+ 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: DK.TEST_NETWORK_CLIENT_USER_PROFILE_ID,
+ targetUserProfileId: DK.TEST_NETWORK_CLIENT_USER_PROFILE_ID
+ }
+
+ 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)
+ }
+ }
+}
diff --git a/UI/AppLoader.js b/Desktop/UI/AppLoader.js
similarity index 100%
rename from UI/AppLoader.js
rename to Desktop/UI/AppLoader.js
diff --git a/Client/WebServer/Fonts/Saira-Condensed.woff2 b/Desktop/WebServer/Fonts/Saira-Condensed.woff2
similarity index 100%
rename from Client/WebServer/Fonts/Saira-Condensed.woff2
rename to Desktop/WebServer/Fonts/Saira-Condensed.woff2
diff --git a/Client/WebServer/Fonts/Saira.woff2 b/Desktop/WebServer/Fonts/Saira.woff2
similarity index 100%
rename from Client/WebServer/Fonts/Saira.woff2
rename to Desktop/WebServer/Fonts/Saira.woff2
diff --git a/Client/WebServer/Fonts/segoeui.woff b/Desktop/WebServer/Fonts/segoeui.woff
similarity index 100%
rename from Client/WebServer/Fonts/segoeui.woff
rename to Desktop/WebServer/Fonts/segoeui.woff
diff --git a/Client/WebServer/Images/favicon.ico b/Desktop/WebServer/Images/favicon.ico
similarity index 100%
rename from Client/WebServer/Images/favicon.ico
rename to Desktop/WebServer/Images/favicon.ico
diff --git a/Desktop/WebServer/css/main.css b/Desktop/WebServer/css/main.css
new file mode 100644
index 000000000..5e3eedde8
--- /dev/null
+++ b/Desktop/WebServer/css/main.css
@@ -0,0 +1,34 @@
+/* latin */
+@font-face {
+ font-family: 'Saira';
+ font-style: normal;
+ font-weight: 300;
+ src: local('Saira Light'), local('Saira-Light'), url(Fonts/Saira.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+ }
+ /* latin */
+ @font-face {
+ font-family: 'Saira Condensed';
+ font-style: normal;
+ font-weight: 300;
+ src: local('Saira Condensed Light'), local('SairaCondensed-Light'), url(Fonts/Saira-Condensed.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+ }
+
+ @font-face {
+ font-family: segoeui;
+ src: url(Fonts/segoeui.woff) format('woff');
+ font-weight: normal;
+ font-style: normal;
+ }
+
+ kbd {
+ padding: 2px 8px;
+ font-size: 125%;
+ font-weight: 500;
+ color: #000;
+ background-color: #bcd643;
+ border-radius: 5px;
+ border-style: outset;
+ border-width: 1px;
+ }
\ No newline at end of file
diff --git a/Desktop/WebServer/index.html b/Desktop/WebServer/index.html
new file mode 100644
index 000000000..afeb95d14
--- /dev/null
+++ b/Desktop/WebServer/index.html
@@ -0,0 +1,52 @@
+
+
+
+
+ Superalgos Desktop
+
+
+
+
+
+
+
+
+
+
+ Hello World!
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Client/WebServer/require.js b/Desktop/WebServer/require.js
similarity index 100%
rename from Client/WebServer/require.js
rename to Desktop/WebServer/require.js
diff --git a/Desktop/httpInterface.js b/Desktop/httpInterface.js
new file mode 100644
index 000000000..ddbddda7e
--- /dev/null
+++ b/Desktop/httpInterface.js
@@ -0,0 +1,68 @@
+exports.newHttpInterface = function newHttpInterface() {
+
+ /*
+ This module represent the HTTP API of the
+ Desktop App. All HTTP request are processed
+ by this module.
+ */
+ let thisObject = {
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ return thisObject
+
+ function finalize() {
+ }
+
+ function initialize() {
+ /*
+ We will create an HTTP Server and leave it running forever.
+ */
+ SA.nodeModules.http.createServer(onHttpRequest).listen(global.env.DESKTOP_HTTP_INTERFACE_PORT)
+ /* Starting the browser now is optional */
+ if (process.argv.includes("noBrowser")) {
+ //Running Client only with no UI.
+ } else {
+ SA.nodeModules.open('http://localhost:' + global.env.DESKTOP_HTTP_INTERFACE_PORT)
+ }
+ }
+
+ 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 'Images': // This means the Images folder.
+ {
+ let path = global.env.PATH_TO_CLIENT + '/WebServer/Images/' + requestPath[2]
+
+ if (requestPath[3] !== undefined) {
+ path = path + '/' + requestPath[3]
+ }
+
+ if (requestPath[4] !== undefined) {
+ path = path + '/' + requestPath[4]
+ }
+
+ if (requestPath[5] !== undefined) {
+ path = path + '/' + requestPath[5]
+ }
+
+ path = unescape(path)
+
+ SA.projects.foundations.utilities.httpResponses.respondWithImage(path, httpResponse)
+ }
+ break
+ default:
+ {
+ SA.projects.foundations.utilities.httpResponses.respondWithWebFile(httpResponse, endpointOrFile, global.env.PATH_TO_DESKTOP)
+ }
+ }
+ } catch (err) {
+ console.log(err.stack)
+ }
+ }
+}
diff --git a/Environment.js b/Environment.js
index 8b1f83d85..212d54e6e 100644
--- a/Environment.js
+++ b/Environment.js
@@ -2,19 +2,18 @@ exports.newEnvironment = function () {
let thisObject = {
WEB_SERVER_URL: 'localhost',
- WEB_SOCKETS_INTERFACE_PORT: 18041,
- HTTP_INTERFACE_PORT: 34248,
+ CLIENT_WEB_SOCKETS_INTERFACE_PORT: 18041,
+ CLIENT_HTTP_INTERFACE_PORT: 34248,
PATH_TO_TASK_SERVER: './TaskServer',
PATH_TO_DATA_STORAGE: './Data-Storage',
PATH_TO_PROJECTS: './Projects',
PATH_TO_LOG_FILES: './Log-Files',
- PATH_TO_PROJECTS_REQUIRED: '../Projects',
- PATH_TO_UI: './UI',
- PATH_TO_DATA_FILES: './UI/Data-Files/src',
- PATH_TO_CLIENT: './Client/',
+ PATH_TO_PROJECTS_REQUIRED: './Projects',
+ PATH_TO_PROJECT_SCHEMA: '../Projects/ProjectsSchema.json',
+ PATH_TO_CLIENT: './Platform',
PATH_TO_DEFAULT_WORKSPACE: './Projects/Foundations/Plugins/Workspaces',
PATH_TO_MY_WORKSPACES: './My-Workspaces',
- PATH_TO_FONTS: './Client/WebServer/Fonts'
+ PATH_TO_FONTS: './Platform/WebServer/Fonts'
}
return thisObject
diff --git a/EnvironmentForDebug.js b/EnvironmentForDebug.js
new file mode 100644
index 000000000..932ed022b
--- /dev/null
+++ b/EnvironmentForDebug.js
@@ -0,0 +1,23 @@
+exports.newEnvironment = function () {
+
+ let thisObject = {
+ WEB_SERVER_URL: 'localhost',
+ CLIENT_WEB_SOCKETS_INTERFACE_PORT: 18041,
+ NETWORK_WEB_SOCKETS_INTERFACE_PORT: 18042,
+ CLIENT_HTTP_INTERFACE_PORT: 34248,
+ DESKTOP_HTTP_INTERFACE_PORT: 34249,
+ PATH_TO_TASK_SERVER: './TaskServer',
+ PATH_TO_DATA_STORAGE: './Data-Storage',
+ PATH_TO_PROJECTS: './Projects',
+ PATH_TO_LOG_FILES: './Log-Files',
+ PATH_TO_PROJECTS_REQUIRED: './Projects',
+ PATH_TO_PROJECT_SCHEMA: './Projects/ProjectsSchema.json',
+ PATH_TO_CLIENT: './Platform',
+ PATH_TO_DESKTOP: './Desktop',
+ PATH_TO_DEFAULT_WORKSPACE: './Projects/Foundations/Plugins/Workspaces',
+ PATH_TO_MY_WORKSPACES: './My-Workspaces',
+ PATH_TO_FONTS: './Platform/WebServer/Fonts'
+ }
+
+ return thisObject
+}
\ No newline at end of file
diff --git a/MultiProject.js b/MultiProject.js
new file mode 100644
index 000000000..47506b2cc
--- /dev/null
+++ b/MultiProject.js
@@ -0,0 +1,116 @@
+exports.newMultiProject = function () {
+
+ let thisObject = {
+ initialize: initialize
+ }
+
+ return thisObject;
+
+ function initialize(rootObject, rootObjectName) {
+ /*
+ Here we will setup the rootObject object, with all the
+ projects and modules that will have inside.
+ */
+ rootObject.projects = {}
+
+ for (let i = 0; i < PROJECTS_SCHEMA.length; i++) {
+ let projectDefinition = PROJECTS_SCHEMA[i]
+ global[rootObjectName].projects[projectDefinition.propertyName] = {}
+ let projectInstance = global[rootObjectName].projects[projectDefinition.propertyName]
+
+ projectInstance.utilities = {}
+ projectInstance.globals = {}
+ projectInstance.functionLibraries = {}
+ projectInstance.modules = {}
+ projectInstance.taskModules = {}
+ projectInstance.processModules = {}
+ projectInstance.botModules = {}
+
+ if (projectDefinition[rootObjectName] === undefined) { continue }
+
+ /* Set up Utilities of this Project */
+ if (projectDefinition[rootObjectName].utilities !== undefined) {
+ for (let j = 0; j < projectDefinition[rootObjectName].utilities.length; j++) {
+ let utilityDefinition = projectDefinition[rootObjectName].utilities[j]
+ let path = global.env.PATH_TO_PROJECTS_REQUIRED + '/' + projectDefinition.name + '/' + rootObjectName + '/' + 'Utilities' + '/' + utilityDefinition.fileName
+
+ let requiredObject = require(path)
+ let requiredFunction = requiredObject[utilityDefinition.functionName]
+ projectInstance.utilities[utilityDefinition.propertyName] = requiredFunction.call()
+ }
+ }
+
+ /* Set up Globals of this Project */
+ if (projectDefinition[rootObjectName].globals !== undefined) {
+ for (let j = 0; j < projectDefinition[rootObjectName].globals.length; j++) {
+ let globalDefinition = projectDefinition[rootObjectName].globals[j]
+ let path = global.env.PATH_TO_PROJECTS_REQUIRED + '/' + projectDefinition.name + '/' + rootObjectName + '/' + 'Globals' + '/' + globalDefinition.fileName
+
+ let requiredObject = require(path)
+ let requiredFunction = requiredObject[globalDefinition.functionName]
+ projectInstance.globals[globalDefinition.propertyName] = requiredFunction.call()
+ }
+ }
+
+ /* Set up Function Libraries of this Project */
+ if (projectDefinition[rootObjectName].functionLibraries !== undefined) {
+ for (let j = 0; j < projectDefinition[rootObjectName].functionLibraries.length; j++) {
+ let functionLibraryDefinition = projectDefinition[rootObjectName].functionLibraries[j]
+ let path = global.env.PATH_TO_PROJECTS_REQUIRED + '/' + projectDefinition.name + '/' + rootObjectName + '/' + 'Function-Libraries' + '/' + functionLibraryDefinition.fileName
+
+ let requiredObject = require(path)
+ let requiredFunction = requiredObject[functionLibraryDefinition.functionName]
+ projectInstance.functionLibraries[functionLibraryDefinition.propertyName] = requiredFunction.call()
+ }
+ }
+
+ /*
+ From here we will require and get the modules, but without instantiation thisObject.
+ */
+
+ /* Set up Modules for this Project */
+ if (projectDefinition[rootObjectName].modules !== undefined) {
+ for (let j = 0; j < projectDefinition[rootObjectName].modules.length; j++) {
+ let taskModuleDefinition = projectDefinition[rootObjectName].modules[j]
+ let path = global.env.PATH_TO_PROJECTS_REQUIRED + '/' + projectDefinition.name + '/' + rootObjectName + '/' + 'Modules' + '/' + taskModuleDefinition.fileName
+
+ let requiredObject = require(path)
+ projectInstance.modules[taskModuleDefinition.propertyName] = requiredObject
+ }
+ }
+
+ /* Set up Task Modules for this Project */
+ if (projectDefinition[rootObjectName].taskModules !== undefined) {
+ for (let j = 0; j < projectDefinition[rootObjectName].taskModules.length; j++) {
+ let taskModuleDefinition = projectDefinition[rootObjectName].taskModules[j]
+ let path = global.env.PATH_TO_PROJECTS_REQUIRED + '/' + projectDefinition.name + '/' + rootObjectName + '/' + 'Task-Modules' + '/' + taskModuleDefinition.fileName
+
+ let requiredObject = require(path)
+ projectInstance.taskModules[taskModuleDefinition.propertyName] = requiredObject
+ }
+ }
+
+ /* Set up Process Modules for this Project */
+ if (projectDefinition[rootObjectName].processModules !== undefined) {
+ for (let j = 0; j < projectDefinition[rootObjectName].processModules.length; j++) {
+ let processModuleDefinition = projectDefinition[rootObjectName].processModules[j]
+ let path = global.env.PATH_TO_PROJECTS_REQUIRED + '/' + projectDefinition.name + '/' + rootObjectName + '/' + 'Process-Modules' + '/' + processModuleDefinition.fileName
+
+ let requiredObject = require(path)
+ projectInstance.processModules[processModuleDefinition.propertyName] = requiredObject
+ }
+ }
+
+ /* Set up Bot Modules for this Project */
+ if (projectDefinition[rootObjectName].botModules !== undefined) {
+ for (let j = 0; j < projectDefinition[rootObjectName].botModules.length; j++) {
+ let botModuleDefinition = projectDefinition[rootObjectName].botModules[j]
+ let path = global.env.PATH_TO_PROJECTS_REQUIRED + '/' + projectDefinition.name + '/' + rootObjectName + '/' + 'Bot-Modules' + '/' + botModuleDefinition.folderName + '/' + botModuleDefinition.fileName
+
+ let requiredObject = require(path)
+ projectInstance.botModules[botModuleDefinition.propertyName] = requiredObject
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Network/.vscode/Superalgos Network.code-workspace b/Network/.vscode/Superalgos Network.code-workspace
new file mode 100644
index 000000000..9970dd1eb
--- /dev/null
+++ b/Network/.vscode/Superalgos Network.code-workspace
@@ -0,0 +1,14 @@
+{
+ "folders": [
+ {
+ "path": "C:\\Superalgos\\Network"
+ },
+ {
+ "path": "C:\\Superalgos\\Projects\\Network"
+ },
+ {
+ "path": "C:\\Superalgos\\Projects\\Social-Trading"
+ }
+ ],
+ "settings": {}
+}
\ No newline at end of file
diff --git a/Network/.vscode/settings.json b/Network/.vscode/settings.json
new file mode 100644
index 000000000..e94f27f6f
--- /dev/null
+++ b/Network/.vscode/settings.json
@@ -0,0 +1,17 @@
+{
+ "files.exclude": {
+ "**/Data-Storage": true,
+ "**/Documentation": true,
+ "**/Log-Files": true,
+ "**/node_modules": true,
+ "**/Deprecated-Code": true
+ },
+ "search.exclude": {
+ "**/Data-Storage": true,
+ "**/Documentation": true,
+ "**/Log-Files": true,
+ "**/node_modules": true,
+ "**/Deprecated-Code": true
+ },
+ "search.maintainFileSearchCache": true
+}
\ No newline at end of file
diff --git a/Network/NetwokNode.js b/Network/NetwokNode.js
index fa5c8f701..af1913a24 100644
--- a/Network/NetwokNode.js
+++ b/Network/NetwokNode.js
@@ -1,28 +1,24 @@
+exports.newNetworkNode = function newNetworkNode() {
-
-global.NT = {
- memory: {
- 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.
- POSTS: new Map(), // This are all the posts we are keeping track of.
- EVENTS: new Map(), // This is the registry of all events received that prevents processing them more than once.
- },
- arrays: {
- EVENTS: [], // A time ordered list of events.
- 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.
- }
- },
- modules: {
- USER_PROFILE: require('./UserProfile.js'),
- BOT: require('./BotProfile.js'),
- EVENT: require('./Event.js'),
- POST: require('./Post.js'),
- QUERY: require('./Query.js'),
- QUERY_PROFILE_STATS: require('./Queries/ProfileStats.js'),
- QUERY_PROFILE_POSTS: require('./Queries/ProfilePosts.js'),
- QUERY_POST_REPLIES: require('./Queries/ProfileReplies.js'),
- QUERY_EVENTS: require('./Queries/Events.js')
+ let thisObject = {
+ run: run
}
-}
\ No newline at end of file
+
+ return thisObject
+
+ function run() {
+ /*
+ Let's start the Network Interfaces
+ */
+ NT.webSocketsInterface = NT.projects.network.modules.webSocketsInterface.newNetworkModulesWebSocketsInterface()
+ NT.webSocketsInterface.initialize()
+
+ start()
+
+ async function start() {
+ let socialGraphService = NT.projects.socialTrading.modules.socialGraph.newSocialGraph()
+ await socialGraphService.initialize()
+ }
+
+ }
+}
diff --git a/Network/Queries/Events.js b/Network/Queries/Events.js
deleted file mode 100644
index bb84a4de8..000000000
--- a/Network/Queries/Events.js
+++ /dev/null
@@ -1,245 +0,0 @@
-exports.newEvents = function newEvents() {
-
- let thisObject = {
- profile: undefined,
- initialIndex: undefined,
- amountRequested: undefined,
- direction: undefined,
- execute: execute,
- initialize: initialize,
- finalize: finalize
- }
-
- const INITIAL_EVENT_INDEX_FIRST = 'First'
- const INITIAL_EVENT_INDEX_LAST = 'Last'
- const MIN_AMOUNT_REQUESTED = 1
- const MAX_AMOUNT_REQUESTED = 100
- const DIRECTION_FUTURE = 'Future'
- const DIRECTION_PAST = 'Past'
-
- return thisObject
-
- function finalize() {
- thisObject.profile = undefined
- }
-
- function initialize(queryReceived) {
- /*
- Validate User Profile
- */
- if (queryReceived.emitterUserProfileId !== undefined) {
- thisObject.profile = NT.memory.maps.USER_PROFILES_BY_ID.get(queryReceived.emitterUserProfileId)
- } else {
- thisObject.profile = NT.memory.maps.USER_PROFILES_BY_HANDLE.get(queryReceived.emitterUserProfileHandle)
- }
-
- if (thisObject.profile === undefined) {
- throw ('Emitter User Profile Not Found.')
- }
- /*
- Validate Initial Index
- */
- if (queryReceived.initialIndex === undefined) {
- throw ('Initial Index Undefined.')
- }
-
- if (queryReceived.initialIndex === INITIAL_EVENT_INDEX_LAST) {
- queryReceived.initialIndex = thisObject.profile.posts.length - 1
- }
-
- if (queryReceived.initialIndex === INITIAL_EVENT_INDEX_FIRST) {
- queryReceived.initialIndex = 0
- }
-
- if (isNaN(queryReceived.initialIndex) === true) {
- throw ('Initial Event Is Not a Number.')
- }
-
- thisObject.initialIndex = queryReceived.initialIndex
- /*
- Validate Amount Requested
- */
- if (queryReceived.amountRequested === undefined) {
- throw ('Amount Requested Undefined.')
- }
-
- if (isNaN(queryReceived.amountRequested) === true) {
- throw ('Amount Requested Is Not a Number.')
- }
-
- if (queryReceived.amountRequested < MIN_AMOUNT_REQUESTED) {
- throw ('Amount Requested Below Min.')
- }
-
- if (queryReceived.amountRequested > MAX_AMOUNT_REQUESTED) {
- throw ('Amount Requested Above Max.')
- }
- /*
- Validate Direction
- */
- if (queryReceived.direction === undefined) {
- throw ('Direction Undefined.')
- }
-
- if (queryReceived.direction !== DIRECTION_FUTURE && queryReceived.direction !== DIRECTION_PAST) {
- throw ('Direction Not Supported.')
- }
-
- thisObject.direction = queryReceived.direction
-
- }
-
- function execute() {
- let response = []
- switch (thisObject.direction) {
- case DIRECTION_FUTURE: {
- for (let i = thisObject.initialIndex; i < thisObject.initialIndex + thisObject.amountRequested; i++) {
- let event = NT.memory.arrays.EVENTS[i]
- if (event === undefined) { break }
- checkEventContext(event)
- }
- break
- }
- case DIRECTION_PAST: {
- for (let i = thisObject.initialIndex; i > thisObject.initialIndex - thisObject.amountRequested; i--) {
- let event = NT.memory.arrays.EVENTS[i]
- if (event === undefined) { break }
- checkEventContext(event)
- }
- break
- }
- }
- return response
-
- function checkEventContext(event) {
- /*
- For an event to be returned at the response of this query, it needs to be related
- to the profile making the query. How it can be related?
-
- 1. The Emitter or Target profile must be the same as the Query Profile.
- 2. The Emitter or Traget profile must be at the Following map of the Query Profile.
- 3. The Emmiter or Target post must be belong to any profile at the Following of the Query Profile.
-
- Any of the above happening, means that indeed it is related.
- */
- let emitterUserProfile = NT.memory.maps.USER_PROFILES_BY_ID.get(eventReceived.emitterUserProfileId)
- let targetUserProfile = NT.memory.maps.USER_PROFILES_BY_ID.get(eventReceived.targetUserProfileId)
- let emitterPost = NT.memory.maps.POSTS.get(eventReceived.emitterPostHash)
- let targetPost = NT.memory.maps.POSTS.get(eventReceived.targetPostHash)
- /*
- Test #1 : The Emitter or Target profile must be the same as the Query Profile.
- */
- if (emitterUserProfile !== undefined) {
- if (emitterUserProfile.userProfieId === thisObject.profile.userProfieId) {
- addToResponse(event)
- return
- }
- }
- if (targetUserProfile !== undefined) {
- if (targetUserProfile.userProfieId === thisObject.profile.userProfieId) {
- addToResponse(event)
- return
- }
- }
- /*
- Test #2 : The Emitter or Traget profile must be at the Following map of the Query Profile.
- */
- if (emitterUserProfile !== undefined) {
- if (thisObject.profile.following.get(emitterUserProfile.userProfieId) !== undefined) {
- addToResponse(event)
- return
- }
- }
- if (targetUserProfile !== undefined) {
- if (thisObject.profile.following.get(targetUserProfile.userProfieId) !== undefined) {
- addToResponse(event)
- return
- }
- }
- /*
- Test #3 : The Emmiter or Target post must be belong to any profile at the Following of the Query Profile.
- */
- if (emitterPost !== undefined) {
- if (thisObject.profile.following.get(emitterPost.emitterUserProfileId) !== undefined) {
- addToResponse(event)
- return
- }
- }
- if (emitterPost !== undefined) {
- if (thisObject.profile.following.get(emitterPost.targetUserProfileId) !== undefined) {
- addToResponse(event)
- return
- }
- }
- if (targetPost !== undefined) {
- if (thisObject.profile.following.get(targetPost.emitterUserProfileId) !== undefined) {
- addToResponse(event)
- return
- }
- }
- if (targetPost !== undefined) {
- if (thisObject.profile.following.get(targetPost.targetUserProfileId) !== undefined) {
- addToResponse(event)
- return
- }
- }
-
- function addToResponse(event) {
-
- let eventResponse = {
- eventId: event.eventId,
- eventType: event.eventType,
- emitterUserProfileId: event.emitterUserProfileId,
- targetUserProfileId: event.targetUserProfileId,
- emitterPostHash: event.emitterPostHash,
- targetPostHash: event.targetPostHash,
- timestamp: event.timestamp,
- botId: event.botId,
- botAsset: event.botAsset,
- botExchange: event.botExchange
- }
-
- if (emitterUserProfile !== undefined) {
- let query = NT.modules.QUERY_PROFILE_STATS.newProfileStats()
- query.initialize({ targetUserProfileId: event.emitterUserProfileId })
- eventResponse.emitterUserProfile = query.execute()
- }
-
- if (targetUserProfile !== undefined) {
- let query = NT.modules.QUERY_PROFILE_STATS.newProfileStats()
- query.initialize({ targetUserProfileId: event.targetUserProfileId })
- eventResponse.targetUserProfile = query.execute()
- }
-
- if (emitterPost !== undefined) {
- eventResponse.emitterPost = addPost(emitterPost)
- }
-
- if (targetPost !== undefined) {
- eventResponse.targetPost = addPost(targetPost)
- }
-
- response.push(eventResponse)
-
- function addPost(post) {
- let postResponse = {
- emitterUserProfileId: post.emitterUserProfileId,
- targetUserProfileId: post.targetUserProfileId,
- emitterPostHash: post.emitterPostHash,
- targetPostHash: post.targetPostHash,
- postType: post.postType,
- timestamp: post.timestamp,
- repliesCount: post.replies.length,
- reactionsCount: []
- }
-
- for (let i = 0; i < post.reactionTypesCount; i++) {
- postResponse.reactionsCount.push(post.reactionsCount.get(i))
- }
-
- return postResponse
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/Network/Queries/PostReplies.js b/Network/Queries/PostReplies.js
deleted file mode 100644
index 788af16b4..000000000
--- a/Network/Queries/PostReplies.js
+++ /dev/null
@@ -1,129 +0,0 @@
-exports.newPostReplies = function newPostReplies() {
-
- let thisObject = {
- post: undefined,
- initialIndex: undefined,
- amountRequested: undefined,
- direction: undefined,
- execute: execute,
- initialize: initialize,
- finalize: finalize
- }
-
- const INITIAL_REPLY_INDEX_FIRST = 'First'
- const INITIAL_REPLY_INDEX_LAST = 'Last'
- const MIN_AMOUNT_REQUESTED = 1
- const MAX_AMOUNT_REQUESTED = 100
- const DIRECTION_FUTURE = 'Future'
- const DIRECTION_PAST = 'Past'
-
- return thisObject
-
- function finalize() {
- thisObject.post = undefined
- }
-
- function initialize(queryReceived) {
- /*
- Validate Post
- */
- thisObject.post = NT.memory.maps.POSTS.get(queryReceived.targetPostHash)
-
- if (thisObject.post === undefined) {
- throw ('Target Post Not Found.')
- }
- /*
- Validate Initial Index
- */
- if (queryReceived.initialIndex === undefined) {
- throw ('Initial Index Undefined.')
- }
-
- if (queryReceived.initialIndex === INITIAL_REPLY_INDEX_LAST) {
- queryReceived.initialIndex = thisObject.poat.replies.length - 1
- }
-
- if (queryReceived.initialIndex === INITIAL_REPLY_INDEX_FIRST) {
- queryReceived.initialIndex = 0
- }
-
- if (isNaN(queryReceived.initialIndex) === true) {
- throw ('Initial Reply Is Not a Number.')
- }
-
- thisObject.initialIndex = queryReceived.initialIndex
- /*
- Validate Amount Requested
- */
- if (queryReceived.amountRequested === undefined) {
- throw ('Amount Requested Undefined.')
- }
-
- if (isNaN(queryReceived.amountRequested) === true) {
- throw ('Amount Requested Is Not a Number.')
- }
-
- if (queryReceived.amountRequested < MIN_AMOUNT_REQUESTED) {
- throw ('Amount Requested Below Min.')
- }
-
- if (queryReceived.amountRequested > MAX_AMOUNT_REQUESTED) {
- throw ('Amount Requested Above Max.')
- }
- /*
- Validate Direction
- */
- if (queryReceived.direction === undefined) {
- throw ('Direction Undefined.')
- }
-
- if (queryReceived.direction !== DIRECTION_FUTURE && queryReceived.direction !== DIRECTION_PAST) {
- throw ('Direction Not Supported.')
- }
-
- thisObject.direction = queryReceived.direction
-
- }
-
- function execute() {
- let response = []
- switch (thisObject.direction) {
- case DIRECTION_FUTURE: {
- for (let i = thisObject.initialIndex; i < thisObject.initialIndex + thisObject.amountRequested; i++) {
- let post = thisObject.post.replies[i]
- if (post === undefined) { break }
- addToResponse(post)
- }
- break
- }
- case DIRECTION_PAST: {
- for (let i = thisObject.initialIndex; i > thisObject.initialIndex - thisObject.amountRequested; i--) {
- let post = thisObject.post.replies[i]
- if (post === undefined) { break }
- addToResponse(post)
- }
- break
- }
- }
- return response
-
- function addToResponse(post) {
- let postResponse = {
- emitterUserProfileId: post.emitterUserProfileId,
- targetUserProfileId: post.targetUserProfileId,
- emitterPostHash: post.emitterPostHash,
- targetPostHash: post.targetPostHash,
- postType: post.postType,
- timestamp: post.timestamp,
- repliesCount: post.replies.length,
- reactionsCount: []
- }
-
- for (let i = 0; i < post.reactionTypesCount; i++) {
- postResponse.reactionsCount.push(post.reactionsCount.get(i))
- }
-
- response.push(postResponse)
- }
- }
-}
\ No newline at end of file
diff --git a/Network/Queries/ProfilePosts.js b/Network/Queries/ProfilePosts.js
deleted file mode 100644
index fab001ff7..000000000
--- a/Network/Queries/ProfilePosts.js
+++ /dev/null
@@ -1,133 +0,0 @@
-exports.newProfilePosts = function newProfilePosts() {
-
- let thisObject = {
- profile: undefined,
- initialIndex: undefined,
- amountRequested: undefined,
- direction: undefined,
- execute: execute,
- initialize: initialize,
- finalize: finalize
- }
-
- const INITIAL_POST_INDEX_FIRST = 'First'
- const INITIAL_POST_INDEX_LAST = 'Last'
- const MIN_AMOUNT_REQUESTED = 1
- const MAX_AMOUNT_REQUESTED = 100
- const DIRECTION_FUTURE = 'Future'
- const DIRECTION_PAST = 'Past'
-
- return thisObject
-
- function finalize() {
- thisObject.profile = undefined
- }
-
- function initialize(queryReceived) {
- /*
- Validate User Profile
- */
- if (queryReceived.targetUserProfileId !== undefined) {
- thisObject.profile = NT.memory.maps.USER_PROFILES_BY_ID.get(queryReceived.targetUserProfileId)
- } else {
- thisObject.profile = NT.memory.maps.USER_PROFILES_BY_HANDLE.get(queryReceived.targetUserProfileHandle)
- }
-
- if (thisObject.profile === undefined) {
- throw ('Target User Profile Not Found.')
- }
- /*
- Validate Initial Index
- */
- if (queryReceived.initialIndex === undefined) {
- throw ('Initial Index Undefined.')
- }
-
- if (queryReceived.initialIndex === INITIAL_POST_INDEX_LAST) {
- queryReceived.initialIndex = thisObject.profile.posts.length - 1
- }
-
- if (queryReceived.initialIndex === INITIAL_POST_INDEX_FIRST) {
- queryReceived.initialIndex = 0
- }
-
- if (isNaN(queryReceived.initialIndex) === true) {
- throw ('Initial Post Is Not a Number.')
- }
-
- thisObject.initialIndex = queryReceived.initialIndex
- /*
- Validate Amount Requested
- */
- if (queryReceived.amountRequested === undefined) {
- throw ('Amount Requested Undefined.')
- }
-
- if (isNaN(queryReceived.amountRequested) === true) {
- throw ('Amount Requested Is Not a Number.')
- }
-
- if (queryReceived.amountRequested < MIN_AMOUNT_REQUESTED) {
- throw ('Amount Requested Below Min.')
- }
-
- if (queryReceived.amountRequested > MAX_AMOUNT_REQUESTED) {
- throw ('Amount Requested Above Max.')
- }
- /*
- Validate Direction
- */
- if (queryReceived.direction === undefined) {
- throw ('Direction Undefined.')
- }
-
- if (queryReceived.direction !== DIRECTION_FUTURE && queryReceived.direction !== DIRECTION_PAST) {
- throw ('Direction Not Supported.')
- }
-
- thisObject.direction = queryReceived.direction
-
- }
-
- function execute() {
- let response = []
- switch (thisObject.direction) {
- case DIRECTION_FUTURE: {
- for (let i = thisObject.initialIndex; i < thisObject.initialIndex + thisObject.amountRequested; i++) {
- let post = thisObject.profile.posts[i]
- if (post === undefined) { break }
- addToResponse(post)
- }
- break
- }
- case DIRECTION_PAST: {
- for (let i = thisObject.initialIndex; i > thisObject.initialIndex - thisObject.amountRequested; i--) {
- let post = thisObject.profile.posts[i]
- if (post === undefined) { break }
- addToResponse(post)
- }
- break
- }
- }
- return response
-
- function addToResponse(post) {
- let postResponse = {
- emitterUserProfileId: post.emitterUserProfileId,
- targetUserProfileId: post.targetUserProfileId,
- emitterPostHash: post.emitterPostHash,
- targetPostHash: post.targetPostHash,
- postType: post.postType,
- timestamp: post.timestamp,
- repliesCount: post.replies.length,
- reactionsCount: []
- }
-
- for (let i = 0; i < post.reactionTypesCount; i++) {
- postResponse.reactionsCount.push(post.reactionsCount.get(i))
- }
-
- response.push(postResponse)
- }
- }
-}
\ No newline at end of file
diff --git a/Network/Query.js b/Network/Query.js
deleted file mode 100644
index 3c5d24dfd..000000000
--- a/Network/Query.js
+++ /dev/null
@@ -1,63 +0,0 @@
-exports.newQuery = function newQuery() {
-
- let thisObject = {
- query: undefined,
- queryType: undefined,
- execute: execute,
- initialize: initialize,
- finalize: finalize
- }
-
- const QUERY_TYPES = {
-
- PROFILE_STATS: 0,
- PROFILE_POSTS: 1,
- POST_REPLIES: 2,
- EVENTS: 3
-
- }
-
- return thisObject
-
- function finalize() {
- thisObject.query = undefined
- thisObject.queryType = undefined
- }
-
- function initialize(queryReceived) {
-
- thisObject.queryType = queryReceived.queryType
-
- switch (thisObject.queryType) {
-
- case QUERY_TYPES.PROFILE_STATS: {
- thisObject.query = NT.modules.QUERY_PROFILE_STATS.newProfileStats()
- query.initialize(queryReceived)
- break
- }
-
- case QUERY_TYPES.PROFILE_POSTS: {
- thisObject.query = NT.modules.QUERY_PROFILE_POSTS.newProfilePosts()
- query.initialize(queryReceived)
- break
- }
-
- case QUERY_TYPES.POST_REPLIES: {
- thisObject.query = NT.modules.QUERY_POST_REPLIES.newPostReplies()
- query.initialize(queryReceived)
- break
- }
-
- case QUERY_TYPES.maps.EVENTS: {
- thisObject.query = NT.modules.QUERY_EVENTS.newEvents()
- query.initialize(queryReceived)
- break
- }
- default: throw('Query Type Not Supported.')
- }
- }
-
- function execute() {
- return thisObject.query.execute()
- }
-}
\ No newline at end of file
diff --git a/Network/botProfile.js b/Network/botProfile.js
deleted file mode 100644
index baa427101..000000000
--- a/Network/botProfile.js
+++ /dev/null
@@ -1,137 +0,0 @@
-exports.newUserProfile = function newUserProfile() {
-
- let thisObject = {
- botProfileId: undefined,
- botProfileHandle: undefined,
- botAsset: undefined,
- botExchange: undefined,
- enabled: undefined,
- following: undefined,
- followers: undefined,
- followingCount: undefined,
- followersCount: undefined,
- emitterEventsCount: undefined,
- targetEventsCount: undefined,
- postsCount: undefined,
- posts: undefined,
- addPost: addPost,
- removePost: removePost,
- addFollowing: addFollowing,
- removeFollowing: removeFollowing,
- addFollower: addFollower,
- removeFollower: removeFollower,
- initialize: initialize,
- finalize: finalize
- }
-
- return thisObject
-
- function finalize() {
- thisObject.following = undefined
- thisObject.followers = undefined
-
- thisObject.posts = undefined
- }
-
- function initialize() {
-
- thisObject.following = new Map()
- thisObject.followers = new Map()
-
- thisObject.followingCount = 0
- thisObject.followersCount = 0
-
- thisObject.emitterEventsCount = 0
- thisObject.targetEventsCount = 0
- thisObject.postsCount = 0
-
- thisObject.posts = []
- }
-
- function addPost(
- emitterUserProfileId,
- targetUserProfileId,
- emitterBotProfileId,
- targetBotProfileId,
- emitterPostHash,
- targetPostHash,
- postType,
- timestamp
- ) {
- if (NT.memory.maps.POSTS.get(emitterPostHash) !== undefined) {
- throw ('Post Already Exists.')
- }
-
- let post = NT.modules.POST.newPost()
- post.initialize(
- emitterUserProfileId,
- targetUserProfileId,
- emitterBotProfileId,
- targetBotProfileId,
- emitterPostHash,
- targetPostHash,
- postType,
- timestamp
- )
-
- thisObject.posts.push(post)
- NT.memory.maps.POSTS.set(emitterPostHash, post)
- thisObject.postsCount++
- }
-
- function removePost(
- emitterPostHash
- ) {
- if (NT.memory.maps.POSTS.get(emitterPostHash) === undefined) {
- throw ('Post Does Not Exist.')
- }
-
- let post = thisObject.posts.get(emitterPostHash)
- post.finalize()
-
- for (let i = thisObject.posts.length - 1; i >= 0; i--) {
- if (thisObject.posts[i].emitterPostHash === emitterPostHash) {
- thisObject.posts.splice(i, 1)
- break
- }
- }
- NT.memory.maps.POSTS.delete(emitterPostHash)
- thisObject.postsCount--
- }
-
- function addFollowing(
- botProfile
- ) {
- if (thisObject.following.get(botProfile.id) === undefined) {
- thisObject.following.set(botProfile.id, botProfile)
- thisObject.followingCount++
- }
- }
-
- function removeFollowing(
- botProfile
- ) {
- if (thisObject.following.get(botProfile.id) !== undefined) {
- thisObject.following.delete(botProfile.id)
- thisObject.followingCount--
- }
- }
-
- function addFollower(
- botProfile
- ) {
- if (thisObject.followers.get(botProfile.id) === undefined) {
- thisObject.followers.set(botProfile.id, botProfile)
- thisObject.followersCount++
- }
- }
-
- function removeFollower(
- botProfile
- ) {
- if (thisObject.followers.get(botProfile.id) !== undefined) {
- thisObject.followers.delete(botProfile.id)
- thisObject.followersCount--
- }
- }
-}
diff --git a/Network/clientsInterface.js b/Network/clientsInterface.js
deleted file mode 100644
index b7c34d125..000000000
--- a/Network/clientsInterface.js
+++ /dev/null
@@ -1,76 +0,0 @@
-exports.newClientInterface = function newClientInterface() {
-
- let thisObject = {
- eventReceived: eventReceived,
- queryReceived: queryReceived,
- initialize: initialize,
- finalize: finalize
- }
-
- return thisObject
-
- function finalize() {
-
- }
-
- function initialize() {
-
- }
-
- function eventReceived(eventMessage) {
- /*
- We expect here a JSON string with the following properties:
-
- {
- "eventId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
- "eventType": 10,
- "emitterUserProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
- "targetUserProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
- "emitterPostHash": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
- "targetPostHash": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
- "timestamp": 124234234234,
- "botId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
- "botAsset": "BTC",
- "botExchange": "Binance"
- }
- */
-
- let eventReceived = JSON.parse(eventMessage)
- if (NT.memory.maps.EVENTS.get(eventReceived.eventId) !== undefined) {
- throw ('Event Already Exists.')
- }
-
- let event = NT.modules.EVENT.newEvent()
- event.initialize(eventReceived)
- NT.memory.maps.EVENTS.set(eventReceived.eventId, event)
- }
-
- function queryReceived(queryMessage) {
- /*
- We expect here a JSON string with the following properties:
-
- {
- "equeryId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
- "queryType": 10,
- "emitterUserProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
- "targetUserProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
- "emitterUserProfileHandle": "Luis-Fernando-Molina",
- "targetUserProfileHandle": "Luis-Fernando-Molina",
- "emitterPostHash": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
- "targetPostHash": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
- "timestamp": 124234234234,
- "botId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
- "botAsset": "BTC",
- "botExchange": "Binance",
- "initialIndex": 35,
- "amountRequested": 50,
- "direction": "Past"
- }
- */
-
- let queryReceived = JSON.parse(queryMessage)
- let query = NT.modules.QUERY.newQuery()
- query.initialize(queryReceived)
- return query.execute()
- }
-}
\ No newline at end of file
diff --git a/Network/event.js b/Network/event.js
deleted file mode 100644
index ba63b45bc..000000000
--- a/Network/event.js
+++ /dev/null
@@ -1,321 +0,0 @@
-exports.newEvent = function newEvent() {
-
- let thisObject = {
- eventId: undefined,
- emitterUserProfileId: undefined,
- targetUserProfileId: undefined,
- emitterBotProfileId: undefined,
- targetBotProfileId: undefined,
- emitterPostHash: undefined,
- targetPostHash: undefined,
- timestamp: undefined,
- botId: undefined,
- botAsset: undefined,
- botExchange: undefined,
- initialize: initialize,
- finalize: finalize
- }
-
- const EVENT_TYPES = {
-
- NEW_USER_POST: 10,
- REPLY_TO_USER_POST: 11,
- REPOST_USER_POST: 12,
- QUOTE_REPOST_USER_POST: 13,
- REMOVE_USER_POST: 14,
- FOLLOW_USER_PROFILE: 15,
- UNFOLLOW_USER_PROFILE: 16,
-
- NEW_BOT_POST: 20,
- REPLY_TO_BOT_POST: 21,
- REPOST_BOT_POST: 22,
- QUOTE_REPOST_BOT_POST: 23,
- REMOVE_BOT_POST: 24,
- FOLLOW_BOT_PROFILE: 25,
- UNFOLLOW_BOT_PROFILE: 26,
-
- ADD_BOT: 50,
- REMOVE_BOT: 51,
- ENABLE_BOT: 52,
- DISABLE_BOT: 53,
-
- ADD_REACTION_LIKE: 100,
- ADD_REACTION_LOVE: 101,
- ADD_REACTION_HAHA: 102,
- ADD_REACTION_WOW: 103,
- ADD_REACTION_SAD: 104,
- ADD_REACTION_ANGRY: 105,
- ADD_REACTION_HUG: 106,
-
- REMOVE_REACTION_LIKE: 200,
- REMOVE_REACTION_LOVE: 201,
- REMOVE_REACTION_HAHA: 202,
- REMOVE_REACTION_WOW: 203,
- REMOVE_REACTION_SAD: 204,
- REMOVE_REACTION_ANGRY: 205,
- REMOVE_REACTION_HUG: 206
- }
-
- return thisObject
-
- function finalize() {
- emitterUserProfile = undefined
- targetUserProfile = undefined
- }
-
- function initialize(eventReceived) {
- /*
- Store the message properties into this object properties.
- */
- thisObject.eventId = eventReceived.eventId
- thisObject.emitterUserProfileId = eventReceived.emitterUserProfileId
- thisObject.targetUserProfileId = eventReceived.targetUserProfileId
- thisObject.emitterBotProfileId = eventReceived.emitterBotProfileId
- thisObject.targetBotProfileId = eventReceived.targetBotProfileId
- thisObject.emitterPostHash = eventReceived.emitterPostHash
- thisObject.targetPostHash = eventReceived.targetPostHash
- thisObject.timestamp = eventReceived.timestamp
- thisObject.botId = eventReceived.botId
- thisObject.botAsset = eventReceived.botAsset
- thisObject.botExchange = eventReceived.botExchange
- /*
- Validate Emitter User Profile.
- */
- let emitterUserProfile = NT.memory.maps.USER_PROFILES_BY_ID.get(thisObject.emitterUserProfileId)
- if (emitterUserProfile === undefined) {
- throw ('Emitter User Profile Not Found.')
- }
- emitterUserProfile.emitterEventsCount++
- /*
- Validate Target User Profile.
- */
- let targetUserProfile = NT.memory.maps.USER_PROFILES_BY_ID.get(thisObject.targetUserProfileId)
- if (targetUserProfile === undefined) {
- /* We thow an exception when it does not have a target user profile and is required*/
- if (
- thisObject.eventType !== EVENT_TYPES.NEW_USER_POST &&
- thisObject.eventType !== EVENT_TYPES.NEW_BOT_POST
- ) {
- throw ('Target User Profile Not Found.')
- }
- } else {
- targetUserProfile.targetEventsCount++
- }
- /*
- Validate Emitter Bot Profile.
- */
- if (emitterBotProfileId !== undefined) {
- let botProfile = emitterUserProfile.bots.get(emitterBotProfileId)
- if (
- emitterBotProfile === undefined
- ) {
- throw ('Emitter BOt Profile Not Found.')
- }
- }
- /*
- Is is related to Posting?
- */
- if (
- thisObject.eventType === EVENT_TYPES.NEW_USER_POST ||
- thisObject.eventType === EVENT_TYPES.REPLY_TO_USER_POST ||
- thisObject.eventType === EVENT_TYPES.REPOST_USER_POST ||
- thisObject.eventType === EVENT_TYPES.QUOTE_REPOST_USER_POST ||
- thisObject.eventType === EVENT_TYPES.NEW_BOT_POST ||
- thisObject.eventType === EVENT_TYPES.REPLY_TO_BOT_POST ||
- thisObject.eventType === EVENT_TYPES.REPOST_BOT_POST ||
- thisObject.eventType === EVENT_TYPES.QUOTE_REPOST_BOT_POST
- ) {
- /*
- New User Post
- */
- if (
- thisObject.eventType === EVENT_TYPES.NEW_USER_POST ||
- thisObject.eventType === EVENT_TYPES.REPLY_TO_USER_POST ||
- thisObject.eventType === EVENT_TYPES.REPOST_USER_POST ||
- thisObject.eventType === EVENT_TYPES.QUOTE_REPOST_USER_POST
- ) {
- emitterUserProfile.addPost(
- thisObject.emitterUserProfileId,
- thisObject.targetUserProfileId,
- thisObject.emitterBotProfileId,
- thisObject.targetBotProfileId,
- thisObject.emitterPostHash,
- thisObject.targetPostHash,
- thisObject.eventType - 10,
- thisObject.timestamp
- )
- return
- }
- /*
- New Bot Post
- */
- if (
- thisObject.eventType === EVENT_TYPES.NEW_BOT_POST ||
- thisObject.eventType === EVENT_TYPES.REPLY_TO_BOT_POST ||
- thisObject.eventType === EVENT_TYPES.REPOST_BOT_POST ||
- thisObject.eventType === EVENT_TYPES.QUOTE_REPOST_BOT_POST
- ) {
- emitterBotProfile.addPost(
- thisObject.emitterUserProfileId,
- thisObject.targetUserProfileId,
- thisObject.emitterBotProfileId,
- thisObject.targetBotProfileId,
- thisObject.emitterPostHash,
- thisObject.targetPostHash,
- thisObject.eventType - 20,
- thisObject.timestamp
- )
- return
- }
- /*
- Remove User Post
- */
- if (
- thisObject.eventType === EVENT_TYPES.REMOVE_USER_POST
- ) {
- emitterUserProfile.removePost(
- thisObject.emitterPostHash
- )
- return
- }
- /*
- Remove Bot Post
- */
- if (
- thisObject.eventType === EVENT_TYPES.REMOVE_USER_POST
- ) {
- emitterBotProfile.removePost(
- thisObject.emitterPostHash
- )
- return
- }
- }
- /*
- Is is a following?
- */
- if (
- thisObject.eventType === EVENT_TYPES.FOLLOW_USER_PROFILE ||
- thisObject.eventType === EVENT_TYPES.UNFOLLOW_USER_PROFILE ||
- thisObject.eventType === EVENT_TYPES.FOLLOW_BOT_PROFILE ||
- thisObject.eventType === EVENT_TYPES.UNFOLLOW_BOT_PROFILE
- ) {
- switch (thisObject.eventType) {
- case EVENT_TYPES.FOLLOW_USER_PROFILE: {
- emitterUserProfile.addFollowing(
- targetUserProfile
- )
- targetUserProfile.addFollower(
- emitterUserProfile
- )
- break
- }
- case EVENT_TYPES.UNFOLLOW_USER_PROFILE: {
- emitterUserProfile.removeFollowing(
- targetUserProfile
- )
- targetUserProfile.removeFollower(
- emitterUserProfile
- )
- break
- }
- case EVENT_TYPES.FOLLOW_BOT_PROFILE: {
- emitterUserProfile.addTradePostsFollowing(
- targetUserProfile
- )
- targetUserProfile.addTradePostsFollower(
- emitterUserProfile
- )
- break
- }
- case EVENT_TYPES.UNFOLLOW_BOT_PROFILE: {
- emitterUserProfile.removeTradePostsFollowing(
- targetUserProfile
- )
- targetUserProfile.removeTradePostsFollower(
- emitterUserProfile
- )
- break
- }
- }
- return
- }
- /*
- Is is a Reaction?
- */
- if (
- thisObject.eventType === EVENT_TYPES.ADD_REACTION_LIKE ||
- thisObject.eventType === EVENT_TYPES.ADD_REACTION_LOVE ||
- thisObject.eventType === EVENT_TYPES.ADD_REACTION_HAHA ||
- thisObject.eventType === EVENT_TYPES.ADD_REACTION_WOW ||
- thisObject.eventType === EVENT_TYPES.ADD_REACTION_SAD ||
- thisObject.eventType === EVENT_TYPES.ADD_REACTION_ANGRY ||
- thisObject.eventType === EVENT_TYPES.ADD_REACTION_HUG
- ) {
- let targetPost = NT.memory.maps.POSTS.get(thisObject.targetPostHash)
-
- if (targetPost === undefined) {
- throw ('Target Post Not Found')
- }
-
- targetPost.addReaction(thisObject.eventType - 100)
- return
- }
- if (
- thisObject.eventType === EVENT_TYPES.REMOVE_REACTION_LIKE ||
- thisObject.eventType === EVENT_TYPES.REMOVE_REACTION_LOVE ||
- thisObject.eventType === EVENT_TYPES.REMOVE_REACTION_HAHA ||
- thisObject.eventType === EVENT_TYPES.REMOVE_REACTION_WOW ||
- thisObject.eventType === EVENT_TYPES.REMOVE_REACTION_SAD ||
- thisObject.eventType === EVENT_TYPES.REMOVE_REACTION_ANGRY ||
- thisObject.eventType === EVENT_TYPES.REMOVE_REACTION_HUG
- ) {
- let targetPost = NT.memory.maps.POSTS.get(thisObject.targetPostHash)
-
- if (targetPost === undefined) {
- throw ('Target Post Not Found')
- }
-
- targetPost.removeReaction(thisObject.eventType - 200)
- return
- }
- /*
- Is is a Bot?
- */
- if (
- thisObject.eventType === EVENT_TYPES.ADD_BOT ||
- thisObject.eventType === EVENT_TYPES.REMOVE_BOT ||
- thisObject.eventType === EVENT_TYPES.ENABLE_BOT ||
- thisObject.eventType === EVENT_TYPES.DISABLE_BOT
- ) {
- switch (thisObject.eventType) {
- case EVENT_TYPES.ADD_BOT: {
- emitterUserProfile.addBot(
- thisObject.botId,
- thisObject.botAsset,
- thisObject.botExchange
- )
- break
- }
- case EVENT_TYPES.REMOVE_BOT: {
- emitterUserProfile.removeBot(
- thisObject.botId
- )
- break
- }
- case EVENT_TYPES.ENABLE_BOT: {
- emitterUserProfile.enableBot(
- thisObject.botId
- )
- break
- }
- case EVENT_TYPES.DISABLE_BOT: {
- emitterUserProfile.disableBot(
- thisObject.botId
- )
- break
- }
- }
- return
- }
- }
-}
\ No newline at end of file
diff --git a/Network/post.js b/Network/post.js
deleted file mode 100644
index 9b35c95cb..000000000
--- a/Network/post.js
+++ /dev/null
@@ -1,129 +0,0 @@
-exports.newPost = function newPost() {
-
- let thisObject = {
- emitterUserProfileId: undefined,
- targetUserProfileId: undefined,
- emitterBotProfileId: undefined,
- targetBotProfileId: undefined,
- emitterPostHash: undefined,
- targetPostHash: undefined,
- postType: undefined,
- timestamp: undefined,
- replies: undefined,
- reactionsCount: undefined,
- reactionTypesCount: undefined,
- addReaction: addReaction,
- removeReactions: removeReaction,
- initialize: initialize,
- 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_HUG: 6
- }
-
- thisObject.reactionTypesCount = 7
-
- thisObject.reactionsCount = new Map()
- thisObject.reactionsCount.set(REACTION_TYPES.REACTION_LIKE, 0)
- thisObject.reactionsCount.set(REACTION_TYPES.REACTION_LOVE, 0)
- thisObject.reactionsCount.set(REACTION_TYPES.REACTION_HAHA, 0)
- thisObject.reactionsCount.set(REACTION_TYPES.REACTION_WOW, 0)
- thisObject.reactionsCount.set(REACTION_TYPES.REACTION_SAD, 0)
- thisObject.reactionsCount.set(REACTION_TYPES.REACTION_ANGRY, 0)
- thisObject.reactionsCount.set(REACTION_TYPES.REACTION_HUG, 0)
-
- return thisObject
-
- function finalize() {
- thisObject.emitterUserProfileId = undefined
- thisObject.targetUserProfileId = undefined
- thisObject.emitterBotProfileId = undefined
- thisObject.targetBotProfileId = undefined
- thisObject.emitterPostHash = undefined
- thisObject.targetPostHash = undefined
- thisObject.postType = undefined
- thisObject.timestamp = undefined
- thisObject.replies = undefined
- }
-
- function initialize(
- emitterUserProfileId,
- targetUserProfileId,
- emitterBotProfileId,
- targetBotProfileId,
- emitterPostHash,
- targetPostHash,
- postType,
- timestamp
- ) {
-
- thisObject.emitterUserProfileId = emitterUserProfileId
- thisObject.targetUserProfileId = targetUserProfileId
- thisObject.emitterBotProfileId = emitterBotProfileId
- thisObject.targetBotProfileId = targetBotProfileId
- thisObject.emitterPostHash = emitterPostHash
- thisObject.targetPostHash = targetPostHash
- thisObject.postType = postType
- thisObject.timestamp = timestamp
-
- thisObject.replies = []
- /*
- Let's find the Target Post
- */
- let targetPost
-
- if (
- thisObject.postType === POST_TYPES.REPLY_TO_POST ||
- thisObject.postType === POST_TYPES.REPOST_ ||
- thisObject.postType === POST_TYPES.QUOTE_REPOST_
- ) {
- targetPost = NT.memory.maps.POSTS.get(thisObject.targetPostHash)
-
- if (targetPost === undefined) {
- throw ('Target Post Not Found.')
- }
- }
- /*
- Let's add this post to the replies of the Target Post
- */
- if (
- thisObject.postType === POST_TYPES.REPLY_TO_POST
- ) {
- targetPost.replies.push(thisObject)
- }
- }
-
- function addReaction(reactionType) {
- let reactionCount = thisObject.reactionsCount.get(reactionType)
-
- if (reactionCount === undefined) {
- throw ('Reaction Type Not Supported.')
- }
-
- thisObject.reactionsCount.set(reactionType, reactionsCount + 1)
- }
-
- function removeReaction(reactionType) {
- let reactionCount = thisObject.reactionsCount.get(reactionType)
-
- if (reactionCount === undefined) {
- throw ('Reaction Type Not Supported.')
- }
-
- thisObject.reactionsCount.set(reactionType, reactionsCount - 1)
- }
-}
\ No newline at end of file
diff --git a/Network/userProfile.js b/Network/userProfile.js
deleted file mode 100644
index 50766821f..000000000
--- a/Network/userProfile.js
+++ /dev/null
@@ -1,203 +0,0 @@
-exports.newUserProfile = function newUserProfile() {
-
- let thisObject = {
- userProfieId: undefined,
- userProfileHandle: undefined,
- blockchainAccount: undefined,
- ranking: undefined,
- following: undefined,
- followers: undefined,
- followingCount: undefined,
- followersCount: undefined,
- emitterEventsCount: undefined,
- targetEventsCount: undefined,
- postsCount: undefined,
- botsCount: undefined,
- bots: undefined,
- posts: undefined,
- addPost: addPost,
- removePost: removePost,
- addFollowing: addFollowing,
- removeFollowing: removeFollowing,
- addFollower: addFollower,
- removeFollower: removeFollower,
- addBot: addBot,
- removeBot: removeBot,
- enableBot: enableBot,
- disableBot: disableBot,
- initialize: initialize,
- finalize: finalize
- }
-
- return thisObject
-
- function finalize() {
- thisObject.following = undefined
- thisObject.followers = undefined
-
- thisObject.posts = undefined
- thisObject.bots = undefined
- }
-
- function initialize() {
-
- thisObject.following = new Map()
- thisObject.followers = new Map()
-
- thisObject.followingCount = 0
- thisObject.followersCount = 0
-
- thisObject.emitterEventsCount = 0
- thisObject.targetEventsCount = 0
- thisObject.postsCount = 0
- thisObject.botsCount = 0
-
- thisObject.posts = []
- thisObject.bots = []
- }
-
- function addPost(
- emitterUserProfileId,
- targetUserProfileId,
- emitterPostHash,
- targetPostHash,
- postType,
- timestamp
- ) {
- if (NT.memory.maps.POSTS.get(emitterPostHash) !== undefined) {
- throw ('Post Already Exists.')
- }
-
- let post = NT.modules.POST.newPost()
- post.initialize(
- emitterUserProfileId,
- targetUserProfileId,
- undefined,
- undefined,
- emitterPostHash,
- targetPostHash,
- postType,
- timestamp
- )
-
- thisObject.posts.push(post)
- NT.memory.maps.POSTS.set(emitterPostHash, post)
- thisObject.postsCount++
- }
-
- function removePost(
- emitterPostHash
- ) {
- if (NT.memory.maps.POSTS.get(emitterPostHash) === undefined) {
- throw ('Post Does Not Exist.')
- }
-
- let post = thisObject.posts.get(emitterPostHash)
- post.finalize()
-
- for (let i = thisObject.posts.length - 1; i >= 0; i--) {
- if (thisObject.posts[i].emitterPostHash === emitterPostHash) {
- thisObject.posts.splice(i, 1)
- break
- }
- }
- NT.memory.maps.POSTS.delete(emitterPostHash)
- thisObject.postsCount--
- }
-
- function addFollowing(
- userProfile
- ) {
- if (thisObject.following.get(userProfile.id) === undefined) {
- thisObject.following.set(userProfile.id, userProfile)
- thisObject.followingCount++
- }
- }
-
- function removeFollowing(
- userProfile
- ) {
- if (thisObject.following.get(userProfile.id) !== undefined) {
- thisObject.following.delete(userProfile.id)
- thisObject.followingCount--
- }
- }
-
- function addFollower(
- userProfile
- ) {
- if (thisObject.followers.get(userProfile.id) === undefined) {
- thisObject.followers.set(userProfile.id, userProfile)
- thisObject.followersCount++
- }
- }
-
- function removeFollower(
- userProfile
- ) {
- if (thisObject.followers.get(userProfile.id) !== undefined) {
- thisObject.followers.delete(userProfile.id)
- thisObject.followersCount--
- }
- }
-
- function addBot(
- botId,
- botAsset,
- botExchange
- ) {
- if (thisObject.bots.get(botId) !== undefined) {
- throw ('Bot Already Exists.')
- }
-
- let bot = NT.modules.BOTS.newBot()
- bot.initialize(
- botId,
- botAsset,
- botExchange
- )
- thisObject.bots.set(botId, bot)
- thisObject.botsCount++
- }
-
- function removeBot(
- botId
- ) {
- if (thisObject.bots.get(botId) === undefined) {
- throw ('Bot Does Not Exist.')
- }
- thisObject.bots.get(botId).finalize()
- thisObject.bots.delete(botId)
- thisObject.botsCount--
- }
-
- function enableBot(
- botId
- ) {
- let bot = thisObject.bots.get(botId)
- if (bot === undefined) {
- throw ('Bot Does Not Exist.')
- }
-
- if (bot.enabled === true) {
- throw ('Bot Already Enabled.')
- }
-
- bot.enabled = true
- }
-
- function disableBot(
- botId
- ) {
- let bot = thisObject.bots.get(botId)
- if (bot === undefined) {
- throw ('Bot Does Not Exist.')
- }
-
- if (bot.enabled === false) {
- throw ('Bot Already Disabled.')
- }
-
- bot.enabled = false
- }
-}
\ No newline at end of file
diff --git a/Client/ccxtServer.js b/Platform/Client/ccxtServer.js
similarity index 100%
rename from Client/ccxtServer.js
rename to Platform/Client/ccxtServer.js
diff --git a/Client/dataFileServer.js b/Platform/Client/dataFileServer.js
similarity index 100%
rename from Client/dataFileServer.js
rename to Platform/Client/dataFileServer.js
diff --git a/Client/eventServer.js b/Platform/Client/eventServer.js
similarity index 100%
rename from Client/eventServer.js
rename to Platform/Client/eventServer.js
diff --git a/Client/githubServer.js b/Platform/Client/githubServer.js
similarity index 99%
rename from Client/githubServer.js
rename to Platform/Client/githubServer.js
index 2b2c68345..ea8569e6d 100644
--- a/Client/githubServer.js
+++ b/Platform/Client/githubServer.js
@@ -472,14 +472,14 @@ exports.newGithubServer = function newGithubServer() {
unless the existing one belongs to the same Github username.
*/
let userProfileIdMap = new Map()
- let pluginFileNames = await CL.projects.foundations.utilities.plugins.getPluginFileNames(
+ let pluginFileNames = await SA.projects.foundations.utilities.plugins.getPluginFileNames(
'Governance',
'User-Profiles'
)
for (let i = 0; i < pluginFileNames.length; i++) {
let pluginFileName = pluginFileNames[i]
- let pluginFileContent = await CL.projects.foundations.utilities.plugins.getPluginFileContent(
+ let pluginFileContent = await SA.projects.foundations.utilities.plugins.getPluginFileContent(
'Governance',
'User-Profiles',
pluginFileName
@@ -522,13 +522,13 @@ exports.newGithubServer = function newGithubServer() {
unless the existing one belongs to the same Github username.
*/
let userProfileIdMap = new Map()
- let pluginFileNames = await CL.projects.foundations.utilities.plugins.getPluginFileNames(
+ let pluginFileNames = await SA.projects.foundations.utilities.plugins.getPluginFileNames(
'Governance',
'User-Profiles'
)
for (let i = 0; i < pluginFileNames.length; i++) {
let pluginFileName = pluginFileNames[i]
- let pluginFileContent = await CL.projects.foundations.utilities.plugins.getPluginFileContent(
+ let pluginFileContent = await SA.projects.foundations.utilities.plugins.getPluginFileContent(
'Governance',
'User-Profiles',
pluginFileName
diff --git a/Platform/Client/httpInterface.js b/Platform/Client/httpInterface.js
new file mode 100644
index 000000000..5b3368fb8
--- /dev/null
+++ b/Platform/Client/httpInterface.js
@@ -0,0 +1,1703 @@
+exports.newHttpInterface = function newHttpInterface() {
+
+ /*
+ IMPORTANT: If you are reviewing the code of the project please note
+ that this file is the single file in the whole system that accumulated
+ more technical debt by far. I did not have the time yet to pay the
+ technical debt, and therefore there is a lot to reorganize in here.
+ I will remove this note once this job is done.
+ */
+ let thisObject = {
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ let webhook = new Map()
+
+ return thisObject
+
+ function finalize() {
+ webhook = undefined
+ }
+
+ function initialize() {
+ /*
+ We will create an HTTP Server and leave it running forever.
+ */
+ SA.nodeModules.http.createServer(onHttpRequest).listen(global.env.CLIENT_HTTP_INTERFACE_PORT)
+ /* Starting the browser now is optional */
+ if (process.argv.includes("noBrowser")) {
+ //Running Client only with no UI.
+ } else {
+ SA.nodeModules.open('http://localhost:' + global.env.CLIENT_HTTP_INTERFACE_PORT)
+ }
+ }
+
+ 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 'WEB3':
+ {
+ SA.projects.foundations.utilities.httpRequests.getRequestBody(httpRequest, processRequest)
+
+ async function processRequest(body) {
+ try {
+ let params = JSON.parse(body)
+
+ switch (params.method) {
+ case 'getNetworkClientStatus': {
+
+ let serverResponse = await CL.servers.WEB3_SERVER.getNetworkClientStatus(
+ params.host,
+ params.port,
+ params.interface
+ )
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(serverResponse), httpResponse)
+ return
+ }
+ case 'createWalletAccount': {
+
+ let serverResponse = await CL.servers.WEB3_SERVER.createWalletAccount(
+ params.entropy
+ )
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(serverResponse), httpResponse)
+ return
+ }
+ case 'getWalletBalances': {
+
+ let serverResponse = await CL.servers.WEB3_SERVER.getWalletBalances(
+ params.host,
+ params.port,
+ params.interface,
+ params.walletDefinition
+ )
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(serverResponse), httpResponse)
+ return
+ }
+ case 'signData': {
+
+ let serverResponse = await CL.servers.WEB3_SERVER.signData(
+ params.privateKey,
+ params.data
+ )
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(serverResponse), httpResponse)
+ return
+ }
+ case 'recoverAddress': {
+
+ let serverResponse = await CL.servers.WEB3_SERVER.recoverAddress(
+ params.signature
+ )
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(serverResponse), httpResponse)
+ return
+ }
+ case 'mnemonicToPrivateKey': {
+
+ let serverResponse = await CL.servers.WEB3_SERVER.mnemonicToPrivateKey(
+ params.mnemonic
+ )
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(serverResponse), httpResponse)
+ return
+ }
+ default: {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify({ error: 'Method ' + params.method + ' is invalid.' }), httpResponse)
+ }
+ }
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> WEB3s -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> WEB3s -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> WEB3s -> Params Received = ' + body)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ }
+ }
+ break
+ case 'CCXT':
+ {
+ SA.projects.foundations.utilities.httpRequests.getRequestBody(httpRequest, processRequest)
+
+ async function processRequest(body) {
+ try {
+ let params = JSON.parse(body)
+
+ switch (params.method) {
+ case 'fetchMarkets': {
+
+ const exchangeClass = SA.nodeModules.ccxt[params.exchangeId]
+ const exchangeConstructorParams = {
+ 'timeout': 30000,
+ 'enableRateLimit': true,
+ verbose: false
+ }
+
+ let ccxtExchange = new exchangeClass(exchangeConstructorParams)
+ let ccxtMarkets = []
+
+ if (ccxtExchange.has.fetchMarkets === true) {
+ ccxtMarkets = await ccxtExchange.fetchMarkets()
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(ccxtMarkets), httpResponse)
+ return
+ }
+ case 'listExchanges': {
+ let exchanges = []
+ for (let i = 0; i < SA.nodeModules.ccxt.exchanges.length; i++) {
+ let exchangeId = SA.nodeModules.ccxt.exchanges[i]
+
+ const exchangeClass = SA.nodeModules.ccxt[exchangeId]
+ const exchangeConstructorParams = {
+ 'timeout': 30000,
+ 'enableRateLimit': true,
+ verbose: false
+ }
+ let ccxtExchange
+ try { ccxtExchange = new exchangeClass(exchangeConstructorParams) }
+ catch (err) { }
+ if (ccxtExchange === undefined) { continue }
+
+
+ if (ccxtExchange.has.fetchOHLCV === params.has.fetchOHLCV) {
+ if (ccxtExchange.has.fetchMarkets === params.has.fetchMarkets) {
+ if (ccxtExchange.timeframes['1m'] !== undefined) {
+ let exchange = {
+ name: ccxtExchange.name,
+ id: ccxtExchange.id
+ }
+ exchanges.push(exchange)
+ }
+ }
+ }
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(exchanges), httpResponse)
+ return
+ }
+ }
+
+ let content = {
+ err: global.DEFAULT_FAIL_RESPONSE // method not supported
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(content), httpResponse)
+
+ } catch (err) {
+ console.log('[INFO] httpInterface -> CCXT FetchMarkets -> Could not fetch markets.')
+ let error = {
+ result: 'Fail Because',
+ message: err.message
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ }
+ }
+ break
+ case 'Webhook':
+ {
+ switch (requestPath[2]) { // switch by command
+ case 'Fetch-Messages': {
+ let exchange = requestPath[3]
+ let market = requestPath[4]
+
+ /* Some validations */
+ if (exchange === undefined) {
+ console.log('[WARN] httpInterface -> Webhook -> Fetch-Messages -> Message with no Exchange received -> messageReceived = ' + messageReceived)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ return
+ }
+ if (market === undefined) {
+ console.log('[WARN] httpInterface -> Webhook -> Fetch-Messages -> Message with no market received -> messageReceived = ' + messageReceived)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ return
+ }
+
+ let key = exchange + '-' + market
+
+ let webhookMessages = webhook.get(key)
+ if (webhookMessages === undefined) {
+ webhookMessages = []
+ }
+
+ console.log('[INFO] httpInterface -> Webhook -> Fetch-Messages -> Exchange-Market = ' + exchange + '-' + market)
+ console.log('[INFO] httpInterface -> Webhook -> Fetch-Messages -> Messeges Fetched by Webhooks Sensor Bot = ' + webhookMessages.length)
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(webhookMessages), httpResponse)
+ webhookMessages = []
+
+ webhook.set(key, webhookMessages)
+ break
+ }
+ case 'New-Message': {
+ SA.projects.foundations.utilities.httpRequests.getRequestBody(httpRequest, processRequest)
+
+ function processRequest(messageReceived) {
+ let timestamp = (new Date()).valueOf()
+ let source = requestPath[3]
+ let exchange = requestPath[4]
+ let market = requestPath[5]
+
+ /* Some validations */
+ if (source === undefined) {
+ console.log('[WARN] httpInterface -> Webhook -> New-Message -> Message with no Source received -> messageReceived = ' + messageReceived)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ return
+ }
+ if (exchange === undefined) {
+ console.log('[WARN] httpInterface -> Webhook -> New-Message -> Message with no Exchange received -> messageReceived = ' + messageReceived)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ return
+ }
+ if (market === undefined) {
+ console.log('[WARN] httpInterface -> Webhook -> New-Message -> Message with no market received -> messageReceived = ' + messageReceived)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ return
+ }
+
+ let key = exchange + '-' + market
+
+ let webhookMessages = webhook.get(key)
+ if (webhookMessages === undefined) {
+ webhookMessages = []
+ }
+
+ webhookMessages.push([timestamp, source, messageReceived])
+ webhook.set(key, webhookMessages)
+
+ console.log('[INFO] httpInterface -> Webhook -> New-Message -> Exchange-Market = ' + exchange + '-' + market)
+ console.log('[INFO] httpInterface -> Webhook -> New-Message -> messageReceived = ' + messageReceived)
+ console.log('[INFO] httpInterface -> Webhook -> New-Message -> Messeges waiting to be Fetched by Webhooks Sensor Bot = ' + webhookMessages.length)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
+ }
+ break
+ }
+ }
+ }
+ break
+ case 'Docs':
+ {
+ switch (requestPath[2]) { // switch by command
+ case 'Save-Node-Schema': {
+ SA.projects.foundations.utilities.httpRequests.getRequestBody(httpRequest, processRequest)
+
+ async function processRequest(body) {
+ try {
+ let docsSchema = JSON.parse(body)
+ let project = requestPath[3]
+ let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Schemas/Docs-Nodes'
+
+ if (checkAllSchmemaDocuments('Node', docsSchema, filePath) === true) {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
+ } else {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ }
+
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> Docs -> Save-Node-Schema -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> Docs -> Save-Node-Schema -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> Docs -> Save-Node-Schema -> Params Received = ' + body)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ }
+ break
+ }
+
+ case 'Save-Concept-Schema': {
+ SA.projects.foundations.utilities.httpRequests.getRequestBody(httpRequest, processRequest)
+
+ async function processRequest(body) {
+ try {
+ let docsSchema = JSON.parse(body)
+ let project = requestPath[3]
+ let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Schemas/Docs-Concepts'
+
+ if (checkAllSchmemaDocuments('Concept', docsSchema, filePath) === true) {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
+ } else {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ }
+
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> Docs -> Save-Concept-Schema -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> Docs -> Save-Concept-Schema -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> Docs -> Save-Concept-Schema -> Params Received = ' + body)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ }
+ break
+ }
+
+ case 'Save-Topic-Schema': {
+ SA.projects.foundations.utilities.httpRequests.getRequestBody(httpRequest, processRequest)
+
+ async function processRequest(body) {
+ try {
+ let docsSchema = JSON.parse(body)
+ let project = requestPath[3]
+ let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Schemas/Docs-Topics'
+
+ if (checkAllSchmemaDocuments('Topic', docsSchema, filePath) === true) {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
+ } else {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ }
+
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> Docs -> Save-Topic-Schema -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> Docs -> Save-Topic-Schema -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> Docs -> Save-Topic-Schema -> Params Received = ' + body)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ }
+ break
+ }
+
+ case 'Save-Tutorial-Schema': {
+ SA.projects.foundations.utilities.httpRequests.getRequestBody(httpRequest, processRequest)
+
+ async function processRequest(body) {
+ try {
+ let docsSchema = JSON.parse(body)
+ let project = requestPath[3]
+ let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Schemas/Docs-Tutorials'
+
+ if (checkAllSchmemaDocuments('Tutorial', docsSchema, filePath) === true) {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
+ } else {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ }
+
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> Docs -> Save-Tutorial-Schema -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> Docs -> Save-Tutorial-Schema -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> Docs -> Save-Tutorial-Schema -> Params Received = ' + body)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ }
+ break
+ }
+
+ case 'Save-Review-Schema': {
+ SA.projects.foundations.utilities.httpRequests.getRequestBody(httpRequest, processRequest)
+
+ async function processRequest(body) {
+ try {
+ let docsSchema = JSON.parse(body)
+ let project = requestPath[3]
+ let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Schemas/Docs-Reviews'
+
+ if (checkAllSchmemaDocuments('Review', docsSchema, filePath) === true) {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
+ } else {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ }
+
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> Docs -> Save-Review-Schema -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> Docs -> Save-Review-Schema -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> Docs -> Save-Review-Schema -> Params Received = ' + body)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ }
+ break
+ }
+
+ case 'Save-Book-Schema': {
+ SA.projects.foundations.utilities.httpRequests.getRequestBody(httpRequest, processRequest)
+
+ async function processRequest(body) {
+ try {
+ let docsSchema = JSON.parse(body)
+ let project = requestPath[3]
+ let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Schemas/Docs-Books'
+
+ if (checkAllSchmemaDocuments('Book', docsSchema, filePath) === true) {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
+ } else {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ }
+
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> Docs -> Save-Book-Schema -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> Docs -> Save-Book-Schema -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> Docs -> Save-Book-Schema -> Params Received = ' + body)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ }
+ break
+ }
+ }
+
+ function checkAllSchmemaDocuments(category, docsSchema, filePath) {
+ const fs = SA.nodeModules.fs
+ let noErrorsDuringSaving = true
+
+ for (let i = 0; i < docsSchema.length; i++) {
+ let schemaDocument = docsSchema[i]
+ /*
+ For some type of schemas we will save the file at an extra
+ folder derived from the document's type.
+ */
+ let fileName = schemaDocument.type.toLowerCase()
+ for (let j = 0; j < 10; j++) {
+ fileName = cleanFileName(fileName)
+ }
+ let pageNumber = '00' + schemaDocument.pageNumber
+ let newFilepath = filePath
+ switch (category) {
+ case 'Topic': {
+ fileName = schemaDocument.topic.toLowerCase() + '-' + pageNumber.substring(pageNumber.length - 3, pageNumber.length) + '-' + schemaDocument.type.toLowerCase()
+ fileName = cleanFileName(fileName)
+ newFilepath = createPrefixDirectories(filePath, schemaDocument.topic)
+ break
+ }
+ case 'Tutorial': {
+ fileName = schemaDocument.tutorial.toLowerCase() + '-' + pageNumber.substring(pageNumber.length - 3, pageNumber.length) + '-' + schemaDocument.type.toLowerCase()
+ fileName = cleanFileName(fileName)
+ newFilepath = createPrefixDirectories(filePath, schemaDocument.tutorial)
+ break
+ }
+ case 'Review': {
+ fileName = schemaDocument.review.toLowerCase() + '-' + pageNumber.substring(pageNumber.length - 3, pageNumber.length) + '-' + schemaDocument.type.toLowerCase()
+ fileName = cleanFileName(fileName)
+ newFilepath = createPrefixDirectories(filePath, schemaDocument.review)
+ break
+ }
+ case 'Node': {
+ newFilepath = createPrefixDirectories(filePath, schemaDocument.type)
+ break
+ }
+ case 'Concept': {
+ newFilepath = createPrefixDirectories(filePath, schemaDocument.type)
+ break
+ }
+ }
+
+ function createPrefixDirectories(filePath, schemaTextToUse) {
+ let firstLetter = schemaTextToUse.substring(0, 1)
+ createNewDir(filePath + '/' + firstLetter)
+ let extraWord = schemaTextToUse.split(' ')[0]
+ createNewDir(filePath + '/' + firstLetter + '/' + extraWord)
+ return filePath + '/' + firstLetter + '/' + extraWord + '/' + cleanFileName(schemaTextToUse)
+ }
+
+ fileName = fileName + '.json'
+
+ if (schemaDocument.deleted === true) {
+ try {
+ fs.unlinkSync(newFilepath + '/' + fileName)
+ console.log('[SUCCESS] ' + newFilepath + '/' + fileName + ' deleted.')
+ } catch (err) {
+ noErrorsDuringSaving = false
+ console.log('[ERROR] httpInterface -> Docs -> Delete -> ' + newFilepath + '/' + fileName + ' could not be deleted.')
+ console.log('[ERROR] httpInterface -> Docs -> Delete -> Resolve the issue that is preventing the Client to delete this file. Look at the error message below as a guide. At the UI you will need to delete this page again in order for the Client to retry next time you execute the docs.save command.')
+ console.log('[ERROR] httpInterface -> Docs -> Delete -> err.stack = ' + err.stack)
+ }
+ } else {
+ if (schemaDocument.updated === true || schemaDocument.created === true) {
+ try {
+ let created = schemaDocument.created
+ let updated = schemaDocument.updated
+ schemaDocument.updated = undefined
+ schemaDocument.created = undefined
+ let fileContent = JSON.stringify(schemaDocument, undefined, 4)
+ createNewDir(newFilepath)
+ fs.writeFileSync(newFilepath + '/' + fileName, fileContent)
+ if (created === true) {
+ console.log('[SUCCESS] ' + newFilepath + '/' + fileName + ' created.')
+ } else {
+ if (updated === true) {
+ console.log('[SUCCESS] ' + newFilepath + '/' + fileName + ' updated.')
+ }
+ }
+ } catch (err) {
+ noErrorsDuringSaving = false
+ console.log('[ERROR] httpInterface -> Docs -> Save -> ' + newFilepath + '/' + fileName + ' could not be created / updated.')
+ console.log('[ERROR] httpInterface -> Docs -> Save -> err.stack = ' + err.stack)
+ }
+ }
+ }
+
+ function createNewDir(path) {
+ try {
+ fs.mkdirSync(path)
+ } catch (err) {
+ if (err.message.indexOf('file already exists') < 0) {
+ throw (err)
+ }
+ }
+ }
+ }
+
+ return noErrorsDuringSaving
+ }
+
+ function cleanFileName(fileName) {
+ for (let i = 0; i < 100; i++) {
+ fileName = fileName
+ .replace(' ', '-')
+ .replace('--', '-')
+ .replace('?', '')
+ .replace('#', '')
+ .replace('$', '')
+ .replace('%', '')
+ .replace('^', '')
+ .replace('&', '')
+ .replace('*', '')
+ .replace('(', '')
+ .replace(')', '')
+ .replace('!', '')
+ .replace('..', '.')
+ .replace(',', '')
+ .replace('\'', '')
+ }
+ return fileName
+ }
+ }
+ break
+ case 'App':
+ {
+ switch (requestPath[2]) { // switch by command
+ case 'Contribute': {
+ try {
+ let commitMessage = unescape(requestPath[3])
+ const username = unescape(requestPath[4])
+ const token = unescape(requestPath[5])
+ const currentBranch = unescape(requestPath[6])
+ const contributionsBranch = unescape(requestPath[7])
+ let error
+
+ /* Unsavping # */
+ for (let i = 0; i < 10; i++) {
+ commitMessage = commitMessage.replace('_SLASH_', '/')
+ commitMessage = commitMessage.replace('_HASHTAG_', '#')
+ }
+
+ contribute()
+
+ async function contribute() {
+ const { lookpath } = require('lookpath');
+ const gitpath = await lookpath('git');
+ if (gitpath === undefined) {
+ console.log('[ERROR] `git` not installed.')
+ } else {
+ await doGit()
+ if (error !== undefined) {
+
+ let docs = {
+ project: 'Foundations',
+ category: 'Topic',
+ type: 'App Error - Contribution Not Sent',
+ anchor: undefined,
+ placeholder: {}
+ }
+
+ respondWithDocsObject(docs, error)
+ return
+ }
+
+ await doGithub()
+ if (error !== undefined) {
+
+ let docs = {
+ project: 'Foundations',
+ category: 'Topic',
+ type: 'App Error - Contribution Not Sent',
+ anchor: undefined,
+ placeholder: {}
+ }
+ console.log('respond with docs ')
+
+ respondWithDocsObject(docs, error)
+ return
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
+ }
+ }
+
+ async function doGit() {
+ const simpleGit = require('simple-git');
+ const options = {
+ baseDir: process.cwd(),
+ binary: 'git',
+ maxConcurrentProcesses: 6,
+ }
+ const git = simpleGit(options)
+
+ try {
+ await git.add('./*')
+ await git.commit(commitMessage)
+ await git.push('origin', currentBranch)
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> App -> Contribute -> doGit -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> App -> Contribute -> doGit -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> App -> Contribute -> doGit -> commitMessage = ' + commitMessage)
+ console.log('[ERROR] httpInterface -> App -> Contribute -> doGit -> currentBranch = ' + currentBranch)
+ console.log('[ERROR] httpInterface -> App -> Contribute -> doGit -> contributionsBranch = ' + contributionsBranch)
+ console.log('')
+ console.log('Torubleshooting Tips:')
+ console.log('')
+ console.log('1. Make sure that you have set up your Github Username and Token at the APIs -> Github API node at the workspace.')
+ console.log('2. Make sure you are running the latest version of Git available for your OS.')
+ console.log('3. Make sure that you have cloned your Superalgos repository fork, and not the main Superalgos repository.')
+ console.log('4. If your fork is old, you might need to do an app.update and also a node setup at every branch. If you just reforked all is good.')
+ error = err
+ }
+ }
+
+ async function doGithub() {
+
+ const { Octokit } = require("@octokit/rest")
+
+ const octokit = new Octokit({
+ auth: token,
+ userAgent: 'Superalgos Beta 11'
+ })
+
+ const repo = 'Superalgos'
+ const owner = 'Superalgos'
+ const head = username + ':' + contributionsBranch
+ const base = currentBranch
+ const title = 'Contribution: ' + commitMessage
+
+ try {
+ await octokit.pulls.create({
+ owner,
+ repo,
+ title,
+ head,
+ base,
+ });
+ } catch (err) {
+ if (err.stack.indexOf('A pull request already exists') >= 0) {
+ return
+ } else {
+ console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> commitMessage = ' + commitMessage)
+ console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> username = ' + username)
+ console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> token starts with = ' + token.substring(0, 10) + '...')
+ console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> token ends with = ' + '...' + token.substring(token.length - 10))
+ console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> currentBranch = ' + currentBranch)
+ console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> contributionsBranch = ' + contributionsBranch)
+ error = err
+ }
+ }
+ }
+
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> App -> Contribute -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> App -> Contribute -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> App -> Contribute -> commitMessage = ' + commitMessage)
+ console.log('[ERROR] httpInterface -> App -> Contribute -> username = ' + username)
+ console.log('[ERROR] httpInterface -> App -> Contribute -> token starts with = ' + token.substring(0, 10) + '...')
+ console.log('[ERROR] httpInterface -> App -> Contribute -> token ends with = ' + '...' + token.substring(token.length - 10))
+ console.log('[ERROR] httpInterface -> App -> Contribute -> currentBranch = ' + currentBranch)
+ console.log('[ERROR] httpInterface -> App -> Contribute -> contributionsBranch = ' + contributionsBranch)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ break
+ }
+
+ case 'Update': {
+ try {
+ const currentBranch = unescape(requestPath[3])
+ update()
+
+ async function update() {
+ const { lookpath } = require('lookpath');
+ const gitpath = await lookpath('git');
+ if (gitpath === undefined) {
+ console.log('[ERROR] `git` not installed.')
+ } else {
+ let result = await doGit()
+
+ if (result.error === undefined) {
+ let customResponse = {
+ result: global.CUSTOM_OK_RESPONSE.result,
+ message: result.message
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(customResponse), httpResponse)
+ } else {
+
+ let docs = {
+ project: 'Foundations',
+ category: 'Topic',
+ type: 'App Error - Update Failed',
+ anchor: undefined,
+ placeholder: {}
+ }
+
+ respondWithDocsObject(docs, result.error)
+
+ }
+ }
+ }
+
+ async function doGit() {
+ const simpleGit = require('simple-git');
+ const options = {
+ baseDir: process.cwd(),
+ binary: 'git',
+ maxConcurrentProcesses: 6,
+ }
+ const git = simpleGit(options)
+
+ let message
+ try {
+ message = await git.pull('https://github.com/Superalgos/Superalgos', currentBranch)
+ return { message: message }
+ } catch (err) {
+ console.log('[ERROR] Error updating ' + currentBranch)
+ console.log(err.stack)
+ return { error: err }
+ }
+ }
+
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> App -> Update -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> App -> Update -> err.stack = ' + err.stack)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ break
+ }
+
+ case 'Checkout': {
+ try {
+ const currentBranch = unescape(requestPath[3])
+ let error
+
+ checkout()
+
+ async function checkout() {
+ const { lookpath } = require('lookpath');
+ const gitpath = await lookpath('git');
+ if (gitpath === undefined) {
+ console.log('[ERROR] `git` not installed.')
+ } else {
+ await doGit()
+
+ if (error === undefined) {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
+ } else {
+ let docs = {
+ project: 'Foundations',
+ category: 'Topic',
+ type: 'Switching Branches - Current Branch Not Changed',
+ anchor: undefined,
+ placeholder: {}
+ }
+
+ respondWithDocsObject(docs, error)
+ }
+ }
+ }
+
+ async function doGit() {
+ const simpleGit = require('simple-git');
+ const options = {
+ baseDir: process.cwd(),
+ binary: 'git',
+ maxConcurrentProcesses: 6,
+ }
+ const git = simpleGit(options)
+ try {
+ await git.checkout(currentBranch)
+ } catch (err) {
+ console.log('[ERROR] Error changing current branch to ' + currentBranch)
+ console.log(err.stack)
+ error = err
+ }
+ }
+
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> App -> Update -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> App -> Update -> err.stack = ' + err.stack)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ break
+ }
+
+ case 'Branch': {
+ try {
+ branch()
+
+ async function branch() {
+ const { lookpath } = require('lookpath');
+ const gitpath = await lookpath('git');
+ if (gitpath === undefined) {
+ console.log('[ERROR] `git` not installed.')
+ } else {
+ let result = await doGit()
+
+ if (result.error === undefined) {
+ let customResponse = {
+ result: global.CUSTOM_OK_RESPONSE.result,
+ message: result
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(customResponse), httpResponse)
+ } else {
+ let docs = {
+ project: 'Foundations',
+ category: 'Topic',
+ type: 'App Error - Could Not Get Current Branch',
+ anchor: undefined,
+ placeholder: {}
+ }
+
+ respondWithDocsObject(docs, error)
+ }
+ }
+ }
+
+ async function doGit() {
+ const simpleGit = require('simple-git');
+ const options = {
+ baseDir: process.cwd(),
+ binary: 'git',
+ maxConcurrentProcesses: 6,
+ }
+ const git = simpleGit(options)
+ try {
+ return await git.branch()
+ } catch (err) {
+ console.log('[ERROR] Error reading current branch.')
+ console.log(err.stack)
+ }
+ }
+
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> App -> Update -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> App -> Update -> err.stack = ' + err.stack)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ break
+ }
+ }
+
+ function respondWithDocsObject(docs, error) {
+
+ if (error.message !== undefined) {
+ docs.placeholder.errorMessage = {
+ style: 'Error',
+ text: error.message
+ }
+ }
+ if (error.stack !== undefined) {
+ docs.placeholder.errorStack = {
+ style: 'Javascript',
+ text: error.stack
+ }
+ }
+ if (error.code !== undefined) {
+ docs.placeholder.errorCode = {
+ style: 'Json',
+ text: error.code
+ }
+ }
+
+ docs.placeholder.errorDetails = {
+ style: 'Json',
+ text: JSON.stringify(error, undefined, 4)
+ }
+
+ let customResponse = {
+ result: global.CUSTOM_FAIL_RESPONSE.result,
+ docs: docs
+ }
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(customResponse), httpResponse)
+
+ }
+ }
+ break
+ case 'GOV':
+ {
+ /*
+ This is the Governance endpoint at the Http Interface. All methods
+ related to the Governance System are implemented here and routed
+ to the backend Servers that can process them.
+ */
+ SA.projects.foundations.utilities.httpRequests.getRequestBody(httpRequest, processRequest)
+
+ async function processRequest(body) {
+ try {
+ let params = JSON.parse(body)
+
+ switch (params.method) {
+ case 'getGithubStars': {
+
+ let serverResponse = await CL.servers.GITHUB_SERVER.getGithubStars(
+ params.repository,
+ params.username,
+ params.token
+ )
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(serverResponse), httpResponse)
+ return
+ }
+ case 'getGithubWatchers': {
+
+ let serverResponse = await CL.servers.GITHUB_SERVER.getGithubWatchers(
+ params.repository,
+ params.username,
+ params.token
+ )
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(serverResponse), httpResponse)
+ return
+ }
+ case 'getGithubForks': {
+
+ let serverResponse = await CL.servers.GITHUB_SERVER.getGithubForks(
+ params.repository,
+ params.username,
+ params.token
+ )
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(serverResponse), httpResponse)
+ return
+ }
+ case 'mergePullRequests': {
+
+ let serverResponse = await CL.servers.GITHUB_SERVER.mergePullRequests(
+ params.commitMessage,
+ params.username,
+ params.token
+ )
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(serverResponse), httpResponse)
+ return
+ }
+ case 'payContributors': {
+
+ let serverResponse = await CL.servers.WEB3_SERVER.payContributors(
+ params.contractAddress,
+ params.contractAbi,
+ params.paymentsArray,
+ params.mnemonic
+ )
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(serverResponse), httpResponse)
+ return
+ }
+ default: {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify({ error: 'Method ' + params.method + ' is invalid.' }), httpResponse)
+ }
+ }
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> GOV -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> GOV -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> GOV -> Params Received = ' + body)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ }
+ }
+ break
+ case 'LegacyPlotter.js':
+ {
+ SA.projects.foundations.utilities.httpResponses.respondWithFile(global.env.PATH_TO_CLIENT + '/WebServer/LegacyPlotter.js', httpResponse)
+ }
+ break
+ case 'PlotterPanel.js':
+ {
+ SA.projects.foundations.utilities.httpResponses.respondWithFile(global.env.PATH_TO_CLIENT + '/WebServer/PlotterPanel.js', httpResponse)
+ }
+ break
+ case 'Images': // This means the Images folder.
+ {
+ let path = global.env.PATH_TO_CLIENT + '/WebServer/Images/' + requestPath[2]
+
+ if (requestPath[3] !== undefined) {
+ path = path + '/' + requestPath[3]
+ }
+
+ if (requestPath[4] !== undefined) {
+ path = path + '/' + requestPath[4]
+ }
+
+ if (requestPath[5] !== undefined) {
+ path = path + '/' + requestPath[5]
+ }
+
+ path = unescape(path)
+
+ SA.projects.foundations.utilities.httpResponses.respondWithImage(path, httpResponse)
+ }
+ break
+ case 'Icons': // This means the Icons folder under Projects.
+ {
+ let path = global.env.PATH_TO_PROJECTS + '/' + requestPath[2] + '/Icons'
+
+ if (requestPath[3] !== undefined) {
+ path = path + '/' + requestPath[3]
+ }
+
+ if (requestPath[4] !== undefined) {
+ path = path + '/' + requestPath[4]
+ }
+
+ if (requestPath[5] !== undefined) {
+ path = path + '/' + requestPath[5]
+ }
+
+ path = unescape(path)
+
+ SA.projects.foundations.utilities.httpResponses.respondWithImage(path, httpResponse)
+ }
+ break
+ case 'GIFs': // This means the GIFs folder under Projects.
+ {
+ let path = global.env.PATH_TO_PROJECTS + '/' + requestPath[2] + '/GIFs'
+
+ if (requestPath[3] !== undefined) {
+ path = path + '/' + requestPath[3]
+ }
+
+ if (requestPath[4] !== undefined) {
+ path = path + '/' + requestPath[4]
+ }
+
+ if (requestPath[5] !== undefined) {
+ path = path + '/' + requestPath[5]
+ }
+
+ path = unescape(path)
+ SA.projects.foundations.utilities.httpResponses.respondWithImage(path, httpResponse)
+ }
+ break
+ case 'PNGs': // This means the PNGs folder under Projects.
+ {
+ let path = global.env.PATH_TO_PROJECTS + '/' + requestPath[2] + '/PNGs'
+
+ if (requestPath[3] !== undefined) {
+ path = path + '/' + requestPath[3]
+ }
+
+ if (requestPath[4] !== undefined) {
+ path = path + '/' + requestPath[4]
+ }
+
+ if (requestPath[5] !== undefined) {
+ path = path + '/' + requestPath[5]
+ }
+
+ path = unescape(path)
+ SA.projects.foundations.utilities.httpResponses.respondWithImage(path, httpResponse)
+ }
+ break
+ case 'WebServer': // This means the WebServer folder.
+ {
+ SA.projects.foundations.utilities.httpResponses.respondWithFile(global.env.PATH_TO_CLIENT + '/WebServer/' + requestPath[2], httpResponse)
+ }
+ break
+ case 'externalScripts': // This means the WebServer folder.
+ {
+ SA.projects.foundations.utilities.httpResponses.respondWithFile(global.env.PATH_TO_CLIENT + '/WebServer/externalScripts/' + requestPath[2], httpResponse)
+ }
+ break
+ case 'Plotters': // This means the plotter folder, not to be confused with the Plotters script!
+ {
+ let project = requestPath[2]
+ let dataMine = requestPath[3]
+ let codeName = requestPath[4]
+ let moduleName = requestPath[5]
+ let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/' + 'Bots-Plotters-Code' + '/' + dataMine + '/plotters/' + codeName + '/' + moduleName
+ SA.projects.foundations.utilities.httpResponses.respondWithFile(filePath, httpResponse)
+ }
+ break
+ case 'ChartLayers':
+ {
+ SA.projects.foundations.utilities.httpResponses.respondWithFile(global.env.PATH_TO_CLIENT + '/UI/' + endpointOrFile + '/' + requestPath[2], httpResponse)
+ }
+ break
+ case 'Files':
+ {
+ SA.projects.foundations.utilities.httpResponses.respondWithFile(global.env.PATH_TO_CLIENT + '/UI/Data-Files/' + requestPath[2], httpResponse)
+ }
+ break
+ case 'Fonts':
+ {
+ SA.projects.foundations.utilities.httpResponses.respondWithFont(global.env.PATH_TO_FONTS + '/' + requestPath[2], httpResponse)
+ }
+ break
+ case 'Schema':
+ {
+ sendSchema(global.env.PATH_TO_PROJECTS + '/' + requestPath[2] + '/Schemas/', requestPath[3])
+
+ function sendSchema(filePath, schemaType) {
+ let fs = SA.nodeModules.fs
+ try {
+ let folder = ''
+ switch (schemaType) {
+ case 'AppSchema': {
+ folder = 'App-Schema'
+ break
+ }
+ case 'DocsNodeSchema': {
+ folder = 'Docs-Nodes'
+ break
+ }
+ case 'DocsConceptSchema': {
+ folder = 'Docs-Concepts'
+ break
+ }
+ case 'DocsTopicSchema': {
+ folder = 'Docs-Topics'
+ break
+ }
+ case 'DocsTutorialSchema': {
+ folder = 'Docs-Tutorials'
+ break
+ }
+ case 'DocsReviewSchema': {
+ folder = 'Docs-Reviews'
+ break
+ }
+ case 'DocsBookSchema': {
+ folder = 'Docs-Books'
+ break
+ }
+ }
+ SA.projects.foundations.utilities.filesAndDirectories.getAllFilesInDirectoryAndSubdirectories(filePath + folder, onFilesReady)
+ function onFilesReady(files) {
+
+ let schemaArray = []
+ for (let k = 0; k < files.length; k++) {
+ let name = files[k]
+ let nameSplitted = name.split(folder)
+ let fileName = nameSplitted[1]
+ for (let i = 0; i < 10; i++) {
+ fileName = fileName.replace('\\', '/')
+ }
+ let fileToRead = filePath + folder + fileName
+
+ let fileContent = fs.readFileSync(fileToRead)
+ let schemaDocument
+ try {
+ schemaDocument = JSON.parse(fileContent)
+ } catch (err) {
+ console.log('[ERROR] sendSchema -> Error Parsing JSON File: ' + fileToRead + ' .Error = ' + err.stack)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent("[]", httpResponse)
+ return
+ }
+ schemaArray.push(schemaDocument)
+ }
+ let schema = JSON.stringify(schemaArray)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(schema, httpResponse)
+ }
+ } catch (err) {
+ if (err.message.indexOf('no such file or directory') < 0) {
+ console.log('Could not send Schema:', filePath, schemaType)
+ console.log(err.stack)
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent("[]", httpResponse)
+ }
+ }
+ }
+ break
+ case 'DirContent':
+ {
+ let folderPath = unescape(requestPath[2])
+ if (requestPath[3] !== undefined) {
+ folderPath = folderPath + '/' + requestPath[3]
+ }
+
+ if (requestPath[4] !== undefined) {
+ folderPath = folderPath + '/' + requestPath[4]
+ }
+
+ if (requestPath[5] !== undefined) {
+ folderPath = folderPath + '/' + requestPath[5]
+ }
+ let folder
+ if (requestPath[2] === 'Root') {
+ folder = folderPath.replace('Root', '../Superalgos/')
+ } else {
+ folder = global.env.PATH_TO_PROJECTS + '/' + folderPath
+ }
+
+ SA.projects.foundations.utilities.filesAndDirectories.getAllFilesInDirectoryAndSubdirectories(folder, onFilesReady)
+
+ function onFilesReady(files) {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(files), httpResponse)
+ }
+ }
+ break
+ case 'IconNames':
+ {
+ let projects = SA.projects.foundations.utilities.filesAndDirectories.getDirectories(global.env.PATH_TO_PROJECTS)
+ let icons = []
+ let totalProjects = projects.length
+ let projectCounter = 0
+
+ for (let i = 0; i < projects.length; i++) {
+ let project = projects[i]
+
+ const folder = global.env.PATH_TO_PROJECTS + '/' + project + '/Icons/'
+
+ SA.projects.foundations.utilities.filesAndDirectories.getAllFilesInDirectoryAndSubdirectories(folder, onFilesReady)
+
+ function onFilesReady(files) {
+ for (let j = 0; j < files.length; j++) {
+ let file = files[j]
+ for (let i = 0; i < 10; i++) {
+ file = file.replace('/', '\\')
+ }
+ icons.push([project, file])
+ }
+
+ projectCounter++
+ if (projectCounter === totalProjects) {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(icons), httpResponse)
+ }
+ }
+ }
+ }
+ break
+ case 'PluginFileNames':
+ {
+ processRequest()
+
+ async function processRequest(body) {
+ try {
+ let project = unescape(requestPath[2])
+ let folder = unescape(requestPath[3])
+
+ let response = await SA.projects.foundations.utilities.plugins.getPluginFileNames(
+ project,
+ folder
+ )
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(response), httpResponse)
+
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> PluginFileNames -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> PluginFileNames -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> PluginFileNames -> Params Received = ' + body)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ }
+ }
+ break
+ case 'LoadPlugin':
+ {
+ processRequest()
+
+ async function processRequest(body) {
+ try {
+ let project = unescape(requestPath[2])
+ let folder = unescape(requestPath[3])
+ let fileName = unescape(requestPath[4])
+
+ let response = await SA.projects.foundations.utilities.plugins.getPluginFileContent(
+ project,
+ folder,
+ fileName
+ ).catch(err => {
+ let error = {
+ result: 'Fail Because',
+ message: err
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ return
+ })
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(response, httpResponse)
+
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> LoadPlugin -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> LoadPlugin -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> LoadPlugin -> Params Received = ' + body)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ }
+ }
+ break
+ case 'SavePlugin':
+ {
+ SA.projects.foundations.utilities.httpRequests.getRequestBody(httpRequest, processRequest)
+
+ async function processRequest(body) {
+ try {
+ let plugin = JSON.parse(body)
+ let project = requestPath[2]
+ let folder = requestPath[3]
+ let fileName = requestPath[4]
+ let filePath = global.env.PATH_TO_PROJECTS + '/' + project + '/Plugins/' + folder
+ let fileContent = JSON.stringify(plugin, undefined, 4)
+ const fs = SA.nodeModules.fs
+ fs.writeFileSync(filePath + '/' + fileName + '.json', fileContent)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
+ } catch (err) {
+ console.log('[ERROR] httpInterface -> SavePlugin -> Method call produced an error.')
+ console.log('[ERROR] httpInterface -> SavePlugin -> err.stack = ' + err.stack)
+ console.log('[ERROR] httpInterface -> SavePlugin -> Params Received = ' + body)
+
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ }
+ }
+ break
+ case 'Workspace.js':
+ {
+ let fs = SA.nodeModules.fs
+
+ try {
+ let filePath = global.env.PATH_TO_DEFAULT_WORKSPACE + '/Getting-Started-Tutorials.json'
+ fs.readFile(filePath, onFileRead)
+ } catch (e) {
+ console.log('[ERROR] Error reading the Workspace.', e)
+ }
+
+ function onFileRead(err, workspace) {
+ if (err) {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(undefined, httpResponse)
+ } else {
+ let responseContent = 'function getWorkspace(){ return ' + workspace + '}'
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(responseContent, httpResponse)
+ }
+ }
+ }
+ break
+ case 'ListWorkspaces':
+ {
+ let allWorkspaces = []
+ let projects = SA.projects.foundations.utilities.filesAndDirectories.getDirectories(global.env.PATH_TO_PROJECTS)
+ let projectsCount = 0
+
+ for (let i = 0; i < projects.length; i++) {
+ let project = projects[i]
+ readPluginWorkspaces()
+ function readPluginWorkspaces() {
+ let dirPath = global.env.PATH_TO_PROJECTS + '/' + project + '/Plugins/Workspaces'
+ try {
+ let fs = SA.nodeModules.fs
+ fs.readdir(dirPath, onDirRead)
+
+ function onDirRead(err, fileList) {
+ let updatedFileList = []
+
+ if (err) {
+ /*
+ If we have a problem reading this folder we will assume that it is
+ because this project does not need this folder and that's it.
+ */
+ //console.log('[WARN] Error reading a directory content. filePath = ' + dirPath)
+ } else {
+ for (let i = 0; i < fileList.length; i++) {
+ let name = 'Plugin \u2192 ' + fileList[i]
+ updatedFileList.push([project, name])
+ }
+ }
+ allWorkspaces = allWorkspaces.concat(updatedFileList)
+ projectsCount++
+ if (projectsCount === projects.length) {
+ readMyWorkspaces()
+ }
+ }
+ } catch (err) {
+ console.log('[ERROR] Error reading a directory content. filePath = ' + dirPath)
+ console.log('[ERROR] err.stack = ' + err.stack)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ return
+ }
+ }
+ }
+
+ function readMyWorkspaces() {
+ let dirPath = global.env.PATH_TO_MY_WORKSPACES
+ try {
+ let fs = SA.nodeModules.fs
+ fs.readdir(dirPath, onDirRead)
+
+ function onDirRead(err, fileList) {
+ if (err) {
+ // This happens the first time you run the software.
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(allWorkspaces), httpResponse)
+ return
+ } else {
+ let updatedFileList = []
+ for (let i = 0; i < fileList.length; i++) {
+ let name = fileList[i]
+ updatedFileList.push(['', name])
+ }
+ allWorkspaces = allWorkspaces.concat(updatedFileList)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(allWorkspaces), httpResponse)
+ return
+ }
+ }
+ } catch (err) {
+ console.log('[ERROR] Error reading a directory content. filePath = ' + dirPath)
+ console.log('[ERROR] err.stack = ' + err.stack)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ return
+ }
+ }
+ }
+ break
+ case 'LoadMyWorkspace':
+ {
+ let fileName = unescape(requestPath[2])
+ let filePath = global.env.PATH_TO_MY_WORKSPACES + '/' + fileName + '.json'
+ SA.projects.foundations.utilities.httpResponses.respondWithFile(filePath, httpResponse)
+ }
+ break
+ case 'SaveWorkspace':
+ {
+ SA.projects.foundations.utilities.httpRequests.getRequestBody(httpRequest, processRequest)
+
+ async function processRequest(body) {
+
+ let fileContent = body
+ let fileName = unescape(requestPath[2])
+ let filePath = global.env.PATH_TO_MY_WORKSPACES + '/' + fileName + '.json'
+
+ try {
+ let fs = SA.nodeModules.fs
+ let dir = global.env.PATH_TO_MY_WORKSPACES;
+
+ /* Create Dir if it does not exist */
+ if (!fs.existsSync(dir)) {
+ fs.mkdirSync(dir);
+ }
+
+ fs.writeFile(filePath, fileContent, onFileWritten)
+
+ function onFileWritten(err) {
+ if (err) {
+ console.log('[ERROR] SaveWorkspace -> onFileWritten -> Error writing the Workspace file. fileName = ' + fileName)
+ console.log('[ERROR] SaveWorkspace -> onFileWritten -> err.stack = ' + err.stack)
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ } else {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
+ }
+ }
+
+ } catch (err) {
+ console.log('[ERROR] SaveWorkspace -> Error writing the Workspace file. fileName = ' + fileName)
+ console.log('[ERROR] SaveWorkspace -> err.stack = ' + err.stack)
+ let error = {
+ result: 'Fail Because',
+ message: err.message,
+ stack: err.stack
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
+ }
+ }
+ }
+ break
+ case 'ProjectsSchema':
+ {
+ let path = global.env.PATH_TO_PROJECTS + '/' + 'ProjectsSchema.json'
+ SA.projects.foundations.utilities.httpResponses.respondWithFile(path, httpResponse)
+ }
+ break
+ case 'ListSpaceFiles':
+ {
+ let fs = SA.nodeModules.fs
+ let allFiles = []
+ let projects = SA.projects.foundations.utilities.filesAndDirectories.getDirectories(global.env.PATH_TO_PROJECTS)
+ let dirCount = 0
+ let totalDirs = 0
+
+ for (let i = 0; i < projects.length; i++) {
+ let project = projects[i]
+
+ let dirPath = project + '/UI/Spaces'
+ let spaces = SA.projects.foundations.utilities.filesAndDirectories.getDirectories(global.env.PATH_TO_PROJECTS + '/' + dirPath)
+
+ for (let j = 0; j < spaces.length; j++) {
+ let space = spaces[j]
+ readDirectory(dirPath + '/' + space)
+ }
+
+ function readDirectory(path) {
+ try {
+
+ totalDirs++
+ fs.readdir(global.env.PATH_TO_PROJECTS + '/' + path, onDirRead)
+
+ let otherDirs = SA.projects.foundations.utilities.filesAndDirectories.getDirectories(global.env.PATH_TO_PROJECTS + '/' + path)
+ for (let m = 0; m < otherDirs.length; m++) {
+ let otherDir = otherDirs[m]
+ readDirectory(path + '/' + otherDir)
+ }
+
+ function onDirRead(err, fileList) {
+ if (err) {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ } else {
+ let updatedFileList = []
+ for (let k = 0; k < fileList.length; k++) {
+ let name = fileList[k]
+ if (name.indexOf('.js') < 0) { continue }
+ updatedFileList.push(path + '/' + name)
+ }
+ allFiles = allFiles.concat(updatedFileList)
+ dirCount++
+ if (dirCount === totalDirs) {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(allFiles), httpResponse)
+ }
+ }
+ }
+ } catch (err) {
+ console.log('[ERROR] Error reading a directory content. filePath = ' + path)
+ console.log('[ERROR] err.stack = ' + err.stack)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ return
+ }
+ }
+ }
+ }
+ break
+ case 'ListFunctionLibraries':
+ {
+ SA.projects.foundations.utilities.httpResponses.respondWithProjectFolderFileList(httpResponse, 'Function-Libraries', 'UI')
+ }
+ break
+ case 'ListUtilitiesFiles':
+ {
+ SA.projects.foundations.utilities.httpResponses.respondWithProjectFolderFileList(httpResponse, 'Utilities', 'UI')
+ }
+ break
+ case 'ListGlobalFiles':
+ {
+ SA.projects.foundations.utilities.httpResponses.respondWithProjectFolderFileList(httpResponse, 'Globals', 'UI')
+ }
+ break
+ case 'Projects':
+ {
+ let path = ''
+ for (let i = 2; i < 10; i++) {
+ if (requestPath[i] !== undefined) {
+ let parameter = unescape(requestPath[i])
+ path = path + '/' + parameter
+ }
+
+ }
+ let filePath = global.env.PATH_TO_PROJECTS + path
+ SA.projects.foundations.utilities.httpResponses.respondWithFile(filePath, httpResponse)
+ }
+ break
+ case 'Storage':
+ {
+ let pathToFile = httpRequest.url.substring(9)
+ /* Unsavping # */
+ for (let i = 0; i < 10; i++) {
+ pathToFile = pathToFile.replace('_HASHTAG_', '#')
+ }
+ SA.projects.foundations.utilities.httpResponses.respondWithFile(global.env.PATH_TO_DATA_STORAGE + '/' + pathToFile, httpResponse)
+ }
+ break
+ default:
+ {
+ SA.projects.foundations.utilities.httpResponses.respondWithWebFile(httpResponse, endpointOrFile, global.env.PATH_TO_CLIENT)
+ }
+ }
+ } catch (err) {
+ console.log(err.stack)
+ }
+ }
+}
diff --git a/Client/pluginServer.js b/Platform/Client/pluginServer.js
similarity index 100%
rename from Client/pluginServer.js
rename to Platform/Client/pluginServer.js
diff --git a/Client/projectFileServer.js b/Platform/Client/projectFileServer.js
similarity index 100%
rename from Client/projectFileServer.js
rename to Platform/Client/projectFileServer.js
diff --git a/Client/taskManagerServer.js b/Platform/Client/taskManagerServer.js
similarity index 100%
rename from Client/taskManagerServer.js
rename to Platform/Client/taskManagerServer.js
diff --git a/Client/uiFileServer.js b/Platform/Client/uiFileServer.js
similarity index 100%
rename from Client/uiFileServer.js
rename to Platform/Client/uiFileServer.js
diff --git a/Client/web3Server.js b/Platform/Client/web3Server.js
similarity index 100%
rename from Client/web3Server.js
rename to Platform/Client/web3Server.js
diff --git a/Client/webServer.js b/Platform/Client/webServer.js
similarity index 100%
rename from Client/webServer.js
rename to Platform/Client/webServer.js
diff --git a/Client/webSocketsInterface.js b/Platform/Client/webSocketsInterface.js
similarity index 94%
rename from Client/webSocketsInterface.js
rename to Platform/Client/webSocketsInterface.js
index 84963a977..aaabd15d2 100644
--- a/Client/webSocketsInterface.js
+++ b/Platform/Client/webSocketsInterface.js
@@ -4,26 +4,21 @@
let thisObject = {
initialize: initialize,
- finalize: finalize,
- run: run
+ finalize: finalize
}
const WEB_SOCKET = require('ws')
let socketServer
- let port = global.env.WEB_SOCKETS_INTERFACE_PORT
+ let port = global.env.CLIENT_WEB_SOCKETS_INTERFACE_PORT
return thisObject
function finalize() {
-
+ socketServer = undefined
}
function initialize() {
-
- }
-
- function run() {
- setUpWebSocketServer()
+ setUpWebSocketServer()
}
function setUpWebSocketServer() {
@@ -47,8 +42,8 @@
if (LOG_INFO === true) {
console.log('Message Received: ' + message.substring(0, 1000))
}
-
- let messageArray = message.split('|*|')
+
+ let messageArray = message.toString().split('|*|')
let origin = messageArray[0]
let nonce = messageArray[1]
diff --git a/Client/client.js b/Platform/PlatformApp.js
similarity index 60%
rename from Client/client.js
rename to Platform/PlatformApp.js
index 46037d580..1ce43c411 100644
--- a/Client/client.js
+++ b/Platform/PlatformApp.js
@@ -6,92 +6,107 @@ global.env = ENVIRONMENT_MODULE
process.on('uncaughtException', function (err) {
if (err.message && err.message.indexOf("EADDRINUSE") > 0) {
- console.log("A Superalgos Client cannot be started. Reason: the port configured migth be being used by another application.")
+ console.log("The Superalgos Platform Client cannot be started. Reason: the port configured migth be being used by another application, or Superalgos Platform Client might be already running.")
return
}
- console.log('[ERROR] Client -> client-> uncaughtException -> err.message = ' + err.message)
- console.log('[ERROR] Client -> client-> uncaughtException -> err.stack = ' + err.stack)
- console.log('[ERROR] Client -> client-> uncaughtException -> err = ' + err)
+ console.log('[ERROR] Platform App -> uncaughtException -> err.message = ' + err.message)
+ console.log('[ERROR] Platform App -> uncaughtException -> err.stack = ' + err.stack)
+ console.log('[ERROR] Platform App -> uncaughtException -> err = ' + err)
process.exit(1)
})
process.on('unhandledRejection', (reason, p) => {
// Signal user that a necissary node module is missing
if (reason.code == 'MODULE_NOT_FOUND') {
- console.log("[ERROR] Dependency library not found. Please try running the 'node setup' command and then restart the Client.")
- console.log('[ERROR] Client -> client-> reason = ' + JSON.stringify(reason))
+ console.log("[ERROR] Dependency library not found. Please try running the 'node setup' command and then restart the Superalgos Platform Client.")
+ console.log('[ERROR] Platform App -> reason = ' + JSON.stringify(reason))
process.exit(1)
}
- console.log('[ERROR] Client -> client-> unhandledRejection -> reason = ' + JSON.stringify(reason))
- console.log('[ERROR] Client -> client-> unhandledRejection -> p = ' + JSON.stringify(p))
+ console.log('[ERROR] Platform App -> unhandledRejection -> reason = ' + JSON.stringify(reason))
+ console.log('[ERROR] Platform App -> unhandledRejection -> p = ' + JSON.stringify(p))
process.exit(1)
})
-
-/* Callbacks default responses. */
-
-global.DEFAULT_OK_RESPONSE = {
- result: "Ok",
- message: "Operation Succeeded"
-};
-
-global.DEFAULT_FAIL_RESPONSE = {
- result: "Fail",
- message: "Operation Failed"
-};
-
-global.DEFAULT_RETRY_RESPONSE = {
- result: 'Retry',
- message: 'Retry Later'
-}
-
-global.CUSTOM_OK_RESPONSE = {
- result: 'Ok, but check Message',
- message: 'Custom Message'
-}
-
-global.CUSTOM_FAIL_RESPONSE = {
- result: 'Fail Because',
- message: 'Custom Message'
-}
-
-/* The CL object is accesible everywhere at the Superalgos Client */
-global.CL = {}
-
-/* Servers */
-let WEB_SERVER = require('./webServer.js')
-let DATA_FILE_SERVER = require('./dataFileServer.js')
-let PROJECT_FILE_SERVER = require('./projectFileServer.js')
-let UI_FILE_SERVER = require('./uiFileServer.js')
-let PLUGIN_SERVER = require('./pluginServer.js')
-let EVENT_SERVER = require('./eventServer.js')
-let TASK_MANAGER_SERVER = require('./taskManagerServer.js')
-let CCXT_SERVER = require('./ccxtServer.js')
-let WEB3_SERVER = require('./web3Server.js')
-let GITHUB_SERVER = require('./githubServer.js')
-
-/* Network Interfaces */
-let WEB_SOCKETS_INTERFACE = require('./webSocketsInterface.js')
-let HTTP_INTERFACE = require('./httpInterface.js')
-
try {
+ /* Callbacks default responses. */
+
+ global.DEFAULT_OK_RESPONSE = {
+ result: "Ok",
+ message: "Operation Succeeded"
+ };
+
+ global.DEFAULT_FAIL_RESPONSE = {
+ result: "Fail",
+ message: "Operation Failed"
+ };
+
+ global.DEFAULT_RETRY_RESPONSE = {
+ result: 'Retry',
+ message: 'Retry Later'
+ }
+
+ global.CUSTOM_OK_RESPONSE = {
+ result: 'Ok, but check Message',
+ message: 'Custom Message'
+ }
+
+ global.CUSTOM_FAIL_RESPONSE = {
+ result: 'Fail Because',
+ message: 'Custom Message'
+ }
+
+ /* Servers */
+ let WEB_SERVER = require('./Client/webServer.js')
+ let DATA_FILE_SERVER = require('./Client/dataFileServer.js')
+ let PROJECT_FILE_SERVER = require('./Client/projectFileServer.js')
+ let UI_FILE_SERVER = require('./Client/uiFileServer.js')
+ let PLUGIN_SERVER = require('./Client/pluginServer.js')
+ let EVENT_SERVER = require('./Client/eventServer.js')
+ let TASK_MANAGER_SERVER = require('./Client/taskManagerServer.js')
+ let CCXT_SERVER = require('./Client/ccxtServer.js')
+ let WEB3_SERVER = require('./Client/web3Server.js')
+ let GITHUB_SERVER = require('./Client/githubServer.js')
+
+ /* Network Interfaces */
+ let WEB_SOCKETS_INTERFACE = require('./Client/webSocketsInterface.js')
+ let HTTP_INTERFACE = require('./Client/httpInterface.js')
+
+
+ /*
+ The CL object is accesible everywhere at the Superalgos Client.
+ It provides access to all modules built for this Client.
+ */
+ global.CL = {}
+ /*
+ The SA object is accesible everywhere at the Superalgos Client.
+ It provides access to all modules built for Superalgos in general.
+ */
+ global.SA = {}
+ /*
+ First thing is to load the project schema file.
+ */
+ global.PROJECTS_SCHEMA = require(global.env.PATH_TO_PROJECT_SCHEMA)
/*
Setting up the modules that will be available for the Servers Running inside this Client
*/
- let MULTI_PROJECT = require('./MultiProject.js');
+ let MULTI_PROJECT = require('../MultiProject.js');
let MULTI_PROJECT_MODULE = MULTI_PROJECT.newMultiProject()
- MULTI_PROJECT_MODULE.initialize()
+ MULTI_PROJECT_MODULE.initialize(CL, 'CL')
+ MULTI_PROJECT_MODULE.initialize(SA, 'SA')
/*
Setting up external dependencies.
*/
- CL.nodeModules = {
+ SA.nodeModules = {
fs: require('fs'),
- nodeFetch: require('node-fetch')
+ nodeFetch: require('node-fetch'),
+ open: require('open'),
+ http: require('http'),
+ ccxt: require('ccxt')
}
/*
Setting up servers running inside this Client.
*/
CL.servers = {}
- console.log('CLIENT SERVERS:')
+ console.log('SUPERALGOS PLATFORM CLIENT SERVERS:')
console.log('')
CL.servers.WEB_SERVER = WEB_SERVER.newWebServer()
@@ -145,18 +160,16 @@ try {
console.log('Github Server ............................................... Started')
console.log('')
- console.log('CLIENT INTERFACES:')
+ console.log('SUPERALGOS PLATFORM CLIENT INTERFACES:')
console.log('')
WEB_SOCKETS_INTERFACE = WEB_SOCKETS_INTERFACE.newWebSocketsInterface()
WEB_SOCKETS_INTERFACE.initialize()
- WEB_SOCKETS_INTERFACE.run()
- console.log('Web Sockets Interface ....................................... Listening at port ' + global.env.WEB_SOCKETS_INTERFACE_PORT)
+ console.log('Web Sockets Interface ....................................... Listening at port ' + global.env.CLIENT_WEB_SOCKETS_INTERFACE_PORT)
HTTP_INTERFACE = HTTP_INTERFACE.newHttpInterface()
HTTP_INTERFACE.initialize()
- HTTP_INTERFACE.run()
- console.log('Http Interface .............................................. Listening at port ' + global.env.HTTP_INTERFACE_PORT)
+ console.log('Http Interface .............................................. Listening at port ' + global.env.CLIENT_HTTP_INTERFACE_PORT)
console.log('')
console.log("You are running Superalgos Beta 11")
@@ -176,6 +189,6 @@ try {
console.log('')
} catch (err) {
- console.log('[ERROR] Client -> Error = ' + err.stack)
+ console.log('[ERROR] Platform App -> Error = ' + err.stack)
}
diff --git a/UI/.vscode/settings.json b/Platform/UI/.vscode/settings.json
similarity index 100%
rename from UI/.vscode/settings.json
rename to Platform/UI/.vscode/settings.json
diff --git a/UI/Animation.js b/Platform/UI/Animation.js
similarity index 100%
rename from UI/Animation.js
rename to Platform/UI/Animation.js
diff --git a/Platform/UI/AppLoader.js b/Platform/UI/AppLoader.js
new file mode 100644
index 000000000..b17587624
--- /dev/null
+++ b/Platform/UI/AppLoader.js
@@ -0,0 +1,190 @@
+let postLoader
+
+function newAppLoader() {
+ const MODULE_NAME = 'App Loader'
+ const INFO_LOG = false
+ const ERROR_LOG = true
+ const logger = newWebDebugLog()
+
+
+ let thisObject = {
+ loadModules: loadModules
+ }
+
+ return thisObject
+
+ async function loadModules() {
+ try {
+ if (INFO_LOG === true) { logger.write('[INFO] loadModules -> Entering function.') }
+
+ let plotters
+ let modulesArray = []
+
+ plotters = defaultPlotters()
+
+ modulesArray = modulesArray.concat([
+
+ 'Globals.js',
+ 'Workspace.js',
+
+ 'Files/SingleFile.js',
+ 'Files/FileCloud.js',
+ 'Files/MarketFiles.js',
+ 'Files/DailyFiles.js',
+ 'Files/FileCursor.js',
+ 'Files/FileSequence.js',
+ 'Files/FileStorage.js',
+
+ 'EventsServerClient.js',
+
+ 'LegacyPlotter.js',
+ 'PlotterPanel.js',
+
+ 'VideoRecorder.js',
+ 'ProductStorage.js',
+ 'Canvas.js',
+ 'EventHandler.js',
+ 'Frame.js',
+ 'Animation.js',
+ 'Container.js',
+ 'Utilities.js',
+ 'AppPostLoader.js'
+ ])
+
+ modulesArray = modulesArray.concat(plotters)
+
+ functionLibraries()
+
+ function functionLibraries() {
+ let url = 'ListFunctionLibraries'
+ httpRequest(undefined, url, onResponse)
+
+ function onResponse(err, fileList) {
+ let urlArray = []
+ let fileArray = JSON.parse(fileList)
+ for (let i = 0; i < fileArray.length; i++) {
+ let item = fileArray[i]
+
+ project = item[0]
+ fileName = item[1]
+ urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Function-Libraries' + '/' + fileName)
+ }
+
+ modulesArray = modulesArray.concat(urlArray)
+ utilities()
+ }
+ }
+
+ function utilities() {
+ let url = 'ListUtilitiesFiles'
+ httpRequest(undefined, url, onResponse)
+
+ function onResponse(err, fileList) {
+ let urlArray = []
+ let fileArray = JSON.parse(fileList)
+ for (let i = 0; i < fileArray.length; i++) {
+ let item = fileArray[i]
+
+ project = item[0]
+ fileName = item[1]
+ urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Utilities' + '/' + fileName)
+ }
+
+ modulesArray = modulesArray.concat(urlArray)
+ globals()
+ }
+ }
+
+ function globals() {
+ let url = 'ListGlobalFiles'
+ httpRequest(undefined, url, onResponse)
+
+ function onResponse(err, fileList) {
+ let urlArray = []
+ let fileArray = JSON.parse(fileList)
+ for (let i = 0; i < fileArray.length; i++) {
+ let item = fileArray[i]
+
+ project = item[0]
+ fileName = item[1]
+ urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Globals' + '/' + fileName)
+ }
+
+ modulesArray = modulesArray.concat(urlArray)
+ spaces()
+ }
+ }
+
+ function spaces() {
+ let url = 'ListSpaceFiles'
+ httpRequest(undefined, url, onResponse)
+
+ function onResponse(err, fileList) {
+ let urlArray = []
+ let fileArray = JSON.parse(fileList)
+ for (let i = 0; i < fileArray.length; i++) {
+ let path = fileArray[i]
+ urlArray.push('Projects' + '/' + path)
+ }
+
+ modulesArray = modulesArray.concat(urlArray)
+ downloadIncludedFiles()
+ }
+ }
+
+ function downloadIncludedFiles() {
+
+ let downloadedCounter = 0
+
+ for (let i = 0; i < modulesArray.length; i++) {
+ let path = modulesArray[i]
+
+ REQUIREJS([path], onRequired)
+
+ if (INFO_LOG === true) { logger.write('[INFO] loadModules -> Module Requested.') }
+ if (INFO_LOG === true) { logger.write('[INFO] loadModules -> path = ' + path) }
+ if (INFO_LOG === true) { logger.write('[INFO] loadModules -> total requested = ' + (i + 1)) }
+
+ function onRequired(pModule) {
+ try {
+ if (INFO_LOG === true) { logger.write('[INFO] loadModules -> onRequired -> Entering function.') }
+ if (INFO_LOG === true) { logger.write('[INFO] loadModules -> onRequired -> Module Downloaded.') }
+ if (INFO_LOG === true) { logger.write('[INFO] loadModules -> onRequired -> path = ' + path) }
+
+ downloadedCounter++
+
+ if (INFO_LOG === true) { logger.write('[INFO] loadModules -> onRequired -> downloadedCounter = ' + downloadedCounter) }
+
+ if (downloadedCounter === modulesArray.length) {
+ if (INFO_LOG === true) { logger.write('[INFO] loadModules -> onRequired -> Starting Advanced Algos Platform.') }
+ setTimeout(() => {
+ postLoader = newAppPostLoader()
+ postLoader.start()
+ }, 500)
+
+ }
+ } catch (err) {
+ if (ERROR_LOG === true) { logger.write('[ERROR] loadModules -> onRequired -> err = ' + err.stack) }
+ }
+ }
+ }
+ }
+
+ } catch (err) {
+ if (ERROR_LOG === true) { logger.write('[ERROR] loadModules -> err = ' + err.stack) }
+ }
+ }
+
+ function defaultPlotters() {
+ return [
+ 'Plotters/Foundations/Candles/Plotters-Candles-Volumes/Candles.js',
+ 'Plotters/Foundations/Candles/Plotters-Candles-Volumes/CandlePanel.js',
+ 'Plotters/Foundations/Candles/Plotters-Candles-Volumes/Volumes.js',
+ 'Plotters/Foundations/Candles/Plotters-Candles-Volumes/VolumePanel.js',
+ 'Plotters/Foundations/Bollinger/Plotters-Bollinger-Bands/BollingerBands.js',
+ 'Plotters/Foundations/Bollinger/Plotters-Bollinger-Bands/BollingerBandsPanel.js',
+ 'Plotters/Foundations/Bollinger/Plotters-Bollinger-Bands/PercentageBandwidth.js'
+ ]
+ }
+}
+
diff --git a/UI/AppPostLoader.js b/Platform/UI/AppPostLoader.js
similarity index 100%
rename from UI/AppPostLoader.js
rename to Platform/UI/AppPostLoader.js
diff --git a/UI/AppPreLoader.js b/Platform/UI/AppPreLoader.js
similarity index 100%
rename from UI/AppPreLoader.js
rename to Platform/UI/AppPreLoader.js
diff --git a/UI/Canvas.js b/Platform/UI/Canvas.js
similarity index 98%
rename from UI/Canvas.js
rename to Platform/UI/Canvas.js
index 4c07da82b..103241ba4 100644
--- a/UI/Canvas.js
+++ b/Platform/UI/Canvas.js
@@ -121,6 +121,8 @@ function newCanvas() {
let spaceAnimationDrawMap = new Map()
let spaceDefinitionDrawMap = new Map()
+ if (projectDefinition.UI === undefined) { continue }
+
/* Set up Globals of this Project */
if (projectDefinition.UI.globals !== undefined) {
for (let j = 0; j < projectDefinition.UI.globals.length; j++) {
@@ -742,6 +744,8 @@ function newCanvas() {
let projectInstance = UI.projects[projectDefinition.propertyName]
if (projectInstance === undefined) { continue }
+ if (projectDefinition.UI === undefined) { continue }
+ if (projectDefinition.UI.spaces === undefined) { continue }
for (let j = 0; j < projectDefinition.UI.spaces.length; j++) {
let spaceInstance = projectInstance.events.onMouseDownMap.get(j)
if (spaceInstance === undefined) { continue }
@@ -850,6 +854,8 @@ function newCanvas() {
let projectInstance = UI.projects[projectDefinition.propertyName]
if (projectInstance === undefined) { continue }
+ if (projectDefinition.UI === undefined) { continue }
+ if (projectDefinition.UI.spaces === undefined) { continue }
for (let j = 0; j < projectDefinition.UI.spaces.length; j++) {
let spaceInstance = projectInstance.events.onMouseClickMap.get(j)
if (spaceInstance === undefined) { continue }
@@ -966,6 +972,8 @@ function newCanvas() {
let projectInstance = UI.projects[projectDefinition.propertyName]
if (projectInstance === undefined) { continue }
+ if (projectDefinition.UI === undefined) { continue }
+ if (projectDefinition.UI.spaces === undefined) { continue }
for (let j = 0; j < projectDefinition.UI.spaces.length; j++) {
let spaceInstance = projectInstance.events.onMouseOverMap.get(j)
if (spaceInstance === undefined) { continue }
@@ -1028,6 +1036,8 @@ function newCanvas() {
let projectInstance = UI.projects[projectDefinition.propertyName]
if (projectInstance === undefined) { continue }
+ if (projectDefinition.UI === undefined) { continue }
+ if (projectDefinition.UI.spaces === undefined) { continue }
for (let j = 0; j < projectDefinition.UI.spaces.length; j++) {
let spaceInstance = projectInstance.events.onMouseWheelMap.get(j)
if (spaceInstance === undefined) { continue }
diff --git a/UI/Container.js b/Platform/UI/Container.js
similarity index 100%
rename from UI/Container.js
rename to Platform/UI/Container.js
diff --git a/UI/Data-Files/src/DailyFiles.js b/Platform/UI/Data-Files/DailyFiles.js
similarity index 100%
rename from UI/Data-Files/src/DailyFiles.js
rename to Platform/UI/Data-Files/DailyFiles.js
diff --git a/UI/Data-Files/src/FileCloud.js b/Platform/UI/Data-Files/FileCloud.js
similarity index 100%
rename from UI/Data-Files/src/FileCloud.js
rename to Platform/UI/Data-Files/FileCloud.js
diff --git a/UI/Data-Files/src/FileCursor.js b/Platform/UI/Data-Files/FileCursor.js
similarity index 100%
rename from UI/Data-Files/src/FileCursor.js
rename to Platform/UI/Data-Files/FileCursor.js
diff --git a/UI/Data-Files/src/FileSequence.js b/Platform/UI/Data-Files/FileSequence.js
similarity index 100%
rename from UI/Data-Files/src/FileSequence.js
rename to Platform/UI/Data-Files/FileSequence.js
diff --git a/UI/Data-Files/src/FileStorage.js b/Platform/UI/Data-Files/FileStorage.js
similarity index 100%
rename from UI/Data-Files/src/FileStorage.js
rename to Platform/UI/Data-Files/FileStorage.js
diff --git a/UI/Data-Files/src/MarketFiles.js b/Platform/UI/Data-Files/MarketFiles.js
similarity index 100%
rename from UI/Data-Files/src/MarketFiles.js
rename to Platform/UI/Data-Files/MarketFiles.js
diff --git a/UI/Data-Files/src/SingleFile.js b/Platform/UI/Data-Files/SingleFile.js
similarity index 100%
rename from UI/Data-Files/src/SingleFile.js
rename to Platform/UI/Data-Files/SingleFile.js
diff --git a/UI/EventHandler.js b/Platform/UI/EventHandler.js
similarity index 100%
rename from UI/EventHandler.js
rename to Platform/UI/EventHandler.js
diff --git a/UI/EventsServerClient.js b/Platform/UI/EventsServerClient.js
similarity index 100%
rename from UI/EventsServerClient.js
rename to Platform/UI/EventsServerClient.js
diff --git a/UI/Frame.js b/Platform/UI/Frame.js
similarity index 100%
rename from UI/Frame.js
rename to Platform/UI/Frame.js
diff --git a/UI/Globals.js b/Platform/UI/Globals.js
similarity index 100%
rename from UI/Globals.js
rename to Platform/UI/Globals.js
diff --git a/UI/ProductStorage.js b/Platform/UI/ProductStorage.js
similarity index 100%
rename from UI/ProductStorage.js
rename to Platform/UI/ProductStorage.js
diff --git a/UI/Utilities.js b/Platform/UI/Utilities.js
similarity index 100%
rename from UI/Utilities.js
rename to Platform/UI/Utilities.js
diff --git a/UI/VideoRecorder.js b/Platform/UI/VideoRecorder.js
similarity index 100%
rename from UI/VideoRecorder.js
rename to Platform/UI/VideoRecorder.js
diff --git a/UI/WebDebugLog.js b/Platform/UI/WebDebugLog.js
similarity index 100%
rename from UI/WebDebugLog.js
rename to Platform/UI/WebDebugLog.js
diff --git a/Platform/WebServer/Fonts/Saira-Condensed.woff2 b/Platform/WebServer/Fonts/Saira-Condensed.woff2
new file mode 100644
index 000000000..8a7ff57d0
Binary files /dev/null and b/Platform/WebServer/Fonts/Saira-Condensed.woff2 differ
diff --git a/Platform/WebServer/Fonts/Saira.woff2 b/Platform/WebServer/Fonts/Saira.woff2
new file mode 100644
index 000000000..5c1b242e1
Binary files /dev/null and b/Platform/WebServer/Fonts/Saira.woff2 differ
diff --git a/Client/WebServer/Fonts/fontawesome-webfont.ttf b/Platform/WebServer/Fonts/fontawesome-webfont.ttf
similarity index 100%
rename from Client/WebServer/Fonts/fontawesome-webfont.ttf
rename to Platform/WebServer/Fonts/fontawesome-webfont.ttf
diff --git a/Client/WebServer/Fonts/fontawesome-webfont.woff b/Platform/WebServer/Fonts/fontawesome-webfont.woff
similarity index 100%
rename from Client/WebServer/Fonts/fontawesome-webfont.woff
rename to Platform/WebServer/Fonts/fontawesome-webfont.woff
diff --git a/Client/WebServer/Fonts/fontawesome-webfont.woff2 b/Platform/WebServer/Fonts/fontawesome-webfont.woff2
similarity index 100%
rename from Client/WebServer/Fonts/fontawesome-webfont.woff2
rename to Platform/WebServer/Fonts/fontawesome-webfont.woff2
diff --git a/Platform/WebServer/Fonts/segoeui.woff b/Platform/WebServer/Fonts/segoeui.woff
new file mode 100644
index 000000000..afe528bc7
Binary files /dev/null and b/Platform/WebServer/Fonts/segoeui.woff differ
diff --git a/Client/WebServer/Images/Languages/CN.png b/Platform/WebServer/Images/Languages/CN.png
similarity index 100%
rename from Client/WebServer/Images/Languages/CN.png
rename to Platform/WebServer/Images/Languages/CN.png
diff --git a/Client/WebServer/Images/Languages/DE.png b/Platform/WebServer/Images/Languages/DE.png
similarity index 100%
rename from Client/WebServer/Images/Languages/DE.png
rename to Platform/WebServer/Images/Languages/DE.png
diff --git a/Client/WebServer/Images/Languages/EN.png b/Platform/WebServer/Images/Languages/EN.png
similarity index 100%
rename from Client/WebServer/Images/Languages/EN.png
rename to Platform/WebServer/Images/Languages/EN.png
diff --git a/Client/WebServer/Images/Languages/ES.png b/Platform/WebServer/Images/Languages/ES.png
similarity index 100%
rename from Client/WebServer/Images/Languages/ES.png
rename to Platform/WebServer/Images/Languages/ES.png
diff --git a/Client/WebServer/Images/Languages/FR.png b/Platform/WebServer/Images/Languages/FR.png
similarity index 100%
rename from Client/WebServer/Images/Languages/FR.png
rename to Platform/WebServer/Images/Languages/FR.png
diff --git a/Client/WebServer/Images/Languages/ID.png b/Platform/WebServer/Images/Languages/ID.png
similarity index 100%
rename from Client/WebServer/Images/Languages/ID.png
rename to Platform/WebServer/Images/Languages/ID.png
diff --git a/Client/WebServer/Images/Languages/IT.png b/Platform/WebServer/Images/Languages/IT.png
similarity index 100%
rename from Client/WebServer/Images/Languages/IT.png
rename to Platform/WebServer/Images/Languages/IT.png
diff --git a/Client/WebServer/Images/Languages/RU.png b/Platform/WebServer/Images/Languages/RU.png
similarity index 100%
rename from Client/WebServer/Images/Languages/RU.png
rename to Platform/WebServer/Images/Languages/RU.png
diff --git a/Client/WebServer/Images/Languages/TR.png b/Platform/WebServer/Images/Languages/TR.png
similarity index 100%
rename from Client/WebServer/Images/Languages/TR.png
rename to Platform/WebServer/Images/Languages/TR.png
diff --git a/Client/WebServer/Images/Tutorial/Gifs/welcome-binanceus.gif b/Platform/WebServer/Images/Tutorial/Gifs/welcome-binanceus.gif
similarity index 100%
rename from Client/WebServer/Images/Tutorial/Gifs/welcome-binanceus.gif
rename to Platform/WebServer/Images/Tutorial/Gifs/welcome-binanceus.gif
diff --git a/Platform/WebServer/Images/favicon.ico b/Platform/WebServer/Images/favicon.ico
new file mode 100644
index 000000000..cd2c5d6af
Binary files /dev/null and b/Platform/WebServer/Images/favicon.ico differ
diff --git a/Client/WebServer/Images/sa-beta10-logo-horiz-dark.png b/Platform/WebServer/Images/sa-beta10-logo-horiz-dark.png
similarity index 100%
rename from Client/WebServer/Images/sa-beta10-logo-horiz-dark.png
rename to Platform/WebServer/Images/sa-beta10-logo-horiz-dark.png
diff --git a/Client/WebServer/Images/sa-beta11-logo-horiz-dark.png b/Platform/WebServer/Images/sa-beta11-logo-horiz-dark.png
similarity index 100%
rename from Client/WebServer/Images/sa-beta11-logo-horiz-dark.png
rename to Platform/WebServer/Images/sa-beta11-logo-horiz-dark.png
diff --git a/Client/WebServer/Images/sa-beta6-logo-horiz-dark.png b/Platform/WebServer/Images/sa-beta6-logo-horiz-dark.png
similarity index 100%
rename from Client/WebServer/Images/sa-beta6-logo-horiz-dark.png
rename to Platform/WebServer/Images/sa-beta6-logo-horiz-dark.png
diff --git a/Client/WebServer/Images/sa-beta7-logo-horiz-dark.png b/Platform/WebServer/Images/sa-beta7-logo-horiz-dark.png
similarity index 100%
rename from Client/WebServer/Images/sa-beta7-logo-horiz-dark.png
rename to Platform/WebServer/Images/sa-beta7-logo-horiz-dark.png
diff --git a/Client/WebServer/Images/sa-beta8-logo-horiz-dark.png b/Platform/WebServer/Images/sa-beta8-logo-horiz-dark.png
similarity index 100%
rename from Client/WebServer/Images/sa-beta8-logo-horiz-dark.png
rename to Platform/WebServer/Images/sa-beta8-logo-horiz-dark.png
diff --git a/Client/WebServer/Images/sa-beta9-logo-horiz-dark.png b/Platform/WebServer/Images/sa-beta9-logo-horiz-dark.png
similarity index 100%
rename from Client/WebServer/Images/sa-beta9-logo-horiz-dark.png
rename to Platform/WebServer/Images/sa-beta9-logo-horiz-dark.png
diff --git a/Client/WebServer/Images/superalgos-header-background.png b/Platform/WebServer/Images/superalgos-header-background.png
similarity index 100%
rename from Client/WebServer/Images/superalgos-header-background.png
rename to Platform/WebServer/Images/superalgos-header-background.png
diff --git a/Client/WebServer/Images/superalgos-logo-for-color-background.png b/Platform/WebServer/Images/superalgos-logo-for-color-background.png
similarity index 100%
rename from Client/WebServer/Images/superalgos-logo-for-color-background.png
rename to Platform/WebServer/Images/superalgos-logo-for-color-background.png
diff --git a/Client/WebServer/Images/superalgos-logo-white.png b/Platform/WebServer/Images/superalgos-logo-white.png
similarity index 100%
rename from Client/WebServer/Images/superalgos-logo-white.png
rename to Platform/WebServer/Images/superalgos-logo-white.png
diff --git a/Client/WebServer/Images/superalgos-logo.png b/Platform/WebServer/Images/superalgos-logo.png
similarity index 100%
rename from Client/WebServer/Images/superalgos-logo.png
rename to Platform/WebServer/Images/superalgos-logo.png
diff --git a/Client/WebServer/Images/superalgos-platform.jpg b/Platform/WebServer/Images/superalgos-platform.jpg
similarity index 100%
rename from Client/WebServer/Images/superalgos-platform.jpg
rename to Platform/WebServer/Images/superalgos-platform.jpg
diff --git a/Client/WebServer/LegacyPlotter.js b/Platform/WebServer/LegacyPlotter.js
similarity index 100%
rename from Client/WebServer/LegacyPlotter.js
rename to Platform/WebServer/LegacyPlotter.js
diff --git a/Client/WebServer/PlotterPanel.js b/Platform/WebServer/PlotterPanel.js
similarity index 100%
rename from Client/WebServer/PlotterPanel.js
rename to Platform/WebServer/PlotterPanel.js
diff --git a/Client/WebServer/css/context-menu.css b/Platform/WebServer/css/context-menu.css
similarity index 100%
rename from Client/WebServer/css/context-menu.css
rename to Platform/WebServer/css/context-menu.css
diff --git a/Client/WebServer/css/credits.css b/Platform/WebServer/css/credits.css
similarity index 100%
rename from Client/WebServer/css/credits.css
rename to Platform/WebServer/css/credits.css
diff --git a/Client/WebServer/css/docs.css b/Platform/WebServer/css/docs.css
similarity index 100%
rename from Client/WebServer/css/docs.css
rename to Platform/WebServer/css/docs.css
diff --git a/Client/WebServer/css/font-awasome.css b/Platform/WebServer/css/font-awasome.css
similarity index 100%
rename from Client/WebServer/css/font-awasome.css
rename to Platform/WebServer/css/font-awasome.css
diff --git a/Client/WebServer/css/governance.css b/Platform/WebServer/css/governance.css
similarity index 100%
rename from Client/WebServer/css/governance.css
rename to Platform/WebServer/css/governance.css
diff --git a/Client/WebServer/css/main.css b/Platform/WebServer/css/main.css
similarity index 100%
rename from Client/WebServer/css/main.css
rename to Platform/WebServer/css/main.css
diff --git a/Client/WebServer/css/prism.css b/Platform/WebServer/css/prism.css
similarity index 100%
rename from Client/WebServer/css/prism.css
rename to Platform/WebServer/css/prism.css
diff --git a/Client/WebServer/css/tutorial.css b/Platform/WebServer/css/tutorial.css
similarity index 100%
rename from Client/WebServer/css/tutorial.css
rename to Platform/WebServer/css/tutorial.css
diff --git a/Client/WebServer/externalScripts/CCapture.all.min.js b/Platform/WebServer/externalScripts/CCapture.all.min.js
similarity index 100%
rename from Client/WebServer/externalScripts/CCapture.all.min.js
rename to Platform/WebServer/externalScripts/CCapture.all.min.js
diff --git a/Client/WebServer/externalScripts/gif.worker.js b/Platform/WebServer/externalScripts/gif.worker.js
similarity index 100%
rename from Client/WebServer/externalScripts/gif.worker.js
rename to Platform/WebServer/externalScripts/gif.worker.js
diff --git a/Client/WebServer/externalScripts/prism.js b/Platform/WebServer/externalScripts/prism.js
similarity index 100%
rename from Client/WebServer/externalScripts/prism.js
rename to Platform/WebServer/externalScripts/prism.js
diff --git a/Client/WebServer/index.html b/Platform/WebServer/index.html
similarity index 98%
rename from Client/WebServer/index.html
rename to Platform/WebServer/index.html
index c8e1dbf2e..663111b2f 100644
--- a/Client/WebServer/index.html
+++ b/Platform/WebServer/index.html
@@ -2,7 +2,7 @@
- Superalgos
+ Superalgos Platform
@@ -18,11 +18,8 @@
-
-
-
-
diff --git a/Platform/WebServer/require.js b/Platform/WebServer/require.js
new file mode 100644
index 000000000..f9476f532
--- /dev/null
+++ b/Platform/WebServer/require.js
@@ -0,0 +1,2145 @@
+/** vim: et:ts=4:sw=4:sts=4
+ * @license RequireJS 2.3.5 Copyright jQuery Foundation and other contributors.
+ * Released under MIT license, https://github.com/REQUIREJS/REQUIREJS/blob/master/LICENSE
+ */
+//Not using strict: uneven strict support in browsers, #392, and causes
+//problems with REQUIREJS.exec()/transpiler plugins that may not be strict.
+/*jslint regexp: true, nomen: true, sloppy: true */
+/*global window, navigator, document, importScripts, setTimeout, opera */
+
+var REQUIREJS, REQUIRE, DEFINE;
+(function (global, setTimeout) {
+ var req, s, head, baseElement, dataMain, src,
+ interactiveScript, currentlyAddingScript, mainScript, subPath,
+ version = '2.3.5',
+ commentRegExp = /\/\*[\s\S]*?\*\/|([^:"'=]|^)\/\/.*$/mg,
+ cjsRequireRegExp = /[^.]\s*REQUIRE\s*\(\s*["']([^'"\s]+)["']\s*\)/g,
+ jsSuffixRegExp = /\.js$/,
+ currDirRegExp = /^\.\//,
+ op = Object.prototype,
+ ostring = op.toString,
+ hasOwn = op.hasOwnProperty,
+ isBrowser = !!(typeof window !== 'undefined' && typeof navigator !== 'undefined' && window.document),
+ isWebWorker = !isBrowser && typeof importScripts !== 'undefined',
+ //PS3 indicates loaded and complete, but need to wait for complete
+ //specifically. Sequence is 'loading', 'loaded', execution,
+ // then 'complete'. The UA check is unfortunate, but not sure how
+ //to feature test w/o causing perf issues.
+ readyRegExp = isBrowser && navigator.platform === 'PLAYSTATION 3' ?
+ /^complete$/ : /^(complete|loaded)$/,
+ defContextName = '_',
+ //Oh the tragedy, detecting opera. See the usage of isOpera for reason.
+ isOpera = typeof opera !== 'undefined' && opera.toString() === '[object Opera]',
+ contexts = {},
+ cfg = {},
+ globalDefQueue = [],
+ useInteractive = false;
+
+ //Could match something like ')//comment', do not lose the prefix to comment.
+ function commentReplace(match, singlePrefix) {
+ return singlePrefix || '';
+ }
+
+ function isFunction(it) {
+ return ostring.call(it) === '[object Function]';
+ }
+
+ function isArray(it) {
+ return ostring.call(it) === '[object Array]';
+ }
+
+ /**
+ * Helper function for iterating over an array. If the func returns
+ * a true value, it will break out of the loop.
+ */
+ function each(ary, func) {
+ if (ary) {
+ var i;
+ for (i = 0; i < ary.length; i += 1) {
+ if (ary[i] && func(ary[i], i, ary)) {
+ break;
+ }
+ }
+ }
+ }
+
+ /**
+ * Helper function for iterating over an array backwards. If the func
+ * returns a true value, it will break out of the loop.
+ */
+ function eachReverse(ary, func) {
+ if (ary) {
+ var i;
+ for (i = ary.length - 1; i > -1; i -= 1) {
+ if (ary[i] && func(ary[i], i, ary)) {
+ break;
+ }
+ }
+ }
+ }
+
+ function hasProp(obj, prop) {
+ return hasOwn.call(obj, prop);
+ }
+
+ function getOwn(obj, prop) {
+ return hasProp(obj, prop) && obj[prop];
+ }
+
+ /**
+ * Cycles over properties in an object and calls a function for each
+ * property value. If the function returns a truthy value, then the
+ * iteration is stopped.
+ */
+ function eachProp(obj, func) {
+ var prop;
+ for (prop in obj) {
+ if (hasProp(obj, prop)) {
+ if (func(obj[prop], prop)) {
+ break;
+ }
+ }
+ }
+ }
+
+ /**
+ * Simple function to mix in properties from source into target,
+ * but only if target does not already have a property of the same name.
+ */
+ function mixin(target, source, force, deepStringMixin) {
+ if (source) {
+ eachProp(source, function (value, prop) {
+ if (force || !hasProp(target, prop)) {
+ if (deepStringMixin && typeof value === 'object' && value &&
+ !isArray(value) && !isFunction(value) &&
+ !(value instanceof RegExp)) {
+
+ if (!target[prop]) {
+ target[prop] = {};
+ }
+ mixin(target[prop], value, force, deepStringMixin);
+ } else {
+ target[prop] = value;
+ }
+ }
+ });
+ }
+ return target;
+ }
+
+ //Similar to Function.prototype.bind, but the 'this' object is specified
+ //first, since it is easier to read/figure out what 'this' will be.
+ function bind(obj, fn) {
+ return function () {
+ return fn.apply(obj, arguments);
+ };
+ }
+
+ function scripts() {
+ return document.getElementsByTagName('script');
+ }
+
+ function defaultOnError(err) {
+ throw err;
+ }
+
+ //Allow getting a global that is expressed in
+ //dot notation, like 'a.b.c'.
+ function getGlobal(value) {
+ if (!value) {
+ return value;
+ }
+ var g = global;
+ each(value.split('.'), function (part) {
+ g = g[part];
+ });
+ return g;
+ }
+
+ /**
+ * Constructs an error with a pointer to an URL with more information.
+ * @param {String} id the error ID that maps to an ID on a web page.
+ * @param {String} message human readable error.
+ * @param {Error} [err] the original error, if there is one.
+ *
+ * @returns {Error}
+ */
+ function makeError(id, msg, err, requireModules) {
+ var e = new Error(msg + '\nhttp://REQUIREJS.org/docs/errors.html#' + id);
+ e.requireType = id;
+ e.requireModules = requireModules;
+ if (err) {
+ e.originalError = err;
+ }
+ return e;
+ }
+
+ if (typeof DEFINE !== 'undefined') {
+ //If a DEFINE is already in play via another AMD loader,
+ //do not overwrite.
+ return;
+ }
+
+ if (typeof REQUIREJS !== 'undefined') {
+ if (isFunction(REQUIREJS)) {
+ //Do not overwrite an existing REQUIREJS instance.
+ return;
+ }
+ cfg = REQUIREJS;
+ REQUIREJS = undefined;
+ }
+
+ //Allow for a REQUIRE config object
+ if (typeof REQUIRE !== 'undefined' && !isFunction(REQUIRE)) {
+ //assume it is a config object.
+ cfg = REQUIRE;
+ REQUIRE = undefined;
+ }
+
+ function newContext(contextName) {
+ var inCheckLoaded, Module, context, handlers,
+ checkLoadedTimeoutId,
+ config = {
+ //Defaults. Do not set a default for map
+ //config to speed up normalize(), which
+ //will run faster if there is no default.
+ waitSeconds: 60,
+ baseUrl: './',
+ paths: {},
+ bundles: {},
+ pkgs: {},
+ shim: {},
+ config: {}
+ },
+ registry = {},
+ //registry of just enabled modules, to speed
+ //cycle breaking code when lots of modules
+ //are registered, but not activated.
+ enabledRegistry = {},
+ undefEvents = {},
+ defQueue = [],
+ defined = {},
+ urlFetched = {},
+ bundlesMap = {},
+ requireCounter = 1,
+ unnormalizedCounter = 1;
+
+ /**
+ * Trims the . and .. from an array of path segments.
+ * It will keep a leading path segment if a .. will become
+ * the first path segment, to help with module name lookups,
+ * which act like paths, but can be remapped. But the end result,
+ * all paths that use this function should look normalized.
+ * NOTE: this method MODIFIES the input array.
+ * @param {Array} ary the array of path segments.
+ */
+ function trimDots(ary) {
+ var i, part;
+ for (i = 0; i < ary.length; i++) {
+ part = ary[i];
+ if (part === '.') {
+ ary.splice(i, 1);
+ i -= 1;
+ } else if (part === '..') {
+ // If at the start, or previous value is still ..,
+ // keep them so that when converted to a path it may
+ // still work when converted to a path, even though
+ // as an ID it is less than ideal. In larger point
+ // releases, may be better to just kick out an error.
+ if (i === 0 || (i === 1 && ary[2] === '..') || ary[i - 1] === '..') {
+ continue;
+ } else if (i > 0) {
+ ary.splice(i - 1, 2);
+ i -= 2;
+ }
+ }
+ }
+ }
+
+ /**
+ * Given a relative module name, like ./something, normalize it to
+ * a real name that can be mapped to a path.
+ * @param {String} name the relative name
+ * @param {String} baseName a real name that the name arg is relative
+ * to.
+ * @param {Boolean} applyMap apply the map config to the value. Should
+ * only be done if this normalization is for a dependency ID.
+ * @returns {String} normalized name
+ */
+ function normalize(name, baseName, applyMap) {
+ var pkgMain, mapValue, nameParts, i, j, nameSegment, lastIndex,
+ foundMap, foundI, foundStarMap, starI, normalizedBaseParts,
+ baseParts = (baseName && baseName.split('/')),
+ map = config.map,
+ starMap = map && map['*'];
+
+ //Adjust any relative paths.
+ if (name) {
+ name = name.split('/');
+ lastIndex = name.length - 1;
+
+ // If wanting node ID compatibility, strip .js from end
+ // of IDs. Have to do this here, and not in nameToUrl
+ // because node allows either .js or non .js to map
+ // to same file.
+ if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {
+ name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');
+ }
+
+ // Starts with a '.' so need the baseName
+ if (name[0].charAt(0) === '.' && baseParts) {
+ //Convert baseName to array, and lop off the last part,
+ //so that . matches that 'directory' and not name of the baseName's
+ //module. For instance, baseName of 'one/two/three', maps to
+ //'one/two/three.js', but we want the directory, 'one/two' for
+ //this normalization.
+ normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);
+ name = normalizedBaseParts.concat(name);
+ }
+
+ trimDots(name);
+ name = name.join('/');
+ }
+
+ //Apply map config if available.
+ if (applyMap && map && (baseParts || starMap)) {
+ nameParts = name.split('/');
+
+ outerLoop: for (i = nameParts.length; i > 0; i -= 1) {
+ nameSegment = nameParts.slice(0, i).join('/');
+
+ if (baseParts) {
+ //Find the longest baseName segment match in the config.
+ //So, do joins on the biggest to smallest lengths of baseParts.
+ for (j = baseParts.length; j > 0; j -= 1) {
+ mapValue = getOwn(map, baseParts.slice(0, j).join('/'));
+
+ //baseName segment has config, find if it has one for
+ //this name.
+ if (mapValue) {
+ mapValue = getOwn(mapValue, nameSegment);
+ if (mapValue) {
+ //Match, update name to the new value.
+ foundMap = mapValue;
+ foundI = i;
+ break outerLoop;
+ }
+ }
+ }
+ }
+
+ //Check for a star map match, but just hold on to it,
+ //if there is a shorter segment match later in a matching
+ //config, then favor over this star map.
+ if (!foundStarMap && starMap && getOwn(starMap, nameSegment)) {
+ foundStarMap = getOwn(starMap, nameSegment);
+ starI = i;
+ }
+ }
+
+ if (!foundMap && foundStarMap) {
+ foundMap = foundStarMap;
+ foundI = starI;
+ }
+
+ if (foundMap) {
+ nameParts.splice(0, foundI, foundMap);
+ name = nameParts.join('/');
+ }
+ }
+
+ // If the name points to a package's name, use
+ // the package main instead.
+ pkgMain = getOwn(config.pkgs, name);
+
+ return pkgMain ? pkgMain : name;
+ }
+
+ function removeScript(name) {
+ if (isBrowser) {
+ each(scripts(), function (scriptNode) {
+ if (scriptNode.getAttribute('data-requiremodule') === name &&
+ scriptNode.getAttribute('data-requirecontext') === context.contextName) {
+ scriptNode.parentNode.removeChild(scriptNode);
+ return true;
+ }
+ });
+ }
+ }
+
+ function hasPathFallback(id) {
+ var pathConfig = getOwn(config.paths, id);
+ if (pathConfig && isArray(pathConfig) && pathConfig.length > 1) {
+ //Pop off the first array value, since it failed, and
+ //retry
+ pathConfig.shift();
+ context.REQUIRE.undef(id);
+
+ //Custom REQUIRE that does not do map translation, since
+ //ID is "absolute", already mapped/resolved.
+ context.makeRequire(null, {
+ skipMap: true
+ })([id]);
+
+ return true;
+ }
+ }
+
+ //Turns a plugin!resource to [plugin, resource]
+ //with the plugin being undefined if the name
+ //did not have a plugin prefix.
+ function splitPrefix(name) {
+ var prefix,
+ index = name ? name.indexOf('!') : -1;
+ if (index > -1) {
+ prefix = name.substring(0, index);
+ name = name.substring(index + 1, name.length);
+ }
+ return [prefix, name];
+ }
+
+ /**
+ * Creates a module mapping that includes plugin prefix, module
+ * name, and path. If parentModuleMap is provided it will
+ * also normalize the name via REQUIRE.normalize()
+ *
+ * @param {String} name the module name
+ * @param {String} [parentModuleMap] parent module map
+ * for the module name, used to resolve relative names.
+ * @param {Boolean} isNormalized: is the ID already normalized.
+ * This is true if this call is done for a DEFINE() module ID.
+ * @param {Boolean} applyMap: apply the map config to the ID.
+ * Should only be true if this map is for a dependency.
+ *
+ * @returns {Object}
+ */
+ function makeModuleMap(name, parentModuleMap, isNormalized, applyMap) {
+ var url, pluginModule, suffix, nameParts,
+ prefix = null,
+ parentName = parentModuleMap ? parentModuleMap.name : null,
+ originalName = name,
+ isDefine = true,
+ normalizedName = '';
+
+ //If no name, then it means it is a REQUIRE call, generate an
+ //internal name.
+ if (!name) {
+ isDefine = false;
+ name = '_@r' + (requireCounter += 1);
+ }
+
+ nameParts = splitPrefix(name);
+ prefix = nameParts[0];
+ name = nameParts[1];
+
+ if (prefix) {
+ prefix = normalize(prefix, parentName, applyMap);
+ pluginModule = getOwn(defined, prefix);
+ }
+
+ //Account for relative paths if there is a base name.
+ if (name) {
+ if (prefix) {
+ if (isNormalized) {
+ normalizedName = name;
+ } else if (pluginModule && pluginModule.normalize) {
+ //Plugin is loaded, use its normalize method.
+ normalizedName = pluginModule.normalize(name, function (name) {
+ return normalize(name, parentName, applyMap);
+ });
+ } else {
+ // If nested plugin references, then do not try to
+ // normalize, as it will not normalize correctly. This
+ // places a restriction on resourceIds, and the longer
+ // term solution is not to normalize until plugins are
+ // loaded and all normalizations to allow for async
+ // loading of a loader plugin. But for now, fixes the
+ // common uses. Details in #1131
+ normalizedName = name.indexOf('!') === -1 ?
+ normalize(name, parentName, applyMap) :
+ name;
+ }
+ } else {
+ //A regular module.
+ normalizedName = normalize(name, parentName, applyMap);
+
+ //Normalized name may be a plugin ID due to map config
+ //application in normalize. The map config values must
+ //already be normalized, so do not need to redo that part.
+ nameParts = splitPrefix(normalizedName);
+ prefix = nameParts[0];
+ normalizedName = nameParts[1];
+ isNormalized = true;
+
+ url = context.nameToUrl(normalizedName);
+ }
+ }
+
+ //If the id is a plugin id that cannot be determined if it needs
+ //normalization, stamp it with a unique ID so two matching relative
+ //ids that may conflict can be separate.
+ suffix = prefix && !pluginModule && !isNormalized ?
+ '_unnormalized' + (unnormalizedCounter += 1) :
+ '';
+
+ return {
+ prefix: prefix,
+ name: normalizedName,
+ parentMap: parentModuleMap,
+ unnormalized: !!suffix,
+ url: url,
+ originalName: originalName,
+ isDefine: isDefine,
+ id: (prefix ?
+ prefix + '!' + normalizedName :
+ normalizedName) + suffix
+ };
+ }
+
+ function getModule(depMap) {
+ var id = depMap.id,
+ mod = getOwn(registry, id);
+
+ if (!mod) {
+ mod = registry[id] = new context.Module(depMap);
+ }
+
+ return mod;
+ }
+
+ function on(depMap, name, fn) {
+ var id = depMap.id,
+ mod = getOwn(registry, id);
+
+ if (hasProp(defined, id) &&
+ (!mod || mod.defineEmitComplete)) {
+ if (name === 'defined') {
+ fn(defined[id]);
+ }
+ } else {
+ mod = getModule(depMap);
+ if (mod.error && name === 'error') {
+ fn(mod.error);
+ } else {
+ mod.on(name, fn);
+ }
+ }
+ }
+
+ function onError(err, errback) {
+ var ids = err.requireModules,
+ notified = false;
+
+ if (errback) {
+ errback(err);
+ } else {
+ each(ids, function (id) {
+ var mod = getOwn(registry, id);
+ if (mod) {
+ //Set error on module, so it skips timeout checks.
+ mod.error = err;
+ if (mod.events.error) {
+ notified = true;
+ mod.emit('error', err);
+ }
+ }
+ });
+
+ if (!notified) {
+ req.onError(err);
+ }
+ }
+ }
+
+ /**
+ * Internal method to transfer globalQueue items to this context's
+ * defQueue.
+ */
+ function takeGlobalQueue() {
+ //Push all the globalDefQueue items into the context's defQueue
+ if (globalDefQueue.length) {
+ each(globalDefQueue, function(queueItem) {
+ var id = queueItem[0];
+ if (typeof id === 'string') {
+ context.defQueueMap[id] = true;
+ }
+ defQueue.push(queueItem);
+ });
+ globalDefQueue = [];
+ }
+ }
+
+ handlers = {
+ 'REQUIRE': function (mod) {
+ if (mod.REQUIRE) {
+ return mod.REQUIRE;
+ } else {
+ return (mod.REQUIRE = context.makeRequire(mod.map));
+ }
+ },
+ 'exports': function (mod) {
+ mod.usingExports = true;
+ if (mod.map.isDefine) {
+ if (mod.exports) {
+ return (defined[mod.map.id] = mod.exports);
+ } else {
+ return (mod.exports = defined[mod.map.id] = {});
+ }
+ }
+ },
+ 'module': function (mod) {
+ if (mod.module) {
+ return mod.module;
+ } else {
+ return (mod.module = {
+ id: mod.map.id,
+ uri: mod.map.url,
+ config: function () {
+ return getOwn(config.config, mod.map.id) || {};
+ },
+ exports: mod.exports || (mod.exports = {})
+ });
+ }
+ }
+ };
+
+ function cleanRegistry(id) {
+ //Clean up machinery used for waiting modules.
+ delete registry[id];
+ delete enabledRegistry[id];
+ }
+
+ function breakCycle(mod, traced, processed) {
+ var id = mod.map.id;
+
+ if (mod.error) {
+ mod.emit('error', mod.error);
+ } else {
+ traced[id] = true;
+ each(mod.depMaps, function (depMap, i) {
+ var depId = depMap.id,
+ dep = getOwn(registry, depId);
+
+ //Only force things that have not completed
+ //being defined, so still in the registry,
+ //and only if it has not been matched up
+ //in the module already.
+ if (dep && !mod.depMatched[i] && !processed[depId]) {
+ if (getOwn(traced, depId)) {
+ mod.defineDep(i, defined[depId]);
+ mod.check(); //pass false?
+ } else {
+ breakCycle(dep, traced, processed);
+ }
+ }
+ });
+ processed[id] = true;
+ }
+ }
+
+ function checkLoaded() {
+ var err, usingPathFallback,
+ waitInterval = config.waitSeconds * 1000,
+ //It is possible to disable the wait interval by using waitSeconds of 0.
+ expired = waitInterval && (context.startTime + waitInterval) < new Date().getTime(),
+ noLoads = [],
+ reqCalls = [],
+ stillLoading = false,
+ needCycleCheck = true;
+
+ //Do not bother if this call was a result of a cycle break.
+ if (inCheckLoaded) {
+ return;
+ }
+
+ inCheckLoaded = true;
+
+ //Figure out the state of all the modules.
+ eachProp(enabledRegistry, function (mod) {
+ var map = mod.map,
+ modId = map.id;
+
+ //Skip things that are not enabled or in error state.
+ if (!mod.enabled) {
+ return;
+ }
+
+ if (!map.isDefine) {
+ reqCalls.push(mod);
+ }
+
+ if (!mod.error) {
+ //If the module should be executed, and it has not
+ //been inited and time is up, remember it.
+ if (!mod.inited && expired) {
+ if (hasPathFallback(modId)) {
+ usingPathFallback = true;
+ stillLoading = true;
+ } else {
+ noLoads.push(modId);
+ removeScript(modId);
+ }
+ } else if (!mod.inited && mod.fetched && map.isDefine) {
+ stillLoading = true;
+ if (!map.prefix) {
+ //No reason to keep looking for unfinished
+ //loading. If the only stillLoading is a
+ //plugin resource though, keep going,
+ //because it may be that a plugin resource
+ //is waiting on a non-plugin cycle.
+ return (needCycleCheck = false);
+ }
+ }
+ }
+ });
+
+ if (expired && noLoads.length) {
+ //If wait time expired, throw error of unloaded modules.
+ err = makeError('timeout', 'Load timeout for modules: ' + noLoads, null, noLoads);
+ err.contextName = context.contextName;
+ return onError(err);
+ }
+
+ //Not expired, check for a cycle.
+ if (needCycleCheck) {
+ each(reqCalls, function (mod) {
+ breakCycle(mod, {}, {});
+ });
+ }
+
+ //If still waiting on loads, and the waiting load is something
+ //other than a plugin resource, or there are still outstanding
+ //scripts, then just try back later.
+ if ((!expired || usingPathFallback) && stillLoading) {
+ //Something is still waiting to load. Wait for it, but only
+ //if a timeout is not already in effect.
+ if ((isBrowser || isWebWorker) && !checkLoadedTimeoutId) {
+ checkLoadedTimeoutId = setTimeout(function () {
+ checkLoadedTimeoutId = 0;
+ checkLoaded();
+ }, 50);
+ }
+ }
+
+ inCheckLoaded = false;
+ }
+
+ Module = function (map) {
+ this.events = getOwn(undefEvents, map.id) || {};
+ this.map = map;
+ this.shim = getOwn(config.shim, map.id);
+ this.depExports = [];
+ this.depMaps = [];
+ this.depMatched = [];
+ this.pluginMaps = {};
+ this.depCount = 0;
+
+ /* this.exports this.factory
+ this.depMaps = [],
+ this.enabled, this.fetched
+ */
+ };
+
+ Module.prototype = {
+ init: function (depMaps, factory, errback, options) {
+ options = options || {};
+
+ //Do not do more inits if already done. Can happen if there
+ //are multiple DEFINE calls for the same module. That is not
+ //a normal, common case, but it is also not unexpected.
+ if (this.inited) {
+ return;
+ }
+
+ this.factory = factory;
+
+ if (errback) {
+ //Register for errors on this module.
+ this.on('error', errback);
+ } else if (this.events.error) {
+ //If no errback already, but there are error listeners
+ //on this module, set up an errback to pass to the deps.
+ errback = bind(this, function (err) {
+ this.emit('error', err);
+ });
+ }
+
+ //Do a copy of the dependency array, so that
+ //source inputs are not modified. For example
+ //"shim" deps are passed in here directly, and
+ //doing a direct modification of the depMaps array
+ //would affect that config.
+ this.depMaps = depMaps && depMaps.slice(0);
+
+ this.errback = errback;
+
+ //Indicate this module has be initialized
+ this.inited = true;
+
+ this.ignore = options.ignore;
+
+ //Could have option to init this module in enabled mode,
+ //or could have been previously marked as enabled. However,
+ //the dependencies are not known until init is called. So
+ //if enabled previously, now trigger dependencies as enabled.
+ if (options.enabled || this.enabled) {
+ //Enable this module and dependencies.
+ //Will call this.check()
+ this.enable();
+ } else {
+ this.check();
+ }
+ },
+
+ defineDep: function (i, depExports) {
+ //Because of cycles, defined callback for a given
+ //export can be called more than once.
+ if (!this.depMatched[i]) {
+ this.depMatched[i] = true;
+ this.depCount -= 1;
+ this.depExports[i] = depExports;
+ }
+ },
+
+ fetch: function () {
+ if (this.fetched) {
+ return;
+ }
+ this.fetched = true;
+
+ context.startTime = (new Date()).getTime();
+
+ var map = this.map;
+
+ //If the manager is for a plugin managed resource,
+ //ask the plugin to load it now.
+ if (this.shim) {
+ context.makeRequire(this.map, {
+ enableBuildCallback: true
+ })(this.shim.deps || [], bind(this, function () {
+ return map.prefix ? this.callPlugin() : this.load();
+ }));
+ } else {
+ //Regular dependency.
+ return map.prefix ? this.callPlugin() : this.load();
+ }
+ },
+
+ load: function () {
+ var url = this.map.url;
+
+ //Regular dependency.
+ if (!urlFetched[url]) {
+ urlFetched[url] = true;
+ context.load(this.map.id, url);
+ }
+ },
+
+ /**
+ * Checks if the module is ready to DEFINE itself, and if so,
+ * DEFINE it.
+ */
+ check: function () {
+ if (!this.enabled || this.enabling) {
+ return;
+ }
+
+ var err, cjsModule,
+ id = this.map.id,
+ depExports = this.depExports,
+ exports = this.exports,
+ factory = this.factory;
+
+ if (!this.inited) {
+ // Only fetch if not already in the defQueue.
+ if (!hasProp(context.defQueueMap, id)) {
+ this.fetch();
+ }
+ } else if (this.error) {
+ this.emit('error', this.error);
+ } else if (!this.defining) {
+ //The factory could trigger another REQUIRE call
+ //that would result in checking this module to
+ //DEFINE itself again. If already in the process
+ //of doing that, skip this work.
+ this.defining = true;
+
+ if (this.depCount < 1 && !this.defined) {
+ if (isFunction(factory)) {
+ //If there is an error listener, favor passing
+ //to that instead of throwing an error. However,
+ //only do it for DEFINE()'d modules. REQUIRE
+ //errbacks should not be called for failures in
+ //their callbacks (#699). However if a global
+ //onError is set, use that.
+ if ((this.events.error && this.map.isDefine) ||
+ req.onError !== defaultOnError) {
+ try {
+ exports = context.execCb(id, factory, depExports, exports);
+ } catch (e) {
+ err = e;
+ }
+ } else {
+ exports = context.execCb(id, factory, depExports, exports);
+ }
+
+ // Favor return value over exports. If node/cjs in play,
+ // then will not have a return value anyway. Favor
+ // module.exports assignment over exports object.
+ if (this.map.isDefine && exports === undefined) {
+ cjsModule = this.module;
+ if (cjsModule) {
+ exports = cjsModule.exports;
+ } else if (this.usingExports) {
+ //exports already set the defined value.
+ exports = this.exports;
+ }
+ }
+
+ if (err) {
+ err.requireMap = this.map;
+ err.requireModules = this.map.isDefine ? [this.map.id] : null;
+ err.requireType = this.map.isDefine ? 'DEFINE' : 'REQUIRE';
+ return onError((this.error = err));
+ }
+
+ } else {
+ //Just a literal value
+ exports = factory;
+ }
+
+ this.exports = exports;
+
+ if (this.map.isDefine && !this.ignore) {
+ defined[id] = exports;
+
+ if (req.onResourceLoad) {
+ var resLoadMaps = [];
+ each(this.depMaps, function (depMap) {
+ resLoadMaps.push(depMap.normalizedMap || depMap);
+ });
+ req.onResourceLoad(context, this.map, resLoadMaps);
+ }
+ }
+
+ //Clean up
+ cleanRegistry(id);
+
+ this.defined = true;
+ }
+
+ //Finished the DEFINE stage. Allow calling check again
+ //to allow DEFINE notifications below in the case of a
+ //cycle.
+ this.defining = false;
+
+ if (this.defined && !this.defineEmitted) {
+ this.defineEmitted = true;
+ this.emit('defined', this.exports);
+ this.defineEmitComplete = true;
+ }
+
+ }
+ },
+
+ callPlugin: function () {
+ var map = this.map,
+ id = map.id,
+ //Map already normalized the prefix.
+ pluginMap = makeModuleMap(map.prefix);
+
+ //Mark this as a dependency for this plugin, so it
+ //can be traced for cycles.
+ this.depMaps.push(pluginMap);
+
+ on(pluginMap, 'defined', bind(this, function (plugin) {
+ var load, normalizedMap, normalizedMod,
+ bundleId = getOwn(bundlesMap, this.map.id),
+ name = this.map.name,
+ parentName = this.map.parentMap ? this.map.parentMap.name : null,
+ localRequire = context.makeRequire(map.parentMap, {
+ enableBuildCallback: true
+ });
+
+ //If current map is not normalized, wait for that
+ //normalized name to load instead of continuing.
+ if (this.map.unnormalized) {
+ //Normalize the ID if the plugin allows it.
+ if (plugin.normalize) {
+ name = plugin.normalize(name, function (name) {
+ return normalize(name, parentName, true);
+ }) || '';
+ }
+
+ //prefix and name should already be normalized, no need
+ //for applying map config again either.
+ normalizedMap = makeModuleMap(map.prefix + '!' + name,
+ this.map.parentMap,
+ true);
+ on(normalizedMap,
+ 'defined', bind(this, function (value) {
+ this.map.normalizedMap = normalizedMap;
+ this.init([], function () { return value; }, null, {
+ enabled: true,
+ ignore: true
+ });
+ }));
+
+ normalizedMod = getOwn(registry, normalizedMap.id);
+ if (normalizedMod) {
+ //Mark this as a dependency for this plugin, so it
+ //can be traced for cycles.
+ this.depMaps.push(normalizedMap);
+
+ if (this.events.error) {
+ normalizedMod.on('error', bind(this, function (err) {
+ this.emit('error', err);
+ }));
+ }
+ normalizedMod.enable();
+ }
+
+ return;
+ }
+
+ //If a paths config, then just load that file instead to
+ //resolve the plugin, as it is built into that paths layer.
+ if (bundleId) {
+ this.map.url = context.nameToUrl(bundleId);
+ this.load();
+ return;
+ }
+
+ load = bind(this, function (value) {
+ this.init([], function () { return value; }, null, {
+ enabled: true
+ });
+ });
+
+ load.error = bind(this, function (err) {
+ this.inited = true;
+ this.error = err;
+ err.requireModules = [id];
+
+ //Remove temp unnormalized modules for this module,
+ //since they will never be resolved otherwise now.
+ eachProp(registry, function (mod) {
+ if (mod.map.id.indexOf(id + '_unnormalized') === 0) {
+ cleanRegistry(mod.map.id);
+ }
+ });
+
+ onError(err);
+ });
+
+ //Allow plugins to load other code without having to know the
+ //context or how to 'complete' the load.
+ load.fromText = bind(this, function (text, textAlt) {
+ /*jslint evil: true */
+ var moduleName = map.name,
+ moduleMap = makeModuleMap(moduleName),
+ hasInteractive = useInteractive;
+
+ //As of 2.1.0, support just passing the text, to reinforce
+ //fromText only being called once per resource. Still
+ //support old style of passing moduleName but discard
+ //that moduleName in favor of the internal ref.
+ if (textAlt) {
+ text = textAlt;
+ }
+
+ //Turn off interactive script matching for IE for any DEFINE
+ //calls in the text, then turn it back on at the end.
+ if (hasInteractive) {
+ useInteractive = false;
+ }
+
+ //Prime the system by creating a module instance for
+ //it.
+ getModule(moduleMap);
+
+ //Transfer any config to this other module.
+ if (hasProp(config.config, id)) {
+ config.config[moduleName] = config.config[id];
+ }
+
+ try {
+ req.exec(text);
+ } catch (e) {
+ return onError(makeError('fromtexteval',
+ 'fromText eval for ' + id +
+ ' failed: ' + e,
+ e,
+ [id]));
+ }
+
+ if (hasInteractive) {
+ useInteractive = true;
+ }
+
+ //Mark this as a dependency for the plugin
+ //resource
+ this.depMaps.push(moduleMap);
+
+ //Support anonymous modules.
+ context.completeLoad(moduleName);
+
+ //Bind the value of that module to the value for this
+ //resource ID.
+ localRequire([moduleName], load);
+ });
+
+ //Use parentName here since the plugin's name is not reliable,
+ //could be some weird string with no path that actually wants to
+ //reference the parentName's path.
+ plugin.load(map.name, localRequire, load, config);
+ }));
+
+ context.enable(pluginMap, this);
+ this.pluginMaps[pluginMap.id] = pluginMap;
+ },
+
+ enable: function () {
+ enabledRegistry[this.map.id] = this;
+ this.enabled = true;
+
+ //Set flag mentioning that the module is enabling,
+ //so that immediate calls to the defined callbacks
+ //for dependencies do not trigger inadvertent load
+ //with the depCount still being zero.
+ this.enabling = true;
+
+ //Enable each dependency
+ each(this.depMaps, bind(this, function (depMap, i) {
+ var id, mod, handler;
+
+ if (typeof depMap === 'string') {
+ //Dependency needs to be converted to a depMap
+ //and wired up to this module.
+ depMap = makeModuleMap(depMap,
+ (this.map.isDefine ? this.map : this.map.parentMap),
+ false,
+ !this.skipMap);
+ this.depMaps[i] = depMap;
+
+ handler = getOwn(handlers, depMap.id);
+
+ if (handler) {
+ this.depExports[i] = handler(this);
+ return;
+ }
+
+ this.depCount += 1;
+
+ on(depMap, 'defined', bind(this, function (depExports) {
+ if (this.undefed) {
+ return;
+ }
+ this.defineDep(i, depExports);
+ this.check();
+ }));
+
+ if (this.errback) {
+ on(depMap, 'error', bind(this, this.errback));
+ } else if (this.events.error) {
+ // No direct errback on this module, but something
+ // else is listening for errors, so be sure to
+ // propagate the error correctly.
+ on(depMap, 'error', bind(this, function(err) {
+ this.emit('error', err);
+ }));
+ }
+ }
+
+ id = depMap.id;
+ mod = registry[id];
+
+ //Skip special modules like 'REQUIRE', 'exports', 'module'
+ //Also, don't call enable if it is already enabled,
+ //important in circular dependency cases.
+ if (!hasProp(handlers, id) && mod && !mod.enabled) {
+ context.enable(depMap, this);
+ }
+ }));
+
+ //Enable each plugin that is used in
+ //a dependency
+ eachProp(this.pluginMaps, bind(this, function (pluginMap) {
+ var mod = getOwn(registry, pluginMap.id);
+ if (mod && !mod.enabled) {
+ context.enable(pluginMap, this);
+ }
+ }));
+
+ this.enabling = false;
+
+ this.check();
+ },
+
+ on: function (name, cb) {
+ var cbs = this.events[name];
+ if (!cbs) {
+ cbs = this.events[name] = [];
+ }
+ cbs.push(cb);
+ },
+
+ emit: function (name, evt) {
+ each(this.events[name], function (cb) {
+ cb(evt);
+ });
+ if (name === 'error') {
+ //Now that the error handler was triggered, remove
+ //the listeners, since this broken Module instance
+ //can stay around for a while in the registry.
+ delete this.events[name];
+ }
+ }
+ };
+
+ function callGetModule(args) {
+ //Skip modules already defined.
+ if (!hasProp(defined, args[0])) {
+ getModule(makeModuleMap(args[0], null, true)).init(args[1], args[2]);
+ }
+ }
+
+ function removeListener(node, func, name, ieName) {
+ //Favor detachEvent because of IE9
+ //issue, see attachEvent/addEventListener comment elsewhere
+ //in this file.
+ if (node.detachEvent && !isOpera) {
+ //Probably IE. If not it will throw an error, which will be
+ //useful to know.
+ if (ieName) {
+ node.detachEvent(ieName, func);
+ }
+ } else {
+ node.removeEventListener(name, func, false);
+ }
+ }
+
+ /**
+ * Given an event from a script node, get the REQUIREJS info from it,
+ * and then removes the event listeners on the node.
+ * @param {Event} evt
+ * @returns {Object}
+ */
+ function getScriptData(evt) {
+ //Using currentTarget instead of target for Firefox 2.0's sake. Not
+ //all old browsers will be supported, but this one was easy enough
+ //to support and still makes sense.
+ var node = evt.currentTarget || evt.srcElement;
+
+ //Remove the listeners once here.
+ removeListener(node, context.onScriptLoad, 'load', 'onreadystatechange');
+ removeListener(node, context.onScriptError, 'error');
+
+ return {
+ node: node,
+ id: node && node.getAttribute('data-requiremodule')
+ };
+ }
+
+ function intakeDefines() {
+ var args;
+
+ //Any defined modules in the global queue, intake them now.
+ takeGlobalQueue();
+
+ //Make sure any remaining defQueue items get properly processed.
+ while (defQueue.length) {
+ args = defQueue.shift();
+ if (args[0] === null) {
+ return onError(makeError('mismatch', 'Mismatched anonymous DEFINE() module: ' +
+ args[args.length - 1]));
+ } else {
+ //args are id, deps, factory. Should be normalized by the
+ //DEFINE() function.
+ callGetModule(args);
+ }
+ }
+ context.defQueueMap = {};
+ }
+
+ context = {
+ config: config,
+ contextName: contextName,
+ registry: registry,
+ defined: defined,
+ urlFetched: urlFetched,
+ defQueue: defQueue,
+ defQueueMap: {},
+ Module: Module,
+ makeModuleMap: makeModuleMap,
+ nextTick: req.nextTick,
+ onError: onError,
+
+ /**
+ * Set a configuration for the context.
+ * @param {Object} cfg config object to integrate.
+ */
+ configure: function (cfg) {
+ //Make sure the baseUrl ends in a slash.
+ if (cfg.baseUrl) {
+ if (cfg.baseUrl.charAt(cfg.baseUrl.length - 1) !== '/') {
+ cfg.baseUrl += '/';
+ }
+ }
+
+ // Convert old style urlArgs string to a function.
+ if (typeof cfg.urlArgs === 'string') {
+ var urlArgs = cfg.urlArgs;
+ cfg.urlArgs = function(id, url) {
+ return (url.indexOf('?') === -1 ? '?' : '&') + urlArgs;
+ };
+ }
+
+ //Save off the paths since they REQUIRE special processing,
+ //they are additive.
+ var shim = config.shim,
+ objs = {
+ paths: true,
+ bundles: true,
+ config: true,
+ map: true
+ };
+
+ eachProp(cfg, function (value, prop) {
+ if (objs[prop]) {
+ if (!config[prop]) {
+ config[prop] = {};
+ }
+ mixin(config[prop], value, true, true);
+ } else {
+ config[prop] = value;
+ }
+ });
+
+ //Reverse map the bundles
+ if (cfg.bundles) {
+ eachProp(cfg.bundles, function (value, prop) {
+ each(value, function (v) {
+ if (v !== prop) {
+ bundlesMap[v] = prop;
+ }
+ });
+ });
+ }
+
+ //Merge shim
+ if (cfg.shim) {
+ eachProp(cfg.shim, function (value, id) {
+ //Normalize the structure
+ if (isArray(value)) {
+ value = {
+ deps: value
+ };
+ }
+ if ((value.exports || value.init) && !value.exportsFn) {
+ value.exportsFn = context.makeShimExports(value);
+ }
+ shim[id] = value;
+ });
+ config.shim = shim;
+ }
+
+ //Adjust packages if necessary.
+ if (cfg.packages) {
+ each(cfg.packages, function (pkgObj) {
+ var location, name;
+
+ pkgObj = typeof pkgObj === 'string' ? {name: pkgObj} : pkgObj;
+
+ name = pkgObj.name;
+ location = pkgObj.location;
+ if (location) {
+ config.paths[name] = pkgObj.location;
+ }
+
+ //Save pointer to main module ID for pkg name.
+ //Remove leading dot in main, so main paths are normalized,
+ //and remove any trailing .js, since different package
+ //envs have different conventions: some use a module name,
+ //some use a file name.
+ config.pkgs[name] = pkgObj.name + '/' + (pkgObj.main || 'main')
+ .replace(currDirRegExp, '')
+ .replace(jsSuffixRegExp, '');
+ });
+ }
+
+ //If there are any "waiting to execute" modules in the registry,
+ //update the maps for them, since their info, like URLs to load,
+ //may have changed.
+ eachProp(registry, function (mod, id) {
+ //If module already has init called, since it is too
+ //late to modify them, and ignore unnormalized ones
+ //since they are transient.
+ if (!mod.inited && !mod.map.unnormalized) {
+ mod.map = makeModuleMap(id, null, true);
+ }
+ });
+
+ //If a deps array or a config callback is specified, then call
+ //REQUIRE with those args. This is useful when REQUIRE is defined as a
+ //config object before REQUIRE.js is loaded.
+ if (cfg.deps || cfg.callback) {
+ context.REQUIRE(cfg.deps || [], cfg.callback);
+ }
+ },
+
+ makeShimExports: function (value) {
+ function fn() {
+ var ret;
+ if (value.init) {
+ ret = value.init.apply(global, arguments);
+ }
+ return ret || (value.exports && getGlobal(value.exports));
+ }
+ return fn;
+ },
+
+ makeRequire: function (relMap, options) {
+ options = options || {};
+
+ function localRequire(deps, callback, errback) {
+ var id, map, requireMod;
+
+ if (options.enableBuildCallback && callback && isFunction(callback)) {
+ callback.__requireJsBuild = true;
+ }
+
+ if (typeof deps === 'string') {
+ if (isFunction(callback)) {
+ //Invalid call
+ return onError(makeError('requireargs', 'Invalid REQUIRE call'), errback);
+ }
+
+ //If REQUIRE|exports|module are requested, get the
+ //value for them from the special handlers. Caveat:
+ //this only works while module is being defined.
+ if (relMap && hasProp(handlers, deps)) {
+ return handlers[deps](registry[relMap.id]);
+ }
+
+ //Synchronous access to one module. If REQUIRE.get is
+ //available (as in the Node adapter), prefer that.
+ if (req.get) {
+ return req.get(context, deps, relMap, localRequire);
+ }
+
+ //Normalize module name, if it contains . or ..
+ map = makeModuleMap(deps, relMap, false, true);
+ id = map.id;
+
+ if (!hasProp(defined, id)) {
+ return onError(makeError('notloaded', 'Module name "' +
+ id +
+ '" has not been loaded yet for context: ' +
+ contextName +
+ (relMap ? '' : '. Use REQUIRE([])')));
+ }
+ return defined[id];
+ }
+
+ //Grab defines waiting in the global queue.
+ intakeDefines();
+
+ //Mark all the dependencies as needing to be loaded.
+ context.nextTick(function () {
+ //Some defines could have been added since the
+ //REQUIRE call, collect them.
+ intakeDefines();
+
+ requireMod = getModule(makeModuleMap(null, relMap));
+
+ //Store if map config should be applied to this REQUIRE
+ //call for dependencies.
+ requireMod.skipMap = options.skipMap;
+
+ requireMod.init(deps, callback, errback, {
+ enabled: true
+ });
+
+ checkLoaded();
+ });
+
+ return localRequire;
+ }
+
+ mixin(localRequire, {
+ isBrowser: isBrowser,
+
+ /**
+ * Converts a module name + .extension into an URL path.
+ * *Requires* the use of a module name. It does not support using
+ * plain URLs like nameToUrl.
+ */
+ toUrl: function (moduleNamePlusExt) {
+ var ext,
+ index = moduleNamePlusExt.lastIndexOf('.'),
+ segment = moduleNamePlusExt.split('/')[0],
+ isRelative = segment === '.' || segment === '..';
+
+ //Have a file extension alias, and it is not the
+ //dots from a relative path.
+ if (index !== -1 && (!isRelative || index > 1)) {
+ ext = moduleNamePlusExt.substring(index, moduleNamePlusExt.length);
+ moduleNamePlusExt = moduleNamePlusExt.substring(0, index);
+ }
+
+ return context.nameToUrl(normalize(moduleNamePlusExt,
+ relMap && relMap.id, true), ext, true);
+ },
+
+ defined: function (id) {
+ return hasProp(defined, makeModuleMap(id, relMap, false, true).id);
+ },
+
+ specified: function (id) {
+ id = makeModuleMap(id, relMap, false, true).id;
+ return hasProp(defined, id) || hasProp(registry, id);
+ }
+ });
+
+ //Only allow undef on top level REQUIRE calls
+ if (!relMap) {
+ localRequire.undef = function (id) {
+ //Bind any waiting DEFINE() calls to this context,
+ //fix for #408
+ takeGlobalQueue();
+
+ var map = makeModuleMap(id, relMap, true),
+ mod = getOwn(registry, id);
+
+ mod.undefed = true;
+ removeScript(id);
+
+ delete defined[id];
+ delete urlFetched[map.url];
+ delete undefEvents[id];
+
+ //Clean queued defines too. Go backwards
+ //in array so that the splices do not
+ //mess up the iteration.
+ eachReverse(defQueue, function(args, i) {
+ if (args[0] === id) {
+ defQueue.splice(i, 1);
+ }
+ });
+ delete context.defQueueMap[id];
+
+ if (mod) {
+ //Hold on to listeners in case the
+ //module will be attempted to be reloaded
+ //using a different config.
+ if (mod.events.defined) {
+ undefEvents[id] = mod.events;
+ }
+
+ cleanRegistry(id);
+ }
+ };
+ }
+
+ return localRequire;
+ },
+
+ /**
+ * Called to enable a module if it is still in the registry
+ * awaiting enablement. A second arg, parent, the parent module,
+ * is passed in for context, when this method is overridden by
+ * the optimizer. Not shown here to keep code compact.
+ */
+ enable: function (depMap) {
+ var mod = getOwn(registry, depMap.id);
+ if (mod) {
+ getModule(depMap).enable();
+ }
+ },
+
+ /**
+ * Internal method used by environment adapters to complete a load event.
+ * A load event could be a script load or just a load pass from a synchronous
+ * load call.
+ * @param {String} moduleName the name of the module to potentially complete.
+ */
+ completeLoad: function (moduleName) {
+ var found, args, mod,
+ shim = getOwn(config.shim, moduleName) || {},
+ shExports = shim.exports;
+
+ takeGlobalQueue();
+
+ while (defQueue.length) {
+ args = defQueue.shift();
+ if (args[0] === null) {
+ args[0] = moduleName;
+ //If already found an anonymous module and bound it
+ //to this name, then this is some other anon module
+ //waiting for its completeLoad to fire.
+ if (found) {
+ break;
+ }
+ found = true;
+ } else if (args[0] === moduleName) {
+ //Found matching DEFINE call for this script!
+ found = true;
+ }
+
+ callGetModule(args);
+ }
+ context.defQueueMap = {};
+
+ //Do this after the cycle of callGetModule in case the result
+ //of those calls/init calls changes the registry.
+ mod = getOwn(registry, moduleName);
+
+ if (!found && !hasProp(defined, moduleName) && mod && !mod.inited) {
+ if (config.enforceDefine && (!shExports || !getGlobal(shExports))) {
+ if (hasPathFallback(moduleName)) {
+ return;
+ } else {
+ return onError(makeError('nodefine',
+ 'No DEFINE call for ' + moduleName,
+ null,
+ [moduleName]));
+ }
+ } else {
+ //A script that does not call DEFINE(), so just simulate
+ //the call for it.
+ callGetModule([moduleName, (shim.deps || []), shim.exportsFn]);
+ }
+ }
+
+ checkLoaded();
+ },
+
+ /**
+ * Converts a module name to a file path. Supports cases where
+ * moduleName may actually be just an URL.
+ * Note that it **does not** call normalize on the moduleName,
+ * it is assumed to have already been normalized. This is an
+ * internal API, not a public one. Use toUrl for the public API.
+ */
+ nameToUrl: function (moduleName, ext, skipExt) {
+ var paths, syms, i, parentModule, url,
+ parentPath, bundleId,
+ pkgMain = getOwn(config.pkgs, moduleName);
+
+ if (pkgMain) {
+ moduleName = pkgMain;
+ }
+
+ bundleId = getOwn(bundlesMap, moduleName);
+
+ if (bundleId) {
+ return context.nameToUrl(bundleId, ext, skipExt);
+ }
+
+ //If a colon is in the URL, it indicates a protocol is used and it is just
+ //an URL to a file, or if it starts with a slash, contains a query arg (i.e. ?)
+ //or ends with .js, then assume the user meant to use an url and not a module id.
+ //The slash is important for protocol-less URLs as well as full paths.
+ if (req.jsExtRegExp.test(moduleName)) {
+ //Just a plain path, not module name lookup, so just return it.
+ //Add extension if it is included. This is a bit wonky, only non-.js things pass
+ //an extension, this method probably needs to be reworked.
+ url = moduleName + (ext || '');
+ } else {
+ //A module that needs to be converted to a path.
+ paths = config.paths;
+
+ syms = moduleName.split('/');
+ //For each module name segment, see if there is a path
+ //registered for it. Start with most specific name
+ //and work up from it.
+ for (i = syms.length; i > 0; i -= 1) {
+ parentModule = syms.slice(0, i).join('/');
+
+ parentPath = getOwn(paths, parentModule);
+ if (parentPath) {
+ //If an array, it means there are a few choices,
+ //Choose the one that is desired
+ if (isArray(parentPath)) {
+ parentPath = parentPath[0];
+ }
+ syms.splice(0, i, parentPath);
+ break;
+ }
+ }
+
+ //Join the path parts together, then figure out if baseUrl is needed.
+ url = syms.join('/');
+ url += (ext || (/^data\:|^blob\:|\?/.test(url) || skipExt ? '' : '.js'));
+ url = (url.charAt(0) === '/' || url.match(/^[\w\+\.\-]+:/) ? '' : config.baseUrl) + url;
+ }
+
+ return config.urlArgs && !/^blob\:/.test(url) ?
+ url + config.urlArgs(moduleName, url) : url;
+ },
+
+ //Delegates to req.load. Broken out as a separate function to
+ //allow overriding in the optimizer.
+ load: function (id, url) {
+ req.load(context, id, url);
+ },
+
+ /**
+ * Executes a module callback function. Broken out as a separate function
+ * solely to allow the build system to sequence the files in the built
+ * layer in the right sequence.
+ *
+ * @private
+ */
+ execCb: function (name, callback, args, exports) {
+ return callback.apply(exports, args);
+ },
+
+ /**
+ * callback for script loads, used to check status of loading.
+ *
+ * @param {Event} evt the event from the browser for the script
+ * that was loaded.
+ */
+ onScriptLoad: function (evt) {
+ //Using currentTarget instead of target for Firefox 2.0's sake. Not
+ //all old browsers will be supported, but this one was easy enough
+ //to support and still makes sense.
+ if (evt.type === 'load' ||
+ (readyRegExp.test((evt.currentTarget || evt.srcElement).readyState))) {
+ //Reset interactive script so a script node is not held onto for
+ //to long.
+ interactiveScript = null;
+
+ //Pull out the name of the module and the context.
+ var data = getScriptData(evt);
+ context.completeLoad(data.id);
+ }
+ },
+
+ /**
+ * Callback for script errors.
+ */
+ onScriptError: function (evt) {
+ var data = getScriptData(evt);
+ if (!hasPathFallback(data.id)) {
+ var parents = [];
+ eachProp(registry, function(value, key) {
+ if (key.indexOf('_@r') !== 0) {
+ each(value.depMaps, function(depMap) {
+ if (depMap.id === data.id) {
+ parents.push(key);
+ return true;
+ }
+ });
+ }
+ });
+ return onError(makeError('scripterror', 'Script error for "' + data.id +
+ (parents.length ?
+ '", needed by: ' + parents.join(', ') :
+ '"'), evt, [data.id]));
+ }
+ }
+ };
+
+ context.REQUIRE = context.makeRequire();
+ return context;
+ }
+
+ /**
+ * Main entry point.
+ *
+ * If the only argument to REQUIRE is a string, then the module that
+ * is represented by that string is fetched for the appropriate context.
+ *
+ * If the first argument is an array, then it will be treated as an array
+ * of dependency string names to fetch. An optional function callback can
+ * be specified to execute when all of those dependencies are available.
+ *
+ * Make a local req variable to help Caja compliance (it assumes things
+ * on a REQUIRE that are not standardized), and to give a short
+ * name for minification/local scope use.
+ */
+ req = REQUIREJS = function (deps, callback, errback, optional) {
+
+ //Find the right context, use default
+ var context, config,
+ contextName = defContextName;
+
+ // Determine if have config object in the call.
+ if (!isArray(deps) && typeof deps !== 'string') {
+ // deps is a config object
+ config = deps;
+ if (isArray(callback)) {
+ // Adjust args if there are dependencies
+ deps = callback;
+ callback = errback;
+ errback = optional;
+ } else {
+ deps = [];
+ }
+ }
+
+ if (config && config.context) {
+ contextName = config.context;
+ }
+
+ context = getOwn(contexts, contextName);
+ if (!context) {
+ context = contexts[contextName] = req.s.newContext(contextName);
+ }
+
+ if (config) {
+ context.configure(config);
+ }
+
+ return context.REQUIRE(deps, callback, errback);
+ };
+
+ /**
+ * Support REQUIRE.config() to make it easier to cooperate with other
+ * AMD loaders on globally agreed names.
+ */
+ req.config = function (config) {
+ return req(config);
+ };
+
+ /**
+ * Execute something after the current tick
+ * of the event loop. Override for other envs
+ * that have a better solution than setTimeout.
+ * @param {Function} fn function to execute later.
+ */
+ req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) {
+ setTimeout(fn, 4);
+ } : function (fn) { fn(); };
+
+ /**
+ * Export REQUIRE as a global, but only if it does not already exist.
+ */
+ if (!REQUIRE) {
+ REQUIRE = req;
+ }
+
+ req.version = version;
+
+ //Used to filter out dependencies that are already paths.
+ req.jsExtRegExp = /^\/|:|\?|\.js$/;
+ req.isBrowser = isBrowser;
+ s = req.s = {
+ contexts: contexts,
+ newContext: newContext
+ };
+
+ //Create default context.
+ req({});
+
+ //Exports some context-sensitive methods on global REQUIRE.
+ each([
+ 'toUrl',
+ 'undef',
+ 'defined',
+ 'specified'
+ ], function (prop) {
+ //Reference from contexts instead of early binding to default context,
+ //so that during builds, the latest instance of the default context
+ //with its config gets used.
+ req[prop] = function () {
+ var ctx = contexts[defContextName];
+ return ctx.REQUIRE[prop].apply(ctx, arguments);
+ };
+ });
+
+ if (isBrowser) {
+ head = s.head = document.getElementsByTagName('head')[0];
+ //If BASE tag is in play, using appendChild is a problem for IE6.
+ //When that browser dies, this can be removed. Details in this jQuery bug:
+ //http://dev.jquery.com/ticket/2709
+ baseElement = document.getElementsByTagName('base')[0];
+ if (baseElement) {
+ head = s.head = baseElement.parentNode;
+ }
+ }
+
+ /**
+ * Any errors that REQUIRE explicitly generates will be passed to this
+ * function. Intercept/override it if you want custom error handling.
+ * @param {Error} err the error object.
+ */
+ req.onError = defaultOnError;
+
+ /**
+ * Creates the node for the load command. Only used in browser envs.
+ */
+ req.createNode = function (config, moduleName, url) {
+ var node = config.xhtml ?
+ document.createElementNS('http://www.w3.org/1999/xhtml', 'html:script') :
+ document.createElement('script');
+ node.type = config.scriptType || 'text/javascript';
+ node.charset = 'utf-8';
+ node.async = true;
+ return node;
+ };
+
+ /**
+ * Does the request to load a module for the browser case.
+ * Make this a separate function to allow other environments
+ * to override it.
+ *
+ * @param {Object} context the REQUIRE context to find state.
+ * @param {String} moduleName the name of the module.
+ * @param {Object} url the URL to the module.
+ */
+ req.load = function (context, moduleName, url) {
+ var config = (context && context.config) || {},
+ node;
+ if (isBrowser) {
+ //In the browser so use a script tag
+ node = req.createNode(config, moduleName, url);
+
+ node.setAttribute('data-requirecontext', context.contextName);
+ node.setAttribute('data-requiremodule', moduleName);
+
+ //Set up load listener. Test attachEvent first because IE9 has
+ //a subtle issue in its addEventListener and script onload firings
+ //that do not match the behavior of all other browsers with
+ //addEventListener support, which fire the onload event for a
+ //script right after the script execution. See:
+ //https://connect.microsoft.com/IE/feedback/details/648057/script-onload-event-is-not-fired-immediately-after-script-execution
+ //UNFORTUNATELY Opera implements attachEvent but does not follow the script
+ //script execution mode.
+ if (node.attachEvent &&
+ //Check if node.attachEvent is artificially added by custom script or
+ //natively supported by browser
+ //read https://github.com/REQUIREJS/REQUIREJS/issues/187
+ //if we can NOT find [native code] then it must NOT natively supported.
+ //in IE8, node.attachEvent does not have toString()
+ //Note the test for "[native code" with no closing brace, see:
+ //https://github.com/REQUIREJS/REQUIREJS/issues/273
+ !(node.attachEvent.toString && node.attachEvent.toString().indexOf('[native code') < 0) &&
+ !isOpera) {
+ //Probably IE. IE (at least 6-8) do not fire
+ //script onload right after executing the script, so
+ //we cannot tie the anonymous DEFINE call to a name.
+ //However, IE reports the script as being in 'interactive'
+ //readyState at the time of the DEFINE call.
+ useInteractive = true;
+
+ node.attachEvent('onreadystatechange', context.onScriptLoad);
+ //It would be great to add an error handler here to catch
+ //404s in IE9+. However, onreadystatechange will fire before
+ //the error handler, so that does not help. If addEventListener
+ //is used, then IE will fire error before load, but we cannot
+ //use that pathway given the connect.microsoft.com issue
+ //mentioned above about not doing the 'script execute,
+ //then fire the script load event listener before execute
+ //next script' that other browsers do.
+ //Best hope: IE10 fixes the issues,
+ //and then destroys all installs of IE 6-9.
+ //node.attachEvent('onerror', context.onScriptError);
+ } else {
+ node.addEventListener('load', context.onScriptLoad, false);
+ node.addEventListener('error', context.onScriptError, false);
+ }
+ node.src = url;
+
+ //Calling onNodeCreated after all properties on the node have been
+ //set, but before it is placed in the DOM.
+ if (config.onNodeCreated) {
+ config.onNodeCreated(node, config, moduleName, url);
+ }
+
+ //For some cache cases in IE 6-8, the script executes before the end
+ //of the appendChild execution, so to tie an anonymous DEFINE
+ //call to the module name (which is stored on the node), hold on
+ //to a reference to this node, but clear after the DOM insertion.
+ currentlyAddingScript = node;
+ if (baseElement) {
+ head.insertBefore(node, baseElement);
+ } else {
+ head.appendChild(node);
+ }
+ currentlyAddingScript = null;
+
+ return node;
+ } else if (isWebWorker) {
+ try {
+ //In a web worker, use importScripts. This is not a very
+ //efficient use of importScripts, importScripts will block until
+ //its script is downloaded and evaluated. However, if web workers
+ //are in play, the expectation is that a build has been done so
+ //that only one script needs to be loaded anyway. This may need
+ //to be reevaluated if other use cases become common.
+
+ // Post a task to the event loop to work around a bug in WebKit
+ // where the worker gets garbage-collected after calling
+ // importScripts(): https://webkit.org/b/153317
+ setTimeout(function() {}, 0);
+ importScripts(url);
+
+ //Account for anonymous modules
+ context.completeLoad(moduleName);
+ } catch (e) {
+ context.onError(makeError('importscripts',
+ 'importScripts failed for ' +
+ moduleName + ' at ' + url,
+ e,
+ [moduleName]));
+ }
+ }
+ };
+
+ function getInteractiveScript() {
+ if (interactiveScript && interactiveScript.readyState === 'interactive') {
+ return interactiveScript;
+ }
+
+ eachReverse(scripts(), function (script) {
+ if (script.readyState === 'interactive') {
+ return (interactiveScript = script);
+ }
+ });
+ return interactiveScript;
+ }
+
+ //Look for a data-main script attribute, which could also adjust the baseUrl.
+ if (isBrowser && !cfg.skipDataMain) {
+ //Figure out baseUrl. Get it from the script tag with REQUIRE.js in it.
+ eachReverse(scripts(), function (script) {
+ //Set the 'head' where we can append children by
+ //using the script's parent.
+ if (!head) {
+ head = script.parentNode;
+ }
+
+ //Look for a data-main attribute to set main script for the page
+ //to load. If it is there, the path to data main becomes the
+ //baseUrl, if it is not already set.
+ dataMain = script.getAttribute('data-main');
+ if (dataMain) {
+ //Preserve dataMain in case it is a path (i.e. contains '?')
+ mainScript = dataMain;
+
+ //Set final baseUrl if there is not already an explicit one,
+ //but only do so if the data-main value is not a loader plugin
+ //module ID.
+ if (!cfg.baseUrl && mainScript.indexOf('!') === -1) {
+ //Pull off the directory of data-main for use as the
+ //baseUrl.
+ src = mainScript.split('/');
+ mainScript = src.pop();
+ subPath = src.length ? src.join('/') + '/' : './';
+
+ cfg.baseUrl = subPath;
+ }
+
+ //Strip off any trailing .js since mainScript is now
+ //like a module name.
+ mainScript = mainScript.replace(jsSuffixRegExp, '');
+
+ //If mainScript is still a path, fall back to dataMain
+ if (req.jsExtRegExp.test(mainScript)) {
+ mainScript = dataMain;
+ }
+
+ //Put the data-main script in the files to load.
+ cfg.deps = cfg.deps ? cfg.deps.concat(mainScript) : [mainScript];
+
+ return true;
+ }
+ });
+ }
+
+ /**
+ * The function that handles definitions of modules. Differs from
+ * REQUIRE() in that a string for the module should be the first argument,
+ * and the function to execute after dependencies are loaded should
+ * return a value to DEFINE the module corresponding to the first argument's
+ * name.
+ */
+ DEFINE = function (name, deps, callback) {
+ var node, context;
+
+ //Allow for anonymous modules
+ if (typeof name !== 'string') {
+ //Adjust args appropriately
+ callback = deps;
+ deps = name;
+ name = null;
+ }
+
+ //This module may not have dependencies
+ if (!isArray(deps)) {
+ callback = deps;
+ deps = null;
+ }
+
+ //If no name, and callback is a function, then figure out if it a
+ //CommonJS thing with dependencies.
+ if (!deps && isFunction(callback)) {
+ deps = [];
+ //Remove comments from the callback string,
+ //look for REQUIRE calls, and pull them into the dependencies,
+ //but only if there are function args.
+ if (callback.length) {
+ callback
+ .toString()
+ .replace(commentRegExp, commentReplace)
+ .replace(cjsRequireRegExp, function (match, dep) {
+ deps.push(dep);
+ });
+
+ //May be a CommonJS thing even without REQUIRE calls, but still
+ //could use exports, and module. Avoid doing exports and module
+ //work though if it just needs REQUIRE.
+ //REQUIRES the function to expect the CommonJS variables in the
+ //order listed below.
+ deps = (callback.length === 1 ? ['REQUIRE'] : ['REQUIRE', 'exports', 'module']).concat(deps);
+ }
+ }
+
+ //If in IE 6-8 and hit an anonymous DEFINE() call, do the interactive
+ //work.
+ if (useInteractive) {
+ node = currentlyAddingScript || getInteractiveScript();
+ if (node) {
+ if (!name) {
+ name = node.getAttribute('data-requiremodule');
+ }
+ context = contexts[node.getAttribute('data-requirecontext')];
+ }
+ }
+
+ //Always save off evaluating the def call until the script onload handler.
+ //This allows multiple modules to be in a file without prematurely
+ //tracing dependencies, and allows for anonymous module support,
+ //where the module name is not known until the script onload event
+ //occurs. If no context, use the global queue, and get it processed
+ //in the onscript load callback.
+ if (context) {
+ context.defQueue.push([name, deps, callback]);
+ context.defQueueMap[name] = true;
+ } else {
+ globalDefQueue.push([name, deps, callback]);
+ }
+ };
+
+ DEFINE.amd = {
+ jQuery: true
+ };
+
+ /**
+ * Executes the text. Normally just uses eval, but can be modified
+ * to use a better, environment-specific call. Only used for transpiling
+ * loader plugins, not for plain JS modules.
+ * @param {String} text the text to execute/evaluate.
+ */
+ req.exec = function (text) {
+ /*jslint evil: true */
+ return eval(text);
+ };
+
+ //Set up with config info.
+ req(cfg);
+}(this, (typeof setTimeout === 'undefined' ? undefined : setTimeout)));
diff --git a/Client/package.json b/Platform/package.json
similarity index 78%
rename from Client/package.json
rename to Platform/package.json
index d09113f0b..f506c5919 100644
--- a/Client/package.json
+++ b/Platform/package.json
@@ -13,12 +13,13 @@
"ethereumjs-common": "^1.5.2",
"ethereumjs-tx": "^2.1.2",
"ethers": "^5.4.4",
+ "http": "0.0.1-security",
"lookpath": "^1.2.2",
- "node-fetch": "2.6.1",
- "open": "^6.4.0",
+ "node-fetch": "^2.6.1",
+ "open": "^8.2.1",
"rimraf": "^3.0.2",
"simple-git": "^2.42.0",
- "web3": "^1.5.0",
- "ws": "^7.4.6"
+ "web3": "^1.5.2",
+ "ws": "^8.2.1"
}
}
diff --git a/Projects/Education/Schemas/Docs-Nodes/T/Tutorial/Tutorial/tutorial.json b/Projects/Education/Schemas/Docs-Nodes/T/Tutorial/Tutorial/tutorial.json
index 0c5966bcd..4932414ce 100644
--- a/Projects/Education/Schemas/Docs-Nodes/T/Tutorial/Tutorial/tutorial.json
+++ b/Projects/Education/Schemas/Docs-Nodes/T/Tutorial/Tutorial/tutorial.json
@@ -7,7 +7,8 @@
{
"language": "ES",
"text": "La jerarquía del tutorial presenta una disposición libre de los nodos Tutorial Topic y Tutorial Step que componen un tutorial. Cada nodo de la jerarquía, incluido el nodo del tutorial principal, representa una página HTML que puede superponerse en la parte superior de ambos Design Space y el Charting Space.",
- "updated": 1627245866146
+ "updated": 1627245866146,
+ "style": "Definition"
}
]
},
@@ -285,8 +286,8 @@
},
{
"style": "Text",
- "text": "The page property is where you define which Docs Page must be loaded. You must specify the Project, the Docs Page Category, and the \"type\" which is the complete name of the page. The optional property anchor allows you to points the user to a specific paragraph in the page with the Docs Anchor Style.",
- "updated": 1617649332425
+ "text": "The page property is where you define which Docs Page must be loaded. You must specify the Project, the Docs Page Category, and the \"type\" which is the complete name of the page. The optional property anchor allows you to point the user to a specific paragraph in the page with the Docs Anchor Style.",
+ "updated": 1630752089891
},
{
"style": "Json",
diff --git a/Projects/Foundations/CL/Utilities/WebAccess.js b/Projects/Foundations/CL/Utilities/WebAccess.js
index 9e3879cc3..e4ae0091c 100644
--- a/Projects/Foundations/CL/Utilities/WebAccess.js
+++ b/Projects/Foundations/CL/Utilities/WebAccess.js
@@ -9,7 +9,7 @@ exports.newFoundationsUtilitiesWebAccess = function () {
async function fetchAPIDataFile(url) {
let promise = new Promise((resolve, reject) => {
- const fetch = CL.nodeModules.nodeFetch
+ const fetch = SA.nodeModules.nodeFetch
/*
This is how we call the API.
*/
diff --git a/Projects/Foundations/Plugins/Data-Mines/Delta.json b/Projects/Foundations/Plugins/Data-Mines/Delta.json
index 4e8498d9b..2e11f0d13 100644
--- a/Projects/Foundations/Plugins/Data-Mines/Delta.json
+++ b/Projects/Foundations/Plugins/Data-Mines/Delta.json
@@ -1 +1 @@
-{"type":"Data Mine","name":"Delta","config":"{\n \"codeName\": \"Delta\"\n}","project":"Foundations","sensorBots":[],"indicatorBots":[{"type":"Indicator Bot","name":"Relative Strenght Index - Wilder Method (RSI-W)","config":"{\n \"codeName\": \"RSI-W\"\n}","project":"Foundations","processes":[{"type":"Process Definition","name":"Multi-Time-Frame-Market","config":"{\n \"codeName\": \"Multi-Time-Frame-Market\",\n \"description\": \"Calculates Wilder RSI.\",\n \"deadWaitTime\": 0,\n \"normalWaitTime\": 0,\n \"retryWaitTime\": 10000,\n \"sleepWaitTime\": 3600000,\n \"comaWaitTime\": 86400000,\n \"framework\": {\n \"name\": \"Multi-Time-Frame-Market\"\n }\n}","project":"Foundations","processOutput":{"type":"Process Output","name":"New Process Output","project":"Foundations","outputDatasets":[{"type":"Output Dataset","name":"Multi-Time-Frame-Market RSI-W14","project":"Foundations","id":"75881553-ec60-4954-9404-052ba11904f4","savedPayload":{"position":{"x":19646.18251638588,"y":17789.2053813897},"targetPosition":{"x":19675.299658959913,"y":17897.87203684722},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"a94722c3-a453-4f46-931f-aeb244e7cb66"}}}],"outputDatasetFolders":[],"id":"ffb59a7e-565a-4588-bd44-999a7cb66122","savedPayload":{"position":{"x":19675.299658959913,"y":17897.87203684722},"targetPosition":{"x":19704.416801533946,"y":18006.53869230474},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":1,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"processDependencies":{"type":"Process Dependencies","name":"New Process Dependencies","project":"Foundations","statusDependencies":[{"type":"Status Dependency","name":"Candles Volumes Multi-Time-Frame-Market","config":"{\n \"mainUtility\": \"Market Ending Point\"\n}","project":"Foundations","id":"b0af9801-ba4e-4bfd-a605-98d9ac121b5f","savedPayload":{"position":{"x":19650.151086682014,"y":17594.3496655382},"targetPosition":{"x":19762.651086682014,"y":17789.2053813897},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"a0a61ba9-91cb-4ec7-92fe-134ff079de2d"}}},{"type":"Status Dependency","name":"Relative Strenght Index - Wilder Method (RSI-W) Multi-Time-Frame-Market","config":"{\n \"mainUtility\": \"Self Reference\"\n}","project":"Foundations","id":"02d64b4a-7c3c-4c89-918d-b3697b5955b2","savedPayload":{"position":{"x":19820.88537183008,"y":17571.87207047466},"targetPosition":{"x":19762.651086682014,"y":17789.2053813897},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"2b961dac-9f41-4eed-a495-4e55f26714c3"}}}],"dataDependencies":[{"type":"Data Dependency","name":"Candles Multi-Time-Frame-Market","project":"Foundations","id":"25315413-2e01-4a7d-83bc-1257d43f8fe6","savedPayload":{"position":{"x":19957.506802533513,"y":17676.7053813897},"targetPosition":{"x":19762.651086682014,"y":17789.2053813897},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"2b03494a-67d6-47f1-89b6-53fc4c9116a8"}}}],"dataMineDataDependencies":[],"id":"b14516a1-e5cc-48f8-ab0f-0e46faf6c41c","savedPayload":{"position":{"x":19762.651086682014,"y":17789.2053813897},"targetPosition":{"x":19704.416801533946,"y":18006.53869230474},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"statusReport":{"type":"Status Report","name":"New Status Report","project":"Foundations","id":"2b961dac-9f41-4eed-a495-4e55f26714c3","savedPayload":{"position":{"x":19863.51582730092,"y":17847.439666537768},"targetPosition":{"x":19704.416801533946,"y":18006.53869230474},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"executionStartedEvent":{"type":"Execution Started Event","name":"Candles Volumes Multi-Time-Frame-Market","project":"Foundations","id":"c1598823-e0b3-4036-8ad6-669ae0e3f638","savedPayload":{"position":{"x":19921.750112448986,"y":17948.304407156673},"targetPosition":{"x":19704.416801533946,"y":18006.53869230474},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Execution Finished Event","name":"New Execution Finished Event","id":"1824fa00-dd30-4cdc-acc0-01c2f29056c5"}}},"executionFinishedEvent":{"type":"Execution Finished Event","name":"New Execution Finished Event","project":"Foundations","id":"b317c309-4677-4a2a-ba2a-801fccd01b1d","savedPayload":{"position":{"x":19921.750112448986,"y":18064.77297745281},"targetPosition":{"x":19704.416801533946,"y":18006.53869230474},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"279a9122-7f94-47b4-bf09-999fa889104b","savedPayload":{"position":{"x":19690.416801533946,"y":18018.53869230474},"targetPosition":{"x":19372.21875,"y":18336.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Process Definition","name":"Multi-Time-Frame-Daily","config":"{\n \"codeName\": \"Multi-Time-Frame-Daily\",\n \"description\": \"Calculates Wilder RSI\",\n \"deadWaitTime\": 0,\n \"normalWaitTime\": 0,\n \"retryWaitTime\": 10000,\n \"sleepWaitTime\": 3600000,\n \"comaWaitTime\": 86400000,\n \"framework\": {\n \"name\": \"Multi-Time-Frame-Daily\"\n }\n}","project":"Foundations","processOutput":{"type":"Process Output","name":"New Process Output","project":"Foundations","outputDatasets":[{"type":"Output Dataset","name":"Multi-Time-Frame-Daily RSI-W14","project":"Foundations","id":"a902a032-dbcc-4f7f-8495-70f0f5da03f8","savedPayload":{"position":{"x":19167.963077267068,"y":19583.111743838686},"targetPosition":{"x":19081.360536888624,"y":19533.111743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Daily","id":"f6e7a28d-d3d8-4d05-b90f-40bbe5f59b8a"}}}],"outputDatasetFolders":[],"id":"02da2e0b-9593-485a-ae0d-3f4ff131c813","savedPayload":{"position":{"x":19081.360536888624,"y":19533.111743838686},"targetPosition":{"x":18935.21875,"y":19448.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":1,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"processDependencies":{"type":"Process Dependencies","name":"New Process Dependencies","project":"Foundations","statusDependencies":[{"type":"Status Dependency","name":"Candles Volumes Multi-Time-Frame-Daily","config":"{\"mainUtility\": \"Market Ending Point\"}","project":"Foundations","id":"3173726e-99f5-4153-acbd-17e0ca4c6dac","savedPayload":{"position":{"x":19608.369889686794,"y":20068.582247746013},"targetPosition":{"x":19272.71875,"y":20033.30389139318},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"2a021da8-9feb-475e-90ab-1586968c17c7"}}},{"type":"Status Dependency","name":"Exchange Raw Data Historic-OHLCVs","config":"{\n \"mainUtility\": \"Market Starting Point\"\n}","project":"Foundations","id":"56d255fa-7193-431f-a3c5-f98e6d28a508","savedPayload":{"position":{"x":19523.53012859862,"y":20259.135471039295},"targetPosition":{"x":19272.71875,"y":20033.30389139318},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"181c7c34-7243-497a-9ddb-1b0067c6d66e"}}},{"type":"Status Dependency","name":"Relative Strenght Index - Wilder Method (RSI-W) Multi-Time-Frame-Daily","config":"{\n \"mainUtility\": \"Self Reference\"\n}","project":"Foundations","id":"b96ab1d1-3bdc-429d-921a-0aab94741d29","savedPayload":{"position":{"x":19342.888945650993,"y":20363.42870664084},"targetPosition":{"x":19272.71875,"y":20033.30389139318},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"8c1c40cf-dd93-4f61-b3f0-9344707b196d"}}}],"dataDependencies":[{"type":"Data Dependency","name":"Candles Multi-Time-Frame-Daily","project":"Foundations","id":"756f850b-7e37-4fc8-8031-b7c8458bc8c3","savedPayload":{"position":{"x":19135.44513296192,"y":20341.625483347558},"targetPosition":{"x":19272.71875,"y":20033.30389139318},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Daily","id":"678a567c-f08d-49b9-813b-4e54fd6afadb"}}}],"dataMineDataDependencies":[],"id":"c42ac621-a7d7-499a-84a0-76bd99ef3fa4","savedPayload":{"position":{"x":19272.71875,"y":20033.30389139318},"targetPosition":{"x":18935.21875,"y":19448.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"statusReport":{"type":"Status Report","name":"New Status Report","project":"Foundations","id":"8c1c40cf-dd93-4f61-b3f0-9344707b196d","savedPayload":{"position":{"x":18935.21875,"y":19786.236743838686},"targetPosition":{"x":18935.21875,"y":19448.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"executionStartedEvent":{"type":"Execution Started Event","name":"Candles Volumes Multi-Time-Frame-Daily","project":"Foundations","id":"1bf32fba-af6a-43eb-b0bb-2ac855bb5820","savedPayload":{"position":{"x":18766.46875,"y":19741.020317615934},"targetPosition":{"x":18935.21875,"y":19448.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Execution Finished Event","name":"New Execution Finished Event","id":"f29d08f9-e7c8-490c-8fca-14851a0d3dc3"}}},"executionFinishedEvent":{"type":"Execution Finished Event","name":"New Execution Finished Event","project":"Foundations","id":"ffcd3bc1-44f3-4e21-9f33-fc2f818494b5","savedPayload":{"position":{"x":18642.935176222752,"y":19617.486743838686},"targetPosition":{"x":18935.21875,"y":19448.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"a5c6c183-7b68-4e7c-82c2-27ac439b098d","savedPayload":{"position":{"x":20047.21875,"y":18336.736743838686},"targetPosition":{"x":19372.21875,"y":18336.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":4,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"products":[{"type":"Product Definition","name":"RSI-W14","config":"{\n \"codeName\": \"RSI-W14\",\n \"singularVariableName\": \"rsiw14\",\n \"pluralVariableName\": \"rsiw14s\"\n}","project":"Foundations","datasets":[{"type":"Dataset Definition","name":"Multi-Time-Frame-Daily","config":"{\n \"codeName\": \"Multi-Time-Frame-Daily\",\n \"type\": \"Daily Files\",\n \"validTimeFrames\": [\n \"45-min\",\n \"40-min\",\n \"30-min\",\n \"20-min\",\n \"15-min\",\n \"10-min\",\n \"05-min\",\n \"04-min\",\n \"03-min\",\n \"02-min\",\n \"01-min\"\n ],\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset/@TimeFrame/@Year/@Month/@Day\",\n \"fileName\": \"Data.json\",\n \"dataRange\": {\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset\",\n \"fileName\": \"Data.Range.json\"\n },\n \"timeFrames\": {\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset\",\n \"fileName\": \"Time.Frames.json\"\n }\n}","project":"Foundations","id":"f6e7a28d-d3d8-4d05-b90f-40bbe5f59b8a","savedPayload":{"position":{"x":19912.64667816785,"y":18619.73704073858},"targetPosition":{"x":19690.416801533946,"y":18654.934795372632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","config":"{\n \"codeName\": \"Multi-Time-Frame-Market\",\n \"type\": \"Market Files\",\n \"validTimeFrames\": [\n \"24-hs\",\n \"12-hs\",\n \"08-hs\",\n \"06-hs\",\n \"04-hs\",\n \"03-hs\",\n \"02-hs\",\n \"01-hs\"\n ],\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset/@TimeFrame\",\n \"fileName\": \"Data.json\",\n \"timeFrames\" : {\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset\",\n \"fileName\": \"Time.Frames.json\"\n }\n}","project":"Foundations","id":"a94722c3-a453-4f46-931f-aeb244e7cb66","savedPayload":{"position":{"x":19890.893269476328,"y":18757.08265781403},"targetPosition":{"x":19690.416801533946,"y":18654.934795372632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}}],"record":{"type":"Record Definition","name":"New Record Definition","project":"Foundations","properties":[{"type":"Record Property","name":"Begin","config":"{\n \"codeName\": \"begin\",\n \"isString\": false\n}","project":"Foundations","recordFormula":{"type":"Record Formula","name":"Begin","code":"record.current.begin","project":"Foundations","id":"5f2981e4-5b9a-4867-9bf4-79dd2b9c19f0","savedPayload":{"position":{"x":20108.700242583152,"y":19125.41655499176},"targetPosition":{"x":20001.706384499947,"y":19090.65214312458},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"a7c379ea-fc2f-4526-9a5f-fcdc272f6a02","savedPayload":{"position":{"x":20001.706384499947,"y":19090.65214312458},"targetPosition":{"x":19894.71252641674,"y":19055.887731257397},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":1,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Record Property","name":"End","config":"{\n \"codeName\": \"end\",\n \"isString\": false\n}","project":"Foundations","recordFormula":{"type":"Record Formula","code":"record.current.end","project":"Foundations","id":"ad4e0d6b-e7ce-4e09-88a6-a3f44d7c0c08","savedPayload":{"position":{"x":19996.860388858142,"y":19256.36419919978},"targetPosition":{"x":19945.78645763744,"y":19156.125965228588},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"a859a2ce-cd0a-43ae-995b-6140402a9f1a","savedPayload":{"position":{"x":19945.78645763744,"y":19156.125965228588},"targetPosition":{"x":19894.71252641674,"y":19055.887731257397},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":1,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Record Property","name":"Value","config":"{\n \"codeName\": \"value\",\n \"isString\": false\n}","project":"Foundations","recordFormula":{"type":"Record Formula","code":"variable.value","project":"Foundations","id":"43595088-af8f-4ad5-8bfe-3b04a5168681","savedPayload":{"position":{"x":19825.183702682378,"y":19269.87544742381},"targetPosition":{"x":19859.94811454956,"y":19162.881589340603},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"3cd01f28-dd1a-45bc-8c68-29bdbf4be84b","savedPayload":{"position":{"x":19859.94811454956,"y":19162.881589340603},"targetPosition":{"x":19894.71252641674,"y":19055.887731257397},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":1,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"ee7e6fb0-984c-410b-9ba7-241deddcd7ad","savedPayload":{"position":{"x":19894.71252641674,"y":19055.887731257397},"targetPosition":{"x":19690.416801533946,"y":18654.934795372632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"dataBuilding":{"type":"Data Building Procedure","name":"New Data Building Procedure","project":"Foundations","loop":{"type":"Procedure Loop","name":"New Procedure Loop","project":"Foundations","procedureJavascriptCode":{"type":"Procedure Javascript Code","code":"/* Loop Code */\n\n/* \nCalculation method credit: https://www.macroption.com/rsi-calculation/\n*/\n\n/* Calculating Up Moves and Down Moves */\n\n//let candle = record.current // Our main dependencies are candles \n//let candlePrevious = record.previous\n\nif (record.previous !== undefined) {\n if (record.current.close > record.previous.close) {\n variable.last14U.push(record.current.close - record.previous.close) // Add win to last 14 array.\n } else {\n variable.last14U.push(0) // Add 0 to keep proper count of records in the last 14 array.\n }\n \n if (record.current.close < record.previous.close) {\n variable.last14D.push(record.previous.close - record.current.close) // Add win to last 14 array.\n } else {\n variable.last14D.push(0) // Add 0 to keep proper count of records in the last 14 array.\n }\n \n if (variable.last14U.length > 14) {\n variable.last14U.splice(0, 1) // Remove the first element of the array to keep it at a maximun of 14 elements.\n }\n \n if (variable.last14D.length > 14) {\n variable.last14D.splice(0, 1) // Remove the first element of the array to keep it at a maximun of 14 elements.\n }\n \n /* Calculating Averages of Up Moves and Down Moves */\n\n variable.avgU = calculateRMAU(14)\n variable.avgD = calculateRMAD(14)\n\n /* Keep track of average moves */\n variable.rma14U.push(variable.avgU)\n variable.rma14D.push(variable.avgD)\n \n if (variable.rma14U.length > 14) {\n variable.rma14U.splice(0, 1) // Remove the first element of the array to keep it at a maximun of 14 elements.\n }\n \n if (variable.rma14D.length > 14) {\n variable.rma14D.splice(0, 1) // Remove the first element of the array to keep it at a maximun of 14 elements.\n }\n\n /* Calculating Relative Strength */\n \n if (variable.avgD > 0) {\n relativeStrength = variable.avgU / variable.avgD\n } else {\n relativeStrength = 0\n }\n\n /* Calculating RSI */\n\n relativeStrengthIndex = 100 - 100 / ( 1 + relativeStrength)\n\n if (relativeStrengthIndex !== undefined) {\n variable.value = relativeStrengthIndex.toFixed(2)\n } else {\n variable.value = 0\n }\n} else {\n variable.value = 0\n}\n\n// Statistics\n\nfunction calculateWMA(source, rmas, periods) { // Having a function avoids us to repeat code.\n /* We check we have enough values to make the calculation */\n if (source.length < periods) { return 0 } // If we dont, we define the value is zero.\n\n let alpha = 1 / periods\n let avg = source[source.length - 1] * alpha + rmas[rmas.length - 1] * (1 - alpha)\n return avg;\n}\n\nfunction calculateRMAU(periods) {\n return calculateWMA(variable.last14U, variable.rma14U, periods)\n}\n\nfunction calculateRMAD(periods) {\n return calculateWMA(variable.last14D, variable.rma14D, periods)\n}","project":"Foundations","id":"91eb76f0-617c-4397-9135-beca294a6481","savedPayload":{"position":{"x":19781.28686956123,"y":19519.505740564182},"targetPosition":{"x":19700.654080913537,"y":19309.450144602313},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"6957916d-b353-4b19-8b8f-cf7fb97024b3","savedPayload":{"position":{"x":19700.654080913537,"y":19309.450144602313},"targetPosition":{"x":19620.021292265843,"y":19099.394548640445},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"initialization":{"type":"Procedure Initialization","name":"New Procedure Initialization","project":"Foundations","procedureJavascriptCode":{"type":"Procedure Javascript Code","code":"/* Initialization Code*/\n\n/* \nWe keep two separate arrays to store last 14 price increments or losses.\n*/\n\nvariable.last14U = []\nvariable.last14D = []\nvariable.rma14U = []\nvariable.rma14D = []\n","project":"Foundations","id":"7b8d4dd2-2dde-47fe-8340-efd0f93fe435","savedPayload":{"position":{"x":19336.827116293414,"y":19449.110231296083},"targetPosition":{"x":19478.42420427963,"y":19274.252389968264},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"076ef281-1c67-4117-8168-a5beba487ffc","savedPayload":{"position":{"x":19478.42420427963,"y":19274.252389968264},"targetPosition":{"x":19620.021292265843,"y":19099.394548640445},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"a1ef81d6-c2c9-46c4-aaed-366b31b2d639","savedPayload":{"position":{"x":19620.021292265843,"y":19099.394548640445},"targetPosition":{"x":19690.416801533946,"y":18654.934795372632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"fbe3d4ba-bcfd-4cb1-91d1-64d7d381a21c","savedPayload":{"position":{"x":19690.416801533946,"y":18654.934795372632},"targetPosition":{"x":19372.21875,"y":18336.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Plotter Module","name":"RSI-W14","id":"4045dbb5-77d9-46ed-837d-e05caded1a29"}}}],"id":"1b49e818-f9f9-4ecc-bdbd-708f5641fb66","savedPayload":{"position":{"x":19372.21875,"y":18336.736743838686},"targetPosition":{"x":18922.21875,"y":18336.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Indicator Bot","name":"Money Flow Index (MFI)","config":"{\n \"codeName\": \"MFI\"\n}","project":"Foundations","processes":[{"type":"Process Definition","name":"Multi-Time-Frame-Daily","config":"{\n \"codeName\": \"Multi-Time-Frame-Daily\",\n \"description\": \"Calculates MFI\",\n \"deadWaitTime\": 0,\n \"normalWaitTime\": 0,\n \"retryWaitTime\": 10000,\n \"sleepWaitTime\": 3600000,\n \"comaWaitTime\": 86400000,\n \"framework\": {\n \"name\": \"Multi-Time-Frame-Daily\"\n }\n}","project":"Foundations","processOutput":{"type":"Process Output","name":"New Process Output","project":"Foundations","outputDatasets":[{"type":"Output Dataset","name":"Multi-Time-Frame-Daily MFI","project":"Foundations","id":"48a07111-4122-4d5c-a3ef-df4b138b6af7","savedPayload":{"position":{"x":19445.67603962037,"y":19049.935748288346},"targetPosition":{"x":19349.083456991466,"y":19075.8176527986},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Daily","id":"22edf2c6-b165-4b9e-b6ac-0cfefd9ee01b"}}}],"outputDatasetFolders":[],"id":"3c9355dd-ecf6-4604-b7f7-f6f1f8e784d6","savedPayload":{"position":{"x":19349.083456991466,"y":19075.8176527986},"targetPosition":{"x":19240.416801533946,"y":19104.934795372632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":1,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"processDependencies":{"type":"Process Dependencies","name":"New Process Dependencies","project":"Foundations","statusDependencies":[{"type":"Status Dependency","name":"Candles Volumes Multi-Time-Frame-Daily","config":"{\"mainUtility\": \"Market Ending Point\"}","project":"Foundations","id":"7867d355-9cd6-434e-90de-cd1f5f9ba32a","savedPayload":{"position":{"x":19537.299625332475,"y":19083.61956763721},"targetPosition":{"x":19457.750112448986,"y":19163.1690805207},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"2a021da8-9feb-475e-90ab-1586968c17c7"}}},{"type":"Status Dependency","name":"Exchange Raw Data Historic-OHLCVs","config":"{\n \"mainUtility\": \"Market Starting Point\"\n}","project":"Foundations","id":"bdf2cbd7-2cd6-4945-96b3-0609b3969d37","savedPayload":{"position":{"x":19566.416767906507,"y":19134.051937946668},"targetPosition":{"x":19457.750112448986,"y":19163.1690805207},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"181c7c34-7243-497a-9ddb-1b0067c6d66e"}}},{"type":"Status Dependency","name":"Money Flow Index (MFI) Multi-Time-Frame-Daily","config":"{\n \"mainUtility\": \"Self Reference\"\n}","project":"Foundations","id":"25380d29-c370-4b34-bcb6-55d94cab4a11","savedPayload":{"position":{"x":19566.416767906507,"y":19192.286223094732},"targetPosition":{"x":19457.750112448986,"y":19163.1690805207},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"218ce270-08fe-45a0-90ef-7189fffd72dd"}}}],"dataDependencies":[{"type":"Data Dependency","name":"Candles Multi-Time-Frame-Daily","project":"Foundations","id":"afdb16be-1eba-4ab0-aceb-9695b25ef435","savedPayload":{"position":{"x":19537.299625332475,"y":19242.718593404188},"targetPosition":{"x":19457.750112448986,"y":19163.1690805207},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Daily","id":"678a567c-f08d-49b9-813b-4e54fd6afadb"}}},{"type":"Data Dependency","name":"Volumes Multi-Time-Frame-Daily","project":"Foundations","id":"f26fa862-f8e1-480b-b9a3-fb8e001e3b8d","savedPayload":{"position":{"x":19486.86725502302,"y":19271.83573597822},"targetPosition":{"x":19457.750112448986,"y":19163.1690805207},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Daily","id":"2e683057-f911-4105-bc77-16f2706d1915"}}}],"dataMineDataDependencies":[],"id":"4704cf1b-133a-4e6e-8b97-bfece022354e","savedPayload":{"position":{"x":19457.750112448986,"y":19163.1690805207},"targetPosition":{"x":19240.416801533946,"y":19104.934795372632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"statusReport":{"type":"Status Report","name":"New Status Report","project":"Foundations","id":"218ce270-08fe-45a0-90ef-7189fffd72dd","savedPayload":{"position":{"x":19399.51582730092,"y":19264.033821139605},"targetPosition":{"x":19240.416801533946,"y":19104.934795372632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"executionStartedEvent":{"type":"Execution Started Event","name":"Candles Volumes Multi-Time-Frame-Daily","project":"Foundations","id":"30fcca1f-f72d-46cf-bd17-99f8e2e1cd10","savedPayload":{"position":{"x":19298.651086682014,"y":19322.268106287673},"targetPosition":{"x":19240.416801533946,"y":19104.934795372632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Execution Finished Event","name":"New Execution Finished Event","id":"f29d08f9-e7c8-490c-8fca-14851a0d3dc3"}}},"executionFinishedEvent":{"type":"Execution Finished Event","name":"New Execution Finished Event","project":"Foundations","id":"91f10f62-3cad-4709-8b90-31daceb01bd2","savedPayload":{"position":{"x":19182.182516385878,"y":19322.268106287673},"targetPosition":{"x":19240.416801533946,"y":19104.934795372632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"6be015e8-abd8-4c91-bc44-ed0dbe4401bf","savedPayload":{"position":{"x":19240.416801533946,"y":19104.934795372632},"targetPosition":{"x":18922.21875,"y":18786.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Process Definition","name":"Multi-Time-Frame-Market","config":"{\n \"codeName\": \"Multi-Time-Frame-Market\",\n \"description\": \"Calculates MFI.\",\n \"deadWaitTime\": 0,\n \"normalWaitTime\": 0,\n \"retryWaitTime\": 10000,\n \"sleepWaitTime\": 3600000,\n \"comaWaitTime\": 86400000,\n \"framework\": {\n \"name\": \"Multi-Time-Frame-Market\"\n }\n}","project":"Foundations","processOutput":{"type":"Process Output","name":"New Process Output","project":"Foundations","outputDatasets":[{"type":"Output Dataset","name":"Multi-Time-Frame-Market MFI","project":"Foundations","id":"c5c02f93-dacc-4e97-803b-45f1d3d7756c","savedPayload":{"position":{"x":19130.074465851496,"y":19336.236743838686},"targetPosition":{"x":19032.646607925748,"y":19279.986743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"f5f04930-c2a3-48b7-ade9-f98e148344f1"}}}],"outputDatasetFolders":[],"id":"a78ac5ae-14c4-4928-968b-604d5c78521c","savedPayload":{"position":{"x":19032.646607925748,"y":19279.986743838686},"targetPosition":{"x":18935.21875,"y":19223.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":1,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"processDependencies":{"type":"Process Dependencies","name":"New Process Dependencies","project":"Foundations","statusDependencies":[{"type":"Status Dependency","name":"Candles Volumes Multi-Time-Frame-Market","config":"{\n \"mainUtility\": \"Market Ending Point\"\n}","project":"Foundations","id":"226234a8-bb22-4f31-9446-ffee286446b4","savedPayload":{"position":{"x":19271.48617645786,"y":19442.111363925407},"targetPosition":{"x":19047.71875,"y":19418.592459690186},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"a0a61ba9-91cb-4ec7-92fe-134ff079de2d"}}},{"type":"Status Dependency","name":"Money Flow Index (MFI) Multi-Time-Frame-Market","config":"{\n \"mainUtility\": \"Self Reference\"\n}","project":"Foundations","id":"319ba4b4-77dc-412f-be3f-6fdb088f317c","savedPayload":{"position":{"x":19214.926335732413,"y":19569.14684612093},"targetPosition":{"x":19047.71875,"y":19418.592459690186},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"f4b09884-97e4-44e6-b0cf-3025c4cc44f9"}}}],"dataDependencies":[{"type":"Data Dependency","name":"Candles Multi-Time-Frame-Market","project":"Foundations","id":"39802ca4-ee03-42f3-a5a4-e805f787520b","savedPayload":{"position":{"x":19094.498880433996,"y":19638.675669855293},"targetPosition":{"x":19047.71875,"y":19418.592459690186},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"2b03494a-67d6-47f1-89b6-53fc4c9116a8"}}},{"type":"Data Dependency","name":"Volumes Multi-Time-Frame-Market","project":"Foundations","id":"9580ee4c-eb61-4133-91be-b9b8065cc74e","savedPayload":{"position":{"x":18956.203005307943,"y":19624.14018765977},"targetPosition":{"x":19047.71875,"y":19418.592459690186},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"9bf0483c-4825-4a46-9cf4-1b5262579fc1"}}}],"dataMineDataDependencies":[],"id":"871fab7f-2e97-4a8a-a771-0f4769c7b82d","savedPayload":{"position":{"x":19047.71875,"y":19418.592459690186},"targetPosition":{"x":18935.21875,"y":19223.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"statusReport":{"type":"Status Report","name":"New Status Report","project":"Foundations","id":"f4b09884-97e4-44e6-b0cf-3025c4cc44f9","savedPayload":{"position":{"x":18935.21875,"y":19448.736743838686},"targetPosition":{"x":18935.21875,"y":19223.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"executionStartedEvent":{"type":"Execution Started Event","name":"Candles Volumes Multi-Time-Frame-Market","project":"Foundations","id":"6319139b-bbb9-4250-831c-e57d8f8575c7","savedPayload":{"position":{"x":18822.71875,"y":19418.592459690186},"targetPosition":{"x":18935.21875,"y":19223.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Execution Finished Event","name":"New Execution Finished Event","id":"1824fa00-dd30-4cdc-acc0-01c2f29056c5"}}},"executionFinishedEvent":{"type":"Execution Finished Event","name":"New Execution Finished Event","project":"Foundations","id":"adadc3e2-074c-4429-b3d7-84592d6fd73a","savedPayload":{"position":{"x":18740.3630341485,"y":19336.236743838686},"targetPosition":{"x":18935.21875,"y":19223.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"b2d41186-2875-4058-8949-8acd8e5e8218","savedPayload":{"position":{"x":18922.21875,"y":19236.736743838686},"targetPosition":{"x":18922.21875,"y":18786.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"products":[{"type":"Product Definition","name":"MFI","config":"{\n \"codeName\": \"MFI\",\n \"singularVariableName\": \"mfi\",\n \"pluralVariableName\": \"mfis\"\n}","project":"Foundations","datasets":[{"type":"Dataset Definition","name":"Multi-Time-Frame-Daily","config":"{\n \"codeName\": \"Multi-Time-Frame-Daily\",\n \"type\": \"Daily Files\",\n \"validTimeFrames\": [\n \"45-min\",\n \"40-min\",\n \"30-min\",\n \"20-min\",\n \"15-min\",\n \"10-min\",\n \"05-min\",\n \"04-min\",\n \"03-min\",\n \"02-min\",\n \"01-min\"\n ],\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset/@TimeFrame/@Year/@Month/@Day\",\n \"fileName\": \"Data.json\",\n \"dataRange\": {\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset\",\n \"fileName\": \"Data.Range.json\"\n },\n \"timeFrames\": {\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset\",\n \"fileName\": \"Time.Frames.json\"\n }\n}","project":"Foundations","id":"22edf2c6-b165-4b9e-b6ac-0cfefd9ee01b","savedPayload":{"position":{"x":18639.218453100108,"y":19327.164672006536},"targetPosition":{"x":18604.020698466054,"y":19104.934795372632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","config":"{\n \"codeName\": \"Multi-Time-Frame-Market\",\n \"type\": \"Market Files\",\n \"validTimeFrames\": [\n \"24-hs\",\n \"12-hs\",\n \"08-hs\",\n \"06-hs\",\n \"04-hs\",\n \"03-hs\",\n \"02-hs\",\n \"01-hs\"\n ],\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset/@TimeFrame\",\n \"fileName\": \"Data.json\",\n \"timeFrames\" : {\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset\",\n \"fileName\": \"Time.Frames.json\"\n }\n}","project":"Foundations","id":"f5f04930-c2a3-48b7-ade9-f98e148344f1","savedPayload":{"position":{"x":18501.872836024657,"y":19305.411263315014},"targetPosition":{"x":18604.020698466054,"y":19104.934795372632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}}],"record":{"type":"Record Definition","name":"New Record Definition","project":"Foundations","properties":[{"type":"Record Property","name":"Begin","config":"{\n \"codeName\": \"begin\",\n \"isString\": false\n}","project":"Foundations","recordFormula":{"type":"Record Formula","name":"Begin","code":"record.current.begin","project":"Foundations","id":"3e93fd4c-c8d1-46f2-9097-409c0ae93699","savedPayload":{"position":{"x":18133.538938846927,"y":19523.21823642184},"targetPosition":{"x":18168.303350714108,"y":19416.224378338633},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"c1daf05e-b41f-4b76-9a2c-ce190c623b86","savedPayload":{"position":{"x":18168.303350714108,"y":19416.224378338633},"targetPosition":{"x":18203.06776258129,"y":19309.230520255427},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":1,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Record Property","name":"End","config":"{\n \"codeName\": \"end\",\n \"isString\": false\n}","project":"Foundations","recordFormula":{"type":"Record Formula","code":"record.current.end","project":"Foundations","id":"453226d1-0bef-4df3-93ed-68c914f8c5b5","savedPayload":{"position":{"x":18002.591294638907,"y":19411.37838269683},"targetPosition":{"x":18102.8295286101,"y":19360.304451476128},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"6326c213-145f-42f5-beb9-30b0426208da","savedPayload":{"position":{"x":18102.8295286101,"y":19360.304451476128},"targetPosition":{"x":18203.06776258129,"y":19309.230520255427},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":1,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Record Property","name":"Value","config":"{\n \"codeName\": \"value\",\n \"isString\": false\n}","project":"Foundations","recordFormula":{"type":"Record Formula","code":"variable.value","project":"Foundations","id":"f88be3cc-cb81-43db-8ee9-5eab5dc3833d","savedPayload":{"position":{"x":17989.080046414878,"y":19239.701696521064},"targetPosition":{"x":18096.073904498084,"y":19274.466108388246},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"ed8d0a42-0423-4c07-95dd-2453f6e49b83","savedPayload":{"position":{"x":18096.073904498084,"y":19274.466108388246},"targetPosition":{"x":18203.06776258129,"y":19309.230520255427},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":1,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"42782833-c816-4069-9d20-55cea2597ac0","savedPayload":{"position":{"x":18203.06776258129,"y":19309.230520255427},"targetPosition":{"x":18604.020698466054,"y":19104.934795372632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"dataBuilding":{"type":"Data Building Procedure","name":"New Data Building Procedure","project":"Foundations","loop":{"type":"Procedure Loop","name":"New Procedure Loop","project":"Foundations","procedureJavascriptCode":{"type":"Procedure Javascript Code","name":"New Procedure Javascript Code","code":"/* Loop Code */\nlet candle = record.current // This is the primary dependency\nlet volume = getElement('volumes', candle) // Here I get the volume bar corresponding to the current candle\nlet totalVolume = volume.buy + volume.sell // Candles Volumes split the volume received from the exchange evenly betwen buy and sell because it does not know how much of it there is.\n\nlet hlc3 = (candle.max + candle.min + candle.close) / 3\nlet lastHlc3 = variable.lastHlc3\n\nif (record.previous !== undefined) {\n\n let change = hlc3 - variable.lastHlc3\n\n variable.last14U.push(totalVolume * (change <= 0 ? 0 : hlc3))\n variable.last14D.push(totalVolume * (change >= 0 ? 0 : hlc3))\n \n if (variable.last14U.length > 14) {\n variable.last14U.splice(0, 1) // Remove the first element of the array to keep it at a maximun of 14 elements.\n }\n \n if (variable.last14D.length > 14) {\n variable.last14D.splice(0, 1) // Remove the first element of the array to keep it at a maximun of 14 elements.\n }\n\n let upper = variable.last14U.reduce(function(a, b){return a + b;}, 0);\n let lower = variable.last14D.reduce(function(a, b){return a + b;}, 0);\n\n let mfi\n\n if(lower == 0)\n mfi = 100\n else if(upper == 0)\n mfi = 0\n else // RSI\n mfi = 100 - (100 / (1 + upper / lower))\n\n if (mfi !== undefined) {\n variable.value = mfi.toFixed(2)\n } else {\n variable.value = 0\n }\n\n/*\n // Printing values to console to check\n console.log(\"HLC3: \", hlc3)\n console.log(\"Last HLC3: \", lastHlc3)\n console.log(\"Change: \", change)\n console.log(\"Upper: \", upper)\n console.log(\"Lower: \", lower)\n console.log(\"MFI: \", mfi)\n */\n\n} else {\n variable.value = 0\n}\n\nvariable.lastHlc3 = hlc3","project":"Foundations","id":"086b666c-f4d1-4167-a103-76b9d3eddf5f","savedPayload":{"position":{"x":17319.33856135076,"y":19357.070440695297},"targetPosition":{"x":17739.4497532745,"y":19195.804863399913},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"f29a8156-18e0-48cf-b0ee-0d54a1296dc4","savedPayload":{"position":{"x":17739.4497532745,"y":19195.804863399913},"targetPosition":{"x":18159.560945198242,"y":19034.53928610453},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"initialization":{"type":"Procedure Initialization","name":"New Procedure Initialization","project":"Foundations","procedureJavascriptCode":{"type":"Procedure Javascript Code","name":"New Procedure Javascript Code","code":"/* Initialization Code*/\n\nvariable.lastHlc3 = 0\nvariable.last14U = []\nvariable.last14D = []\n","project":"Foundations","id":"0255406d-ebc4-4841-aeb2-69bf3783a328","savedPayload":{"position":{"x":17460.129579886965,"y":18468.150934159672},"targetPosition":{"x":17809.845262542603,"y":18751.3451101321},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"8e1fc1c7-4306-4151-b4e7-cd155b4d7218","savedPayload":{"position":{"x":17809.845262542603,"y":18751.3451101321},"targetPosition":{"x":18159.560945198242,"y":19034.53928610453},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"7e8031b3-b8cb-43bd-8103-14e14e7be3a6","savedPayload":{"position":{"x":18159.560945198242,"y":19034.53928610453},"targetPosition":{"x":18604.020698466054,"y":19104.934795372632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"019b29d1-0227-4185-aee7-aaba499cdf93","savedPayload":{"position":{"x":18604.020698466054,"y":19104.934795372632},"targetPosition":{"x":18922.21875,"y":18786.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Plotter Module","name":"MFI","id":"d10cdbe9-9416-490a-904e-ace49d0dfbf7"}}}],"id":"c43b88dc-4ad9-4321-976d-374f98e2434b","savedPayload":{"position":{"x":18922.21875,"y":18786.736743838686},"targetPosition":{"x":18922.21875,"y":18336.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"plotters":[{"type":"Plotter","name":"Relative Strenght Index - Wilder Method (RSI-W)","config":"{\n \"codeName\": \"Plotter RSI-W\"\n}","project":"Foundations","modules":[{"type":"Plotter Module","name":"RSI-W14","config":"{\n \"codeName\": \"RSI-W14\"\n}","project":"Foundations","panels":[{"type":"Plotter Panel","name":"RSI-W 14","config":"{\n \"codeName\": \"\"\n}","project":"Foundations","panelData":[{"type":"Panel Data","name":"RSI-W14","config":"{\n \"valueDecimals\": 2\n}","project":"Foundations","dataFormula":{"type":"Data Formula","name":"New Data Formula","code":"record.value","project":"Foundations","id":"e65f0b5b-4579-4584-b58b-897c7c9c7aad","savedPayload":{"position":{"x":17960.21875,"y":18323.736743838686},"targetPosition":{"x":18060.21875,"y":18323.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"b0a1f908-aad9-4e31-95b7-fecf08315b68","savedPayload":{"position":{"x":18060.21875,"y":18323.736743838686},"targetPosition":{"x":18160.21875,"y":18323.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"534848ee-8d03-4555-8370-1df9044d283f","savedPayload":{"position":{"x":18160.21875,"y":18323.736743838686},"targetPosition":{"x":18260.21875,"y":18323.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":1,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"4045dbb5-77d9-46ed-837d-e05caded1a29","savedPayload":{"position":{"x":18260.21875,"y":18323.736743838686},"targetPosition":{"x":18485.21875,"y":18323.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{"isRunning":false,"shortcutKey":""}}}],"id":"31f1c7cf-fbde-446f-9921-793346e30c29","savedPayload":{"position":{"x":18472.21875,"y":18336.736743838686},"targetPosition":{"x":18922.21875,"y":18336.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Plotter","name":"Money Flow Index (MFI)","config":"{\n \"codeName\": \"Plotter MFI\"\n}","project":"Foundations","modules":[{"type":"Plotter Module","name":"MFI","config":"{ \n \"codeName\": \"Module-Name\", \n \"icon\": \"histogram|band|moving-average|oscillator|trend\"\n}","project":"Foundations","shapes":{"type":"Shapes","name":"New Shapes","project":"Foundations","chartPoints":[{"type":"Chart Points","name":"New Chart Points","project":"Foundations","points":[{"type":"Point","name":"New Point","project":"Foundations","pointFormula":{"type":"Point Formula","name":"New Point Formula","code":"x = record.begin\ny = record.property","project":"Foundations","id":"5e00d61b-c357-40dd-a0cf-a6d2fa76233d","savedPayload":{"position":{"x":18545.507318297008,"y":17873.736743838686},"targetPosition":{"x":18642.935176222756,"y":17817.486743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"a3fb852b-0aef-4518-a691-b6e9997a53e1","savedPayload":{"position":{"x":18642.935176222756,"y":17817.486743838686},"targetPosition":{"x":18740.363034148504,"y":17761.236743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"ca38b15d-e145-42c8-98a8-b0dbffc04720","savedPayload":{"position":{"x":18740.363034148504,"y":17761.236743838686},"targetPosition":{"x":18837.790892074252,"y":17704.986743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"polygons":[{"type":"Polygon","name":"New Polygon","project":"Foundations","polygonBody":{"type":"Polygon Body","name":"New Polygon Body","project":"Foundations","style":{"type":"Style","name":"New Style","config":" { \"default\": { \"opacity\": 0.2, \"lineWidth\": 1, \"lineDash\": [0,0], \"paletteColor\": \"UI_COLOR.DARK_TURQUOISE\" }, \"atMousePosition\": { \"opacity\": 0.3, \"lineWidth\": 2, \"lineDash\": [0,0], \"paletteColor\": \"UI_COLOR.RUSTED_RED\" }}","project":"Foundations","id":"bbc148c5-cfec-4cba-909c-29402cda8fb2","savedPayload":{"position":{"x":18612.790892074252,"y":17592.486743838686},"targetPosition":{"x":18725.290892074252,"y":17592.486743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"styleConditions":[],"id":"0d741cbf-553b-43e2-866c-414a637ac298","savedPayload":{"position":{"x":18725.290892074252,"y":17592.486743838686},"targetPosition":{"x":18837.790892074252,"y":17592.486743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"polygonBorder":{"type":"Polygon Border","name":"New Polygon Border","project":"Foundations","style":{"type":"Style","name":"New Style","config":" { \"default\": { \"opacity\": 0.2, \"lineWidth\": 1, \"lineDash\": [0,0], \"paletteColor\": \"UI_COLOR.DARK_TURQUOISE\" }, \"atMousePosition\": { \"opacity\": 0.3, \"lineWidth\": 2, \"lineDash\": [0,0], \"paletteColor\": \"UI_COLOR.RUSTED_RED\" }}","project":"Foundations","id":"06e0d64e-179d-4c28-a834-ac4cafba7147","savedPayload":{"position":{"x":18837.790892074252,"y":17367.486743838686},"targetPosition":{"x":18837.790892074252,"y":17479.986743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"styleConditions":[],"id":"da3b36a0-f339-4b35-b707-1e994704e0da","savedPayload":{"position":{"x":18837.790892074252,"y":17479.986743838686},"targetPosition":{"x":18837.790892074252,"y":17592.486743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"polygonVertexes":[{"type":"Polygon Vertex","name":"","project":"Foundations","id":"5ff95619-2158-48de-8c43-30a5009e4f47","savedPayload":{"position":{"x":18950.290892074252,"y":17592.486743838686},"targetPosition":{"x":18837.790892074252,"y":17592.486743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}}],"id":"915083b5-99cf-4abb-ac67-764bf1a9f26b","savedPayload":{"position":{"x":18837.790892074252,"y":17592.486743838686},"targetPosition":{"x":18837.790892074252,"y":17704.986743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"images":[],"texts":[],"id":"7afeb4e8-a789-4cfc-8394-a4253714891d","savedPayload":{"position":{"x":18837.790892074252,"y":17704.986743838686},"targetPosition":{"x":18935.21875,"y":17761.236743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"panels":[{"type":"Plotter Panel","name":"MFI","config":"{\n \"codeName\": \"\",\n \"isLegacy\": false\n}","project":"Foundations","panelData":[{"type":"Panel Data","name":"MFI","config":"{\n \"valueDecimals\": 2\n}","project":"Foundations","dataFormula":{"type":"Data Formula","name":"New Data Formula","code":"record.value","project":"Foundations","id":"53378fbb-eee0-4b7d-b771-ca2f9b813cde","savedPayload":{"position":{"x":19227.502323777244,"y":17592.486743838686},"targetPosition":{"x":19130.074465851496,"y":17648.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"8813ea4c-b38a-47f9-ae3e-d6c719246810","savedPayload":{"position":{"x":19130.074465851496,"y":17648.736743838686},"targetPosition":{"x":19032.646607925748,"y":17704.986743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"a4b4753e-e713-4bb2-9daa-cb7602e16e87","savedPayload":{"position":{"x":19032.646607925748,"y":17704.986743838686},"targetPosition":{"x":18935.21875,"y":17761.236743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"d10cdbe9-9416-490a-904e-ace49d0dfbf7","savedPayload":{"position":{"x":18935.21875,"y":17761.236743838686},"targetPosition":{"x":18935.21875,"y":17873.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":1,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"691c8481-d970-4eb0-a631-639bd1d53dd9","savedPayload":{"position":{"x":18922.21875,"y":17886.736743838686},"targetPosition":{"x":18922.21875,"y":18336.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"63655ecf-cd7d-4d65-a367-e976c00631d3","savedPayload":{"position":{"x":18922.21875,"y":18336.736743838686},"targetPosition":{"x":18922.21875,"y":18336.736743838686},"floatingObject":{"isPinned":true,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":4,"arrangementStyle":0},"uiObject":{"isRunning":false,"shortcutKey":"s"}}}
\ No newline at end of file
+{"type":"Data Mine","name":"Delta","config":"{\n \"codeName\": \"Delta\"\n}","project":"Foundations","sensorBots":[],"indicatorBots":[{"type":"Indicator Bot","name":"Relative Strength Index - Wilder Method (RSI-W)","config":"{\n \"codeName\": \"RSI-W\"\n}","project":"Foundations","processes":[{"type":"Process Definition","name":"Multi-Time-Frame-Market","config":"{\n \"codeName\": \"Multi-Time-Frame-Market\",\n \"description\": \"Calculates Wilder RSI.\",\n \"deadWaitTime\": 0,\n \"normalWaitTime\": 0,\n \"retryWaitTime\": 10000,\n \"sleepWaitTime\": 3600000,\n \"comaWaitTime\": 86400000,\n \"framework\": {\n \"name\": \"Multi-Time-Frame-Market\"\n }\n}","project":"Foundations","processOutput":{"type":"Process Output","name":"New Process Output","project":"Foundations","outputDatasets":[{"type":"Output Dataset","name":"Multi-Time-Frame-Market RSI-W14","project":"Foundations","id":"75881553-ec60-4954-9404-052ba11904f4","savedPayload":{"position":{"x":19646.18251638588,"y":17789.2053813897},"targetPosition":{"x":19675.299658959913,"y":17897.87203684722},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"a94722c3-a453-4f46-931f-aeb244e7cb66"}}}],"outputDatasetFolders":[],"id":"ffb59a7e-565a-4588-bd44-999a7cb66122","savedPayload":{"position":{"x":19675.299658959913,"y":17897.87203684722},"targetPosition":{"x":19704.416801533946,"y":18006.53869230474},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":1,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"processDependencies":{"type":"Process Dependencies","name":"New Process Dependencies","project":"Foundations","statusDependencies":[{"type":"Status Dependency","name":"Candles Volumes Multi-Time-Frame-Market","config":"{\n \"mainUtility\": \"Market Ending Point\"\n}","project":"Foundations","id":"b0af9801-ba4e-4bfd-a605-98d9ac121b5f","savedPayload":{"position":{"x":19650.151086682014,"y":17594.3496655382},"targetPosition":{"x":19762.651086682014,"y":17789.2053813897},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"a0a61ba9-91cb-4ec7-92fe-134ff079de2d"}}},{"type":"Status Dependency","name":"Relative Strength Index - Wilder Method (RSI-W) Multi-Time-Frame-Market","config":"{\n \"mainUtility\": \"Self Reference\"\n}","project":"Foundations","id":"02d64b4a-7c3c-4c89-918d-b3697b5955b2","savedPayload":{"position":{"x":19820.88537183008,"y":17571.87207047466},"targetPosition":{"x":19762.651086682014,"y":17789.2053813897},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"2b961dac-9f41-4eed-a495-4e55f26714c3"}}}],"dataDependencies":[{"type":"Data Dependency","name":"Candles Multi-Time-Frame-Market","project":"Foundations","id":"25315413-2e01-4a7d-83bc-1257d43f8fe6","savedPayload":{"position":{"x":19957.506802533513,"y":17676.7053813897},"targetPosition":{"x":19762.651086682014,"y":17789.2053813897},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"2b03494a-67d6-47f1-89b6-53fc4c9116a8"}}}],"dataMineDataDependencies":[],"id":"b14516a1-e5cc-48f8-ab0f-0e46faf6c41c","savedPayload":{"position":{"x":19762.651086682014,"y":17789.2053813897},"targetPosition":{"x":19704.416801533946,"y":18006.53869230474},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"statusReport":{"type":"Status Report","name":"New Status Report","project":"Foundations","id":"2b961dac-9f41-4eed-a495-4e55f26714c3","savedPayload":{"position":{"x":19863.51582730092,"y":17847.439666537768},"targetPosition":{"x":19704.416801533946,"y":18006.53869230474},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"executionStartedEvent":{"type":"Execution Started Event","name":"Candles Volumes Multi-Time-Frame-Market","project":"Foundations","id":"c1598823-e0b3-4036-8ad6-669ae0e3f638","savedPayload":{"position":{"x":19921.750112448986,"y":17948.304407156673},"targetPosition":{"x":19704.416801533946,"y":18006.53869230474},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Execution Finished Event","name":"New Execution Finished Event","id":"1824fa00-dd30-4cdc-acc0-01c2f29056c5"}}},"executionFinishedEvent":{"type":"Execution Finished Event","name":"New Execution Finished Event","project":"Foundations","id":"b317c309-4677-4a2a-ba2a-801fccd01b1d","savedPayload":{"position":{"x":19921.750112448986,"y":18064.77297745281},"targetPosition":{"x":19704.416801533946,"y":18006.53869230474},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"279a9122-7f94-47b4-bf09-999fa889104b","savedPayload":{"position":{"x":19690.416801533946,"y":18018.53869230474},"targetPosition":{"x":19372.21875,"y":18336.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Process Definition","name":"Multi-Time-Frame-Daily","config":"{\n \"codeName\": \"Multi-Time-Frame-Daily\",\n \"description\": \"Calculates Wilder RSI\",\n \"deadWaitTime\": 0,\n \"normalWaitTime\": 0,\n \"retryWaitTime\": 10000,\n \"sleepWaitTime\": 3600000,\n \"comaWaitTime\": 86400000,\n \"framework\": {\n \"name\": \"Multi-Time-Frame-Daily\"\n }\n}","project":"Foundations","processOutput":{"type":"Process Output","name":"New Process Output","project":"Foundations","outputDatasets":[{"type":"Output Dataset","name":"Multi-Time-Frame-Daily RSI-W14","project":"Foundations","id":"a902a032-dbcc-4f7f-8495-70f0f5da03f8","savedPayload":{"position":{"x":19167.963077267068,"y":19583.111743838686},"targetPosition":{"x":19081.360536888624,"y":19533.111743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Daily","id":"f6e7a28d-d3d8-4d05-b90f-40bbe5f59b8a"}}}],"outputDatasetFolders":[],"id":"02da2e0b-9593-485a-ae0d-3f4ff131c813","savedPayload":{"position":{"x":19081.360536888624,"y":19533.111743838686},"targetPosition":{"x":18935.21875,"y":19448.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":1,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"processDependencies":{"type":"Process Dependencies","name":"New Process Dependencies","project":"Foundations","statusDependencies":[{"type":"Status Dependency","name":"Candles Volumes Multi-Time-Frame-Daily","config":"{\"mainUtility\": \"Market Ending Point\"}","project":"Foundations","id":"3173726e-99f5-4153-acbd-17e0ca4c6dac","savedPayload":{"position":{"x":19608.369889686794,"y":20068.582247746013},"targetPosition":{"x":19272.71875,"y":20033.30389139318},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"2a021da8-9feb-475e-90ab-1586968c17c7"}}},{"type":"Status Dependency","name":"Exchange Raw Data Historic-OHLCVs","config":"{\n \"mainUtility\": \"Market Starting Point\"\n}","project":"Foundations","id":"56d255fa-7193-431f-a3c5-f98e6d28a508","savedPayload":{"position":{"x":19523.53012859862,"y":20259.135471039295},"targetPosition":{"x":19272.71875,"y":20033.30389139318},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"181c7c34-7243-497a-9ddb-1b0067c6d66e"}}},{"type":"Status Dependency","name":"Relative Strength Index - Wilder Method (RSI-W) Multi-Time-Frame-Daily","config":"{\n \"mainUtility\": \"Self Reference\"\n}","project":"Foundations","id":"b96ab1d1-3bdc-429d-921a-0aab94741d29","savedPayload":{"position":{"x":19342.888945650993,"y":20363.42870664084},"targetPosition":{"x":19272.71875,"y":20033.30389139318},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"8c1c40cf-dd93-4f61-b3f0-9344707b196d"}}}],"dataDependencies":[{"type":"Data Dependency","name":"Candles Multi-Time-Frame-Daily","project":"Foundations","id":"756f850b-7e37-4fc8-8031-b7c8458bc8c3","savedPayload":{"position":{"x":19135.44513296192,"y":20341.625483347558},"targetPosition":{"x":19272.71875,"y":20033.30389139318},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Daily","id":"678a567c-f08d-49b9-813b-4e54fd6afadb"}}}],"dataMineDataDependencies":[],"id":"c42ac621-a7d7-499a-84a0-76bd99ef3fa4","savedPayload":{"position":{"x":19272.71875,"y":20033.30389139318},"targetPosition":{"x":18935.21875,"y":19448.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"statusReport":{"type":"Status Report","name":"New Status Report","project":"Foundations","id":"8c1c40cf-dd93-4f61-b3f0-9344707b196d","savedPayload":{"position":{"x":18935.21875,"y":19786.236743838686},"targetPosition":{"x":18935.21875,"y":19448.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"executionStartedEvent":{"type":"Execution Started Event","name":"Candles Volumes Multi-Time-Frame-Daily","project":"Foundations","id":"1bf32fba-af6a-43eb-b0bb-2ac855bb5820","savedPayload":{"position":{"x":18766.46875,"y":19741.020317615934},"targetPosition":{"x":18935.21875,"y":19448.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Execution Finished Event","name":"New Execution Finished Event","id":"f29d08f9-e7c8-490c-8fca-14851a0d3dc3"}}},"executionFinishedEvent":{"type":"Execution Finished Event","name":"New Execution Finished Event","project":"Foundations","id":"ffcd3bc1-44f3-4e21-9f33-fc2f818494b5","savedPayload":{"position":{"x":18642.935176222752,"y":19617.486743838686},"targetPosition":{"x":18935.21875,"y":19448.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"a5c6c183-7b68-4e7c-82c2-27ac439b098d","savedPayload":{"position":{"x":20047.21875,"y":18336.736743838686},"targetPosition":{"x":19372.21875,"y":18336.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":4,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"products":[{"type":"Product Definition","name":"RSI-W14","config":"{\n \"codeName\": \"RSI-W14\",\n \"singularVariableName\": \"rsiw14\",\n \"pluralVariableName\": \"rsiw14s\"\n}","project":"Foundations","datasets":[{"type":"Dataset Definition","name":"Multi-Time-Frame-Daily","config":"{\n \"codeName\": \"Multi-Time-Frame-Daily\",\n \"type\": \"Daily Files\",\n \"validTimeFrames\": [\n \"45-min\",\n \"40-min\",\n \"30-min\",\n \"20-min\",\n \"15-min\",\n \"10-min\",\n \"05-min\",\n \"04-min\",\n \"03-min\",\n \"02-min\",\n \"01-min\"\n ],\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset/@TimeFrame/@Year/@Month/@Day\",\n \"fileName\": \"Data.json\",\n \"dataRange\": {\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset\",\n \"fileName\": \"Data.Range.json\"\n },\n \"timeFrames\": {\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset\",\n \"fileName\": \"Time.Frames.json\"\n }\n}","project":"Foundations","id":"f6e7a28d-d3d8-4d05-b90f-40bbe5f59b8a","savedPayload":{"position":{"x":19912.64667816785,"y":18619.73704073858},"targetPosition":{"x":19690.416801533946,"y":18654.934795372632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","config":"{\n \"codeName\": \"Multi-Time-Frame-Market\",\n \"type\": \"Market Files\",\n \"validTimeFrames\": [\n \"24-hs\",\n \"12-hs\",\n \"08-hs\",\n \"06-hs\",\n \"04-hs\",\n \"03-hs\",\n \"02-hs\",\n \"01-hs\"\n ],\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset/@TimeFrame\",\n \"fileName\": \"Data.json\",\n \"timeFrames\" : {\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset\",\n \"fileName\": \"Time.Frames.json\"\n }\n}","project":"Foundations","id":"a94722c3-a453-4f46-931f-aeb244e7cb66","savedPayload":{"position":{"x":19890.893269476328,"y":18757.08265781403},"targetPosition":{"x":19690.416801533946,"y":18654.934795372632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}}],"record":{"type":"Record Definition","name":"New Record Definition","project":"Foundations","properties":[{"type":"Record Property","name":"Begin","config":"{\n \"codeName\": \"begin\",\n \"isString\": false\n}","project":"Foundations","recordFormula":{"type":"Record Formula","name":"Begin","code":"record.current.begin","project":"Foundations","id":"5f2981e4-5b9a-4867-9bf4-79dd2b9c19f0","savedPayload":{"position":{"x":20108.700242583152,"y":19125.41655499176},"targetPosition":{"x":20001.706384499947,"y":19090.65214312458},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"a7c379ea-fc2f-4526-9a5f-fcdc272f6a02","savedPayload":{"position":{"x":20001.706384499947,"y":19090.65214312458},"targetPosition":{"x":19894.71252641674,"y":19055.887731257397},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":1,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Record Property","name":"End","config":"{\n \"codeName\": \"end\",\n \"isString\": false\n}","project":"Foundations","recordFormula":{"type":"Record Formula","code":"record.current.end","project":"Foundations","id":"ad4e0d6b-e7ce-4e09-88a6-a3f44d7c0c08","savedPayload":{"position":{"x":19996.860388858142,"y":19256.36419919978},"targetPosition":{"x":19945.78645763744,"y":19156.125965228588},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"a859a2ce-cd0a-43ae-995b-6140402a9f1a","savedPayload":{"position":{"x":19945.78645763744,"y":19156.125965228588},"targetPosition":{"x":19894.71252641674,"y":19055.887731257397},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":1,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Record Property","name":"Value","config":"{\n \"codeName\": \"value\",\n \"isString\": false\n}","project":"Foundations","recordFormula":{"type":"Record Formula","code":"variable.value","project":"Foundations","id":"43595088-af8f-4ad5-8bfe-3b04a5168681","savedPayload":{"position":{"x":19825.183702682378,"y":19269.87544742381},"targetPosition":{"x":19859.94811454956,"y":19162.881589340603},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"3cd01f28-dd1a-45bc-8c68-29bdbf4be84b","savedPayload":{"position":{"x":19859.94811454956,"y":19162.881589340603},"targetPosition":{"x":19894.71252641674,"y":19055.887731257397},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":1,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"ee7e6fb0-984c-410b-9ba7-241deddcd7ad","savedPayload":{"position":{"x":19894.71252641674,"y":19055.887731257397},"targetPosition":{"x":19690.416801533946,"y":18654.934795372632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"dataBuilding":{"type":"Data Building Procedure","name":"New Data Building Procedure","project":"Foundations","loop":{"type":"Procedure Loop","name":"New Procedure Loop","project":"Foundations","procedureJavascriptCode":{"type":"Procedure Javascript Code","code":"/* Loop Code */\n\n/* \nCalculation method credit: https://www.macroption.com/rsi-calculation/\n*/\n\n/* Calculating Up Moves and Down Moves */\n\n//let candle = record.current // Our main dependencies are candles \n//let candlePrevious = record.previous\n\nif (record.previous !== undefined) {\n if (record.current.close > record.previous.close) {\n variable.last14U.push(record.current.close - record.previous.close) // Add win to last 14 array.\n } else {\n variable.last14U.push(0) // Add 0 to keep proper count of records in the last 14 array.\n }\n \n if (record.current.close < record.previous.close) {\n variable.last14D.push(record.previous.close - record.current.close) // Add win to last 14 array.\n } else {\n variable.last14D.push(0) // Add 0 to keep proper count of records in the last 14 array.\n }\n \n if (variable.last14U.length > 14) {\n variable.last14U.splice(0, 1) // Remove the first element of the array to keep it at a maximun of 14 elements.\n }\n \n if (variable.last14D.length > 14) {\n variable.last14D.splice(0, 1) // Remove the first element of the array to keep it at a maximun of 14 elements.\n }\n \n /* Calculating Averages of Up Moves and Down Moves */\n\n variable.avgU = calculateRMAU(14)\n variable.avgD = calculateRMAD(14)\n\n /* Keep track of average moves */\n variable.rma14U.push(variable.avgU)\n variable.rma14D.push(variable.avgD)\n \n if (variable.rma14U.length > 14) {\n variable.rma14U.splice(0, 1) // Remove the first element of the array to keep it at a maximun of 14 elements.\n }\n \n if (variable.rma14D.length > 14) {\n variable.rma14D.splice(0, 1) // Remove the first element of the array to keep it at a maximun of 14 elements.\n }\n\n /* Calculating Relative Strength */\n \n if (variable.avgD > 0) {\n relativeStrength = variable.avgU / variable.avgD\n } else {\n relativeStrength = 0\n }\n\n /* Calculating RSI */\n\n relativeStrengthIndex = 100 - 100 / ( 1 + relativeStrength)\n\n if (relativeStrengthIndex !== undefined) {\n variable.value = relativeStrengthIndex.toFixed(2)\n } else {\n variable.value = 0\n }\n} else {\n variable.value = 0\n}\n\n// Statistics\n\nfunction calculateWMA(source, rmas, periods) { // Having a function avoids us to repeat code.\n /* We check we have enough values to make the calculation */\n if (source.length < periods) { return 0 } // If we dont, we define the value is zero.\n\n let alpha = 1 / periods\n let avg = source[source.length - 1] * alpha + rmas[rmas.length - 1] * (1 - alpha)\n return avg;\n}\n\nfunction calculateRMAU(periods) {\n return calculateWMA(variable.last14U, variable.rma14U, periods)\n}\n\nfunction calculateRMAD(periods) {\n return calculateWMA(variable.last14D, variable.rma14D, periods)\n}","project":"Foundations","id":"91eb76f0-617c-4397-9135-beca294a6481","savedPayload":{"position":{"x":19781.28686956123,"y":19519.505740564182},"targetPosition":{"x":19700.654080913537,"y":19309.450144602313},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"6957916d-b353-4b19-8b8f-cf7fb97024b3","savedPayload":{"position":{"x":19700.654080913537,"y":19309.450144602313},"targetPosition":{"x":19620.021292265843,"y":19099.394548640445},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"initialization":{"type":"Procedure Initialization","name":"New Procedure Initialization","project":"Foundations","procedureJavascriptCode":{"type":"Procedure Javascript Code","code":"/* Initialization Code*/\n\n/* \nWe keep two separate arrays to store last 14 price increments or losses.\n*/\n\nvariable.last14U = []\nvariable.last14D = []\nvariable.rma14U = []\nvariable.rma14D = []\n","project":"Foundations","id":"7b8d4dd2-2dde-47fe-8340-efd0f93fe435","savedPayload":{"position":{"x":19336.827116293414,"y":19449.110231296083},"targetPosition":{"x":19478.42420427963,"y":19274.252389968264},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"076ef281-1c67-4117-8168-a5beba487ffc","savedPayload":{"position":{"x":19478.42420427963,"y":19274.252389968264},"targetPosition":{"x":19620.021292265843,"y":19099.394548640445},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"a1ef81d6-c2c9-46c4-aaed-366b31b2d639","savedPayload":{"position":{"x":19620.021292265843,"y":19099.394548640445},"targetPosition":{"x":19690.416801533946,"y":18654.934795372632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"fbe3d4ba-bcfd-4cb1-91d1-64d7d381a21c","savedPayload":{"position":{"x":19690.416801533946,"y":18654.934795372632},"targetPosition":{"x":19372.21875,"y":18336.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Plotter Module","name":"RSI-W14","id":"4045dbb5-77d9-46ed-837d-e05caded1a29"}}}],"id":"1b49e818-f9f9-4ecc-bdbd-708f5641fb66","savedPayload":{"position":{"x":19372.21875,"y":18336.736743838686},"targetPosition":{"x":18922.21875,"y":18336.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Indicator Bot","name":"Money Flow Index (MFI)","config":"{\n \"codeName\": \"MFI\"\n}","project":"Foundations","processes":[{"type":"Process Definition","name":"Multi-Time-Frame-Daily","config":"{\n \"codeName\": \"Multi-Time-Frame-Daily\",\n \"description\": \"Calculates MFI\",\n \"deadWaitTime\": 0,\n \"normalWaitTime\": 0,\n \"retryWaitTime\": 10000,\n \"sleepWaitTime\": 3600000,\n \"comaWaitTime\": 86400000,\n \"framework\": {\n \"name\": \"Multi-Time-Frame-Daily\"\n }\n}","project":"Foundations","processOutput":{"type":"Process Output","name":"New Process Output","project":"Foundations","outputDatasets":[{"type":"Output Dataset","name":"Multi-Time-Frame-Daily MFI","project":"Foundations","id":"48a07111-4122-4d5c-a3ef-df4b138b6af7","savedPayload":{"position":{"x":19445.67603962037,"y":19049.935748288346},"targetPosition":{"x":19349.083456991466,"y":19075.8176527986},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Daily","id":"22edf2c6-b165-4b9e-b6ac-0cfefd9ee01b"}}}],"outputDatasetFolders":[],"id":"3c9355dd-ecf6-4604-b7f7-f6f1f8e784d6","savedPayload":{"position":{"x":19349.083456991466,"y":19075.8176527986},"targetPosition":{"x":19240.416801533946,"y":19104.934795372632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":1,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"processDependencies":{"type":"Process Dependencies","name":"New Process Dependencies","project":"Foundations","statusDependencies":[{"type":"Status Dependency","name":"Candles Volumes Multi-Time-Frame-Daily","config":"{\"mainUtility\": \"Market Ending Point\"}","project":"Foundations","id":"7867d355-9cd6-434e-90de-cd1f5f9ba32a","savedPayload":{"position":{"x":19537.299625332475,"y":19083.61956763721},"targetPosition":{"x":19457.750112448986,"y":19163.1690805207},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"2a021da8-9feb-475e-90ab-1586968c17c7"}}},{"type":"Status Dependency","name":"Exchange Raw Data Historic-OHLCVs","config":"{\n \"mainUtility\": \"Market Starting Point\"\n}","project":"Foundations","id":"bdf2cbd7-2cd6-4945-96b3-0609b3969d37","savedPayload":{"position":{"x":19566.416767906507,"y":19134.051937946668},"targetPosition":{"x":19457.750112448986,"y":19163.1690805207},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"181c7c34-7243-497a-9ddb-1b0067c6d66e"}}},{"type":"Status Dependency","name":"Money Flow Index (MFI) Multi-Time-Frame-Daily","config":"{\n \"mainUtility\": \"Self Reference\"\n}","project":"Foundations","id":"25380d29-c370-4b34-bcb6-55d94cab4a11","savedPayload":{"position":{"x":19566.416767906507,"y":19192.286223094732},"targetPosition":{"x":19457.750112448986,"y":19163.1690805207},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"218ce270-08fe-45a0-90ef-7189fffd72dd"}}}],"dataDependencies":[{"type":"Data Dependency","name":"Candles Multi-Time-Frame-Daily","project":"Foundations","id":"afdb16be-1eba-4ab0-aceb-9695b25ef435","savedPayload":{"position":{"x":19537.299625332475,"y":19242.718593404188},"targetPosition":{"x":19457.750112448986,"y":19163.1690805207},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Daily","id":"678a567c-f08d-49b9-813b-4e54fd6afadb"}}},{"type":"Data Dependency","name":"Volumes Multi-Time-Frame-Daily","project":"Foundations","id":"f26fa862-f8e1-480b-b9a3-fb8e001e3b8d","savedPayload":{"position":{"x":19486.86725502302,"y":19271.83573597822},"targetPosition":{"x":19457.750112448986,"y":19163.1690805207},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Daily","id":"2e683057-f911-4105-bc77-16f2706d1915"}}}],"dataMineDataDependencies":[],"id":"4704cf1b-133a-4e6e-8b97-bfece022354e","savedPayload":{"position":{"x":19457.750112448986,"y":19163.1690805207},"targetPosition":{"x":19240.416801533946,"y":19104.934795372632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"statusReport":{"type":"Status Report","name":"New Status Report","project":"Foundations","id":"218ce270-08fe-45a0-90ef-7189fffd72dd","savedPayload":{"position":{"x":19399.51582730092,"y":19264.033821139605},"targetPosition":{"x":19240.416801533946,"y":19104.934795372632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"executionStartedEvent":{"type":"Execution Started Event","name":"Candles Volumes Multi-Time-Frame-Daily","project":"Foundations","id":"30fcca1f-f72d-46cf-bd17-99f8e2e1cd10","savedPayload":{"position":{"x":19298.651086682014,"y":19322.268106287673},"targetPosition":{"x":19240.416801533946,"y":19104.934795372632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Execution Finished Event","name":"New Execution Finished Event","id":"f29d08f9-e7c8-490c-8fca-14851a0d3dc3"}}},"executionFinishedEvent":{"type":"Execution Finished Event","name":"New Execution Finished Event","project":"Foundations","id":"91f10f62-3cad-4709-8b90-31daceb01bd2","savedPayload":{"position":{"x":19182.182516385878,"y":19322.268106287673},"targetPosition":{"x":19240.416801533946,"y":19104.934795372632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"6be015e8-abd8-4c91-bc44-ed0dbe4401bf","savedPayload":{"position":{"x":19240.416801533946,"y":19104.934795372632},"targetPosition":{"x":18922.21875,"y":18786.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Process Definition","name":"Multi-Time-Frame-Market","config":"{\n \"codeName\": \"Multi-Time-Frame-Market\",\n \"description\": \"Calculates MFI.\",\n \"deadWaitTime\": 0,\n \"normalWaitTime\": 0,\n \"retryWaitTime\": 10000,\n \"sleepWaitTime\": 3600000,\n \"comaWaitTime\": 86400000,\n \"framework\": {\n \"name\": \"Multi-Time-Frame-Market\"\n }\n}","project":"Foundations","processOutput":{"type":"Process Output","name":"New Process Output","project":"Foundations","outputDatasets":[{"type":"Output Dataset","name":"Multi-Time-Frame-Market MFI","project":"Foundations","id":"c5c02f93-dacc-4e97-803b-45f1d3d7756c","savedPayload":{"position":{"x":19130.074465851496,"y":19336.236743838686},"targetPosition":{"x":19032.646607925748,"y":19279.986743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"f5f04930-c2a3-48b7-ade9-f98e148344f1"}}}],"outputDatasetFolders":[],"id":"a78ac5ae-14c4-4928-968b-604d5c78521c","savedPayload":{"position":{"x":19032.646607925748,"y":19279.986743838686},"targetPosition":{"x":18935.21875,"y":19223.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":1,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"processDependencies":{"type":"Process Dependencies","name":"New Process Dependencies","project":"Foundations","statusDependencies":[{"type":"Status Dependency","name":"Candles Volumes Multi-Time-Frame-Market","config":"{\n \"mainUtility\": \"Market Ending Point\"\n}","project":"Foundations","id":"226234a8-bb22-4f31-9446-ffee286446b4","savedPayload":{"position":{"x":19271.48617645786,"y":19442.111363925407},"targetPosition":{"x":19047.71875,"y":19418.592459690186},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"a0a61ba9-91cb-4ec7-92fe-134ff079de2d"}}},{"type":"Status Dependency","name":"Money Flow Index (MFI) Multi-Time-Frame-Market","config":"{\n \"mainUtility\": \"Self Reference\"\n}","project":"Foundations","id":"319ba4b4-77dc-412f-be3f-6fdb088f317c","savedPayload":{"position":{"x":19214.926335732413,"y":19569.14684612093},"targetPosition":{"x":19047.71875,"y":19418.592459690186},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"f4b09884-97e4-44e6-b0cf-3025c4cc44f9"}}}],"dataDependencies":[{"type":"Data Dependency","name":"Candles Multi-Time-Frame-Market","project":"Foundations","id":"39802ca4-ee03-42f3-a5a4-e805f787520b","savedPayload":{"position":{"x":19094.498880433996,"y":19638.675669855293},"targetPosition":{"x":19047.71875,"y":19418.592459690186},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"2b03494a-67d6-47f1-89b6-53fc4c9116a8"}}},{"type":"Data Dependency","name":"Volumes Multi-Time-Frame-Market","project":"Foundations","id":"9580ee4c-eb61-4133-91be-b9b8065cc74e","savedPayload":{"position":{"x":18956.203005307943,"y":19624.14018765977},"targetPosition":{"x":19047.71875,"y":19418.592459690186},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"9bf0483c-4825-4a46-9cf4-1b5262579fc1"}}}],"dataMineDataDependencies":[],"id":"871fab7f-2e97-4a8a-a771-0f4769c7b82d","savedPayload":{"position":{"x":19047.71875,"y":19418.592459690186},"targetPosition":{"x":18935.21875,"y":19223.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"statusReport":{"type":"Status Report","name":"New Status Report","project":"Foundations","id":"f4b09884-97e4-44e6-b0cf-3025c4cc44f9","savedPayload":{"position":{"x":18935.21875,"y":19448.736743838686},"targetPosition":{"x":18935.21875,"y":19223.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"executionStartedEvent":{"type":"Execution Started Event","name":"Candles Volumes Multi-Time-Frame-Market","project":"Foundations","id":"6319139b-bbb9-4250-831c-e57d8f8575c7","savedPayload":{"position":{"x":18822.71875,"y":19418.592459690186},"targetPosition":{"x":18935.21875,"y":19223.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Execution Finished Event","name":"New Execution Finished Event","id":"1824fa00-dd30-4cdc-acc0-01c2f29056c5"}}},"executionFinishedEvent":{"type":"Execution Finished Event","name":"New Execution Finished Event","project":"Foundations","id":"adadc3e2-074c-4429-b3d7-84592d6fd73a","savedPayload":{"position":{"x":18740.3630341485,"y":19336.236743838686},"targetPosition":{"x":18935.21875,"y":19223.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"b2d41186-2875-4058-8949-8acd8e5e8218","savedPayload":{"position":{"x":18922.21875,"y":19236.736743838686},"targetPosition":{"x":18922.21875,"y":18786.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"products":[{"type":"Product Definition","name":"MFI","config":"{\n \"codeName\": \"MFI\",\n \"singularVariableName\": \"mfi\",\n \"pluralVariableName\": \"mfis\"\n}","project":"Foundations","datasets":[{"type":"Dataset Definition","name":"Multi-Time-Frame-Daily","config":"{\n \"codeName\": \"Multi-Time-Frame-Daily\",\n \"type\": \"Daily Files\",\n \"validTimeFrames\": [\n \"45-min\",\n \"40-min\",\n \"30-min\",\n \"20-min\",\n \"15-min\",\n \"10-min\",\n \"05-min\",\n \"04-min\",\n \"03-min\",\n \"02-min\",\n \"01-min\"\n ],\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset/@TimeFrame/@Year/@Month/@Day\",\n \"fileName\": \"Data.json\",\n \"dataRange\": {\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset\",\n \"fileName\": \"Data.Range.json\"\n },\n \"timeFrames\": {\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset\",\n \"fileName\": \"Time.Frames.json\"\n }\n}","project":"Foundations","id":"22edf2c6-b165-4b9e-b6ac-0cfefd9ee01b","savedPayload":{"position":{"x":18639.218453100108,"y":19327.164672006536},"targetPosition":{"x":18604.020698466054,"y":19104.934795372632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","config":"{\n \"codeName\": \"Multi-Time-Frame-Market\",\n \"type\": \"Market Files\",\n \"validTimeFrames\": [\n \"24-hs\",\n \"12-hs\",\n \"08-hs\",\n \"06-hs\",\n \"04-hs\",\n \"03-hs\",\n \"02-hs\",\n \"01-hs\"\n ],\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset/@TimeFrame\",\n \"fileName\": \"Data.json\",\n \"timeFrames\" : {\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset\",\n \"fileName\": \"Time.Frames.json\"\n }\n}","project":"Foundations","id":"f5f04930-c2a3-48b7-ade9-f98e148344f1","savedPayload":{"position":{"x":18501.872836024657,"y":19305.411263315014},"targetPosition":{"x":18604.020698466054,"y":19104.934795372632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}}],"record":{"type":"Record Definition","name":"New Record Definition","project":"Foundations","properties":[{"type":"Record Property","name":"Begin","config":"{\n \"codeName\": \"begin\",\n \"isString\": false\n}","project":"Foundations","recordFormula":{"type":"Record Formula","name":"Begin","code":"record.current.begin","project":"Foundations","id":"3e93fd4c-c8d1-46f2-9097-409c0ae93699","savedPayload":{"position":{"x":18133.538938846927,"y":19523.21823642184},"targetPosition":{"x":18168.303350714108,"y":19416.224378338633},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"c1daf05e-b41f-4b76-9a2c-ce190c623b86","savedPayload":{"position":{"x":18168.303350714108,"y":19416.224378338633},"targetPosition":{"x":18203.06776258129,"y":19309.230520255427},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":1,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Record Property","name":"End","config":"{\n \"codeName\": \"end\",\n \"isString\": false\n}","project":"Foundations","recordFormula":{"type":"Record Formula","code":"record.current.end","project":"Foundations","id":"453226d1-0bef-4df3-93ed-68c914f8c5b5","savedPayload":{"position":{"x":18002.591294638907,"y":19411.37838269683},"targetPosition":{"x":18102.8295286101,"y":19360.304451476128},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"6326c213-145f-42f5-beb9-30b0426208da","savedPayload":{"position":{"x":18102.8295286101,"y":19360.304451476128},"targetPosition":{"x":18203.06776258129,"y":19309.230520255427},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":1,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Record Property","name":"Value","config":"{\n \"codeName\": \"value\",\n \"isString\": false\n}","project":"Foundations","recordFormula":{"type":"Record Formula","code":"variable.value","project":"Foundations","id":"f88be3cc-cb81-43db-8ee9-5eab5dc3833d","savedPayload":{"position":{"x":17989.080046414878,"y":19239.701696521064},"targetPosition":{"x":18096.073904498084,"y":19274.466108388246},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"ed8d0a42-0423-4c07-95dd-2453f6e49b83","savedPayload":{"position":{"x":18096.073904498084,"y":19274.466108388246},"targetPosition":{"x":18203.06776258129,"y":19309.230520255427},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":1,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"42782833-c816-4069-9d20-55cea2597ac0","savedPayload":{"position":{"x":18203.06776258129,"y":19309.230520255427},"targetPosition":{"x":18604.020698466054,"y":19104.934795372632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"dataBuilding":{"type":"Data Building Procedure","name":"New Data Building Procedure","project":"Foundations","loop":{"type":"Procedure Loop","name":"New Procedure Loop","project":"Foundations","procedureJavascriptCode":{"type":"Procedure Javascript Code","name":"New Procedure Javascript Code","code":"/* Loop Code */\nlet candle = record.current // This is the primary dependency\nlet volume = getElement('volumes', candle) // Here I get the volume bar corresponding to the current candle\nlet totalVolume = volume.buy + volume.sell // Candles Volumes split the volume received from the exchange evenly betwen buy and sell because it does not know how much of it there is.\n\nlet hlc3 = (candle.max + candle.min + candle.close) / 3\nlet lastHlc3 = variable.lastHlc3\n\nif (record.previous !== undefined) {\n\n let change = hlc3 - variable.lastHlc3\n\n variable.last14U.push(totalVolume * (change <= 0 ? 0 : hlc3))\n variable.last14D.push(totalVolume * (change >= 0 ? 0 : hlc3))\n \n if (variable.last14U.length > 14) {\n variable.last14U.splice(0, 1) // Remove the first element of the array to keep it at a maximun of 14 elements.\n }\n \n if (variable.last14D.length > 14) {\n variable.last14D.splice(0, 1) // Remove the first element of the array to keep it at a maximun of 14 elements.\n }\n\n let upper = variable.last14U.reduce(function(a, b){return a + b;}, 0);\n let lower = variable.last14D.reduce(function(a, b){return a + b;}, 0);\n\n let mfi\n\n if(lower == 0)\n mfi = 100\n else if(upper == 0)\n mfi = 0\n else // RSI\n mfi = 100 - (100 / (1 + upper / lower))\n\n if (mfi !== undefined) {\n variable.value = mfi.toFixed(2)\n } else {\n variable.value = 0\n }\n\n/*\n // Printing values to console to check\n console.log(\"HLC3: \", hlc3)\n console.log(\"Last HLC3: \", lastHlc3)\n console.log(\"Change: \", change)\n console.log(\"Upper: \", upper)\n console.log(\"Lower: \", lower)\n console.log(\"MFI: \", mfi)\n */\n\n} else {\n variable.value = 0\n}\n\nvariable.lastHlc3 = hlc3","project":"Foundations","id":"086b666c-f4d1-4167-a103-76b9d3eddf5f","savedPayload":{"position":{"x":17319.33856135076,"y":19357.070440695297},"targetPosition":{"x":17739.4497532745,"y":19195.804863399913},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"f29a8156-18e0-48cf-b0ee-0d54a1296dc4","savedPayload":{"position":{"x":17739.4497532745,"y":19195.804863399913},"targetPosition":{"x":18159.560945198242,"y":19034.53928610453},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"initialization":{"type":"Procedure Initialization","name":"New Procedure Initialization","project":"Foundations","procedureJavascriptCode":{"type":"Procedure Javascript Code","name":"New Procedure Javascript Code","code":"/* Initialization Code*/\n\nvariable.lastHlc3 = 0\nvariable.last14U = []\nvariable.last14D = []\n","project":"Foundations","id":"0255406d-ebc4-4841-aeb2-69bf3783a328","savedPayload":{"position":{"x":17460.129579886965,"y":18468.150934159672},"targetPosition":{"x":17809.845262542603,"y":18751.3451101321},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"8e1fc1c7-4306-4151-b4e7-cd155b4d7218","savedPayload":{"position":{"x":17809.845262542603,"y":18751.3451101321},"targetPosition":{"x":18159.560945198242,"y":19034.53928610453},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"7e8031b3-b8cb-43bd-8103-14e14e7be3a6","savedPayload":{"position":{"x":18159.560945198242,"y":19034.53928610453},"targetPosition":{"x":18604.020698466054,"y":19104.934795372632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"019b29d1-0227-4185-aee7-aaba499cdf93","savedPayload":{"position":{"x":18604.020698466054,"y":19104.934795372632},"targetPosition":{"x":18922.21875,"y":18786.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Plotter Module","name":"MFI","id":"d10cdbe9-9416-490a-904e-ace49d0dfbf7"}}}],"id":"c43b88dc-4ad9-4321-976d-374f98e2434b","savedPayload":{"position":{"x":18922.21875,"y":18786.736743838686},"targetPosition":{"x":18922.21875,"y":18336.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"plotters":[{"type":"Plotter","name":"Relative Strength Index - Wilder Method (RSI-W)","config":"{\n \"codeName\": \"Plotter RSI-W\"\n}","project":"Foundations","modules":[{"type":"Plotter Module","name":"RSI-W14","config":"{\n \"codeName\": \"RSI-W14\"\n}","project":"Foundations","panels":[{"type":"Plotter Panel","name":"RSI-W 14","config":"{\n \"codeName\": \"\"\n}","project":"Foundations","panelData":[{"type":"Panel Data","name":"RSI-W14","config":"{\n \"valueDecimals\": 2\n}","project":"Foundations","dataFormula":{"type":"Data Formula","name":"New Data Formula","code":"record.value","project":"Foundations","id":"e65f0b5b-4579-4584-b58b-897c7c9c7aad","savedPayload":{"position":{"x":17960.21875,"y":18323.736743838686},"targetPosition":{"x":18060.21875,"y":18323.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"b0a1f908-aad9-4e31-95b7-fecf08315b68","savedPayload":{"position":{"x":18060.21875,"y":18323.736743838686},"targetPosition":{"x":18160.21875,"y":18323.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"534848ee-8d03-4555-8370-1df9044d283f","savedPayload":{"position":{"x":18160.21875,"y":18323.736743838686},"targetPosition":{"x":18260.21875,"y":18323.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":1,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"4045dbb5-77d9-46ed-837d-e05caded1a29","savedPayload":{"position":{"x":18260.21875,"y":18323.736743838686},"targetPosition":{"x":18485.21875,"y":18323.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{"isRunning":false,"shortcutKey":""}}}],"id":"31f1c7cf-fbde-446f-9921-793346e30c29","savedPayload":{"position":{"x":18472.21875,"y":18336.736743838686},"targetPosition":{"x":18922.21875,"y":18336.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Plotter","name":"Money Flow Index (MFI)","config":"{\n \"codeName\": \"Plotter MFI\"\n}","project":"Foundations","modules":[{"type":"Plotter Module","name":"MFI","config":"{ \n \"codeName\": \"Module-Name\", \n \"icon\": \"histogram|band|moving-average|oscillator|trend\"\n}","project":"Foundations","shapes":{"type":"Shapes","name":"New Shapes","project":"Foundations","chartPoints":[{"type":"Chart Points","name":"New Chart Points","project":"Foundations","points":[{"type":"Point","name":"New Point","project":"Foundations","pointFormula":{"type":"Point Formula","name":"New Point Formula","code":"x = record.begin\ny = record.property","project":"Foundations","id":"5e00d61b-c357-40dd-a0cf-a6d2fa76233d","savedPayload":{"position":{"x":18545.507318297008,"y":17873.736743838686},"targetPosition":{"x":18642.935176222756,"y":17817.486743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"a3fb852b-0aef-4518-a691-b6e9997a53e1","savedPayload":{"position":{"x":18642.935176222756,"y":17817.486743838686},"targetPosition":{"x":18740.363034148504,"y":17761.236743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"ca38b15d-e145-42c8-98a8-b0dbffc04720","savedPayload":{"position":{"x":18740.363034148504,"y":17761.236743838686},"targetPosition":{"x":18837.790892074252,"y":17704.986743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"polygons":[{"type":"Polygon","name":"New Polygon","project":"Foundations","polygonBody":{"type":"Polygon Body","name":"New Polygon Body","project":"Foundations","style":{"type":"Style","name":"New Style","config":" { \"default\": { \"opacity\": 0.2, \"lineWidth\": 1, \"lineDash\": [0,0], \"paletteColor\": \"UI_COLOR.DARK_TURQUOISE\" }, \"atMousePosition\": { \"opacity\": 0.3, \"lineWidth\": 2, \"lineDash\": [0,0], \"paletteColor\": \"UI_COLOR.RUSTED_RED\" }}","project":"Foundations","id":"bbc148c5-cfec-4cba-909c-29402cda8fb2","savedPayload":{"position":{"x":18612.790892074252,"y":17592.486743838686},"targetPosition":{"x":18725.290892074252,"y":17592.486743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"styleConditions":[],"id":"0d741cbf-553b-43e2-866c-414a637ac298","savedPayload":{"position":{"x":18725.290892074252,"y":17592.486743838686},"targetPosition":{"x":18837.790892074252,"y":17592.486743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"polygonBorder":{"type":"Polygon Border","name":"New Polygon Border","project":"Foundations","style":{"type":"Style","name":"New Style","config":" { \"default\": { \"opacity\": 0.2, \"lineWidth\": 1, \"lineDash\": [0,0], \"paletteColor\": \"UI_COLOR.DARK_TURQUOISE\" }, \"atMousePosition\": { \"opacity\": 0.3, \"lineWidth\": 2, \"lineDash\": [0,0], \"paletteColor\": \"UI_COLOR.RUSTED_RED\" }}","project":"Foundations","id":"06e0d64e-179d-4c28-a834-ac4cafba7147","savedPayload":{"position":{"x":18837.790892074252,"y":17367.486743838686},"targetPosition":{"x":18837.790892074252,"y":17479.986743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"styleConditions":[],"id":"da3b36a0-f339-4b35-b707-1e994704e0da","savedPayload":{"position":{"x":18837.790892074252,"y":17479.986743838686},"targetPosition":{"x":18837.790892074252,"y":17592.486743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"polygonVertexes":[{"type":"Polygon Vertex","name":"","project":"Foundations","id":"5ff95619-2158-48de-8c43-30a5009e4f47","savedPayload":{"position":{"x":18950.290892074252,"y":17592.486743838686},"targetPosition":{"x":18837.790892074252,"y":17592.486743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}}],"id":"915083b5-99cf-4abb-ac67-764bf1a9f26b","savedPayload":{"position":{"x":18837.790892074252,"y":17592.486743838686},"targetPosition":{"x":18837.790892074252,"y":17704.986743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"images":[],"texts":[],"id":"7afeb4e8-a789-4cfc-8394-a4253714891d","savedPayload":{"position":{"x":18837.790892074252,"y":17704.986743838686},"targetPosition":{"x":18935.21875,"y":17761.236743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"panels":[{"type":"Plotter Panel","name":"MFI","config":"{\n \"codeName\": \"\",\n \"isLegacy\": false\n}","project":"Foundations","panelData":[{"type":"Panel Data","name":"MFI","config":"{\n \"valueDecimals\": 2\n}","project":"Foundations","dataFormula":{"type":"Data Formula","name":"New Data Formula","code":"record.value","project":"Foundations","id":"53378fbb-eee0-4b7d-b771-ca2f9b813cde","savedPayload":{"position":{"x":19227.502323777244,"y":17592.486743838686},"targetPosition":{"x":19130.074465851496,"y":17648.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"8813ea4c-b38a-47f9-ae3e-d6c719246810","savedPayload":{"position":{"x":19130.074465851496,"y":17648.736743838686},"targetPosition":{"x":19032.646607925748,"y":17704.986743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"a4b4753e-e713-4bb2-9daa-cb7602e16e87","savedPayload":{"position":{"x":19032.646607925748,"y":17704.986743838686},"targetPosition":{"x":18935.21875,"y":17761.236743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"d10cdbe9-9416-490a-904e-ace49d0dfbf7","savedPayload":{"position":{"x":18935.21875,"y":17761.236743838686},"targetPosition":{"x":18935.21875,"y":17873.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":1,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"691c8481-d970-4eb0-a631-639bd1d53dd9","savedPayload":{"position":{"x":18922.21875,"y":17886.736743838686},"targetPosition":{"x":18922.21875,"y":18336.736743838686},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"63655ecf-cd7d-4d65-a367-e976c00631d3","savedPayload":{"position":{"x":18922.21875,"y":18336.736743838686},"targetPosition":{"x":18922.21875,"y":18336.736743838686},"floatingObject":{"isPinned":true,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":4,"arrangementStyle":0},"uiObject":{"isRunning":false,"shortcutKey":"s"}}}
diff --git a/Projects/Foundations/Plugins/Tutorials/Creating Your User Profile Tutorial.json b/Projects/Foundations/Plugins/Tutorials/Creating Your User Profile Tutorial.json
new file mode 100644
index 000000000..cfd0a1e2a
--- /dev/null
+++ b/Projects/Foundations/Plugins/Tutorials/Creating Your User Profile Tutorial.json
@@ -0,0 +1,1677 @@
+{
+ "type": "Tutorial",
+ "name": "Creating Your User Profile Tutorial",
+ "config": "{\n \"icon\": {\n \"name\": \"governance\",\n \"project\": \"Governance\"\n },\n \"position\": \"Center\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Better Together\"\n },\n \"controlDocs\": {\n \"panel\": \"Open\",\n \"searchPage\": true,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n },\n \"codeName\": \"Creating Your User Profile Tutorial\"\n}",
+ "project": "Education",
+ "tutorialSteps": [],
+ "tutorialTopics": [
+ {
+ "type": "Tutorial Topic",
+ "name": "Before Starting",
+ "config": "{\n \"position\": \"Center\",\n \"slider\": \"toTop\",\n \"pressButton\": \"Next\"\n}",
+ "project": "Education",
+ "tutorialSteps": [
+ {
+ "type": "Tutorial Step",
+ "name": "Are You Ready?",
+ "config": "{\n \"icon\": {\n \"name\": \"Pool\\\\pools\",\n \"project\": \"Governance\"\n },\n \"position\": \"Center\",\n \"slider\": \"toTop\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Are You Ready?\"\n },\n \"controlDocs\": {\n \"panel\": \"Close\",\n \"closeTutorialEditor\": true,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n },\n \"positionAtReferenceParent\": true\n}",
+ "project": "Education",
+ "id": "7c13abc2-27e4-4fe6-afd8-14cbc0b65c7d",
+ "savedPayload": {
+ "position": {
+ "x": 17327,
+ "y": 30922.25
+ },
+ "targetPosition": {
+ "x": 17027,
+ "y": 30922.25
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ },
+ "referenceParent": {
+ "type": "Charting Space",
+ "name": "New Charting Space",
+ "id": "21d2ec55-9e56-4652-8e96-c7e451262c36"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "New Charting Space",
+ "Charting Space",
+ "Foundations",
+ "21d2ec55-9e56-4652-8e96-c7e451262c36"
+ ]
+ ]
+ }
+ }
+ ],
+ "tutorialTopics": [],
+ "id": "fb31f94d-8c05-4c1a-89b7-92d48946ad9e",
+ "savedPayload": {
+ "position": {
+ "x": 17027,
+ "y": 30922.25
+ },
+ "targetPosition": {
+ "x": 16727,
+ "y": 30922.25
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Topic",
+ "name": "Governance Overview",
+ "config": "{\n \"position\": \"Center\",\n \"slider\": \"toTop\",\n \"pressButton\": \"Next\"\n}",
+ "project": "Education",
+ "tutorialSteps": [
+ {
+ "type": "Tutorial Step",
+ "name": "One Token to Rule Them All",
+ "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\staking-program\",\n \"project\": \"Governance\"\n },\n \"position\": \"Center\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - One Token to Rule Them All\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n },\n \"positionAtReferenceParent\": true\n}",
+ "project": "Education",
+ "id": "33321959-1eb0-494c-8df3-94b1e47efdb3",
+ "savedPayload": {
+ "position": {
+ "x": 17239.132034355964,
+ "y": 31134.382034355964
+ },
+ "targetPosition": {
+ "x": 16939.132034355964,
+ "y": 31134.382034355964
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ },
+ "referenceParent": {
+ "type": "Workspace",
+ "name": "Custom Charts Tutorials",
+ "id": "7f5b5bd1-ed0d-4fc9-a4e9-42e69e57f351"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "With Tokens Comes Responsibility",
+ "config": "{\n \"icon\": {\n \"name\": \"governance\",\n \"project\": \"Governance\"\n },\n \"position\": \"Center\",\n \"slider\": \"toTop\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - With Tokens Comes Responsibility\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
+ "project": "Education",
+ "id": "a13ac48c-5743-4794-85bd-bf0794d9e1a2",
+ "savedPayload": {
+ "position": {
+ "x": 17151.264068711927,
+ "y": 31346.514068711927
+ },
+ "targetPosition": {
+ "x": 16939.132034355964,
+ "y": 31134.382034355964
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "A Mighty Meritocracy",
+ "config": "{\n \"icon\": {\n \"name\": \"Position\\\\positions\",\n \"project\": \"Governance\"\n },\n \"position\": \"Center\",\n \"slider\": \"toTop\",\n \"toggleMapView\": {\n \"view\": \"Off\"\n },\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - A Mighty Meritocracy\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n },\n \"positionAtReferenceParent\": true\n}",
+ "project": "Education",
+ "id": "d9b824fd-a201-40b8-8a60-d0c516d9634b",
+ "savedPayload": {
+ "position": {
+ "x": 16939.132034355964,
+ "y": 31434.382034355964
+ },
+ "targetPosition": {
+ "x": 16939.132034355964,
+ "y": 31134.382034355964
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ },
+ "referenceParent": {
+ "type": "Crypto Exchange",
+ "name": "Binance",
+ "id": "61ef0b8d-de6e-4e76-bdd5-996836760a4b"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "My Crypto Ecosystem",
+ "Crypto Ecosystem",
+ "Foundations",
+ "7217b56c-e854-4c06-8b8a-d5d3c05a153d"
+ ],
+ [
+ "Tested",
+ "Crypto Exchanges",
+ "Foundations",
+ "e3879d63-6f8f-41a3-8ac3-0349c4361722"
+ ],
+ [
+ "Binance",
+ "Crypto Exchange",
+ "Foundations",
+ "61ef0b8d-de6e-4e76-bdd5-996836760a4b"
+ ]
+ ]
+ }
+ }
+ ],
+ "tutorialTopics": [],
+ "id": "eca95394-e23c-4464-a0a2-955e45fd9ca5",
+ "savedPayload": {
+ "position": {
+ "x": 16956.813332935693,
+ "y": 31115.086282905962
+ },
+ "targetPosition": {
+ "x": 16727,
+ "y": 30922.25
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Topic",
+ "name": "Profile Overview",
+ "config": "{\n \"position\": \"Center\",\n \"slider\": \"toTop\",\n \"pressButton\": \"Next\"\n}",
+ "project": "Education",
+ "tutorialSteps": [
+ {
+ "type": "Tutorial Step",
+ "name": "What’s in a Profile?",
+ "config": "{\n \"icon\": {\n \"name\": \"User\\\\user-profile\",\n \"project\": \"Governance\"\n },\n \"position\": \"Center\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - What’s in a Profile?\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n },\n \"positionAtReferenceParent\": true\n}",
+ "project": "Education",
+ "id": "df575afd-af40-4725-a9a0-d0e3bdd64572",
+ "savedPayload": {
+ "position": {
+ "x": 16877,
+ "y": 31482.057621135333
+ },
+ "targetPosition": {
+ "x": 16727,
+ "y": 31222.25
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ },
+ "referenceParent": {
+ "type": "Charting Space",
+ "name": "New Charting Space",
+ "id": "21d2ec55-9e56-4652-8e96-c7e451262c36"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "New Charting Space",
+ "Charting Space",
+ "Foundations",
+ "21d2ec55-9e56-4652-8e96-c7e451262c36"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "Program Participation",
+ "config": "{\n \"icon\": {\n \"name\": \"User\\\\user-referrer\",\n \"project\": \"Governance\"\n },\n \"position\": \"Center\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Program Participation\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
+ "project": "Education",
+ "id": "1a414df9-32fa-4055-b0db-7a932e4b59e1",
+ "savedPayload": {
+ "position": {
+ "x": 16577,
+ "y": 31482.057621135333
+ },
+ "targetPosition": {
+ "x": 16727,
+ "y": 31222.25
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ }
+ ],
+ "tutorialTopics": [],
+ "id": "47f47947-70a9-48a6-88d0-bd3dae2be578",
+ "savedPayload": {
+ "position": {
+ "x": 16779.09445330008,
+ "y": 31217.692325903663
+ },
+ "targetPosition": {
+ "x": 16727,
+ "y": 30922.25
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Topic",
+ "name": "Setting Up the Constructor",
+ "config": "{\n \"position\": \"Right\",\n \"slider\": \"toTop\",\n \"pressButton\": \"Next\"\n}",
+ "project": "Education",
+ "tutorialSteps": [
+ {
+ "type": "Tutorial Step",
+ "name": "Where it all Begins",
+ "config": "{\n \"icon\": {\n \"name\": \"governance\",\n \"project\": \"Governance\"\n },\n \"position\": \"Right\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Where it all Begins\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n },\n \"positionAtReferenceParent\": true\n}",
+ "project": "Education",
+ "id": "9aec749c-46c8-45d0-99f4-f99ecd50ec44",
+ "savedPayload": {
+ "position": {
+ "x": 16514.867965644036,
+ "y": 31434.382034355964
+ },
+ "targetPosition": {
+ "x": 16514.867965644036,
+ "y": 31134.382034355964
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ },
+ "referenceParent": {
+ "type": "Governance Project",
+ "name": "New Governance Project",
+ "id": "db380c52-cf90-475b-87df-c005dd51cdf6"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "New Governance Project",
+ "Governance Project",
+ "Governance",
+ "db380c52-cf90-475b-87df-c005dd51cdf6"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "Profile in a Heartbeat",
+ "config": "{\n \"icon\": {\n \"name\": \"profile-constructor\",\n \"project\": \"Governance\"\n },\n \"position\": \"Right\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Profile in a Heartbeat\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
+ "project": "Education",
+ "id": "cdfada38-c5e0-4c0c-aaf5-4fa24b416131",
+ "savedPayload": {
+ "position": {
+ "x": 16302.735931288073,
+ "y": 31346.514068711927
+ },
+ "targetPosition": {
+ "x": 16514.867965644036,
+ "y": 31134.382034355964
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "Pump that Heartbeat!",
+ "config": "{\n \"icon\": {\n \"name\": \"configuration\",\n \"project\": \"Governance\"\n },\n \"position\": \"Right\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Pump that Heartbeat!\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false\n },\n \"positionAtReferenceParent\": true\n}",
+ "project": "Education",
+ "id": "651e15ce-bdda-4cca-9c2d-e16a2d900e45",
+ "savedPayload": {
+ "position": {
+ "x": 16214.867965644036,
+ "y": 31134.382034355964
+ },
+ "targetPosition": {
+ "x": 16514.867965644036,
+ "y": 31134.382034355964
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ },
+ "referenceParent": {
+ "type": "Time Machine",
+ "name": "Lightning Strike Backtesting Session My Computer Binanceus BTC/USDT",
+ "id": "72a1f250-0d0e-4354-8fdf-741866b9c16c"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "New Charting Space",
+ "Charting Space",
+ "Foundations",
+ "21d2ec55-9e56-4652-8e96-c7e451262c36"
+ ],
+ [
+ "Foundations",
+ "Project Dashboards",
+ "Foundations",
+ "2f92dce8-f804-40b6-9f4d-e605f4b4a55e"
+ ],
+ [
+ "Testing Trading Tasks My Computer",
+ "Dashboard",
+ "Foundations",
+ "b10709c9-2150-4055-a06e-1b9b8db2af55"
+ ],
+ [
+ "Lightning Strike Backtesting Session My Computer Binanceus BTC/USDT",
+ "Time Machine",
+ "Foundations",
+ "72a1f250-0d0e-4354-8fdf-741866b9c16c"
+ ]
+ ]
+ }
+ }
+ ],
+ "tutorialTopics": [],
+ "id": "1b7b5af2-bb52-4090-965e-cd457b2e229c",
+ "savedPayload": {
+ "position": {
+ "x": 16577,
+ "y": 31182.057621135333
+ },
+ "targetPosition": {
+ "x": 16727,
+ "y": 30922.25
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Topic",
+ "name": "Profile Deep Dive",
+ "config": "{\n \"position\": \"Right\",\n \"slider\": \"toTop\",\n \"pressButton\": \"Next\"\n}",
+ "project": "Education",
+ "tutorialSteps": [
+ {
+ "type": "Tutorial Step",
+ "name": "Oh so Shiny",
+ "config": "{\n \"icon\": {\n \"name\": \"User\\\\user-profile\",\n \"project\": \"Governance\"\n },\n \"position\": \"Right\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Oh so Shiny\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
+ "project": "Education",
+ "id": "a7929f0d-8dee-488c-b517-7ac95d2cb071",
+ "savedPayload": {
+ "position": {
+ "x": 16214.867965644036,
+ "y": 31134.382034355964
+ },
+ "targetPosition": {
+ "x": 16427,
+ "y": 30922.25
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ },
+ "referenceParent": {
+ "type": "Tutorial",
+ "name": "Creating Your User Profile Tutorial",
+ "id": "57e388d1-f479-4a16-af85-aee12be285a0"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Creating Your User Profile Tutorial",
+ "Tutorial",
+ "Education",
+ "57e388d1-f479-4a16-af85-aee12be285a0"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "Only You",
+ "config": "{\n \"icon\": {\n \"name\": \"User\\\\user-profile\",\n \"project\": \"Governance\"\n },\n \"position\": \"Right\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Only You\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
+ "project": "Education",
+ "id": "5ad27b7a-b482-44ca-a06d-8db0059d1eed",
+ "savedPayload": {
+ "position": {
+ "x": 16127,
+ "y": 30922.25
+ },
+ "targetPosition": {
+ "x": 16427,
+ "y": 30922.25
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "Under the Hood",
+ "config": "{\n \"icon\": {\n \"name\": \"User\\\\user-profile\",\n \"project\": \"Governance\"\n },\n \"position\": \"Right\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Under the Hood\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
+ "project": "Education",
+ "id": "577c1c57-88f8-4987-a1f1-f7ef10ace032",
+ "savedPayload": {
+ "position": {
+ "x": 16214.867965644036,
+ "y": 30710.117965644036
+ },
+ "targetPosition": {
+ "x": 16427,
+ "y": 30922.25
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ }
+ ],
+ "tutorialTopics": [],
+ "id": "9aaa02f8-73ec-4c89-b1ec-85d4114c5a93",
+ "savedPayload": {
+ "position": {
+ "x": 16445.092213764226,
+ "y": 31024.8560429977
+ },
+ "targetPosition": {
+ "x": 16727,
+ "y": 30922.25
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Topic",
+ "name": "Profile Backup",
+ "config": "{\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"Next\"\n}",
+ "project": "Education",
+ "tutorialSteps": [
+ {
+ "type": "Tutorial Step",
+ "name": "Save the Key!",
+ "config": "{\n \"icon\": {\n \"name\": \"Key\\\\key-reference\",\n \"project\": \"Foundations\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Save the Key!\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
+ "project": "Education",
+ "id": "4147bad2-0dd4-4082-bb5a-48a0bc84f595",
+ "savedPayload": {
+ "position": {
+ "x": 16214.867965644036,
+ "y": 30710.117965644036
+ },
+ "targetPosition": {
+ "x": 16514.867965644036,
+ "y": 30710.117965644036
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "Profile Backup",
+ "config": "{\n \"icon\": {\n \"name\": \"Exchange\\\\exchange-account-asset\",\n \"project\": \"Foundations\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Profile Backup\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
+ "project": "Education",
+ "id": "42cf8adb-7bee-4449-b8ab-ccc283e17796",
+ "savedPayload": {
+ "position": {
+ "x": 16302.735931288073,
+ "y": 30497.985931288073
+ },
+ "targetPosition": {
+ "x": 16514.867965644036,
+ "y": 30710.117965644036
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "Delete the Constructor",
+ "config": "{\n \"icon\": {\n \"name\": \"Docs\\\\docs-action-delete-paragraph\",\n \"project\": \"Foundations\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Delete the Constructor\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
+ "project": "Education",
+ "id": "9633816b-95cf-4b58-a231-504dd5e8e5ad",
+ "savedPayload": {
+ "position": {
+ "x": 16514.867965644036,
+ "y": 30410.117965644036
+ },
+ "targetPosition": {
+ "x": 16514.867965644036,
+ "y": 30710.117965644036
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ }
+ ],
+ "tutorialTopics": [],
+ "id": "ba99b336-1578-4a76-99f0-24e461922b4c",
+ "savedPayload": {
+ "position": {
+ "x": 16445.092213764226,
+ "y": 30819.6439570023
+ },
+ "targetPosition": {
+ "x": 16727,
+ "y": 30922.25
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Topic",
+ "name": "Add Onboarding Programs",
+ "config": "{\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"Next\"\n}",
+ "project": "Education",
+ "tutorialSteps": [
+ {
+ "type": "Tutorial Step",
+ "name": "Program Partners",
+ "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\onboarding-programs\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Program Partners\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
+ "project": "Education",
+ "id": "18c61fe9-3cc1-4f88-9499-b873fbcb9db0",
+ "savedPayload": {
+ "position": {
+ "x": 16277,
+ "y": 30662.442378864667
+ },
+ "targetPosition": {
+ "x": 16577,
+ "y": 30662.442378864667
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "Drop it like it’s Hot",
+ "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\airdrop-program\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Drop it like it’s Hot\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
+ "project": "Education",
+ "id": "7c1c466e-a5a4-4e67-94cb-6dc9e040f89b",
+ "savedPayload": {
+ "position": {
+ "x": 16317.192378864669,
+ "y": 30512.442378864667
+ },
+ "targetPosition": {
+ "x": 16577,
+ "y": 30662.442378864667
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "GitHub Glory",
+ "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\github-program\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - GitHub Glory\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
+ "project": "Education",
+ "id": "e580ebc9-097b-46d6-bb6d-145621548377",
+ "savedPayload": {
+ "position": {
+ "x": 16427,
+ "y": 30402.634757729335
+ },
+ "targetPosition": {
+ "x": 16577,
+ "y": 30662.442378864667
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "How Github Works",
+ "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\github-program\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - How Github Works\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
+ "project": "Education",
+ "id": "0c76a2d6-6d7b-49af-8072-ecb315e99939",
+ "savedPayload": {
+ "position": {
+ "x": 16577,
+ "y": 30362.442378864667
+ },
+ "targetPosition": {
+ "x": 16577,
+ "y": 30662.442378864667
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "Save Your Profile!",
+ "config": "{\n \"icon\": {\n \"name\": \"backup-entity\",\n \"project\": \"Foundations\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Save Your Profile!\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
+ "project": "Education",
+ "id": "782adca5-f889-4a72-a1b2-7bd3c07c283f",
+ "savedPayload": {
+ "position": {
+ "x": 16727,
+ "y": 30402.634757729335
+ },
+ "targetPosition": {
+ "x": 16577,
+ "y": 30662.442378864667
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ }
+ ],
+ "tutorialTopics": [],
+ "id": "578fdee3-64ad-4836-8feb-3e41746bceda",
+ "savedPayload": {
+ "position": {
+ "x": 16577,
+ "y": 30662.442378864667
+ },
+ "targetPosition": {
+ "x": 16727,
+ "y": 30922.25
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Topic",
+ "name": "Community building Programs",
+ "config": "{\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"Next\"\n}",
+ "project": "Education",
+ "tutorialSteps": [
+ {
+ "type": "Tutorial Step",
+ "name": "Low Hanging Fruit",
+ "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\community-building-programs\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Low Hanging Fruit\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
+ "project": "Education",
+ "id": "f4999bbd-e909-4ee4-9e1c-fd2cf26f6565",
+ "savedPayload": {
+ "position": {
+ "x": 16393.556244709704,
+ "y": 30297.15952167357
+ },
+ "targetPosition": {
+ "x": 16805.141679950117,
+ "y": 30479.086511144505
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "I'll Lay Out the Basics",
+ "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\community-building-programs\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - I'll Lay Out the Basics\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
+ "project": "Education",
+ "id": "76690c31-27d3-4445-9662-0d208d9462cb",
+ "savedPayload": {
+ "position": {
+ "x": 16449.05414776877,
+ "y": 30203.9471475031
+ },
+ "targetPosition": {
+ "x": 16805.141679950117,
+ "y": 30479.086511144505
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "The Referral Program",
+ "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\referral-program\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - The Referral Program\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
+ "project": "Education",
+ "id": "91ae8bac-cd43-4523-ae97-0921a646eab2",
+ "savedPayload": {
+ "position": {
+ "x": 16525.2465638727,
+ "y": 30126.724873056577
+ },
+ "targetPosition": {
+ "x": 16805.141679950117,
+ "y": 30479.086511144505
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "Declare Your Referrers",
+ "config": "{\n \"icon\": {\n \"name\": \"User\\\\user-referrer\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Declare Your Referrers\"\n },\n \"controlDocs\": {\n \"panel\": \"Close\",\n \"closeTutorialEditor\": true,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
+ "project": "Education",
+ "id": "2a1741e7-8eba-498d-95ab-8f05a0be8d69",
+ "savedPayload": {
+ "position": {
+ "x": 16617.705466745698,
+ "y": 30069.98057623328
+ },
+ "targetPosition": {
+ "x": 16805.141679950117,
+ "y": 30479.086511144505
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "Load the User Profile",
+ "config": "{\n \"icon\": {\n \"name\": \"User\\\\user-profile\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Load the User Profile\"\n },\n \"controlDocs\": {\n \"panel\": \"Open\",\n \"closeTutorialEditor\": true,\n \"page\": {\n \"project\": \"Governance\",\n \"category\": \"Topic\",\n \"type\": \"Load a User Profile\"\n }\n },\n \"positionAtReferenceParent\": true\n}",
+ "project": "Education",
+ "id": "b5829dc6-bf7b-433f-87ce-0e522f6d9075",
+ "savedPayload": {
+ "position": {
+ "x": 16721.057481027226,
+ "y": 30037.012029307458
+ },
+ "targetPosition": {
+ "x": 16805.141679950117,
+ "y": 30479.086511144505
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ },
+ "referenceParent": {
+ "type": "Plugin File",
+ "name": "Dummy",
+ "id": "6e9df29f-58fc-4e30-9882-5a083c30fdbe"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "New Plugins",
+ "Plugins",
+ "Foundations",
+ "bfb0b514-3b9f-4e9a-85ca-d0ca714b09f6"
+ ],
+ [
+ "Governance",
+ "Plugin Project",
+ "Foundations",
+ "63a93d05-d353-4b5f-a641-957e031b28a9"
+ ],
+ [
+ "New Plugin User Profiles",
+ "Plugin User Profiles",
+ "Governance",
+ "2c899fe9-1335-4e9f-b2d0-45a83e478fd0"
+ ],
+ [
+ "Dummy",
+ "Plugin File",
+ "Foundations",
+ "6e9df29f-58fc-4e30-9882-5a083c30fdbe"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "Reference the User Profile",
+ "config": "{\n \"icon\": {\n \"name\": \"delink-node\",\n \"project\": \"Foundations\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Reference the User Profile\"\n },\n \"controlDocs\": {\n \"panel\": \"Open\",\n \"closeTutorialEditor\": true,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"Topic\",\n \"type\": \"Establish and Remove References\"\n }\n }\n}",
+ "project": "Education",
+ "id": "a71596ed-e01d-4759-ac96-cc04a0652a32",
+ "savedPayload": {
+ "position": {
+ "x": 16829.29616331652,
+ "y": 30029.735244390642
+ },
+ "targetPosition": {
+ "x": 16805.141679950117,
+ "y": 30479.086511144505
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "Referral Token Awards",
+ "config": "{\n \"icon\": {\n \"name\": \"tokens-awarded\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Referral Token Awards\"\n },\n \"controlDocs\": {\n \"panel\": \"Open\",\n \"closeTutorialEditor\": true,\n \"page\": {\n \"project\": \"Governance\",\n \"category\": \"Node\",\n \"type\": \"Community Building Programs\"\n }\n }\n}",
+ "project": "Education",
+ "id": "a2d51952-bdaa-4085-852d-3e476e1a7466",
+ "savedPayload": {
+ "position": {
+ "x": 16936.131074830537,
+ "y": 30048.573121772166
+ },
+ "targetPosition": {
+ "x": 16805.141679950117,
+ "y": 30479.086511144505
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "Token Power Requirement",
+ "config": "{\n \"icon\": {\n \"name\": \"Exchange\\\\exchange-account-asset\",\n \"project\": \"Foundations\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Token Power Requirement\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
+ "project": "Education",
+ "id": "c9e918bc-1c41-4a0d-b9ac-605ed49770b8",
+ "savedPayload": {
+ "position": {
+ "x": 17035.35335884118,
+ "y": 30092.430872491506
+ },
+ "targetPosition": {
+ "x": 16805.141679950117,
+ "y": 30479.086511144505
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "Controlling Flows",
+ "config": "{\n \"icon\": {\n \"name\": \"Switches\\\\votes-switch\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Controlling Flows\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
+ "project": "Education",
+ "id": "75e9e063-062e-4e24-ad69-f3275105db1d",
+ "savedPayload": {
+ "position": {
+ "x": 17121.196576860082,
+ "y": 30158.759643493304
+ },
+ "targetPosition": {
+ "x": 16805.141679950117,
+ "y": 30479.086511144505
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "Controlling Flows",
+ "config": "{\n \"icon\": {\n \"name\": \"Exchange\\\\exchange-account-asset\",\n \"project\": \"Foundations\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - What Token Power?\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
+ "project": "Education",
+ "id": "6c97b37b-f8d8-4d0a-a871-3d560bd01b74",
+ "savedPayload": {
+ "position": {
+ "x": 17188.671833083383,
+ "y": 30243.704647702194
+ },
+ "targetPosition": {
+ "x": 16805.141679950117,
+ "y": 30479.086511144505
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "Support Your Supporters",
+ "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\support-program\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Support Your Supporters\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
+ "project": "Education",
+ "id": "5a607ee0-fe97-441f-902c-91281bf95d9e",
+ "savedPayload": {
+ "position": {
+ "x": 17233.85771088196,
+ "y": 30342.329190236094
+ },
+ "targetPosition": {
+ "x": 16805.141679950117,
+ "y": 30479.086511144505
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "Thank Your Mentors",
+ "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\mentorship-program\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Thank Your Mentors\"\n },\n \"controlDocs\": {\n \"panel\": \"Close\",\n \"closeTutorialEditor\": true,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
+ "project": "Education",
+ "id": "ebefe717-27b6-484a-b06a-ca6ca6c28260",
+ "savedPayload": {
+ "position": {
+ "x": 17254.128171282147,
+ "y": 30448.901571168553
+ },
+ "targetPosition": {
+ "x": 16805.141679950117,
+ "y": 30479.086511144505
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ }
+ ],
+ "tutorialTopics": [],
+ "id": "5b6febb1-6160-4c3a-bca1-5d2b47950a94",
+ "savedPayload": {
+ "position": {
+ "x": 16805.141679950117,
+ "y": 30479.086511144505
+ },
+ "targetPosition": {
+ "x": 16727,
+ "y": 30922.25
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 4,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Topic",
+ "name": "Submit Profile",
+ "config": "{\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"Next\"\n}",
+ "project": "Education",
+ "tutorialSteps": [
+ {
+ "type": "Tutorial Step",
+ "name": "Save Your Profile!",
+ "config": "{\n \"icon\": {\n \"name\": \"backup-entity\",\n \"project\": \"Foundations\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Save It Once More!\"\n },\n \"controlDocs\": {\n \"panel\": \"Close\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
+ "project": "Education",
+ "id": "eeea3c8c-a86b-4205-b835-4e386ecbebec",
+ "savedPayload": {
+ "position": {
+ "x": 16904.718879635613,
+ "y": 30433.971391190375
+ },
+ "targetPosition": {
+ "x": 16956.813332935693,
+ "y": 30729.413717094038
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "Make it Official",
+ "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\github-program\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Make it Official\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - GitHub.com Authentication\"\n }\n },\n \"positionAtReferenceParent\": true\n}",
+ "project": "Education",
+ "id": "fe74b3ae-9490-465a-a491-db4b0834dbf7",
+ "savedPayload": {
+ "position": {
+ "x": 17059.419375933394,
+ "y": 30447.505930858264
+ },
+ "targetPosition": {
+ "x": 16956.813332935693,
+ "y": 30729.413717094038
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ },
+ "referenceParent": {
+ "type": "Github API",
+ "name": "New Github API",
+ "id": "48c9ca95-3cc0-43a8-a522-27e812979800"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "New APIs",
+ "APIs",
+ "Foundations",
+ "e4e1b5e1-c1f6-45da-af08-32464d5b17f9"
+ ],
+ [
+ "New Github API",
+ "Github API",
+ "Foundations",
+ "48c9ca95-3cc0-43a8-a522-27e812979800"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "Infinity and Beyond",
+ "config": "{\n \"icon\": {\n \"name\": \"User\\\\user-profile\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - To Infinity and Beyond\"\n },\n \"controlDocs\": {\n \"panel\": \"Open\",\n \"closeTutorialEditor\": true,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
+ "project": "Education",
+ "id": "e4c5a34f-67c4-4fdc-8c11-aef5bde92d72",
+ "savedPayload": {
+ "position": {
+ "x": 17186.626665871387,
+ "y": 30536.577434188075
+ },
+ "targetPosition": {
+ "x": 16956.813332935693,
+ "y": 30729.413717094038
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "Welcome aboard!",
+ "config": "{\n \"icon\": {\n \"name\": \"Announcement\\\\announcement\",\n \"project\": \"Foundations\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Welcome aboard!\"\n },\n \"controlDocs\": {\n \"panel\": \"Open\",\n \"closeTutorialEditor\": true,\n \"page\": {\n \"project\": \"Governance\",\n \"category\": \"Topic\",\n \"type\": \"Building Your Profile\",\n \"anchor\": \"Import Private Key in a Wallet\"\n }\n },\n \"positionAtReferenceParent\": true\n}",
+ "project": "Education",
+ "id": "340f9107-9b4a-424b-94f2-79d65873c572",
+ "savedPayload": {
+ "position": {
+ "x": 17252.255658839356,
+ "y": 30677.319263793957
+ },
+ "targetPosition": {
+ "x": 16956.813332935693,
+ "y": 30729.413717094038
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ },
+ "referenceParent": {
+ "type": "Tutorial",
+ "name": "Governance Program Walk Through Tutorial",
+ "id": "eb85fbbd-080f-41c6-91a8-c6b68195a74b"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Governance Program Walk Through Tutorial",
+ "Tutorial",
+ "Education",
+ "eb85fbbd-080f-41c6-91a8-c6b68195a74b"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "Deep Governance",
+ "config": "{\n \"icon\": {\n \"name\": \"governance\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Deep Governance\"\n },\n \"controlDocs\": {\n \"panel\": \"Open\",\n \"closeTutorialEditor\": true,\n \"page\": {\n \"project\": \"Governance\",\n \"category\": \"Book\",\n \"type\": \"The Governance Project\"\n }\n },\n \"positionAtReferenceParent\": true\n}",
+ "project": "Education",
+ "id": "0450c241-07a8-44b7-9d5e-9be77861a624",
+ "savedPayload": {
+ "position": {
+ "x": 17238.721119171467,
+ "y": 30832.019760091738
+ },
+ "targetPosition": {
+ "x": 16956.813332935693,
+ "y": 30729.413717094038
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ },
+ "referenceParent": {
+ "type": "Tutorial",
+ "name": "Governance Program Walk Through Tutorial",
+ "id": "eb85fbbd-080f-41c6-91a8-c6b68195a74b"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Governance Program Walk Through Tutorial",
+ "Tutorial",
+ "Education",
+ "eb85fbbd-080f-41c6-91a8-c6b68195a74b"
+ ]
+ ]
+ }
+ }
+ ],
+ "tutorialTopics": [],
+ "id": "75373f58-ac05-4358-ad12-e50c88f08196",
+ "savedPayload": {
+ "position": {
+ "x": 16956.813332935693,
+ "y": 30729.413717094038
+ },
+ "targetPosition": {
+ "x": 16727,
+ "y": 30922.25
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ }
+ ],
+ "id": "57e388d1-f479-4a16-af85-aee12be285a0",
+ "savedPayload": {
+ "position": {
+ "x": 16727,
+ "y": 30922.25
+ },
+ "targetPosition": {
+ "x": 16727,
+ "y": 30922.25
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 1
+ },
+ "uiObject": {
+ "isPlaying": true,
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Done"
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Foundations/Plugins/Tutorials/Governance Program Walk Through Tutorial.json b/Projects/Foundations/Plugins/Tutorials/Governance Program Walk Through Tutorial.json
new file mode 100644
index 000000000..0ae6f17a9
--- /dev/null
+++ b/Projects/Foundations/Plugins/Tutorials/Governance Program Walk Through Tutorial.json
@@ -0,0 +1,251 @@
+{
+ "type": "Tutorial",
+ "name": "Governance Program Walk Through Tutorial",
+ "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\financial-programs\",\n \"project\": \"Governance\"\n },\n \"position\": \"Center\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Into the Thick of It\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
+ "project": "Education",
+ "tutorialSteps": [
+ {
+ "type": "Tutorial Step",
+ "name": "Refer a Friend",
+ "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\referral-program\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Refer a Friend\"\n },\n \"controlDocs\": {\n \"panel\": \"Open\",\n \"closeTutorialEditor\": true,\n \"page\": {\n \"project\": \"Governance\",\n \"category\": \"Topic\",\n \"type\": \"Referral Program Overview\"\n }\n }\n}",
+ "project": "Education",
+ "id": "a3df7ac4-69e0-41b9-af1c-fd0087d26161",
+ "savedPayload": {
+ "position": {
+ "x": 21016,
+ "y": 30930.750000000004
+ },
+ "targetPosition": {
+ "x": 20716,
+ "y": 30930.750000000004
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "A Thank You for Support",
+ "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\support-program\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - A Thank You for Support\"\n },\n \"controlDocs\": {\n \"panel\": \"Open\",\n \"closeTutorialEditor\": true,\n \"page\": {\n \"project\": \"Governance\",\n \"category\": \"Topic\",\n \"type\": \"Support Program Overview\"\n }\n }\n}",
+ "project": "Education",
+ "id": "dc20ebdc-6708-4fed-a75b-bade62d3ce0c",
+ "savedPayload": {
+ "position": {
+ "x": 20903.04694055762,
+ "y": 31165.299444740413
+ },
+ "targetPosition": {
+ "x": 20716,
+ "y": 30930.750000000004
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "Find a Mentor",
+ "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\mentorship-program\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Find a Mentor\"\n },\n \"controlDocs\": {\n \"panel\": \"Open\",\n \"closeTutorialEditor\": true,\n \"page\": {\n \"project\": \"Governance\",\n \"category\": \"Topic\",\n \"type\": \"Mentorship Program Overview\"\n }\n }\n}",
+ "project": "Education",
+ "id": "258b83f3-200d-41d7-8288-81eec5da0ccf",
+ "savedPayload": {
+ "position": {
+ "x": 20649.243719813105,
+ "y": 31223.22837365455
+ },
+ "targetPosition": {
+ "x": 20716,
+ "y": 30930.750000000004
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "Claim some Contributions",
+ "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\claims-program\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Claim some Contributions\"\n },\n \"controlDocs\": {\n \"panel\": \"Open\",\n \"closeTutorialEditor\": true,\n \"page\": {\n \"project\": \"Governance\",\n \"category\": \"Topic\",\n \"type\": \"Contribution Claims Program Overview\"\n }\n }\n}",
+ "project": "Education",
+ "id": "7301eace-be0a-45f8-9f8d-14afb7e9336a",
+ "savedPayload": {
+ "position": {
+ "x": 20445.709339629273,
+ "y": 31060.91512173527
+ },
+ "targetPosition": {
+ "x": 20716,
+ "y": 30930.750000000004
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "Lend a Vote",
+ "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\voting-program\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Lend a Vote\"\n },\n \"controlDocs\": {\n \"panel\": \"Open\",\n \"closeTutorialEditor\": true,\n \"page\": {\n \"project\": \"Governance\",\n \"category\": \"Topic\",\n \"type\": \"Voting Program Overview\"\n }\n }\n}",
+ "project": "Education",
+ "id": "61b34c29-85ce-4b86-8a77-21f8e8888c35",
+ "savedPayload": {
+ "position": {
+ "x": 20445.709339629273,
+ "y": 30800.584878264737
+ },
+ "targetPosition": {
+ "x": 20716,
+ "y": 30930.750000000004
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "Delegate some Power",
+ "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\delegation-program\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Delegate some Power\"\n },\n \"controlDocs\": {\n \"panel\": \"Open\",\n \"closeTutorialEditor\": true,\n \"page\": {\n \"project\": \"Governance\",\n \"category\": \"Topic\",\n \"type\": \"Delegation Program Overview\"\n }\n }\n}",
+ "project": "Education",
+ "id": "bb0b161f-af82-4b93-87a8-30ae6ace533c",
+ "savedPayload": {
+ "position": {
+ "x": 20649.243719813105,
+ "y": 30638.271626345457
+ },
+ "targetPosition": {
+ "x": 20716,
+ "y": 30930.750000000004
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ },
+ {
+ "type": "Tutorial Step",
+ "name": "Stake some Tokens",
+ "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\staking-program\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Stake some Tokens\"\n },\n \"controlDocs\": {\n \"panel\": \"Open\",\n \"closeTutorialEditor\": true,\n \"page\": {\n \"project\": \"Governance\",\n \"category\": \"Topic\",\n \"type\": \"Staking Program Overview\"\n }\n }\n}",
+ "project": "Education",
+ "id": "507fc893-7a06-4bba-ba23-fb7125aa2017",
+ "savedPayload": {
+ "position": {
+ "x": 20903.04694055762,
+ "y": 30696.200555259595
+ },
+ "targetPosition": {
+ "x": 20716,
+ "y": 30930.750000000004
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Reset"
+ }
+ }
+ }
+ ],
+ "tutorialTopics": [],
+ "id": "eb85fbbd-080f-41c6-91a8-c6b68195a74b",
+ "savedPayload": {
+ "position": {
+ "x": 20716,
+ "y": 30930.750000000004
+ },
+ "targetPosition": {
+ "x": 20716,
+ "y": 30930.750000000004
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 1
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "tutorial": {
+ "status": "Done"
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Foundations/SA/Utilities/FilesAndDirectories.js b/Projects/Foundations/SA/Utilities/FilesAndDirectories.js
new file mode 100644
index 000000000..2f7bc485b
--- /dev/null
+++ b/Projects/Foundations/SA/Utilities/FilesAndDirectories.js
@@ -0,0 +1,54 @@
+exports.newFoundationsUtilitiesFilesAndDirectories = function () {
+
+ let thisObject = {
+ getDirectories: getDirectories,
+ getAllFilesInDirectoryAndSubdirectories: getAllFilesInDirectoryAndSubdirectories
+ }
+
+ return thisObject
+
+ function getDirectories(path) {
+ try {
+ const fs = SA.nodeModules.fs
+ return fs.readdirSync(path).filter(function (file) {
+ return fs.statSync(path + '/' + file).isDirectory();
+ });
+ } catch (err) {
+ return []
+ }
+ }
+
+ function getAllFilesInDirectoryAndSubdirectories(dir, callback) {
+ const { promisify } = require('util');
+ const { resolve } = require('path');
+ const fs = SA.nodeModules.fs;
+ const readdir = promisify(fs.readdir);
+ const stat = promisify(fs.stat);
+
+ getFiles(dir)
+ .then(files => {
+ let splittedDir = dir.split('/')
+ let lastFolder = splittedDir[splittedDir.length - 2]
+ let pathAndNames = []
+ for (let i = 0; i < files.length; i++) {
+ let file = files[i]
+ let pathName = file.substring(file.indexOf(lastFolder) + lastFolder.length, file.length)
+ pathName = pathName.substring(1, pathName.length)
+ pathAndNames.push(pathName)
+ }
+ callback(pathAndNames)
+ })
+ .catch(e => {
+ callback([])
+ });
+
+ async function getFiles(dir) {
+ const subdirs = await readdir(dir);
+ const files = await Promise.all(subdirs.map(async (subdir) => {
+ const res = resolve(dir, subdir);
+ return (await stat(res)).isDirectory() ? getFiles(res) : res;
+ }));
+ return files.reduce((a, f) => a.concat(f), []);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Foundations/SA/Utilities/HttpRequests.js b/Projects/Foundations/SA/Utilities/HttpRequests.js
new file mode 100644
index 000000000..4397491a6
--- /dev/null
+++ b/Projects/Foundations/SA/Utilities/HttpRequests.js
@@ -0,0 +1,35 @@
+exports.newFoundationsUtilitiesHttpRequests = function () {
+
+ let thisObject = {
+ getRequestBody: getRequestBody
+ }
+
+ return thisObject
+
+ function getRequestBody(httpRequest, callback) { // Gets the de body from a POST httpRequest to the web server
+ try {
+
+ let body = ''
+
+ httpRequest.on('data', function (data) {
+ body += data
+ // Too much POST data
+ //if (body.length > 1e6) {
+ // httpRequest.connection.destroy()
+ //}
+ })
+
+ httpRequest.on('end', function () {
+ callback(body)
+ })
+
+ httpRequest.on('error', function (err) {
+ console.log('[ERROR] getBody -> err.stack = ' + err.stack)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ })
+ } catch (err) {
+ console.log('[ERROR] getBody -> err.stack = ' + err.stack)
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Foundations/SA/Utilities/HttpResponses.js b/Projects/Foundations/SA/Utilities/HttpResponses.js
new file mode 100644
index 000000000..b12f7c458
--- /dev/null
+++ b/Projects/Foundations/SA/Utilities/HttpResponses.js
@@ -0,0 +1,215 @@
+exports.newFoundationsUtilitiesHttpResponses = function () {
+
+ let thisObject = {
+ respondWithFile: respondWithFile,
+ respondWithContent: respondWithContent,
+ respondWithImage: respondWithImage,
+ respondWithFont: respondWithFont,
+ respondWithEmptyArray: respondWithEmptyArray,
+ respondWithStyleSheet: respondWithStyleSheet,
+ respondWithProjectFolderFileList: respondWithProjectFolderFileList,
+ respondWithWebFile: respondWithWebFile
+ }
+
+ return thisObject
+
+ function respondWithFile(fileName, httpResponse) {
+ let fs = SA.nodeModules.fs
+ if (fileName.indexOf('undefined') > 0) {
+ console.log('[WRN] respondWithFile -> Received httpRequest for undefined file. ')
+ respondWithContent(undefined, httpResponse)
+ } else {
+ try {
+ fs.readFile(fileName, onFileRead)
+
+ function onFileRead(err, file) {
+ if (!err) {
+ respondWithContent(file.toString(), httpResponse)
+ } else {
+ //console.log('File requested not found: ' + fileName)
+ respondWithContent(undefined, httpResponse)
+ }
+ }
+ } catch (err) {
+ respondWithEmptyArray(httpResponse)
+ }
+ }
+ }
+
+ function respondWithContent(content, httpResponse, contentType) {
+ try {
+ httpResponse.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate') // HTTP 1.1.
+ httpResponse.setHeader('Pragma', 'no-cache') // HTTP 1.0.
+ httpResponse.setHeader('Expires', '0') // Proxies.
+ httpResponse.setHeader('Access-Control-Allow-Origin', '*') // Allows to access data from other domains.
+
+ if (content !== undefined) {
+ if (contentType !== undefined) {
+ httpResponse.writeHead(200, { 'Content-Type': contentType })
+ } else {
+ httpResponse.writeHead(200, { 'Content-Type': 'text/html' })
+ }
+ httpResponse.write(content)
+ } else {
+ httpResponse.writeHead(404, { 'Content-Type': 'text/html' })
+ httpResponse.write('The specified key does not exist.')
+ }
+ httpResponse.end('\n')
+ } catch (err) {
+ respondWithEmptyArray(httpResponse)
+ }
+ }
+
+ function respondWithImage(fileName, httpResponse) {
+ let fs = SA.nodeModules.fs
+ fs.readFile(fileName, onFileRead)
+
+ function onFileRead(err, file) {
+ if (err) {
+ console.log('[ERROR] respondWithImage -> Image Not Found: ' + fileName + ' or Error = ' + err.stack)
+ return
+ }
+
+ httpResponse.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate') // HTTP 1.1.
+ httpResponse.setHeader('Pragma', 'no-cache') // HTTP 1.0.
+ httpResponse.setHeader('Expires', '0') // Proxies.
+ httpResponse.setHeader('Access-Control-Allow-Origin', '*') // Allows to access data from other domains.
+
+ httpResponse.writeHead(200, { 'Content-Type': 'image/png' })
+ httpResponse.end(file, 'binary')
+ }
+ }
+
+ function respondWithFont(fileName, httpResponse) {
+ let fs = SA.nodeModules.fs
+ fs.readFile(fileName, onFileRead)
+
+ function onFileRead(err, file) {
+ if (err) {
+ console.log('[ERROR] respondWithFont -> File Not Found: ' + fileName + ' or Error = ' + err.stack)
+ return
+ }
+ httpResponse.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate') // HTTP 1.1.
+ httpResponse.setHeader('Pragma', 'no-cache') // HTTP 1.0.
+ httpResponse.setHeader('Expires', '0') // Proxies.
+ httpResponse.setHeader('Access-Control-Allow-Origin', '*') // Allows to access data from other domains.
+
+ if (fileName.indexOf('2') < 0) {
+ httpResponse.writeHead(200, { 'Content-Type': 'font/woff' })
+ } else {
+ httpResponse.writeHead(200, { 'Content-Type': 'font/woff2' })
+ }
+ httpResponse.end(file, 'binary')
+ }
+ }
+
+ function respondWithEmptyArray(httpResponse) {
+ httpResponse.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate') // HTTP 1.1.
+ httpResponse.setHeader('Pragma', 'no-cache') // HTTP 1.0.
+ httpResponse.setHeader('Expires', '0') // Proxies.
+
+ httpResponse.writeHead(200, { 'Content-Type': 'text/html' })
+ httpResponse.write('[]')
+ httpResponse.end('\n')
+ }
+
+ function respondWithStyleSheet(httpResponse, pathToApp, fileName) {
+ let fs = SA.nodeModules.fs
+ let filePath = pathToApp + '/WebServer/css/' + fileName
+ fs.readFile(filePath, onFileRead)
+
+ function onFileRead(err, file) {
+ try {
+ let fileContent = file.toString()
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(fileContent, httpResponse, 'text/css')
+ } catch (err) {
+ console.log('[ERROR] respondWithStyleSheet -> File Not Found: ' + fileName + ' or Error = ' + err.stack)
+ }
+ }
+ }
+
+ function respondWithProjectFolderFileList(httpResponse, projectFolderName, rootObjectName) {
+ {
+ let allLibraries = []
+ let projects = SA.projects.foundations.utilities.filesAndDirectories.getDirectories(global.env.PATH_TO_PROJECTS)
+ let projectsCount = 0
+
+ for (let i = 0; i < projects.length; i++) {
+ let project = projects[i]
+
+ let dirPath = global.env.PATH_TO_PROJECTS + '/' + project + '/' + rootObjectName + '/' + projectFolderName
+ try {
+ let fs = SA.nodeModules.fs
+ fs.readdir(dirPath, onDirRead)
+
+ function onDirRead(err, fileList) {
+ let updatedFileList = []
+ if (err) {
+ /*
+ If we have a problem reading this folder we will assume that it is
+ because this project does not need this folder and that's it.
+ */
+ } else {
+ for (let i = 0; i < fileList.length; i++) {
+ let name = fileList[i]
+ updatedFileList.push([project, name])
+ }
+ }
+ allLibraries = allLibraries.concat(updatedFileList)
+ projectsCount++
+ if (projectsCount === projects.length) {
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(allLibraries), httpResponse)
+ }
+ }
+ } catch (err) {
+ console.log('[ERROR] returnProjectFolderFileList -> Error reading a directory content. filePath = ' + dirPath)
+ console.log('[ERROR] returnProjectFolderFileList -> err.stack = ' + err.stack)
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
+ return
+ }
+ }
+ }
+ }
+
+ function respondWithWebFile(httpResponse, fileNameReceived, pathToApp) {
+
+ if (fileNameReceived === '') {
+ /*
+ When there is no endpoint specidied we will respond with this app's Home Page.
+ */
+ let fs = SA.nodeModules.fs
+
+ let fileName = pathToApp + '/WebServer/index.html'
+
+ fs.readFile(fileName, onFileRead)
+
+ function onFileRead(err, file) {
+
+ let fileContent = file.toString()
+
+ SA.projects.foundations.utilities.httpResponses.respondWithContent(fileContent, httpResponse)
+ }
+ } else {
+ /*
+ When there is a parameter but it does not match any of the available endpoints, we
+ will serve the file with the same name at at a location that depends on it's file extention.
+ */
+ let completeFileName = fileNameReceived
+ let fileExtension = completeFileName.split('.')[1]
+
+ switch (fileExtension) {
+ case 'js': {
+ let path = pathToApp + '/UI/' + completeFileName
+ SA.projects.foundations.utilities.httpResponses.respondWithFile(path, httpResponse)
+ break
+ }
+ case 'css': {
+ SA.projects.foundations.utilities.httpResponses.respondWithStyleSheet(httpResponse, pathToApp, completeFileName)
+ break
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Foundations/SA/Utilities/MiscellaneousFunctions.js b/Projects/Foundations/SA/Utilities/MiscellaneousFunctions.js
new file mode 100644
index 000000000..27c00cff2
--- /dev/null
+++ b/Projects/Foundations/SA/Utilities/MiscellaneousFunctions.js
@@ -0,0 +1,15 @@
+exports.newFoundationsUtilitiesMiscellaneousFunctions = function () {
+
+ let thisObject = {
+ genereteUniqueId: genereteUniqueId
+ }
+
+ return thisObject
+
+ function genereteUniqueId() {
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
+ var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8)
+ return v.toString(16)
+ })
+ }
+}
\ No newline at end of file
diff --git a/Projects/Foundations/CL/Utilities/Plugins.js b/Projects/Foundations/SA/Utilities/Plugins.js
similarity index 91%
rename from Projects/Foundations/CL/Utilities/Plugins.js
rename to Projects/Foundations/SA/Utilities/Plugins.js
index bc149c038..7998febf6 100644
--- a/Projects/Foundations/CL/Utilities/Plugins.js
+++ b/Projects/Foundations/SA/Utilities/Plugins.js
@@ -12,7 +12,7 @@ exports.newFoundationsUtilitiesPlugins = function () {
let path = global.env.PATH_TO_PROJECTS + '/' + project + '/Plugins/' + folder
- CL.nodeModules.fs.readdir(path, (err, files) => {
+ SA.nodeModules.fs.readdir(path, (err, files) => {
if (err) {
reject()
return
@@ -33,7 +33,7 @@ exports.newFoundationsUtilitiesPlugins = function () {
let path = global.env.PATH_TO_PROJECTS + '/' + project + '/Plugins/' + folder + '/' + fileName
- CL.nodeModules.fs.readFile(path, onFileRead)
+ SA.nodeModules.fs.readFile(path, onFileRead)
function onFileRead(err, file) {
if (err) {
diff --git a/Projects/Foundations/Schemas/Docs-Concepts/S/Superalgos/Superalgos-Medium-Blog/superalgos-medium-blog.json b/Projects/Foundations/Schemas/Docs-Concepts/S/Superalgos/Superalgos-Medium-Blog/superalgos-medium-blog.json
new file mode 100644
index 000000000..fbd319ece
--- /dev/null
+++ b/Projects/Foundations/Schemas/Docs-Concepts/S/Superalgos/Superalgos-Medium-Blog/superalgos-medium-blog.json
@@ -0,0 +1,14 @@
+{
+ "type": "Superalgos Medium Blog",
+ "definition": {
+ "text": "The Superalgos Medium Blog is a Medium Publication where the Superalgos Project makes official announcements and publishes project-related content.",
+ "updated": 1630235403524
+ },
+ "paragraphs": [
+ {
+ "style": "Link",
+ "text": "Go to the Superalgos Medium Blog->medium.com/superalgos",
+ "updated": 1630235431554
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Foundations/Schemas/Docs-Concepts/S/Superalgos/Superalgos-Project/superalgos-project.json b/Projects/Foundations/Schemas/Docs-Concepts/S/Superalgos/Superalgos-Project/superalgos-project.json
new file mode 100644
index 000000000..9589bfe4f
--- /dev/null
+++ b/Projects/Foundations/Schemas/Docs-Concepts/S/Superalgos/Superalgos-Project/superalgos-project.json
@@ -0,0 +1,13 @@
+{
+ "type": "Superalgos Project",
+ "definition": {
+ "text": "The Superalgos Project is the open Community, together with it's body of work.",
+ "updated": 1630235520885
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "Right click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use docs.save to save your changes and app.contribute to send it to the main repository."
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Foundations/Schemas/Docs-Topics/D/Data/Data-Mining/data-mining-006-data-mining-data-mine-hierarchy.json b/Projects/Foundations/Schemas/Docs-Topics/D/Data/Data-Mining/data-mining-006-data-mining-data-mine-hierarchy.json
index 512d1b8b0..ec65c079e 100644
--- a/Projects/Foundations/Schemas/Docs-Topics/D/Data/Data-Mining/data-mining-006-data-mining-data-mine-hierarchy.json
+++ b/Projects/Foundations/Schemas/Docs-Topics/D/Data/Data-Mining/data-mining-006-data-mining-data-mine-hierarchy.json
@@ -64,7 +64,7 @@
},
{
"style": "Text",
- "text": "Data Mines are created by power users and contributed to the project (the ones shipping with the software). Users might create Data Mines for their personal use and never share them. However, if they share them, they receive SA tokens for that, and also for adapting and mantaining them, if necessary, for each new release."
+ "text": "Data Mines are created by power users and contributed to the project (the ones shipping with the software). Users might create Data Mines for their personal use and never share them. However, if they share them, they receive SA Tokens for that, and also for adapting and mantaining them, if necessary, for each new release."
},
{
"style": "Title",
diff --git a/Projects/Foundations/Schemas/Docs-Topics/D/Data/Data-Mining/data-mining-014-data-mining-fetching-data-from-apis.json b/Projects/Foundations/Schemas/Docs-Topics/D/Data/Data-Mining/data-mining-014-data-mining-fetching-data-from-apis.json
index f577ee689..25d14cfea 100644
--- a/Projects/Foundations/Schemas/Docs-Topics/D/Data/Data-Mining/data-mining-014-data-mining-fetching-data-from-apis.json
+++ b/Projects/Foundations/Schemas/Docs-Topics/D/Data/Data-Mining/data-mining-014-data-mining-fetching-data-from-apis.json
@@ -265,7 +265,7 @@
},
{
"style": "List",
- "text": "Step #30: Once you have successfully mapped the whole API and you have all the needed API Data Fetchers, Indicator Bots and Plotters tested, you are ready to share your API Map and Data Mine with the community as a plugin, and receive SA tokens in exchange for your contribution.",
+ "text": "Step #30: Once you have successfully mapped the whole API and you have all the needed API Data Fetchers, Indicator Bots and Plotters tested, you are ready to share your API Map and Data Mine with the community as a plugin, and receive SA Tokens in exchange for your contribution.",
"updated": 1622233875203
},
{
diff --git a/Projects/Foundations/Schemas/Docs-Topics/D/Docs/Docs-Commands/docs-commands-007-docs-repaginate-command.json b/Projects/Foundations/Schemas/Docs-Topics/D/Docs/Docs-Commands/docs-commands-007-docs-repaginate-command.json
index 341bb9cb3..01600e992 100644
--- a/Projects/Foundations/Schemas/Docs-Topics/D/Docs/Docs-Commands/docs-commands-007-docs-repaginate-command.json
+++ b/Projects/Foundations/Schemas/Docs-Topics/D/Docs/Docs-Commands/docs-commands-007-docs-repaginate-command.json
@@ -51,7 +51,8 @@
},
{
"style": "Text",
- "text": "After you repaginate a Topic or Tutorial, the best way to proceed it to manually delete from disk all the files associated with that Topic / Tutorial. After you delete them, you execute the repaginate command and then the docs.save command. "
+ "text": "After you repaginate a Topic or Tutorial, the best way to proceed is to manually delete from disk all the files associated with that Topic / Tutorial. After you delete them, you execute the repaginate command and then the docs.save command.",
+ "updated": 1630500489007
},
{
"style": "Text",
diff --git a/Projects/Foundations/Schemas/Docs-Topics/R/Repository/Repository-Branches/repository-branches-003-develop.json b/Projects/Foundations/Schemas/Docs-Topics/R/Repository/Repository-Branches/repository-branches-003-develop.json
index 682fb97da..cd49c2bff 100644
--- a/Projects/Foundations/Schemas/Docs-Topics/R/Repository/Repository-Branches/repository-branches-003-develop.json
+++ b/Projects/Foundations/Schemas/Docs-Topics/R/Repository/Repository-Branches/repository-branches-003-develop.json
@@ -3,14 +3,14 @@
"pageNumber": "3",
"type": "Develop",
"definition": {
- "text": "The Develop branch is the branch that is being used by developers involved in contributing to Superalgos. All the changes at this branch are sent to the Master branch everytime there is a new release. The Develop branch purpose is for accumulating changes at the codebase untiil the release date when all these changes are moved into the Master branch.",
- "updated": 1622467883706
+ "text": "The Develop branch is the branch developers use to contribute to the codebase. Changes at this branch are merged into the Master branch upon each release or service pack. The purpose of the Develop branch is to accumulate changes at the codebase until the release date when changes are ready for merging.",
+ "updated": 1630657066558
},
"paragraphs": [
{
"style": "Text",
- "text": "Contributors working at this branch coordinate their here:",
- "updated": 1622468223194
+ "text": "Contributors working at this branch Hang out in the Telegram Develop Group.",
+ "updated": 1630657099841
},
{
"style": "Link",
diff --git a/Projects/Foundations/Schemas/Docs-Topics/S/Sparta/Sparta-Data-Mine/sparta-data-mine-001-sparta-by-@julian-molina.json b/Projects/Foundations/Schemas/Docs-Topics/S/Sparta/Sparta-Data-Mine/sparta-data-mine-001-sparta-by-@julian-molina.json
index a5601801e..b17b60e2e 100644
--- a/Projects/Foundations/Schemas/Docs-Topics/S/Sparta/Sparta-Data-Mine/sparta-data-mine-001-sparta-by-@julian-molina.json
+++ b/Projects/Foundations/Schemas/Docs-Topics/S/Sparta/Sparta-Data-Mine/sparta-data-mine-001-sparta-by-@julian-molina.json
@@ -3,7 +3,7 @@
"pageNumber": 1,
"type": "Sparta By @julian-molina",
"definition": {
- "text": "The set of indicators built in the Sparta data mine include Simple Moving Average (SMA), Exponential Moving Averege (EMA), Relative Strenght Index (RSI), and Moving Average convergence Divergence (MACD).",
+ "text": "The set of indicators built in the Sparta data mine include Simple Moving Average (SMA), Exponential Moving Averege (EMA), Relative Strength Index (RSI), and Moving Average convergence Divergence (MACD).",
"updated": 1611685345604
},
"paragraphs": [
@@ -22,4 +22,4 @@
"text": "Collaborate with this data mine and report issues directly at the Superalgos repository."
}
]
-}
\ No newline at end of file
+}
diff --git a/Projects/Foundations/Schemas/Docs-Topics/S/Sparta/Sparta-Data-Mine/sparta-data-mine-004-relative-strenght-index-rsi-sparta-indicator.json b/Projects/Foundations/Schemas/Docs-Topics/S/Sparta/Sparta-Data-Mine/sparta-data-mine-004-relative-strenght-index-rsi-sparta-indicator.json
index c6ce769d1..73b0ca493 100644
--- a/Projects/Foundations/Schemas/Docs-Topics/S/Sparta/Sparta-Data-Mine/sparta-data-mine-004-relative-strenght-index-rsi-sparta-indicator.json
+++ b/Projects/Foundations/Schemas/Docs-Topics/S/Sparta/Sparta-Data-Mine/sparta-data-mine-004-relative-strenght-index-rsi-sparta-indicator.json
@@ -1,9 +1,9 @@
{
"topic": "Sparta Data Mine",
"pageNumber": 4,
- "type": "Relative Strenght Index (RSI) - Sparta Indicator",
+ "type": "Relative Strength Index (RSI) - Sparta Indicator",
"definition": {
- "text": "The indicator produces the standard 14 setting of the Relative Strenght Index.",
+ "text": "The indicator produces the standard 14 setting of the Relative Strength Index.",
"updated": 1611662214310
},
"paragraphs": [
@@ -59,4 +59,4 @@
"text": "How’s the trend going at the 24-hours chart?"
}
]
-}
\ No newline at end of file
+}
diff --git a/Projects/Foundations/Schemas/Docs-Tutorials/D/Defining/Defining-a-Trading-Idea/defining-a-trading-idea-002-tutorial-defining-a-trading-idea.json b/Projects/Foundations/Schemas/Docs-Tutorials/D/Defining/Defining-a-Trading-Idea/defining-a-trading-idea-002-tutorial-defining-a-trading-idea.json
index 99da54921..02b43c124 100644
--- a/Projects/Foundations/Schemas/Docs-Tutorials/D/Defining/Defining-a-Trading-Idea/defining-a-trading-idea-002-tutorial-defining-a-trading-idea.json
+++ b/Projects/Foundations/Schemas/Docs-Tutorials/D/Defining/Defining-a-Trading-Idea/defining-a-trading-idea-002-tutorial-defining-a-trading-idea.json
@@ -4,23 +4,55 @@
"type": "Tutorial - Defining a Trading Idea",
"definition": {
"icon": {
- "project": "Foundations",
- "name": "trading-strategy"
+ "name": "Trading\\trading-strategy",
+ "project": "Foundations"
},
- "text": "Before you may build a Trading Strategy, you first need to come up with a clear and testable trading idea."
+ "text": "Before you may build a Trading Strategy, you first need to come up with a clear and testable trading idea.",
+ "updated": 1630376091762,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Antes de que puedas crear una estrategia comercial, primero debe tener una idea comercial clara y comprobable.",
+ "updated": 1630376694793
+ }
+ ]
},
"paragraphs": [
{
"style": "Text",
- "text": "A trading idea is a precursor to a trading strategy. While a complete strategy entails the rules for taking, managing and exiting a position, a trading idea is concerned with the first of those issues only."
+ "text": "A trading idea is a precursor to a trading strategy. While a complete strategy entails the rules for taking, managing and exiting a position, a trading idea is concerned with the first of those issues only.",
+ "updated": 1630376114821,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Una idea trading es un precursor de una estrategia comercial. Si bien una estrategia completa implica las reglas para tomar, administrar y salir de una posición, una idea trading se ocupa únicamente del primero de esos aspectos.",
+ "updated": 1630376730606
+ }
+ ]
},
{
"style": "Callout",
- "text": "Testing a trading idea before committing to building a complete strategy is the logical approach because managing and exiting failed entries is not what you should be aiming for!"
+ "text": "Testing a trading idea before committing to building a complete strategy is the logical approach because managing and exiting failed entries is not what you should be aiming for!",
+ "updated": 1630376167390,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Probar una idea trading antes de comprometerse a construir una estrategia completa es el enfoque lógico porque administrar y salir de las entradas fallidas no es lo que debería apuntar.",
+ "updated": 1630376759318
+ }
+ ]
},
{
"style": "Text",
- "text": "This tutorial explains how to properly formulate a trading idea that may later be tested."
+ "text": "This tutorial explains how to properly formulate a trading idea that may later be tested.",
+ "updated": 1630376190150,
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Este tutorial explica cómo formular correctamente una idea trading que luego se puede probar.",
+ "updated": 1630376776923
+ }
+ ]
}
]
}
\ No newline at end of file
diff --git a/Projects/Foundations/Schemas/Docs-Tutorials/D/Defining/Defining-a-Trading-Idea/defining-a-trading-idea-003-tutorial-step-before-we-start..json b/Projects/Foundations/Schemas/Docs-Tutorials/D/Defining/Defining-a-Trading-Idea/defining-a-trading-idea-003-tutorial-step-before-we-start..json
index 36857f0bc..6a95fea02 100644
--- a/Projects/Foundations/Schemas/Docs-Tutorials/D/Defining/Defining-a-Trading-Idea/defining-a-trading-idea-003-tutorial-step-before-we-start..json
+++ b/Projects/Foundations/Schemas/Docs-Tutorials/D/Defining/Defining-a-Trading-Idea/defining-a-trading-idea-003-tutorial-step-before-we-start..json
@@ -4,19 +4,40 @@
"type": "Tutorial Step - Before we start...",
"definition": {
"icon": {
- "project": "Foundations",
- "name": "bullet-warning"
+ "name": "Bullet\\bullet-warning",
+ "project": "Foundations"
},
- "text": "Let me give you the heads up on a few matters you should consider before we start!"
+ "text": "Let me give you the heads up on a few matters you should consider before we start!",
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Permítanme informarles sobre algunos asuntos que deben considerar antes de comenzar!",
+ "updated": 1630376946171
+ }
+ ]
},
"paragraphs": [
{
"style": "List",
- "text": "Take any trading-related information for what it's worth! When I share trading concepts, take them with a grain of salt! I'm just a tutorial, not your financial advisor! I'm here to teach you Superalgos, not to tell you how to trade! If you are not a trader, you may pick up something of value, but always make sure you do your own research!"
+ "text": "Take any trading-related information for what it's worth! When I share trading concepts, take them with a grain of salt! I'm just a tutorial, not your financial advisor! I'm here to teach you Superalgos, not to tell you how to trade! If you are not a trader, you may pick up something of value, but always make sure you do your own research!",
+ "translations": [
+ {
+ "language": "ES",
+ "text": "¡Toma cualquier información relacionada con el comercio por lo que vale! Cuando comparta conceptos comerciales, ¡tómelos con un grano de sal! ¡Soy solo un tutorial, no su asesor financiero! ¡Estoy aquí para enseñarte Superalgos, no para decirte cómo comerciar! Si no es un comerciante, puede adquirir algo de valor, ¡pero asegúrese siempre de hacer su propia investigación!",
+ "updated": 1630376997809
+ }
+ ]
},
{
"style": "List",
- "text": "This tutorial is aimed at a wide audience! I'll take it easy and lay out concepts so that everyone may understand them. If you are a seasoned trader you may feel some explanations are too basic. In that case, feel free to skip this tutorial and go to the next one in the series."
+ "text": "This tutorial is aimed at a wide audience! I'll take it easy and lay out concepts so that everyone may understand them. If you are a seasoned trader you may feel some explanations are too basic. In that case, feel free to skip this tutorial and go to the next one in the series.",
+ "translations": [
+ {
+ "language": "ES",
+ "text": " Me lo tomaré con calma y expondré conceptos para que todos puedan entenderlos. Si eres es un comerciante experimentado, puede sentir que algunas explicaciones son demasiado básicas. En ese caso, no dudes en omitir este tutorial y pasar al siguiente de la serie.",
+ "updated": 1630377193083
+ }
+ ]
}
]
}
\ No newline at end of file
diff --git a/Projects/Foundations/Schemas/Docs-Tutorials/D/Defining/Defining-a-Trading-Idea/defining-a-trading-idea-004-tutorial-step-ready-to-mine..json b/Projects/Foundations/Schemas/Docs-Tutorials/D/Defining/Defining-a-Trading-Idea/defining-a-trading-idea-004-tutorial-step-ready-to-mine..json
index 2e5eef97f..5313ac4bd 100644
--- a/Projects/Foundations/Schemas/Docs-Tutorials/D/Defining/Defining-a-Trading-Idea/defining-a-trading-idea-004-tutorial-step-ready-to-mine..json
+++ b/Projects/Foundations/Schemas/Docs-Tutorials/D/Defining/Defining-a-Trading-Idea/defining-a-trading-idea-004-tutorial-step-ready-to-mine..json
@@ -4,19 +4,40 @@
"type": "Tutorial Step - Ready to Mine..?",
"definition": {
"icon": {
- "project": "Foundations",
- "name": "data-tasks"
+ "name": "Data\\data-tasks",
+ "project": "Foundations"
},
- "text": "We'll mine some data to analyze a few events over the charts. We'll use the same data to test the trading idea in the next tutorial!"
+ "text": "We'll mine some data to analyze a few events over the charts. We'll use the same data to test the trading idea in the next tutorial!",
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Extraeremos algunos datos para analizar algunos eventos en los gráficos. ¡Usaremos los mismos datos para probar la idea comercial en el próximo tutorial!",
+ "updated": 1630377229613
+ }
+ ]
},
"paragraphs": [
{
"style": "Note",
- "text": "The sensor bot will run on the BTC/USDT market (Binance) from January 1st, 2020, along with the following indicators from the Masters data mine: Candles Volumes, Bollinger Bands, and Bollinger Channels."
+ "text": "The sensor bot will run on the BTC/USDT market (Binance) from January 1st, 2020, along with the following indicators from the Masters data mine: Candles Volumes, Bollinger Bands, and Bollinger Channels.",
+ "translations": [
+ {
+ "language": "ES",
+ "text": "El robot sensor se ejecutará en el mercado BTC / USDT (Binance) a partir del 1 de enero de 2020, junto con los siguientes indicadores de la mina de datos Masters: Candles Volumes, Bollinger Bands y Bollinger Channels.",
+ "updated": 1630377249570
+ }
+ ]
},
{
"style": "Warning",
- "text": "If you have data on this market/exchange but on a different time range, this may affect your data! Read the sensor bot documentation to learn how! If the data you have is not important, feel free to keep going!"
+ "text": "If you have data on this market/exchange but on a different time range, this may affect your data! Read the sensor bot documentation to learn how! If the data you have is not important, feel free to keep going!",
+ "translations": [
+ {
+ "language": "ES",
+ "text": "Si tiene datos en este mercado / intercambio pero en un rango de tiempo diferente, ¡esto puede afectar tus datos! ¡Lee la documentación del robot sensor para aprender cómo hacerlo! Si los datos que tiene no son importantes, ¡no dude en continuar!",
+ "updated": 1630377309627
+ }
+ ]
}
]
}
\ No newline at end of file
diff --git a/Projects/Foundations/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningEpisode.js b/Projects/Foundations/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningEpisode.js
index 5ce13d58e..276a85fa2 100644
--- a/Projects/Foundations/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningEpisode.js
+++ b/Projects/Foundations/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningEpisode.js
@@ -58,7 +58,7 @@ exports.newFoundationsBotModulesLearningEpisode = function (processIndex) {
/* Recording the opening at the Learning Engine Data Structure */
learningEngine.learningCurrent.learningEpisode.status.value = 'Open'
learningEngine.learningCurrent.learningEpisode.serialNumber.value = 1
- learningEngine.learningCurrent.learningEpisode.identifier.value = TS.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId()
+ learningEngine.learningCurrent.learningEpisode.identifier.value = SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId()
learningEngine.learningCurrent.learningEpisode.beginRate.value = learningEngine.learningCurrent.learningEpisode.candle.close.value
}
diff --git a/Projects/Foundations/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningSystem.js b/Projects/Foundations/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningSystem.js
index 808c95d27..c1505f124 100644
--- a/Projects/Foundations/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningSystem.js
+++ b/Projects/Foundations/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningSystem.js
@@ -115,8 +115,8 @@ exports.newFoundationsBotModulesLearningSystem = function (processIndex) {
We will scan the project schema until we find the machine learning library
defined by the user at the UI.
*/
- for (let i = 0; i < TS.projects.foundations.globals.taskConstants.PROJECTS_SCHEMA.length; i++) {
- let projectSchemaProject = TS.projects.foundations.globals.taskConstants.PROJECTS_SCHEMA[i]
+ for (let i = 0; i < PROJECTS_SCHEMA.length; i++) {
+ let projectSchemaProject = PROJECTS_SCHEMA[i]
if (projectSchemaProject.name !== machineLearningLibrary.project) { continue }
for (let j = 0; j < projectSchemaProject.TS.botModules.length; j++) {
diff --git a/Projects/Foundations/TS/Bot-Modules/Sensor-Bot/Webhooks/CheckWebhook.js b/Projects/Foundations/TS/Bot-Modules/Sensor-Bot/Webhooks/CheckWebhook.js
index 84d8cfa01..be0254915 100644
--- a/Projects/Foundations/TS/Bot-Modules/Sensor-Bot/Webhooks/CheckWebhook.js
+++ b/Projects/Foundations/TS/Bot-Modules/Sensor-Bot/Webhooks/CheckWebhook.js
@@ -90,7 +90,7 @@ exports.newFoundationsBotModulesCheckWebhook = function (processIndex) {
try {
let http = require('http');
let url = 'http://' + global.env.WEB_SERVER_URL +
- ':' + global.env.HTTP_INTERFACE_PORT +
+ ':' + global.env.CLIENT_HTTP_INTERFACE_PORT +
'/Webhook/Fetch-Messages/' +
TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.parentNode.parentNode.config.codeName + "/" +
TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.baseAsset.referenceParent.config.codeName + "-" +
diff --git a/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingEpisode.js b/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingEpisode.js
index 2570ab8c5..6c3b51cb2 100644
--- a/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingEpisode.js
+++ b/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingEpisode.js
@@ -66,7 +66,7 @@ exports.newFoundationsBotModulesTradingEpisode = function (processIndex) {
/* Recording the opening at the Trading Engine Data Structure */
tradingEngine.tradingCurrent.tradingEpisode.status.value = 'Open'
tradingEngine.tradingCurrent.tradingEpisode.serialNumber.value = 1
- tradingEngine.tradingCurrent.tradingEpisode.identifier.value = TS.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId()
+ tradingEngine.tradingCurrent.tradingEpisode.identifier.value = SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId()
tradingEngine.tradingCurrent.tradingEpisode.beginRate.value = tradingEngine.tradingCurrent.tradingEpisode.candle.close.value
}
diff --git a/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingOrders.js b/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingOrders.js
index fe9107dba..91d1958d2 100644
--- a/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingOrders.js
+++ b/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingOrders.js
@@ -361,7 +361,7 @@ exports.newFoundationsBotModulesTradingOrders = function (processIndex) {
/* Create Order Procedure */
tradingEngineOrder.status.value = 'Open'
- tradingEngineOrder.identifier.value = TS.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId()
+ tradingEngineOrder.identifier.value = SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId()
tradingEngineOrder.begin.value = tradingEngine.tradingCurrent.tradingEpisode.cycle.begin.value
tradingEngineOrder.end.value = tradingEngine.tradingCurrent.tradingEpisode.cycle.end.value
tradingEngineOrder.serialNumber.value = tradingEngine.tradingCurrent.tradingEpisode.tradingEpisodeCounters.orders.value
diff --git a/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingPosition.js b/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingPosition.js
index 61b3ddb06..f2de2313c 100644
--- a/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingPosition.js
+++ b/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingPosition.js
@@ -58,7 +58,7 @@ exports.newFoundationsBotModulesTradingPosition = function (processIndex) {
/* Recording the opening at the Trading Engine Data Structure */
tradingEngine.tradingCurrent.position.status.value = 'Open'
tradingEngine.tradingCurrent.position.serialNumber.value = tradingEngine.tradingCurrent.tradingEpisode.tradingEpisodeCounters.positions.value + 1
- tradingEngine.tradingCurrent.position.identifier.value = TS.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId()
+ tradingEngine.tradingCurrent.position.identifier.value = SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId()
tradingEngine.tradingCurrent.position.beginRate.value = tradingEngine.tradingCurrent.tradingEpisode.candle.close.value
tradingEngine.tradingCurrent.position.positionBaseAsset.beginBalance.value = tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value
tradingEngine.tradingCurrent.position.positionQuotedAsset.beginBalance.value = tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value
diff --git a/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingStrategy.js b/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingStrategy.js
index da4f00516..f676de4d7 100644
--- a/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingStrategy.js
+++ b/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingStrategy.js
@@ -44,7 +44,7 @@ exports.newFoundationsBotModulesTradingStrategy = function (processIndex) {
/* Recording the opening at the Trading Engine Data Structure */
tradingEngine.tradingCurrent.strategy.status.value = 'Open'
tradingEngine.tradingCurrent.strategy.serialNumber.value = tradingEngine.tradingCurrent.tradingEpisode.tradingEpisodeCounters.strategies.value
- tradingEngine.tradingCurrent.strategy.identifier.value = TS.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId()
+ tradingEngine.tradingCurrent.strategy.identifier.value = SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId()
tradingEngine.tradingCurrent.strategy.beginRate.value = tradingEngine.tradingCurrent.tradingEpisode.candle.min.value
tradingEngine.tradingCurrent.strategy.index.value = index
diff --git a/Projects/Foundations/TS/Function-Libraries/TaskFunctions.js b/Projects/Foundations/TS/Function-Libraries/TaskFunctions.js
index 97ffb77a7..536fe54bb 100644
--- a/Projects/Foundations/TS/Function-Libraries/TaskFunctions.js
+++ b/Projects/Foundations/TS/Function-Libraries/TaskFunctions.js
@@ -32,8 +32,8 @@ exports.newFoundationsFunctionLibrariesTaskFunctions = function () {
We will scan the project schema until we find the module that will run the bot
botModule with the name provided.
*/
- for (let i = 0; i < TS.projects.foundations.globals.taskConstants.PROJECTS_SCHEMA.length; i++) {
- let project = TS.projects.foundations.globals.taskConstants.PROJECTS_SCHEMA[i]
+ for (let i = 0; i < PROJECTS_SCHEMA.length; i++) {
+ let project = PROJECTS_SCHEMA[i]
if (project.name !== TS.projects.foundations.globals.taskConstants.PROJECT_DEFINITION_NODE.config.codeName) { continue }
for (let j = 0; j < project.TS.botModules.length; j++) {
botModuleDefinition = project.TS.botModules[j]
diff --git a/Projects/Foundations/TS/Task-Modules/EventServerClient.js b/Projects/Foundations/TS/Task-Modules/EventServerClient.js
index 098dc85f2..c1de5323b 100644
--- a/Projects/Foundations/TS/Task-Modules/EventServerClient.js
+++ b/Projects/Foundations/TS/Task-Modules/EventServerClient.js
@@ -24,7 +24,7 @@
host = 'localhost'
}
if (port === undefined) {
- port = global.env.WEB_SOCKETS_INTERFACE_PORT
+ port = global.env.CLIENT_WEB_SOCKETS_INTERFACE_PORT
}
let messageCounter = 0
diff --git a/Projects/Foundations/TS/Utilities/MiscellaneousFunctions.js b/Projects/Foundations/TS/Utilities/MiscellaneousFunctions.js
index 16aae45ce..502378e7d 100644
--- a/Projects/Foundations/TS/Utilities/MiscellaneousFunctions.js
+++ b/Projects/Foundations/TS/Utilities/MiscellaneousFunctions.js
@@ -1,7 +1,6 @@
exports.newFoundationsUtilitiesMiscellaneousFunctions = function () {
let thisObject = {
- genereteUniqueId: genereteUniqueId,
truncateToThisPrecision: truncateToThisPrecision,
pad: pad,
asyncGetDatasetFile: asyncGetDatasetFile,
@@ -10,13 +9,6 @@ exports.newFoundationsUtilitiesMiscellaneousFunctions = function () {
return thisObject
- function genereteUniqueId() {
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
- var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8)
- return v.toString(16)
- })
- }
-
function truncateToThisPrecision(floatNumber, precision) {
return parseFloat(floatNumber.toFixed(precision))
}
diff --git a/Projects/Foundations/UI/Spaces/Charting-Space/ChartingSpace.js b/Projects/Foundations/UI/Spaces/Charting-Space/ChartingSpace.js
index 3fe3f38f4..4694622d6 100644
--- a/Projects/Foundations/UI/Spaces/Charting-Space/ChartingSpace.js
+++ b/Projects/Foundations/UI/Spaces/Charting-Space/ChartingSpace.js
@@ -186,7 +186,9 @@ function newFoundationsChartingSpace() {
}
function resize() {
- thisObject.viewport.resize()
+ if (thisObject.viewport !== undefined) {
+ thisObject.viewport.resize()
+ }
thisObject.container.frame.width = browserCanvas.width
thisObject.container.frame.height = COCKPIT_SPACE_POSITION
}
diff --git a/Projects/Foundations/UI/Spaces/Design-Space/Workspace.js b/Projects/Foundations/UI/Spaces/Design-Space/Workspace.js
index ff1e6b7e8..88b4f1ce9 100644
--- a/Projects/Foundations/UI/Spaces/Design-Space/Workspace.js
+++ b/Projects/Foundations/UI/Spaces/Design-Space/Workspace.js
@@ -16,7 +16,7 @@ function newWorkspace() {
save: saveWorkspace,
backup: backupWorkspace,
share: shareWorkspace,
- getNodesByTypeAndHierarchyHeadsType: getNodesByTypeAndHierarchyHeadsType,
+ getNodesByTypeAndHierarchyHeadsType: getNodesByTypeAndHierarchyHeadsType,
getProjectsHeads: getProjectsHeads,
getHierarchyHeads: getHierarchyHeads,
getHierarchyHeadsById: getHierarchyHeadsById,
@@ -70,8 +70,12 @@ function newWorkspace() {
/* Set up the action switches map */
for (let i = 0; i < PROJECTS_SCHEMA.length; i++) {
let project = PROJECTS_SCHEMA[i].name
- let actionSwitch = eval('new' + project + 'ActionSwitch()')
- actionSwitchesByProject.set(project, actionSwitch)
+ try {
+ let actionSwitch = eval('new' + project + 'ActionSwitch()')
+ actionSwitchesByProject.set(project, actionSwitch)
+ } catch (err) {
+ console.log('[WARN] Action Switch for project ' + project + ' not found.')
+ }
}
/* Check which was the last workspace. */
@@ -157,9 +161,9 @@ function newWorkspace() {
let workspace = UI.projects.foundations.spaces.designSpace.workspace.workspaceNode
/* Validation if it is too early to save. */
- if (thisObject.isInitialized === false) {
+ if (thisObject.isInitialized === false) {
console.log('Workspace not saved because it has not been initialized. =')
- return
+ return
}
/* Validation of 2 sessions opened at the same time. */
diff --git a/Projects/Governance/Plugins/Assets/Superalgos-Exchanges.json b/Projects/Governance/Plugins/Assets/Superalgos-Exchanges.json
index d4090dcf2..d6c498572 100644
--- a/Projects/Governance/Plugins/Assets/Superalgos-Exchanges.json
+++ b/Projects/Governance/Plugins/Assets/Superalgos-Exchanges.json
@@ -356,7 +356,7 @@
"floatingObject": {
"isPinned": false,
"isFrozen": false,
- "isCollapsed": false,
+ "isCollapsed": true,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
diff --git a/Projects/Governance/Plugins/Assets/Superalgos-Marketing.json b/Projects/Governance/Plugins/Assets/Superalgos-Marketing.json
index be5d90893..64bf9ba09 100644
--- a/Projects/Governance/Plugins/Assets/Superalgos-Marketing.json
+++ b/Projects/Governance/Plugins/Assets/Superalgos-Marketing.json
@@ -1670,7 +1670,7 @@
"floatingObject": {
"isPinned": false,
"isFrozen": false,
- "isCollapsed": false,
+ "isCollapsed": true,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
diff --git a/Projects/Governance/Plugins/Assets/Superalgos.json b/Projects/Governance/Plugins/Assets/Superalgos.json
index ae39e92d5..2caffa09e 100644
--- a/Projects/Governance/Plugins/Assets/Superalgos.json
+++ b/Projects/Governance/Plugins/Assets/Superalgos.json
@@ -308,7 +308,7 @@
"floatingObject": {
"isPinned": false,
"isFrozen": false,
- "isCollapsed": false,
+ "isCollapsed": true,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
diff --git a/Projects/Governance/Plugins/Features/Superalgos.json b/Projects/Governance/Plugins/Features/Superalgos.json
index ee0c33888..eecf6eef4 100644
--- a/Projects/Governance/Plugins/Features/Superalgos.json
+++ b/Projects/Governance/Plugins/Features/Superalgos.json
@@ -807,7 +807,7 @@
"floatingObject": {
"isPinned": false,
"isFrozen": false,
- "isCollapsed": false,
+ "isCollapsed": true,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
diff --git a/Projects/Governance/Plugins/Pools/Superalgos.json b/Projects/Governance/Plugins/Pools/Superalgos.json
index c446e8ab1..549b0022b 100644
--- a/Projects/Governance/Plugins/Pools/Superalgos.json
+++ b/Projects/Governance/Plugins/Pools/Superalgos.json
@@ -1,7 +1,7 @@
{
"type": "Pools",
"name": "Superalgos",
- "config": "{\n \"tokens\": \"66000000\",\n \"codeName\": \"Superalgos\"\n}",
+ "config": "{\"tokens\":\"66000000\",\"codeName\":\"Superalgos\"}",
"project": "Governance",
"poolClasses": [
{
@@ -792,7 +792,7 @@
"floatingObject": {
"isPinned": false,
"isFrozen": false,
- "isCollapsed": false,
+ "isCollapsed": true,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
@@ -817,7 +817,7 @@
"floatingObject": {
"isPinned": false,
"isFrozen": false,
- "isCollapsed": false,
+ "isCollapsed": true,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
@@ -1740,14 +1740,12 @@
"referenceParent": {
"type": "Features",
"name": "Superalgos",
- "id": "1d2c1985-c762-4ece-b350-15bd893bd1f4"
+ "id": "7c27de79-0ac7-4d48-81f0-5d7b6a4d93c6"
},
"referenceParentCombinedNodePath": [
[
"Superalgos",
- "Features",
- "Governance",
- "1d2c1985-c762-4ece-b350-15bd893bd1f4"
+ "Features"
]
]
}
@@ -1816,7 +1814,7 @@
"floatingObject": {
"isPinned": false,
"isFrozen": false,
- "isCollapsed": false,
+ "isCollapsed": true,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
diff --git a/Projects/Governance/Plugins/Positions/Superalgos-Marketing.json b/Projects/Governance/Plugins/Positions/Superalgos-Marketing.json
index 451dad211..ba3cff2c3 100644
--- a/Projects/Governance/Plugins/Positions/Superalgos-Marketing.json
+++ b/Projects/Governance/Plugins/Positions/Superalgos-Marketing.json
@@ -170,7 +170,7 @@
"floatingObject": {
"isPinned": false,
"isFrozen": false,
- "isCollapsed": false,
+ "isCollapsed": true,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
diff --git a/Projects/Governance/Plugins/Positions/Superalgos.json b/Projects/Governance/Plugins/Positions/Superalgos.json
index 71664c65e..7f6a9668a 100644
--- a/Projects/Governance/Plugins/Positions/Superalgos.json
+++ b/Projects/Governance/Plugins/Positions/Superalgos.json
@@ -324,7 +324,7 @@
"floatingObject": {
"isPinned": false,
"isFrozen": false,
- "isCollapsed": false,
+ "isCollapsed": true,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
diff --git a/Projects/Governance/Plugins/User-Profiles/9808us.json b/Projects/Governance/Plugins/User-Profiles/9808us.json
new file mode 100644
index 000000000..fd65057e3
--- /dev/null
+++ b/Projects/Governance/Plugins/User-Profiles/9808us.json
@@ -0,0 +1,907 @@
+{
+ "type": "User Profile",
+ "name": "9808us",
+ "config": "{\"signature\":{\"message\":\"9808us\",\"messageHash\":\"0x979b53056d1e29f7e1801d0784d3228c463b3173d55bb43faa4f95b29a5fced1\",\"v\":\"0x1b\",\"r\":\"0x156fe1757248fe5a6752fa24d83985f4ee59f4bf9b09f55429c85eb7521c4b87\",\"s\":\"0x2fe78103a631760ecd41913ba30ad67fc7e3116378d0cc574aaabb99b0e0be37\",\"signature\":\"0x156fe1757248fe5a6752fa24d83985f4ee59f4bf9b09f55429c85eb7521c4b872fe78103a631760ecd41913ba30ad67fc7e3116378d0cc574aaabb99b0e0be371b\"},\"codeName\":\"9808us\"}",
+ "project": "Governance",
+ "tokenPowerSwitch": {
+ "type": "Token Power Switch",
+ "name": "New Token Power Switch",
+ "config": "{\n \"percentage\": 90\n}",
+ "project": "Governance",
+ "tokenPowerSwitch": [],
+ "onboardingPrograms": {
+ "type": "Onboarding Programs",
+ "name": "New Onboarding Programs",
+ "config": "{\n \"percentage\": 10\n}",
+ "project": "Governance",
+ "airdropProgram": {
+ "type": "Airdrop Program",
+ "name": "New Airdrop Program",
+ "config": "{}",
+ "project": "Governance",
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "85d3b184-0122-4cb3-a83c-b3c00d626767",
+ "savedPayload": {
+ "position": {
+ "x": 24761.40800640108,
+ "y": 24813.204681296138
+ },
+ "targetPosition": {
+ "x": 24984.3514540443,
+ "y": 25013.943863203796
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "9163e52d-f77c-40b7-b139-960681b28171",
+ "savedPayload": {
+ "position": {
+ "x": 24984.3514540443,
+ "y": 25013.943863203796
+ },
+ "targetPosition": {
+ "x": 25207.294901687517,
+ "y": 25214.683045111455
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "githubProgram": {
+ "type": "Github Program",
+ "name": "New Github Program",
+ "config": "{}",
+ "project": "Governance",
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "5ebe2e87-295e-42cc-98f1-c70ee2efa4a3",
+ "savedPayload": {
+ "position": {
+ "x": 25332.041916178172,
+ "y": 24627.794484671173
+ },
+ "targetPosition": {
+ "x": 25269.668408932845,
+ "y": 24921.238764891314
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "d38054ef-3c0b-43fd-986d-27dd39f72f2c",
+ "savedPayload": {
+ "position": {
+ "x": 25269.668408932845,
+ "y": 24921.238764891314
+ },
+ "targetPosition": {
+ "x": 25207.294901687517,
+ "y": 25214.683045111455
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "975175a5-fbf2-4775-80c3-175af1bf27ae",
+ "savedPayload": {
+ "position": {
+ "x": 25207.294901687517,
+ "y": 25214.683045111455
+ },
+ "targetPosition": {
+ "x": 25300,
+ "y": 25500
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "communityBuildingPrograms": {
+ "type": "Community Building Programs",
+ "name": "New Community Building Programs",
+ "config": "{}",
+ "project": "Governance",
+ "referralProgram": {
+ "type": "Referral Program",
+ "name": "New Referral Program",
+ "config": "{\n \"percentage\": 30\n}",
+ "project": "Governance",
+ "userReferrers": [
+ {
+ "type": "User Referrer",
+ "name": "",
+ "config": "{}",
+ "project": "Governance",
+ "id": "46674b25-ed29-4c00-90be-3dc849e2af9f",
+ "savedPayload": {
+ "position": {
+ "x": 25672.579175727584,
+ "y": 24749.70358952681
+ },
+ "targetPosition": {
+ "x": 25664.72609123522,
+ "y": 25049.600787019477
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 3,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "1d484ca6-1fc2-4a6f-b6c1-f30ef07dc820",
+ "savedPayload": {
+ "position": {
+ "x": 25786.74708415796,
+ "y": 24775.537149726697
+ },
+ "targetPosition": {
+ "x": 25664.72609123522,
+ "y": 25049.600787019477
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 3,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensBonus": {
+ "type": "Tokens Bonus",
+ "name": "New Tokens Bonus",
+ "project": "Governance",
+ "id": "4849966e-c897-4222-9c46-b2e425f53810",
+ "savedPayload": {
+ "position": {
+ "x": 25882.338402538906,
+ "y": 24843.094414311352
+ },
+ "targetPosition": {
+ "x": 25664.72609123522,
+ "y": 25049.600787019477
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 3,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "e6e043a7-e486-4c7f-a686-8a031db4c7c5",
+ "savedPayload": {
+ "position": {
+ "x": 25664.72609123522,
+ "y": 25049.600787019477
+ },
+ "targetPosition": {
+ "x": 25542.705098312483,
+ "y": 25323.664424312257
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "supportProgram": {
+ "type": "Support Program",
+ "name": "New Support Program",
+ "config": "{}",
+ "project": "Governance",
+ "userSupporters": [
+ {
+ "type": "User Supporter",
+ "name": "",
+ "config": "{}",
+ "project": "Governance",
+ "id": "554c93e4-0de9-4ce2-a6ff-e8ce272e71cc",
+ "savedPayload": {
+ "position": {
+ "x": 25991.061666922964,
+ "y": 25032.498264196627
+ },
+ "targetPosition": {
+ "x": 25841.061666922964,
+ "y": 25292.30588533196
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "User Supporter",
+ "name": "",
+ "config": "{}",
+ "project": "Governance",
+ "id": "0d18e74f-dae9-4672-b00a-c997909494ee",
+ "savedPayload": {
+ "position": {
+ "x": 26115.125304215744,
+ "y": 25170.28489240922
+ },
+ "targetPosition": {
+ "x": 25841.061666922964,
+ "y": 25292.30588533196
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "37f0b912-de8f-4b79-98ad-b5aaf08f838b",
+ "savedPayload": {
+ "position": {
+ "x": 26134.505947143105,
+ "y": 25354.679392577287
+ },
+ "targetPosition": {
+ "x": 25841.061666922964,
+ "y": 25292.30588533196
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensBonus": {
+ "type": "Tokens Bonus",
+ "name": "New Tokens Bonus",
+ "project": "Governance",
+ "id": "f3fb13a2-b1f4-4b02-b925-c68f504fd2ac",
+ "savedPayload": {
+ "position": {
+ "x": 26041.800848830622,
+ "y": 25515.249332975178
+ },
+ "targetPosition": {
+ "x": 25841.061666922964,
+ "y": 25292.30588533196
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "65a48301-5bc1-4a5c-a50a-f429f44db4b8",
+ "savedPayload": {
+ "position": {
+ "x": 25841.061666922964,
+ "y": 25292.30588533196
+ },
+ "targetPosition": {
+ "x": 25542.705098312483,
+ "y": 25323.664424312257
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "410de3ee-3b6a-4e67-a6f0-130e29cd0a79",
+ "savedPayload": {
+ "position": {
+ "x": 25542.705098312483,
+ "y": 25323.664424312257
+ },
+ "targetPosition": {
+ "x": 25300,
+ "y": 25500
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "votesAndClaimsPrograms": {
+ "type": "Votes And Claims Programs",
+ "name": "New Votes And Claims Programs",
+ "config": "{\n \"percentage\": 20\n}",
+ "project": "Governance",
+ "votingProgram": {
+ "type": "Voting Program",
+ "name": "New Voting Program",
+ "config": "{}",
+ "project": "Governance",
+ "votesSwitch": [],
+ "tokensBonus": {
+ "type": "Tokens Bonus",
+ "name": "New Tokens Bonus",
+ "project": "Governance",
+ "id": "8b8039e0-c042-4dde-87ca-61ac8019a49e",
+ "savedPayload": {
+ "position": {
+ "x": 26139.418235533445,
+ "y": 25739.052653648338
+ },
+ "targetPosition": {
+ "x": 25841.061666922964,
+ "y": 25707.69411466804
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "1ca2a7f8-4dad-40a5-9a0b-70e4e6b0e037",
+ "savedPayload": {
+ "position": {
+ "x": 25841.061666922964,
+ "y": 25707.69411466804
+ },
+ "targetPosition": {
+ "x": 25542.705098312483,
+ "y": 25676.335575687743
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "claimsProgram": {
+ "type": "Claims Program",
+ "name": "New Claims Program",
+ "config": "{}",
+ "project": "Governance",
+ "assetClaimsFolders": [
+ {
+ "type": "Asset Claims Folder",
+ "name": "New Asset Claims Folder",
+ "config": "{}",
+ "project": "Governance",
+ "assetClaimsFolders": [],
+ "assetContributionClaims": [],
+ "id": "c0bb67cf-ed97-445f-b3b6-8ef181c386c0",
+ "savedPayload": {
+ "position": {
+ "x": 31844.903008026802,
+ "y": 18200.741292494906
+ },
+ "targetPosition": {
+ "x": 31404.73658769659,
+ "y": 18107.181031626915
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "featureClaimsFolders": [
+ {
+ "type": "Feature Claims Folder",
+ "name": "New Feature Claims Folder",
+ "config": "{}",
+ "project": "Governance",
+ "featureClaimsFolders": [],
+ "featureContributionClaims": [],
+ "id": "81dc6357-893d-4361-9692-ef5d5e32a31e",
+ "savedPayload": {
+ "position": {
+ "x": 31705.845360558076,
+ "y": 18441.596203091744
+ },
+ "targetPosition": {
+ "x": 31404.73658769659,
+ "y": 18107.181031626915
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "positionClaimsFolders": [
+ {
+ "type": "Position Claims Folder",
+ "name": "New Position Claims Folder",
+ "config": "{}",
+ "project": "Governance",
+ "positionClaimsFolders": [],
+ "positionContributionClaims": [],
+ "id": "32dec8a2-71c0-45f0-b1c3-8ea6f3b99b6d",
+ "savedPayload": {
+ "position": {
+ "x": 31451.77439616703,
+ "y": 18554.71588454264
+ },
+ "targetPosition": {
+ "x": 31404.73658769659,
+ "y": 18107.181031626915
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "b3a93cc0-0801-4f6e-9488-435a1d272bff",
+ "savedPayload": {
+ "position": {
+ "x": 31179.73658769659,
+ "y": 18496.892463329914
+ },
+ "targetPosition": {
+ "x": 31404.73658769659,
+ "y": 18107.181031626915
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "98125357-80c3-4d3b-9b91-059298515c11",
+ "savedPayload": {
+ "position": {
+ "x": 31404.73658769659,
+ "y": 18107.181031626915
+ },
+ "targetPosition": {
+ "x": 25542.705098312483,
+ "y": 25676.335575687743
+ },
+ "floatingObject": {
+ "isPinned": true,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 4,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "a79ace48-ae15-4359-95c1-371df5e41291",
+ "savedPayload": {
+ "position": {
+ "x": 25542.705098312483,
+ "y": 25676.335575687743
+ },
+ "targetPosition": {
+ "x": 25300,
+ "y": 25500
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "financialPrograms": {
+ "type": "Financial Programs",
+ "name": "New Financial Programs",
+ "config": "{\n \"percentage\": 20\n}",
+ "project": "Governance",
+ "stakingProgram": {
+ "type": "Staking Program",
+ "name": "New Staking Program",
+ "config": "{}",
+ "project": "Governance",
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "77071bb6-dbda-4a2a-a8da-83ea6aa4155d",
+ "savedPayload": {
+ "position": {
+ "x": 25332.041916178172,
+ "y": 26372.205515328827
+ },
+ "targetPosition": {
+ "x": 25269.668408932845,
+ "y": 26078.761235108686
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "4087d58e-e684-4651-8849-4e194d5cc934",
+ "savedPayload": {
+ "position": {
+ "x": 25269.668408932845,
+ "y": 26078.761235108686
+ },
+ "targetPosition": {
+ "x": 25207.294901687517,
+ "y": 25785.316954888545
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "delegationProgram": {
+ "type": "Delegation Program",
+ "name": "New Delegation Program",
+ "config": "{}",
+ "project": "Governance",
+ "delegatePowerSwitch": [
+ {
+ "type": "Delegate Power Switch",
+ "name": "New Delegate Power Switch",
+ "config": "{}",
+ "project": "Governance",
+ "delegatePowerSwitch": [],
+ "userDelegates": [],
+ "id": "41e5e919-43b5-43d1-b0c1-7b388b4cd1bf",
+ "savedPayload": {
+ "position": {
+ "x": 24891.646355731817,
+ "y": 26271.37309168475
+ },
+ "targetPosition": {
+ "x": 24984.3514540443,
+ "y": 25986.056136796204
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "tokensBonus": {
+ "type": "Tokens Bonus",
+ "name": "New Tokens Bonus",
+ "project": "Governance",
+ "id": "ef6f8b6c-6e85-4d6c-ad64-b1e6ddd1248f",
+ "savedPayload": {
+ "position": {
+ "x": 24690.90717382416,
+ "y": 26048.42964404153
+ },
+ "targetPosition": {
+ "x": 24984.3514540443,
+ "y": 25986.056136796204
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "ee380273-eced-4761-b91e-94b542beb5de",
+ "savedPayload": {
+ "position": {
+ "x": 24984.3514540443,
+ "y": 25986.056136796204
+ },
+ "targetPosition": {
+ "x": 25207.294901687517,
+ "y": 25785.316954888545
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "c09288a3-64fb-489d-8e7d-c8d72a56c535",
+ "savedPayload": {
+ "position": {
+ "x": 25207.294901687517,
+ "y": 25785.316954888545
+ },
+ "targetPosition": {
+ "x": 25300,
+ "y": 25500
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "d7571db7-acfc-4d8c-aa91-582ff7f5dbb3",
+ "savedPayload": {
+ "position": {
+ "x": 25300,
+ "y": 25500
+ },
+ "targetPosition": {
+ "x": 25000,
+ "y": 25500
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensMined": {
+ "type": "Tokens Mined",
+ "name": "New Tokens Mined",
+ "project": "Governance",
+ "id": "a72ec234-c5dc-425e-9ace-95ffed7c0542",
+ "savedPayload": {
+ "position": {
+ "x": 24700,
+ "y": 25500
+ },
+ "targetPosition": {
+ "x": 25000,
+ "y": 25500
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "280f0baf-bc13-497c-b255-618c1a146442",
+ "savedPayload": {
+ "position": {
+ "x": 25000,
+ "y": 25500
+ },
+ "targetPosition": {
+ "x": 25000,
+ "y": 25500
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Governance/Plugins/User-Profiles/Dummy.json b/Projects/Governance/Plugins/User-Profiles/Dummy.json
new file mode 100644
index 000000000..0eabb45da
--- /dev/null
+++ b/Projects/Governance/Plugins/User-Profiles/Dummy.json
@@ -0,0 +1,84 @@
+{
+ "type": "User Profile",
+ "name": "Dummy",
+ "config": "{\"signature\":{\"message\":\"Dummy\",\"messageHash\":\"0x02896cc66d7707014218bb1765cc0c2d97ff890c3078f973a365ea0b3cc5bdcf\",\"v\":\"0x1c\",\"r\":\"0xd6e1c99e2fc5c83f17abf2372ef3b85b242b659ead4725ed036c4b4607ba1f60\",\"s\":\"0x226266f27b546c894dc7e5f7ca95c3580156f5d178073479ebfa8f18a2452707\",\"signature\":\"0xd6e1c99e2fc5c83f17abf2372ef3b85b242b659ead4725ed036c4b4607ba1f60226266f27b546c894dc7e5f7ca95c3580156f5d178073479ebfa8f18a24527071c\"},\"codeName\":\"Dummy\"}",
+ "project": "Governance",
+ "tokenPowerSwitch": {
+ "type": "Token Power Switch",
+ "name": "New Token Power Switch",
+ "config": "{}",
+ "project": "Governance",
+ "tokenPowerSwitch": [],
+ "id": "da7974b8-2894-4723-8c99-f8d9725efde3",
+ "savedPayload": {
+ "position": {
+ "x": 14265,
+ "y": 10794.5
+ },
+ "targetPosition": {
+ "x": 13965,
+ "y": 10794.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensMined": {
+ "type": "Tokens Mined",
+ "name": "New Tokens Mined",
+ "project": "Governance",
+ "id": "9ed9c490-7dd6-497a-8ed0-5ddd6ea8dbee",
+ "savedPayload": {
+ "position": {
+ "x": 13665,
+ "y": 10794.5
+ },
+ "targetPosition": {
+ "x": 13965,
+ "y": 10794.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "7f24cabd-729b-4fe5-9258-cbfa779ba03e",
+ "savedPayload": {
+ "position": {
+ "x": 30000,
+ "y": 21251
+ },
+ "targetPosition": {
+ "x": 30000,
+ "y": 21251
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json b/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json
index 4a78876b0..6c3f2ea63 100644
--- a/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json
+++ b/Projects/Governance/Plugins/User-Profiles/Luis-Fernando-Molina.json
@@ -13154,17 +13154,17 @@
"id": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
"savedPayload": {
"position": {
- "x": 30356,
- "y": 23119
+ "x": 3571.4285714285716,
+ "y": 25500
},
"targetPosition": {
- "x": 30356,
- "y": 23119
+ "x": 3571.4285714285716,
+ "y": 25500
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
- "isCollapsed": false,
+ "isCollapsed": true,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
diff --git a/Projects/Governance/Plugins/User-Profiles/PLuv.json b/Projects/Governance/Plugins/User-Profiles/PLuv.json
index 430ae1b92..d97b9e7ec 100644
--- a/Projects/Governance/Plugins/User-Profiles/PLuv.json
+++ b/Projects/Governance/Plugins/User-Profiles/PLuv.json
@@ -127,12 +127,12 @@
"id": "6d16ca2f-a4e7-4c12-bc3c-98754ac90e08",
"savedPayload": {
"position": {
- "x": 19408.46583462777,
- "y": 16805.50679562789
+ "x": 16873.961568354185,
+ "y": 17964.683045111455
},
"targetPosition": {
- "x": 19501.17093294025,
- "y": 17090.823750516436
+ "x": 16966.666666666668,
+ "y": 18250
},
"floatingObject": {
"isPinned": false,
@@ -150,7 +150,7 @@
"communityBuildingPrograms": {
"type": "Community Building Programs",
"name": "New Community Building Programs",
- "config": "{\n \"percentage\": 3\n}",
+ "config": "{\n \"percentage\": 1\n}",
"project": "Governance",
"referralProgram": {
"type": "Referral Program",
@@ -900,12 +900,12 @@
"id": "7d10759e-f52d-418a-9a0c-2cf0bbb3e309",
"savedPayload": {
"position": {
- "x": 19743.876031252734,
- "y": 16914.488174828693
+ "x": 17209.37176497915,
+ "y": 18073.664424312257
},
"targetPosition": {
- "x": 19501.17093294025,
- "y": 17090.823750516436
+ "x": 16966.666666666668,
+ "y": 18250
},
"floatingObject": {
"isPinned": false,
@@ -934,7 +934,7 @@
{
"type": "Votes Switch",
"name": "Other People's Stuff",
- "config": "{\n \"percentage\": 3\n}",
+ "config": "{\n \"percentage\": 1\n}",
"project": "Governance",
"votesSwitch": [],
"claimVotesSwitch": [
@@ -1348,12 +1348,12 @@
"id": "9df9510a-691c-4f05-bea4-214ea218263e",
"savedPayload": {
"position": {
- "x": 19077.09315829752,
- "y": 16072.912037378894
+ "x": 19483.09315829752,
+ "y": 16331.912037378896
},
"targetPosition": {
- "x": 19748.395437671104,
- "y": 16143.468750084561
+ "x": 20154.395437671104,
+ "y": 16402.46875008456
},
"floatingObject": {
"isPinned": false,
@@ -1384,12 +1384,12 @@
"id": "6292f3d5-fcaa-4249-97e1-094fc6cd3faa",
"savedPayload": {
"position": {
- "x": 18338.202519733757,
- "y": 15851.574899334562
+ "x": 18772.266615918157,
+ "y": 16207.532982488976
},
"targetPosition": {
- "x": 19323.604173712465,
- "y": 15618.895226101107
+ "x": 19729.604173712465,
+ "y": 15877.895226101105
},
"floatingObject": {
"isPinned": false,
@@ -1467,12 +1467,12 @@
"id": "c182f0a8-e833-4455-9018-8008781e5bfe",
"savedPayload": {
"position": {
- "x": 18334.832034458916,
- "y": 15400.98261371725
+ "x": 18717.258382366617,
+ "y": 15860.224664583357
},
"targetPosition": {
- "x": 19323.604173712465,
- "y": 15618.895226101107
+ "x": 19729.604173712465,
+ "y": 15877.895226101105
},
"floatingObject": {
"isPinned": false,
@@ -1550,12 +1550,12 @@
"id": "2b483422-88aa-40d1-8901-8e23293425fa",
"savedPayload": {
"position": {
- "x": 18527.29999785772,
- "y": 14993.550593505366
+ "x": 18784.353991884047,
+ "y": 15515.047677186489
},
"targetPosition": {
- "x": 19323.604173712465,
- "y": 15618.895226101107
+ "x": 19729.604173712465,
+ "y": 15877.895226101105
},
"floatingObject": {
"isPinned": false,
@@ -1633,12 +1633,12 @@
"id": "b21f9f40-267d-4148-9735-829647ccc5ae",
"savedPayload": {
"position": {
- "x": 18877.485769314382,
- "y": 14709.97574712769
+ "x": 18965.46072373691,
+ "y": 15213.635459248217
},
"targetPosition": {
- "x": 19323.604173712465,
- "y": 15618.895226101107
+ "x": 19729.604173712465,
+ "y": 15877.895226101105
},
"floatingObject": {
"isPinned": false,
@@ -1716,12 +1716,12 @@
"id": "efe425a4-b02d-4cf1-942f-21de1c782f25",
"savedPayload": {
"position": {
- "x": 19316.03076204526,
- "y": 14606.42355072657
+ "x": 19238.73443321305,
+ "y": 14992.342772622467
},
"targetPosition": {
- "x": 19323.604173712465,
- "y": 15618.895226101107
+ "x": 19729.604173712465,
+ "y": 15877.895226101105
},
"floatingObject": {
"isPinned": false,
@@ -1805,12 +1805,12 @@
"id": "13bb8738-b245-467f-850b-2b46cad1f16e",
"savedPayload": {
"position": {
- "x": 19756.075761838627,
- "y": 14703.403786783601
+ "x": 19571.21427785923,
+ "y": 14877.860781248528
},
"targetPosition": {
- "x": 19323.604173712465,
- "y": 15618.895226101107
+ "x": 19729.604173712465,
+ "y": 15877.895226101105
},
"floatingObject": {
"isPinned": false,
@@ -1867,18 +1867,184 @@
]
]
}
+ },
+ {
+ "type": "Asset Claim Vote",
+ "name": "Smidy13 ",
+ "config": "{}",
+ "project": "Governance",
+ "id": "f39a2c29-1935-4233-95d8-b343b314d6e4",
+ "savedPayload": {
+ "position": {
+ "x": 19922.798281531217,
+ "y": 14883.997702860346
+ },
+ "targetPosition": {
+ "x": 19729.604173712465,
+ "y": 15877.895226101105
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 4,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Asset Contribution Claim",
+ "name": "",
+ "id": "f1add2dd-8cbc-40c0-a189-922b3d729e06"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Smidy13",
+ "User Profile",
+ "Governance",
+ "4b5eca40-4d97-454d-91f3-8627a98ef682"
+ ],
+ [
+ "New Token Power Switch",
+ "Token Power Switch",
+ "Governance",
+ "7fb54153-47b4-48dc-b2e0-99b52eda5949"
+ ],
+ [
+ "New Votes And Claims Programs",
+ "Votes And Claims Programs",
+ "Governance",
+ "7b4da8e8-6c7e-43eb-bfab-22c4b57ad286"
+ ],
+ [
+ "New Claims Program",
+ "Claims Program",
+ "Governance",
+ "121a7d91-bb40-466f-88a4-b354fd22e1d6"
+ ],
+ [
+ "New Asset Claims Folder",
+ "Asset Claims Folder",
+ "Governance",
+ "22f676a5-1868-473c-b3e5-a70faf6d35b5"
+ ],
+ [
+ "Foundations",
+ "Asset Claims Folder",
+ "Governance",
+ "c987460d-37a3-4e72-8a56-04dd07944313"
+ ],
+ [
+ "Bug Fixes",
+ "Asset Claims Folder",
+ "Governance",
+ "7682f51b-38f8-4cfa-becd-48113ce3c6cd"
+ ],
+ [
+ "",
+ "Asset Contribution Claim",
+ "Governance",
+ "f1add2dd-8cbc-40c0-a189-922b3d729e06"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Asset Claim Vote",
+ "name": "Smidy13 ",
+ "config": "{}",
+ "project": "Governance",
+ "id": "69077036-299f-4d31-8ef5-0f544b052158",
+ "savedPayload": {
+ "position": {
+ "x": 20251.080224558897,
+ "y": 15010.013334140216
+ },
+ "targetPosition": {
+ "x": 19729.604173712465,
+ "y": 15877.895226101105
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 4,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Asset Contribution Claim",
+ "name": "",
+ "id": "2f1021db-f803-44a2-a40b-6593f590589d"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Smidy13",
+ "User Profile",
+ "Governance",
+ "4b5eca40-4d97-454d-91f3-8627a98ef682"
+ ],
+ [
+ "New Token Power Switch",
+ "Token Power Switch",
+ "Governance",
+ "7fb54153-47b4-48dc-b2e0-99b52eda5949"
+ ],
+ [
+ "New Votes And Claims Programs",
+ "Votes And Claims Programs",
+ "Governance",
+ "7b4da8e8-6c7e-43eb-bfab-22c4b57ad286"
+ ],
+ [
+ "New Claims Program",
+ "Claims Program",
+ "Governance",
+ "121a7d91-bb40-466f-88a4-b354fd22e1d6"
+ ],
+ [
+ "New Asset Claims Folder",
+ "Asset Claims Folder",
+ "Governance",
+ "22f676a5-1868-473c-b3e5-a70faf6d35b5"
+ ],
+ [
+ "Foundations",
+ "Asset Claims Folder",
+ "Governance",
+ "c987460d-37a3-4e72-8a56-04dd07944313"
+ ],
+ [
+ "Bug Fixes",
+ "Asset Claims Folder",
+ "Governance",
+ "7682f51b-38f8-4cfa-becd-48113ce3c6cd"
+ ],
+ [
+ "",
+ "Asset Contribution Claim",
+ "Governance",
+ "2f1021db-f803-44a2-a40b-6593f590589d"
+ ]
+ ]
+ }
}
],
"featureClaimVotes": [],
"id": "c1768c6f-680c-4ac7-b255-741cc0c8a8a9",
"savedPayload": {
"position": {
- "x": 19323.604173712465,
- "y": 15618.895226101107
+ "x": 19729.604173712465,
+ "y": 15877.895226101105
},
"targetPosition": {
- "x": 19748.395437671104,
- "y": 16143.468750084561
+ "x": 20154.395437671104,
+ "y": 16402.46875008456
},
"floatingObject": {
"isPinned": false,
@@ -1910,12 +2076,12 @@
"id": "a6c1ced3-2da8-48a3-ad5c-ee63064df8f4",
"savedPayload": {
"position": {
- "x": 19601.666682280975,
- "y": 15648.120773420254
+ "x": 20007.666682280975,
+ "y": 15907.120773420254
},
"targetPosition": {
- "x": 20272.96896165456,
- "y": 15718.677486125918
+ "x": 20678.96896165456,
+ "y": 15977.67748612592
},
"floatingObject": {
"isPinned": false,
@@ -1987,18 +2153,18 @@
"id": "708dc168-d47c-4105-81b5-261ab635a1d5",
"savedPayload": {
"position": {
- "x": 19848.17769769592,
- "y": 15194.103962142464
+ "x": 20749.525674360226,
+ "y": 15306.375206752335
},
"targetPosition": {
- "x": 20272.96896165456,
- "y": 15718.677486125918
+ "x": 20678.96896165456,
+ "y": 15977.67748612592
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
- "angleToParent": 1,
+ "angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
@@ -2064,18 +2230,18 @@
"id": "e02a4ea0-0971-4f40-8442-ff66cea39bfe",
"savedPayload": {
"position": {
- "x": 20343.525674360226,
- "y": 15047.375206752335
+ "x": 21001.051124829795,
+ "y": 15384.475935079094
},
"targetPosition": {
- "x": 20272.96896165456,
- "y": 15718.677486125918
+ "x": 20678.96896165456,
+ "y": 15977.67748612592
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
- "angleToParent": 1,
+ "angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
@@ -2141,18 +2307,18 @@
"id": "21af8982-6406-4eab-b2c0-9711c45b68f9",
"savedPayload": {
"position": {
- "x": 20797.542485638012,
- "y": 15293.886222167279
+ "x": 21203.542485638012,
+ "y": 15552.886222167279
},
"targetPosition": {
- "x": 20272.96896165456,
- "y": 15718.677486125918
+ "x": 20678.96896165456,
+ "y": 15977.67748612592
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
- "angleToParent": 1,
+ "angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
@@ -2218,18 +2384,18 @@
"id": "06b3fe21-0af3-4098-aa29-92d6b761d82c",
"savedPayload": {
"position": {
- "x": 20944.271241028142,
- "y": 15789.234198831586
+ "x": 21326.17228269059,
+ "y": 15785.967128450773
},
"targetPosition": {
- "x": 20272.96896165456,
- "y": 15718.677486125918
+ "x": 20678.96896165456,
+ "y": 15977.67748612592
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
- "angleToParent": 1,
+ "angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
@@ -2289,18 +2455,18 @@
"id": "5a5c2895-4761-48ac-a1ef-4b51ab40ee05",
"savedPayload": {
"position": {
- "x": 20697.760225613198,
- "y": 16243.251010109376
+ "x": 21350.271241028142,
+ "y": 16048.234198831586
},
"targetPosition": {
- "x": 20272.96896165456,
- "y": 15718.677486125918
+ "x": 20678.96896165456,
+ "y": 15977.67748612592
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
- "angleToParent": 1,
+ "angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
@@ -2372,18 +2538,18 @@
"id": "38b6d567-4641-40ec-893e-9f76cca8ebd8",
"savedPayload": {
"position": {
- "x": 20202.41224894889,
- "y": 16389.979765499505
+ "x": 21272.170512701385,
+ "y": 16299.759649301155
},
"targetPosition": {
- "x": 20272.96896165456,
- "y": 15718.677486125918
+ "x": 20678.96896165456,
+ "y": 15977.67748612592
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
- "angleToParent": 1,
+ "angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
@@ -2451,12 +2617,12 @@
"id": "efbc2c39-9c26-41af-bca5-0222fb9f6a4c",
"savedPayload": {
"position": {
- "x": 20272.96896165456,
- "y": 15718.677486125918
+ "x": 20678.96896165456,
+ "y": 15977.67748612592
},
"targetPosition": {
- "x": 19748.395437671104,
- "y": 16143.468750084561
+ "x": 20154.395437671104,
+ "y": 16402.46875008456
},
"floatingObject": {
"isPinned": false,
@@ -2478,12 +2644,12 @@
"id": "38ad8b59-129e-460e-bbfe-cc6e328992b7",
"savedPayload": {
"position": {
- "x": 19748.395437671104,
- "y": 16143.468750084561
+ "x": 20154.395437671104,
+ "y": 16402.46875008456
},
"targetPosition": {
- "x": 20031.589613643533,
- "y": 16493.1844327402
+ "x": 20437.589613643533,
+ "y": 16752.1844327402
},
"floatingObject": {
"isPinned": false,
@@ -10338,12 +10504,12 @@
"id": "6eba9686-b5d4-44cb-bde9-002082ed733a",
"savedPayload": {
"position": {
- "x": 20381.30529629917,
- "y": 16209.990256767771
+ "x": 20787.30529629917,
+ "y": 16468.99025676777
},
"targetPosition": {
- "x": 20031.589613643533,
- "y": 16493.1844327402
+ "x": 20437.589613643533,
+ "y": 16752.1844327402
},
"floatingObject": {
"isPinned": false,
@@ -10364,12 +10530,12 @@
"id": "e071b504-73cb-4d66-bc92-90a5c48e17b0",
"savedPayload": {
"position": {
- "x": 20437.589613643533,
- "y": 16752.1844327402
+ "x": 17903.08534736995,
+ "y": 17911.360682223763
},
"targetPosition": {
- "x": 20276.32403634815,
- "y": 17172.29562466394
+ "x": 17741.819770074566,
+ "y": 18331.471874147504
},
"floatingObject": {
"isPinned": false,
@@ -10409,17 +10575,17 @@
{
"type": "Feature Claim Vote",
"name": "PLuv Tensor Flow Integration New Features",
- "config": "{}",
+ "config": "{\n \"percentage\": 50\n}",
"project": "Governance",
"id": "7e7385b4-9f96-4da7-9066-e010e1023905",
"savedPayload": {
"position": {
- "x": 21410.05612022855,
- "y": 15994.640145511272
+ "x": 18654.88074998019,
+ "y": 17100.83795018773
},
"targetPosition": {
- "x": 21363.018311758107,
- "y": 16442.174998426995
+ "x": 18725.276259248294,
+ "y": 17545.297703455544
},
"floatingObject": {
"isPinned": false,
@@ -10480,17 +10646,17 @@
{
"type": "Feature Claim Vote",
"name": "PLuv User Defined Variables and Code New Features",
- "config": "{\n}",
+ "config": "{}",
"project": "Governance",
"id": "72086cca-208e-4864-8a21-51fadac28c98",
"savedPayload": {
"position": {
- "x": 21774.11376769728,
- "y": 16259.143509042886
+ "x": 19074.991941903932,
+ "y": 17262.103527483116
},
"targetPosition": {
- "x": 21363.018311758107,
- "y": 16442.174998426995
+ "x": 18725.276259248294,
+ "y": 17545.297703455544
},
"floatingObject": {
"isPinned": false,
@@ -10552,12 +10718,12 @@
"id": "33000f65-87b3-45c2-aaec-067b12404b88",
"savedPayload": {
"position": {
- "x": 21363.018311758107,
- "y": 16442.174998426995
+ "x": 18725.276259248294,
+ "y": 17545.297703455544
},
"targetPosition": {
- "x": 21098.514948226493,
- "y": 16806.23264589572
+ "x": 18564.01068195291,
+ "y": 17965.408895379285
},
"floatingObject": {
"isPinned": false,
@@ -10624,12 +10790,12 @@
"id": "40a03471-49ab-4b22-8d38-47676d0469d5",
"savedPayload": {
"position": {
- "x": 21993.58465405794,
- "y": 16900.308262836606
+ "x": 19386.201593831254,
+ "y": 17599.345916611066
},
"targetPosition": {
- "x": 21546.049801142217,
- "y": 16853.270454366164
+ "x": 18975.106137892082,
+ "y": 17782.377405995176
},
"floatingObject": {
"isPinned": false,
@@ -10693,12 +10859,195 @@
"id": "8b21bb4d-41f5-4876-9e62-4665f1429cf4",
"savedPayload": {
"position": {
- "x": 21546.049801142217,
- "y": 16853.270454366164
+ "x": 18975.106137892082,
+ "y": 17782.377405995176
},
"targetPosition": {
- "x": 21098.514948226493,
- "y": 16806.23264589572
+ "x": 18564.01068195291,
+ "y": 17965.408895379285
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
+ "weightVotesSwitch": [
+ {
+ "type": "Weight Votes Switch",
+ "name": "New Weight Votes Switch",
+ "config": "{\n \"percentage\": 0\n}",
+ "project": "Governance",
+ "weightVotesSwitch": [],
+ "poolWeightVotes": [
+ {
+ "type": "Pool Weight Vote",
+ "name": "Project Positions, Assets, Features Pool Class",
+ "config": "{}",
+ "project": "Governance",
+ "id": "dd6428c8-059a-47e2-adc7-e1de10ec621c",
+ "savedPayload": {
+ "position": {
+ "x": 19395.217329815823,
+ "y": 17943.64298329056
+ },
+ "targetPosition": {
+ "x": 18984.12187387665,
+ "y": 18126.67447267467
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Pool Class",
+ "name": "Project Positions, Assets, Features",
+ "id": "b27df32a-70f3-470b-b8bb-471c156b0c30"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Superalgos",
+ "Pools",
+ "Governance",
+ "6f0aed87-db13-4818-bfe6-68abc463ebec"
+ ],
+ [
+ "Project Positions, Assets, Features",
+ "Pool Class",
+ "Governance",
+ "b27df32a-70f3-470b-b8bb-471c156b0c30"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Pool Weight Vote",
+ "name": "Features Pool Class",
+ "config": "{\n \"percentage\": 25\n}",
+ "project": "Governance",
+ "id": "81da8791-9e3f-4c6b-897e-40d82f1a0551",
+ "savedPayload": {
+ "position": {
+ "x": 19404.233065800392,
+ "y": 18287.940049970053
+ },
+ "targetPosition": {
+ "x": 18984.12187387665,
+ "y": 18126.67447267467
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Pool Class",
+ "name": "Features",
+ "id": "a1bc781c-242d-464f-8e1a-ee34b76e139c"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Superalgos",
+ "Pools",
+ "Governance",
+ "6f0aed87-db13-4818-bfe6-68abc463ebec"
+ ],
+ [
+ "Project Positions, Assets, Features",
+ "Pool Class",
+ "Governance",
+ "b27df32a-70f3-470b-b8bb-471c156b0c30"
+ ],
+ [
+ "Features",
+ "Pool Class",
+ "Governance",
+ "a1bc781c-242d-464f-8e1a-ee34b76e139c"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Pool Weight Vote",
+ "name": "Exchanges Pool Class",
+ "config": "{\n}",
+ "project": "Governance",
+ "id": "7839eb51-c4a5-4e0e-a2fd-fd01d0f9b2f0",
+ "savedPayload": {
+ "position": {
+ "x": 19167.15336326076,
+ "y": 18537.76992861384
+ },
+ "targetPosition": {
+ "x": 18984.12187387665,
+ "y": 18126.67447267467
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Pool Class",
+ "name": "Exchanges",
+ "id": "b6d7a4fe-8990-47a2-a7ce-f5fd90384b53"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Superalgos",
+ "Pools",
+ "Governance",
+ "6f0aed87-db13-4818-bfe6-68abc463ebec"
+ ],
+ [
+ "Exchanges",
+ "Pool Class",
+ "Governance",
+ "b6d7a4fe-8990-47a2-a7ce-f5fd90384b53"
+ ]
+ ]
+ }
+ }
+ ],
+ "assetWeightVotes": [],
+ "featureWeightVotes": [],
+ "positionWeightVotes": [],
+ "id": "e182eed3-badb-4d47-8cd4-5bac2399d501",
+ "savedPayload": {
+ "position": {
+ "x": 18984.12187387665,
+ "y": 18126.67447267467
+ },
+ "targetPosition": {
+ "x": 18564.01068195291,
+ "y": 17965.408895379285
},
"floatingObject": {
"isPinned": false,
@@ -10714,17 +11063,16 @@
}
}
],
- "weightVotesSwitch": [],
"userProfileVotesSwitch": [],
"id": "9a70336d-9543-401a-bd60-a6c2fa8c08fb",
"savedPayload": {
"position": {
- "x": 21098.514948226493,
- "y": 16806.23264589572
+ "x": 18564.01068195291,
+ "y": 17965.408895379285
},
"targetPosition": {
- "x": 20687.41949228732,
- "y": 16989.26413527983
+ "x": 18152.915226013738,
+ "y": 18148.440384763395
},
"floatingObject": {
"isPinned": false,
@@ -10746,12 +11094,12 @@
"id": "268bce42-91b0-4de4-bb36-7055b75db2b9",
"savedPayload": {
"position": {
- "x": 20687.41949228732,
- "y": 16989.26413527983
+ "x": 18152.915226013738,
+ "y": 18148.440384763395
},
"targetPosition": {
- "x": 20276.32403634815,
- "y": 17172.29562466394
+ "x": 17741.819770074566,
+ "y": 18331.471874147504
},
"floatingObject": {
"isPinned": false,
@@ -10774,12 +11122,12 @@
"id": "6091d138-b20d-4a19-b8cb-24142377abb7",
"savedPayload": {
"position": {
- "x": 20486.379632310018,
- "y": 17252.928413311634
+ "x": 17951.875366036435,
+ "y": 18412.1046627952
},
"targetPosition": {
- "x": 20276.32403634815,
- "y": 17172.29562466394
+ "x": 17741.819770074566,
+ "y": 18331.471874147504
},
"floatingObject": {
"isPinned": false,
@@ -10797,12 +11145,12 @@
"id": "6106dc15-c8c2-49fb-9db3-c494711ef844",
"savedPayload": {
"position": {
- "x": 20276.32403634815,
- "y": 17172.29562466394
+ "x": 17741.819770074566,
+ "y": 18331.471874147504
},
"targetPosition": {
- "x": 19865.228580408977,
- "y": 17355.32711404805
+ "x": 17330.724314135394,
+ "y": 18514.503363531614
},
"floatingObject": {
"isPinned": false,
@@ -10820,7 +11168,7 @@
"claimsProgram": {
"type": "Claims Program",
"name": "New Claims Program",
- "config": "{\n \"percentage\": 50\n}",
+ "config": "{\n \"percentage\": 51\n}",
"project": "Governance",
"assetClaimsFolders": [
{
@@ -10838,12 +11186,12 @@
"id": "e0f84f5a-a3fc-4fc2-8c82-9116b20ea4d5",
"savedPayload": {
"position": {
- "x": 20640.38168381688,
- "y": 17436.798988195555
+ "x": 18105.877417543295,
+ "y": 18595.97523767912
},
"targetPosition": {
- "x": 20229.286227877707,
- "y": 17619.830477579664
+ "x": 17694.781961604123,
+ "y": 18779.006727063228
},
"floatingObject": {
"isPinned": false,
@@ -10885,12 +11233,12 @@
"id": "dc382aa3-fb73-4770-817d-2d69da57fd26",
"savedPayload": {
"position": {
- "x": 20229.286227877707,
- "y": 17619.830477579664
+ "x": 17694.781961604123,
+ "y": 18779.006727063228
},
"targetPosition": {
- "x": 19818.190771938534,
- "y": 17802.861966963774
+ "x": 17283.68650566495,
+ "y": 18962.038216447338
},
"floatingObject": {
"isPinned": false,
@@ -10920,12 +11268,12 @@
"id": "7a943c21-0e4d-4ca2-ad65-2cee16923774",
"savedPayload": {
"position": {
- "x": 20626.708172675073,
- "y": 17996.969821227285
+ "x": 18092.20390640149,
+ "y": 19156.14607071085
},
"targetPosition": {
- "x": 20182.24841940726,
- "y": 18067.365330495388
+ "x": 17647.744153133677,
+ "y": 19226.54157997895
},
"floatingObject": {
"isPinned": false,
@@ -10979,12 +11327,12 @@
"id": "e44cbbd2-9ee2-46e9-aad1-747ac5670bea",
"savedPayload": {
"position": {
- "x": 20546.306066875986,
- "y": 18331.868694027
+ "x": 18011.801800602403,
+ "y": 19491.044943510566
},
"targetPosition": {
- "x": 20182.24841940726,
- "y": 18067.365330495388
+ "x": 17647.744153133677,
+ "y": 19226.54157997895
},
"floatingObject": {
"isPinned": false,
@@ -11038,12 +11386,12 @@
"id": "d90040a0-f341-4ccc-b04f-5e86b12de4a6",
"savedPayload": {
"position": {
- "x": 20252.643928675363,
- "y": 18511.8250837632
+ "x": 17718.13966240178,
+ "y": 19671.001333246764
},
"targetPosition": {
- "x": 20182.24841940726,
- "y": 18067.365330495388
+ "x": 17647.744153133677,
+ "y": 19226.54157997895
},
"floatingObject": {
"isPinned": false,
@@ -11093,12 +11441,12 @@
"id": "d64547b8-fa87-4ea3-a53a-90d55b325d14",
"savedPayload": {
"position": {
- "x": 20182.24841940726,
- "y": 18067.365330495388
+ "x": 17647.744153133677,
+ "y": 19226.54157997895
},
"targetPosition": {
- "x": 19818.190771938534,
- "y": 17802.861966963774
+ "x": 17283.68650566495,
+ "y": 18962.038216447338
},
"floatingObject": {
"isPinned": false,
@@ -11152,17 +11500,17 @@
{
"type": "Feature Contribution Claim",
"name": "Tensor Flow Integration New Features",
- "config": "{}",
+ "config": "{\n \"percentage\": 50\n}",
"project": "Governance",
"id": "b79c3adb-f641-42a9-bba9-312afb225a7b",
"savedPayload": {
"position": {
- "x": 20135.210610936818,
- "y": 18514.90018341111
+ "x": 17600.706344663235,
+ "y": 19674.076432894675
},
"targetPosition": {
- "x": 19771.152963468092,
- "y": 18250.396819879497
+ "x": 17236.64869719451,
+ "y": 19409.57306936306
},
"floatingObject": {
"isPinned": false,
@@ -11217,17 +11565,17 @@
{
"type": "Feature Contribution Claim",
"name": "User Defined Variables and Code New Features",
- "config": "{\n}",
+ "config": "{}",
"project": "Governance",
"id": "9d526dfa-522d-463f-9569-383be672d116",
"savedPayload": {
"position": {
- "x": 19360.05750752892,
- "y": 18433.428309263607
+ "x": 16825.553241255337,
+ "y": 19592.60455874717
},
"targetPosition": {
- "x": 19771.152963468092,
- "y": 18250.396819879497
+ "x": 17236.64869719451,
+ "y": 19409.57306936306
},
"floatingObject": {
"isPinned": false,
@@ -11283,12 +11631,12 @@
"id": "7f8f1fec-5a45-41c1-a297-a92a22b3e524",
"savedPayload": {
"position": {
- "x": 19771.152963468092,
- "y": 18250.396819879497
+ "x": 17236.64869719451,
+ "y": 19409.57306936306
},
"targetPosition": {
- "x": 19818.190771938534,
- "y": 17802.861966963774
+ "x": 17283.68650566495,
+ "y": 18962.038216447338
},
"floatingObject": {
"isPinned": false,
@@ -11320,12 +11668,12 @@
"id": "ffeb7ead-1cfd-4c0f-802a-64ab3d0ca55b",
"savedPayload": {
"position": {
- "x": 18995.99986006019,
- "y": 18168.924945731993
+ "x": 16461.495593786607,
+ "y": 19328.101195215557
},
"targetPosition": {
- "x": 19407.095315999362,
- "y": 17985.893456347883
+ "x": 16872.59104972578,
+ "y": 19145.069705831447
},
"floatingObject": {
"isPinned": false,
@@ -11375,12 +11723,12 @@
"id": "5cbec4c5-0432-4cf9-b105-34342ca701db",
"savedPayload": {
"position": {
- "x": 19407.095315999362,
- "y": 17985.893456347883
+ "x": 16872.59104972578,
+ "y": 19145.069705831447
},
"targetPosition": {
- "x": 19818.190771938534,
- "y": 17802.861966963774
+ "x": 17283.68650566495,
+ "y": 18962.038216447338
},
"floatingObject": {
"isPinned": false,
@@ -11403,12 +11751,12 @@
"id": "3ed14538-feda-4865-be79-3908e4ff44e8",
"savedPayload": {
"position": {
- "x": 19636.16194820417,
- "y": 17670.610285197967
+ "x": 17101.65768193059,
+ "y": 18829.78653468153
},
"targetPosition": {
- "x": 19818.190771938534,
- "y": 17802.861966963774
+ "x": 17283.68650566495,
+ "y": 18962.038216447338
},
"floatingObject": {
"isPinned": false,
@@ -11426,12 +11774,12 @@
"id": "647eddb0-6989-49ca-9288-8aaade078bec",
"savedPayload": {
"position": {
- "x": 19818.190771938534,
- "y": 17802.861966963774
+ "x": 17283.68650566495,
+ "y": 18962.038216447338
},
"targetPosition": {
- "x": 19865.228580408977,
- "y": 17355.32711404805
+ "x": 17330.724314135394,
+ "y": 18514.503363531614
},
"floatingObject": {
"isPinned": false,
@@ -11449,12 +11797,12 @@
"id": "704ea112-7592-4d37-b300-9227448bfe9f",
"savedPayload": {
"position": {
- "x": 19865.228580408977,
- "y": 17355.32711404805
+ "x": 17330.724314135394,
+ "y": 18514.503363531614
},
"targetPosition": {
- "x": 19501.17093294025,
- "y": 17090.823750516436
+ "x": 16966.666666666668,
+ "y": 18250
},
"floatingObject": {
"isPinned": false,
@@ -11472,7 +11820,7 @@
"financialPrograms": {
"type": "Financial Programs",
"name": "New Financial Programs",
- "config": "{\n \"percentage\": 2\n}",
+ "config": "{\n \"percentage\": 0\n}",
"project": "Governance",
"stakingProgram": {
"type": "Staking Program",
@@ -11588,12 +11936,12 @@
"id": "182c1476-f2a8-4c5a-8173-f37050aab5d5",
"savedPayload": {
"position": {
- "x": 19408.46583462777,
- "y": 17376.14070540498
+ "x": 16873.961568354185,
+ "y": 18535.316954888545
},
"targetPosition": {
- "x": 19501.17093294025,
- "y": 17090.823750516436
+ "x": 16966.666666666668,
+ "y": 18250
},
"floatingObject": {
"isPinned": false,
@@ -11611,12 +11959,12 @@
"id": "9b72df20-a4f0-4023-ae17-c46a64920716",
"savedPayload": {
"position": {
- "x": 19501.17093294025,
- "y": 17090.823750516436
+ "x": 16966.666666666668,
+ "y": 18250
},
"targetPosition": {
- "x": 19201.17093294025,
- "y": 17090.823750516436
+ "x": 16666.666666666668,
+ "y": 18250
},
"floatingObject": {
"isPinned": false,
@@ -11638,12 +11986,12 @@
"id": "a9459b1f-80a5-4676-a9eb-a21a11e32c50",
"savedPayload": {
"position": {
- "x": 18901.17093294025,
- "y": 17090.823750516436
+ "x": 16366.666666666668,
+ "y": 18250
},
"targetPosition": {
- "x": 19201.17093294025,
- "y": 17090.823750516436
+ "x": 16666.666666666668,
+ "y": 18250
},
"floatingObject": {
"isPinned": false,
@@ -11661,17 +12009,17 @@
"id": "142f5de2-3762-4f55-a839-22eac5c03c8f",
"savedPayload": {
"position": {
- "x": 19201.17093294025,
- "y": 17090.823750516436
+ "x": 16666.666666666668,
+ "y": 18250
},
"targetPosition": {
- "x": 19201.17093294025,
- "y": 17090.823750516436
+ "x": 16666.666666666668,
+ "y": 18250
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
- "isCollapsed": false,
+ "isCollapsed": true,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
diff --git a/Projects/Governance/Plugins/User-Profiles/Raplh2502.json b/Projects/Governance/Plugins/User-Profiles/Raplh2502.json
index e8ff6a5de..7c3c10360 100644
--- a/Projects/Governance/Plugins/User-Profiles/Raplh2502.json
+++ b/Projects/Governance/Plugins/User-Profiles/Raplh2502.json
@@ -1,7 +1,7 @@
{
"type": "User Profile",
"name": "Raplh2502",
- "config": "{\n \"signature\": {\n \"message\": \"Raplh2502\",\n \"messageHash\": \"0x002241abadf010338ef270d56138327b257a020ba556107b978f7e4a4f78e10f\",\n \"v\": \"0x1b\",\n \"r\": \"0xa45e37a0d602e45300e319a1ee714dcee22fdd44774b638a6086fe66fd5d25b1\",\n \"s\": \"0x36c0c11cbc382a559ae30d7d53940586b60b5a28e39a3240af33a58129accc25\",\n \"signature\": \"0xa45e37a0d602e45300e319a1ee714dcee22fdd44774b638a6086fe66fd5d25b136c0c11cbc382a559ae30d7d53940586b60b5a28e39a3240af33a58129accc251b\"\n },\n \"codeName\": \"Raplh2502\"\n}",
+ "config": "{\"signature\":{\"message\":\"Raplh2502\",\"messageHash\":\"0x002241abadf010338ef270d56138327b257a020ba556107b978f7e4a4f78e10f\",\"v\":\"0x1b\",\"r\":\"0xa45e37a0d602e45300e319a1ee714dcee22fdd44774b638a6086fe66fd5d25b1\",\"s\":\"0x36c0c11cbc382a559ae30d7d53940586b60b5a28e39a3240af33a58129accc25\",\"signature\":\"0xa45e37a0d602e45300e319a1ee714dcee22fdd44774b638a6086fe66fd5d25b136c0c11cbc382a559ae30d7d53940586b60b5a28e39a3240af33a58129accc251b\"},\"codeName\":\"Raplh2502\"}",
"project": "Governance",
"tokenPowerSwitch": {
"type": "Token Power Switch",
@@ -14,26 +14,26 @@
"name": "New Community Building Programs",
"config": "{}",
"project": "Governance",
- "supportProgram": {
- "type": "Support Program",
- "name": "New Support Program",
+ "referralProgram": {
+ "type": "Referral Program",
+ "name": "New Referral Program",
"config": "{}",
"project": "Governance",
- "userSupporters": [
+ "userReferrers": [
{
- "type": "User Supporter",
+ "type": "User Referrer",
"name": "Julian-Molina",
"config": "{}",
"project": "Governance",
- "id": "8654e417-6ac3-44da-89de-b348fba4aed4",
+ "id": "6cbb2eb6-53ee-4d1a-a7bb-f941553ce10e",
"savedPayload": {
"position": {
- "x": 35941.4493554574,
- "y": 23003.65789426258
+ "x": 30040.192378864664,
+ "y": 24100
},
"targetPosition": {
- "x": 36241.4493554574,
- "y": 23003.65789426258
+ "x": 30190.192378864664,
+ "y": 23840.192378864667
},
"floatingObject": {
"isPinned": false,
@@ -54,85 +54,9 @@
"referenceParentCombinedNodePath": [
[
"Julian-Molina",
- "User Profile"
- ]
- ]
- }
- },
- {
- "type": "User Supporter",
- "name": "harrellbm",
- "config": "{}",
- "project": "Governance",
- "id": "47ec59fb-4a1e-4e8d-a2df-5796ad4f8a7d",
- "savedPayload": {
- "position": {
- "x": 36091.4493554574,
- "y": 22743.850273127246
- },
- "targetPosition": {
- "x": 36241.4493554574,
- "y": 23003.65789426258
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 1,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "referenceParent": {
- "type": "User Profile",
- "name": "harrellbm",
- "id": "107d3e44-1685-4540-8316-3bc6591298e9"
- },
- "referenceParentCombinedNodePath": [
- [
- "harrellbm",
- "User Profile"
- ]
- ]
- }
- },
- {
- "type": "User Supporter",
- "name": "Luis-Fernando-Molina",
- "config": "{}",
- "project": "Governance",
- "id": "9d61971c-d916-454a-97a0-9d7a68747175",
- "savedPayload": {
- "position": {
- "x": 36391.4493554574,
- "y": 22743.850273127246
- },
- "targetPosition": {
- "x": 36241.4493554574,
- "y": 23003.65789426258
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 1,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "referenceParent": {
- "type": "User Profile",
- "name": "Luis-Fernando-Molina",
- "id": "148911b3-b2f3-44fb-8cb4-017991789132"
- },
- "referenceParentCombinedNodePath": [
- [
- "Luis-Fernando-Molina",
- "User Profile"
+ "User Profile",
+ "Governance",
+ "1fd95e41-4b22-48d5-be3a-904c37afcb11"
]
]
}
@@ -142,15 +66,15 @@
"type": "Tokens Awarded",
"name": "New Tokens Awarded",
"project": "Governance",
- "id": "8ac68836-fdb6-4549-83bb-4d9d253cec6e",
+ "id": "e80cafb6-7090-4eaa-b674-f9b5b5b8a42e",
"savedPayload": {
"position": {
- "x": 36541.4493554574,
- "y": 23003.65789426258
+ "x": 29930.38475772933,
+ "y": 23690.192378864667
},
"targetPosition": {
- "x": 36241.4493554574,
- "y": 23003.65789426258
+ "x": 30190.192378864664,
+ "y": 23840.192378864667
},
"floatingObject": {
"isPinned": false,
@@ -169,15 +93,15 @@
"type": "Tokens Bonus",
"name": "New Tokens Bonus",
"project": "Governance",
- "id": "de5c95e6-ff42-41a9-a253-7cd0115234ac",
+ "id": "8ef66cc7-be91-48e0-b065-bda219234215",
"savedPayload": {
"position": {
- "x": 36391.4493554574,
- "y": 23263.46551539791
+ "x": 30340.192378864664,
+ "y": 23580.384757729335
},
"targetPosition": {
- "x": 36241.4493554574,
- "y": 23003.65789426258
+ "x": 30190.192378864664,
+ "y": 23840.192378864667
},
"floatingObject": {
"isPinned": false,
@@ -192,15 +116,15 @@
}
}
},
- "id": "6b249e23-8de3-48e9-9f11-14f8c57dd8d5",
+ "id": "83a049e3-5222-4656-a6de-2ba670ae06dd",
"savedPayload": {
"position": {
- "x": 36241.4493554574,
- "y": 23003.65789426258
+ "x": 30190.192378864664,
+ "y": 23840.192378864667
},
"targetPosition": {
- "x": 36091.4493554574,
- "y": 23263.46551539791
+ "x": 30449.999999999996,
+ "y": 23990.192378864667
},
"floatingObject": {
"isPinned": false,
@@ -215,15 +139,544 @@
}
}
},
- "id": "61dfffc2-6a9a-450a-abe6-78c19ef34f73",
+ "supportProgram": {
+ "type": "Support Program",
+ "name": "New Support Program",
+ "config": "{}",
+ "project": "Governance",
+ "userSupporters": [
+ {
+ "type": "User Supporter",
+ "name": "Julian-Molina",
+ "config": "{}",
+ "project": "Governance",
+ "id": "98b2403d-8b67-4589-99e0-e324cfed7540",
+ "savedPayload": {
+ "position": {
+ "x": 42707.936362707216,
+ "y": 24108.655750652073
+ },
+ "targetPosition": {
+ "x": 42982,
+ "y": 23986.634757729335
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "Julian-Molina",
+ "id": "1fd95e41-4b22-48d5-be3a-904c37afcb11"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Julian-Molina",
+ "User Profile",
+ "Governance",
+ "1fd95e41-4b22-48d5-be3a-904c37afcb11"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "User Supporter",
+ "name": "harrellbm",
+ "config": "{}",
+ "project": "Governance",
+ "id": "e456cb6d-3935-4d0c-b744-053a5658aeb4",
+ "savedPayload": {
+ "position": {
+ "x": 42688.555719779855,
+ "y": 23924.261250484007
+ },
+ "targetPosition": {
+ "x": 42982,
+ "y": 23986.634757729335
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "harrellbm",
+ "id": "3af73d3b-7c0e-4de7-a1e1-a72238081740"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "harrellbm",
+ "User Profile",
+ "Governance",
+ "3af73d3b-7c0e-4de7-a1e1-a72238081740"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "User Supporter",
+ "name": "Luis-Fernando-Molina",
+ "config": "{}",
+ "project": "Governance",
+ "id": "162e169b-5db5-4977-bf65-e0b2e643c7eb",
+ "savedPayload": {
+ "position": {
+ "x": 42781.26081809234,
+ "y": 23763.691310086117
+ },
+ "targetPosition": {
+ "x": 42982,
+ "y": 23986.634757729335
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "Luis-Fernando-Molina",
+ "id": "a8de78f0-c3e4-4a2a-b7e8-f659073969db"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Luis-Fernando-Molina",
+ "User Profile",
+ "Governance",
+ "a8de78f0-c3e4-4a2a-b7e8-f659073969db"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "User Supporter",
+ "name": "ssplatt",
+ "config": "{}",
+ "project": "Governance",
+ "id": "43c5b4ff-44e0-4f9f-803b-5e054b92df1a",
+ "savedPayload": {
+ "position": {
+ "x": 42950.6414610197,
+ "y": 23688.278189118853
+ },
+ "targetPosition": {
+ "x": 42982,
+ "y": 23986.634757729335
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "ssplatt",
+ "id": "56600855-7a91-49e8-8a58-2fa28d07efd1"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "ssplatt",
+ "User Profile"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "User Supporter",
+ "name": "9808us",
+ "config": "{}",
+ "project": "Governance",
+ "id": "7b4f9489-a596-4298-9b94-b66d2d4658bd",
+ "savedPayload": {
+ "position": {
+ "x": 43132,
+ "y": 23726.827136594
+ },
+ "targetPosition": {
+ "x": 42982,
+ "y": 23986.634757729335
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "9808us",
+ "id": "280f0baf-bc13-497c-b255-618c1a146442"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "9808us",
+ "User Profile"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "User Supporter",
+ "name": "Smidy13",
+ "config": "{}",
+ "project": "Governance",
+ "id": "fd7c0cb5-00d4-4a39-9a43-90353d47aed1",
+ "savedPayload": {
+ "position": {
+ "x": 43256.063637292784,
+ "y": 23864.613764806596
+ },
+ "targetPosition": {
+ "x": 42982,
+ "y": 23986.634757729335
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "Smidy13",
+ "id": "4b5eca40-4d97-454d-91f3-8627a98ef682"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Smidy13",
+ "User Profile"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "User Supporter",
+ "name": "cozed-gh",
+ "config": "{}",
+ "project": "Governance",
+ "id": "96b71bb0-b795-4925-a1b6-f6a2ebc37aca",
+ "savedPayload": {
+ "position": {
+ "x": 43275.444280220145,
+ "y": 24049.008264974662
+ },
+ "targetPosition": {
+ "x": 42982,
+ "y": 23986.634757729335
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "cozed-gh",
+ "id": "07f0b13a-a50f-4488-8a2c-a3f8f08e889d"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "cozed-gh",
+ "User Profile"
+ ]
+ ]
+ }
+ }
+ ],
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "c551ba14-52b5-49a1-9359-e2573d39ae3d",
+ "savedPayload": {
+ "position": {
+ "x": 43182.73918190766,
+ "y": 24209.578205372552
+ },
+ "targetPosition": {
+ "x": 42982,
+ "y": 23986.634757729335
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensBonus": {
+ "type": "Tokens Bonus",
+ "name": "New Tokens Bonus",
+ "project": "Governance",
+ "id": "f8c43611-cecd-4606-914a-45554b4b933a",
+ "savedPayload": {
+ "position": {
+ "x": 43013.3585389803,
+ "y": 24284.991326339816
+ },
+ "targetPosition": {
+ "x": 42982,
+ "y": 23986.634757729335
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "cbf9752e-13db-443c-8f42-0001df229ac9",
+ "savedPayload": {
+ "position": {
+ "x": 30599.999999999996,
+ "y": 23730.384757729335
+ },
+ "targetPosition": {
+ "x": 30449.999999999996,
+ "y": 23990.192378864667
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "mentorshipProgram": {
+ "type": "Mentorship Program",
+ "name": "New Mentorship Program",
+ "config": "{}",
+ "project": "Governance",
+ "userMentors": [
+ {
+ "type": "User Mentor",
+ "name": "Luis-Fernando-Molina",
+ "config": "{}",
+ "project": "Governance",
+ "id": "6e659c1f-e68f-4d74-a878-052f3a5082a6",
+ "savedPayload": {
+ "position": {
+ "x": 30772.181128380656,
+ "y": 23846.748098644526
+ },
+ "targetPosition": {
+ "x": 30709.80762113533,
+ "y": 24140.192378864667
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "Luis-Fernando-Molina",
+ "id": "a8de78f0-c3e4-4a2a-b7e8-f659073969db"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Luis-Fernando-Molina",
+ "User Profile",
+ "Governance",
+ "a8de78f0-c3e4-4a2a-b7e8-f659073969db"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "User Mentor",
+ "name": "PLuv",
+ "config": "{}",
+ "project": "Governance",
+ "id": "130fc498-de5e-4607-bb18-dd8ba5b4bf18",
+ "savedPayload": {
+ "position": {
+ "x": 31008.16418974581,
+ "y": 24108.83383988437
+ },
+ "targetPosition": {
+ "x": 30709.80762113533,
+ "y": 24140.192378864667
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "PLuv",
+ "id": "142f5de2-3762-4f55-a839-22eac5c03c8f"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "PLuv",
+ "User Profile",
+ "Governance",
+ "142f5de2-3762-4f55-a839-22eac5c03c8f"
+ ]
+ ]
+ }
+ }
+ ],
+ "tokensAwarded": {
+ "type": "Tokens Awarded",
+ "name": "New Tokens Awarded",
+ "project": "Governance",
+ "id": "a335874e-f035-4301-aa67-157a9b831f6a",
+ "savedPayload": {
+ "position": {
+ "x": 30831.828614058068,
+ "y": 24414.256016157447
+ },
+ "targetPosition": {
+ "x": 30709.80762113533,
+ "y": 24140.192378864667
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensBonus": {
+ "type": "Tokens Bonus",
+ "name": "New Tokens Bonus",
+ "project": "Governance",
+ "id": "3fdc564c-e5d9-4b87-9f28-1440d68b0723",
+ "savedPayload": {
+ "position": {
+ "x": 30486.86417349211,
+ "y": 24340.931560772326
+ },
+ "targetPosition": {
+ "x": 30709.80762113533,
+ "y": 24140.192378864667
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "86586fb4-2a3b-49d6-bdd5-36975fa1a0a9",
+ "savedPayload": {
+ "position": {
+ "x": 30709.80762113533,
+ "y": 24140.192378864667
+ },
+ "targetPosition": {
+ "x": 30449.999999999996,
+ "y": 23990.192378864667
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "a32cc538-068f-49fd-a426-100a29f90339",
"savedPayload": {
"position": {
- "x": 36091.4493554574,
- "y": 23263.46551539791
+ "x": 30449.999999999996,
+ "y": 23990.192378864667
},
"targetPosition": {
- "x": 35941.4493554574,
- "y": 23523.273136533244
+ "x": 30299.999999999996,
+ "y": 24250
},
"floatingObject": {
"isPinned": false,
@@ -262,15 +715,15 @@
"name": "",
"config": "{}",
"project": "Governance",
- "id": "2dd37827-1cc1-40aa-b89a-917ccfe24d9b",
+ "id": "28aedac0-26d8-4278-9b75-3c10cf83e2a0",
"savedPayload": {
"position": {
- "x": 36501.25697659273,
- "y": 23592.88837880391
+ "x": 35060.4883090863,
+ "y": 10904.798575428878
},
"targetPosition": {
- "x": 36501.25697659273,
- "y": 23892.88837880391
+ "x": 35060.4883090863,
+ "y": 11204.798575428878
},
"floatingObject": {
"isPinned": false,
@@ -314,18 +767,18 @@
},
{
"type": "Feature Contribution Claim",
- "name": "User Defined Variables and Code New Features",
+ "name": "",
"config": "{}",
"project": "Governance",
- "id": "67e36fdc-9a1d-42c7-a62a-e99c605c5d33",
+ "id": "664ff3bf-0cad-467a-868f-d16a9ab4cc54",
"savedPayload": {
"position": {
- "x": 36761.064597728066,
- "y": 24042.88837880391
+ "x": 35320.29593022163,
+ "y": 11354.798575428878
},
"targetPosition": {
- "x": 36501.25697659273,
- "y": 23892.88837880391
+ "x": 35060.4883090863,
+ "y": 11204.798575428878
},
"floatingObject": {
"isPinned": false,
@@ -368,15 +821,15 @@
}
}
],
- "id": "a0af8811-9dc2-4a9a-a28f-358738a6994f",
+ "id": "f0f53e80-19a7-4364-b484-61b6242e7b8b",
"savedPayload": {
"position": {
- "x": 36501.25697659273,
- "y": 23892.88837880391
+ "x": 35060.4883090863,
+ "y": 11204.798575428878
},
"targetPosition": {
- "x": 36241.4493554574,
- "y": 24042.88837880391
+ "x": 34800.68068795097,
+ "y": 11354.798575428878
},
"floatingObject": {
"isPinned": false,
@@ -402,18 +855,18 @@
"positionContributionClaims": [
{
"type": "Position Contribution Claim",
- "name": "Moderator Community Management",
+ "name": "",
"config": "{}",
"project": "Governance",
- "id": "74cbbf75-2a2c-4081-9415-ba423848f2db",
+ "id": "ea777ab1-3cbf-4a71-935c-b0edd69f88ce",
"savedPayload": {
"position": {
- "x": 36541.4493554574,
- "y": 24562.503621074575
+ "x": 35100.68068795097,
+ "y": 11874.413817699544
},
"targetPosition": {
- "x": 36391.4493554574,
- "y": 24302.695999939242
+ "x": 34950.68068795097,
+ "y": 11614.606196564211
},
"floatingObject": {
"isPinned": false,
@@ -452,15 +905,15 @@
}
}
],
- "id": "e880f8a6-8e53-43dd-8b11-4210ca18c9ab",
+ "id": "2277d694-8325-4db1-997b-4d2972e7c232",
"savedPayload": {
"position": {
- "x": 36391.4493554574,
- "y": 24302.695999939242
+ "x": 34950.68068795097,
+ "y": 11614.606196564211
},
"targetPosition": {
- "x": 36241.4493554574,
- "y": 24042.88837880391
+ "x": 34800.68068795097,
+ "y": 11354.798575428878
},
"floatingObject": {
"isPinned": false,
@@ -499,15 +952,15 @@
"type": "Tokens Awarded",
"name": "New Tokens Awarded",
"project": "Governance",
- "id": "f7c63ab2-c803-4886-b043-6c6297981f85",
+ "id": "fdf321ca-029e-45c5-8178-6d28f5031ceb",
"savedPayload": {
"position": {
- "x": 35981.64173432207,
- "y": 24192.88837880391
+ "x": 34540.873066815635,
+ "y": 11504.798575428878
},
"targetPosition": {
- "x": 36241.4493554574,
- "y": 24042.88837880391
+ "x": 34800.68068795097,
+ "y": 11354.798575428878
},
"floatingObject": {
"isPinned": false,
@@ -522,20 +975,20 @@
}
}
},
- "id": "bd26adac-cf78-4aec-888f-a8718a657469",
+ "id": "f719f049-9b08-4343-8b4d-6bf4e48638b1",
"savedPayload": {
"position": {
- "x": 36241.4493554574,
- "y": 24042.88837880391
+ "x": 30599.999999999996,
+ "y": 24769.615242270665
},
"targetPosition": {
- "x": 36091.4493554574,
- "y": 23783.080757668577
+ "x": 30449.999999999996,
+ "y": 24509.807621135333
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
- "isCollapsed": false,
+ "isCollapsed": true,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
@@ -545,15 +998,15 @@
}
}
},
- "id": "22eacf7e-c02b-4853-a529-7789aeadb64e",
+ "id": "d317ab89-cb64-426b-931c-48755502da5d",
"savedPayload": {
"position": {
- "x": 36091.4493554574,
- "y": 23783.080757668577
+ "x": 30449.999999999996,
+ "y": 24509.807621135333
},
"targetPosition": {
- "x": 35941.4493554574,
- "y": 23523.273136533244
+ "x": 30299.999999999996,
+ "y": 24250
},
"floatingObject": {
"isPinned": false,
@@ -568,15 +1021,15 @@
}
}
},
- "id": "13f0fedf-2d0a-4b80-a191-05236a8138a6",
+ "id": "c67fa458-eb61-44c4-8f83-8cd5f8d1dbf9",
"savedPayload": {
"position": {
- "x": 35941.4493554574,
- "y": 23523.273136533244
+ "x": 30299.999999999996,
+ "y": 24250
},
"targetPosition": {
- "x": 35641.4493554574,
- "y": 23523.273136533244
+ "x": 29999.999999999996,
+ "y": 24250
},
"floatingObject": {
"isPinned": false,
@@ -595,15 +1048,15 @@
"type": "Tokens Mined",
"name": "New Tokens Mined",
"project": "Governance",
- "id": "b4c844ba-f1c1-44e8-96f6-96fbd6a8cbfd",
+ "id": "ea95efe5-2255-480b-8a3d-8c3e2fc62202",
"savedPayload": {
"position": {
- "x": 35341.4493554574,
- "y": 23523.273136533244
+ "x": 29699.999999999996,
+ "y": 24250
},
"targetPosition": {
- "x": 35641.4493554574,
- "y": 23523.273136533244
+ "x": 29999.999999999996,
+ "y": 24250
},
"floatingObject": {
"isPinned": false,
@@ -618,20 +1071,20 @@
}
}
},
- "id": "59a87d1a-0457-4a49-a11b-216716e5c889",
+ "id": "c538f02f-9a2c-47e2-bf92-f6e97ede4031",
"savedPayload": {
"position": {
- "x": 35641.4493554574,
- "y": 23523.273136533244
+ "x": 29999.999999999996,
+ "y": 24250
},
"targetPosition": {
- "x": 35641.4493554574,
- "y": 23523.273136533244
+ "x": 29999.999999999996,
+ "y": 24250
},
"floatingObject": {
"isPinned": true,
"isFrozen": false,
- "isCollapsed": false,
+ "isCollapsed": true,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
diff --git a/Projects/Governance/Plugins/User-Profiles/Smidy13.json b/Projects/Governance/Plugins/User-Profiles/Smidy13.json
index 0cb6af6e2..dc6a70868 100644
--- a/Projects/Governance/Plugins/User-Profiles/Smidy13.json
+++ b/Projects/Governance/Plugins/User-Profiles/Smidy13.json
@@ -332,8 +332,8 @@
"id": "09be5479-b174-4657-83ff-a6733bfaad19",
"savedPayload": {
"position": {
- "x": 25506.07036040197,
- "y": 16070.88237339432
+ "x": 25493.203803432192,
+ "y": 16079.891633575364
},
"targetPosition": {
"x": 25757.707166963806,
@@ -373,8 +373,8 @@
"id": "93e677af-a294-4b5b-b6ce-9702c49e7336",
"savedPayload": {
"position": {
- "x": 25648.842313943955,
- "y": 16007.316204219891
+ "x": 25618.64951949508,
+ "y": 16015.97384871127
},
"targetPosition": {
"x": 25757.707166963806,
@@ -408,14 +408,14 @@
},
{
"type": "User Supporter",
- "name": "",
+ "name": "PLuv",
"config": "{}",
"project": "Governance",
"id": "db5ddf80-ca21-47c7-bd78-0cb2a23fd85d",
"savedPayload": {
"position": {
- "x": 25804.74497543425,
- "y": 15996.414428128366
+ "x": 25757.707166963806,
+ "y": 15993.94928104409
},
"targetPosition": {
"x": 25757.707166963806,
@@ -449,14 +449,14 @@
},
{
"type": "User Supporter",
- "name": "",
+ "name": "cozed-gh",
"config": "{}",
"project": "Governance",
"id": "725c04ba-9bf7-4dfb-9362-f57a461489c3",
"savedPayload": {
"position": {
- "x": 25954.97418301889,
- "y": 16039.491960209465
+ "x": 25896.764814432532,
+ "y": 16015.97384871127
},
"targetPosition": {
"x": 25757.707166963806,
@@ -490,14 +490,14 @@
},
{
"type": "User Supporter",
- "name": "",
+ "name": "harrellbm",
"config": "{}",
"project": "Governance",
"id": "f565331c-acb6-4975-90c6-d5adbbc519f2",
"savedPayload": {
"position": {
- "x": 26081.410077116197,
- "y": 16131.353014337541
+ "x": 26022.21053049542,
+ "y": 16079.891633575364
},
"targetPosition": {
"x": 25757.707166963806,
@@ -531,14 +531,14 @@
},
{
"type": "User Supporter",
- "name": "",
+ "name": "ssplatt",
"config": "{}",
"project": "Governance",
"id": "8128018a-3e92-45cf-9009-628e33bb7ea9",
"savedPayload": {
"position": {
- "x": 26168.80262290298,
- "y": 16260.91779165998
+ "x": 26121.764814432532,
+ "y": 16179.445917512478
},
"targetPosition": {
"x": 25757.707166963806,
@@ -569,6 +569,45 @@
]
]
}
+ },
+ {
+ "type": "User Supporter",
+ "name": "Raplh2502",
+ "config": "{}",
+ "project": "Governance",
+ "id": "e35f5841-7f50-413c-b93e-8853f726a8d6",
+ "savedPayload": {
+ "position": {
+ "x": 26185.682599296626,
+ "y": 16304.891633575364
+ },
+ "targetPosition": {
+ "x": 25757.707166963806,
+ "y": 16443.94928104409
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "User Profile",
+ "name": "Raplh2502",
+ "id": "59a87d1a-0457-4a49-a11b-216716e5c889"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Raplh2502",
+ "User Profile"
+ ]
+ ]
+ }
}
],
"tokensAwarded": {
@@ -578,8 +617,8 @@
"id": "d1c9f943-78da-4c8f-af8f-1869890176ef",
"savedPayload": {
"position": {
- "x": 26206.610989580728,
- "y": 16412.558867859232
+ "x": 26207.707166963806,
+ "y": 16443.94928104409
},
"targetPosition": {
"x": 25757.707166963806,
@@ -605,8 +644,8 @@
"id": "3077ee81-0387-40e0-a4de-80075da14355",
"savedPayload": {
"position": {
- "x": 26190.27493013605,
- "y": 16567.98609116174
+ "x": 26185.682599296626,
+ "y": 16583.006928512816
},
"targetPosition": {
"x": 25757.707166963806,
@@ -910,7 +949,7 @@
"floatingObject": {
"isPinned": false,
"isFrozen": false,
- "isCollapsed": false,
+ "isCollapsed": true,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
@@ -973,7 +1012,7 @@
"featureClaimVotes": [
{
"type": "Feature Claim Vote",
- "name": "Luis-Fernando-Molina ",
+ "name": "Luis-Fernando-Molina Governance System New Features",
"config": "{}",
"project": "Governance",
"id": "5470585c-e41a-4f96-991a-3e931fb4471a",
@@ -999,7 +1038,7 @@
},
"referenceParent": {
"type": "Feature Contribution Claim",
- "name": "",
+ "name": "Governance System New Features",
"id": "92f0f22e-f631-482d-88b1-c16596bf951d"
},
"referenceParentCombinedNodePath": [
@@ -1046,7 +1085,7 @@
"c4815ebe-d3a8-47fd-b204-936242bd8f40"
],
[
- "",
+ "Governance System New Features",
"Feature Contribution Claim",
"Governance",
"92f0f22e-f631-482d-88b1-c16596bf951d"
@@ -1056,7 +1095,7 @@
},
{
"type": "Feature Claim Vote",
- "name": "Luis-Fernando-Molina ",
+ "name": "Luis-Fernando-Molina API Maps New Features",
"config": "{}",
"project": "Governance",
"id": "0fcfac9f-7889-47e3-8023-feaab4e9fadc",
@@ -1082,7 +1121,7 @@
},
"referenceParent": {
"type": "Feature Contribution Claim",
- "name": "",
+ "name": "API Maps New Features",
"id": "81c477e0-c9bf-4b25-a875-d265011a6136"
},
"referenceParentCombinedNodePath": [
@@ -1129,7 +1168,7 @@
"c4815ebe-d3a8-47fd-b204-936242bd8f40"
],
[
- "",
+ "API Maps New Features",
"Feature Contribution Claim",
"Governance",
"81c477e0-c9bf-4b25-a875-d265011a6136"
@@ -1351,12 +1390,12 @@
"id": "2c25ace8-b80b-4a76-b636-612d6e289604",
"savedPayload": {
"position": {
- "x": 26099.798986281297,
- "y": 16563.131868076354
+ "x": 26331.83456213587,
+ "y": 16648.097435530453
},
"targetPosition": {
- "x": 26241.959585023196,
- "y": 16827.310527633377
+ "x": 26339.687646628234,
+ "y": 16947.99463302312
},
"floatingObject": {
"isPinned": false,
@@ -1734,7 +1773,7 @@
"assetClaimVotes": [
{
"type": "Asset Claim Vote",
- "name": "Julian-Molina Data Data-Mining data-mining-001-data-mining-introduction.json",
+ "name": "Julian-Molina ",
"config": "{}",
"project": "Governance",
"id": "6b9ec56c-441a-43d4-9947-de7b0737d677",
@@ -1760,7 +1799,7 @@
},
"referenceParent": {
"type": "Asset Contribution Claim",
- "name": "Data Data-Mining data-mining-001-data-mining-introduction.json",
+ "name": "",
"id": "7374f808-a7fb-4025-aef9-a7f263a56d4b"
},
"referenceParentCombinedNodePath": [
@@ -1807,7 +1846,7 @@
"c718cbbb-6f32-4d77-acc5-601f7cb44189"
],
[
- "Data Data-Mining data-mining-001-data-mining-introduction.json",
+ "",
"Asset Contribution Claim",
"Governance",
"7374f808-a7fb-4025-aef9-a7f263a56d4b"
@@ -1817,7 +1856,7 @@
},
{
"type": "Asset Claim Vote",
- "name": "Julian-Molina Data Data-Mining data-mining-002-data-mining-workflows.json",
+ "name": "Julian-Molina ",
"config": "{}",
"project": "Governance",
"id": "041e4bc0-59e1-4e08-87a4-d252613a2fb1",
@@ -1843,7 +1882,7 @@
},
"referenceParent": {
"type": "Asset Contribution Claim",
- "name": "Data Data-Mining data-mining-002-data-mining-workflows.json",
+ "name": "",
"id": "c50ab92b-383d-4ba4-bacd-769542c676c1"
},
"referenceParentCombinedNodePath": [
@@ -1890,7 +1929,7 @@
"c718cbbb-6f32-4d77-acc5-601f7cb44189"
],
[
- "Data Data-Mining data-mining-002-data-mining-workflows.json",
+ "",
"Asset Contribution Claim",
"Governance",
"c50ab92b-383d-4ba4-bacd-769542c676c1"
@@ -1900,7 +1939,7 @@
},
{
"type": "Asset Claim Vote",
- "name": "Julian-Molina Data Data-Mining data-mining-003-data-mining-dataset-types.json",
+ "name": "Julian-Molina ",
"config": "{}",
"project": "Governance",
"id": "ea797037-4d84-496b-a171-a81ceab5f2fc",
@@ -1926,7 +1965,7 @@
},
"referenceParent": {
"type": "Asset Contribution Claim",
- "name": "Data Data-Mining data-mining-003-data-mining-dataset-types.json",
+ "name": "",
"id": "872621cd-d92e-4173-8d76-d0bb94432c0f"
},
"referenceParentCombinedNodePath": [
@@ -1973,7 +2012,7 @@
"c718cbbb-6f32-4d77-acc5-601f7cb44189"
],
[
- "Data Data-Mining data-mining-003-data-mining-dataset-types.json",
+ "",
"Asset Contribution Claim",
"Governance",
"872621cd-d92e-4173-8d76-d0bb94432c0f"
@@ -1983,7 +2022,7 @@
},
{
"type": "Asset Claim Vote",
- "name": "Julian-Molina Data Data-Mining data-mining-004-data-mining-datasets-type-conversions.json",
+ "name": "Julian-Molina ",
"config": "{}",
"project": "Governance",
"id": "26741720-6d08-4ced-b91f-f89d1dc521b6",
@@ -2009,7 +2048,7 @@
},
"referenceParent": {
"type": "Asset Contribution Claim",
- "name": "Data Data-Mining data-mining-004-data-mining-datasets-type-conversions.json",
+ "name": "",
"id": "1ef85d88-ab0a-4fb9-b193-77e0f88d091b"
},
"referenceParentCombinedNodePath": [
@@ -2056,7 +2095,7 @@
"c718cbbb-6f32-4d77-acc5-601f7cb44189"
],
[
- "Data Data-Mining data-mining-004-data-mining-datasets-type-conversions.json",
+ "",
"Asset Contribution Claim",
"Governance",
"1ef85d88-ab0a-4fb9-b193-77e0f88d091b"
@@ -2066,7 +2105,7 @@
},
{
"type": "Asset Claim Vote",
- "name": "Julian-Molina Data Data-Mining data-mining-005-data-mining-indicator-frameworks.json",
+ "name": "Julian-Molina ",
"config": "{}",
"project": "Governance",
"id": "cd59bcca-45e5-488c-b1f8-e68f6712592b",
@@ -2092,7 +2131,7 @@
},
"referenceParent": {
"type": "Asset Contribution Claim",
- "name": "Data Data-Mining data-mining-005-data-mining-indicator-frameworks.json",
+ "name": "",
"id": "c5a82a80-d288-4534-8862-8f4c0b31a7a9"
},
"referenceParentCombinedNodePath": [
@@ -2139,7 +2178,7 @@
"c718cbbb-6f32-4d77-acc5-601f7cb44189"
],
[
- "Data Data-Mining data-mining-005-data-mining-indicator-frameworks.json",
+ "",
"Asset Contribution Claim",
"Governance",
"c5a82a80-d288-4534-8862-8f4c0b31a7a9"
@@ -2149,7 +2188,7 @@
},
{
"type": "Asset Claim Vote",
- "name": "Julian-Molina Data Data-Mining data-mining-006-data-mining-data-mine-hierarchy.json",
+ "name": "Julian-Molina ",
"config": "{}",
"project": "Governance",
"id": "116902c3-4fed-4ddf-8ae4-bdd3c3f15899",
@@ -2175,7 +2214,7 @@
},
"referenceParent": {
"type": "Asset Contribution Claim",
- "name": "Data Data-Mining data-mining-006-data-mining-data-mine-hierarchy.json",
+ "name": "",
"id": "8089412c-2b1e-4173-950d-457ea2a4d53f"
},
"referenceParentCombinedNodePath": [
@@ -2222,7 +2261,7 @@
"c718cbbb-6f32-4d77-acc5-601f7cb44189"
],
[
- "Data Data-Mining data-mining-006-data-mining-data-mine-hierarchy.json",
+ "",
"Asset Contribution Claim",
"Governance",
"8089412c-2b1e-4173-950d-457ea2a4d53f"
@@ -2232,7 +2271,7 @@
},
{
"type": "Asset Claim Vote",
- "name": "Julian-Molina Data Data-Mining data-mining-007-data-mining-managing-execution.json",
+ "name": "Julian-Molina ",
"config": "{}",
"project": "Governance",
"id": "474170b5-1ed4-4d51-b76d-d5dc2aa02be7",
@@ -2258,7 +2297,7 @@
},
"referenceParent": {
"type": "Asset Contribution Claim",
- "name": "Data Data-Mining data-mining-007-data-mining-managing-execution.json",
+ "name": "",
"id": "797f9fcc-ebd6-444f-99eb-e1d00dc7ed8d"
},
"referenceParentCombinedNodePath": [
@@ -2305,7 +2344,7 @@
"c718cbbb-6f32-4d77-acc5-601f7cb44189"
],
[
- "Data Data-Mining data-mining-007-data-mining-managing-execution.json",
+ "",
"Asset Contribution Claim",
"Governance",
"797f9fcc-ebd6-444f-99eb-e1d00dc7ed8d"
@@ -2315,7 +2354,7 @@
},
{
"type": "Asset Claim Vote",
- "name": "Julian-Molina Data Data-Mining data-mining-008-data-mining-data-dependencies.json",
+ "name": "Julian-Molina ",
"config": "{}",
"project": "Governance",
"id": "027b943b-c44f-4287-914b-f475edcf18cf",
@@ -2341,7 +2380,7 @@
},
"referenceParent": {
"type": "Asset Contribution Claim",
- "name": "Data Data-Mining data-mining-008-data-mining-data-dependencies.json",
+ "name": "",
"id": "040cb5e5-985a-4a85-89b2-d8843845168a"
},
"referenceParentCombinedNodePath": [
@@ -2388,7 +2427,7 @@
"c718cbbb-6f32-4d77-acc5-601f7cb44189"
],
[
- "Data Data-Mining data-mining-008-data-mining-data-dependencies.json",
+ "",
"Asset Contribution Claim",
"Governance",
"040cb5e5-985a-4a85-89b2-d8843845168a"
@@ -2398,7 +2437,7 @@
},
{
"type": "Asset Claim Vote",
- "name": "Julian-Molina Data Data-Mining data-mining-009-data-mining-status-reports.json",
+ "name": "Julian-Molina ",
"config": "{}",
"project": "Governance",
"id": "580e4bdc-a50c-49b9-91de-20a273d009a9",
@@ -2424,7 +2463,7 @@
},
"referenceParent": {
"type": "Asset Contribution Claim",
- "name": "Data Data-Mining data-mining-009-data-mining-status-reports.json",
+ "name": "",
"id": "43baad58-8f7f-45e1-bf55-0bb21cbc33e5"
},
"referenceParentCombinedNodePath": [
@@ -2471,7 +2510,7 @@
"c718cbbb-6f32-4d77-acc5-601f7cb44189"
],
[
- "Data Data-Mining data-mining-009-data-mining-status-reports.json",
+ "",
"Asset Contribution Claim",
"Governance",
"43baad58-8f7f-45e1-bf55-0bb21cbc33e5"
@@ -2481,7 +2520,7 @@
},
{
"type": "Asset Claim Vote",
- "name": "Julian-Molina Data Data-Mining data-mining-010-data-mining-status-dependencies.json",
+ "name": "Julian-Molina ",
"config": "{}",
"project": "Governance",
"id": "368c1b49-846b-436f-9773-43b4fa73ecee",
@@ -2507,7 +2546,7 @@
},
"referenceParent": {
"type": "Asset Contribution Claim",
- "name": "Data Data-Mining data-mining-010-data-mining-status-dependencies.json",
+ "name": "",
"id": "7bfd9ed1-1305-4e60-8411-deaa5ef5d48e"
},
"referenceParentCombinedNodePath": [
@@ -2554,7 +2593,7 @@
"c718cbbb-6f32-4d77-acc5-601f7cb44189"
],
[
- "Data Data-Mining data-mining-010-data-mining-status-dependencies.json",
+ "",
"Asset Contribution Claim",
"Governance",
"7bfd9ed1-1305-4e60-8411-deaa5ef5d48e"
@@ -2564,7 +2603,7 @@
},
{
"type": "Asset Claim Vote",
- "name": "Julian-Molina Data Data-Mining data-mining-011-data-mining-deployments.json",
+ "name": "Julian-Molina ",
"config": "{}",
"project": "Governance",
"id": "4d7374c1-f526-4504-a55e-3c30492e9684",
@@ -2590,7 +2629,7 @@
},
"referenceParent": {
"type": "Asset Contribution Claim",
- "name": "Data Data-Mining data-mining-011-data-mining-deployments.json",
+ "name": "",
"id": "25a02023-7635-408c-b6db-28e9c53017d5"
},
"referenceParentCombinedNodePath": [
@@ -2637,7 +2676,7 @@
"c718cbbb-6f32-4d77-acc5-601f7cb44189"
],
[
- "Data Data-Mining data-mining-011-data-mining-deployments.json",
+ "",
"Asset Contribution Claim",
"Governance",
"25a02023-7635-408c-b6db-28e9c53017d5"
@@ -2647,7 +2686,7 @@
},
{
"type": "Asset Claim Vote",
- "name": "Julian-Molina Data Data-Mining data-mining-012-data-mining-products.json",
+ "name": "Julian-Molina ",
"config": "{}",
"project": "Governance",
"id": "a5cf1c4b-5afc-4fec-9720-18344584e6e8",
@@ -2673,7 +2712,7 @@
},
"referenceParent": {
"type": "Asset Contribution Claim",
- "name": "Data Data-Mining data-mining-012-data-mining-products.json",
+ "name": "",
"id": "0e4fecd0-117d-46f0-9f54-67c7d7bd7f1a"
},
"referenceParentCombinedNodePath": [
@@ -2720,7 +2759,7 @@
"c718cbbb-6f32-4d77-acc5-601f7cb44189"
],
[
- "Data Data-Mining data-mining-012-data-mining-products.json",
+ "",
"Asset Contribution Claim",
"Governance",
"0e4fecd0-117d-46f0-9f54-67c7d7bd7f1a"
@@ -2730,7 +2769,7 @@
},
{
"type": "Asset Claim Vote",
- "name": "Julian-Molina Data Data-Mining data-mining-013-data-mining-plotting.json",
+ "name": "Julian-Molina ",
"config": "{}",
"project": "Governance",
"id": "061dcc9a-994e-46e9-9564-57582103aa00",
@@ -2756,7 +2795,7 @@
},
"referenceParent": {
"type": "Asset Contribution Claim",
- "name": "Data Data-Mining data-mining-013-data-mining-plotting.json",
+ "name": "",
"id": "18543f20-fc0e-4a9d-b893-00647cdbd0e3"
},
"referenceParentCombinedNodePath": [
@@ -2803,7 +2842,7 @@
"c718cbbb-6f32-4d77-acc5-601f7cb44189"
],
[
- "Data Data-Mining data-mining-013-data-mining-plotting.json",
+ "",
"Asset Contribution Claim",
"Governance",
"18543f20-fc0e-4a9d-b893-00647cdbd0e3"
@@ -2813,7 +2852,7 @@
},
{
"type": "Asset Claim Vote",
- "name": "Julian-Molina Data Data-Mining data-mining-014-data-mining-fetching-data-from-apis.json",
+ "name": "Julian-Molina ",
"config": "{}",
"project": "Governance",
"id": "62505b43-6945-4860-9fcf-bd9b82327eed",
@@ -2839,7 +2878,7 @@
},
"referenceParent": {
"type": "Asset Contribution Claim",
- "name": "Data Data-Mining data-mining-014-data-mining-fetching-data-from-apis.json",
+ "name": "",
"id": "94bfa541-6b42-4932-84c9-09b4b6128088"
},
"referenceParentCombinedNodePath": [
@@ -2886,7 +2925,7 @@
"c718cbbb-6f32-4d77-acc5-601f7cb44189"
],
[
- "Data Data-Mining data-mining-014-data-mining-fetching-data-from-apis.json",
+ "",
"Asset Contribution Claim",
"Governance",
"94bfa541-6b42-4932-84c9-09b4b6128088"
@@ -2896,7 +2935,7 @@
},
{
"type": "Asset Claim Vote",
- "name": "Julian-Molina Data Data-Mining data-mining-015-data-mining-consuming-data-from-strategies.json",
+ "name": "Julian-Molina ",
"config": "{}",
"project": "Governance",
"id": "a9762887-50c7-496c-a69d-8fbf2a17981c",
@@ -2922,7 +2961,7 @@
},
"referenceParent": {
"type": "Asset Contribution Claim",
- "name": "Data Data-Mining data-mining-015-data-mining-consuming-data-from-strategies.json",
+ "name": "",
"id": "1e539e74-e1f5-4d9f-9669-904b4b6936ef"
},
"referenceParentCombinedNodePath": [
@@ -2969,7 +3008,7 @@
"c718cbbb-6f32-4d77-acc5-601f7cb44189"
],
[
- "Data Data-Mining data-mining-015-data-mining-consuming-data-from-strategies.json",
+ "",
"Asset Contribution Claim",
"Governance",
"1e539e74-e1f5-4d9f-9669-904b4b6936ef"
@@ -2979,7 +3018,7 @@
},
{
"type": "Asset Claim Vote",
- "name": "Julian-Molina Data Data-Mining data-mining-016-data-mining-indicator-bots.json",
+ "name": "Julian-Molina ",
"config": "{}",
"project": "Governance",
"id": "4421b81c-b2f8-4711-a440-6ea28ff499b9",
@@ -3005,7 +3044,7 @@
},
"referenceParent": {
"type": "Asset Contribution Claim",
- "name": "Data Data-Mining data-mining-016-data-mining-indicator-bots.json",
+ "name": "",
"id": "6fa9cd03-2703-4298-8d0d-49642dddba24"
},
"referenceParentCombinedNodePath": [
@@ -3052,7 +3091,7 @@
"c718cbbb-6f32-4d77-acc5-601f7cb44189"
],
[
- "Data Data-Mining data-mining-016-data-mining-indicator-bots.json",
+ "",
"Asset Contribution Claim",
"Governance",
"6fa9cd03-2703-4298-8d0d-49642dddba24"
@@ -3062,7 +3101,7 @@
},
{
"type": "Asset Claim Vote",
- "name": "Julian-Molina Data Data-Mining data-mining-017-data-mining-indicator-bots-process-definition.json",
+ "name": "Julian-Molina ",
"config": "{}",
"project": "Governance",
"id": "39151ff0-7ea4-414f-8a72-a9db2cd0f2d0",
@@ -3088,7 +3127,7 @@
},
"referenceParent": {
"type": "Asset Contribution Claim",
- "name": "Data Data-Mining data-mining-017-data-mining-indicator-bots-process-definition.json",
+ "name": "",
"id": "a09c682d-dd6a-474e-9811-1b4d3bc55a4d"
},
"referenceParentCombinedNodePath": [
@@ -3135,7 +3174,7 @@
"c718cbbb-6f32-4d77-acc5-601f7cb44189"
],
[
- "Data Data-Mining data-mining-017-data-mining-indicator-bots-process-definition.json",
+ "",
"Asset Contribution Claim",
"Governance",
"a09c682d-dd6a-474e-9811-1b4d3bc55a4d"
@@ -3145,7 +3184,7 @@
},
{
"type": "Asset Claim Vote",
- "name": "Julian-Molina Data Data-Mining data-mining-018-data-mining-indicator-bots-product-definition.json",
+ "name": "Julian-Molina ",
"config": "{}",
"project": "Governance",
"id": "cebe3e37-dd1b-4ac6-aafc-ebed4885b4db",
@@ -3171,7 +3210,7 @@
},
"referenceParent": {
"type": "Asset Contribution Claim",
- "name": "Data Data-Mining data-mining-018-data-mining-indicator-bots-product-definition.json",
+ "name": "",
"id": "d56fc2b2-4d19-4483-833c-253dd2b8f2d8"
},
"referenceParentCombinedNodePath": [
@@ -3218,7 +3257,7 @@
"c718cbbb-6f32-4d77-acc5-601f7cb44189"
],
[
- "Data Data-Mining data-mining-018-data-mining-indicator-bots-product-definition.json",
+ "",
"Asset Contribution Claim",
"Governance",
"d56fc2b2-4d19-4483-833c-253dd2b8f2d8"
@@ -3228,7 +3267,7 @@
},
{
"type": "Asset Claim Vote",
- "name": "Julian-Molina Data Data-Mining data-mining-019-data-mining-indicator-bots-data-mining-workflow.json",
+ "name": "Julian-Molina ",
"config": "{}",
"project": "Governance",
"id": "6bedca45-4dab-4e73-8804-9701f06240e8",
@@ -3254,7 +3293,7 @@
},
"referenceParent": {
"type": "Asset Contribution Claim",
- "name": "Data Data-Mining data-mining-019-data-mining-indicator-bots-data-mining-workflow.json",
+ "name": "",
"id": "dd6fbf37-f460-47f6-a958-5a595b7de2a7"
},
"referenceParentCombinedNodePath": [
@@ -3301,7 +3340,7 @@
"c718cbbb-6f32-4d77-acc5-601f7cb44189"
],
[
- "Data Data-Mining data-mining-019-data-mining-indicator-bots-data-mining-workflow.json",
+ "",
"Asset Contribution Claim",
"Governance",
"dd6fbf37-f460-47f6-a958-5a595b7de2a7"
@@ -3311,7 +3350,7 @@
},
{
"type": "Asset Claim Vote",
- "name": "Julian-Molina Data Data-Mining data-mining-020-data-mining-indicator-bots-coding-the-indicators-logic.json",
+ "name": "Julian-Molina ",
"config": "{}",
"project": "Governance",
"id": "1c080b8a-5332-492d-99ce-427afb93a1a3",
@@ -3337,7 +3376,7 @@
},
"referenceParent": {
"type": "Asset Contribution Claim",
- "name": "Data Data-Mining data-mining-020-data-mining-indicator-bots-coding-the-indicators-logic.json",
+ "name": "",
"id": "554c413c-cd47-4e79-9b14-c9a1f2e88f5b"
},
"referenceParentCombinedNodePath": [
@@ -3384,7 +3423,7 @@
"c718cbbb-6f32-4d77-acc5-601f7cb44189"
],
[
- "Data Data-Mining data-mining-020-data-mining-indicator-bots-coding-the-indicators-logic.json",
+ "",
"Asset Contribution Claim",
"Governance",
"554c413c-cd47-4e79-9b14-c9a1f2e88f5b"
@@ -3394,7 +3433,7 @@
},
{
"type": "Asset Claim Vote",
- "name": "Julian-Molina Data Data-Mining data-mining-021-data-mining-plotters.json",
+ "name": "Julian-Molina ",
"config": "{}",
"project": "Governance",
"id": "5fb662fd-cbd6-4e6b-ae01-aced70f8d0c9",
@@ -3420,7 +3459,7 @@
},
"referenceParent": {
"type": "Asset Contribution Claim",
- "name": "Data Data-Mining data-mining-021-data-mining-plotters.json",
+ "name": "",
"id": "719a919d-02b7-4335-b93d-d1062485393e"
},
"referenceParentCombinedNodePath": [
@@ -3467,7 +3506,7 @@
"c718cbbb-6f32-4d77-acc5-601f7cb44189"
],
[
- "Data Data-Mining data-mining-021-data-mining-plotters.json",
+ "",
"Asset Contribution Claim",
"Governance",
"719a919d-02b7-4335-b93d-d1062485393e"
@@ -3477,7 +3516,7 @@
},
{
"type": "Asset Claim Vote",
- "name": "Julian-Molina Data Data-Mining data-mining-022-data-mining-plotters-shapes.json",
+ "name": "Julian-Molina ",
"config": "{}",
"project": "Governance",
"id": "3962307d-49b3-4fce-9ddc-ae9af05461b5",
@@ -3503,7 +3542,7 @@
},
"referenceParent": {
"type": "Asset Contribution Claim",
- "name": "Data Data-Mining data-mining-022-data-mining-plotters-shapes.json",
+ "name": "",
"id": "4ec17db7-bd10-4277-b25a-97d66a2a8465"
},
"referenceParentCombinedNodePath": [
@@ -3550,7 +3589,7 @@
"c718cbbb-6f32-4d77-acc5-601f7cb44189"
],
[
- "Data Data-Mining data-mining-022-data-mining-plotters-shapes.json",
+ "",
"Asset Contribution Claim",
"Governance",
"4ec17db7-bd10-4277-b25a-97d66a2a8465"
@@ -3560,7 +3599,7 @@
},
{
"type": "Asset Claim Vote",
- "name": "Julian-Molina Data Data-Mining data-mining-023-data-mining-how-to-build-an-indicator-video-series.json",
+ "name": "Julian-Molina ",
"config": "{}",
"project": "Governance",
"id": "e651b334-ef96-4b2f-8836-83a44aa985fa",
@@ -3586,7 +3625,7 @@
},
"referenceParent": {
"type": "Asset Contribution Claim",
- "name": "Data Data-Mining data-mining-023-data-mining-how-to-build-an-indicator-video-series.json",
+ "name": "",
"id": "dd17448e-2219-4f9f-8af8-bd88e0ecc8a9"
},
"referenceParentCombinedNodePath": [
@@ -3633,7 +3672,7 @@
"c718cbbb-6f32-4d77-acc5-601f7cb44189"
],
[
- "Data Data-Mining data-mining-023-data-mining-how-to-build-an-indicator-video-series.json",
+ "",
"Asset Contribution Claim",
"Governance",
"dd17448e-2219-4f9f-8af8-bd88e0ecc8a9"
@@ -3870,7 +3909,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
- "name": "Julian-Molina ",
+ "name": "Julian-Molina Marketing Lead Rewarded Positions",
"config": "{}",
"project": "Governance",
"id": "bccefe00-20df-4c21-86c0-ea47c293e152",
@@ -3896,7 +3935,7 @@
},
"referenceParent": {
"type": "Position Contribution Claim",
- "name": "",
+ "name": "Marketing Lead Rewarded Positions",
"id": "924ae88a-510a-4d4b-8d8d-906be074e3c8"
},
"referenceParentCombinedNodePath": [
@@ -3943,7 +3982,7 @@
"5330adbb-3e69-403d-947f-20ec99c48561"
],
[
- "",
+ "Marketing Lead Rewarded Positions",
"Position Contribution Claim",
"Governance",
"924ae88a-510a-4d4b-8d8d-906be074e3c8"
@@ -3953,7 +3992,7 @@
},
{
"type": "Position Claim Vote",
- "name": "Julian-Molina ",
+ "name": "Julian-Molina Webmaster Superalgos.org Rewarded Positions",
"config": "{}",
"project": "Governance",
"id": "a383a990-9e6f-40ab-a99b-1750802e6040",
@@ -3979,7 +4018,7 @@
},
"referenceParent": {
"type": "Position Contribution Claim",
- "name": "",
+ "name": "Webmaster Superalgos.org Rewarded Positions",
"id": "e65b1b4d-d9dc-476c-90fa-a7bf4b2ba3b0"
},
"referenceParentCombinedNodePath": [
@@ -4026,7 +4065,7 @@
"5330adbb-3e69-403d-947f-20ec99c48561"
],
[
- "",
+ "Webmaster Superalgos.org Rewarded Positions",
"Position Contribution Claim",
"Governance",
"e65b1b4d-d9dc-476c-90fa-a7bf4b2ba3b0"
@@ -4036,7 +4075,7 @@
},
{
"type": "Position Claim Vote",
- "name": "Julian-Molina ",
+ "name": "Julian-Molina Social Media Accounts Manager Rewarded Positions",
"config": "{}",
"project": "Governance",
"id": "71717532-ab8f-488b-bf8c-3edd47d4876f",
@@ -4062,7 +4101,7 @@
},
"referenceParent": {
"type": "Position Contribution Claim",
- "name": "",
+ "name": "Social Media Accounts Manager Rewarded Positions",
"id": "00c47bb5-1fb4-470d-a86c-29b46836ba8c"
},
"referenceParentCombinedNodePath": [
@@ -4109,7 +4148,7 @@
"5330adbb-3e69-403d-947f-20ec99c48561"
],
[
- "",
+ "Social Media Accounts Manager Rewarded Positions",
"Position Contribution Claim",
"Governance",
"00c47bb5-1fb4-470d-a86c-29b46836ba8c"
@@ -4283,7 +4322,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
- "name": "Julian-Molina ",
+ "name": "Julian-Molina Telgram Groups / Discord Server Manager Community Management",
"config": "{}",
"project": "Governance",
"id": "450b1fd5-b24d-4d69-8e03-79912cf4a2c7",
@@ -4309,7 +4348,7 @@
},
"referenceParent": {
"type": "Position Contribution Claim",
- "name": "",
+ "name": "Telgram Groups / Discord Server Manager Community Management",
"id": "e2e294a7-bfab-43c3-821f-f8f93f4adcd7"
},
"referenceParentCombinedNodePath": [
@@ -4362,7 +4401,7 @@
"d208f55d-98d9-49b9-addd-e1153d86f655"
],
[
- "",
+ "Telgram Groups / Discord Server Manager Community Management",
"Position Contribution Claim",
"Governance",
"e2e294a7-bfab-43c3-821f-f8f93f4adcd7"
@@ -4460,7 +4499,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
- "name": "Julian-Molina ",
+ "name": "Julian-Molina Business Lead Business",
"config": "{}",
"project": "Governance",
"id": "94232766-3101-408a-ae08-fae411230745",
@@ -4486,7 +4525,7 @@
},
"referenceParent": {
"type": "Position Contribution Claim",
- "name": "",
+ "name": "Business Lead Business",
"id": "f6bc13cb-c70b-4a42-9491-6796aa862d54"
},
"referenceParentCombinedNodePath": [
@@ -4539,7 +4578,7 @@
"9aa27341-8bb6-4f69-958a-53671709c2ec"
],
[
- "",
+ "Business Lead Business",
"Position Contribution Claim",
"Governance",
"f6bc13cb-c70b-4a42-9491-6796aa862d54"
@@ -4637,7 +4676,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
- "name": "Julian-Molina ",
+ "name": "Julian-Molina Member Core Team",
"config": "{}",
"project": "Governance",
"id": "93afe140-cd06-4de7-865e-1aeb425b6c3a",
@@ -4663,7 +4702,7 @@
},
"referenceParent": {
"type": "Position Contribution Claim",
- "name": "",
+ "name": "Member Core Team",
"id": "74b80085-5336-4046-959d-2d7367d4e0a0"
},
"referenceParentCombinedNodePath": [
@@ -4716,7 +4755,7 @@
"c63ca77a-3d16-42bc-a50d-048ad2052430"
],
[
- "",
+ "Member Core Team",
"Position Contribution Claim",
"Governance",
"74b80085-5336-4046-959d-2d7367d4e0a0"
@@ -5022,12 +5061,12 @@
"id": "524eda3d-3bb3-47c7-95fd-be4d2066e8f7",
"savedPayload": {
"position": {
- "x": 26228.500135918042,
- "y": 16527.612607670984
+ "x": 26447.198031491826,
+ "y": 16667.920505073962
},
"targetPosition": {
- "x": 26241.959585023196,
- "y": 16827.310527633377
+ "x": 26339.687646628234,
+ "y": 16947.99463302312
},
"floatingObject": {
"isPinned": false,
@@ -5058,7 +5097,7 @@
"assetClaimVotes": [
{
"type": "Asset Claim Vote",
- "name": "",
+ "name": "PLuv ",
"config": "{}",
"project": "Governance",
"id": "d583f02c-565f-4fdd-a744-5ef99fb3cdd1",
@@ -5113,7 +5152,7 @@
"647eddb0-6989-49ca-9288-8aaade078bec"
],
[
- "New Asset Claims Folder",
+ "Pluvtech Data Mine",
"Asset Claims Folder",
"Governance",
"dc382aa3-fb73-4770-817d-2d69da57fd26"
@@ -5152,7 +5191,7 @@
},
"referenceParent": {
"type": "Asset Claims Folder",
- "name": "New Asset Claims Folder",
+ "name": "Pluvtech Data Mine",
"id": "dc382aa3-fb73-4770-817d-2d69da57fd26"
},
"referenceParentCombinedNodePath": [
@@ -5181,7 +5220,7 @@
"647eddb0-6989-49ca-9288-8aaade078bec"
],
[
- "New Asset Claims Folder",
+ "Pluvtech Data Mine",
"Asset Claims Folder",
"Governance",
"dc382aa3-fb73-4770-817d-2d69da57fd26"
@@ -5200,7 +5239,7 @@
"featureClaimVotes": [
{
"type": "Feature Claim Vote",
- "name": "",
+ "name": "PLuv Tensor Flow Integration New Features",
"config": "{}",
"project": "Governance",
"id": "929567d0-0336-46c6-9210-6a1c81f5ae49",
@@ -5271,7 +5310,7 @@
},
{
"type": "Feature Claim Vote",
- "name": "",
+ "name": "PLuv User Defined Variables and Code New Features",
"config": "{}",
"project": "Governance",
"id": "15b23c60-caae-443e-b466-0c69493c927f",
@@ -5410,7 +5449,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
- "name": "",
+ "name": "PLuv Moderator Community Management",
"config": "{}",
"project": "Governance",
"id": "6550bc96-76b3-4fb1-ba33-0e0e189db948",
@@ -5620,12 +5659,12 @@
"id": "d0a10f6a-c53d-42a1-959a-bba931370579",
"savedPayload": {
"position": {
- "x": 26359.867094519373,
- "y": 16551.452195867943
+ "x": 26546.19401933636,
+ "y": 16730.382321719437
},
"targetPosition": {
- "x": 26241.959585023196,
- "y": 16827.310527633377
+ "x": 26339.687646628234,
+ "y": 16947.99463302312
},
"floatingObject": {
"isPinned": false,
@@ -5668,7 +5707,7 @@
"assetClaimVotes": [
{
"type": "Asset Claim Vote",
- "name": "",
+ "name": "harrellbm ",
"config": "{}",
"project": "Governance",
"id": "18d58a85-fdc8-42fd-bd0a-d46fd5b4af35",
@@ -5903,7 +5942,7 @@
"assetClaimVotes": [
{
"type": "Asset Claim Vote",
- "name": "",
+ "name": "harrellbm ",
"config": "{}",
"project": "Governance",
"id": "3a0b7124-ed53-413e-8681-da5be058296b",
@@ -6062,7 +6101,7 @@
"assetClaimVotes": [
{
"type": "Asset Claim Vote",
- "name": "",
+ "name": "harrellbm ",
"config": "{}",
"project": "Governance",
"id": "015d7af0-9f3a-44e4-a0e4-c98a858c5719",
@@ -6227,7 +6266,7 @@
"assetClaimVotes": [
{
"type": "Asset Claim Vote",
- "name": "",
+ "name": "harrellbm ",
"config": "{}",
"project": "Governance",
"id": "5f301af6-056c-446b-8c9a-5acc94e5540e",
@@ -6468,7 +6507,7 @@
"assetClaimVotes": [
{
"type": "Asset Claim Vote",
- "name": "",
+ "name": "harrellbm ",
"config": "{}",
"project": "Governance",
"id": "91bc64ec-da2d-4a34-a611-c383e47feac7",
@@ -6633,7 +6672,7 @@
"assetClaimVotes": [
{
"type": "Asset Claim Vote",
- "name": "",
+ "name": "harrellbm ",
"config": "{}",
"project": "Governance",
"id": "e9eee481-5454-4f21-ab66-51674fd42aa0",
@@ -6874,7 +6913,7 @@
"assetClaimVotes": [
{
"type": "Asset Claim Vote",
- "name": "",
+ "name": "harrellbm ",
"config": "{}",
"project": "Governance",
"id": "9c5e5318-a360-47b2-a484-61fedc153005",
@@ -7039,7 +7078,7 @@
"assetClaimVotes": [
{
"type": "Asset Claim Vote",
- "name": "",
+ "name": "harrellbm ",
"config": "{}",
"project": "Governance",
"id": "42a79506-a7ea-4ece-aa32-9a6115d6c730",
@@ -7204,7 +7243,7 @@
"assetClaimVotes": [
{
"type": "Asset Claim Vote",
- "name": "",
+ "name": "harrellbm Superalgos Root README.md",
"config": "{}",
"project": "Governance",
"id": "411828ab-fa58-4bb6-b8ed-834318095ce0",
@@ -7510,7 +7549,7 @@
"featureClaimVotes": [
{
"type": "Feature Claim Vote",
- "name": "",
+ "name": "harrellbm Visual Designer Existing Features",
"config": "{}",
"project": "Governance",
"id": "1d48ed77-80ec-4b83-b033-5172dfc77057",
@@ -7663,7 +7702,7 @@
"featureClaimVotes": [
{
"type": "Feature Claim Vote",
- "name": "",
+ "name": "harrellbm Governance System New Features",
"config": "{}",
"project": "Governance",
"id": "fc2983e5-1b88-4e7c-8fb8-7fadded2f4e7",
@@ -7740,7 +7779,7 @@
},
{
"type": "Feature Claim Vote",
- "name": "",
+ "name": "harrellbm API Maps New Features",
"config": "{}",
"project": "Governance",
"id": "922ce401-2891-468c-a49e-7a5c3f947f01",
@@ -7817,7 +7856,7 @@
},
{
"type": "Feature Claim Vote",
- "name": "",
+ "name": "harrellbm Node Setup Script New Features",
"config": "{}",
"project": "Governance",
"id": "e2ce092e-8034-41e4-a2ab-c5a307996b84",
@@ -7894,7 +7933,7 @@
},
{
"type": "Feature Claim Vote",
- "name": "",
+ "name": "harrellbm Shortcuts New Features",
"config": "{}",
"project": "Governance",
"id": "68cf261a-cc19-4c3d-8666-2fc823607f8b",
@@ -7971,7 +8010,7 @@
},
{
"type": "Feature Claim Vote",
- "name": "",
+ "name": "harrellbm Reference Auto Fix New Features",
"config": "{}",
"project": "Governance",
"id": "ece51854-0551-4be4-bd8a-e3fc4ff4002c",
@@ -8048,7 +8087,7 @@
},
{
"type": "Feature Claim Vote",
- "name": "",
+ "name": "harrellbm Find Missing References Utility New Features",
"config": "{}",
"project": "Governance",
"id": "6d74c307-fec1-4f4d-b8b9-0dc4768982ff",
@@ -8125,7 +8164,7 @@
},
{
"type": "Feature Claim Vote",
- "name": "",
+ "name": "harrellbm Uninstall Script New Features",
"config": "{}",
"project": "Governance",
"id": "8a2a5809-7539-41ea-bfc9-609c618948e8",
@@ -8202,7 +8241,7 @@
},
{
"type": "Feature Claim Vote",
- "name": "",
+ "name": "harrellbm Tutorial Smooth Transition and Maptoggle Option New Features",
"config": "{}",
"project": "Governance",
"id": "3e0ed050-e9a1-4b96-9584-5e7783beb451",
@@ -8423,7 +8462,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
- "name": "",
+ "name": "harrellbm Moderator Community Management",
"config": "{}",
"project": "Governance",
"id": "9ada3c9e-c4dd-480f-ac42-31d082da6d06",
@@ -8576,7 +8615,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
- "name": "",
+ "name": "harrellbm Member Core Team",
"config": "{}",
"project": "Governance",
"id": "1c64efee-2875-434f-ac73-13587a0a6c65",
@@ -8791,12 +8830,12 @@
"id": "6bc6f8a2-2053-48b9-a903-ea504b3c5da5",
"savedPayload": {
"position": {
- "x": 26467.88102482428,
- "y": 16629.928909851464
+ "x": 26613.751283921014,
+ "y": 16825.973640100383
},
"targetPosition": {
- "x": 26241.959585023196,
- "y": 16827.310527633377
+ "x": 26339.687646628234,
+ "y": 16947.99463302312
},
"floatingObject": {
"isPinned": false,
@@ -8827,7 +8866,7 @@
"assetClaimVotes": [
{
"type": "Asset Claim Vote",
- "name": "",
+ "name": "ssplatt Superalgos Docker docker-compose.yml",
"config": "{}",
"project": "Governance",
"id": "4148a07f-e1ed-4672-8480-16127ab8dbf6",
@@ -8898,7 +8937,7 @@
},
{
"type": "Asset Claim Vote",
- "name": "",
+ "name": "ssplatt Superalgos Docker Dockerfile",
"config": "{}",
"project": "Governance",
"id": "062a97e3-af61-44d0-a05d-b19472906843",
@@ -9038,7 +9077,7 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
- "name": "",
+ "name": "ssplatt Moderator Community Management",
"config": "{}",
"project": "Governance",
"id": "7201bbed-35ea-4791-9e9b-18a616443d4e",
@@ -9177,12 +9216,12 @@
"id": "d806e08a-57dd-45e9-9a27-17480eeecd28",
"savedPayload": {
"position": {
- "x": 26531.148443231952,
- "y": 16747.499473963373
+ "x": 26639.584844120902,
+ "y": 16940.14154853076
},
"targetPosition": {
- "x": 26241.959585023196,
- "y": 16827.310527633377
+ "x": 26339.687646628234,
+ "y": 16947.99463302312
},
"floatingObject": {
"isPinned": false,
@@ -9214,18 +9253,18 @@
"featureClaimVotes": [
{
"type": "Feature Claim Vote",
- "name": "",
+ "name": "cozed-gh Data Mining Existing Features",
"config": "{}",
"project": "Governance",
"id": "e399eaac-f0c6-430d-b263-a5176ac1757e",
"savedPayload": {
"position": {
- "x": 27101.970341599328,
- "y": 16678.479603643267
+ "x": 27212.374778934474,
+ "y": 16961.644338862574
},
"targetPosition": {
- "x": 26819.554401601057,
- "y": 16779.678599858118
+ "x": 26916.068276755934,
+ "y": 17008.574678374644
},
"floatingObject": {
"isPinned": false,
@@ -9287,12 +9326,12 @@
"id": "26ee1286-c9e6-4aba-b3e7-2c34e2e229d5",
"savedPayload": {
"position": {
- "x": 26819.554401601057,
- "y": 16779.678599858118
+ "x": 26916.068276755934,
+ "y": 17008.574678374644
},
"targetPosition": {
- "x": 26537.138461602786,
- "y": 16880.87759607297
+ "x": 26619.761774577393,
+ "y": 17055.505017886713
},
"floatingObject": {
"isPinned": false,
@@ -9353,18 +9392,18 @@
"positionClaimVotes": [
{
"type": "Position Claim Vote",
- "name": "",
+ "name": "cozed-gh Moderator Community Management",
"config": "{}",
"project": "Governance",
"id": "784d44d3-a2b2-423e-9282-8bcbf8a24e09",
"savedPayload": {
"position": {
- "x": 26994.836204720144,
- "y": 17268.837356802447
+ "x": 26997.354009207298,
+ "y": 17521.792594760893
},
"targetPosition": {
- "x": 26765.987333161465,
- "y": 17074.857476437708
+ "x": 26808.557891892346,
+ "y": 17288.648806323803
},
"floatingObject": {
"isPinned": false,
@@ -9428,12 +9467,12 @@
"id": "0aa5c534-65c3-4d67-b795-ba7fb00455cc",
"savedPayload": {
"position": {
- "x": 26765.987333161465,
- "y": 17074.857476437708
+ "x": 26808.557891892346,
+ "y": 17288.648806323803
},
"targetPosition": {
- "x": 26537.138461602786,
- "y": 16880.87759607297
+ "x": 26619.761774577393,
+ "y": 17055.505017886713
},
"floatingObject": {
"isPinned": false,
@@ -9492,12 +9531,342 @@
"id": "6e6ee132-fe57-4efa-9c50-da6500ec53b6",
"savedPayload": {
"position": {
- "x": 26537.138461602786,
- "y": 16880.87759607297
+ "x": 26619.761774577393,
+ "y": 17055.505017886713
},
"targetPosition": {
- "x": 26241.959585023196,
- "y": 16827.310527633377
+ "x": 26339.687646628234,
+ "y": 16947.99463302312
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Claim Votes Switch",
+ "name": "Raplh2502",
+ "config": "{}",
+ "project": "Governance",
+ "claimVotesSwitch": [
+ {
+ "type": "Claim Votes Switch",
+ "name": "New Feature Claims Folder",
+ "config": "{}",
+ "project": "Governance",
+ "claimVotesSwitch": [],
+ "positionClaimVotes": [],
+ "assetClaimVotes": [],
+ "featureClaimVotes": [
+ {
+ "type": "Feature Claim Vote",
+ "name": "Raplh2502 Data Mining Existing Features",
+ "config": "{}",
+ "project": "Governance",
+ "id": "9520273e-6ed0-4513-a9b7-e3af5e0fb2de",
+ "savedPayload": {
+ "position": {
+ "x": 27136.65685451168,
+ "y": 17139.330011476843
+ },
+ "targetPosition": {
+ "x": 26849.01093405122,
+ "y": 17224.53461488802
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Feature Contribution Claim",
+ "name": "Data Mining Existing Features",
+ "id": "2dd37827-1cc1-40aa-b89a-917ccfe24d9b"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Raplh2502",
+ "User Profile"
+ ],
+ [
+ "New Token Power Switch",
+ "Token Power Switch"
+ ],
+ [
+ "New Votes And Claims Programs",
+ "Votes And Claims Programs"
+ ],
+ [
+ "New Claims Program",
+ "Claims Program"
+ ],
+ [
+ "New Feature Claims Folder",
+ "Feature Claims Folder"
+ ],
+ [
+ "Data Mining Existing Features",
+ "Feature Contribution Claim"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Feature Claim Vote",
+ "name": "Raplh2502 User Defined Variables and Code New Features",
+ "config": "{}",
+ "project": "Governance",
+ "id": "4f700818-ec7b-4cec-9c9b-50d949b74cbe",
+ "savedPayload": {
+ "position": {
+ "x": 27066.623245354906,
+ "y": 17431.040987596145
+ },
+ "targetPosition": {
+ "x": 26849.01093405122,
+ "y": 17224.53461488802
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Feature Contribution Claim",
+ "name": "User Defined Variables and Code New Features",
+ "id": "67e36fdc-9a1d-42c7-a62a-e99c605c5d33"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Raplh2502",
+ "User Profile"
+ ],
+ [
+ "New Token Power Switch",
+ "Token Power Switch"
+ ],
+ [
+ "New Votes And Claims Programs",
+ "Votes And Claims Programs"
+ ],
+ [
+ "New Claims Program",
+ "Claims Program"
+ ],
+ [
+ "New Feature Claims Folder",
+ "Feature Claims Folder"
+ ],
+ [
+ "User Defined Variables and Code New Features",
+ "Feature Contribution Claim"
+ ]
+ ]
+ }
+ }
+ ],
+ "id": "cb3667a0-06c2-4046-b8f2-395f13efb714",
+ "savedPayload": {
+ "position": {
+ "x": 26849.01093405122,
+ "y": 17224.53461488802
+ },
+ "targetPosition": {
+ "x": 26557.29995793192,
+ "y": 17154.501005731247
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Feature Claims Folder",
+ "name": "New Feature Claims Folder",
+ "id": "a0af8811-9dc2-4a9a-a28f-358738a6994f"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Raplh2502",
+ "User Profile"
+ ],
+ [
+ "New Token Power Switch",
+ "Token Power Switch"
+ ],
+ [
+ "New Votes And Claims Programs",
+ "Votes And Claims Programs"
+ ],
+ [
+ "New Claims Program",
+ "Claims Program"
+ ],
+ [
+ "New Feature Claims Folder",
+ "Feature Claims Folder"
+ ]
+ ]
+ }
+ },
+ {
+ "type": "Claim Votes Switch",
+ "name": "New Position Claims Folder",
+ "config": "{}",
+ "project": "Governance",
+ "claimVotesSwitch": [],
+ "positionClaimVotes": [
+ {
+ "type": "Position Claim Vote",
+ "name": "Raplh2502 Moderator Community Management",
+ "config": "{}",
+ "project": "Governance",
+ "id": "7545f4f1-411f-4fd3-acae-d20cbac74b56",
+ "savedPayload": {
+ "position": {
+ "x": 26727.709164754273,
+ "y": 17729.792846652163
+ },
+ "targetPosition": {
+ "x": 26642.504561343096,
+ "y": 17442.146926191705
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Position Contribution Claim",
+ "name": "Moderator Community Management",
+ "id": "74cbbf75-2a2c-4081-9415-ba423848f2db"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Raplh2502",
+ "User Profile"
+ ],
+ [
+ "New Token Power Switch",
+ "Token Power Switch"
+ ],
+ [
+ "New Votes And Claims Programs",
+ "Votes And Claims Programs"
+ ],
+ [
+ "New Claims Program",
+ "Claims Program"
+ ],
+ [
+ "New Position Claims Folder",
+ "Position Claims Folder"
+ ],
+ [
+ "Moderator Community Management",
+ "Position Contribution Claim"
+ ]
+ ]
+ }
+ }
+ ],
+ "assetClaimVotes": [],
+ "featureClaimVotes": [],
+ "id": "5302df90-a6c8-4e71-91d6-4f1b599a6718",
+ "savedPayload": {
+ "position": {
+ "x": 26642.504561343096,
+ "y": 17442.146926191705
+ },
+ "targetPosition": {
+ "x": 26557.29995793192,
+ "y": 17154.501005731247
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ },
+ "referenceParent": {
+ "type": "Position Claims Folder",
+ "name": "New Position Claims Folder",
+ "id": "e880f8a6-8e53-43dd-8b11-4210ca18c9ab"
+ },
+ "referenceParentCombinedNodePath": [
+ [
+ "Raplh2502",
+ "User Profile"
+ ],
+ [
+ "New Token Power Switch",
+ "Token Power Switch"
+ ],
+ [
+ "New Votes And Claims Programs",
+ "Votes And Claims Programs"
+ ],
+ [
+ "New Claims Program",
+ "Claims Program"
+ ],
+ [
+ "New Position Claims Folder",
+ "Position Claims Folder"
+ ]
+ ]
+ }
+ }
+ ],
+ "positionClaimVotes": [],
+ "assetClaimVotes": [],
+ "featureClaimVotes": [],
+ "id": "1cc82e36-a782-4f0f-a583-bf0be1bd57bc",
+ "savedPayload": {
+ "position": {
+ "x": 26557.29995793192,
+ "y": 17154.501005731247
+ },
+ "targetPosition": {
+ "x": 26339.687646628234,
+ "y": 16947.99463302312
},
"floatingObject": {
"isPinned": false,
@@ -9519,43 +9888,8 @@
"id": "6553c4ee-d20a-45aa-8f3b-72fd306013da",
"savedPayload": {
"position": {
- "x": 26241.959585023196,
- "y": 16827.310527633377
- },
- "targetPosition": {
- "x": 26065.624009335454,
- "y": 17070.01562594586
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": true,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- }
- }
- }
- ],
- "weightVotesSwitch": [
- {
- "type": "Weight Votes Switch",
- "name": "New Weight Votes Switch",
- "config": "{}",
- "project": "Governance",
- "weightVotesSwitch": [],
- "poolWeightVotes": [],
- "assetWeightVotes": [],
- "featureWeightVotes": [],
- "positionWeightVotes": [],
- "id": "cf1094d9-7193-49e0-b945-a79afcef3e2e",
- "savedPayload": {
- "position": {
- "x": 26363.980577945935,
- "y": 17101.374164926157
+ "x": 26339.687646628234,
+ "y": 16947.99463302312
},
"targetPosition": {
"x": 26065.624009335454,
@@ -9575,6 +9909,7 @@
}
}
],
+ "weightVotesSwitch": [],
"userProfileVotesSwitch": [],
"id": "457c39ab-b12c-4a24-8a42-a996b97736e2",
"savedPayload": {
@@ -9640,7 +9975,7 @@
"floatingObject": {
"isPinned": false,
"isFrozen": false,
- "isCollapsed": false,
+ "isCollapsed": true,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
@@ -9677,7 +10012,7 @@
"assetContributionClaims": [
{
"type": "Asset Contribution Claim",
- "name": "Foundations-Project-App-Schemas App Schemas other-hierarchies.json",
+ "name": "",
"config": "{\n \"description\": \"\"\n}",
"project": "Governance",
"id": "f1add2dd-8cbc-40c0-a189-922b3d729e06",
@@ -9730,7 +10065,7 @@
},
{
"type": "Asset Contribution Claim",
- "name": "Spaces Floating-Space CircularMenuItem.js",
+ "name": "",
"config": "{\n \"description\": \"\"\n}",
"project": "Governance",
"id": "2f1021db-f803-44a2-a40b-6593f590589d",
@@ -9795,7 +10130,7 @@
},
{
"type": "Asset Contribution Claim",
- "name": "Spaces Floating-Space CircularMenu.js",
+ "name": "",
"config": "{\n \"description\": \"\"\n}",
"project": "Governance",
"id": "7470b207-2682-4544-b5b9-75ce28e8b461",
@@ -9860,7 +10195,7 @@
},
{
"type": "Asset Contribution Claim",
- "name": "Foundations-Project-App-Schemas App Schemas plugin-tutorials.json",
+ "name": "",
"config": "{\n \"description\": \"\"\n}",
"project": "Governance",
"id": "31d50265-b59a-47b8-9adf-e6ebd47a68d2",
@@ -9913,7 +10248,7 @@
},
{
"type": "Asset Contribution Claim",
- "name": "Foundations-Project-App-Schemas App Schemas bot-data-dependencies.json",
+ "name": "",
"config": "{\n \"description\": \"\"\n}",
"project": "Governance",
"id": "bfb6e762-b953-4384-b443-ff8008a70eda",
@@ -9966,7 +10301,7 @@
},
{
"type": "Asset Contribution Claim",
- "name": "Foundations-Project-App-Schemas App Schemas crypto-exchange.json",
+ "name": "",
"config": "{\n \"description\": \"\"\n}",
"project": "Governance",
"id": "d5eb095e-94bd-4bfc-bd83-690246fdc77c",
@@ -10019,7 +10354,7 @@
},
{
"type": "Asset Contribution Claim",
- "name": "Spaces Floating-Space UiObject.js",
+ "name": "",
"config": "{\n \"description\": \"\"\n}",
"project": "Governance",
"id": "b03189ec-658a-4cb9-99dd-81ead35d2fcb",
@@ -10084,7 +10419,7 @@
},
{
"type": "Asset Contribution Claim",
- "name": "User Interface Function-Libraries UiObjectsFromNodes.js",
+ "name": "",
"config": "{\n \"description\": \"\"\n}",
"project": "Governance",
"id": "22c43f89-a68a-46f1-8b7e-d10f9be451cf",
@@ -10143,7 +10478,7 @@
},
{
"type": "Asset Contribution Claim",
- "name": "Plugins Workspaces Getting-Started-Tutorials.json",
+ "name": "",
"config": "{\n \"description\": \"\"\n}",
"project": "Governance",
"id": "6d32fbcb-ad83-44c4-889b-d2ef64127af9",
@@ -10225,7 +10560,7 @@
"assetContributionClaims": [
{
"type": "Asset Contribution Claim",
- "name": "Plugins Workspaces Blank-Template.json",
+ "name": "",
"config": "{\n \"description\": \"\"\n}",
"project": "Governance",
"id": "c87a42c0-653a-470a-841d-f1941c119e1e",
@@ -10315,7 +10650,7 @@
"assetContributionClaims": [
{
"type": "Asset Contribution Claim",
- "name": "",
+ "name": "Superalgos Client package.json",
"config": "{\n \"description\": \"\"\n}",
"project": "Governance",
"id": "87f052aa-302c-4c18-9bad-50c4e6c0e829",
@@ -10347,30 +10682,40 @@
"referenceParentCombinedNodePath": [
[
"Superalgos-CL",
- "Assets"
+ "Assets",
+ "Governance",
+ "4a693d1b-c9cc-4ab6-aa56-e1e1e1e18854"
],
[
"New Asset Class",
- "Asset Class"
+ "Asset Class",
+ "Governance",
+ "696be8e2-3a26-4ac6-a307-b3f68f5f41fc"
],
[
"Superalgos",
- "Asset Class"
+ "Asset Class",
+ "Governance",
+ "161070db-bdce-4d45-83ba-0a34a7646f33"
],
[
"Client",
- "Asset Class"
+ "Asset Class",
+ "Governance",
+ "3a149378-35d5-44e8-99c2-33a3b4d8e718"
],
[
"package.json",
- "Asset"
+ "Asset",
+ "Governance",
+ "487ff670-8faa-4efa-8466-0851b102b418"
]
]
}
},
{
"type": "Asset Contribution Claim",
- "name": "Sensor-Bot Exchange-Raw-Data package.json",
+ "name": "",
"config": "{\n \"description\": \"\"\n}",
"project": "Governance",
"id": "ba7c21c0-0f65-4516-b1e1-8bd6165c1403",
@@ -10441,7 +10786,7 @@
},
{
"type": "Asset Contribution Claim",
- "name": "Low-Frequency-Trading APIs package.json",
+ "name": "",
"config": "{\n \"description\": \"\"\n}",
"project": "Governance",
"id": "edd72994-4df1-4dff-bc0e-5953a3be811e",
@@ -10518,7 +10863,7 @@
},
{
"type": "Asset Contribution Claim",
- "name": "Task Server Task-Modules package.json",
+ "name": "",
"config": "{\n \"description\": \"\"\n}",
"project": "Governance",
"id": "23cce6d5-0d9a-40c2-a884-089be0d3b1d4",
@@ -10674,7 +11019,7 @@
"assetContributionClaims": [
{
"type": "Asset Contribution Claim",
- "name": "Debugging Debugging-Your-Indicator debugging-your-indicator-001-debugging-first-step.json",
+ "name": "",
"config": "{\n \"description\": \"\"\n}",
"project": "Governance",
"id": "b0564f9b-2e2d-4d49-b180-b97be200ea32",
@@ -10751,7 +11096,7 @@
},
{
"type": "Asset Contribution Claim",
- "name": "Debugging Debugging-Your-Indicator debugging-your-indicator-002-debugging-setting-up-your-ide.json",
+ "name": "",
"config": "{\n \"description\": \"\"\n}",
"project": "Governance",
"id": "4c5f3c8b-d23c-4d1c-b12c-59150dabfd4d",
@@ -10828,7 +11173,7 @@
},
{
"type": "Asset Contribution Claim",
- "name": "Debugging Debugging-Your-Indicator debugging-your-indicator-003-debugging-start-your-processes.json",
+ "name": "",
"config": "{\n \"description\": \"\"\n}",
"project": "Governance",
"id": "30f8e9d9-1dee-436d-8bb5-21e0cc2bbbde",
@@ -10905,7 +11250,7 @@
},
{
"type": "Asset Contribution Claim",
- "name": "Debugging Debugging-Your-Indicator debugging-your-indicator-004-debugging-let-the-hunt-begin.json",
+ "name": "",
"config": "{\n \"description\": \"\"\n}",
"project": "Governance",
"id": "7061b8f7-ae4c-496a-a621-be27903fe355",
@@ -10982,7 +11327,7 @@
},
{
"type": "Asset Contribution Claim",
- "name": "Debugging Debugging-Your-Indicator debugging-your-indicator-005-debugging-found-something.json",
+ "name": "",
"config": "{\n \"description\": \"\"\n}",
"project": "Governance",
"id": "11bbd834-7359-40d5-bb5e-3fb9bfd2502e",
@@ -11524,7 +11869,7 @@
"positionContributionClaims": [
{
"type": "Position Contribution Claim",
- "name": "Bugs Hunter Lead Developer",
+ "name": "",
"config": "{}",
"project": "Governance",
"id": "b777d150-0991-46b2-b6d8-382ad92305f8",
@@ -11608,7 +11953,7 @@
"positionContributionClaims": [
{
"type": "Position Contribution Claim",
- "name": "",
+ "name": "Moderator Community Management",
"config": "{}",
"project": "Governance",
"id": "5500f230-15f8-42cb-ac83-194e55f92f11",
@@ -12074,7 +12419,7 @@
"floatingObject": {
"isPinned": false,
"isFrozen": false,
- "isCollapsed": false,
+ "isCollapsed": true,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
diff --git a/Projects/Governance/Plugins/User-Profiles/Test-Network-Client-Profile.json b/Projects/Governance/Plugins/User-Profiles/Test-Network-Client-Profile.json
new file mode 100644
index 000000000..3279c2cd7
--- /dev/null
+++ b/Projects/Governance/Plugins/User-Profiles/Test-Network-Client-Profile.json
@@ -0,0 +1,84 @@
+{
+ "type": "User Profile",
+ "name": "Test-Network-Client-Profile",
+ "config": "{\"signature\":{\"message\":\"Test-Network-Client-Profile\",\"messageHash\":\"0xd768f828a837f3fa0c3e9bb8090820c415ff08be93cad759a53bc2115487c5d7\",\"v\":\"0x1c\",\"r\":\"0x1401b80eec441aa9789580848e0179f36485acab9562fe184bca5e2fd9e77887\",\"s\":\"0x06400cef3453437805fb9b086c246d7def27a146ed975450edf7dcc46795a57d\",\"signature\":\"0x1401b80eec441aa9789580848e0179f36485acab9562fe184bca5e2fd9e7788706400cef3453437805fb9b086c246d7def27a146ed975450edf7dcc46795a57d1c\"},\"codeName\":\"Test-Network-Client-Profile\"}",
+ "project": "Governance",
+ "tokenPowerSwitch": {
+ "type": "Token Power Switch",
+ "name": "New Token Power Switch",
+ "config": "{}",
+ "project": "Governance",
+ "tokenPowerSwitch": [],
+ "id": "c2a1f8b1-0eb3-457a-9508-2e0c813ced37",
+ "savedPayload": {
+ "position": {
+ "x": 14303,
+ "y": 11452.5
+ },
+ "targetPosition": {
+ "x": 14003,
+ "y": 11452.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensMined": {
+ "type": "Tokens Mined",
+ "name": "New Tokens Mined",
+ "project": "Governance",
+ "id": "e796be1b-7d10-47f1-8b1a-4d7ce962a113",
+ "savedPayload": {
+ "position": {
+ "x": 13703,
+ "y": 11452.5
+ },
+ "targetPosition": {
+ "x": 14003,
+ "y": 11452.5
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "baa2f02c-2920-4edb-a103-d452fc61d82f",
+ "savedPayload": {
+ "position": {
+ "x": 20588.235294117643,
+ "y": 18250
+ },
+ "targetPosition": {
+ "x": 20588.235294117643,
+ "y": 18250
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Governance/Plugins/User-Profiles/Test-Network-Node-Profile.json b/Projects/Governance/Plugins/User-Profiles/Test-Network-Node-Profile.json
new file mode 100644
index 000000000..10d3ae958
--- /dev/null
+++ b/Projects/Governance/Plugins/User-Profiles/Test-Network-Node-Profile.json
@@ -0,0 +1,84 @@
+{
+ "type": "User Profile",
+ "name": "Test-Network-Node-Profile",
+ "config": "{\"signature\":{\"message\":\"Test-Network-Node-Profile\",\"messageHash\":\"0xa05026b7c6c2a2375480d5d24949621749cc48e461e6e80278a9ef1b6dc7c5f1\",\"v\":\"0x1c\",\"r\":\"0x8f28f992b0074e4d50007cdfbf18980ca58b4969e04a54d06e4d4798bb982c9a\",\"s\":\"0x1c11951a92a1beffe8f3ddd06426ebe1b89875b56d5e374426100d5f59245ea3\",\"signature\":\"0x8f28f992b0074e4d50007cdfbf18980ca58b4969e04a54d06e4d4798bb982c9a1c11951a92a1beffe8f3ddd06426ebe1b89875b56d5e374426100d5f59245ea31c\"},\"codeName\":\"Test-Network-Node-Profile\"}",
+ "project": "Governance",
+ "tokenPowerSwitch": {
+ "type": "Token Power Switch",
+ "name": "New Token Power Switch",
+ "config": "{}",
+ "project": "Governance",
+ "tokenPowerSwitch": [],
+ "id": "11f69cbe-00c8-4fac-9fcc-701a7600c92c",
+ "savedPayload": {
+ "position": {
+ "x": 14327,
+ "y": 11862
+ },
+ "targetPosition": {
+ "x": 14027,
+ "y": 11862
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "tokensMined": {
+ "type": "Tokens Mined",
+ "name": "New Tokens Mined",
+ "project": "Governance",
+ "id": "501f456f-b4b5-4b7e-9118-0f26215dd20e",
+ "savedPayload": {
+ "position": {
+ "x": 13727,
+ "y": 11862
+ },
+ "targetPosition": {
+ "x": 14027,
+ "y": 11862
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ "id": "36c2b050-631f-4291-987c-418adc94317d",
+ "savedPayload": {
+ "position": {
+ "x": 17647.05882352941,
+ "y": 21251
+ },
+ "targetPosition": {
+ "x": 17647.05882352941,
+ "y": 21251
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": true,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Governance/Plugins/Workspaces/Token-Distribution-Superalgos.json b/Projects/Governance/Plugins/Workspaces/Token-Distribution-Superalgos.json
index 34333e6db..9c9b6f182 100644
--- a/Projects/Governance/Plugins/Workspaces/Token-Distribution-Superalgos.json
+++ b/Projects/Governance/Plugins/Workspaces/Token-Distribution-Superalgos.json
@@ -76,7 +76,7 @@
"floatingObject": {
"isPinned": true,
"isFrozen": false,
- "isCollapsed": false,
+ "isCollapsed": true,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
@@ -192,7 +192,7 @@
"floatingObject": {
"isPinned": false,
"isFrozen": false,
- "isCollapsed": false,
+ "isCollapsed": true,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
@@ -602,7 +602,36 @@
"type": "Plugin Tutorials",
"name": "New Plugin Tutorials",
"project": "Foundations",
- "pluginFiles": [],
+ "pluginFiles": [
+ {
+ "type": "Plugin File",
+ "name": "Creating Your User Profile Tutorial",
+ "config": "{\n \"project\": \"Foundations\",\n \"fileName\": \"Creating Your User Profile Tutorial\",\n \"folderName\": \"Tutorials\",\n \"nodeType\": \"Tutorial\",\n \"saveWithWorkspace\": false\n}",
+ "project": "Foundations",
+ "id": "4f900690-970b-4d38-832c-273b0fd3ce1a",
+ "savedPayload": {
+ "position": {
+ "x": 36774.75448470882,
+ "y": 11218.497915923215
+ },
+ "targetPosition": {
+ "x": 36598.41890902108,
+ "y": 10975.79281761073
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ }
+ ],
"id": "84a541df-559d-4a0e-ac76-71d4a40e0639",
"savedPayload": {
"position": {
@@ -616,7 +645,7 @@
"floatingObject": {
"isPinned": false,
"isFrozen": false,
- "isCollapsed": false,
+ "isCollapsed": true,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
@@ -751,8 +780,8 @@
"id": "cccfce2d-3497-419b-8c32-4cd62fb1b33f",
"savedPayload": {
"position": {
- "x": 35626.241539851304,
- "y": 10978.042351611191
+ "x": 35636.67313670836,
+ "y": 10977.129705143725
},
"targetPosition": {
"x": 35605.314597728066,
@@ -774,7 +803,7 @@
{
"type": "Plugin File",
"name": "harrellbm",
- "config": "{\"project\":\"Governance\",\"fileName\":\"harrellbm\",\"folderName\":\"User-Profiles\",\"nodeType\":\"User Profile\",\"saveWithWorkspace\":false}",
+ "config": "{\n \"project\": \"Governance\",\n \"fileName\": \"harrellbm\",\n \"folderName\": \"User-Profiles\",\n \"nodeType\": \"User Profile\",\n \"saveWithWorkspace\": false\n}",
"project": "Foundations",
"pluginFilePosition": {
"type": "Plugin File Position",
@@ -806,8 +835,8 @@
"id": "49a18a94-de50-4285-bf38-fe43c700b93f",
"savedPayload": {
"position": {
- "x": 35522.62339098297,
- "y": 10967.15164531474
+ "x": 35542.94109048274,
+ "y": 10972.217416753385
},
"targetPosition": {
"x": 35605.314597728066,
@@ -829,13 +858,13 @@
{
"type": "Plugin File",
"name": "Julian-Molina",
- "config": "{\"project\":\"Governance\",\"fileName\":\"Julian-Molina\",\"folderName\":\"User-Profiles\",\"nodeType\":\"User Profile\",\"saveWithWorkspace\":false}",
+ "config": "{\n \"project\": \"Governance\",\n \"fileName\": \"Julian-Molina\",\n \"folderName\": \"User-Profiles\",\n \"nodeType\": \"User Profile\",\n \"saveWithWorkspace\": false\n}",
"project": "Foundations",
"id": "7096909f-b221-4fb7-a5ec-5a76d147dc2f",
"savedPayload": {
"position": {
- "x": 35428.97902204032,
- "y": 10921.478234845728
+ "x": 35455.314597728066,
+ "y": 10938.580757668575
},
"targetPosition": {
"x": 35605.314597728066,
@@ -862,8 +891,8 @@
"id": "00a46dc7-6fbd-45d1-870a-fab7924ee5c0",
"savedPayload": {
"position": {
- "x": 35356.60332596155,
- "y": 10846.531007574467
+ "x": 35382.371150084844,
+ "y": 10879.512318440902
},
"targetPosition": {
"x": 35605.314597728066,
@@ -917,8 +946,8 @@
"id": "aeed0c96-3e89-426c-bf61-12b6e23c6916",
"savedPayload": {
"position": {
- "x": 35314.22587984527,
- "y": 10751.349705213144
+ "x": 35331.25096043528,
+ "y": 10800.794129455984
},
"targetPosition": {
"x": 35605.314597728066,
@@ -973,7 +1002,7 @@
"savedPayload": {
"position": {
"x": 35306.95802911758,
- "y": 10647.414597552948
+ "y": 10710.13167551354
},
"targetPosition": {
"x": 35605.314597728066,
@@ -1000,8 +1029,8 @@
"id": "21126c69-67ed-4839-8611-8feac8578cf6",
"savedPayload": {
"position": {
- "x": 35335.67638383831,
- "y": 10547.26179249652
+ "x": 35311.87031750792,
+ "y": 10616.399629287916
},
"targetPosition": {
"x": 35605.314597728066,
@@ -1028,8 +1057,36 @@
"id": "ded04ad6-6b18-4166-bb97-35a9521b9104",
"savedPayload": {
"position": {
- "x": 35396.917086590365,
- "y": 10462.971196431648
+ "x": 35345.50697659273,
+ "y": 10528.773136533244
+ },
+ "targetPosition": {
+ "x": 35605.314597728066,
+ "y": 10678.773136533244
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 2,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
+ }
+ }
+ },
+ {
+ "type": "Plugin File",
+ "name": "Dummy",
+ "config": "{\n \"project\": \"Governance\",\n \"fileName\": \"Dummy\",\n \"folderName\": \"User-Profiles\",\n \"nodeType\": \"User Profile\",\n \"saveWithWorkspace\": false\n}",
+ "project": "Foundations",
+ "id": "6e9df29f-58fc-4e30-9882-5a083c30fdbe",
+ "savedPayload": {
+ "position": {
+ "x": 35404.57541582041,
+ "y": 10455.829688890026
},
"targetPosition": {
"x": 35605.314597728066,
@@ -1062,7 +1119,7 @@
"floatingObject": {
"isPinned": false,
"isFrozen": false,
- "isCollapsed": true,
+ "isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
@@ -1433,7 +1490,7 @@
"floatingObject": {
"isPinned": false,
"isFrozen": false,
- "isCollapsed": false,
+ "isCollapsed": true,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
@@ -1617,7 +1674,7 @@
"floatingObject": {
"isPinned": true,
"isFrozen": false,
- "isCollapsed": false,
+ "isCollapsed": true,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
@@ -1628,1146 +1685,46 @@
}
},
{
- "type": "Tutorial",
- "name": "Creating Your User Profile Tutorial",
- "config": "{\n \"icon\": {\n \"name\": \"governance\",\n \"project\": \"Governance\"\n },\n \"position\": \"Center\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Better Together\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
- "project": "Education",
- "tutorialSteps": [],
- "tutorialTopics": [
- {
- "type": "Tutorial Topic",
- "name": "Before Starting",
- "config": "{\n \"position\": \"Center\",\n \"slider\": \"toTop\",\n \"pressButton\": \"Next\"\n}",
- "project": "Education",
- "tutorialSteps": [
- {
- "type": "Tutorial Step",
- "name": "Make sure You’re Comfortable",
- "config": "{\n \"icon\": {\n \"name\": \"Pool\\\\pools\",\n \"project\": \"Governance\"\n },\n \"position\": \"Center\",\n \"slider\": \"toTop\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Make sure You’re Comfortable\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n },\n \"positionAtReferenceParent\": true\n}",
- "project": "Education",
- "id": "7c13abc2-27e4-4fe6-afd8-14cbc0b65c7d",
- "savedPayload": {
- "position": {
- "x": 20273,
- "y": 30933.25
- },
- "targetPosition": {
- "x": 19973,
- "y": 30933.25
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- },
- "referenceParent": {
- "type": "Charting Space",
- "name": "New Charting Space",
- "id": "21d2ec55-9e56-4652-8e96-c7e451262c36"
- },
- "referenceParentCombinedNodePath": [
- [
- "New Charting Space",
- "Charting Space",
- "Foundations",
- "21d2ec55-9e56-4652-8e96-c7e451262c36"
- ]
- ]
- }
- }
- ],
- "tutorialTopics": [],
- "id": "fb31f94d-8c05-4c1a-89b7-92d48946ad9e",
- "savedPayload": {
- "position": {
- "x": 17027,
- "y": 30922.25
- },
- "targetPosition": {
- "x": 16727,
- "y": 30922.25
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": true,
- "angleToParent": 1,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- }
- }
- },
- {
- "type": "Tutorial Topic",
- "name": "Governance Overview",
- "config": "{\n \"position\": \"Center\",\n \"slider\": \"toTop\",\n \"pressButton\": \"Next\"\n}",
- "project": "Education",
- "tutorialSteps": [
- {
- "type": "Tutorial Step",
- "name": "One Token to Rule Them All",
- "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\staking-program\",\n \"project\": \"Governance\"\n },\n \"position\": \"Center\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - One Token to Rule Them All\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n },\n \"positionAtReferenceParent\": true\n}",
- "project": "Education",
- "id": "33321959-1eb0-494c-8df3-94b1e47efdb3",
- "savedPayload": {
- "position": {
- "x": 20180.438536534504,
- "y": 31099.451694843894
- },
- "targetPosition": {
- "x": 19884.132034355964,
- "y": 31146.382034355964
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- },
- "referenceParent": {
- "type": "Workspace",
- "name": "Custom Charts Tutorials",
- "id": "7f5b5bd1-ed0d-4fc9-a4e9-42e69e57f351"
- }
- }
- },
- {
- "type": "Tutorial Step",
- "name": "With Tokens Comes Responsibility",
- "config": "{\n \"icon\": {\n \"name\": \"governance\",\n \"project\": \"Governance\"\n },\n \"position\": \"Center\",\n \"slider\": \"toTop\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - With Tokens Comes Responsibility\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
- "project": "Education",
- "id": "a13ac48c-5743-4794-85bd-bf0794d9e1a2",
- "savedPayload": {
- "position": {
- "x": 20151.433991612474,
- "y": 31282.579184277827
- },
- "targetPosition": {
- "x": 19884.132034355964,
- "y": 31146.382034355964
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- }
- }
- },
- {
- "type": "Tutorial Step",
- "name": "A Mighty Meritocracy",
- "config": "{\n \"icon\": {\n \"name\": \"Position\\\\positions\",\n \"project\": \"Governance\"\n },\n \"position\": \"Center\",\n \"slider\": \"toTop\",\n \"toggleMapView\": {\n \"view\": \"Off\"\n },\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - A Mighty Meritocracy\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n },\n \"positionAtReferenceParent\": true\n}",
- "project": "Education",
- "id": "d9b824fd-a201-40b8-8a60-d0c516d9634b",
- "savedPayload": {
- "position": {
- "x": 20020.329184277827,
- "y": 31413.683991612474
- },
- "targetPosition": {
- "x": 19884.132034355964,
- "y": 31146.382034355964
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- },
- "referenceParent": {
- "type": "Crypto Exchange",
- "name": "Binance",
- "id": "61ef0b8d-de6e-4e76-bdd5-996836760a4b"
- },
- "referenceParentCombinedNodePath": [
- [
- "My Crypto Ecosystem",
- "Crypto Ecosystem",
- "Foundations",
- "7217b56c-e854-4c06-8b8a-d5d3c05a153d"
- ],
- [
- "Tested",
- "Crypto Exchanges",
- "Foundations",
- "e3879d63-6f8f-41a3-8ac3-0349c4361722"
- ],
- [
- "Binance",
- "Crypto Exchange",
- "Foundations",
- "61ef0b8d-de6e-4e76-bdd5-996836760a4b"
- ]
- ]
- }
- },
- {
- "type": "Tutorial Step",
- "name": "A Worthy Contribution",
- "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\referral-program\",\n \"project\": \"Governance\"\n },\n \"position\": \"Center\",\n \"slider\": \"toTop\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - A Worthy Contribution\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n },\n \"positionAtReferenceParent\": true\n}",
- "project": "Education",
- "id": "a0d50140-b862-4b7e-9bc6-ed055b34a0bd",
- "savedPayload": {
- "position": {
- "x": 19837.201694843894,
- "y": 31442.688536534504
- },
- "targetPosition": {
- "x": 19884.132034355964,
- "y": 31146.382034355964
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- },
- "referenceParent": {
- "type": "Market",
- "name": "BTC/USDT",
- "id": "9a867bf0-a71d-445c-b99a-75b60bbdce09"
- },
- "referenceParentCombinedNodePath": [
- [
- "My Crypto Ecosystem",
- "Crypto Ecosystem",
- "Foundations",
- "7217b56c-e854-4c06-8b8a-d5d3c05a153d"
- ],
- [
- "Tested",
- "Crypto Exchanges",
- "Foundations",
- "e3879d63-6f8f-41a3-8ac3-0349c4361722"
- ],
- [
- "Binance",
- "Crypto Exchange",
- "Foundations",
- "61ef0b8d-de6e-4e76-bdd5-996836760a4b"
- ],
- [
- "New Exchange Markets",
- "Exchange Markets",
- "Foundations",
- "2fd80894-900e-44ac-a1a7-56c14124f7a1"
- ],
- [
- "BTC/USDT",
- "Market",
- "Foundations",
- "9a867bf0-a71d-445c-b99a-75b60bbdce09"
- ]
- ]
- }
- }
- ],
- "tutorialTopics": [],
- "id": "eca95394-e23c-4464-a0a2-955e45fd9ca5",
- "savedPayload": {
- "position": {
- "x": 16939.132034355964,
- "y": 31134.382034355964
- },
- "targetPosition": {
- "x": 16727,
- "y": 30922.25
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": true,
- "angleToParent": 1,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- }
- }
- },
- {
- "type": "Tutorial Topic",
- "name": "Profile Overview",
- "config": "{\n \"position\": \"Center\",\n \"slider\": \"toTop\",\n \"pressButton\": \"Next\"\n}",
- "project": "Education",
- "tutorialSteps": [
- {
- "type": "Tutorial Step",
- "name": "What’s in a Profile?",
- "config": "{\n \"icon\": {\n \"name\": \"User\\\\user-profile\",\n \"project\": \"Governance\"\n },\n \"position\": \"Center\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - What’s in a Profile?\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n },\n \"positionAtReferenceParent\": true\n}",
- "project": "Education",
- "id": "df575afd-af40-4725-a9a0-d0e3bdd64572",
- "savedPayload": {
- "position": {
- "x": 19822,
- "y": 31494.057621135333
- },
- "targetPosition": {
- "x": 19672,
- "y": 31234.25
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- },
- "referenceParent": {
- "type": "Charting Space",
- "name": "New Charting Space",
- "id": "21d2ec55-9e56-4652-8e96-c7e451262c36"
- },
- "referenceParentCombinedNodePath": [
- [
- "New Charting Space",
- "Charting Space",
- "Foundations",
- "21d2ec55-9e56-4652-8e96-c7e451262c36"
- ]
- ]
- }
- },
- {
- "type": "Tutorial Step",
- "name": "Program Participation",
- "config": "{\n \"icon\": {\n \"name\": \"User\\\\user-referrer\",\n \"project\": \"Governance\"\n },\n \"position\": \"Center\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Program Participation\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
- "project": "Education",
- "id": "1a414df9-32fa-4055-b0db-7a932e4b59e1",
- "savedPayload": {
- "position": {
- "x": 19522,
- "y": 31494.057621135333
- },
- "targetPosition": {
- "x": 19672,
- "y": 31234.25
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- }
- }
- }
- ],
- "tutorialTopics": [],
- "id": "47f47947-70a9-48a6-88d0-bd3dae2be578",
- "savedPayload": {
- "position": {
- "x": 16727,
- "y": 31222.25
- },
- "targetPosition": {
- "x": 16727,
- "y": 30922.25
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": true,
- "angleToParent": 1,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- }
- }
- },
- {
- "type": "Tutorial Topic",
- "name": "Setting Up the Constructor",
- "config": "{\n \"position\": \"Right\",\n \"slider\": \"toTop\",\n \"pressButton\": \"Next\"\n}",
- "project": "Education",
- "tutorialSteps": [
- {
- "type": "Tutorial Step",
- "name": "Where it all Begins",
- "config": "{\n \"icon\": {\n \"name\": \"governance\",\n \"project\": \"Governance\"\n },\n \"position\": \"Right\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Where it all Begins\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n },\n \"positionAtReferenceParent\": true\n}",
- "project": "Education",
- "id": "9aec749c-46c8-45d0-99f4-f99ecd50ec44",
- "savedPayload": {
- "position": {
- "x": 19459.867965644036,
- "y": 31446.382034355964
- },
- "targetPosition": {
- "x": 19459.867965644036,
- "y": 31146.382034355964
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- },
- "referenceParent": {
- "type": "Governance Project",
- "name": "New Governance Project",
- "id": "db380c52-cf90-475b-87df-c005dd51cdf6"
- },
- "referenceParentCombinedNodePath": [
- [
- "New Governance Project",
- "Governance Project",
- "Governance",
- "db380c52-cf90-475b-87df-c005dd51cdf6"
- ]
- ]
- }
- },
- {
- "type": "Tutorial Step",
- "name": "Profile in a Heartbeat",
- "config": "{\n \"icon\": {\n \"name\": \"profile-constructor\",\n \"project\": \"Governance\"\n },\n \"position\": \"Right\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Profile in a Heartbeat\"\n },\n \"controlDocs\": {\n \"panel\": \"Close\",\n \"closeTutorialEditor\": true,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
- "project": "Education",
- "id": "cdfada38-c5e0-4c0c-aaf5-4fa24b416131",
- "savedPayload": {
- "position": {
- "x": 19247.735931288073,
- "y": 31358.514068711927
- },
- "targetPosition": {
- "x": 19459.867965644036,
- "y": 31146.382034355964
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- }
- }
- },
- {
- "type": "Tutorial Step",
- "name": "Pump that Heartbeat!",
- "config": "{\n \"icon\": {\n \"name\": \"configuration\",\n \"project\": \"Governance\"\n },\n \"position\": \"Right\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Pump that Heartbeat!\"\n },\n \"controlDocs\": {\n \"panel\": \"Close\",\n \"closeTutorialEditor\": true\n },\n \"positionAtReferenceParent\": true\n}",
- "project": "Education",
- "id": "651e15ce-bdda-4cca-9c2d-e16a2d900e45",
- "savedPayload": {
- "position": {
- "x": 19159.867965644036,
- "y": 31146.382034355964
- },
- "targetPosition": {
- "x": 19459.867965644036,
- "y": 31146.382034355964
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- },
- "referenceParent": {
- "type": "Time Machine",
- "name": "Lightning Strike Backtesting Session My Computer Binanceus BTC/USDT",
- "id": "72a1f250-0d0e-4354-8fdf-741866b9c16c"
- },
- "referenceParentCombinedNodePath": [
- [
- "New Charting Space",
- "Charting Space",
- "Foundations",
- "21d2ec55-9e56-4652-8e96-c7e451262c36"
- ],
- [
- "Foundations",
- "Project Dashboards",
- "Foundations",
- "2f92dce8-f804-40b6-9f4d-e605f4b4a55e"
- ],
- [
- "Testing Trading Tasks My Computer",
- "Dashboard",
- "Foundations",
- "b10709c9-2150-4055-a06e-1b9b8db2af55"
- ],
- [
- "Lightning Strike Backtesting Session My Computer Binanceus BTC/USDT",
- "Time Machine",
- "Foundations",
- "72a1f250-0d0e-4354-8fdf-741866b9c16c"
- ]
- ]
- }
- }
- ],
- "tutorialTopics": [],
- "id": "1b7b5af2-bb52-4090-965e-cd457b2e229c",
- "savedPayload": {
- "position": {
- "x": 16514.867965644036,
- "y": 31134.382034355964
- },
- "targetPosition": {
- "x": 16727,
- "y": 30922.25
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": true,
- "angleToParent": 1,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- }
- }
- },
- {
- "type": "Tutorial Topic",
- "name": "Profile Deep Dive",
- "config": "{\n \"position\": \"Right\",\n \"slider\": \"toTop\",\n \"pressButton\": \"Next\"\n}",
- "project": "Education",
- "tutorialSteps": [
- {
- "type": "Tutorial Step",
- "name": "Oh so Shiny",
- "config": "{\n \"icon\": {\n \"name\": \"User\\\\user-profile\",\n \"project\": \"Governance\"\n },\n \"position\": \"Right\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Oh so Shiny\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
- "project": "Education",
- "id": "a7929f0d-8dee-488c-b517-7ac95d2cb071",
- "savedPayload": {
- "position": {
- "x": 19159.867965644036,
- "y": 31146.382034355964
- },
- "targetPosition": {
- "x": 19372,
- "y": 30934.25
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- },
- "referenceParent": {
- "type": "Tutorial",
- "name": "Creating Your User Profile Tutorial",
- "id": "57e388d1-f479-4a16-af85-aee12be285a0"
- },
- "referenceParentCombinedNodePath": [
- [
- "Creating Your User Profile Tutorial",
- "Tutorial",
- "Education",
- "57e388d1-f479-4a16-af85-aee12be285a0"
- ]
- ]
- }
- },
- {
- "type": "Tutorial Step",
- "name": "Only You",
- "config": "{\n \"icon\": {\n \"name\": \"User\\\\user-profile\",\n \"project\": \"Governance\"\n },\n \"position\": \"Right\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Only You\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
- "project": "Education",
- "id": "5ad27b7a-b482-44ca-a06d-8db0059d1eed",
- "savedPayload": {
- "position": {
- "x": 19072,
- "y": 30934.25
- },
- "targetPosition": {
- "x": 19372,
- "y": 30934.25
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- }
- }
- },
- {
- "type": "Tutorial Step",
- "name": "Under the Hood",
- "config": "{\n \"icon\": {\n \"name\": \"User\\\\user-profile\",\n \"project\": \"Governance\"\n },\n \"position\": \"Right\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Under the Hood\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
- "project": "Education",
- "id": "577c1c57-88f8-4987-a1f1-f7ef10ace032",
- "savedPayload": {
- "position": {
- "x": 19159.867965644036,
- "y": 30722.117965644036
- },
- "targetPosition": {
- "x": 19372,
- "y": 30934.25
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- }
- }
- }
- ],
- "tutorialTopics": [],
- "id": "9aaa02f8-73ec-4c89-b1ec-85d4114c5a93",
- "savedPayload": {
- "position": {
- "x": 16427,
- "y": 30922.25
- },
- "targetPosition": {
- "x": 16727,
- "y": 30922.25
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": true,
- "angleToParent": 1,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- }
- }
- },
- {
- "type": "Tutorial Topic",
- "name": "Profile Backup",
- "config": "{\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"Next\"\n}",
- "project": "Education",
- "tutorialSteps": [
- {
- "type": "Tutorial Step",
- "name": "Save the Key!",
- "config": "{\n \"icon\": {\n \"name\": \"Key\\\\key-reference\",\n \"project\": \"Foundations\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Save the Key!\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
- "project": "Education",
- "id": "4147bad2-0dd4-4082-bb5a-48a0bc84f595",
- "savedPayload": {
- "position": {
- "x": 19159.867965644036,
- "y": 30722.117965644036
- },
- "targetPosition": {
- "x": 19459.867965644036,
- "y": 30722.117965644036
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- }
- }
- },
- {
- "type": "Tutorial Step",
- "name": "Profile Backup",
- "config": "{\n \"icon\": {\n \"name\": \"Exchange\\\\exchange-account-asset\",\n \"project\": \"Foundations\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Profile Backup\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
- "project": "Education",
- "id": "42cf8adb-7bee-4449-b8ab-ccc283e17796",
- "savedPayload": {
- "position": {
- "x": 19247.735931288073,
- "y": 30509.985931288073
- },
- "targetPosition": {
- "x": 19459.867965644036,
- "y": 30722.117965644036
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- }
- }
- },
- {
- "type": "Tutorial Step",
- "name": "Delete the Constructor",
- "config": "{\n \"icon\": {\n \"name\": \"Docs\\\\docs-action-delete-paragraph\",\n \"project\": \"Foundations\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Delete the Constructor\"\n },\n \"controlDocs\": {\n \"panel\": \"Close\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
- "project": "Education",
- "id": "9633816b-95cf-4b58-a231-504dd5e8e5ad",
- "savedPayload": {
- "position": {
- "x": 19459.867965644036,
- "y": 30422.117965644036
- },
- "targetPosition": {
- "x": 19459.867965644036,
- "y": 30722.117965644036
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- }
- }
- }
- ],
- "tutorialTopics": [],
- "id": "ba99b336-1578-4a76-99f0-24e461922b4c",
- "savedPayload": {
- "position": {
- "x": 16514.867965644036,
- "y": 30710.117965644036
- },
- "targetPosition": {
- "x": 16727,
- "y": 30922.25
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": true,
- "angleToParent": 1,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- }
- }
- },
- {
- "type": "Tutorial Topic",
- "name": "Add Onboarding Programs",
- "config": "{\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"Next\"\n}",
- "project": "Education",
- "tutorialSteps": [
- {
- "type": "Tutorial Step",
- "name": "Program Partners",
- "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\onboarding-programs\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Program Partners\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
- "project": "Education",
- "id": "18c61fe9-3cc1-4f88-9499-b873fbcb9db0",
- "savedPayload": {
- "position": {
- "x": 19459.867965644036,
- "y": 30422.117965644036
- },
- "targetPosition": {
- "x": 19672,
- "y": 30634.25
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- }
- }
- },
- {
- "type": "Tutorial Step",
- "name": "Drop it like it’s Hot",
- "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\airdrop-program\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Drop it like it’s Hot\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
- "project": "Education",
- "id": "7c1c466e-a5a4-4e67-94cb-6dc9e040f89b",
- "savedPayload": {
- "position": {
- "x": 19672,
- "y": 30334.25
- },
- "targetPosition": {
- "x": 19672,
- "y": 30634.25
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- }
- }
- },
- {
- "type": "Tutorial Step",
- "name": "GitHub Glory",
- "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\github-program\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - GitHub Glory\"\n },\n \"controlDocs\": {\n \"panel\": \"Close\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
- "project": "Education",
- "id": "e580ebc9-097b-46d6-bb6d-145621548377",
- "savedPayload": {
- "position": {
- "x": 19884.132034355964,
- "y": 30422.117965644036
- },
- "targetPosition": {
- "x": 19672,
- "y": 30634.25
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {}
- }
- }
- ],
- "tutorialTopics": [],
- "id": "578fdee3-64ad-4836-8feb-3e41746bceda",
- "savedPayload": {
- "position": {
- "x": 16727,
- "y": 30622.25
- },
- "targetPosition": {
- "x": 16727,
- "y": 30922.25
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": true,
- "angleToParent": 1,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- }
- }
- },
- {
- "type": "Tutorial Topic",
- "name": "Submit Profile",
- "config": "{\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"Next\"\n}",
- "project": "Education",
- "tutorialSteps": [
- {
- "type": "Tutorial Step",
- "name": "Make it Official",
- "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\github-program\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Make it Official\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - GitHub.com Authentication\"\n }\n },\n \"positionAtReferenceParent\": true\n}",
- "project": "Education",
- "id": "fe74b3ae-9490-465a-a491-db4b0834dbf7",
- "savedPayload": {
- "position": {
- "x": 16939.132034355964,
- "y": 30410.117965644036
- },
- "targetPosition": {
- "x": 16939.132034355964,
- "y": 30710.117965644036
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {},
- "referenceParent": {
- "type": "Github API",
- "name": "New Github API",
- "id": "cbbb57f9-a9a0-4148-89a5-f820f40f56d3"
- },
- "referenceParentCombinedNodePath": [
- [
- "New APIs",
- "APIs"
- ],
- [
- "New Github API",
- "Github API"
- ]
- ]
- }
- },
- {
- "type": "Tutorial Step",
- "name": "Infinity and Beyond",
- "config": "{\n \"icon\": {\n \"name\": \"User\\\\user-profile\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - To Infinity and Beyond\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": true,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
- "project": "Education",
- "id": "e4c5a34f-67c4-4fdc-8c11-aef5bde92d72",
- "savedPayload": {
- "position": {
- "x": 17151.264068711927,
- "y": 30497.985931288073
- },
- "targetPosition": {
- "x": 16939.132034355964,
- "y": 30710.117965644036
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- }
- }
- },
- {
- "type": "Tutorial Step",
- "name": "Welcome aboard!",
- "config": "{\n \"icon\": {\n \"name\": \"Announcement\\\\announcement\",\n \"project\": \"Foundations\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Welcome aboard!\"\n },\n \"controlDocs\": {\n \"panel\": \"Close\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n },\n \"positionAtReferenceParent\": true\n}",
- "project": "Education",
- "id": "340f9107-9b4a-424b-94f2-79d65873c572",
- "savedPayload": {
- "position": {
- "x": 17239.132034355964,
- "y": 30710.117965644036
- },
- "targetPosition": {
- "x": 16939.132034355964,
- "y": 30710.117965644036
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 2,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {},
- "referenceParent": {
- "type": "Tutorial",
- "name": "Governance Program Walk Through Tutorial",
- "id": "eb85fbbd-080f-41c6-91a8-c6b68195a74b"
- },
- "referenceParentCombinedNodePath": [
- [
- "Governance Program Walk Through Tutorial",
- "Tutorial"
- ]
- ]
- }
- }
- ],
- "tutorialTopics": [],
- "id": "75373f58-ac05-4358-ad12-e50c88f08196",
- "savedPayload": {
- "position": {
- "x": 16939.132034355964,
- "y": 30710.117965644036
- },
- "targetPosition": {
- "x": 16727,
- "y": 30922.25
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": true,
- "angleToParent": 1,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- }
+ "type": "APIs",
+ "name": "New APIs",
+ "project": "Foundations",
+ "githubAPI": {
+ "type": "Github API",
+ "name": "New Github API",
+ "config": "{\n \"username\": \"\",\n \"token\": \"\"\n}\n",
+ "project": "Foundations",
+ "id": "48c9ca95-3cc0-43a8-a522-27e812979800",
+ "savedPayload": {
+ "position": {
+ "x": 30519.083333333336,
+ "y": 10718.951150794494
+ },
+ "targetPosition": {
+ "x": 30219.083333333336,
+ "y": 10718.951150794494
+ },
+ "floatingObject": {
+ "isPinned": false,
+ "isFrozen": false,
+ "isCollapsed": false,
+ "angleToParent": 1,
+ "distanceToParent": 3,
+ "arrangementStyle": 0
+ },
+ "uiObject": {
+ "isRunning": false
}
}
- ],
- "id": "57e388d1-f479-4a16-af85-aee12be285a0",
+ },
+ "id": "e4e1b5e1-c1f6-45da-af08-32464d5b17f9",
"savedPayload": {
"position": {
- "x": 16727,
- "y": 30922.25
+ "x": 30219.083333333336,
+ "y": 10718.951150794494
},
"targetPosition": {
- "x": 16727,
- "y": 30922.25
+ "x": 30219.083333333336,
+ "y": 10718.951150794494
},
"floatingObject": {
"isPinned": false,
@@ -2775,267 +1732,10 @@
"isCollapsed": true,
"angleToParent": 1,
"distanceToParent": 3,
- "arrangementStyle": 1
+ "arrangementStyle": 0
},
"uiObject": {
- "isPlaying": true,
"isRunning": false
- },
- "tutorial": {
- "status": "Done"
- }
- }
- },
- null,
- {
- "type": "Tutorial",
- "name": "Governance Program Walk Through Tutorial",
- "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\financial-programs\",\n \"project\": \"Governance\"\n },\n \"position\": \"Center\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Into the Thick of It\"\n },\n \"controlDocs\": {\n \"panel\": \"\",\n \"closeTutorialEditor\": false,\n \"page\": {\n \"project\": \"Foundations\",\n \"category\": \"\",\n \"type\": \"\"\n }\n }\n}",
- "project": "Education",
- "tutorialSteps": [
- {
- "type": "Tutorial Step",
- "name": "Refer a Friend",
- "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\referral-program\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Refer a Friend\"\n },\n \"controlDocs\": {\n \"panel\": \"Open\",\n \"closeTutorialEditor\": true,\n \"page\": {\n \"project\": \"Governance\",\n \"category\": \"Topic\",\n \"type\": \"Referral Program Overview\"\n }\n }\n}",
- "project": "Education",
- "id": "a3df7ac4-69e0-41b9-af1c-fd0087d26161",
- "savedPayload": {
- "position": {
- "x": 21016,
- "y": 30930.750000000004
- },
- "targetPosition": {
- "x": 20716,
- "y": 30930.750000000004
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 1,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- }
- }
- },
- {
- "type": "Tutorial Step",
- "name": "A Thank You for Support",
- "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\support-program\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - A Thank You for Support\"\n },\n \"controlDocs\": {\n \"panel\": \"Open\",\n \"closeTutorialEditor\": true,\n \"page\": {\n \"project\": \"Governance\",\n \"category\": \"Topic\",\n \"type\": \"Support Program Overview\"\n }\n }\n}",
- "project": "Education",
- "id": "dc20ebdc-6708-4fed-a75b-bade62d3ce0c",
- "savedPayload": {
- "position": {
- "x": 20903.04694055762,
- "y": 31165.299444740413
- },
- "targetPosition": {
- "x": 20716,
- "y": 30930.750000000004
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 1,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- }
- }
- },
- {
- "type": "Tutorial Step",
- "name": "Find a Mentor",
- "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\mentorship-program\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Find a Mentor\"\n },\n \"controlDocs\": {\n \"panel\": \"Open\",\n \"closeTutorialEditor\": true,\n \"page\": {\n \"project\": \"Governance\",\n \"category\": \"Topic\",\n \"type\": \"Mentorship Program Overview\"\n }\n }\n}",
- "project": "Education",
- "id": "258b83f3-200d-41d7-8288-81eec5da0ccf",
- "savedPayload": {
- "position": {
- "x": 20649.243719813105,
- "y": 31223.22837365455
- },
- "targetPosition": {
- "x": 20716,
- "y": 30930.750000000004
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 1,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- }
- }
- },
- {
- "type": "Tutorial Step",
- "name": "Claim some Contributions",
- "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\claims-program\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Claim some Contributions\"\n },\n \"controlDocs\": {\n \"panel\": \"Open\",\n \"closeTutorialEditor\": true,\n \"page\": {\n \"project\": \"Governance\",\n \"category\": \"Topic\",\n \"type\": \"Contribution Claims Program Overview\"\n }\n }\n}",
- "project": "Education",
- "id": "7301eace-be0a-45f8-9f8d-14afb7e9336a",
- "savedPayload": {
- "position": {
- "x": 20445.709339629273,
- "y": 31060.91512173527
- },
- "targetPosition": {
- "x": 20716,
- "y": 30930.750000000004
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 1,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- }
- }
- },
- {
- "type": "Tutorial Step",
- "name": "Lend a Vote",
- "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\voting-program\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Lend a Vote\"\n },\n \"controlDocs\": {\n \"panel\": \"Open\",\n \"closeTutorialEditor\": true,\n \"page\": {\n \"project\": \"Governance\",\n \"category\": \"Topic\",\n \"type\": \"Voting Program Overview\"\n }\n }\n}",
- "project": "Education",
- "id": "61b34c29-85ce-4b86-8a77-21f8e8888c35",
- "savedPayload": {
- "position": {
- "x": 20445.709339629273,
- "y": 30800.584878264737
- },
- "targetPosition": {
- "x": 20716,
- "y": 30930.750000000004
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 1,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- }
- }
- },
- {
- "type": "Tutorial Step",
- "name": "Delegate some Power",
- "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\delegation-program\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Delegate some Power\"\n },\n \"controlDocs\": {\n \"panel\": \"Open\",\n \"closeTutorialEditor\": true,\n \"page\": {\n \"project\": \"Governance\",\n \"category\": \"Topic\",\n \"type\": \"Delegation Program Overview\"\n }\n }\n}",
- "project": "Education",
- "id": "bb0b161f-af82-4b93-87a8-30ae6ace533c",
- "savedPayload": {
- "position": {
- "x": 20649.243719813105,
- "y": 30638.271626345457
- },
- "targetPosition": {
- "x": 20716,
- "y": 30930.750000000004
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 1,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- }
- }
- },
- {
- "type": "Tutorial Step",
- "name": "Stake some Tokens",
- "config": "{\n \"icon\": {\n \"name\": \"Programs\\\\staking-program\",\n \"project\": \"Governance\"\n },\n \"position\": \"Left\",\n \"slider\": \"toTop\",\n \"pressButton\": \"\",\n \"docs\": {\n \"project\": \"Governance\",\n \"category\": \"Tutorial\",\n \"type\": \"Tutorial Step - Stake some Tokens\"\n },\n \"controlDocs\": {\n \"panel\": \"Open\",\n \"closeTutorialEditor\": true,\n \"page\": {\n \"project\": \"Governance\",\n \"category\": \"Topic\",\n \"type\": \"Staking Program Overview\"\n }\n }\n}",
- "project": "Education",
- "id": "507fc893-7a06-4bba-ba23-fb7125aa2017",
- "savedPayload": {
- "position": {
- "x": 20903.04694055762,
- "y": 30696.200555259595
- },
- "targetPosition": {
- "x": 20716,
- "y": 30930.750000000004
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": false,
- "angleToParent": 1,
- "distanceToParent": 3,
- "arrangementStyle": 0
- },
- "uiObject": {
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
- }
- }
- }
- ],
- "tutorialTopics": [],
- "id": "eb85fbbd-080f-41c6-91a8-c6b68195a74b",
- "savedPayload": {
- "position": {
- "x": 20716,
- "y": 30930.750000000004
- },
- "targetPosition": {
- "x": 20716,
- "y": 30930.750000000004
- },
- "floatingObject": {
- "isPinned": false,
- "isFrozen": false,
- "isCollapsed": true,
- "angleToParent": 1,
- "distanceToParent": 3,
- "arrangementStyle": 1
- },
- "uiObject": {
- "isPlaying": false,
- "isRunning": false
- },
- "tutorial": {
- "status": "Done"
}
}
}
diff --git a/Projects/Governance/Schemas/Docs-Books/the-governance-project.json b/Projects/Governance/Schemas/Docs-Books/the-governance-project.json
index 5624ea317..eeb98ace4 100644
--- a/Projects/Governance/Schemas/Docs-Books/the-governance-project.json
+++ b/Projects/Governance/Schemas/Docs-Books/the-governance-project.json
@@ -22,8 +22,17 @@
},
{
"style": "Chapter",
- "text": "IV->Governance->Topic->Governance Flow->The Superalgos Governance Project implements a meritocratic system, by which the more you contribute, the more you are entitled to influence the direction of development. ",
- "updated": 1624782801597
+ "text": "IV->Governance->Topic->Governance Flow->The Superalgos Governance Project implements a meritocratic system, by which the more you contribute, the more you are entitled to influence the direction of development.",
+ "updated": 1630576718872
+ },
+ {
+ "style": "Chapter",
+ "text": "V->Governance->Topic->Governance Workspaces->The Governance Project features multiple Project Definition Hierarchies spread across multiple Plugin Workspaces — one Workspace per Project — to facilitate the granular management of definitions by independent teams of maintainers. These are the Governance Workspaces.",
+ "updated": 1630576758374
+ },
+ {
+ "style": "Chapter",
+ "text": "VI->Governance->Topic->Governance How To->A collection of tips and tricks that will make your life easier while participating in governance."
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Concepts/B/Bonus/Bonus-Pool/bonus-pool.json b/Projects/Governance/Schemas/Docs-Concepts/B/Bonus/Bonus-Pool/bonus-pool.json
index a8b1b97da..0d247503b 100644
--- a/Projects/Governance/Schemas/Docs-Concepts/B/Bonus/Bonus-Pool/bonus-pool.json
+++ b/Projects/Governance/Schemas/Docs-Concepts/B/Bonus/Bonus-Pool/bonus-pool.json
@@ -1,8 +1,8 @@
{
"type": "Bonus Pool",
"definition": {
- "text": "A Bonus Pool allocates the tokens to be distributed as bonuses for participating in certain Governance Programs. Each program that features a Token Bonus has its Bonus Pool defined under the Governance Programs section of the Superalgos Pools hierarchy. A bonus represents an incentive to participate in the given program and is displayed Tokens Bonus node.",
- "updated": 1630169555986
+ "text": "A Bonus Pool allocates tokens to incentivize participation in specific Governance Programs. Each program that features a Tokens Bonus node has its Bonus Pool defined under the Governance Programs section of the Superalgos Pools hierarchy. A bonus is an incentive to participate in the given program and its value is displayed in the Tokens Bonus node.",
+ "updated": 1630399869123
},
"paragraphs": [
{
diff --git a/Projects/Governance/Schemas/Docs-Concepts/C/Claim/Claim-Support-Power/claim-support-power.json b/Projects/Governance/Schemas/Docs-Concepts/C/Claim/Claim-Support-Power/claim-support-power.json
new file mode 100644
index 000000000..2d4cd09fb
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Concepts/C/Claim/Claim-Support-Power/claim-support-power.json
@@ -0,0 +1,13 @@
+{
+ "type": "Claim Support Power",
+ "definition": {
+ "text": "Claim Support Power is the Voting Power that goes into a Claim Votes Switch or Claim Votes in general and is a measure of how much you wish to support the Contribution Claims you are voting for.",
+ "updated": 1630355883567
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "Right click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use docs.save to save your changes and app.contribute to send it to the main repository."
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Concepts/C/Claim/Claim-Votes/claim-votes.json b/Projects/Governance/Schemas/Docs-Concepts/C/Claim/Claim-Votes/claim-votes.json
index 0109da33c..478f5ee31 100644
--- a/Projects/Governance/Schemas/Docs-Concepts/C/Claim/Claim-Votes/claim-votes.json
+++ b/Projects/Governance/Schemas/Docs-Concepts/C/Claim/Claim-Votes/claim-votes.json
@@ -1,8 +1,8 @@
{
"type": "Claim Votes",
"definition": {
- "text": "Claim Votes is a generalization referring to either or all of the existing variations (Position Contribution Claim Vote, Feature Contribution Claim Vote, and Asset Contribution Claim Vote nodes) without making such a distinction for being irrelevant in the particular context.",
- "updated": 1624781423463
+ "text": "In general terms, Claim Votes allow you to support the claims of other users. The term Claim Votes is a generalization referring to either or all of the existing types: Position Claim Vote, Feature Claim Vote, and Asset Claim Vote nodes.",
+ "updated": 1630343978470
},
"paragraphs": [
{
@@ -12,7 +12,8 @@
},
{
"style": "Callout",
- "text": "Claim Votes is a generalization referring to either or all of the existing variations (Position Contribution Claim Vote, Feature Contribution Claim Vote, and Asset Contribution Claim Vote nodes) without making such a distinction for being irrelevant in the particular context."
+ "text": "In general terms, Claim Votes allow you to support the claims of other users. The term Claim Votes is a generalization referring to either or all of the existing particular types: Position Claim Vote, Feature Claim Vote, and Asset Claim Vote nodes.",
+ "updated": 1630343984130
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Concepts/C/Claims/Claims-Folder/claims-folder.json b/Projects/Governance/Schemas/Docs-Concepts/C/Claims/Claims-Folder/claims-folder.json
new file mode 100644
index 000000000..aebfde144
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Concepts/C/Claims/Claims-Folder/claims-folder.json
@@ -0,0 +1,72 @@
+{
+ "type": "Claims Folder",
+ "definition": {
+ "text": "The different types of Claims Folder nodes serve as organizational devices. They also allow mapping entire sections of project definition hierarchies to place multiple claims at once.",
+ "updated": 1630258380621
+ },
+ "paragraphs": [
+ {
+ "style": "Block",
+ "text": "Content",
+ "updated": 1630259158667
+ },
+ {
+ "style": "Text",
+ "text": "Project Definition Hierarchies have four types of Class nodes that serve as organizational devices:"
+ },
+ {
+ "style": "List",
+ "text": "Asset Class",
+ "updated": 1630257910724
+ },
+ {
+ "style": "List",
+ "text": "Feature Class"
+ },
+ {
+ "style": "List",
+ "text": "Position Class"
+ },
+ {
+ "style": "List",
+ "text": "Pool Class"
+ },
+ {
+ "style": "Text",
+ "text": "Similarly, the Claims Program features a matching set of organizational devices:",
+ "updated": 1630259570492
+ },
+ {
+ "style": "List",
+ "text": "Asset Claims Folder",
+ "updated": 1630258015447
+ },
+ {
+ "style": "List",
+ "text": "Feature Claims Folder"
+ },
+ {
+ "style": "List",
+ "text": "Position Claims Folder"
+ },
+ {
+ "style": "Important",
+ "text": "Notice that you can't place claims on an entire Pool. You may place claims on granular definitions only. That is why there are no pool claims folders or pool claims for that matter.",
+ "updated": 1630258341920
+ },
+ {
+ "style": "Text",
+ "text": "You may use these folder nodes to organize your claims in arbitrary arrangements, but you can also make a more sophisticated use of them!",
+ "updated": 1630259141082
+ },
+ {
+ "style": "Callout",
+ "text": "Use a Claims Folder node to establish a reference with the corresponding type of Class node. Then use the Install Missing Claims option on the menu of the Claims Folder to map the entire Class! The process creates a Claims Folder for each Class, and a claim for each Asset, Feature, or Position defined within each Class. ",
+ "updated": 1630357212192
+ },
+ {
+ "style": "Success",
+ "text": "If something changes on the side of the definitions, you may always go back a run the Install Missing Claims process again. The process will remap the structure with the appropriate claims and folders."
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Concepts/C/Claims/Claims-Power/claim-power.json b/Projects/Governance/Schemas/Docs-Concepts/C/Claims/Claims-Power/claim-power.json
new file mode 100644
index 000000000..7db67f4d1
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Concepts/C/Claims/Claims-Power/claim-power.json
@@ -0,0 +1,19 @@
+{
+ "type": "Claim Power",
+ "definition": {
+ "text": "Claim Power is the Token Power that goes into the Claims Program, and determines the number of tokens you are claiming with any of the existing types of claims: Position Contribution Claim, Feature Contribution Claim, and Asset Contribution Claim.",
+ "updated": 1624781372494
+ },
+ "paragraphs": [
+ {
+ "style": "Block",
+ "text": "Content",
+ "updated": 1624781499321
+ },
+ {
+ "style": "Callout",
+ "text": "Claim Power is the Token Power that goes into the Claims Program, and determines the number of tokens you are claiming with any of the existing types of claims: Position Contribution Claim, Feature Contribution Claim, and Asset Contribution Claim.",
+ "updated": 1630254492262
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Concepts/C/Claims/Claims-Power/claims-power.json b/Projects/Governance/Schemas/Docs-Concepts/C/Claims/Claims-Power/claims-power.json
deleted file mode 100644
index d0be1b6c2..000000000
--- a/Projects/Governance/Schemas/Docs-Concepts/C/Claims/Claims-Power/claims-power.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "type": "Claims Power",
- "definition": {
- "text": "Claims Power is the Token Power that goes into the Claims Program, and determines the number of tokens you are claiming with any of the existing types of claims: Position Contribution Claim, Feature Contribution Claim, and Asset Contribution Claim.",
- "updated": 1624781372494
- },
- "paragraphs": [
- {
- "style": "Block",
- "text": "Content",
- "updated": 1624781499321
- },
- {
- "style": "Callout",
- "text": "Claims Power is the Token Power that goes into the Claims Program, and determines the number of tokens you are claiming with any of the existing types of claims: Position Contribution Claim, Feature Contribution Claim, and Asset Contribution Claim."
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Concepts/C/Community/Community-Mods/community-mods.json b/Projects/Governance/Schemas/Docs-Concepts/C/Community/Community-Mods/community-mods.json
index c7b64cecc..6c7b216ba 100644
--- a/Projects/Governance/Schemas/Docs-Concepts/C/Community/Community-Mods/community-mods.json
+++ b/Projects/Governance/Schemas/Docs-Concepts/C/Community/Community-Mods/community-mods.json
@@ -12,7 +12,8 @@
},
{
"style": "Callout",
- "text": "To become a Community Mod, you must go deep into the rabbit hole, study the Docs and tutorials, and start using the system. It takes a deep understanding of how things work before you’re able to explain it to someone else. That said, it doesn’t take much to help newcomers with the easier questions. You may get involved and participate in the Community and Support Group, and, at some point, we’ll draft you to join the team!"
+ "text": "To become a Community Mod, you must go deep into the rabbit hole, study the Docs and tutorials, and start using the system. It takes a deep understanding of how things work before you’re able to explain it to someone else. That said, it doesn’t take much to help newcomers with the easier questions. You may get involved and participate in the Community Group and Support Group, and, at some point, we’ll draft you to join the team!",
+ "updated": 1630495449816
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Concepts/C/Contribution/Contribution-Claims/contribution-claims.json b/Projects/Governance/Schemas/Docs-Concepts/C/Contribution/Contribution-Claims/contribution-claims.json
new file mode 100644
index 000000000..6789ecf8e
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Concepts/C/Contribution/Contribution-Claims/contribution-claims.json
@@ -0,0 +1,13 @@
+{
+ "type": "Contribution Claims",
+ "definition": {
+ "text": "The term Contribution Claims is a generalization of the concept of claims and may refer to any or all of the existing types, namely Asset Contribution Claim, Feature Contribution Claim, and Position Contribution Claim nodes.",
+ "updated": 1630351499915
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "Right click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use docs.save to save your changes and app.contribute to send it to the main repository."
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Concepts/D/Delegate/Delegate-Power/delegate-power.json b/Projects/Governance/Schemas/Docs-Concepts/D/Delegate/Delegate-Power/delegate-power.json
new file mode 100644
index 000000000..9c6fb05e2
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Concepts/D/Delegate/Delegate-Power/delegate-power.json
@@ -0,0 +1,13 @@
+{
+ "type": "Delegate Power",
+ "definition": {
+ "text": "Delegate Power is the Token Power that goes into the Delegation Program. Only 10% of the Delegate Power flowing into a User Delegate node reaches the recipient User Profile.",
+ "updated": 1630423869047
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "Right click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use docs.save to save your changes and app.contribute to send it to the main repository."
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Concepts/D/Distribution/Distribution-Event/distribution-event.json b/Projects/Governance/Schemas/Docs-Concepts/D/Distribution/Distribution-Event/distribution-event.json
new file mode 100644
index 000000000..81d2e696e
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Concepts/D/Distribution/Distribution-Event/distribution-event.json
@@ -0,0 +1,27 @@
+{
+ "type": "Distribution Event",
+ "definition": {
+ "text": "The Superalgos Project distributes its native Superalgos SA Tokens after each release to reward contributions and incentivize desirable behaviors. The Distribution Event represents the moment in time and the act of running the process that distributes tokens from the Treasury Account to the Governance Address associated with each User Profile that participates in governance.",
+ "updated": 1630570602251
+ },
+ "paragraphs": [
+ {
+ "style": "Block",
+ "text": "Content",
+ "updated": 1630233421503
+ },
+ {
+ "style": "Text",
+ "text": "The Superalgos Project announces each release through all official channels, including the Telegram Announcements channel and the Superalgos Medium Blog.",
+ "updated": 1630235099973
+ },
+ {
+ "style": "Text",
+ "text": "At the moment of the announcement, a time window opens for the Community to participate in governance. At this point, the window is of an indeterminate span. Users may set up their User Profiles until the window closes. "
+ },
+ {
+ "style": "Text",
+ "text": "Once the window closes, no further modifications are accepted on governance hierarchies until the Distribution Event takes place."
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Concepts/I/Incoming/Incoming-Power/incoming-power.json b/Projects/Governance/Schemas/Docs-Concepts/I/Incoming/Incoming-Power/incoming-power.json
new file mode 100644
index 000000000..c4fa8def8
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Concepts/I/Incoming/Incoming-Power/incoming-power.json
@@ -0,0 +1,13 @@
+{
+ "type": "Incoming Power",
+ "definition": {
+ "text": "Incoming Power is a form of Token Power coming into any given Governance Program originating at a third party User Profile. Certain programs use the notion of Incoming Power to determine the Tokens Rewards applicable for the program in question.",
+ "updated": 1630235289528
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "Right click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use docs.save to save your changes and app.contribute to send it to the main repository."
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Concepts/L/Liquid/Liquid-Democracy/liquid-democracy.json b/Projects/Governance/Schemas/Docs-Concepts/L/Liquid/Liquid-Democracy/liquid-democracy.json
new file mode 100644
index 000000000..ef1f0a961
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Concepts/L/Liquid/Liquid-Democracy/liquid-democracy.json
@@ -0,0 +1,18 @@
+{
+ "type": "Liquid Democracy",
+ "definition": {
+ "text": "The form of Liquid Democracy in Superalgos utilizes elements of direct and representative democracy. Users have the right to vote directly, like in a direct democracy, but also have the option to delegate their Voting Power for someone else to vote on their behalf, like in a representative democracy. ",
+ "updated": 1630396811020
+ },
+ "paragraphs": [
+ {
+ "style": "Block",
+ "text": "Content",
+ "updated": 1630396824875
+ },
+ {
+ "style": "Text",
+ "text": "The form of Liquid Democracy in Superalgos utilizes elements of direct and representative democracy. Users have the right to vote directly, like in a direct democracy, but also have the option to delegate their Voting Power for someone else to vote on their behalf, like in a representative democracy."
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Concepts/P/Project/Project-Definition-Hierarchies/project-definition-hierarchies.json b/Projects/Governance/Schemas/Docs-Concepts/P/Project/Project-Definition-Hierarchies/project-definition-hierarchies.json
new file mode 100644
index 000000000..6bbd08805
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Concepts/P/Project/Project-Definition-Hierarchies/project-definition-hierarchies.json
@@ -0,0 +1,13 @@
+{
+ "type": "Project Definition Hierarchies",
+ "definition": {
+ "text": "These are the Pools, Assets, Features, and Positions hierarchies used to produce granular definitions of the Superalgos Project to be used for governance.",
+ "updated": 1630259293946
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "Right click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use docs.save to save your changes and app.contribute to send it to the main repository."
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Concepts/R/Reputation/Reputation/reputation.json b/Projects/Governance/Schemas/Docs-Concepts/R/Reputation/Reputation/reputation.json
index 6274a88b6..9d65f6255 100644
--- a/Projects/Governance/Schemas/Docs-Concepts/R/Reputation/Reputation/reputation.json
+++ b/Projects/Governance/Schemas/Docs-Concepts/R/Reputation/Reputation/reputation.json
@@ -6,7 +6,12 @@
},
"paragraphs": [
{
- "style": "Text",
+ "style": "Block",
+ "text": "Content",
+ "updated": 1630508809125
+ },
+ {
+ "style": "Important",
"text": "Only the tokens you get for contributing to the project grant you reputation. Reputation is not transferable, so the tokens you acquire by any other means (buying, swapping, borrowing, trading, etc.) do not carry a reputation value."
},
{
diff --git a/Projects/Governance/Schemas/Docs-Concepts/R/Reusable/Reusable-Governance-Snippets/reusable-governance-snippets.json b/Projects/Governance/Schemas/Docs-Concepts/R/Reusable/Reusable-Governance-Snippets/reusable-governance-snippets.json
index 351cb611b..a9c44279d 100644
--- a/Projects/Governance/Schemas/Docs-Concepts/R/Reusable/Reusable-Governance-Snippets/reusable-governance-snippets.json
+++ b/Projects/Governance/Schemas/Docs-Concepts/R/Reusable/Reusable-Governance-Snippets/reusable-governance-snippets.json
@@ -9,21 +9,158 @@
"style": "Title",
"text": "Computational Limitations"
},
- {
- "style": "Block",
- "text": "Computational Limitations"
- },
{
"style": "Title",
"text": ""
},
{
- "style": "Note",
+ "style": "Block",
+ "text": "Computational Limitations",
+ "updated": 1630569942063
+ },
+ {
+ "style": "Text",
"text": "The governance system does all calculations dynamically, in real-time, with every change in the definitions, and computes all the hierarchies loaded in the Current Workspace."
},
{
"style": "Important",
"text": "The above means that the calculations that you see from within any given Workspace is a partial calculation within the scope of the Current Workspace only. Definitions, claims, votes, and so on, existing on other workspaces or plugins are not computed."
+ },
+ {
+ "style": "Block",
+ "text": "Computational Limitations 2",
+ "updated": 1630569818098
+ },
+ {
+ "style": "Text",
+ "text": "If you cast votes or place claims in more than one Governance Workspace, you will not be able to see what some of your claims and votes are about — in particular, those that live on a workspace that is not the Current Workspace.",
+ "updated": 1630569998640
+ },
+ {
+ "style": "Text",
+ "text": "If you wish to have a clearer picture of all your votes and claims, you may want to set up a new workspace that includes all the hierarchies that you need to interact with. That way, you will be able to see all of your votes and claims at the same time. To do this, save a new workspace deriving from one of the Governance Workspaces and load the plugins you need.",
+ "updated": 1630570350637
+ },
+ {
+ "style": "Note",
+ "text": "Even if you do as suggested above, the calculations you see in terms of Token Rewards, Tokens Awarded, Tokens Bonus, and so on, are still partial. The actual Distribution Event calculation involves computing all of the Project Definition Hierarchies, including all User Profile hierarchies participating in governance.",
+ "updated": 1630570663757
+ },
+ {
+ "style": "Text",
+ "text": ""
+ },
+ {
+ "style": "Block",
+ "text": "Dummy",
+ "updated": 1630230740442
+ },
+ {
+ "style": "Title",
+ "text": "Deep in Governance",
+ "updated": 1630574167914
+ },
+ {
+ "style": "Block",
+ "text": "Deep in Governance"
+ },
+ {
+ "style": "Success",
+ "text": "If you have contributed work or wish to go deep with your participation in governance, you will most likely need to interact with one or more of the project-specific Governance Workspaces. To do that, load your User Profile into the corresponding workspaces so that you may establish references to place Contribution Claims and cast Weight Votes.",
+ "updated": 1630574190576
+ },
+ {
+ "style": "Block",
+ "text": "Dummy",
+ "updated": 1630574197424
+ },
+ {
+ "style": "Title",
+ "text": "Featuring Tokens Bonus"
+ },
+ {
+ "style": "Block",
+ "text": "Featuring Tokens Bonus",
+ "updated": 1630230362519
+ },
+ {
+ "style": "Important",
+ "text": "Participation in this program is incentivized with a Tokens Bonus, meaning you earn tokens just by participating! Read about Tokens Bonus to learn more!",
+ "updated": 1630230393431
+ },
+ {
+ "style": "Block",
+ "text": "Dummy",
+ "updated": 1630230754699
+ },
+ {
+ "style": "Title",
+ "text": "Community Building Programs"
+ },
+ {
+ "style": "Block",
+ "text": "Community Building Programs"
+ },
+ {
+ "style": "Success",
+ "text": "Read about the Community Building Programs to learn how this program calculates Tokens Awarded.",
+ "updated": 1630232362107
+ },
+ {
+ "style": "Block",
+ "text": "Dummy",
+ "updated": 1630325147588
+ },
+ {
+ "style": "Title",
+ "text": "Claims Content",
+ "updated": 1630325166381
+ },
+ {
+ "style": "Block",
+ "text": "Claims Content"
+ },
+ {
+ "style": "Important",
+ "text": "Make sure you're driving enough Claim Power to the node so that you may get the reward you deserve! And remember to ask the people who know your work to vouch for your claims with their Claim Votes. That is how your contribution gets validated and how you get the associated rewards.",
+ "updated": 1630325171869
+ },
+ {
+ "style": "Note",
+ "text": "Learn more about How Claims are Resolved!"
+ },
+ {
+ "style": "Block",
+ "text": "Dummy",
+ "updated": 1630350577178
+ },
+ {
+ "style": "Title",
+ "text": "Claim Votes Content",
+ "updated": 1630350592141
+ },
+ {
+ "style": "Block",
+ "text": "Claim Votes Content",
+ "updated": 1630350596729
+ },
+ {
+ "style": "Important",
+ "text": "The Claim Support Power you drive into Claim Votes nodes is significant, as it is a measure of your support to the claim. The ideal case scenario for the party placing the claim is that the claim gets enough Claim Votes with enough Claim Support Power to match the Claim Power the claim carries.",
+ "updated": 1630356135160
+ },
+ {
+ "style": "Success",
+ "text": "You may want to learn more about How Claims are Resolved!"
+ },
+ {
+ "style": "Block",
+ "text": "Dummy"
+ },
+ {
+ "style": "Text",
+ "text": "Title",
+ "updated": 1630350617116
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Concepts/R/Rewards/Rewards-Pool/rewards-pool.json b/Projects/Governance/Schemas/Docs-Concepts/R/Rewards/Rewards-Pool/rewards-pool.json
index 9faa1dac0..263148226 100644
--- a/Projects/Governance/Schemas/Docs-Concepts/R/Rewards/Rewards-Pool/rewards-pool.json
+++ b/Projects/Governance/Schemas/Docs-Concepts/R/Rewards/Rewards-Pool/rewards-pool.json
@@ -1,8 +1,8 @@
{
"type": "Rewards Pool",
"definition": {
- "text": "A Rewards Pool allocates the tokens to be distributed as rewards for contributions on several of the existing Governance Programs. Each program that distributes rewards has its Rewards Pool defined under the Governance Programs section of the Superalgos Pools hierarchy. Rewards represent the value of your contributions to each of the programs. Each program calculates rewards in a particular way and displays the result in its Tokens Rewards node.",
- "updated": 1630169267228
+ "text": "A Rewards Pool allocates tokens to reward contributions to specific Governance Programs. Each program that features a Tokens Awarded node distributes rewards from a Rewards Pool defined under the Governance Programs section of the Superalgos Pools hierarchy. Rewards represent the value of your contributions to each of the programs. Each program calculates rewards in a particular way and displays the result in the Tokens Awarded node.",
+ "updated": 1630399801989
},
"paragraphs": [
{
diff --git a/Projects/Governance/Schemas/Docs-Concepts/S/Superalgos/Superalgos-Pools/superalgos-pools.json b/Projects/Governance/Schemas/Docs-Concepts/S/Superalgos/Superalgos-Pools/superalgos-pools.json
index 9911f46d2..76b685f3a 100644
--- a/Projects/Governance/Schemas/Docs-Concepts/S/Superalgos/Superalgos-Pools/superalgos-pools.json
+++ b/Projects/Governance/Schemas/Docs-Concepts/S/Superalgos/Superalgos-Pools/superalgos-pools.json
@@ -2,7 +2,7 @@
"type": "Superalgos Pools",
"definition": {
"text": "Superalgos Pools is the top-level hierarchy kickstarting the definition of the whole Superalgos Project. It features the definition of several Pool nodes describing the main areas of project development that the Community wishes to incentivize.",
- "updated": 1630170275507
+ "updated": 1630426704558
},
"paragraphs": [
{
@@ -12,7 +12,8 @@
},
{
"style": "Text",
- "text": "Because this is the highest level definition of how tokens will be distributed, the Superalgos Pools hierarchy is present in all governance Plugin Workspaces."
+ "text": "Because this is the highest level definition of how tokens will be distributed, the Superalgos Pools hierarchy is present in all Governance Workspaces.",
+ "updated": 1630426648511
},
{
"style": "Success",
@@ -21,7 +22,8 @@
},
{
"style": "Note",
- "text": "The configuration of the top-level node in the hierarchy determines how many tokens will be distributed in the release."
+ "text": "The configuration of the top-level node in the hierarchy determines how many tokens are distributed in the Distribution Event.",
+ "updated": 1630426722866
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Concepts/T/Token/Token-Power-Flows/token-power-flows.json b/Projects/Governance/Schemas/Docs-Concepts/T/Token/Token-Power-Flows/token-power-flows.json
new file mode 100644
index 000000000..288b5eb98
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Concepts/T/Token/Token-Power-Flows/token-power-flows.json
@@ -0,0 +1,78 @@
+{
+ "type": "Token Power Flows",
+ "definition": {
+ "text": "Token Power flows cascading down from the User Profile node to the Token Power Switch node, to its offspring, and so on, following the structure of the hierarchy.",
+ "updated": 1630215880089
+ },
+ "paragraphs": [
+ {
+ "style": "Block",
+ "text": "Content",
+ "updated": 1630216073912
+ },
+ {
+ "style": "Text",
+ "text": "How Token Power flows depends on the following:"
+ },
+ {
+ "style": "List",
+ "text": "By default, Token Power flows in equal proportion to each direct offspring node."
+ },
+ {
+ "style": "List",
+ "text": "You may override the defaults by explicitly defining the percentage of the Token Power you wish to allocate to each offspring. If you define less than a total of 100%, then the remaining Token Power is distributed evenly across the offspring for which there is no definition."
+ },
+ {
+ "style": "Text",
+ "text": "This is the format of the configuration you may use on each of the programs:"
+ },
+ {
+ "style": "Json",
+ "text": "{\n\"percentage\": 50\n}",
+ "updated": 1630215956488
+ },
+ {
+ "style": "Text",
+ "text": "For example, let's say you have 1,000 Token Power flowing into your Token Power Switch node. Let's say you spawn the Onboarding Programs, Community Building Programs, Votes And Claims Programs, and Financial Programs nodes.",
+ "updated": 1630436060757
+ },
+ {
+ "style": "Callout",
+ "text": "As soon as you deploy these four offspring of the Token Power Switch node, you will see that each of the nodes gets 25% of the Token Power by default.",
+ "updated": 1630436087763
+ },
+ {
+ "style": "Text",
+ "text": "But you wish to limit the Token Power flowing into the Onboarding Programs to zero, as those programs do not require Token Power. To do that, you set up the following in the Onboarding Programs node configuration:"
+ },
+ {
+ "style": "Json",
+ "text": "{\n\"percentage\": 0\n}",
+ "updated": 1630215994714
+ },
+ {
+ "style": "Callout",
+ "text": "Once the configuration is in place, you will notice that the Onboarding Programs node shows 0% and 0 Token Power flowing into the node. You will also notice that the rest of the nodes are getting 33.33% of the Token Power each."
+ },
+ {
+ "style": "Text",
+ "text": "Now let's say you wish to use only 10% of your Token Power in the Community Building Programs. So you set up the following config:",
+ "updated": 1630436162265
+ },
+ {
+ "style": "Json",
+ "text": "{\n\"percentage\": 10\n}",
+ "updated": 1630216035853
+ },
+ {
+ "style": "Callout",
+ "text": "As a result, 10% of the Token Power flows into the Community Building Programs, while the remaining nodes get 45% of the Token Power each.",
+ "updated": 1630436168281
+ },
+ {
+ "style": "Important",
+ "text": "One more thing! When Token Power flows into a specific program, it turns into a specific form of power associated with the said program! For example, Token Power that flows into the Support Program turns into Support Power. In the Voting Program, it turns into Voting Power. Notice that this is just a change in the name, as all these forms of powers behave in the same manner throughout the User Profile hierarchy.",
+ "updated": 1630436471069
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Concepts/W/Weight/Weight-Power/weight-power.json b/Projects/Governance/Schemas/Docs-Concepts/W/Weight/Weight-Power/weight-power.json
new file mode 100644
index 000000000..82bb4c6f1
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Concepts/W/Weight/Weight-Power/weight-power.json
@@ -0,0 +1,13 @@
+{
+ "type": "Weight Power",
+ "definition": {
+ "text": "Weight Power is the Voting Power that goes into a Weight Votes Switch or Weight Votes in general and is a measure of how much you wish to incentivize the node you are voting for.",
+ "updated": 1630355707896
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "Right click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use docs.save to save your changes and app.contribute to send it to the main repository."
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Concepts/W/Weight/Weight-Votes/weight-votes.json b/Projects/Governance/Schemas/Docs-Concepts/W/Weight/Weight-Votes/weight-votes.json
index bfc6c4e88..20f7c5709 100644
--- a/Projects/Governance/Schemas/Docs-Concepts/W/Weight/Weight-Votes/weight-votes.json
+++ b/Projects/Governance/Schemas/Docs-Concepts/W/Weight/Weight-Votes/weight-votes.json
@@ -1,13 +1,24 @@
{
"type": "Weight Votes",
"definition": {
- "text": "A type of vote within the Voting Program used to confer Weight to different types of nodes in the multiple project definition hierarchies. ",
- "updated": 1624729793292
+ "text": "Weight Votes are a type of vote within the Voting Program used to confer Weight to different types of nodes in the multiple Project Definition Hierarchies. The Weight that Asset, Feature, Position, and Pool nodes get from Weight Votes cast by the Community determines the Token Rewards available as incentives for those nodes. The term Weight Votes is a generalization describing any or all of the types of weight vote nodes, namely Pool Weight Vote, Position Weight Vote, Feature Weight Vote, and Asset Weight Vote.",
+ "updated": 1630498313646
},
"paragraphs": [
{
- "style": "Text",
- "text": "Right click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use docs.save to save your changes and app.contribute to send it to the main repository."
+ "style": "Block",
+ "text": "Content",
+ "updated": 1630345048703
+ },
+ {
+ "style": "Important",
+ "text": "The Weight Power you drive into Weight Votes nodes is significant, as it is a measure of how much you wish to incentivize the referenced node. Nodes in Project Definition Hierarchies get Token Rewards proportional to the Weight Power they get from all Weight Votes they receive!",
+ "updated": 1630355171054
+ },
+ {
+ "style": "Success",
+ "text": "You may want to learn more about Token Rewards and Voting Power Flow! The page explains how Token Rewards are allocated to each node in the Project Definition Hierarchies depending on the Weight they get from Weight Votes.",
+ "updated": 1630498497344
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Concepts/W/Weight/Weight/weight.json b/Projects/Governance/Schemas/Docs-Concepts/W/Weight/Weight/weight.json
index 03befed8e..25572d4e8 100644
--- a/Projects/Governance/Schemas/Docs-Concepts/W/Weight/Weight/weight.json
+++ b/Projects/Governance/Schemas/Docs-Concepts/W/Weight/Weight/weight.json
@@ -1,8 +1,8 @@
{
"type": "Weight",
"definition": {
- "text": "The Weight of a node is a direct proportion of the Weight Votes coming into the node divided by the total number of Weight Votes coming into the whole hierarchy, and multiplied by 100, to express it as a percentage.",
- "updated": 1624781091970
+ "text": "The Weight of a node is a direct proportion of the Weight Power coming into the node divided by the total amount of Weight Power coming into the whole hierarchy, and multiplied by 100, to express it as a percentage.",
+ "updated": 1630510882454
},
"paragraphs": [
{
@@ -12,7 +12,8 @@
},
{
"style": "Callout",
- "text": "The Weight of a node is a direct proportion of the Weight Votes coming into the node divided by the total number of Weight Votes coming into the whole hierarchy, and multiplied by 100, to express it as a percentage."
+ "text": "The Weight of a node is a direct proportion of the Weight Power coming into the node divided by the total amount of Weight Power coming into the whole hierarchy, and multiplied by 100, to express it as a percentage.",
+ "updated": 1630510887120
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Nodes/A/Airdrop/Airdrop-Program/airdrop-program.json b/Projects/Governance/Schemas/Docs-Nodes/A/Airdrop/Airdrop-Program/airdrop-program.json
new file mode 100644
index 000000000..1beb86056
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Nodes/A/Airdrop/Airdrop-Program/airdrop-program.json
@@ -0,0 +1,36 @@
+{
+ "type": "Airdrop Program",
+ "definition": {
+ "text": "We don't like meaningless airdrops. But what if airdrops bring users a step closer to participating in governance? The Airdrops program incentivizes users to take the first step to participate in governance: creating and submitting a User Profile.",
+ "updated": 1630221752804
+ },
+ "paragraphs": [
+ {
+ "style": "Block",
+ "text": "Content",
+ "updated": 1630218642448
+ },
+ {
+ "style": "Text",
+ "text": "The Airdrop program distributes the Rewards Pool defined under the Governance Programs > Onboarding Programs section of the Superalgos Pools hierarchy.",
+ "updated": 1630221764293
+ },
+ {
+ "style": "Callout",
+ "text": "Spawning the Airdrop Program and submitting your User Profile is the sole requirement to receive the airdropped tokens and is — at the same time — the first step to participate in governance and contribute to the project.",
+ "updated": 1630228015309
+ },
+ {
+ "style": "Text",
+ "text": "The program distributes the Rewards Pool evenly to all existing profiles, with a cap of SA 1,000 per profile, on each release!"
+ },
+ {
+ "style": "Block",
+ "text": "Configuration"
+ },
+ {
+ "style": "Title",
+ "text": "Configuration"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Nodes/A/Asset/Asset-Claim-Vote/asset-claim-vote.json b/Projects/Governance/Schemas/Docs-Nodes/A/Asset/Asset-Claim-Vote/asset-claim-vote.json
index 9a0b3d4b8..3928a2251 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/A/Asset/Asset-Claim-Vote/asset-claim-vote.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/A/Asset/Asset-Claim-Vote/asset-claim-vote.json
@@ -1,13 +1,38 @@
{
"type": "Asset Claim Vote",
"definition": {
- "text": "This node is used to pass votes, via a reference, to an Asset Contribution Claim made by a user, in order to support that claim and allow the user making the claim to receive tokens for contributing either with the creation of that an asset or it's mantainance.",
- "updated": 1622988917379
+ "text": "Use this node to establish a reference with an Asset Contribution Claim placed by your colleague in the Claims Program section of their User Profile. This vote means that you support your colleague's claim with the Claim Support Power you drive into the Claim Votes node!",
+ "updated": 1630356280267
},
"paragraphs": [
{
- "style": "Text",
- "text": "Right click and select the pencil button to enter edit mode."
+ "style": "Block",
+ "text": "Content",
+ "updated": 1630351012870
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Claim Votes Content"
+ },
+ {
+ "style": "Subtitle",
+ "text": "Working on Multiple Workspaces"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Deep in Governance"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Computational Limitations 2"
+ },
+ {
+ "style": "Block",
+ "text": "Configuration"
+ },
+ {
+ "style": "Title",
+ "text": "Configuration"
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Nodes/A/Asset/Asset-Claims-Folder/asset-claims-folder.json b/Projects/Governance/Schemas/Docs-Nodes/A/Asset/Asset-Claims-Folder/asset-claims-folder.json
index 2f6bc3f24..9fbb03f6a 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/A/Asset/Asset-Claims-Folder/asset-claims-folder.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/A/Asset/Asset-Claims-Folder/asset-claims-folder.json
@@ -1,18 +1,14 @@
{
"type": "Asset Claims Folder",
"definition": {
- "text": "The Asset Contribution Claims Folder node is an organizational device used to arrange Asset Contribution Claim nodes in suitable hierarchical structures.",
- "updated": 1624728516601
+ "text": "Use this node as an organizational device, to spawn Asset Contribution Claim nodes, and to map entire structures in an Assets hierarchy to place multiple Contribution Claims at once.",
+ "updated": 1630352114041
},
"paragraphs": [
{
- "style": "Block",
- "text": "Content",
- "updated": 1624728536229
- },
- {
- "style": "Text",
- "text": "You may use this node to reference an Asset Class node in the Assets hierarchy. Once the reference is established, you may use the Install Missing Claims option on the menu to map the data structure of the referenced node with claims for each Asset."
+ "style": "Include",
+ "text": "Governance->Concept->Claims Folder->Content",
+ "updated": 1630259502301
},
{
"style": "Block",
diff --git a/Projects/Governance/Schemas/Docs-Nodes/A/Asset/Asset-Class/asset-class.json b/Projects/Governance/Schemas/Docs-Nodes/A/Asset/Asset-Class/asset-class.json
index e900b255b..af6d372d2 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/A/Asset/Asset-Class/asset-class.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/A/Asset/Asset-Class/asset-class.json
@@ -12,7 +12,8 @@
},
{
"style": "Text",
- "text": "You may direct Weight Votes to an Asset Class node when you intend to support the whole class, including all assets within."
+ "text": "You may direct Weight Votes to an Asset Class node when you intend to drive Weight to the whole class, including all assets within.",
+ "updated": 1630434955110
},
{
"style": "Text",
diff --git a/Projects/Governance/Schemas/Docs-Nodes/A/Asset/Asset-Contribution-Claim/asset-contribution-claim.json b/Projects/Governance/Schemas/Docs-Nodes/A/Asset/Asset-Contribution-Claim/asset-contribution-claim.json
index 01a84252c..8916e53ad 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/A/Asset/Asset-Contribution-Claim/asset-contribution-claim.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/A/Asset/Asset-Contribution-Claim/asset-contribution-claim.json
@@ -1,8 +1,8 @@
{
"type": "Asset Contribution Claim",
"definition": {
- "text": "Use this node to reference an Asset node in the Assets hierarchy to establish an Asset Contribution Claim.",
- "updated": 1624728739277
+ "text": "Use this node to reference an Asset node in one of the Assets hierarchy to establish an Asset Contribution Claim. This claim means that you declare that you have worked on that Asset, either creating or improving it, and that you expect to be rewarded accordingly!",
+ "updated": 1630349414102
},
"paragraphs": [
{
@@ -11,8 +11,9 @@
"updated": 1624728761840
},
{
- "style": "Text",
- "text": "Remember to ask the people who know about your work to vouch for your claim with their Claim Votes. This is how your contribution gets validated so that you may get the associated rewards."
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Claims Content",
+ "updated": 1630325363447
},
{
"style": "Block",
diff --git a/Projects/Governance/Schemas/Docs-Nodes/A/Asset/Asset-Weight-Vote/asset-weight-vote.json b/Projects/Governance/Schemas/Docs-Nodes/A/Asset/Asset-Weight-Vote/asset-weight-vote.json
index 2bbd584ed..1953425ae 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/A/Asset/Asset-Weight-Vote/asset-weight-vote.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/A/Asset/Asset-Weight-Vote/asset-weight-vote.json
@@ -1,13 +1,38 @@
{
"type": "Asset Weight Vote",
"definition": {
- "text": "A Weight Vote that may reference an Asset node in the Assets hierarchy.",
- "updated": 1624729908316
+ "text": "Use this node to establish a reference with an Asset node in an Assets hierarchy. With this vote, you are passing on Weight Power to the referenced node. That way, the node gets more of the Token Rewards available in the hierarchy. This is how you influence how different areas of the project are incentivized.",
+ "updated": 1630356598807
},
"paragraphs": [
{
- "style": "Text",
- "text": "Right click and select the pencil button to enter edit mode."
+ "style": "Block",
+ "text": "Content",
+ "updated": 1630356862496
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Weight Votes->Content"
+ },
+ {
+ "style": "Subtitle",
+ "text": "Working on Multiple Workspaces"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Deep in Governance"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Computational Limitations 2"
+ },
+ {
+ "style": "Block",
+ "text": "Configuration"
+ },
+ {
+ "style": "Title",
+ "text": "Configuration"
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Nodes/A/Asset/Asset/asset.json b/Projects/Governance/Schemas/Docs-Nodes/A/Asset/Asset/asset.json
index 00bd14b07..82b783bee 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/A/Asset/Asset/asset.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/A/Asset/Asset/asset.json
@@ -1,8 +1,8 @@
{
"type": "Asset",
"definition": {
- "text": "An Asset is an artifact, mostly in a digital format, that belongs to a Project. It may be a code file, a documentation or tutorial page, an image, a video, a social media account or even a post, marketing collateral, and more. To incentivize the production and maintenance of Assets, the node may receive Weight Votes. It may also receive Contributor Claims from Contributors involved in their production and maintenance.",
- "updated": 1624709807952
+ "text": "An Asset is an artifact, mostly in a digital format, that belongs to a Project. It may be a code file, a documentation or tutorial page, an image, a video, a social media account or even a post, marketing collateral, and more. To incentivize the production and maintenance of Assets, the node may receive Weight Votes. It may also receive Contribution Claims from Contributors involved in their production and maintenance.",
+ "updated": 1630435180948
},
"paragraphs": [
{
@@ -12,12 +12,13 @@
},
{
"style": "Text",
- "text": "You may cast Weight Votes on individual Asset nodes to incentivize the improvement, development, and maintenance of the said feature.",
- "updated": 1624709824891
+ "text": "You may cast Weight Votes on individual Asset nodes to incentivize the improvement, development, and maintenance of the said asset.",
+ "updated": 1630435190635
},
{
"style": "Text",
- "text": "If you are involved in the development or maintenance of the said asset, you may place an Asset Contribution Claim and rally the Community to support your claim so that you may be compensated for your work."
+ "text": "If you are involved in the development or maintenance of the said asset, you may place an Asset Contribution Claim and rally the Community to support your claim so that you may be rewarded for your work.",
+ "updated": 1630435212758
},
{
"style": "Block",
diff --git a/Projects/Governance/Schemas/Docs-Nodes/A/Assets/Assets/assets.json b/Projects/Governance/Schemas/Docs-Nodes/A/Assets/Assets/assets.json
index 9299b7cb9..3cdcb6014 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/A/Assets/Assets/assets.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/A/Assets/Assets/assets.json
@@ -16,7 +16,8 @@
},
{
"style": "Text",
- "text": "The hierarchy features Asset Class nodes, an organizational device, and Asset nodes, the representation of actual assets. Both types of nodes may accept incoming Weight Votes but only Asset nodes may accept Contributor Claims."
+ "text": "The hierarchy features Asset Class nodes, an organizational device, and Asset nodes, the representation of actual assets. Both types of nodes may accept incoming Weight Votes but only Asset nodes may accept Contribution Claims.",
+ "updated": 1630434541690
},
{
"style": "Success",
@@ -24,13 +25,18 @@
"updated": 1624709216096
},
{
- "style": "Title",
+ "style": "Subtitle",
"text": "Install Missing Assets",
"updated": 1624709536566
},
+ {
+ "style": "Note",
+ "text": "The Install Missing Assets feature is oriented to people maintaining Project Definition Hierarchies. You may safely skip this explanation if you are a regular user learning about governance.",
+ "updated": 1630434796338
+ },
{
"style": "Text",
- "text": "Both the Assets node and the Asset Class nodes support the Install Assets command available on the menu. Because Assets map digital files shipping with the system, the Install Assets feature is designed to map files on disk into a hierarchical structure of nodes below the node where the Install Assets command is run. In the resulting structure of nodes, Asset Class nodes represent folders, and Asset nodes represent files."
+ "text": "Both the Assets node and Asset Class nodes support the Install Missing Assets command available on the menu. Because Asset nodes map digital files shipping with the system, the Install Missing Assets feature is designed to map files on disk into a hierarchical structures of nodes below the node where the Install Missing Assets command is run. In the resulting structure of nodes, Asset Class nodes represent folders, and Asset nodes represent files."
},
{
"style": "Text",
@@ -47,7 +53,8 @@
},
{
"style": "Text",
- "text": "Using the above configuration, the Install Assets command creates a Superalgos Asset Class node (the root of the Superalgos folder), and the UI Asset Class node as an offspring node. Then, the contents of the UI folder are mapped as offspring of the UI Asset Class node."
+ "text": "Using the above configuration, the Install Missing Assets command creates a Superalgos Asset Class node (the root of the Superalgos folder), and the UI Asset Class node as an offspring node. Then, the contents of the UI folder are mapped as offspring of the UI Asset Class node.",
+ "updated": 1630434897746
},
{
"style": "Block",
diff --git a/Projects/Governance/Schemas/Docs-Nodes/C/Claim/Claim-Votes-Switch/claim-votes-switch.json b/Projects/Governance/Schemas/Docs-Nodes/C/Claim/Claim-Votes-Switch/claim-votes-switch.json
index 077fadc24..004e18f3a 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/C/Claim/Claim-Votes-Switch/claim-votes-switch.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/C/Claim/Claim-Votes-Switch/claim-votes-switch.json
@@ -1,8 +1,8 @@
{
"type": "Claim Votes Switch",
"definition": {
- "text": "This type of switch is used to spawn different types of claim vote nodes, and to reference “folder” type of nodes within the Claims Program section of the User Profile hierarchy.",
- "updated": 1624729577011
+ "text": "Use this switch to spawn different types of Claim Votes, and to reference Claims Folder types of nodes within the Claims Program section of the User Profile hierarchy to map large structures of claims.",
+ "updated": 1630349853006
},
"paragraphs": [
{
@@ -12,11 +12,42 @@
},
{
"style": "Text",
- "text": "When a Claim Votes Switch references any of the existing “folder” type of nodes (Position Contribution Claims Folder, Feature Contribution Claims Folder, or Asset Contribution Claims Folder), the Install Missing Votes option on the menu becomes usable."
+ "text": "You may use this switch for three different purposes:",
+ "updated": 1630345326820
+ },
+ {
+ "style": "List",
+ "text": "As an organizational device: You may create arbitrary arrangements of votes, spawning more switches and votes.",
+ "updated": 1630345425238
+ },
+ {
+ "style": "List",
+ "text": "As a switch: You may control the flow of Claim Support Power, pretty much like with the Token Power Switch, but within the Voting Program. If you need a reminder, read about how Token Power Flows.",
+ "updated": 1630355954531
+ },
+ {
+ "style": "List",
+ "text": "As a data-structure mapper: Use the node to reference Claims Folder types of nodes to map entire structures of claims on other User Profile hierarchies.",
+ "updated": 1630345729468
+ },
+ {
+ "style": "Text",
+ "text": "The first two use cases are self-explanatory. Let's explore the third one in more detail.",
+ "updated": 1630349876232
+ },
+ {
+ "style": "Callout",
+ "text": "Use a Claim Votes Switch node to establish a reference with a Claims Folder type of node — Position Claims Folder, Feature Claims Folder, or Asset Claims Folder — within the Claims Program section of your colleague's User Profile node. Then use the Install Missing Votes option on the menu of the Claim Votes Switch to map the entire Claims Folder! ",
+ "updated": 1630497475900
+ },
+ {
+ "style": "Note",
+ "text": "The process creates a Claim Votes Switch for each Claims Folder, and matching Claim Votes for each Asset Contribution Claim, Feature Contribution Claim, or Position Contribution Claim defined within each folder."
},
{
"style": "Success",
- "text": "Installing votes allows mapping entire sections of claim definitions so that you may vouch for multiple claims easily."
+ "text": "If something changes on the side of the definitions, you may always go back a run the Install Missing Votes process again. The process will remap the structure with the appropriate votes and switches.",
+ "updated": 1630348162382
},
{
"style": "Block",
diff --git a/Projects/Governance/Schemas/Docs-Nodes/C/Claims/Claims-Program/claims-program.json b/Projects/Governance/Schemas/Docs-Nodes/C/Claims/Claims-Program/claims-program.json
index c9ed88d9c..77c87e08d 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/C/Claims/Claims-Program/claims-program.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/C/Claims/Claims-Program/claims-program.json
@@ -1,13 +1,119 @@
{
"type": "Claims Program",
"definition": {
- "text": "This node helps define the section of the User Profile hierarchy used to define the claims users make for the contributions they have done. Other users may vote for this claims so that they are computed during the token distribution process.",
- "updated": 1630056746833
+ "text": "When you contribute to Superalgos, you must produce a claim for your contribution, and you must harness the support of people working close to you, who will vouch or vote for your claims.",
+ "updated": 1630256293740
},
"paragraphs": [
+ {
+ "style": "Block",
+ "text": "Content",
+ "updated": 1630256308831
+ },
+ {
+ "style": "Important",
+ "text": "Governance is decentralized. There is no central authority controlling who contributes what or what rewards contributors get. Instead, the project delegates in the Community the capacity to establish the value of contributions and to determine who contributed what.",
+ "updated": 1630256982050
+ },
{
"style": "Text",
- "text": "Right click and select the pencil button to enter edit mode."
+ "text": "As such, governance is a social system. When you get involved with Superalgos, you interact with the Community and find ways to contribute. While doing so, you relate to or associate with community members that have similar interests or are focused on the same areas of the project you may be working in. It is these people that will vouch for your claims!"
+ },
+ {
+ "style": "Text",
+ "text": "There are three different types of claims you may place: "
+ },
+ {
+ "style": "List",
+ "text": "Asset Contribution Claim"
+ },
+ {
+ "style": "List",
+ "text": "Feature Contribution Claim"
+ },
+ {
+ "style": "List",
+ "text": "Position Contribution Claim",
+ "updated": 1630256348337
+ },
+ {
+ "style": "Text",
+ "text": "There are also three different folder types of nodes that act as organizational devices from which you may spawn the above claim nodes:"
+ },
+ {
+ "style": "List",
+ "text": "Asset Claims Folder"
+ },
+ {
+ "style": "List",
+ "text": "Feature Claims Folder",
+ "updated": 1630256365206
+ },
+ {
+ "style": "List",
+ "text": "Position Claims Folder",
+ "updated": 1630256373604
+ },
+ {
+ "style": "Text",
+ "text": "These three types of claims match the three types of definition hierarchies used to describe the project:"
+ },
+ {
+ "style": "List",
+ "text": "Assets"
+ },
+ {
+ "style": "List",
+ "text": "Features"
+ },
+ {
+ "style": "List",
+ "text": "Positions"
+ },
+ {
+ "style": "Callout",
+ "text": "To place a claim, use the appropriate type of contribution claim node to reference the matching type of definition. For example, use an Asset Contribution Claim node to reference an Asset node within an Assets hierarchy. When you do that, you are effectively placing a claim on that asset.",
+ "updated": 1630323960334
+ },
+ {
+ "style": "Note",
+ "text": "This claim means that you declare that you have worked on that asset, either creating or improving it, and that you expect to be rewarded accordingly."
+ },
+ {
+ "style": "Text",
+ "text": "How a claim is resolved depends on three interelated concepts:",
+ "updated": 1630256564789
+ },
+ {
+ "style": "List",
+ "text": "The Claim Power you drive into the node that places the claim.",
+ "updated": 1630256658386
+ },
+ {
+ "style": "List",
+ "text": "The Claim Votes your claim gets from other users, and the Voting Power they drive into those votes."
+ },
+ {
+ "style": "List",
+ "text": "The Token Rewards available within the definition node you are claiming.",
+ "updated": 1630256728009
+ },
+ {
+ "style": "Success",
+ "text": "To learn all the details about claims resolution, read the How Claims are Resolved page in the Governance Flow topic of The Governance Project book.",
+ "updated": 1630257166423
+ },
+ {
+ "style": "Text",
+ "text": ""
+ },
+ {
+ "style": "Block",
+ "text": "Configuration"
+ },
+ {
+ "style": "Title",
+ "text": "Configuration"
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Nodes/C/Community/Community-Building-Programs/community-building-programs.json b/Projects/Governance/Schemas/Docs-Nodes/C/Community/Community-Building-Programs/community-building-programs.json
index ec260f509..88018a613 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/C/Community/Community-Building-Programs/community-building-programs.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/C/Community/Community-Building-Programs/community-building-programs.json
@@ -10,10 +10,14 @@
"text": "Content",
"updated": 1630165468473
},
+ {
+ "style": "Success",
+ "text": "Learn more about how Token Power Flows into these programs!",
+ "updated": 1630218909731
+ },
{
"style": "Text",
- "text": "Each of the Community Building Programs has an associated Rewards Pool and a Bonus Pool under the Governance Programs > Community Building Programs section of the Superalgos Pools hierarchy.",
- "updated": 1630168361008
+ "text": "Each of the Community Building Programs has an associated Rewards Pool and a Bonus Pool under the Governance Programs > Community Building Programs section of the Superalgos Pools hierarchy."
},
{
"style": "Note",
@@ -22,8 +26,8 @@
},
{
"style": "Text",
- "text": "Let's explore how Rewards Pools are distributed in the case of Community Building Programs. In general terms, the Referral Program, Support Program, and Mentorship Program all have the following common rules:",
- "updated": 1630168572231
+ "text": "Let's explore how each Rewards Pool is distributed in the case of Community Building Programs. In general terms, the Referral Program, Support Program, and Mentorship Program all have the following common rules:",
+ "updated": 1630399976367
},
{
"style": "List",
@@ -35,10 +39,20 @@
"text": "Your Incoming Power is added to your Own Power in the corresponding program, so that you may pass on more power to other User Profiles. Like in the reverse case, when you reference other User Profiles, you pass on 10% of the power that reaches the node establishing the reference.",
"updated": 1630166856996
},
+ {
+ "style": "Important",
+ "text": "This passing of 10% of the power from one user to the next has the effect of rewarding collaboration chains. ",
+ "updated": 1630683048349
+ },
{
"style": "Callout",
- "text": "This passing of 10% of the power from one user to the next has the effect of rewarding collaboration chains. For instance, Alice tells her friend Bob about Superalgos. When Bob eventually sets up his User Profile, he declares Alice as his referrer. This means that Alice gets 10% of the Referral Power that Bob drives to his User Referrer node. Then, Bob brings his friend Charly to Superalgos. Charly sets up his profile and declares Bob as his referrer. So now Bob gets 10% of the Referral Power that Charly drives to his User Referrer node. Can you see what happens with Alice's Incoming Referral Power? That's it! She gets 10% of Bob's power, which includes 10% of Charly's power!",
- "updated": 1630167091644
+ "text": "For instance, Alice tells her friend Bob about Superalgos. When Bob eventually sets up his User Profile, he declares Alice as his referrer. This means that Alice gets 10% of the Referral Power that Bob drives to his User Referrer node. Then, Bob brings his friend Charly to Superalgos. Charly sets up his profile and declares Bob as his referrer. So now Bob gets 10% of the Referral Power that Charly drives to his User Referrer node. ",
+ "updated": 1630683087674
+ },
+ {
+ "style": "Success",
+ "text": "Can you see what happens with Alice's Incoming Referral Power? That's it! She gets 10% of Bob's power, which includes 10% of Charly's power and son on!",
+ "updated": 1630683111245
},
{
"style": "Note",
@@ -46,13 +60,23 @@
},
{
"style": "Text",
- "text": "The Incoming Power you get from other users is in a Direct Proportion to the number of tokens you get from the corresponding program Rewards Pool. The calculation is based on a Rule of Three, and the result is displayed under the Tokens Bonus node of the corresponding program.",
- "updated": 1630170674503
+ "text": "The Incoming Power you get from other users is in a Direct Proportion to the number of tokens you get from the corresponding program Rewards Pool. The calculation is based on a Rule of Three, and the result is displayed under the Tokens Awarded node of the corresponding program.",
+ "updated": 1630682945130
},
{
"style": "Json",
- "text": "Total Incoming Power [*] -> 100% of the pool\n Your Incoming Power [**] -> X% of the pool -> Tokens Rewards\n\nTokens Rewards = Your Incoming Power * 100% / Total Incoming Power\n\n[*] The sum of all Incoming Power (in the given program) in all User Profiles combined.\n[**] Your Incoming Power (in the given program).",
- "updated": 1630170860166
+ "text": "Total Incoming Power [*] -> 100% of the pool\n Your Incoming Power [**] -> X% of the pool -> Tokens Awarded\n\nTokens Awarded = Your Incoming Power * 100% / Total Incoming Power\n\n[*] The sum of all Incoming Power (in the given program) in all User Profiles combined.\n[**] Your Incoming Power (in the given program).",
+ "updated": 1630683009510
+ },
+ {
+ "style": "Block",
+ "text": "Configuration",
+ "updated": 1630215228441
+ },
+ {
+ "style": "Title",
+ "text": "Configuration",
+ "updated": 1630215233190
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Nodes/C/Contribution/Contribution-Claims/contribution-claims.json b/Projects/Governance/Schemas/Docs-Nodes/C/Contribution/Contribution-Claims/contribution-claims.json
deleted file mode 100644
index 0f38bc9ea..000000000
--- a/Projects/Governance/Schemas/Docs-Nodes/C/Contribution/Contribution-Claims/contribution-claims.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "type": "Claims Program",
- "definition": {
- "text": "This node helps define the section of the User Profiel hierarchy that is going to be used to define the claims users make for the contributions they have done. These claims need later to be voted by other users in order to be considered during the token distribution process.",
- "updated": 1622989461838
- },
- "paragraphs": [
- {
- "style": "Text",
- "text": "Right click and select the pencil button to enter edit mode."
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Nodes/C/community-buidling-programs/community-buidling-programs/community-buidling-programs.json b/Projects/Governance/Schemas/Docs-Nodes/C/community-buidling-programs/community-buidling-programs/community-buidling-programs.json
new file mode 100644
index 000000000..62ccbfbd4
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Nodes/C/community-buidling-programs/community-buidling-programs/community-buidling-programs.json
@@ -0,0 +1,12 @@
+{
+ "type": "community-buidling-programs",
+ "definition": {
+ "text": "Write the definition for this Node."
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "Right click and select the pencil button to enter edit mode."
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Nodes/C/community-building-programs/community-building-programs/community-building-programs.json b/Projects/Governance/Schemas/Docs-Nodes/C/community-building-programs/community-building-programs/community-building-programs.json
new file mode 100644
index 000000000..ea610a1f1
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Nodes/C/community-building-programs/community-building-programs/community-building-programs.json
@@ -0,0 +1,12 @@
+{
+ "type": "community-building-programs",
+ "definition": {
+ "text": "Write the definition for this Node."
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "Right click and select the pencil button to enter edit mode."
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Nodes/D/Delegate/Delegate-Power-Switch/delegate-power-switch.json b/Projects/Governance/Schemas/Docs-Nodes/D/Delegate/Delegate-Power-Switch/delegate-power-switch.json
new file mode 100644
index 000000000..ff315c3a2
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Nodes/D/Delegate/Delegate-Power-Switch/delegate-power-switch.json
@@ -0,0 +1,34 @@
+{
+ "type": "Delegate Power Switch",
+ "definition": {
+ "text": "Use this switch as an organizational device, and spawn User Delegate nodes.",
+ "updated": 1630421941682
+ },
+ "paragraphs": [
+ {
+ "style": "Block",
+ "text": "Content",
+ "updated": 1630421951903
+ },
+ {
+ "style": "Text",
+ "text": "You may use this switch for two different purposes:"
+ },
+ {
+ "style": "List",
+ "text": "As an organizational device: You may create arbitrary arrangements, spawning more switches and User Delegate nodes."
+ },
+ {
+ "style": "List",
+ "text": "As a switch: You may control the flow of Delegate Power, pretty much like with a Token Power Switch, but within the Delegation Program. If you need a reminder, read about how Token Power Flows."
+ },
+ {
+ "style": "Block",
+ "text": "Configuration"
+ },
+ {
+ "style": "Title",
+ "text": "Configuration"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Nodes/D/Delegation/Delegation-Program/delegation-program.json b/Projects/Governance/Schemas/Docs-Nodes/D/Delegation/Delegation-Program/delegation-program.json
new file mode 100644
index 000000000..f3a18692a
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Nodes/D/Delegation/Delegation-Program/delegation-program.json
@@ -0,0 +1,35 @@
+{
+ "type": "Delegation Program",
+ "definition": {
+ "text": "The Delegation Program allows you to delegate Token Power to empower other members of the Community, giving them a louder voice in governance. The Token Power you delegate may be used by the recipient in any Governance Program, with no restrictions.",
+ "updated": 1630408676672
+ },
+ "paragraphs": [
+ {
+ "style": "Block",
+ "text": "Content",
+ "updated": 1630408752467
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Featuring Tokens Bonus"
+ },
+ {
+ "style": "Text",
+ "text": "When you delegate Voting Power through the Voting Program, the recipient may only use the delegated power within the Voting Program. Instead, the Delegation Program allows you to delegate Token Power, which may be used by the recipient in any program.",
+ "updated": 1630408794134
+ },
+ {
+ "style": "Warning",
+ "text": "Only 10% of the Token Power you drive into a User Delegate node reaches the recipient User Profile. This is to disincentivize fraudulent behaviors that may arise involving circular declarations, fake profiles, or trading of votes."
+ },
+ {
+ "style": "Block",
+ "text": "Configuration"
+ },
+ {
+ "style": "Title",
+ "text": "Configuration"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Nodes/F/Feature/Feature-Claim-Vote/feature-claim-vote.json b/Projects/Governance/Schemas/Docs-Nodes/F/Feature/Feature-Claim-Vote/feature-claim-vote.json
index 4594b9d84..2c44ad3d1 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/F/Feature/Feature-Claim-Vote/feature-claim-vote.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/F/Feature/Feature-Claim-Vote/feature-claim-vote.json
@@ -1,13 +1,46 @@
{
"type": "Feature Claim Vote",
"definition": {
- "text": "This node is used to pass votes, via a reference, to a Feature Contribution Claim made by a user, in order to support that claim and allow the user making the claim to receive tokens for contributing either with the creation of that an feature or it's mantainance.",
- "updated": 1622988841078
+ "text": "Use this node to establish a reference with a Feature Contribution Claim placed by your colleague in the Claims Program section of their User Profile. This vote means that you support your colleague's claim with the Claim Support Power you drive into the Claim Votes node!",
+ "updated": 1630356075429
},
"paragraphs": [
+ {
+ "style": "Block",
+ "text": "Content",
+ "updated": 1630351115901
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Claim Votes Content"
+ },
+ {
+ "style": "Subtitle",
+ "text": "Working on Multiple Workspaces"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Deep in Governance"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Computational Limitations 2"
+ },
+ {
+ "style": "Subtitle",
+ "text": ""
+ },
{
"style": "Text",
- "text": "Right click and select the pencil button to enter edit mode."
+ "text": ""
+ },
+ {
+ "style": "Block",
+ "text": "Configuration"
+ },
+ {
+ "style": "Title",
+ "text": "Configuration"
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Nodes/F/Feature/Feature-Claims-Folder/feature-claims-folder.json b/Projects/Governance/Schemas/Docs-Nodes/F/Feature/Feature-Claims-Folder/feature-claims-folder.json
index e239901ef..1ae6122be 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/F/Feature/Feature-Claims-Folder/feature-claims-folder.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/F/Feature/Feature-Claims-Folder/feature-claims-folder.json
@@ -1,18 +1,14 @@
{
"type": "Feature Claims Folder",
"definition": {
- "text": "The Feature Contribution Claims Folder node is an organizational device used to arrange Feature Contribution Claim nodes in suitable hierarchical structures.",
- "updated": 1624728474759
+ "text": "Use this node as an organizational device, to spawn Feature Contribution Claim nodes, and to map entire structures in a Features hierarchy to place multiple Contribution Claims at once.",
+ "updated": 1630352152356
},
"paragraphs": [
{
- "style": "Block",
- "text": "Content",
- "updated": 1624728497197
- },
- {
- "style": "Text",
- "text": "You may use this node to reference a Feature Class node in the Features hierarchy. Once the reference is established, you may use the Install Missing Claims option on the menu to map the data structure of the referenced node with claims for each Feature."
+ "style": "Include",
+ "text": "Governance->Concept->Claims Folder->Content",
+ "updated": 1630260159250
},
{
"style": "Block",
diff --git a/Projects/Governance/Schemas/Docs-Nodes/F/Feature/Feature-Contribution-Claim/feature-contribution-claim.json b/Projects/Governance/Schemas/Docs-Nodes/F/Feature/Feature-Contribution-Claim/feature-contribution-claim.json
index be3d18245..b478c323c 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/F/Feature/Feature-Contribution-Claim/feature-contribution-claim.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/F/Feature/Feature-Contribution-Claim/feature-contribution-claim.json
@@ -1,8 +1,8 @@
{
"type": "Feature Contribution Claim",
"definition": {
- "text": "Use this node to reference a Feature node in the Features hierarchy to establish a Feature Contribution Claim.",
- "updated": 1624728695500
+ "text": "Use this node to reference a Feature node in one of the Features hierarchy to establish a Feature Contribution Claim. This claim means that you declare that you have worked on that Feature, either creating or improving it, and that you expect to be rewarded accordingly!",
+ "updated": 1630349366359
},
"paragraphs": [
{
@@ -11,8 +11,9 @@
"updated": 1624728714757
},
{
- "style": "Text",
- "text": "Remember to ask the people who know about your work to vouch for your claim with their Claim Votes. This is how your contribution gets validated so that you may get the associated rewards."
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Claims Content",
+ "updated": 1630325534128
},
{
"style": "Block",
diff --git a/Projects/Governance/Schemas/Docs-Nodes/F/Feature/Feature-Weight-Vote/feature-weight-vote.json b/Projects/Governance/Schemas/Docs-Nodes/F/Feature/Feature-Weight-Vote/feature-weight-vote.json
index 717c0aa04..89c0efb22 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/F/Feature/Feature-Weight-Vote/feature-weight-vote.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/F/Feature/Feature-Weight-Vote/feature-weight-vote.json
@@ -1,13 +1,38 @@
{
"type": "Feature Weight Vote",
"definition": {
- "text": "A Weight Vote that may reference a Feature node in the Features hierarchy.",
- "updated": 1624729893680
+ "text": "Use this node to establish a reference with a Feature node in a Features hierarchy. With this vote, you are passing on Weight Power to the referenced node. That way, the node gets more of the Token Rewards available in the hierarchy. This is how you influence how different areas of the project are incentivized.",
+ "updated": 1630356636079
},
"paragraphs": [
{
- "style": "Text",
- "text": "Right click and select the pencil button to enter edit mode."
+ "style": "Block",
+ "text": "Content",
+ "updated": 1630356880239
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Weight Votes->Content"
+ },
+ {
+ "style": "Subtitle",
+ "text": "Working on Multiple Workspaces"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Deep in Governance"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Computational Limitations 2"
+ },
+ {
+ "style": "Block",
+ "text": "Configuration"
+ },
+ {
+ "style": "Title",
+ "text": "Configuration"
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Nodes/F/Feature/Feature/feature.json b/Projects/Governance/Schemas/Docs-Nodes/F/Feature/Feature/feature.json
index d3ab4f7a0..2345439ec 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/F/Feature/Feature/feature.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/F/Feature/Feature/feature.json
@@ -15,9 +15,9 @@
"text": "You may cast Weight Votes on individual Feature nodes to incentivize the improvement, development, and maintenance of the said feature."
},
{
- "style": "Text",
- "text": "If you are involved in the development or maintenance of the said feature, you may place a Feature Contribution Claim and rally the Community to support your claim so that you may be compensated for your work.",
- "updated": 1624708816194
+ "style": "Callout",
+ "text": "If you are involved in the development or maintenance of a feature, you may place a Feature Contribution Claim and rally the Community to support your claim with Feature Claim Vote nodes so that you may be rewarded for your work.",
+ "updated": 1630428072285
},
{
"style": "Block",
diff --git a/Projects/Governance/Schemas/Docs-Nodes/F/Features/Features/features.json b/Projects/Governance/Schemas/Docs-Nodes/F/Features/Features/features.json
index 1dab93b90..95b3c1192 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/F/Features/Features/features.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/F/Features/Features/features.json
@@ -1,8 +1,8 @@
{
"type": "Features",
"definition": {
- "text": "The Features hierarchy defines existing software features, or features in the wish list, yet to be developed. When Weight Votes are directed at existing features, the tokens allocated to the said features are distributed among Contributors maintaining the code. When Weight Votes are directed at features that don’t yet exist, then the tokens incentivize the creation and contribution of the said features.",
- "updated": 1624708469928
+ "text": "The Features hierarchy defines existing software features, or features in the wish list, yet to be developed. The definition of existing features exist to reward Contributors maintaining the code. Definitions of features that don’t yet exist are intended to incentivize the creation and contribution of the said features.",
+ "updated": 1630427874621
},
"paragraphs": [
{
diff --git a/Projects/Governance/Schemas/Docs-Nodes/F/Financial/Financial-Programs/financial-programs.json b/Projects/Governance/Schemas/Docs-Nodes/F/Financial/Financial-Programs/financial-programs.json
index 92a267988..2dfb660a5 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/F/Financial/Financial-Programs/financial-programs.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/F/Financial/Financial-Programs/financial-programs.json
@@ -6,8 +6,21 @@
},
"paragraphs": [
{
- "style": "Text",
- "text": "Right click and select the pencil button to enter edit mode."
+ "style": "Block",
+ "text": "Content",
+ "updated": 1630397902177
+ },
+ {
+ "style": "Success",
+ "text": "Learn more about how Token Power Flows into these programs!"
+ },
+ {
+ "style": "Block",
+ "text": "Configuration"
+ },
+ {
+ "style": "Title",
+ "text": "Configuration"
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Nodes/G/Github/Github-Program/github-program.json b/Projects/Governance/Schemas/Docs-Nodes/G/Github/Github-Program/github-program.json
new file mode 100644
index 000000000..f2c89f130
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Nodes/G/Github/Github-Program/github-program.json
@@ -0,0 +1,44 @@
+{
+ "type": "Github Program",
+ "definition": {
+ "text": "This program incentivizes users to fork the Superalgos repository, a necessary step to contribute. It also incentivizes users to give a star and watch the repository, which helps developers find the project when searching on Github.com.",
+ "updated": 1630221291041
+ },
+ "paragraphs": [
+ {
+ "style": "Block",
+ "text": "Content",
+ "updated": 1630221318391
+ },
+ {
+ "style": "Text",
+ "text": "The Github Program distributes the Rewards Pool defined under the Governance Programs > Onboarding Programs section of the Superalgos Pools hierarchy.",
+ "updated": 1630221340561
+ },
+ {
+ "style": "Callout",
+ "text": "Spawning the Github Program and submitting your User Profile is all you need to do to participate in the program. To maximize your Tokens Awarded, make sure you have a fork, a star, and are watching the repository! The system does automatic checks on Github.com and verifies their existence in real-time."
+ },
+ {
+ "style": "Text",
+ "text": "There is a cap of SA 1,000 for each of these incentives. This means that you may get up to SA 3,000 in Tokens Awarded if you maximize your participation. ",
+ "updated": 1630228105213
+ },
+ {
+ "style": "Text",
+ "text": "In case there aren't enough tokens in the Rewards Pool to cover each incentive up to the defined cap for all User Profiles, then each profile gets an equal proportion for each of the applicable incentives."
+ },
+ {
+ "style": "Text",
+ "text": ""
+ },
+ {
+ "style": "Block",
+ "text": "Configuration"
+ },
+ {
+ "style": "Title",
+ "text": "Configuration"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Nodes/M/Mentorship/Mentorship-Program/mentorship-program.json b/Projects/Governance/Schemas/Docs-Nodes/M/Mentorship/Mentorship-Program/mentorship-program.json
index 1b017d2d0..4889ea903 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/M/Mentorship/Mentorship-Program/mentorship-program.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/M/Mentorship/Mentorship-Program/mentorship-program.json
@@ -1,8 +1,8 @@
{
"type": "Mentorship Program",
"definition": {
- "text": "The mentorship program is designed to incentivize deep collaboration and the recruitment of Contributors. You may earn tokens for each user you mentor, but also for each user they mentor as well, and the chain goes on infinitely!",
- "updated": 1624727325986
+ "text": "Becoming proficient enough with Superalgos to the point in which you may produce valuable contributions may be a lengthy process. The mentorship program incentivizes deep collaboration, apprenticeship, and the formation of Contributors.",
+ "updated": 1630232204309
},
"paragraphs": [
{
@@ -10,17 +10,31 @@
"text": "Content",
"updated": 1624727362222
},
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Featuring Tokens Bonus",
+ "updated": 1630232231414
+ },
{
"style": "Text",
- "text": "The principles governing this program are very similar to the Referral Program:"
+ "text": "With this program, you may earn Superalgos SA Tokens for every user you mentor, and also for the users they mentor!"
},
{
- "style": "List",
- "text": "By default, Mentorship Power flows in equal proportions to the existing User Mentor nodes, but you may use the configuration to alter the default behavior."
+ "style": "Callout",
+ "text": "To participate, you must spawn the Mentorship Program and declare your mentors. To do that, add a User Mentor node and use it to establish a reference to the User Profile of the person that mentored you. If you have more than one mentor, add more User Mentor nodes!",
+ "updated": 1630232305651
},
{
- "style": "List",
- "text": "Mentees confer their mentors 10% of the Mentorship Power allocated to the User Mentor node."
+ "style": "Text",
+ "text": "Superalgos is meant to grow into a massive global collaboration. To do that, the project needs an ever-growing group of Contributors!"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Community Building Programs"
+ },
+ {
+ "style": "Text",
+ "text": ""
},
{
"style": "Block",
diff --git a/Projects/Governance/Schemas/Docs-Nodes/O/Onboarding/Onboarding-Programs/onboarding-programs.json b/Projects/Governance/Schemas/Docs-Nodes/O/Onboarding/Onboarding-Programs/onboarding-programs.json
index f03ee4b59..e1b3a9d30 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/O/Onboarding/Onboarding-Programs/onboarding-programs.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/O/Onboarding/Onboarding-Programs/onboarding-programs.json
@@ -1,13 +1,36 @@
{
"type": "Onboarding Programs",
"definition": {
- "text": "These programs incentivize Superalgos users to take the first couple of steps to participate in governance and start giving back to the project. They make earning the first few tokens a breeze and allow every user to become invested!",
- "updated": 1630056526452
+ "text": "These programs incentivize Superalgos users to take the first couple of steps to participate in governance and start giving back to the project. They make earning the first few tokens a breeze and allow everyone to become invested in the Superalgos SA Token! We are talking about the Airdrop Program and the Github Program.",
+ "updated": 1630216446725
},
"paragraphs": [
+ {
+ "style": "Block",
+ "text": "Content",
+ "updated": 1630216357301
+ },
+ {
+ "style": "Success",
+ "text": "Learn more about how Token Power Flows into these programs!",
+ "updated": 1630228322651
+ },
{
"style": "Text",
- "text": "Right click and select the pencil button to enter edit mode."
+ "text": "What these two programs have in common is that they don't require Token Power to function. That is, even if you have zero Superalgos SA Tokens and zero Delegated Power, you may still participate to earn your first few tokens!"
+ },
+ {
+ "style": "Callout",
+ "text": "All you need to do to participate is spawn each of the program nodes and submit your User Profile!",
+ "updated": 1630228214813
+ },
+ {
+ "style": "Block",
+ "text": "Configuration"
+ },
+ {
+ "style": "Title",
+ "text": "Configuration"
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Nodes/P/Pool/Pool-Class/pool-class.json b/Projects/Governance/Schemas/Docs-Nodes/P/Pool/Pool-Class/pool-class.json
index 72c854743..544044983 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/P/Pool/Pool-Class/pool-class.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/P/Pool/Pool-Class/pool-class.json
@@ -1,8 +1,8 @@
{
"type": "Pool Class",
"definition": {
- "text": "The Pool Class node is an organizational device used to arrange Pool nodes in suitable hierarchical structures.",
- "updated": 1624707077159
+ "text": "The Pool Class node is an organizational device used to arrange Pool nodes in suitable hierarchical structures. Use this node to spawn other Pool Class nodes and Pool nodes.",
+ "updated": 1630427259648
},
"paragraphs": [
{
@@ -11,8 +11,9 @@
"updated": 1624707110607
},
{
- "style": "Text",
- "text": "Their main purpose is to help organize Pool nodes in the most appropriate manner."
+ "style": "Note",
+ "text": "The main purpose of this node is to help organize Pool nodes in the most appropriate manner.",
+ "updated": 1630426852609
},
{
"style": "Block",
diff --git a/Projects/Governance/Schemas/Docs-Nodes/P/Pool/Pool-Weight-Vote/pool-weight-vote.json b/Projects/Governance/Schemas/Docs-Nodes/P/Pool/Pool-Weight-Vote/pool-weight-vote.json
index b393bedc5..7807a1a84 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/P/Pool/Pool-Weight-Vote/pool-weight-vote.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/P/Pool/Pool-Weight-Vote/pool-weight-vote.json
@@ -1,13 +1,27 @@
{
"type": "Pool Weight Vote",
"definition": {
- "text": "A Weight Vote that may reference a Pool node in the Pools hierarchy.",
- "updated": 1624729823524
+ "text": "Use this node to establish a reference with a Pool node in a Pools hierarchy. With this vote, you are passing on Weight Power to the referenced node. That way, the node gets more of the Token Rewards available in the hierarchy. This is how you influence how different areas of the project are incentivized.",
+ "updated": 1630356667487
},
"paragraphs": [
{
- "style": "Text",
- "text": "Right click and select the pencil button to enter edit mode."
+ "style": "Block",
+ "text": "Content",
+ "updated": 1630356719004
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Weight Votes->Content",
+ "updated": 1630356837090
+ },
+ {
+ "style": "Block",
+ "text": "Configuration"
+ },
+ {
+ "style": "Title",
+ "text": "Configuration"
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Nodes/P/Pool/Pool/pool.json b/Projects/Governance/Schemas/Docs-Nodes/P/Pool/Pool/pool.json
index 953fd60ac..e5ab32aa9 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/P/Pool/Pool/pool.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/P/Pool/Pool/pool.json
@@ -1,8 +1,8 @@
{
"type": "Pool",
"definition": {
- "text": "A Pool represents a high-level container of Token Rewards. The node is used to receive Weight Votes and to route tokens to other hierarchies via references. Contributors may direct Weight Votes to Pool nodes to affect how many tokens will be routed to and distributed at the referenced hierarchy.",
- "updated": 1624707171824
+ "text": "A Pool represents a high-level container of Token Rewards. The node may receive Weight Votes and route Token Rewards to other hierarchies via references. Contributors may direct Weight Votes to Pool nodes to affect how many tokens will be routed to and distributed at the referenced hierarchy.",
+ "updated": 1630426946700
},
"paragraphs": [
{
@@ -35,11 +35,12 @@
"text": "Weight: The total weight of the Pool is expressed as a percentage of the total Weight Votes directed at the whole hierarchy."
},
{
- "style": "Callout",
- "text": "Notice that Pool nodes participate in the pool of tokens assigned to the Pools hierarchy it belongs to. The aforementioned Weight value is in relation to the said hierarchy, and not necessarily to the top-level Superalgos Pools hierarchy."
+ "style": "Note",
+ "text": "Notice that a Pool node gets Token Rewards allocated to the hierarchy it belongs to. The aforementioned Weight value is in relation to the said hierarchy, and not necessarily to the top-level Superalgos Pools hierarchy.",
+ "updated": 1630427153739
},
{
- "style": "Text",
+ "style": "Callout",
"text": "We mentioned that Pool nodes may pass on Token Rewards to other hierarchies which, in turn, further break up the definitions of where tokens go to. We’ll explore those hierarchies in the next few pages."
},
{
diff --git a/Projects/Governance/Schemas/Docs-Nodes/P/Pools/Pools/pools.json b/Projects/Governance/Schemas/Docs-Nodes/P/Pools/Pools/pools.json
index fface73a7..f89fd7364 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/P/Pools/Pools/pools.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/P/Pools/Pools/pools.json
@@ -1,8 +1,8 @@
{
"type": "Pools",
"definition": {
- "text": "This hierarchy breaks up the definition of a Project in specific areas. Each area is a Pool that may be incentivized by the Community. Users collectively decide how many tokens will be allocated to each Pool using Weight Votes. The sum of Weight Votes in each Pool determines the proportion of tokens each pool gets from the total of tokens allocated to the release.",
- "updated": 1624706823509
+ "text": "The Superalgos Pools is the top-level hierarchy kickstarting the definition of the whole Superalgos Project. It features the definition of several Pool nodes describing the main areas of project development that the Community wishes to incentivize.",
+ "updated": 1630426598623
},
"paragraphs": [
{
@@ -28,12 +28,14 @@
"text": "On the other hand, each Pool may accept Weight Votes from User Profiles. This is how the Community determines how many tokens will go to each distribution pool."
},
{
- "style": "Callout",
- "text": "At the same time, a Pool may reference other types of hierarchies, namely Positions, Assets, and Features. These hierarchies take the granularity of the definition to a whole new level! But we’ll go into those later on!"
+ "style": "Text",
+ "text": "In addition, there is a third resource characteristic to the Pool Hierarchy. Each Pool may reference a separate Pools hierarchy so that the definitions may continue on a separate hierarchy, which may be included as a plugin in the same or in separate Governance Workspaces.",
+ "updated": 1630426515819
},
{
- "style": "Text",
- "text": "In addition, there is a third resource characteristic to the Pool Hierarchy. Each Pool may reference a separate Pools hierarchy so that the definitions may continue on a separate hierarchy, which may be included as a plugin in the same or in a separate Plugin Workspace."
+ "style": "Callout",
+ "text": "A Pool may also reference other types of hierarchies, namely Positions, Assets, and Features. These hierarchies take the granularity of the definition to a whole new level! But we’ll go into those later on!",
+ "updated": 1630426529656
},
{
"style": "Text",
diff --git a/Projects/Governance/Schemas/Docs-Nodes/P/Position/Position-Claim-Vote/position-claim-vote.json b/Projects/Governance/Schemas/Docs-Nodes/P/Position/Position-Claim-Vote/position-claim-vote.json
index d1be265d8..398ea6f86 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/P/Position/Position-Claim-Vote/position-claim-vote.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/P/Position/Position-Claim-Vote/position-claim-vote.json
@@ -1,13 +1,39 @@
{
"type": "Position Claim Vote",
"definition": {
- "text": "This node is used to pass votes, via a reference, to a Position Claim made by a user, in order to support that claim and allow the user making the claim to receive tokens for playing a role at the said position.",
- "updated": 1622988653975
+ "text": "Use this node to establish a reference with a Position Contribution Claim placed by your colleague in the Claims Program section of their User Profile. This vote means that you support your colleague's claim with the Claim Support Power you drive into the Claim Votes node!",
+ "updated": 1630356265895
},
"paragraphs": [
{
- "style": "Text",
- "text": "Right click and select the pencil button to enter edit mode."
+ "style": "Block",
+ "text": "Content",
+ "updated": 1630350078214
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Claim Votes Content",
+ "updated": 1630350813522
+ },
+ {
+ "style": "Subtitle",
+ "text": "Working on Multiple Workspaces"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Deep in Governance"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Computational Limitations 2"
+ },
+ {
+ "style": "Block",
+ "text": "Configuration"
+ },
+ {
+ "style": "Title",
+ "text": "Configuration"
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Nodes/P/Position/Position-Claims-Folder/position-claims-folder.json b/Projects/Governance/Schemas/Docs-Nodes/P/Position/Position-Claims-Folder/position-claims-folder.json
index 68fa0e59b..758d45eba 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/P/Position/Position-Claims-Folder/position-claims-folder.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/P/Position/Position-Claims-Folder/position-claims-folder.json
@@ -1,18 +1,14 @@
{
"type": "Position Claims Folder",
"definition": {
- "text": "The Position Contribution Claims Folder node is an organizational device used to arrange Position Contribution Claim nodes in suitable hierarchical structures.",
- "updated": 1624728437926
+ "text": "Use this node as an organizational device, to spawn Position Contribution Claim nodes, and to map entire structures in a Positions hierarchy to place multiple Contribution Claims at once.",
+ "updated": 1630352182572
},
"paragraphs": [
{
- "style": "Block",
- "text": "Content",
- "updated": 1624728455607
- },
- {
- "style": "Text",
- "text": "You may use this node to reference a Position Class node in the Positions hierarchy. Once the reference is established, you may use the Install Missing Claims option on the menu to map the data structure of the referenced node with claims for each Position."
+ "style": "Include",
+ "text": "Governance->Concept->Claims Folder->Content",
+ "updated": 1630260202600
},
{
"style": "Block",
diff --git a/Projects/Governance/Schemas/Docs-Nodes/P/Position/Position-Class/position-class.json b/Projects/Governance/Schemas/Docs-Nodes/P/Position/Position-Class/position-class.json
index a70056805..345d06fb9 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/P/Position/Position-Class/position-class.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/P/Position/Position-Class/position-class.json
@@ -1,8 +1,8 @@
{
"type": "Position Class",
"definition": {
- "text": "The Position Class node is an organizational device used to group positions in arbitrary arrangements. The node may receive Weight Votes. When it does, votes are evenly distributed among offspring nodes.",
- "updated": 1624707573898
+ "text": "A Position Class node is an organizational device used to group positions in arbitrary arrangements. The node may receive Weight Votes. When it does, votes are evenly distributed among offspring nodes.",
+ "updated": 1630427487603
},
"paragraphs": [
{
diff --git a/Projects/Governance/Schemas/Docs-Nodes/P/Position/Position-Contribution-Claim/position-contribution-claim.json b/Projects/Governance/Schemas/Docs-Nodes/P/Position/Position-Contribution-Claim/position-contribution-claim.json
index ace83fe08..d9f754495 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/P/Position/Position-Contribution-Claim/position-contribution-claim.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/P/Position/Position-Contribution-Claim/position-contribution-claim.json
@@ -1,8 +1,8 @@
{
"type": "Position Contribution Claim",
"definition": {
- "text": "Use this node to reference a Position node in the Positions hierarchy to establish a Position Contribution Claim.",
- "updated": 1624728585219
+ "text": "Use this node to reference a Position node in one of the Positions hierarchy to establish a Position Contribution Claim. This claim means that you declare that you have worked on that Position, and that you expect to be rewarded accordingly!",
+ "updated": 1630349455755
},
"paragraphs": [
{
@@ -11,8 +11,9 @@
"updated": 1624728656474
},
{
- "style": "Text",
- "text": "Remember to ask the people who know about your work to vouch for your claim with their Claim Votes. This is how your contribution gets validated so that you may get the associated rewards."
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Claims Content",
+ "updated": 1630325507398
},
{
"style": "Block",
diff --git a/Projects/Governance/Schemas/Docs-Nodes/P/Position/Position-Weight-Vote/position-weight-vote.json b/Projects/Governance/Schemas/Docs-Nodes/P/Position/Position-Weight-Vote/position-weight-vote.json
index 14ad9dcaa..0dd985ede 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/P/Position/Position-Weight-Vote/position-weight-vote.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/P/Position/Position-Weight-Vote/position-weight-vote.json
@@ -1,13 +1,38 @@
{
"type": "Position Weight Vote",
"definition": {
- "text": "A Weight Vote that may reference a Position node in the Positions hierarchy.",
- "updated": 1624729877473
+ "text": "Use this node to establish a reference with a Position node in a Positions hierarchy. With this vote, you are passing on Weight Power to the referenced node. That way, the node gets more of the Token Rewards available in the hierarchy. This is how you influence how different areas of the project are incentivized.",
+ "updated": 1630356651483
},
"paragraphs": [
{
- "style": "Text",
- "text": "Right click and select the pencil button to enter edit mode."
+ "style": "Block",
+ "text": "Content",
+ "updated": 1630356906843
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Weight Votes->Content"
+ },
+ {
+ "style": "Subtitle",
+ "text": "Working on Multiple Workspaces"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Deep in Governance"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Computational Limitations 2"
+ },
+ {
+ "style": "Block",
+ "text": "Configuration"
+ },
+ {
+ "style": "Title",
+ "text": "Configuration"
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Nodes/P/Position/Position/position.json b/Projects/Governance/Schemas/Docs-Nodes/P/Position/Position/position.json
index a4e9226f8..9ed324a78 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/P/Position/Position/position.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/P/Position/Position/position.json
@@ -1,8 +1,8 @@
{
"type": "Position",
"definition": {
- "text": "A Position node represents a role within the project’s organization. However, unlike traditional organizations, positions within Superalgos are open, in the sense that any Contributor may assume any position at any point. If you spend time working in a position, you may produce a Position Claim and rally the Community to support your claim so that you may earn tokens allocated to the said position.",
- "updated": 1624707652230
+ "text": "A Position node represents a role within the project’s organization. However, unlike traditional organizations, positions within Superalgos are open, in the sense that any Contributor may assume any position at any point. If you spend time working in a position, you may produce a Position Contribution Claim and rally the Community to support your claim so that you may earn Token Rewards allocated to the said position.",
+ "updated": 1630427602367
},
"paragraphs": [
{
@@ -12,7 +12,8 @@
},
{
"style": "Text",
- "text": "You may direct Weight Votes to a Position node to support the particular position."
+ "text": "You may direct Weight Votes to a Position node to incetivize the particular position.",
+ "updated": 1630427617707
},
{
"style": "Block",
diff --git a/Projects/Governance/Schemas/Docs-Nodes/P/Positions/Positions/positions.json b/Projects/Governance/Schemas/Docs-Nodes/P/Positions/Positions/positions.json
index 30b8d6683..f5734a593 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/P/Positions/Positions/positions.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/P/Positions/Positions/positions.json
@@ -16,7 +16,8 @@
},
{
"style": "Text",
- "text": "Any Position and Position Class node within the hierarchy may receive Weight Votes to determine how the Token Rewards in the hierarchy is distributed. How many tokens each Position is awarded depends on the relative weight of the position determined by the number of Weight Votes each position receives from Contributors."
+ "text": "Any Position and Position Class node within the hierarchy may receive Weight Votes to determine how the Token Rewards in the hierarchy is distributed. How many tokens each Position is awarded depends on the relative weight of the position determined by the number of Weight Votes each position receives from users.",
+ "updated": 1630427395380
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Nodes/R/Referral/Referral-Program/referral-program.json b/Projects/Governance/Schemas/Docs-Nodes/R/Referral/Referral-Program/referral-program.json
index a751f165e..a8af0e6ff 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/R/Referral/Referral-Program/referral-program.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/R/Referral/Referral-Program/referral-program.json
@@ -1,8 +1,8 @@
{
"type": "Referral Program",
"definition": {
- "text": "The referral program is designed to incentivize both word-of-mouth and influencer referrals. You may earn tokens for each user you refer, but also for each user they refer as well, and the chain goes on infinitely!",
- "updated": 1624726453093
+ "text": "The referral program incentivizes the promotion of the project, either by word-of-mouth or “en masse” through articles, social media posts, videos, and other forms of influencer marketing.",
+ "updated": 1630227795694
},
"paragraphs": [
{
@@ -11,24 +11,30 @@
"updated": 1624726477501
},
{
- "style": "Text",
- "text": "When you declare one or more referrers, you confer them 10% of your Referral Power, but without losing any of your power! That is, you are not giving your power away… you’re empowering someone else through your power!"
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Featuring Tokens Bonus",
+ "updated": 1630230465415
},
{
"style": "Text",
- "text": "The power you confer to your referrer is added to his or her own power. Now, guess what happens when your referrer declares his or her referrer? That's right! 10% of the total Referral Power is conferred to his or her referrer too! And the chain continues on and on."
+ "text": "With this program, you may earn Superalgos SA Tokens for every user you refer to the project, and also for the users they refer!"
},
{
"style": "Callout",
- "text": "Now, let’s look at this the other way round. The people you refer confer 10% of their Referral Power to you. When they get to refer people, they get 10% of their Referral Power. This means that you get 10% of the Referral Power from the first generation of people you refer, but you also get 1% of the power of the second generation, and 0.1% of the third generation, and so on!"
+ "text": "To participate, you must spawn the Referral Program and declare your referrer. To do that, add a User Referrer node and use it to establish a reference to the User Profile of the person that referred you to Superalgos. If you have more than one referrer, simply add more User Referrer nodes."
},
{
"style": "Text",
- "text": "At the time of each Distribution Event, your total Referral Power determines the Direct Proportion of tokens you get from the Referral Reward Pool."
+ "text": "Maybe you learned about Superalgos from an article, a video, a comment on Reddit, a tweet, the official website, or someone who told you about us!"
},
{
- "style": "Success",
- "text": "As you can see, there is a very good incentive for spreading the word about Superalgos. It’s good for you, for your friends, for their friends, and for the project!"
+ "style": "Text",
+ "text": "Declaring your referrers is the best way to thank the people that may have written that article or tweet, produced that video, maintained the website, or told you about Superalgos! Without them, you probably wouldn’t be here yet!"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Community Building Programs",
+ "updated": 1630230671246
},
{
"style": "Block",
diff --git a/Projects/Governance/Schemas/Docs-Nodes/S/Staking/Staking-Program/staking-program.json b/Projects/Governance/Schemas/Docs-Nodes/S/Staking/Staking-Program/staking-program.json
new file mode 100644
index 000000000..69a97a6c2
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Nodes/S/Staking/Staking-Program/staking-program.json
@@ -0,0 +1,50 @@
+{
+ "type": "Staking Program",
+ "definition": {
+ "text": "The staking program allows the Superalgos Community to compensate token holders for the sake of holding tokens. Holding tokens may be a valuable contribution that the Community may decide to incentivize at any point.",
+ "updated": 1630399040101
+ },
+ "paragraphs": [
+ {
+ "style": "Block",
+ "text": "Content",
+ "updated": 1630399087739
+ },
+ {
+ "style": "Text",
+ "text": "This is a very simple program, as it doesn't involve smart contracts or transferring funds out of your Governance Address."
+ },
+ {
+ "style": "Callout",
+ "text": "You may participate in the Staking Program with the Token Power that you haven’t used for other purposes. All you need to do is spawn the program from within the Financial Programs node and let some Token Power flow into it.",
+ "updated": 1630399445299
+ },
+ {
+ "style": "Text",
+ "text": "You will get tokens from the Staking Rewards Pool defined in the Superalgos Pools hierarchy under the Governance Programs node, proportional to the Staking Power you direct to the program."
+ },
+ {
+ "style": "Text",
+ "text": "The calculation of the Tokens Awarded for this program is similar to how Tokens Bonus is calculated on other programs: as a direct Rule of Three.",
+ "updated": 1630409043816
+ },
+ {
+ "style": "Json",
+ "text": "Total Staking Power [*] -> 100% of the pool\n Your Staking Power [**] -> X% of the pool -> Tokens Awarded\n\nTokens Awarded = Your Staking Power * 100% / Total Staking Power\n\n[*] The power driven to the Staking Program by all User Profiles combined.\n[**] The power you drive to the Staking Program.",
+ "updated": 1630399128595
+ },
+ {
+ "style": "Note",
+ "text": "Notice that staking may not be the best way to accumulate more tokens. Some other programs, like the Community Building Programs, may offer a better financial opportunity through their Tokens Bonus! You may want to check how big are the Bonus Pool incentives in other programs and compare those with the Staking Rewards Pool!",
+ "updated": 1630399853495
+ },
+ {
+ "style": "Block",
+ "text": "Configuration"
+ },
+ {
+ "style": "Title",
+ "text": "Configuration"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Nodes/S/Support/Support-Program/support-program.json b/Projects/Governance/Schemas/Docs-Nodes/S/Support/Support-Program/support-program.json
index 7f2ee398c..8a5c11524 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/S/Support/Support-Program/support-program.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/S/Support/Support-Program/support-program.json
@@ -1,8 +1,8 @@
{
"type": "Support Program",
"definition": {
- "text": "The Support Program is designed to incentivize the involvement of the Community in helping new users overcome the learning curve and the rough edges they may find in the current version of the software. You may earn tokens by sharing your knowledge with other users!",
- "updated": 1624726923232
+ "text": "At Superalgos, we take pride in the level of support we offer to newcomers and the Community in general. It is a crucial aspect of our culture, based above all on collaboration. The Support Program enables the Community to compensate Community Mods contributing to the project’s support efforts.",
+ "updated": 1630231393370
},
"paragraphs": [
{
@@ -11,12 +11,36 @@
"updated": 1624726970556
},
{
- "style": "Text",
- "text": "The Token Power assigned to the Support Program becomes your Support Power. The core idea of this program is that you may show your gratitude to the people that help you out when you have doubts or run into trouble!"
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Featuring Tokens Bonus",
+ "updated": 1630231411117
},
{
"style": "Text",
- "text": "The group of Community Mods is growing, and it should! Not all mods are active all the time. When you select your favorite mods, you help the project identify which mods have been actively helping users, so that they may be rewarded accordingly."
+ "text": "Superalgos is a vast system and the learning curve is still quite steep. Many users need help, particularly during the early stages."
+ },
+ {
+ "style": "Text",
+ "text": "While the Community is always ready to help with typical questions, we’ve noticed that it takes a certain level of experience and knowledge to provide effective support. This is why select Community Mods are in charge of the Support Group."
+ },
+ {
+ "style": "Note",
+ "text": "If you ever wish to join the team of Community Mods, start participating in the various Telegram groups and Discord channels, helping users and answering questions. We’ll soon spot you and draft you into the Community Mods team!",
+ "updated": 1630231465692
+ },
+ {
+ "style": "Callout",
+ "text": "To participate, you must spawn the Support Program and declare your favorite supporters. To do that, add a User Supporter node and use it to establish a reference to the User Profile of the person that has helped you the most! If you have more than one favorite supporter, add more User Supporter nodes!",
+ "updated": 1630231527435
+ },
+ {
+ "style": "Text",
+ "text": "If you seldom use the Support Group, that may be thanks to the effort put in crafting tutorials and documentation. If that is your case, then feel free to select the individuals or teams doing this work as your preferred supporters!",
+ "updated": 1630231554533
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Community Building Programs"
},
{
"style": "Block",
diff --git a/Projects/Governance/Schemas/Docs-Nodes/T/Tokens/Tokens-Awarded/tokens-awarded.json b/Projects/Governance/Schemas/Docs-Nodes/T/Tokens/Tokens-Awarded/tokens-awarded.json
index 03ead3cb0..c9a6bb2bf 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/T/Tokens/Tokens-Awarded/tokens-awarded.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/T/Tokens/Tokens-Awarded/tokens-awarded.json
@@ -1,8 +1,8 @@
{
"type": "Tokens Awarded",
"definition": {
- "text": "The Tokens Awarded node is present on each of the programs in the hierarchy. It exists to accumulate and display the number of Superalgos SA Tokens awarded to your profile through each program.",
- "updated": 1630164138055
+ "text": "The Tokens Awarded node represents the number of tokens you get in reward for your contributions. The node is present on many of the Governance Programs.",
+ "updated": 1630436769778
},
"paragraphs": [
{
@@ -17,13 +17,36 @@
},
{
"style": "Subtitle",
- "text": "Community Building Programs Calculations",
- "updated": 1630165409867
+ "text": "Calculations",
+ "updated": 1630324592451
},
{
- "style": "Text",
- "text": "The Community Building Programs node page explains how Tokens Rewards are calculated for these particular program.",
- "updated": 1630171164026
+ "style": "Note",
+ "text": "Each program calculates Tokens Awarded in a particular way. Follow the links below to learn the details about each program.",
+ "updated": 1630324671871
+ },
+ {
+ "style": "List",
+ "text": "In the Airdrop Program.",
+ "updated": 1630324552707
+ },
+ {
+ "style": "List",
+ "text": "In the Github Program.",
+ "updated": 1630324714648
+ },
+ {
+ "style": "List",
+ "text": "The Community Building Programs node page explains how Tokens Awarded is calculated for the referral, support, and mentorship programs.",
+ "updated": 1630324749961
+ },
+ {
+ "style": "List",
+ "text": "The How Claims are Resolved page explains how tokens are awarded in the Claims Program."
+ },
+ {
+ "style": "List",
+ "text": "In the Staking Program."
},
{
"style": "Text",
diff --git a/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Delegate/user-delegate.json b/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Delegate/user-delegate.json
new file mode 100644
index 000000000..373ee70c6
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Delegate/user-delegate.json
@@ -0,0 +1,48 @@
+{
+ "type": "User Delegate",
+ "definition": {
+ "text": "Use this node to establish a reference with a colleague's User Profile. With this reference, you are passing on Token Power directly into your colleague's profile, effectively delegating your Token Power. Your colleague may use the power in any of the Governance Programs.",
+ "updated": 1630423548110
+ },
+ "paragraphs": [
+ {
+ "style": "Block",
+ "text": "Content",
+ "updated": 1630423559633
+ },
+ {
+ "style": "Text",
+ "text": "The main use case for delegating Token Power is when mentors wish to help their mentees make their first few Contribution Claims. "
+ },
+ {
+ "style": "Text",
+ "text": "Contributors need to drive Claim Power to their claims for them to be effective. However, when they are new to Superalgos, they may not have enough tokens to back their claims.",
+ "updated": 1630423586473
+ },
+ {
+ "style": "Text",
+ "text": "Mentors are happy to help their mentees get their first few tokens, and are rewarded for their work and generosity through the Mentorship Program."
+ },
+ {
+ "style": "Note",
+ "text": "This form of Token Power delegation is inspired in the concept of Liquid Democracy, also implemented in the Voting Program."
+ },
+ {
+ "style": "Text",
+ "text": "The same Token Power may be delegated multiple times with the caveat in the below warning box. The delegation may be withdrawn at any point as well, simply by removing the User Delegate node or its reference."
+ },
+ {
+ "style": "Warning",
+ "text": "Only 10% of the Delegate Power you drive into a User Delegate node reaches the recipient User Profile. This is to disincentivize fraudulent behaviors that may arise involving circular declarations, fake profiles, or trading of votes.",
+ "updated": 1630423731772
+ },
+ {
+ "style": "Block",
+ "text": "Configuration"
+ },
+ {
+ "style": "Title",
+ "text": "Configuration"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Mentor/user-mentor.json b/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Mentor/user-mentor.json
index 24a041c8c..de7068ea7 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Mentor/user-mentor.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Mentor/user-mentor.json
@@ -1,8 +1,8 @@
{
"type": "User Mentor",
"definition": {
- "text": "Spawn User Mentor nodes to reference your mentors!",
- "updated": 1624727395307
+ "text": "A User Mentor node must establish a reference with the User Profile of your mentor. If you have more than one mentor, add more nodes! This is how you establish who your mentors are.",
+ "updated": 1630232933516
},
"paragraphs": [
{
@@ -11,12 +11,9 @@
"updated": 1624727421712
},
{
- "style": "Text",
- "text": "The Superalgos Community is always willing to help. You will find your mentors in the various Community Groups."
- },
- {
- "style": "Success",
- "text": "The Mentorship Program is the best way to thank the people that help you get to the power user level. The Superalgos Project advances thanks to Contributors, thus helping new users go through the learning curve up to the point in which they can contribute to the project is highly valuable for the Community as a whole!"
+ "style": "Warning",
+ "text": "Declaring at least one User Mentor is a requirement to participate in the program. If you fail to declare at least one, you don't qualify for Tokens Bonus incentives.",
+ "updated": 1630232958240
},
{
"style": "Block",
diff --git a/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Profile-Vote/user-profile-vote.json b/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Profile-Vote/user-profile-vote.json
index d0883ea9e..254e8cc8c 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Profile-Vote/user-profile-vote.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Profile-Vote/user-profile-vote.json
@@ -1,13 +1,41 @@
{
"type": "User Profile Vote",
"definition": {
- "text": "A type of vote within the Voting Program used to confer Voting Power to another User Profile.",
- "updated": 1624729935183
+ "text": "Use this node to establish a reference with a colleague's User Profile. With this vote, you are passing on Voting Power directly into your colleague's Voting Program, effectively delegating your Voting Power.",
+ "updated": 1630394852693
},
"paragraphs": [
+ {
+ "style": "Block",
+ "text": "Content",
+ "updated": 1630394887268
+ },
+ {
+ "style": "Success",
+ "text": "You may delegate your Voting Power to empower voices you trust! Trusted members of the Community may make good use of your Voting Power, particularly if you feel you don't have the time or expertise to be on top of certain aspects of governance.",
+ "updated": 1630397257327
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Liquid Democracy->Content"
+ },
{
"style": "Text",
- "text": "Right click and select the pencil button to enter edit mode."
+ "text": "The same Voting Power may be delegated multiple times with the caveat in the below warning box. The delegation may be withdrawn at any point as well, simply by removing the User Profile Vote node or its reference.",
+ "updated": 1630423697159
+ },
+ {
+ "style": "Warning",
+ "text": "Only 10% of the Voting Power you drive into a User Profile Vote node reaches the recipient User Profile. This is to disincentivize fraudulent behaviors that may arise involving circular declarations, fake profiles, or trading of votes.",
+ "updated": 1630408559866
+ },
+ {
+ "style": "Block",
+ "text": "Configuration"
+ },
+ {
+ "style": "Title",
+ "text": "Configuration"
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Profile-Votes-Switch/user-profile-votes-switch.json b/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Profile-Votes-Switch/user-profile-votes-switch.json
index f49ebbb9c..58b312333 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Profile-Votes-Switch/user-profile-votes-switch.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Profile-Votes-Switch/user-profile-votes-switch.json
@@ -1,13 +1,36 @@
{
"type": "User Profile Votes Switch",
"definition": {
- "text": "This type of switch is used to spawn User Profile Vote nodes.",
- "updated": 1624729715052
+ "text": "Use this switch as an organizational device, and to spawn User Profile Vote nodes.",
+ "updated": 1630421929174
},
"paragraphs": [
+ {
+ "style": "Block",
+ "text": "Content",
+ "updated": 1630394627447
+ },
{
"style": "Text",
- "text": "Right click and select the pencil button to enter edit mode."
+ "text": "You may use this switch for two different purposes:",
+ "updated": 1630394642130
+ },
+ {
+ "style": "List",
+ "text": "As an organizational device: You may create arbitrary arrangements of votes, spawning more switches and votes."
+ },
+ {
+ "style": "List",
+ "text": "As a switch: You may control the flow of Voting Power, pretty much like with a Token Power Switch, but within the Voting Program. If you need a reminder, read about how Token Power Flows.",
+ "updated": 1630394687805
+ },
+ {
+ "style": "Block",
+ "text": "Configuration"
+ },
+ {
+ "style": "Title",
+ "text": "Configuration"
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Profile/user-profile.json b/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Profile/user-profile.json
index c1453693b..c58116d8c 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Profile/user-profile.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Profile/user-profile.json
@@ -22,73 +22,18 @@
},
{
"style": "Title",
- "text": "Token Power Flow"
+ "text": "Token Power Flows",
+ "updated": 1630216274356
},
{
- "style": "Text",
- "text": "How Token Power flows depends on the following:"
+ "style": "Include",
+ "text": "Governance->Concept->Token Power Flows->Definition",
+ "updated": 1630216248820
},
{
- "style": "List",
- "text": "By default, Token Power flows in equal proportion to each direct offspring node.",
- "updated": 1630093090611
- },
- {
- "style": "List",
- "text": "You may override the defaults by explicitly defining the percentage of the Token Power you wish to allocate to each offspring. If you define less than a total of 100%, then the remaining Token Power is distributed evenly across the offspring for which there is no definition.",
- "updated": 1630093129825
- },
- {
- "style": "Text",
- "text": "This is the format of the configuration you may use on each of the programs:"
- },
- {
- "style": "Json",
- "text": "{\n \"percentage\": 50\n}",
- "updated": 1624726090541
- },
- {
- "style": "Text",
- "text": "For example, let's say you have 1,000 Token Power flowing into your Token Power Switch node. Let's say you spawn the Onboarding Programs, Community Building Programs, Votes and Claims Programs, and Financial Programs nodes.",
- "updated": 1630094336717
- },
- {
- "style": "Callout",
- "text": "As soon as you deploy these four offspring of the Token Power Switch node, you will see that each of these nodes gets 25% of the Token Power by default.",
- "updated": 1630094063741
- },
- {
- "style": "Text",
- "text": "But you wish to limit the Token Power flowing into the Onboarding Programs to zero, as those programs do not require Token Power. To do that, you set up the following in the Onboarding Programs node configuration:",
- "updated": 1630093868178
- },
- {
- "style": "Json",
- "text": "{\n \"percentage\": 0\n}",
- "updated": 1630093495369
- },
- {
- "style": "Callout",
- "text": "Once the configuration is in place, you will notice that the Onboarding Programs node shows 0% and 0 Token Power flowing into the node. You will also notice that the rest of the nodes are getting 33.33% of the Token Power each.",
- "updated": 1630093693182
- },
- {
- "style": "Text",
- "text": "Now let's say you wish to use only 10% of your Token Power in the Onboarding Programs. So you set up the following config:"
- },
- {
- "style": "Json",
- "text": "{\n \"percentage\": 10\n}",
- "updated": 1630093961107
- },
- {
- "style": "Callout",
- "text": "As a result, 10% of the Token Power flows into the Onboarding Programs, while the remaining nodes get 45% of the Token Power each.",
- "updated": 1630094141031
- },
- {
- "style": "Success",
- "text": "The same logic applies to the flow of Token Power throughout the hierarchy!"
+ "style": "Include",
+ "text": "Governance->Concept->Token Power Flows->Content",
+ "updated": 1630216256004
},
{
"style": "Block",
diff --git a/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Referrer/user-referrer.json b/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Referrer/user-referrer.json
index 57813010e..861d8918e 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Referrer/user-referrer.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Referrer/user-referrer.json
@@ -1,8 +1,8 @@
{
"type": "User Referrer",
"definition": {
- "text": "The User Referrer node must establish a reference with the User Profile of your referrer. This is how you establish who your referrer is.",
- "updated": 1624726602398
+ "text": "A User Referrer node must establish a reference with the User Profile of your referrer. If you have more than one referrer, add more nodes! This is how you establish who your referrers are.",
+ "updated": 1630232566550
},
"paragraphs": [
{
@@ -11,16 +11,9 @@
"updated": 1624726623564
},
{
- "style": "Text",
- "text": "In case more than one person referred you to Superalgos or in case you can’t remember who was first, you may add new User Referrer nodes and declare more than one referrer."
- },
- {
- "style": "Callout",
- "text": "You may have been referred to Superalgos by an article in a publication, a YouTube video, a social media post, a comment on Reddit, a tweet, or directly by a friend. Please be fair to those that go the extra mile spreading the word about the project! Find out who authored that video, tweet, or article, and make sure you give credit where credit is due!"
- },
- {
- "style": "Text",
- "text": "The User Referrer node displays a notice detailing how your total Referral Power is composed, as a sum of your own power and the power you get from people in your referred offspring."
+ "style": "Warning",
+ "text": "Declaring at least one User Referrer is a requirement to participate in the program. If you fail to declare at least one, you don't qualify for Tokens Bonus incentives.",
+ "updated": 1630232662165
},
{
"style": "Block",
diff --git a/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Supporter/user-supporter.json b/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Supporter/user-supporter.json
index 2e1a24317..6c56886f2 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Supporter/user-supporter.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Supporter/user-supporter.json
@@ -1,8 +1,8 @@
{
"type": "User Supporter",
"definition": {
- "text": "Spawn as many User Supporter nodes as you wish and establish references to the User Profile nodes of your favorite supporters.",
- "updated": 1624727060271
+ "text": "A User Supporter node must establish a reference with the User Profile of your supporter. If you have more than one supporter, add more nodes! This is how you establish who your supporters are.",
+ "updated": 1630232791200
},
"paragraphs": [
{
@@ -11,13 +11,9 @@
"updated": 1624727081804
},
{
- "style": "Text",
- "text": "If you declare more than one supporter, you may use the configuration in the User Supporter node to determine how much Supporter Power you wish to send each. If you don’t use the configuration, the default applies."
- },
- {
- "style": "Json",
- "text": "{\n \"percentage\": 50\n}",
- "updated": 1624727099934
+ "style": "Warning",
+ "text": "Declaring at least one User Supporter is a requirement to participate in the program. If you fail to declare at least one, you don't qualify for Tokens Bonus incentives.",
+ "updated": 1630232813838
},
{
"style": "Block",
diff --git a/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Vote-Transfer/user-vote-transfer.json b/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Vote-Transfer/user-vote-transfer.json
deleted file mode 100644
index 0084e1129..000000000
--- a/Projects/Governance/Schemas/Docs-Nodes/U/User/User-Vote-Transfer/user-vote-transfer.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "type": "User Profile Vote",
- "definition": {
- "text": "This node allows users to transfer some of their voting power to other users, effectively creating a Delegation. Votes received by users are then flowed through the recipient user's token streams, increasing their size.",
- "updated": 1622989097099
- },
- "paragraphs": [
- {
- "style": "Text",
- "text": "Right click and select the pencil button to enter edit mode."
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Nodes/V/Votes/Votes-And-Claims-Programs/votes-and-claims-programs.json b/Projects/Governance/Schemas/Docs-Nodes/V/Votes/Votes-And-Claims-Programs/votes-and-claims-programs.json
index c2538f60b..69a61f1b6 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/V/Votes/Votes-And-Claims-Programs/votes-and-claims-programs.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/V/Votes/Votes-And-Claims-Programs/votes-and-claims-programs.json
@@ -1,13 +1,27 @@
{
"type": "Votes And Claims Programs",
"definition": {
- "text": "Use this node to spawn the Claims Program and the Voting Program.",
- "updated": 1630056577950
+ "text": "Votes and claims are instruments the Community uses to determine what is incentivized and how contributions are compensated. Use this node to spawn the Claims Program and the Voting Program.",
+ "updated": 1630226336941
},
"paragraphs": [
{
- "style": "Text",
- "text": "Right click and select the pencil button to enter edit mode."
+ "style": "Block",
+ "text": "Content",
+ "updated": 1630226386348
+ },
+ {
+ "style": "Success",
+ "text": "Learn more about how Token Power Flows into these programs!",
+ "updated": 1630226462874
+ },
+ {
+ "style": "Block",
+ "text": "Configuration"
+ },
+ {
+ "style": "Title",
+ "text": "Configuration"
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Nodes/V/Votes/Votes-Switch/votes-switch.json b/Projects/Governance/Schemas/Docs-Nodes/V/Votes/Votes-Switch/votes-switch.json
index 0de582fac..ab0786fd3 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/V/Votes/Votes-Switch/votes-switch.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/V/Votes/Votes-Switch/votes-switch.json
@@ -11,7 +11,7 @@
"updated": 1624729535872
},
{
- "style": "Text",
+ "style": "Important",
"text": "This node can not reference “class” or “folder” types of nodes on other hierarchies. It is merely an organizational device."
},
{
diff --git a/Projects/Governance/Schemas/Docs-Nodes/V/Voting/Voting-Program/voting-program.json b/Projects/Governance/Schemas/Docs-Nodes/V/Voting/Voting-Program/voting-program.json
index a49476d14..560de8ca3 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/V/Voting/Voting-Program/voting-program.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/V/Voting/Voting-Program/voting-program.json
@@ -1,8 +1,8 @@
{
"type": "Voting Program",
"definition": {
- "text": "The Voting Program is the heart and soul of governance, as it is the section of the hierarchy Contributors use to cast various types of votes. The program is designed to incentivize participation. For that reason, voting earns you tokens too!",
- "updated": 1624729344266
+ "text": "The Voting Program is the heart and soul of governance, as it enables you to cast various types of votes. You may decide what to incentivize, weighing Pools, Assets, Features, and Positions. You may also evaluate and support Contribution Claims and transfer Voting Power to other users.",
+ "updated": 1630351287920
},
"paragraphs": [
{
@@ -11,48 +11,56 @@
"updated": 1624729363885
},
{
- "style": "Text",
- "text": "At the time of each Distribution Event, your Voting Power — that is, the Token Power you assign to the Voting Program — determines the Direct Proportion of tokens you get from the Voting Program Pool."
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Featuring Tokens Bonus",
+ "updated": 1630329521827
+ },
+ {
+ "style": "Note",
+ "text": "Your Reputation is added to the Token Power that flows into the Voting Program, effectively increasing your Voting Power. Read more about Reputation!",
+ "updated": 1630424362937
},
{
"style": "Text",
- "text": "A top-level Votes Switch node allows spawning several other particular switches. A switch allows channeling Voting Power in a specific direction and a specific proportion."
- },
- {
- "style": "Text",
- "text": "By default, the Votes Switch node passes on an equal amount of Voting Power to its offspring. However, you may override the percentage of Voting Power allocated to each switch below a Votes Switch by using the following parameter in the configuration of the particular switch:"
- },
- {
- "style": "Json",
- "text": "{\n \"percentage\": 50\n}",
- "updated": 1624729399791
- },
- {
- "style": "Text",
- "text": "If you define less than a total of 100% of the Voting Power flowing at any level of the hierarchy, then the remaining Voting Power is distributed evenly across the rest of the offspring at the same level.",
- "updated": 1624729413463
- },
- {
- "style": "Text",
- "text": "There are three categories of votes, each with their corresponding switch that helps organize votes in hierarchical structures:"
+ "text": "The features in the Voting Program allow you to cast three different categories of votes:"
},
{
"style": "List",
- "text": "Claim Votes Switch;"
+ "text": "Claim Votes: Use Claim Votes to support the claims of other users so that they may get the rewards they deserve for their contributions. There are three types of claim vote nodes, namely Asset Claim Vote, Feature Claim Vote, and Position Claim Vote nodes.",
+ "updated": 1630344722135
},
{
"style": "List",
- "text": "Weight Votes Switch;"
+ "text": "Weight Votes: Use Weight Votes to influence what areas of the project should be incentivized. There are four types of weight votes, namely Pool Weight Vote, Asset Weight Vote, Feature Weight Vote, and Position Weight Vote nodes.",
+ "updated": 1630344790466
},
{
"style": "List",
- "text": "User Profile Votes Switch",
- "updated": 1624735526746
+ "text": "User Profile Votes: Use a User Profile Vote to transfer Voting Power to other users.",
+ "updated": 1630344853204
+ },
+ {
+ "style": "Text",
+ "text": "There is a top-level Votes Switch node that allows spawning several other switches, each one associated to the different types of votes described above:",
+ "updated": 1630343139964
+ },
+ {
+ "style": "List",
+ "text": "Claim Votes Switch",
+ "updated": 1630329624666
+ },
+ {
+ "style": "List",
+ "text": "Weight Votes Switch"
+ },
+ {
+ "style": "List",
+ "text": "User Profile Votes Switch"
},
{
"style": "Success",
- "text": "Each switch may spawn specialized types of voting nodes, each with the capacity of casting votes towards specific types of nodes on other hierarchies. The Token Rewards and Voting Power Flow page in the Governance Flow topic covers important details of how Votes work. Make sure you read the whole topic!",
- "updated": 1624735504965
+ "text": "These switches control the flow of Voting Power, may be used as organizational devices, may spawn the different types of votes, and may help you map entire data structures easily. Find the details on the page of each switch!",
+ "updated": 1630348670996
},
{
"style": "Block",
diff --git a/Projects/Governance/Schemas/Docs-Nodes/W/Weight/Weight-Votes-Switch/weight-votes-switch.json b/Projects/Governance/Schemas/Docs-Nodes/W/Weight/Weight-Votes-Switch/weight-votes-switch.json
index 7afac294f..459c5bc1a 100644
--- a/Projects/Governance/Schemas/Docs-Nodes/W/Weight/Weight-Votes-Switch/weight-votes-switch.json
+++ b/Projects/Governance/Schemas/Docs-Nodes/W/Weight/Weight-Votes-Switch/weight-votes-switch.json
@@ -1,8 +1,8 @@
{
"type": "Weight Votes Switch",
"definition": {
- "text": "This type of switch is used to spawn different types of weight vote nodes, and to reference “class” type of nodes within the different hierarchies that define Project incentives.",
- "updated": 1624729654009
+ "text": "Use this switch to spawn different types of Weight Votes, and to reference Class types of nodes within any of the Project Definition Hierarchies to map large structures of definitions.",
+ "updated": 1630356971950
},
"paragraphs": [
{
@@ -12,11 +12,37 @@
},
{
"style": "Text",
- "text": "When a Weight Votes Switch references any of the existing “class” type of nodes in the Pools, Positions, Features, and Assets hierarchies, the Install Missing Votes option on the menu becomes usable."
+ "text": "You may use this switch for three different purposes:"
+ },
+ {
+ "style": "List",
+ "text": "As an organizational device: You may create arbitrary arrangements of votes, spawning more switches and votes."
+ },
+ {
+ "style": "List",
+ "text": "As a switch: You may control the flow of Weight Power, pretty much like with a Token Power Switch, but within the Voting Program. If you need a reminder, read about how Token Power Flows.",
+ "updated": 1630394709837
+ },
+ {
+ "style": "List",
+ "text": "As a data-structure mapper: Use the node to reference Class types of nodes within Project Definition Hierarchies to map entire structures of definitions."
+ },
+ {
+ "style": "Text",
+ "text": "The first two use cases are self-explanatory. Let's explore the third one in more detail."
+ },
+ {
+ "style": "Callout",
+ "text": "Use a Weight Votes Switch node to establish a reference with a Class type of node — Pool Class, Position Class, Feature Class, or Asset Class — within Project Definition Hierarchies. Then use the Install Missing Votes option on the menu of the Weight Votes Switch to map the entire Class section of the hierarchy! ",
+ "updated": 1630498028825
+ },
+ {
+ "style": "Note",
+ "text": "The process creates a Weight Votes Switch for each Class type of node, and matching Weight Votes for each Asset, Feature, Position, or Pool defined within each Class node."
},
{
"style": "Success",
- "text": "Installing votes allows mapping entire sections of project definitions so that you may vote to incentivize multiple definitions easily."
+ "text": "If something changes on the side of the definitions, you may always go back a run the Install Missing Votes process again. The process will remap the structure with the appropriate votes and switches."
},
{
"style": "Block",
diff --git a/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Definitions/governance-definitions-002-pools-hierarchy.json b/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Definitions/governance-definitions-002-pools-hierarchy.json
index 5d426face..67c8cf52b 100644
--- a/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Definitions/governance-definitions-002-pools-hierarchy.json
+++ b/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Definitions/governance-definitions-002-pools-hierarchy.json
@@ -23,8 +23,8 @@
},
{
"style": "Title",
- "text": "Pool Classes Nodes",
- "updated": 1624710545392
+ "text": "Pool Class Nodes",
+ "updated": 1630427241695
},
{
"style": "Include",
diff --git a/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Flow/governance-flow-001-the-superalgos-meritocracy.json b/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Flow/governance-flow-001-the-superalgos-meritocracy.json
index d42f5f30f..2cb4fc05d 100644
--- a/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Flow/governance-flow-001-the-superalgos-meritocracy.json
+++ b/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Flow/governance-flow-001-the-superalgos-meritocracy.json
@@ -16,6 +16,15 @@
"style": "Include",
"text": "Governance->Concept->Token Power->Content",
"updated": 1624780741084
+ },
+ {
+ "style": "Text",
+ "text": "There is a second concept that is crucial to how Superalgos values contributions: Reputation.",
+ "updated": 1630508777182
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Reputation->Content"
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Flow/governance-flow-002-token-rewards-and-voting-power-flow.json b/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Flow/governance-flow-002-token-rewards-and-voting-power-flow.json
deleted file mode 100644
index 131887d39..000000000
--- a/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Flow/governance-flow-002-token-rewards-and-voting-power-flow.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
- "topic": "Governance Flow",
- "pageNumber": "2",
- "type": "Token Rewards and Voting Power Flow",
- "definition": {
- "text": "Let’s analyze the flow of Token Rewards through Pools in parallel with the flow of Token Power, and in particular Voting Power, as they are interdependent.",
- "updated": 1624780824020
- },
- "paragraphs": [
- {
- "style": "Include",
- "text": "Governance->Concept->Token Rewards->Content",
- "updated": 1624780974906
- },
- {
- "style": "Text",
- "text": "Each release distributes a number of tokens as specified in the configuration of the top-level Superalgos Pools hierarchy (within the Token Distribution Superalgos Plugin Workspace). For tokens to be distributed, they first need to flow into the Pool nodes defined in this hierarchy.",
- "updated": 1624781023264
- },
- {
- "style": "Text",
- "text": "Token Rewards flow within the hierarchy in response to Weight Votes casted by the Community. That is, the Community decides the Weight of each Pool by casting Weight Votes."
- },
- {
- "style": "Text",
- "text": "This is where Token Rewards intersect with Voting Power, as it is Voting Power that drives Token Rewards."
- },
- {
- "style": "Text",
- "text": "Your Token Power flows into the different programs available under your User Profile. The portion of Token Power that flows into your Voting Program turns into Voting Power, which is channeled through different types of switches. You use Weight Vote Switch nodes to turn Voting Power into Weight Votes."
- },
- {
- "style": "Text",
- "text": "So, for example, when you reference a Pool node with a Pool Weight Vote node, you are conferring your Weight Votes to that particular Pool node."
- },
- {
- "style": "Text",
- "text": "Now that this Pool node has some Weight, the Token Reward available for the hierarchy may flow into this Pool node. How much? It depends on the weight of the node relative to the weight of the rest of the nodes in the hierarchy!"
- },
- {
- "style": "Include",
- "text": "Governance->Concept->Weight->Content",
- "updated": 1624781155330
- },
- {
- "style": "Json",
- "text": "Weight (of a node) = Node’s Incoming Weight Votes / Sum of Weight Votes in the Hierarchy * 100",
- "updated": 1624781181588
- },
- {
- "style": "Note",
- "text": "If a Pool node ends up with no Weight Votes, then no Token Rewards flow into the node."
- },
- {
- "style": "Title",
- "text": "Token Reward Flow Into Other Hierarchies"
- },
- {
- "style": "Text",
- "text": "Pool nodes in the top-level Superalgos Pools hierarchy reference other hierarchies where project definitions continue. Those hierarchies may be other Pools, Positions, Features, or Asset hierarchies."
- },
- {
- "style": "Text",
- "text": "When a Pool node in the top-level hierarchy gets Weight Votes, the Token Rewards flowing to the node is immediately passed on to the referenced hierarchy. So, now the referenced hierarchy has Token Rewards of its own!"
- },
- {
- "style": "Text",
- "text": "How do Token Rewards flow within these secondary hierarchies? In the exact manner! When Weight Votes are casted within the hierarchy, Token Rewards flow into the affected nodes in Weight proportions calculated within the scope of the hierarchy.",
- "updated": 1624781274277
- },
- {
- "style": "Note",
- "text": "The cycle goes on and on through all the existing levels of nested hierarchies. The process and flows are the same regardless of the type of hierarchy."
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Flow/governance-flow-002-token-rewards-and-weight-power-flow.json b/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Flow/governance-flow-002-token-rewards-and-weight-power-flow.json
new file mode 100644
index 000000000..4e8410d45
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Flow/governance-flow-002-token-rewards-and-weight-power-flow.json
@@ -0,0 +1,114 @@
+{
+ "topic": "Governance Flow",
+ "pageNumber": "2",
+ "type": "Token Rewards and Weight Power Flow",
+ "definition": {
+ "text": "Let’s analyze the flow of Token Rewards through Pools in parallel with the flow of Token Power, and in particular Weight Power, as they are interdependent.",
+ "updated": 1624780824020
+ },
+ "paragraphs": [
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Token Rewards->Content",
+ "updated": 1624780974906
+ },
+ {
+ "style": "Title",
+ "text": "The Master Distribution Pool",
+ "updated": 1630510334093
+ },
+ {
+ "style": "Text",
+ "text": "Each release distributes a number of tokens as specified in the configuration of the top-level Superalgos Pools hierarchy. The head of this hierarchy is the master distribution pool, where it all begins in terms of the flow of Token Rewards.",
+ "updated": 1630510402640
+ },
+ {
+ "style": "Note",
+ "text": "Visualize the flow of Token Rewards as a cascade starting at the head of the Superalgos Pools hierarchy that needs to trickle down to the different Pool nodes in the hierarchy, and then jump to the heads of other Project Definition Hierarchies.",
+ "updated": 1630511702008
+ },
+ {
+ "style": "Text",
+ "text": "Unlike the flow of Token Power within a User Profile, which is determined by configurations entered by the owner of the profile, the flow of Token Rewards is subject to the will of the Community. In other words, it is the community that must decide how rewards flow, and how many tokens must go to incentivize what. ",
+ "updated": 1630511815154
+ },
+ {
+ "style": "Subtitle",
+ "text": "This is Where Weight Votes Come in the Picture",
+ "updated": 1630512058431
+ },
+ {
+ "style": "Callout",
+ "text": "Weight Votes are the instrument the Community uses to expresses how Token Rewards should flow. Token Rewards flow within the hierarchy in response to Weight Votes cast by the Community. That is, the Community decides the Weight of each Pool by casting Weight Votes.",
+ "updated": 1630512042083
+ },
+ {
+ "style": "Text",
+ "text": "This is where Token Rewards intersect with Weight Power, as it is Weight Power that drives the flow of Token Rewards through Weight Votes.",
+ "updated": 1630510680354
+ },
+ {
+ "style": "Note",
+ "text": "Remember that your Token Power flows into the different programs available under your User Profile. The portion of Token Power that flows into your Voting Program turns into Voting Power, which is channeled through different types of switches. You use Weight Votes Switch nodes to turn Voting Power into Weight Power that then flows into Weight Votes.",
+ "updated": 1630512123642
+ },
+ {
+ "style": "Subtitle",
+ "text": "For Example",
+ "updated": 1630512233819
+ },
+ {
+ "style": "Text",
+ "text": "When you reference a Pool node with a Pool Weight Vote node, you are conferring the Weight Power in your Pool Weight Vote to that particular Pool node.",
+ "updated": 1630512248393
+ },
+ {
+ "style": "Text",
+ "text": "Now that this Pool node has some Weight, the Token Rewards available at the top of the hierarchy may flow into this Pool node. How much? It depends on the Weight Power the Pool gets relative to the Weight Power the rest of the Pools in the hierarchy get!",
+ "updated": 1630512360936
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Weight->Content",
+ "updated": 1624781155330
+ },
+ {
+ "style": "Json",
+ "text": "Weight (of a node) = Node's Incoming Weight Power / \n Sum of Weight Power in the Hierarchy * 100",
+ "updated": 1630512395411
+ },
+ {
+ "style": "Note",
+ "text": "If a Pool node ends up with no Weight Power, then no Token Rewards flow into the node.",
+ "updated": 1630512412251
+ },
+ {
+ "style": "Title",
+ "text": "Token Rewards Flow Into Other Hierarchies",
+ "updated": 1630510284691
+ },
+ {
+ "style": "Text",
+ "text": "Pool nodes in the top-level Superalgos Pools hierarchy reference other hierarchies where project definitions continue. Those hierarchies may be other Pools, Positions, Features, or Asset hierarchies."
+ },
+ {
+ "style": "Callout",
+ "text": "When a Pool node in the Superalgos Pools hierarchy gets some Weight Power, the Token Rewards flowing to the node are immediately passed on to the referenced hierarchy. So, now the referenced hierarchy has Token Rewards of its own at the head of the hierarchy!",
+ "updated": 1630513045548
+ },
+ {
+ "style": "Text",
+ "text": "How do Token Rewards flow within these secondary hierarchies? In the exact manner! When Weight Votes are cast within the hierarchy, Token Rewards flow into the affected nodes in proportion to the Weight calculated within the scope of the hierarchy.",
+ "updated": 1630512699763
+ },
+ {
+ "style": "Important",
+ "text": "The scope of the calculation of Weight proportions is limited to the hierarchy in question."
+ },
+ {
+ "style": "Note",
+ "text": "The cycle goes on and on through all the existing levels of nested hierarchies. The processes and flows are the same regardless of the type of hierarchy.",
+ "updated": 1630512917168
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Flow/governance-flow-003-how-claims-are-resolved.json b/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Flow/governance-flow-003-how-claims-are-resolved.json
new file mode 100644
index 000000000..260eedc5e
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Flow/governance-flow-003-how-claims-are-resolved.json
@@ -0,0 +1,115 @@
+{
+ "topic": "Governance Flow",
+ "pageNumber": "3",
+ "type": "How Claims are Resolved",
+ "definition": {
+ "text": "These three concepts, Claim Power, Claim Votes, and Token Rewards are intimately related and make up the logic of the token distribution among Contributors.",
+ "updated": 1630518244395
+ },
+ "paragraphs": [
+ {
+ "style": "Title",
+ "text": "Dealing With Claim Power",
+ "updated": 1630518680345
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Claim Power->Content"
+ },
+ {
+ "style": "Text",
+ "text": "You control the flow of your Claim Power so that the appropriate value reaches the node with which you wish to present a claim. That is, you present claims for a specific number of tokens, determined by the Claim Power that reaches the corresponding claim node.",
+ "updated": 1630518610936
+ },
+ {
+ "style": "Text",
+ "text": "You already know that the Token Rewards in a definition node — a Position, Feature, or Asset node — determines how many tokens are available to incentivize the production and/or maintenance of the concept represented by the node.",
+ "updated": 1630518717152
+ },
+ {
+ "style": "Callout",
+ "text": "When you place a claim on a definition node, you are declaring that you wish the Community to reward you with the number of tokens in your claim (Claim Power) for the work done on the concept embodied by the corresponding definition node."
+ },
+ {
+ "style": "Text",
+ "text": "Many different scenarios may arise up to this point. "
+ },
+ {
+ "style": "Text",
+ "text": "For example:"
+ },
+ {
+ "style": "List",
+ "text": "Your claim may have Claim Power equal, smaller, or greater than the Token Rewards available in the node.",
+ "updated": 1630518355289
+ },
+ {
+ "style": "List",
+ "text": "Your claim may be the only claim in the node, or there may be other claims too."
+ },
+ {
+ "style": "List",
+ "text": "The total Claim Power in all existing claims may be equal, smaller, or greater than the Token Rewards available in the node."
+ },
+ {
+ "style": "Text",
+ "text": "And that is not all! On top of the above scenarios, we need to account for Claim Votes!"
+ },
+ {
+ "style": "Title",
+ "text": "Adding Claim Votes in the Mix"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Claim Votes->Content",
+ "updated": 1624781853443
+ },
+ {
+ "style": "Text",
+ "text": "The flow of Claim Support Power into Claim Votes follows the same principles as the rest of the power flows in the Voting Program. This means that Claim Votes have a specific Claim Support Power, pretty much like claims have a specific Claim Power.",
+ "updated": 1630518813163
+ },
+ {
+ "style": "Note",
+ "text": "In other words, when you vote on someone’s claim, you don’t necessarily vote for the entirety of the claim. Your vote carries a specific Claim Support Power that may be equal, lesser, or greater than the Claim Power in the claim!",
+ "updated": 1630518516835
+ },
+ {
+ "style": "Text",
+ "text": "In addition, more Contributors may vote for the same claim!",
+ "updated": 1630518549067
+ },
+ {
+ "style": "Title",
+ "text": "The Rules"
+ },
+ {
+ "style": "Text",
+ "text": "As you can see, the variables and possible scenarios are many. Let’s lay out the general rules that guide the calculation of what Token Rewards go to what claims."
+ },
+ {
+ "style": "List",
+ "text": "The Token Rewards available in a node determines the maximum number of tokens that may be distributed through that node. In no case shall the system distribute more tokens than what the Token Rewards value indicates. In other words, the Community decides what is the maximum number of tokens to be distributed through any given node with their Weight Votes."
+ },
+ {
+ "style": "List",
+ "text": "The maximum Token Rewards allocated to a claim is determined by the Token Rewards available in the node, the Claim Power associated with the claim, or the sum of the Claim Support Power of all Claim Votes associated with the claim, whichever is smaller.",
+ "updated": 1630518958930
+ },
+ {
+ "style": "List",
+ "text": "When the sum of Claim Support Power of all Claim Votes associated with a claim is lesser than the Claim Power of the claim, the claim is not paid in full. The Token Rewards is capped by the total Claim Support Power of all Claim Votes. In other words, claims are paid up to the amount the Community decides with their Claim Votes.",
+ "updated": 1630519002556
+ },
+ {
+ "style": "List",
+ "text": "When Token Rewards are enough to pay all claims, then each claim is paid in full, as expected. In more precise, albeit complex terms, when Token Rewards are greater than the sum of Claim Support Power for any given number of claims, or the sum of Claim Power for any given number of claims, whichever is lesser, each claim gets the Token Rewards equal to its Claim Power or equal to the Claim Support Power of associated Claim Votes, whichever is lesser.",
+ "updated": 1630519057866
+ },
+ {
+ "style": "List",
+ "text": "When Token Rewards are NOT enough to pay all claims, an adjustment must be made to pay a fair proportion to each claim, without exceeding the Token Rewards available. In such a case, each claim is reduced in proportion to the amount in which claims exceed the Token Rewards. For example, if the sum of all claims exceeds the Token Rewards by 10%, then each claim is reduced by 10%.",
+ "updated": 1630519090138
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Flow/governance-flow-003-token-rewards-claims-power-and-claim-votes.json b/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Flow/governance-flow-003-token-rewards-claims-power-and-claim-votes.json
deleted file mode 100644
index 073a79d8f..000000000
--- a/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Flow/governance-flow-003-token-rewards-claims-power-and-claim-votes.json
+++ /dev/null
@@ -1,95 +0,0 @@
-{
- "topic": "Governance Flow",
- "pageNumber": "3",
- "type": "Token Rewards, Claims Power and Claim Votes",
- "definition": {
- "text": "These three concepts are intimately related and make up the logic of the token distribution.",
- "updated": 1624781724176
- },
- "paragraphs": [
- {
- "style": "Include",
- "text": "Governance->Concept->Claims Power->Content",
- "updated": 1624781714508
- },
- {
- "style": "Text",
- "text": "You control the flow of your Claims Power so that the appropriate number reaches the node with which you wish to present a claim. That is, you present claims for a specific number of tokens, determined by the Claims Power that reaches the corresponding claim node.",
- "updated": 1624781792664
- },
- {
- "style": "Text",
- "text": "You already know that the Token Rewards in a definition node (a Position, Feature, or Asset node) determines how many tokens are available to incentivize the production and/or maintenance of the concept represented by the node."
- },
- {
- "style": "Callout",
- "text": "When you place a claim on a definition node, you are declaring that you wish the Community to reward you with the number of tokens in your claim (Claims Power) for the work done on the concept embodied by the corresponding definition node."
- },
- {
- "style": "Text",
- "text": "Many different scenarios may arise up to this point. "
- },
- {
- "style": "Text",
- "text": "For example:"
- },
- {
- "style": "List",
- "text": "Your claim may be equal, smaller, or greater than the Token Rewards available in the node."
- },
- {
- "style": "List",
- "text": "Your claim may be the only claim in the node, or there may be other claims too."
- },
- {
- "style": "List",
- "text": "The total Claims Power in all existing claims may be equal, smaller, or greater than the Token Rewards available in the node."
- },
- {
- "style": "Text",
- "text": "And that is not all! On top of the above scenarios, we need to account for Claim Votes!"
- },
- {
- "style": "Include",
- "text": "Governance->Concept->Claim Votes->Content",
- "updated": 1624781853443
- },
- {
- "style": "Text",
- "text": "The flow of Voting Power into Claim Votes follows the same principles as the rest of the flows in the Voting Program. This means that Claim Votes have a specific Voting Power, pretty much like claims have a specific Claims Power.",
- "updated": 1624781873207
- },
- {
- "style": "Text",
- "text": "In other words, when you vote on someone’s claim, you don’t necessarily vote for the entirety of the claim. Your vote carries a specific Voting Power that may be equal, lesser, or greater than the Claim Power in the claim!"
- },
- {
- "style": "Text",
- "text": "In addition, more Contributors may vote for the same claim."
- },
- {
- "style": "Text",
- "text": "As you can see, the variables and possible scenarios are many. Let’s lay out the general rules that guide the calculation of what Token Rewards go to what claims."
- },
- {
- "style": "List",
- "text": "The Token Rewards available in a node determines the maximum number of tokens that may be distributed through that node. In no case shall the system distribute more tokens than what the Token Rewards value indicates. In other words, the Community decides what is the maximum number of tokens to be distributed through any given node with their Weight Votes."
- },
- {
- "style": "List",
- "text": "The maximum Token Rewards allocated to a claim is determined by the Token Rewards available in the node, the Claim Power associated with the claim, or the sum of the Voting Power of all Claim Votes associated with the claim, whichever is smaller."
- },
- {
- "style": "List",
- "text": "When the sum of Voting Power of all Claim Votes associated with a claim is lesser than the Claims Power of the claim, the claim is not paid in full. The Token Rewards is capped by the total Voting Power of all Claim Votes. In other words, claims are paid up to the amount the Community decides with their Claim Votes."
- },
- {
- "style": "List",
- "text": "When Token Rewards are enough to pay all claims, then each claim is paid in full, as expected. In more precise, albeit complex terms, when Token Rewards are greater than the sum of Voting Power for any given number of claims, or the sum of Claims Power for any given number of claims, whichever is lesser, each claim gets the Token Reward equal to its Claims Power or equal to the Voting Power of associated Claim Votes, whichever is lesser. "
- },
- {
- "style": "List",
- "text": "When Token Rewards are NOT enough to pay all claims, an adjustment must be made to pay a fair proportion to each claim, without exceeding the Token Rewards available. In such a case, each claim is reduced in proportion to the amount in which claims exceed the Token Rewards. For example, if the sum of all claims exceeds the Token Reward by 10%, then each claim is reduced by 10%."
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-How-To/governance-how-to-001-load-a-user-profile.json b/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-How-To/governance-how-to-001-load-a-user-profile.json
new file mode 100644
index 000000000..5c11208d8
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-How-To/governance-how-to-001-load-a-user-profile.json
@@ -0,0 +1,66 @@
+{
+ "topic": "Governance How To",
+ "pageNumber": "1",
+ "type": "Load a User Profile",
+ "definition": {
+ "text": "Use this guide if you ever wish to load a User Profile into any of the Governance Workspaces.",
+ "updated": 1630681599427
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "Let's say you wish to declare your referrer in the Referral Program, or maybe you wish to support the Contribution Claims of a fellow developer. ",
+ "updated": 1630681643918
+ },
+ {
+ "style": "Callout",
+ "text": "In either case, you will need to load the User Profile of the person in question so that you may establish the appropriate references."
+ },
+ {
+ "style": "Note",
+ "text": "Or maybe you wish to load your own User Profile in one of the Other Governance Workspaces. It's the same process after all!",
+ "updated": 1630677919945
+ },
+ {
+ "style": "Title",
+ "text": "Start Here!",
+ "updated": 1630597272606
+ },
+ {
+ "style": "List",
+ "text": "Find out the person's User Profile name. If you know the person's identity on Github.com, then that's all you need to know. If you don't, then you may need to contact the person and ask! If it's your profile, then no need to do much in this regard!",
+ "updated": 1630681681124
+ },
+ {
+ "style": "List",
+ "text": "Verify that a file with the same name exists in the following path within the Superalgos folder in your hard drive...",
+ "updated": 1630597624699
+ },
+ {
+ "style": "Json",
+ "text": "/Projects/Governance/Plugins/User-Profiles/"
+ },
+ {
+ "style": "List",
+ "text": "If the file doesn't exist, make sure you have the latest version of the app. If it's still missing after updating, let the person know and wait for the profile to be submitted.",
+ "updated": 1630597643975
+ },
+ {
+ "style": "List",
+ "text": "If the file is there and assuming you already are in the workspace you wish to work with, go to the Plugins hierarchy and find the Dummy Plugin File under Plugin User Profiles > Governance Plugin Project.",
+ "updated": 1630597669225
+ },
+ {
+ "style": "List",
+ "text": "Access the configuration of the Dummy profile and change the fileName property using the appropriate name (Github.com username). Replace the name of the node too, to avoid confusion later on."
+ },
+ {
+ "style": "List",
+ "text": "Save the Current Workspace with Ctrl + Alt + Shift + Key-S and refresh the page."
+ },
+ {
+ "style": "List",
+ "text": "Once the page reloads, you should see the new profile along with the rest! That's it!"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Workspaces/governance-workspaces-001-governance-workspaces.json b/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Workspaces/governance-workspaces-001-governance-workspaces.json
new file mode 100644
index 000000000..054e2c670
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Workspaces/governance-workspaces-001-governance-workspaces.json
@@ -0,0 +1,85 @@
+{
+ "topic": "Governance Workspaces",
+ "pageNumber": "1",
+ "type": "Governance Workspaces",
+ "definition": {
+ "text": "The Governance Project features multiple Project Definition Hierarchies spread across multiple Plugin Workspaces — one Workspace per Project — to facilitate the granular management of definitions by independent teams of maintainers. These are the Governance Workspaces.",
+ "updated": 1630567756861
+ },
+ "paragraphs": [
+ {
+ "style": "Title",
+ "text": "Main Governance Workspace",
+ "updated": 1630568120363
+ },
+ {
+ "style": "Text",
+ "text": "The Token Distribution Superalgos Governance Workspace is the main workspace. Load this workspace to start your interaction with governance. This is where you would usually build and set up your User Profile.",
+ "updated": 1630568963531
+ },
+ {
+ "style": "Title",
+ "text": "Naming Convention"
+ },
+ {
+ "style": "Text",
+ "text": "All Governance Workspaces follow a similar naming structure, to make them easy to spot in the Workspaces Tab:"
+ },
+ {
+ "style": "Json",
+ "text": "Token Distribution XXX Project",
+ "updated": 1630568716919
+ },
+ {
+ "style": "Note",
+ "text": "XXX is replaced with the actual name of the Project.",
+ "updated": 1630568059149
+ },
+ {
+ "style": "Title",
+ "text": "Finding Your Way Arround Governance Workspaces",
+ "updated": 1630568467050
+ },
+ {
+ "style": "Text",
+ "text": "Each of the Governance Workspaces features several Project Definition Hierarchies describing the Pools, Assets, Features, and Positions of the corresponding Project.",
+ "updated": 1630568821141
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Deep in Governance"
+ },
+ {
+ "style": "Text",
+ "text": ""
+ },
+ {
+ "style": "Title",
+ "text": "Superalgos Pools Hierarchy",
+ "updated": 1630568627153
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Superalgos Pools->Definition",
+ "updated": 1630568552530
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Superalgos Pools->Content"
+ },
+ {
+ "style": "Title",
+ "text": "Scope of Calculations",
+ "updated": 1630569279039
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Computational Limitations",
+ "updated": 1630569313627
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Computational Limitations 2"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Workspaces/governance-workspaces-002-token-distribution-superalgos-governance-workspace.json b/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Workspaces/governance-workspaces-002-token-distribution-superalgos-governance-workspace.json
new file mode 100644
index 000000000..fb12f3956
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Workspaces/governance-workspaces-002-token-distribution-superalgos-governance-workspace.json
@@ -0,0 +1,116 @@
+{
+ "topic": "Governance Workspaces",
+ "pageNumber": "2",
+ "type": "Token Distribution Superalgos Governance Workspace",
+ "definition": {
+ "text": "This is the main governance workspace where broad Superalgos Project definitions live.",
+ "updated": 1630575735214
+ },
+ "paragraphs": [
+ {
+ "style": "Title",
+ "text": "Tutorials",
+ "updated": 1630576501552
+ },
+ {
+ "style": "List",
+ "text": "Creating Your User Profile Tutorial",
+ "updated": 1630576522747
+ },
+ {
+ "style": "Title",
+ "text": "User Profiles"
+ },
+ {
+ "style": "List",
+ "text": "Profiles of Core Team members and Community Mods."
+ },
+ {
+ "style": "Title",
+ "text": "Scope of Definitions"
+ },
+ {
+ "style": "Text",
+ "text": "The workspace features definitions that span the whole Superalgos Project.",
+ "updated": 1630576025223
+ },
+ {
+ "style": "Subtitle",
+ "text": "Pools"
+ },
+ {
+ "style": "List",
+ "text": "Superalgos Pools hierarchy.",
+ "updated": 1630576375102
+ },
+ {
+ "style": "Subtitle",
+ "text": "Positions"
+ },
+ {
+ "style": "List",
+ "text": "Superalgos Marketing (project-wide marketing-related positions),",
+ "updated": 1630576292069
+ },
+ {
+ "style": "List",
+ "text": "Superalgos (project-wide positions such as Community Mods, Core Team, or Business Lead).",
+ "updated": 1630576271333
+ },
+ {
+ "style": "Subtitle",
+ "text": "Features"
+ },
+ {
+ "style": "List",
+ "text": "Superalgos (project-wide features such as the Charting Space, the Visual Designer, the Tensor Flow integration, and so on).",
+ "updated": 1630576362020
+ },
+ {
+ "style": "Subtitle",
+ "text": "Assets"
+ },
+ {
+ "style": "List",
+ "text": "Superalgos Exchanges (assets related to exchange listings),",
+ "updated": 1630576480397
+ },
+ {
+ "style": "List",
+ "text": "Superalgos Marketing (project-wide, marketing-related assets),",
+ "updated": 1630576486012
+ },
+ {
+ "style": "List",
+ "text": "Client,",
+ "updated": 1630576385365
+ },
+ {
+ "style": "List",
+ "text": "UI,",
+ "updated": 1630576390127
+ },
+ {
+ "style": "List",
+ "text": "TS,",
+ "updated": 1630576395166
+ },
+ {
+ "style": "List",
+ "text": "Docker,"
+ },
+ {
+ "style": "List",
+ "text": "Launch Scripts,"
+ },
+ {
+ "style": "List",
+ "text": "Root Directory.",
+ "updated": 1630576402835
+ },
+ {
+ "style": "Text",
+ "text": ""
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Workspaces/governance-workspaces-003-other-governance-workspaces.json b/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Workspaces/governance-workspaces-003-other-governance-workspaces.json
new file mode 100644
index 000000000..3a1f300cb
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Topics/G/Governance/Governance-Workspaces/governance-workspaces-003-other-governance-workspaces.json
@@ -0,0 +1,102 @@
+{
+ "topic": "Governance Workspaces",
+ "pageNumber": "3",
+ "type": "Other Governance Workspaces",
+ "definition": {
+ "text": "The term refers to project-specific Governance Workspaces, as opposed to the main Token Distribution Superalgos Governance Workspace. Project-specific workspaces have a similar layout, as different projects usually have the same kinds of Assets, Features, Positions, and Pools categories.",
+ "updated": 1630597429410
+ },
+ "paragraphs": [
+ {
+ "style": "Title",
+ "text": "User Profiles",
+ "updated": 1630580093825
+ },
+ {
+ "style": "List",
+ "text": "Core Team members only, to keep the workspaces light."
+ },
+ {
+ "style": "Title",
+ "text": "Scope of Definitions"
+ },
+ {
+ "style": "Subtitle",
+ "text": "Pools"
+ },
+ {
+ "style": "List",
+ "text": "Superalgos Pools hierarchy (present in all Governance Workspaces for usability reasons)."
+ },
+ {
+ "style": "List",
+ "text": "A project-specific Pools hierarchy (for instance, Foundation-Project or Education-Project) defining pools for the main areas of the software, including pools for assets, features, positions, bug fixes, and improvements.",
+ "updated": 1630580570265
+ },
+ {
+ "style": "List",
+ "text": "A project-specific Pools hierarchy for assets (for instance, Foundations-Project-Assets or Education-Project-Assets), providing a more granular definition of various pools for several categories of assets, such as user interface, task server, app schemas, custom code, education, multi media,, and plugins.",
+ "updated": 1630581068210
+ },
+ {
+ "style": "Subtitle",
+ "text": "Positions"
+ },
+ {
+ "style": "List",
+ "text": "A project-specific Positions hierarchy (for instance Foundation-Project or Education-Project) defining positions such as the project's lead developer or bug hunters."
+ },
+ {
+ "style": "Subtitle",
+ "text": "Features"
+ },
+ {
+ "style": "List",
+ "text": "A project-specific Features hierarchy (for instance, Foundation-Project or Education-Project) usually defining project-specific features."
+ },
+ {
+ "style": "Subtitle",
+ "text": "Assets"
+ },
+ {
+ "style": "Text",
+ "text": "Several project-specific Assets hierarchies defining multiple catetories of assets, such as:"
+ },
+ {
+ "style": "List",
+ "text": "Client,"
+ },
+ {
+ "style": "List",
+ "text": "UI,"
+ },
+ {
+ "style": "List",
+ "text": "TS,"
+ },
+ {
+ "style": "List",
+ "text": "Plugins,",
+ "updated": 1630581417046
+ },
+ {
+ "style": "List",
+ "text": "Images,",
+ "updated": 1630581424128
+ },
+ {
+ "style": "List",
+ "text": "Docs,",
+ "updated": 1630581447409
+ },
+ {
+ "style": "List",
+ "text": "App Schemas,"
+ },
+ {
+ "style": "List",
+ "text": "Custom Code",
+ "updated": 1630581460500
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-001-governance-overview.json b/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-001-governance-overview.json
index 2f68b2319..dd916b1ad 100644
--- a/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-001-governance-overview.json
+++ b/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-001-governance-overview.json
@@ -3,8 +3,8 @@
"pageNumber": "1",
"type": "Governance Overview",
"definition": {
- "text": "Governance of the Superalgos Project is distributed among all members of the Superalgos Community willing to participate. You may engage in multiple manners, help drive development in the desired directions, and contribute to nurturing a healthy community. ",
- "updated": 1624697432247
+ "text": "Governance of the Superalgos Project is distributed among all members of the Community willing to participate. You may engage in multiple manners, help drive development in the desired directions, and contribute to nurturing a healthy community.",
+ "updated": 1630424148804
},
"paragraphs": [
{
@@ -50,17 +50,24 @@
},
{
"style": "Callout",
- "text": "This flexibility is a crucial feature that will allow us to evolve the governance system, adapt the game theory behind it, and correct any exploits that people may find over time."
+ "text": "This flexibility is a crucial feature that will allow us to evolve the governance system, adapt the game theory behind it, and correct any exploits that bad actors may find over time.",
+ "updated": 1630424896773
},
{
"style": "Text",
- "text": "Governance is defined across multiple Plugin Workspaces that users may load and contribute to. These workspaces feature the definitions of several hierarchies that determine the relationship of all the concepts affecting governance."
+ "text": "Governance is defined across multiple Governance Workspaces that users may load and contribute to. These workspaces feature the definitions of several hierarchies that determine the relationship of all the concepts affecting governance.",
+ "updated": 1630424913354
},
{
"style": "Text",
"text": "To participate in governance, users must set up and submit a User Profile plugin defining how they intend to exert the influence conferred by their Superalgos SA Token holdings. The influence and participation is defined through different types of programs, votes, and claims.",
"updated": 1629992750219
},
+ {
+ "style": "Text",
+ "text": "The Governance System computes votes and claims in realtime, showing a preview of what the distribution may look like, on the UI.",
+ "updated": 1630425053320
+ },
{
"style": "Include",
"text": "Governance->Concept->Reusable Governance Snippets->Computational Limitations",
@@ -93,7 +100,8 @@
},
{
"style": "List",
- "text": "Any user may obtain (from GitHub) and load historical versions of the software, and run a simulation of the Superalgos SA Token Distribution Process to verify how tokens were distributed in past releases. Notice that, in this case, the absolute number of votes may not be valid as token holdings will have varied; however, any user may validate the relative distribution."
+ "text": "Any user may obtain (from GitHub) and load historical versions of the software, and run a simulation of the Superalgos SA Token Distribution Event to verify how tokens were distributed in past releases. Notice that, in this case, the absolute number of votes may not be valid as token holdings will have varied; however, any user may validate the relative distribution.",
+ "updated": 1630425087155
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-003-governance-programs.json b/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-003-governance-programs.json
new file mode 100644
index 000000000..38d789d7c
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-003-governance-programs.json
@@ -0,0 +1,124 @@
+{
+ "topic": "Introduction to Governance",
+ "pageNumber": "3",
+ "type": "Governance Programs",
+ "definition": {
+ "text": "The Community may participate in multiple Governance Programs, each designed to fulfill a specific goal. Programs are grouped in the following domains: Onboarding Programs, Community Building Programs, Votes and Claims Programs, and Financial Programs.",
+ "updated": 1630425525513
+ },
+ "paragraphs": [
+ {
+ "style": "Title",
+ "text": "Onboarding Programs",
+ "updated": 1630425562962
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Onboarding Programs->Definition",
+ "updated": 1630425699135
+ },
+ {
+ "style": "Subtitle",
+ "text": "Airdrop Program",
+ "updated": 1630425792121
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Airdrop Program->Definition",
+ "updated": 1630425814203
+ },
+ {
+ "style": "Subtitle",
+ "text": "Github Program"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Github Program->Definition",
+ "updated": 1630425836224
+ },
+ {
+ "style": "Title",
+ "text": "Community Building Programs"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Community Building Programs->Definition",
+ "updated": 1630425759750
+ },
+ {
+ "style": "Subtitle",
+ "text": "Referral Program"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Referral Program->Definition"
+ },
+ {
+ "style": "Subtitle",
+ "text": "Support Program"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Support Program->Definition"
+ },
+ {
+ "style": "Subtitle",
+ "text": "Mentorship Program"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Mentorship Program->Definition"
+ },
+ {
+ "style": "Title",
+ "text": "Votes And Claims Programs",
+ "updated": 1630425627375
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Votes And Claims Programs->Definition",
+ "updated": 1630425763995
+ },
+ {
+ "style": "Subtitle",
+ "text": "Claims Program"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Claims Program->Definition"
+ },
+ {
+ "style": "Subtitle",
+ "text": "Voting Program"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Voting Program->Definition"
+ },
+ {
+ "style": "Title",
+ "text": "Financial Programs"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Financial Programs->Definition",
+ "updated": 1630425768655
+ },
+ {
+ "style": "Subtitle",
+ "text": "Staking Program"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Staking Program->Definition"
+ },
+ {
+ "style": "Subtitle",
+ "text": "Delegation Program"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Delegation Program->Definition"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-003-referral-program-overview.json b/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-003-referral-program-overview.json
deleted file mode 100644
index 3e62d8a5f..000000000
--- a/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-003-referral-program-overview.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
- "topic": "Introduction to Governance",
- "pageNumber": "3",
- "type": "Referral Program Overview",
- "definition": {
- "text": "The referral program is one of the Community Building Programs designed to incentivize the promotion of the project, either by word-of-mouth or “en masse” through articles, social media posts, videos, and other forms of influencer marketing.",
- "updated": 1629994461511
- },
- "paragraphs": [
- {
- "style": "Text",
- "text": "In a nutshell, you may earn Superalgos SA Tokens for every user you refer to the project and their descendants!",
- "updated": 1624698280534
- },
- {
- "style": "Text",
- "text": "Users may declare who referred them to Superalgos and pass on some Referral Power to their referrers. The more people you refer, the more Referral Power you may get!",
- "updated": 1630004903819
- },
- {
- "style": "Text",
- "text": "The Referral Power that you get determines the proportion of the tokens allocated to the Referrals Rewards Pool that you may get on each release.",
- "updated": 1630004849661
- },
- {
- "style": "Title",
- "text": "Your Referrers"
- },
- {
- "style": "Text",
- "text": "You declare who your referrers are by establishing references from User Referrer nodes under the Referral Program node to the User Profile of the persons you learned about Superalgos from."
- },
- {
- "style": "Text",
- "text": "There is no hard definition of who or what a referrer is. It is up to you to decide. Maybe you learned about Superalgos from an article, a video, a comment on Reddit, a tweet, the official website, or someone told you about us!"
- },
- {
- "style": "Success",
- "text": "Declaring your referrers is the best way to thank the person that may have written that article or tweet, produced that video, maintained the website, or the friend who told you about Superalgos! Without them, you probably wouldn’t be here yet!"
- },
- {
- "style": "Title",
- "text": "Token Bonus"
- },
- {
- "style": "Text",
- "text": "The program features a Token Bonus. That is, simply by spawning the program and declaring your referrers, you earn tokens!",
- "updated": 1629996937677
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-004-support-program-overview.json b/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-004-support-program-overview.json
deleted file mode 100644
index 4dade345b..000000000
--- a/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-004-support-program-overview.json
+++ /dev/null
@@ -1,63 +0,0 @@
-{
- "topic": "Introduction to Governance",
- "pageNumber": "4",
- "type": "Support Program Overview",
- "definition": {
- "text": "At Superalgos, we take pride in the level of support we offer to newcomers and the Community in general. We get frequent compliments in that sense, and many users have expressed how impressed they are by the speedy and helpful responses in the Support Groups.",
- "updated": 1624705282082
- },
- "paragraphs": [
- {
- "style": "Text",
- "text": "This is no accident. In fact, it is a crucial aspect of our culture, based above all on collaboration.",
- "updated": 1624705296139
- },
- {
- "style": "Text",
- "text": "Superalgos is a vast system and the learning curve is still quite steep. Many users need help, particularly during the early stages. "
- },
- {
- "style": "Text",
- "text": "While the broader community is always ready to help with typical support questions, we’ve noticed that it takes a certain level of experience and knowledge to provide effective support. This is why select Community Mods are in charge of Support."
- },
- {
- "style": "Text",
- "text": "The Support Program is designed to incentivize participating in support and to let the Community decide how to compensate Community Mods contributing to the project’s support efforts."
- },
- {
- "style": "Success",
- "text": "If you ever wish to become a Community Mod, you may start by participating in the various groups in Telegram, as well as in Discord Channels, helping other users and answering questions from newcomers. We’ll surely spot you and draft you into the team!"
- },
- {
- "style": "Title",
- "text": "Your Favorite Supporters"
- },
- {
- "style": "Text",
- "text": "To designate a supporter, you must spawn the Support Program within the Community Building Programs node, spawn a User Supporter node, and use it to reference the User Profile of the person of your choice. Then you will pass him or her 10% of the Support Power you direct to the User Supporter node!",
- "updated": 1630005725102
- },
- {
- "style": "Note",
- "text": "You may declare as many supporters as you wish.",
- "updated": 1630005323368
- },
- {
- "style": "Text",
- "text": "Community Mods are awarded tokens from the Support Rewards Pool. How many depends on the Support Power they get from users pointing them as their favorite supporters."
- },
- {
- "style": "Success",
- "text": "If you seldom use the support groups, that may be thanks to the effort put in crafting and maintaining tutorials and documentation. If that is your case, then feel free to select the individuals or teams doing this work as your preferred supporters!"
- },
- {
- "style": "Title",
- "text": "Token Bonus"
- },
- {
- "style": "Text",
- "text": "You guessed right! You may earn tokens simply by spawning the program and declaring your favorite supporters!",
- "updated": 1629997651973
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-005-mentorship-program-overview.json b/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-005-mentorship-program-overview.json
deleted file mode 100644
index 3694984d8..000000000
--- a/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-005-mentorship-program-overview.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
- "topic": "Introduction to Governance",
- "pageNumber": "5",
- "type": "Mentorship Program Overview",
- "definition": {
- "text": "Superalgos is a community-driven project designed, nurtured, and incentivized to grow into a massive collaboration. One of the incentives to grow the collaboration is embodied in the Mentorship Program, designed to encourage the recruiting, nurturing, and mentoring of Contributors.",
- "updated": 1624705390084
- },
- "paragraphs": [
- {
- "style": "Text",
- "text": "In a nutshell, when you spawn the Mentorship Program and declare a User Mentor by referencing the User Profile of your mentor, you pass him or her 10% of the Mentorship Power you direct to the User Mentor node!",
- "updated": 1629998677982
- },
- {
- "style": "Text",
- "text": "The core idea is that mentors may earn a percentage of the tokens allocated to the Mentorship Rewards Pool on each release. How much of the pool they get depends on the Mentorship Power they get from their mentees.",
- "updated": 1630005807344
- },
- {
- "style": "Note",
- "text": "This incentive encourages power users to help newcomers with the initial learning curve, all the way until they get to the point in which they may contribute something of value."
- },
- {
- "style": "Title",
- "text": "Your Mentors"
- },
- {
- "style": "Text",
- "text": "You declare who your mentors are by establishing references from User Mentor nodes under the Mentorship Program node to the User Profile of the persons that:",
- "updated": 1629998973037
- },
- {
- "style": "List",
- "text": "helped you with your onboarding;"
- },
- {
- "style": "List",
- "text": "mentored you during the early stages;"
- },
- {
- "style": "List",
- "text": "helped you with your Contributions;"
- },
- {
- "style": "List",
- "text": "produced the educational material you used to learn the system..."
- },
- {
- "style": "Text",
- "text": "Notice that there is no hard definition of who or what a mentor is. It is up to you to decide. Also notice that you may assign arbitrary Mentorship Power to each of your mentors."
- },
- {
- "style": "Success",
- "text": "Declaring your mentors and participating in the program is the best way to thank the people that helped you succeed with Superalgos!"
- },
- {
- "style": "Title",
- "text": "Token Bonus"
- },
- {
- "style": "Text",
- "text": "Yes! This program has a bonus too! Declare your mentors and earn tokens!"
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-006-contribution-claims-program-overview.json b/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-006-contribution-claims-program-overview.json
deleted file mode 100644
index 36717742a..000000000
--- a/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-006-contribution-claims-program-overview.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "topic": "Introduction to Governance",
- "pageNumber": "6",
- "type": "Contribution Claims Program Overview",
- "definition": {
- "text": "When you contribute to Superalgos, you must produce a claim for your contribution, and you must harness the support of the Community that will vouch for or vote for your claims.",
- "updated": 1629999195759
- },
- "paragraphs": [
- {
- "style": "Text",
- "text": "Remember that governance is decentralized! There is no central authority controlling who contributes what. Instead, the project delegates in the Community the capacity to establish the value of Contributions and to determine who contributed what.",
- "updated": 1624705497978
- },
- {
- "style": "Callout",
- "text": "As such, governance is a social system. When you get involved with Superalgos, you interact with the Community and find ways to contribute. While doing so, you relate to or associate with community members that have similar interests or are focused on the same areas of the project you may be working in. It is these people that will vouch for your claims, as explained later on under the Voting Program section."
- },
- {
- "style": "Text",
- "text": "You define your claims under the Claims Program section of the User Profile hierarchy."
- },
- {
- "style": "Text",
- "text": "There are three different types of Contribution Claims you may define:"
- },
- {
- "style": "List",
- "text": "Asset Contribution Claim"
- },
- {
- "style": "List",
- "text": "Feature Contribution Claim"
- },
- {
- "style": "List",
- "text": "Position Contribution Claim"
- },
- {
- "style": "Text",
- "text": "We shall explore each later on."
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-007-voting-program-overview.json b/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-007-voting-program-overview.json
deleted file mode 100644
index 250f99439..000000000
--- a/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-007-voting-program-overview.json
+++ /dev/null
@@ -1,105 +0,0 @@
-{
- "topic": "Introduction to Governance",
- "pageNumber": "7",
- "type": "Voting Program Overview",
- "definition": {
- "text": "The Voting Program allows you to influence how tokens are distributed, effectively influencing the direction of development. You also use votes to vouch for other contributor’s claims, which is a clear expression of your influence in the project as well.",
- "updated": 1624705585070
- },
- "paragraphs": [
- {
- "style": "Text",
- "text": "You may deploy your votes in different manners:",
- "updated": 1624705603842
- },
- {
- "style": "List",
- "text": "Weight Votes allow you to influence which areas of development will be incentivized."
- },
- {
- "style": "List",
- "text": "Claim Votes allow you to support the Contribution Claims of other Contributors so that they may be compensated for their Contributions."
- },
- {
- "style": "List",
- "text": "User Profile Votes allow you to delegate your Voting Power to other users, so that people you trust may vote on topics you are not well versed on, using your power.",
- "updated": 1630055605861
- },
- {
- "style": "Text",
- "text": "You produce these definitions under the Voting Program section of the User Profile hierarchy. Because you define the distribution of votes in a hierarchical structure of nodes, votes flow down the Voting Program section in a cascading style. "
- },
- {
- "style": "Text",
- "text": "By default, each parent node sends an equal number of votes to each offspring. However, you may easily override the default behavior via the configuration of any given node."
- },
- {
- "style": "Title",
- "text": "Weight Votes"
- },
- {
- "style": "Text",
- "text": "Weight votes come in different flavors:"
- },
- {
- "style": "List",
- "text": "Pool Weight Vote"
- },
- {
- "style": "List",
- "text": "Position Weight Vote"
- },
- {
- "style": "List",
- "text": "Asset Weight Vote"
- },
- {
- "style": "List",
- "text": "Feature Weight Vote"
- },
- {
- "style": "Text",
- "text": "The above are the different concepts you may choose to incentivize with your votes. We’ll dive into each at a later time."
- },
- {
- "style": "Callout",
- "text": "The key underlying concept is that the project distributes more tokens to the concepts holding more Weight Votes. This is how you may influence the direction of development of the project, as Contributors are more prone to work on the areas that are more heavily incentivized."
- },
- {
- "style": "Title",
- "text": "Claim Votes"
- },
- {
- "style": "Text",
- "text": "You may set up Claim Votes for each of the types of Contribution Claims mentioned earlier. This is how you support Contributors that have worked close to you, or in areas of the project you are familiar with or active on, so that they may get compensated for their work."
- },
- {
- "style": "Title",
- "text": "Profile Votes"
- },
- {
- "style": "Text",
- "text": "You use Profile Votes to delegate your Voting Power on other users, in a liquid democracy style. This feature may be useful in many different instances. Let’s explore a few examples:"
- },
- {
- "style": "List",
- "text": "You lack expertise in a certain area and wish someone else to direct your Voting Power."
- },
- {
- "style": "List",
- "text": "You wish someone knowledgeable in certain areas of the Project to have more power to influence the direction of development."
- },
- {
- "style": "List",
- "text": "You trust someone and their judgement and want to get behind his or her ideas and support them."
- },
- {
- "style": "Title",
- "text": "Token Bonus"
- },
- {
- "style": "Text",
- "text": "Participating in the decision-making process around governance issues is an important civic duty, and therefore, it is incentivized. Your Voting Power earns you tokens too!"
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-008-delegation-program-overview.json b/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-008-delegation-program-overview.json
deleted file mode 100644
index 6140fca36..000000000
--- a/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-008-delegation-program-overview.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "topic": "Introduction to Governance",
- "pageNumber": "8",
- "type": "Delegation Program Overview",
- "definition": {
- "text": "The Delegation Program allows you to pass on Token Power to other User Profiles for them to use in whatever way they wish. ",
- "updated": 1624705757048
- },
- "paragraphs": [
- {
- "style": "Text",
- "text": "This is another feature with characteristics inspired in liquid democracy, and also plays an important societal function: new Contributors need Claims Power to place their first claims, but — given that they are new to Superalgos — they may hold no tokens.",
- "updated": 1630056075583
- },
- {
- "style": "Text",
- "text": "In such cases, new Contributors may ask their mentors to borrow some Token Power that they may turn into Claims Power to place their first few claims."
- },
- {
- "style": "Callout",
- "text": "As you can see, Superalgos Governance weaves desirable social interactions that cement the collaboration, promote trust, and develop a sense of belonging in the Community."
- },
- {
- "style": "Text",
- "text": "Other reasons why you may wish to delegate Token Power is if you lack the time or knowledge to actively participate in governance, but you don’t want your Voting Power to go to waste."
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-009-staking-program-overview.json b/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-009-staking-program-overview.json
deleted file mode 100644
index 57b91398b..000000000
--- a/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-009-staking-program-overview.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "topic": "Introduction to Governance",
- "pageNumber": "9",
- "type": "Staking Program Overview",
- "definition": {
- "text": "The staking program allows the Superalgos Community to compensate token holders for the sake of holding tokens. Holding tokens may be a valuable contribution that the Community may decide to incentivize at any point.",
- "updated": 1624705892261
- },
- "paragraphs": [
- {
- "style": "Text",
- "text": "It is a very simple program, as it doesn't involve smart contracts or transferring funds out of your wallet.",
- "updated": 1624705902644
- },
- {
- "style": "Text",
- "text": "You may participate in the Staking Program with the Token Power that you haven’t used for other purposes. All you need to do is spawn the program from within the Financials Program node and let some Token Power flow into it.",
- "updated": 1630056267000
- },
- {
- "style": "Success",
- "text": "You will get a tokens from the Staking Rewards Pool proportional to the Staking Power you direct to the program.",
- "updated": 1630056331489
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-2.1-airdrop-program-overview.json b/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-2.1-airdrop-program-overview.json
deleted file mode 100644
index 47f2f55ab..000000000
--- a/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-2.1-airdrop-program-overview.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "topic": "Introduction to Governance",
- "pageNumber": "2.1",
- "type": "Airdrop Program Overview",
- "definition": {
- "text": "We don't like meaningless airdrops. But what if airdrops bring users a step closer to participating in governance?",
- "updated": 1629995579855
- },
- "paragraphs": [
- {
- "style": "Text",
- "text": "The Airdrops program is designed to incentivize users to take the very first step: creating and submitting their User Profiles. This is the sole technical requirement to receive the airdropped tokens and is — at the same time — the first step to participate in governance and contribute to the project.",
- "updated": 1629995714192
- },
- {
- "style": "Success",
- "text": "The Airdrop program distributes the tokens in the Airdrops pool evenly to all existing profiles, with a cap of SA 1,000 per profile, on each release!"
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-2.2-github-program-overview.json b/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-2.2-github-program-overview.json
deleted file mode 100644
index 4dc04f0ae..000000000
--- a/Projects/Governance/Schemas/Docs-Topics/I/Introduction/Introduction-to-Governance/introduction-to-governance-2.2-github-program-overview.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "topic": "Introduction to Governance",
- "pageNumber": "2.2",
- "type": "Github Program Overview",
- "definition": {
- "text": "This program is designed to incentivize users to fork the Superalgos repository, a necessary step to contributing.",
- "updated": 1630004483687
- },
- "paragraphs": [
- {
- "style": "Text",
- "text": "Giving a star and watching the repository is incentivized to make the repository easier to find by developers serching on Github.com.",
- "updated": 1630004556023
- },
- {
- "style": "Success",
- "text": "This program distributes tokens from the Github pool. Maintaining your fork of the Superalgos repository may grant you up to SA 1,000. The same goes for a star, and for watching the repo. That is, this program features a cap of SA 3,000 per user."
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-001-building-your-profile.json b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-001-building-your-profile.json
index c5e33b8f0..8fe39c97c 100644
--- a/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-001-building-your-profile.json
+++ b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-001-building-your-profile.json
@@ -1,6 +1,6 @@
{
"topic": "User Profile",
- "pageNumber": "1",
+ "pageNumber": 1,
"type": "Building Your Profile",
"definition": {
"text": "Building your User Profile involves linking your Governance Address to your identity in Github.com, using the Profile Constructor. ",
@@ -47,7 +47,7 @@
{
"style": "Text",
"text": "You may start with the Token Distribution Superalgos Plugin Workspace so that you may later interact with the top-level Superalgos Project definitions.",
- "updated": 1630067911494
+ "updated": 1630435453964
},
{
"style": "Subtitle",
@@ -151,7 +151,7 @@
"updated": 1630083527720
},
{
- "style": "Text",
+ "style": "Note",
"text": "If you used a mnemonic to authenticate an existing address, you may safely disregard what comes next.",
"updated": 1630083542691
},
@@ -189,13 +189,18 @@
"updated": 1630083271674
},
{
- "style": "Title",
+ "style": "Anchor",
"text": "Import Private Key in a Wallet",
"updated": 1630083092448
},
+ {
+ "style": "Title",
+ "text": "Import Private Key in a Wallet"
+ },
{
"style": "Text",
- "text": "This step is not required for interacting with governance, however, we’ll cover it as you most likely will want to do it at some point, and it is recommended anyway, even if not strictly necessary."
+ "text": "This step is not required for interacting with governance, however, we’ll cover it as you will, most likely, want to do it at some point, and it is recommended anyway, even if not strictly necessary.",
+ "updated": 1630435748864
},
{
"style": "Note",
diff --git a/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-002-user-profile-hierarchy.json b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-002-user-profile-hierarchy.json
index 41d68424f..104e36e56 100644
--- a/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-002-user-profile-hierarchy.json
+++ b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-002-user-profile-hierarchy.json
@@ -1,6 +1,6 @@
{
"topic": "User Profile",
- "pageNumber": "2",
+ "pageNumber": 2,
"type": "User Profile Hierarchy",
"definition": {
"text": "Your User Profile is where you define how you wish to participate in governance.",
diff --git a/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-003-onboarding-programs-intro.json b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-003-onboarding-programs-intro.json
new file mode 100644
index 000000000..37ed8cb26
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-003-onboarding-programs-intro.json
@@ -0,0 +1,20 @@
+{
+ "topic": "User Profile",
+ "pageNumber": 3,
+ "type": "Onboarding Programs Intro",
+ "definition": {
+ "text": "Get on board and earn your first few tokens just by setting up and submitting your User Profile!",
+ "updated": 1630487139929
+ },
+ "paragraphs": [
+ {
+ "style": "Include",
+ "text": "Governance->Node->Onboarding Programs->Definition",
+ "updated": 1630487058848
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Onboarding Programs->Content"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-004-the-airdrop-program.json b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-004-the-airdrop-program.json
new file mode 100644
index 000000000..d21cea330
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-004-the-airdrop-program.json
@@ -0,0 +1,24 @@
+{
+ "topic": "User Profile",
+ "pageNumber": 4,
+ "type": "The Airdrop Program",
+ "definition": {
+ "text": "Superalgos does an airdrop on each release of the software! We wish to welcome you and everyone in the Community onboard and grant you your first few tokens so that you may participate in governance.",
+ "updated": 1630487391797
+ },
+ "paragraphs": [
+ {
+ "style": "Include",
+ "text": "Governance->Node->Airdrop Program->Definition",
+ "updated": 1630487237360
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Airdrop Program->Content"
+ },
+ {
+ "style": "Text",
+ "text": ""
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-005-the-github-program.json b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-005-the-github-program.json
new file mode 100644
index 000000000..cca0a8672
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-005-the-github-program.json
@@ -0,0 +1,20 @@
+{
+ "topic": "User Profile",
+ "pageNumber": 5,
+ "type": "The Github Program",
+ "definition": {
+ "text": "Set yourself up to contribute and help more developers find us on Github!",
+ "updated": 1630494854079
+ },
+ "paragraphs": [
+ {
+ "style": "Include",
+ "text": "Governance->Node->Github Program->Definition",
+ "updated": 1630494807978
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Github Program->Content"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-006-community-building-programs-intro.json b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-006-community-building-programs-intro.json
new file mode 100644
index 000000000..2531e2759
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-006-community-building-programs-intro.json
@@ -0,0 +1,20 @@
+{
+ "topic": "User Profile",
+ "pageNumber": 6,
+ "type": "Community Building Programs Intro",
+ "definition": {
+ "text": "Help us build a strong and healthy Community!",
+ "updated": 1630494969779
+ },
+ "paragraphs": [
+ {
+ "style": "Include",
+ "text": "Governance->Node->Community Building Programs->Definition",
+ "updated": 1630495003728
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Community Building Programs->Content"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-006-the-claims-program.json b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-006-the-claims-program.json
deleted file mode 100644
index d3a3833a1..000000000
--- a/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-006-the-claims-program.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "topic": "User Profile",
- "pageNumber": "6",
- "type": "The Claims Program",
- "definition": {
- "text": "The Claims Program help Contributors get compensation for their work.",
- "updated": 1624734366643
- },
- "paragraphs": [
- {
- "style": "Include",
- "text": "Governance->Node->Claims Program->Definition",
- "updated": 1624734390960
- },
- {
- "style": "Include",
- "text": "Governance->Node->Claims Program->Content"
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-003-the-referral-program.json b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-007-the-referral-program.json
similarity index 51%
rename from Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-003-the-referral-program.json
rename to Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-007-the-referral-program.json
index 9359a94f9..90f10c092 100644
--- a/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-003-the-referral-program.json
+++ b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-007-the-referral-program.json
@@ -1,10 +1,10 @@
{
"topic": "User Profile",
- "pageNumber": "3",
+ "pageNumber": 7,
"type": "The Referral Program",
"definition": {
- "text": "The Referral Program helps people find Superalgos.",
- "updated": 1624732524023
+ "text": "Help us spread the word about Superalgos!",
+ "updated": 1630495118436
},
"paragraphs": [
{
@@ -18,7 +18,8 @@
},
{
"style": "Title",
- "text": "User Referrer"
+ "text": "Your Referrers",
+ "updated": 1630495480122
},
{
"style": "Include",
@@ -27,21 +28,6 @@
{
"style": "Include",
"text": "Governance->Node->User Referrer->Content"
- },
- {
- "style": "Title",
- "text": "Tokens Bonus",
- "updated": 1624732636384
- },
- {
- "style": "Include",
- "text": "Governance->Node->Tokens Bonus->Definition",
- "updated": 1624732644483
- },
- {
- "style": "Text",
- "text": "In the case of the Referral Program, you get your Tokens Bonus tokens from the Referral Bonus Pool.",
- "updated": 1624732742383
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-007-the-voting-program.json b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-007-the-voting-program.json
deleted file mode 100644
index e7232fc1d..000000000
--- a/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-007-the-voting-program.json
+++ /dev/null
@@ -1,84 +0,0 @@
-{
- "topic": "User Profile",
- "pageNumber": "7",
- "type": "The Voting Program",
- "definition": {
- "text": "The Voting Program helps decentralize the distribution of the Superalgos SA Token, and helps distribute the validation of Contributions.",
- "updated": 1624734799887
- },
- "paragraphs": [
- {
- "style": "Include",
- "text": "Governance->Node->Voting Program->Definition",
- "updated": 1624734916658
- },
- {
- "style": "Include",
- "text": "Governance->Node->Voting Program->Content"
- },
- {
- "style": "Title",
- "text": "Votes Switch Node",
- "updated": 1624734967309
- },
- {
- "style": "Include",
- "text": "Governance->Node->Votes Switch->Definition",
- "updated": 1624735025289
- },
- {
- "style": "Include",
- "text": "Governance->Node->Votes Switch->Content",
- "updated": 1624735029611
- },
- {
- "style": "Title",
- "text": "Claim Votes Switch Node",
- "updated": 1624735041939
- },
- {
- "style": "Include",
- "text": "Governance->Node->Claim Votes Switch->Definition",
- "updated": 1624735226284
- },
- {
- "style": "Include",
- "text": "Governance->Node->Claim Votes Switch->Content",
- "updated": 1624735231547
- },
- {
- "style": "Title",
- "text": "Weight Votes Switch Node",
- "updated": 1624735074339
- },
- {
- "style": "Include",
- "text": "Governance->Node->Weight Votes Switch->Definition",
- "updated": 1624735085264
- },
- {
- "style": "Include",
- "text": "Governance->Node->Weight Votes Switch->Content",
- "updated": 1624735088260
- },
- {
- "style": "Title",
- "text": "User Profile Switch Node",
- "updated": 1624735319623
- },
- {
- "style": "Include",
- "text": "Governance->Node->User Profile Votes Switch->Definition",
- "updated": 1624735290341
- },
- {
- "style": "Title",
- "text": "User Profile Vote Node",
- "updated": 1624735333779
- },
- {
- "style": "Include",
- "text": "Governance->Node->User Profile Vote->Definition"
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-004-the-support-program.json b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-008-the-support-program.json
similarity index 76%
rename from Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-004-the-support-program.json
rename to Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-008-the-support-program.json
index 170aad695..a8d51e094 100644
--- a/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-004-the-support-program.json
+++ b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-008-the-support-program.json
@@ -1,10 +1,10 @@
{
"topic": "User Profile",
- "pageNumber": "4",
+ "pageNumber": 8,
"type": "The Support Program",
"definition": {
- "text": "The Support Program helps new users get better support.",
- "updated": 1624732840040
+ "text": "Let's reward Community Mods so that they keep up the good work, and so that more people want to join the team!",
+ "updated": 1630495305649
},
"paragraphs": [
{
@@ -28,14 +28,6 @@
"style": "Include",
"text": "Governance->Node->User Supporter->Content"
},
- {
- "style": "Title",
- "text": "Token Bonus"
- },
- {
- "style": "Text",
- "text": "The Support program grants you a Token Bonus through the Support Bonus Pool."
- },
{
"style": "Title",
"text": "Becoming a Community Mod"
diff --git a/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-005-the-mentorship-program.json b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-009-the-mentorship-program.json
similarity index 66%
rename from Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-005-the-mentorship-program.json
rename to Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-009-the-mentorship-program.json
index 1a5f18f28..a63fb74c3 100644
--- a/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-005-the-mentorship-program.json
+++ b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-009-the-mentorship-program.json
@@ -1,10 +1,10 @@
{
"topic": "User Profile",
- "pageNumber": "5",
+ "pageNumber": 9,
"type": "The Mentorship Program",
"definition": {
- "text": "The Mentorship Program helps users advance faster to power-user level.",
- "updated": 1624734024802
+ "text": "Helps us reward mentors so that they keep up the good work forming Contributors!",
+ "updated": 1630495605300
},
"paragraphs": [
{
@@ -28,14 +28,6 @@
"style": "Include",
"text": "Governance->Node->User Mentor->Content"
},
- {
- "style": "Title",
- "text": "Tokens Bonus"
- },
- {
- "style": "Text",
- "text": "This program grants you a Tokens Bonus in proportion to the Mentorship Power you let into the program."
- },
{
"style": "Text",
"text": ""
diff --git a/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-010-votes-and-claims-programs-intro.json b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-010-votes-and-claims-programs-intro.json
new file mode 100644
index 000000000..c0cc1deb7
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-010-votes-and-claims-programs-intro.json
@@ -0,0 +1,20 @@
+{
+ "topic": "User Profile",
+ "pageNumber": 10,
+ "type": "Votes And Claims Programs Intro",
+ "definition": {
+ "text": "Help us govern the Superalgos Project!",
+ "updated": 1630495810385
+ },
+ "paragraphs": [
+ {
+ "style": "Include",
+ "text": "Governance->Node->Votes And Claims Programs->Definition",
+ "updated": 1630495822844
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Votes And Claims Programs->Content"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-011-the-claims-program.json b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-011-the-claims-program.json
new file mode 100644
index 000000000..28c799712
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-011-the-claims-program.json
@@ -0,0 +1,90 @@
+{
+ "topic": "User Profile",
+ "pageNumber": 11,
+ "type": "The Claims Program",
+ "definition": {
+ "text": "Tell us what you've done for the project and how we should reward you!",
+ "updated": 1630495910859
+ },
+ "paragraphs": [
+ {
+ "style": "Include",
+ "text": "Governance->Node->Claims Program->Definition",
+ "updated": 1624734390960
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Claims Program->Content"
+ },
+ {
+ "style": "Title",
+ "text": "Three Types of Claim Folders",
+ "updated": 1630496493305
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Claims Folder->Content",
+ "updated": 1630496432492
+ },
+ {
+ "style": "Subtitle",
+ "text": "Asset Claims Folder",
+ "updated": 1630496355821
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Asset Claims Folder->Definition"
+ },
+ {
+ "style": "Subtitle",
+ "text": "Feature Claims Folder",
+ "updated": 1630496368526
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Feature Claims Folder->Definition"
+ },
+ {
+ "style": "Subtitle",
+ "text": "Position Claims Folder"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Position Claims Folder->Definition"
+ },
+ {
+ "style": "Title",
+ "text": "Three Types of Contribution Claims",
+ "updated": 1630496650088
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Claims Content",
+ "updated": 1630496784756
+ },
+ {
+ "style": "Subtitle",
+ "text": "Asset Contribution Claim"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Asset Contribution Claim->Definition"
+ },
+ {
+ "style": "Subtitle",
+ "text": "Feature Contribution Claim"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Feature Contribution Claim->Definition"
+ },
+ {
+ "style": "Subtitle",
+ "text": "Position Contribution Claim"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Position Contribution Claim->Definition"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-012-the-voting-program.json b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-012-the-voting-program.json
new file mode 100644
index 000000000..efb95c9aa
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-012-the-voting-program.json
@@ -0,0 +1,193 @@
+{
+ "topic": "User Profile",
+ "pageNumber": 12,
+ "type": "The Voting Program",
+ "definition": {
+ "text": "Help us decide how what areas of project development to incentivize, and help us validate Contribution Claims!",
+ "updated": 1630496977699
+ },
+ "paragraphs": [
+ {
+ "style": "Include",
+ "text": "Governance->Node->Voting Program->Definition",
+ "updated": 1624734916658
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Voting Program->Content"
+ },
+ {
+ "style": "Title",
+ "text": "Votes Switch Node",
+ "updated": 1624734967309
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Votes Switch->Definition",
+ "updated": 1624735025289
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Votes Switch->Content",
+ "updated": 1624735029611
+ },
+ {
+ "style": "Title",
+ "text": "About Claim Votes",
+ "updated": 1630497203825
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Claim Votes->Definition",
+ "updated": 1630497746423
+ },
+ {
+ "style": "Subtitle",
+ "text": "Claim Votes Switch"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Claim Votes Switch->Definition",
+ "updated": 1624735226284
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Claim Votes Switch->Content",
+ "updated": 1624735231547
+ },
+ {
+ "style": "Subtitle",
+ "text": "Three Types of Claim Votes",
+ "updated": 1630497351240
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Reusable Governance Snippets->Claim Votes Content"
+ },
+ {
+ "style": "Subtitle",
+ "text": "Asset Claim Vote"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Asset Claim Vote->Definition"
+ },
+ {
+ "style": "Subtitle",
+ "text": "Feature Claim Vote"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Feature Claim Vote->Definition"
+ },
+ {
+ "style": "Subtitle",
+ "text": "Position Claim Vote"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Position Claim Vote->Definition"
+ },
+ {
+ "style": "Title",
+ "text": "About Weight Votes",
+ "updated": 1630497602868
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Weight Votes->Definition",
+ "updated": 1630497799945
+ },
+ {
+ "style": "Title",
+ "text": ""
+ },
+ {
+ "style": "Subtitle",
+ "text": "Weight Votes Switch"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Weight Votes Switch->Definition",
+ "updated": 1624735085264
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Weight Votes Switch->Content",
+ "updated": 1624735088260
+ },
+ {
+ "style": "Subtitle",
+ "text": "Three Types of Weight Votes",
+ "updated": 1630498074833
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Weight Votes->Content"
+ },
+ {
+ "style": "Subtitle",
+ "text": ""
+ },
+ {
+ "style": "Subtitle",
+ "text": "Asset Weight Vote"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Asset Weight Vote->Definition"
+ },
+ {
+ "style": "Subtitle",
+ "text": "Feature Weight Vote"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Feature Weight Vote->Definition"
+ },
+ {
+ "style": "Subtitle",
+ "text": "Position Weight Vote"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Position Weight Vote->Definition"
+ },
+ {
+ "style": "Title",
+ "text": "About User Profile Votes",
+ "updated": 1630498579196
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Concept->Liquid Democracy->Definition",
+ "updated": 1630499078885
+ },
+ {
+ "style": "Subtitle",
+ "text": "User Profile Switch"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->User Profile Votes Switch->Definition",
+ "updated": 1624735290341
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->User Profile Votes Switch->Content"
+ },
+ {
+ "style": "Title",
+ "text": "User Profile Vote Node",
+ "updated": 1624735333779
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->User Profile Vote->Definition"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->User Profile Vote->Content"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-013-financial-programs-intro.json b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-013-financial-programs-intro.json
new file mode 100644
index 000000000..171322303
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-013-financial-programs-intro.json
@@ -0,0 +1,20 @@
+{
+ "topic": "User Profile",
+ "pageNumber": 13,
+ "type": "Financial Programs Intro",
+ "definition": {
+ "text": "This is what you may do with the Token Power you're not using for other purposes!",
+ "updated": 1630499936092
+ },
+ "paragraphs": [
+ {
+ "style": "Include",
+ "text": "Governance->Node->Financial Programs->Definition",
+ "updated": 1630499946613
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Financial Programs->Content"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-014-the-staking-program.json b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-014-the-staking-program.json
new file mode 100644
index 000000000..94ad6aa95
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-014-the-staking-program.json
@@ -0,0 +1,20 @@
+{
+ "topic": "User Profile",
+ "pageNumber": 14,
+ "type": "The Staking Program",
+ "definition": {
+ "text": "Staking in Superalgos is as simple as it gets!",
+ "updated": 1630500044430
+ },
+ "paragraphs": [
+ {
+ "style": "Include",
+ "text": "Governance->Node->Staking Program->Definition",
+ "updated": 1630499989010
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Staking Program->Content"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-015-the-delegation-program.json b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-015-the-delegation-program.json
new file mode 100644
index 000000000..aba6a99b0
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Topics/U/User/User-Profile/user-profile-015-the-delegation-program.json
@@ -0,0 +1,46 @@
+{
+ "topic": "User Profile",
+ "pageNumber": 15,
+ "type": "The Delegation Program",
+ "definition": {
+ "text": "Help your colleagues place their first few claims!",
+ "updated": 1630500145104
+ },
+ "paragraphs": [
+ {
+ "style": "Include",
+ "text": "Governance->Node->Delegation Program->Definition",
+ "updated": 1630500092742
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Delegation Program->Content"
+ },
+ {
+ "style": "Subtitle",
+ "text": "Delegate Power Switch",
+ "updated": 1630500226629
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Delegate Power Switch->Definition"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->Delegate Power Switch->Content"
+ },
+ {
+ "style": "Subtitle",
+ "text": "User Delegate",
+ "updated": 1630500262556
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->User Delegate->Definition"
+ },
+ {
+ "style": "Include",
+ "text": "Governance->Node->User Delegate->Content"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-002-tutorial-step-better-together.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-002-tutorial-step-better-together.json
index 3d4f8d763..87ac326eb 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-002-tutorial-step-better-together.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-002-tutorial-step-better-together.json
@@ -3,28 +3,23 @@
"pageNumber": 2,
"type": "Tutorial Step - Better Together",
"definition": {
- "text": "Welcome to Superalgos Governance! Today I will walk you through everything you need to know about creating a Superalgos User Profile and joining the Governance network!",
- "updated": 1629164302622,
+ "text": "This is the Governance Project! Today I will help you create a User Profile and join the first few Governance Programs!",
+ "updated": 1630604953792,
"icon": {
"name": "governance",
"project": "Governance"
}
},
"paragraphs": [
- {
- "style": "Text",
- "text": "As a completely open source and collaborative project, Superalgos is not run by any singular set of people. ",
- "updated": 1629164311647
- },
{
"style": "Note",
- "text": "Even the core team, who are dedicated to improving and maintaining Superalgos, do not directly control the path development will take. ",
- "updated": 1629164322397
+ "text": "But before you start, you should know that you may only submit your profile to the Develop branch, so it's time to switch!",
+ "updated": 1630605011924
},
{
- "style": "Text",
- "text": "Instead, the governance system distributes decision making power across all User Profiles by leveraging the SA token.",
- "updated": 1629701444641
+ "style": "Callout",
+ "text": "Go to the footer and switch both the Contributions Branch and the Current Branch to Develop. Then close and restart the app after the switch! Once you're back, run the app.update command to get up to date with Develop, restart, and only then may you proceed with this tutorial!",
+ "updated": 1630605450785
},
{
"style": "Text",
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-003-tutorial-step-make-sure-you’re-comfortable.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-003-tutorial-step-are-you-ready.json
similarity index 63%
rename from Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-003-tutorial-step-make-sure-you’re-comfortable.json
rename to Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-003-tutorial-step-are-you-ready.json
index a35e99192..b301bb511 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-003-tutorial-step-make-sure-you’re-comfortable.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-003-tutorial-step-are-you-ready.json
@@ -1,7 +1,7 @@
{
"tutorial": "Creating Your User Profile Tutorial",
"pageNumber": 3,
- "type": "Tutorial Step - Make sure You’re Comfortable",
+ "type": "Tutorial Step - Are You Ready?",
"definition": {
"text": "Before you jump into governance, it’s important you know how Superalgos works!",
"updated": 1629720525960,
@@ -13,13 +13,13 @@
"paragraphs": [
{
"style": "Text",
- "text": "We have got a lot of exciting things to talk about, but I want to make sure you can follow along easily. ",
- "updated": 1629164474591
+ "text": "We've got a lot of exciting things to talk about, but I want to make sure you can follow along easily.",
+ "updated": 1630657385662
},
{
"style": "Callout",
- "text": "If you haven't already, make sure you go through the Getting Started Tutorials before continuing!",
- "updated": 1629720338031
+ "text": "Make sure you go through the tutorials in the Getting Started Tutorials Plugin Workspace before continuing if you haven't yet!",
+ "updated": 1630598529991
},
{
"style": "Success",
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-004-tutorial-step-one-token-to-rule-them-all.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-004-tutorial-step-one-token-to-rule-them-all.json
index ca7ba7d54..91b07fe3b 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-004-tutorial-step-one-token-to-rule-them-all.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-004-tutorial-step-one-token-to-rule-them-all.json
@@ -3,8 +3,8 @@
"pageNumber": 4,
"type": "Tutorial Step - One Token to Rule Them All",
"definition": {
- "text": "Unlike some crypto currencies the SA token actually means something!",
- "updated": 1629162158011,
+ "text": "Unlike some crypto tokens the Superalgos SA Token actually means something!",
+ "updated": 1630599078911,
"icon": {
"name": "Programs\\staking-program",
"project": "Governance"
@@ -13,8 +13,8 @@
"paragraphs": [
{
"style": "Text",
- "text": "The SA token is a BEP20 token hosted on the Binance Smart Chain (BSC). It represents your amount of investment in the Superalgos project and community. It is a way to reward and grow the Superalgos user base and development pool.",
- "updated": 1629164803435
+ "text": "The SA Token is a BEP20 token on the Binance Smart Chain (BSC). Your token holdings embody your contributions to the Superalgos Project and Community, as the token is used to reward the user base and grow the development pool.",
+ "updated": 1630657545503
},
{
"style": "Note",
@@ -22,8 +22,8 @@
},
{
"style": "Success",
- "text": "This means that the more you contribute to the project and help others, the more tokens you will earn!",
- "updated": 1629164817915
+ "text": "The more you contribute to the project and help others, the more tokens you will earn!",
+ "updated": 1630657555715
},
{
"style": "Text",
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-005-tutorial-step-with-tokens-comes-responsibility.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-005-tutorial-step-with-tokens-comes-responsibility.json
index b39d93694..4de5e9ed6 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-005-tutorial-step-with-tokens-comes-responsibility.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-005-tutorial-step-with-tokens-comes-responsibility.json
@@ -3,8 +3,8 @@
"pageNumber": 5,
"type": "Tutorial Step - With Tokens Comes Responsibility",
"definition": {
- "text": "Holding tokens does more than just show commitment. SA tokens also confer governance power!",
- "updated": 1629162449407,
+ "text": "Holding tokens does more than just show commitment. SA Tokens also confer Token Power!",
+ "updated": 1630605735788,
"icon": {
"name": "governance",
"project": "Governance"
@@ -13,7 +13,7 @@
"paragraphs": [
{
"style": "Text",
- "text": "The more tokens you hold the more influence you can have over the direction of the project. This means, by owning SA tokens, you hold the power to use those tokens to exert influence over what parts of the system will be developed and how the community will evolve.",
+ "text": "The more tokens you hold the more influence you can have over the direction of the project. This means, by owning SA Tokens, you hold the power to use those tokens to exert influence over what parts of the system will be developed and how the community will evolve.",
"updated": 1629165111109
},
{
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-006-tutorial-step-a-mighty-meritocracy.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-006-tutorial-step-a-mighty-meritocracy.json
index a666f5b4a..000726f27 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-006-tutorial-step-a-mighty-meritocracy.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-006-tutorial-step-a-mighty-meritocracy.json
@@ -3,8 +3,8 @@
"pageNumber": 6,
"type": "Tutorial Step - A Mighty Meritocracy",
"definition": {
- "text": "Superalgos does not reward freeloading! Real contributions to the project and community are what get rewarded with SA tokens and Governance power.",
- "updated": 1629162653518,
+ "text": "Superalgos does not reward freeloading! Real contributions to the project and community are what get rewarded with tokens and Token Power.",
+ "updated": 1630605807061,
"icon": {
"name": "Position\\positions",
"project": "Governance"
@@ -13,8 +13,8 @@
"paragraphs": [
{
"style": "Text",
- "text": "The fancy word for this kind of project governance is meritocracy. In other words, the more you contribute to the improvement of Superalgos and to the support of our community, the more Token Power you earn to influence the future of the Superalgos project.",
- "updated": 1629979557344
+ "text": "The fancy word for this kind of project governance is meritocracy. In other words, the more you contribute to the improvement of Superalgos and to the support of our Community, the more Token Power and Reputation you earn to influence the future of the project.",
+ "updated": 1630605980783
},
{
"style": "Note",
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-007-tutorial-step-a-worthy-contribution.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-007-tutorial-step-a-worthy-contribution.json
index cd56c6995..734e56557 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-007-tutorial-step-a-worthy-contribution.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-007-tutorial-step-a-worthy-contribution.json
@@ -13,8 +13,8 @@
"paragraphs": [
{
"style": "Success",
- "text": "Each of us bring unique talents and experience into our work with Superalgos. Even if you are not a programmer or expert trader there is still ways for you to get involved and grow the project!",
- "updated": 1629165838038
+ "text": "Each of us bring unique talents and experience into our work with Superalgos. Even if you are not a programmer or expert trader there is still ways for you to get involved!",
+ "updated": 1630606036389
},
{
"style": "Text",
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-008-tutorial-step-what’s-in-a-profile.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-008-tutorial-step-what’s-in-a-profile.json
index 48fd4ee5d..f813f4564 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-008-tutorial-step-what’s-in-a-profile.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-008-tutorial-step-what’s-in-a-profile.json
@@ -3,8 +3,8 @@
"pageNumber": 8,
"type": "Tutorial Step - What’s in a Profile?",
"definition": {
- "text": "So what are we waiting for? Let’s get started! To participate in Governance you will first need a User Profile.",
- "updated": 1629163040597,
+ "text": "So what are we waiting for? Let’s get started! To participate in Governance you will need a User Profile.",
+ "updated": 1630657682741,
"icon": {
"name": "User\\user-profile",
"project": "Governance"
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-009-tutorial-step-program-participation.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-009-tutorial-step-program-participation.json
index 1db88f069..1010dff7c 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-009-tutorial-step-program-participation.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-009-tutorial-step-program-participation.json
@@ -3,8 +3,8 @@
"pageNumber": 9,
"type": "Tutorial Step - Program Participation",
"definition": {
- "text": "How you use your Token Power is defined within a number of different Programs within your profile hierarchy.",
- "updated": 1629163374967,
+ "text": "How you use your Token Power is defined within a number of Governance Programs within your profile hierarchy.",
+ "updated": 1630657749389,
"icon": {
"name": "User\\user-referrer",
"project": "Governance"
@@ -13,8 +13,8 @@
"paragraphs": [
{
"style": "Text",
- "text": "These programs help organize the types of development and community relationships you want to reward. ",
- "updated": 1629166399952
+ "text": "These programs help organize the types of development and community relationships you want to reward.",
+ "updated": 1630657777891
},
{
"style": "Note",
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-010-tutorial-step-where-it-all-begins.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-010-tutorial-step-where-it-all-begins.json
index 9213c021c..d85b6921f 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-010-tutorial-step-where-it-all-begins.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-010-tutorial-step-where-it-all-begins.json
@@ -3,8 +3,8 @@
"pageNumber": 10,
"type": "Tutorial Step - Where it all Begins",
"definition": {
- "text": "Here we are at the head of the governance project. Let’s get that profile created!",
- "updated": 1629163572836,
+ "text": "Here we are at the head of the Governance Project hierarchy. Let’s get that profile created!",
+ "updated": 1630599538627,
"icon": {
"name": "governance",
"project": "Governance"
@@ -13,13 +13,13 @@
"paragraphs": [
{
"style": "Callout",
- "text": "Click the Add Profile Constructor button.",
- "updated": 1629163599518
+ "text": "Click the Add Profile Constructor button.",
+ "updated": 1630657850442
},
{
"style": "Text",
- "text": "Now position the resulting Profile Constructor node where it is easy to see.",
- "updated": 1629163626525
+ "text": "Now position the resulting Profile Constructor node where it is easy to see and work with.",
+ "updated": 1630657866373
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-011-tutorial-step-profile-in-a-heartbeat.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-011-tutorial-step-profile-in-a-heartbeat.json
index b7da32094..84709af6b 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-011-tutorial-step-profile-in-a-heartbeat.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-011-tutorial-step-profile-in-a-heartbeat.json
@@ -13,8 +13,8 @@
"paragraphs": [
{
"style": "Text",
- "text": "Not only that but it will create a unique Binance Smart Chain wallet that is connected with your profile. We call it your Governance Address.",
- "updated": 1629166742408
+ "text": "It will create a unique Binance Smart Chain wallet that is connected with your profile: your Governance Address.",
+ "updated": 1630657968476
},
{
"style": "Note",
@@ -23,8 +23,8 @@
},
{
"style": "Text",
- "text": "Your Governance Address will allow you to receive the SA tokens you earn. Superalgos will also read the balance of this address to become aware of the number of SA tokens you hold, and assign your profile an equivalent amount of Token Power.",
- "updated": 1629166705049
+ "text": "Your Governance Address will allow you to receive the SA Tokens you earn. Superalgos will read the balance of this address to become aware of the number of SA Tokens you hold, and assign your profile an equivalent amount of Token Power.",
+ "updated": 1630606362346
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-012-tutorial-step-pump-that-heartbeat.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-012-tutorial-step-pump-that-heartbeat.json
index 49d91b33b..958154546 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-012-tutorial-step-pump-that-heartbeat.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-012-tutorial-step-pump-that-heartbeat.json
@@ -3,8 +3,8 @@
"pageNumber": 12,
"type": "Tutorial Step - Pump that Heartbeat!",
"definition": {
- "text": "Now let’s configure that Profile Constructor!",
- "updated": 1629167519082,
+ "text": "Now let’s configure the Profile Constructor so that we may later build the profile!",
+ "updated": 1630658339365,
"icon": {
"name": "configuration",
"project": "Governance"
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-013-tutorial-step-oh-so-shiny.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-013-tutorial-step-oh-so-shiny.json
index 04e02c7e7..efbbf0908 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-013-tutorial-step-oh-so-shiny.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-013-tutorial-step-oh-so-shiny.json
@@ -3,12 +3,12 @@
"pageNumber": 13,
"type": "Tutorial Step - Oh so Shiny",
"definition": {
- "text": "We are almost there. Now click Build Profile and watch the magic happen. That’s right, you just created your profile!",
+ "text": "We are almost there. Now click Build Profile and watch the magic happen. That’s right, you just created your profile!",
"icon": {
"name": "User\\user-profile",
"project": "Governance"
},
- "updated": 1629721281167
+ "updated": 1630658421560
},
"paragraphs": [
{
@@ -18,8 +18,8 @@
},
{
"style": "Note",
- "text": "The constructor just generated your user profile, and either linked your address or created a unique SA Token Governance address. ",
- "updated": 1629553674568
+ "text": "The constructor just generated your user profile, and either linked your address or created a unique SA Token Governance Address.",
+ "updated": 1630599816232
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-014-tutorial-step-only-you.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-014-tutorial-step-only-you.json
index 0e89ea513..8fcd677a2 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-014-tutorial-step-only-you.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-014-tutorial-step-only-you.json
@@ -3,8 +3,8 @@
"pageNumber": 14,
"type": "Tutorial Step - Only You",
"definition": {
- "text": "The profile constructor also did some work to make sure only you can change your profile.",
- "updated": 1629553865897,
+ "text": "The Profile Constructor also did some work to make sure only you can change your profile.",
+ "updated": 1630658478769,
"icon": {
"name": "User\\user-profile",
"project": "Governance"
@@ -13,13 +13,13 @@
"paragraphs": [
{
"style": "Text",
- "text": "A cryptographic message with your GitHub.com username has been signed with the private key corresponding to your governance address. This message will be stored in your User Profile so that we may authenticate it comes from you once you submit your profile as a plugin to the Governance Project.",
- "updated": 1629553908808
+ "text": "A cryptographic message with your GitHub.com username has been signed with the private key corresponding to your Governance Address. This message will be stored in your User Profile so that we may authenticate it comes from you once you submit your profile as a plugin to the Governance Project.",
+ "updated": 1630658507981
},
{
"style": "Success",
- "text": ". What this means is that your profile, and its associated token address, can only be accessed and changed by you!",
- "updated": 1629553923815
+ "text": "What this means is that your profile and its associated token address can only be accessed and changed by you!",
+ "updated": 1630606585784
},
{
"style": "Text",
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-015-tutorial-step-under-the-hood.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-015-tutorial-step-under-the-hood.json
index c742f3f2c..8daf08a1f 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-015-tutorial-step-under-the-hood.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-015-tutorial-step-under-the-hood.json
@@ -3,8 +3,8 @@
"pageNumber": 15,
"type": "Tutorial Step - Under the Hood",
"definition": {
- "text": "Let's take a little closer look at the cryptographic signature in your new profile.",
- "updated": 1629554334739,
+ "text": "Let's take a closer look at the cryptographic signature in your new profile.",
+ "updated": 1630658552742,
"icon": {
"name": "User\\user-profile",
"project": "Governance"
@@ -17,7 +17,7 @@
"updated": 1629554250933
},
{
- "style": "Text",
+ "style": "Note",
"text": "Wow that’s a lot of numbers! Again, this is how the governance system will know that this User Profile belongs to the private key that signed the message, which in turn belongs to the address that will hold the tokens that confer your profile with Token Power.",
"updated": 1629554289159
}
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-016-tutorial-step-save-the-key.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-016-tutorial-step-save-the-key.json
index 9a27fed54..d871ced66 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-016-tutorial-step-save-the-key.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-016-tutorial-step-save-the-key.json
@@ -3,8 +3,8 @@
"pageNumber": 16,
"type": "Tutorial Step - Save the Key!",
"definition": {
- "text": "Now that you have a new rocking Profile, let’s talk some more about that private key. ",
- "updated": 1629554694993,
+ "text": "Now that you have a new rocking User Profile, let’s talk some more about that private key.",
+ "updated": 1630658607513,
"icon": {
"name": "Key\\key-reference",
"project": "Foundations"
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-017-tutorial-step-profile-backup.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-017-tutorial-step-profile-backup.json
index 5e59653f2..e64a81188 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-017-tutorial-step-profile-backup.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-017-tutorial-step-profile-backup.json
@@ -3,8 +3,8 @@
"pageNumber": 17,
"type": "Tutorial Step - Profile Backup",
"definition": {
- "text": "Later on, you will be rewarded with Superalgos SA Tokens to the address you just generated. But before that happens, you must safely store the private key that you will use to access the address.",
- "updated": 1629579328664,
+ "text": "Your Superalgos SA Token rewards will go to the address you just generated, so you should safely store the private key that you will use to access the address.",
+ "updated": 1630658720175,
"icon": {
"name": "Exchange\\exchange-account-asset",
"project": "Foundations"
@@ -12,14 +12,14 @@
},
"paragraphs": [
{
- "style": "Text",
- "text": "At this point, Superalgos doesn’t offer a built-in solution to securely back up your private keys. All the system does is generate a BSC address / private key pair and deliver it in the configuration of the Profile Constructor node. It is up to you to decide how you are going to handle this sensitive information.",
- "updated": 1629578959187
+ "style": "Important",
+ "text": "Superalgos doesn’t offer a built-in solution to securely back up your private keys. The system generates a BSC address / private key pair and delivers it in the configuration of the Profile Constructor. It is up to you to decide how you are going to handle this sensitive information.",
+ "updated": 1630658807597
},
{
"style": "Callout",
- "text": "Access the configuration of the Profile Constructor. You will find the address and private key, so that you may back up the information in whatever way you see fit.",
- "updated": 1629578990303
+ "text": "Access the configuration of the Profile Constructor. Find the address and private key, and back up the information in whatever way you see fit.",
+ "updated": 1630600071978
},
{
"style": "Text",
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-019-tutorial-step-program-partners.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-019-tutorial-step-program-partners.json
index c79a6876d..e090b7385 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-019-tutorial-step-program-partners.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-019-tutorial-step-program-partners.json
@@ -3,8 +3,8 @@
"pageNumber": 19,
"type": "Tutorial Step - Program Partners",
"definition": {
- "text": "You have successfully created your profile! You are now set up to be able to participate in all the various Governance programs!\n",
- "updated": 1629924832003,
+ "text": "You have successfully created your profile! You are now set up to participate in all the various Governance Programs!",
+ "updated": 1630606740196,
"icon": {
"name": "Programs\\onboarding-programs",
"project": "Governance"
@@ -13,16 +13,17 @@
"paragraphs": [
{
"style": "Text",
- "text": "The onboarding programs are your first stop into the world of Superalgos governance. So let’s add them to your profile! ",
- "updated": 1629925086766
- },
- {
- "style": "Success",
- "text": "Under your user profile you will find the Token Power Switch node."
+ "text": "The Onboarding Programs are your first stop into the world of Superalgos governance. So let’s add them to your profile!",
+ "updated": 1630600253110
},
{
"style": "Callout",
- "text": "On the Token Power Switch click Add Onboarding Programs."
+ "text": "Find the Token Power Switch node under the User Profile node and click Add Onboarding Programs on the menu.",
+ "updated": 1630658978533
+ },
+ {
+ "style": "Success",
+ "text": "The Onboarding Programs node should pop up as an offspring of the Token Power Switch."
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-020-tutorial-step-drop-it-like-it’s-hot.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-020-tutorial-step-drop-it-like-it’s-hot.json
index bdc269e2d..e0643288b 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-020-tutorial-step-drop-it-like-it’s-hot.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-020-tutorial-step-drop-it-like-it’s-hot.json
@@ -3,8 +3,8 @@
"pageNumber": 20,
"type": "Tutorial Step - Drop it like it’s Hot",
"definition": {
- "text": "Being a part of the Governance network is a valuable contribution! As such the airdrop program rewards you with tokens just for being here!",
- "updated": 1629925355949,
+ "text": "Taking part in governance is a valuable contribution! As such the Airdrop Program rewards you with tokens on every release!",
+ "updated": 1630606894763,
"icon": {
"name": "Programs\\airdrop-program",
"project": "Governance"
@@ -13,18 +13,18 @@
"paragraphs": [
{
"style": "Text",
- "text": "The SA token is not a meaningless crypto currency. Consequently, we are not a fan of mindless airdrops. However, since you took the time to create your User Profile you deserve some tokens!",
- "updated": 1629925482831
+ "text": "We are not a fan of mindless airdrops. However, since you took the time to learn Superalgos and create your User Profile, you deserve a reward!",
+ "updated": 1630606981664
},
{
"style": "Callout",
- "text": "On the Onboarding Programs node click Add Airdrop Program",
- "updated": 1629925540228
+ "text": "On the Onboarding Programs node click Add Airdrop Program .",
+ "updated": 1630607006405
},
{
"style": "Success",
- "text": "Now you will receive 1,000 SA tokens at the next distribution if you submit a PR with your User Profile! We'll get to that!",
- "updated": 1629980519400
+ "text": "Just by deploying the program, you are all set to get up to 1,000 SA Tokens at the next Distribution Event and on every other future release provided that you submit your User Profile!",
+ "updated": 1630659363719
}
]
}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-021-tutorial-step-github-glory.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-021-tutorial-step-github-glory.json
index 8ae52f8a6..8bc315db9 100644
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-021-tutorial-step-github-glory.json
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-021-tutorial-step-github-glory.json
@@ -3,18 +3,22 @@
"pageNumber": 21,
"type": "Tutorial Step - GitHub Glory",
"definition": {
- "text": "The GitHub Program allows you to receive some tokens for starting to get involved with the project!",
- "updated": 1629926259120,
+ "text": "Now, the Github Program rewards you with more tokens for helping developers find Superalgos on Github.com search!",
+ "updated": 1630601440266,
"icon": {
"name": "Programs\\github-program",
"project": "Governance"
}
},
"paragraphs": [
+ {
+ "style": "Callout",
+ "text": "Add the Github Program from the menu of the Onboarding Programs node.",
+ "updated": 1630601229528
+ },
{
"style": "Text",
- "text": "There are three ways to gain more tokens with the Github Program. Doing all three will land you a nice Token bonus!",
- "updated": 1629926280944
+ "text": "There are three things you can help with! Doing all three may land you up to SA 3,000 more!"
},
{
"style": "List",
@@ -22,16 +26,18 @@
},
{
"style": "List",
- "text": "Fork the Superalgos repository to your Github account.",
- "updated": 1629926002868
+ "text": "Fork the Superalgos repository to your Github account — you probably have already!",
+ "updated": 1630600687531
},
{
"style": "List",
- "text": "Watch the Superalgos repository with your Github account."
+ "text": "Click the Watch button too!",
+ "updated": 1630601314552
},
{
- "style": "Callout",
- "text": "Adding the Github program is just like adding the Airdrop Program! On the Onboarding Programs node click Add Github Program."
+ "style": "Link",
+ "text": "Go to the Superalgos repo to click the Star and Watch buttons. Make sure you have a fork too!->github.com/Superalgos/Superalgos",
+ "updated": 1630601392808
},
{
"style": "Text",
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-022-tutorial-step-how-github-works.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-022-tutorial-step-how-github-works.json
new file mode 100644
index 000000000..8c3ee0c46
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-022-tutorial-step-how-github-works.json
@@ -0,0 +1,35 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 22,
+ "type": "Tutorial Step - How Github Works",
+ "definition": {
+ "text": "Github.com bumps up the search ranking of projects when they have many stars, forks, and people watching the repository!",
+ "updated": 1630659929485,
+ "icon": {
+ "name": "Programs\\github-program",
+ "project": "Governance"
+ }
+ },
+ "paragraphs": [
+ {
+ "style": "Note",
+ "text": "That is why we ask you to help in this manner! By completing those three tasks, you are effectively helping more developers find Superalgos, which is a win for everyone, as the more developers, the faster the project advances!",
+ "updated": 1630660356226
+ },
+ {
+ "style": "Text",
+ "text": "Now, this is how it works on the side of Superalgos:",
+ "updated": 1630659982457
+ },
+ {
+ "style": "List",
+ "text": "The system checks the repository and verifies if your Github account has a star, a fork, and/or a watch.",
+ "updated": 1630660104845
+ },
+ {
+ "style": "List",
+ "text": "There is a cap of SA 1,000 for each of these incentives. This means that you may get up to SA 3,000 if you maximize your participation.",
+ "updated": 1630660329237
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-022-tutorial-step-make-it-official.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-022-tutorial-step-make-it-official.json
deleted file mode 100644
index 88e0f7006..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-022-tutorial-step-make-it-official.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
- "tutorial": "Creating Your User Profile Tutorial",
- "pageNumber": 22,
- "type": "Tutorial Step - Make it Official",
- "definition": {
- "text": "Now we are ready to push your new profile to the main Superalgos repository! ",
- "updated": 1629583003718,
- "icon": {
- "name": "Programs\\github-program",
- "project": "Governance"
- }
- },
- "paragraphs": [
- {
- "style": "Text",
- "text": "If you have gone through the welcome tutorials already, you should have set up your GitHub authentication and submitted a review. Submitting your profile will be exactly the same. Easy right!",
- "updated": 1629583038275
- },
- {
- "style": "Warning",
- "text": "If this sounds strange to you. Read the docs page open to the right and go through the steps to set up your GitHub authentication. Then come back here and we'll finish up!",
- "updated": 1629583121545
- },
- {
- "style": "Text",
- "text": ""
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-023-tutorial-step-save-your-profile.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-023-tutorial-step-save-your-profile.json
new file mode 100644
index 000000000..7265322fa
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-023-tutorial-step-save-your-profile.json
@@ -0,0 +1,29 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 23,
+ "type": "Tutorial Step - Save Your Profile!",
+ "definition": {
+ "text": "Cool! We've covered the basics! Now you have a working User Profile and are already participating in the first two Governance Programs!",
+ "updated": 1630601962359,
+ "icon": {
+ "name": "backup-entity",
+ "project": "Foundations"
+ }
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "It's time to save your User Profile! ",
+ "updated": 1630603392015
+ },
+ {
+ "style": "Callout",
+ "text": "Click Ctrl + Shift + Alt + Key-S to save the Current Workspace."
+ },
+ {
+ "style": "Success",
+ "text": "We set your profile to save as a Plugin every time you save the workspace! So that should save your User Profile too! ",
+ "updated": 1630603485216
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-023-tutorial-step-to-infinity-and-beyond.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-023-tutorial-step-to-infinity-and-beyond.json
deleted file mode 100644
index 7d29b9218..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-023-tutorial-step-to-infinity-and-beyond.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "tutorial": "Creating Your User Profile Tutorial",
- "pageNumber": 23,
- "type": "Tutorial Step - To Infinity and Beyond",
- "definition": {
- "text": "If you have submitted a review then you are ready to go. We will be using the app.contribute command again to finish submitting your profile.",
- "updated": 1629583914664,
- "icon": {
- "name": "User\\user-profile",
- "project": "Governance"
- }
- },
- "paragraphs": [
- {
- "style": "Callout",
- "text": "Go to the docs panel and type the following command into the search bar:",
- "updated": 1629726858200
- },
- {
- "style": "Json",
- "text": "app.contribute This is my first submission of User Profile [add your name here]",
- "updated": 1629726765903
- },
- {
- "style": "Text",
- "text": "If everything is set up correctly you should see the message appear that your pull request has been submitted. This means that your profile has been sent to the main Superalgos repository and will be automatically merged in just a few minutes!"
- },
- {
- "style": "Text",
- "text": ""
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-024-tutorial-step-low-hanging-fruit.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-024-tutorial-step-low-hanging-fruit.json
new file mode 100644
index 000000000..cbac2e8a5
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-024-tutorial-step-low-hanging-fruit.json
@@ -0,0 +1,30 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 24,
+ "type": "Tutorial Step - Low Hanging Fruit",
+ "definition": {
+ "text": "Now I'll hook you up with the Community Building Programs, which are also quite easy to set up and will earn you more tokens!",
+ "updated": 1630660957861,
+ "icon": {
+ "name": "Programs\\community-building-programs",
+ "project": "Governance"
+ }
+ },
+ "paragraphs": [
+ {
+ "style": "Callout",
+ "text": "Go to the Token Power Switch node and select Add Comunity Building Programs from the menu.",
+ "updated": 1630661290597
+ },
+ {
+ "style": "Note",
+ "text": "Superalgos thrives through contributions and collaboration. We designed these programs to foster a community in which members are always ready to help and give back!",
+ "updated": 1630661420122
+ },
+ {
+ "style": "Success",
+ "text": "These programs are a bit more elaborate in their workings... you'll love them!",
+ "updated": 1630661576265
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-024-tutorial-step-welcome-aboard.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-024-tutorial-step-welcome-aboard.json
deleted file mode 100644
index b47887ced..000000000
--- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-024-tutorial-step-welcome-aboard.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "tutorial": "Creating Your User Profile Tutorial",
- "pageNumber": 24,
- "type": "Tutorial Step - Welcome aboard!",
- "definition": {
- "text": "You did it! You are now officially a part of the Superalgos governance community! Now that you have a profile, there are a few important things to do.",
- "updated": 1629984755637,
- "icon": {
- "name": "Announcement\\announcement",
- "project": "Foundations"
- }
- },
- "paragraphs": [
- {
- "style": "Text",
- "text": "If you generated a Governance address using the profile constructor then you may want to connect that address to a wallet so that you have control of your tokens.",
- "updated": 1629984765258
- },
- {
- "style": "Note",
- "text": "You will find guides for how to do this under the Building Your Profile topic in the docs.",
- "updated": 1630009326066
- },
- {
- "style": "Text",
- "text": "Not only that, but you will want to begin participating in all of the exciting governance programs available! My friend here will take you through that next step in your governance journey.",
- "updated": 1629585212515
- }
- ]
-}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-025-tutorial-step-ill-lay-out-the-basics.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-025-tutorial-step-ill-lay-out-the-basics.json
new file mode 100644
index 000000000..c1dda1c1c
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-025-tutorial-step-ill-lay-out-the-basics.json
@@ -0,0 +1,34 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 25,
+ "type": "Tutorial Step - I'll Lay Out the Basics",
+ "definition": {
+ "text": "All Community Building Programs have two built-in types of incentives: a Tokens Bonus, and Tokens Awarded by the program.",
+ "icon": {
+ "name": "Programs\\community-building-programs",
+ "project": "Governance"
+ },
+ "updated": 1630664341967
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "In general terms, this is how it works:",
+ "updated": 1630664598834
+ },
+ {
+ "style": "List",
+ "text": "Tokens Bonus: It's an incentive to participate in the program. You earn these tokens simply by fulfilling the participation rules."
+ },
+ {
+ "style": "List",
+ "text": "Tokens Awarded: These programs incentivize desirable behaviors. If you constructively participate in the Community, then you will earn more tokens!",
+ "updated": 1630664896700
+ },
+ {
+ "style": "Success",
+ "text": "The interesting bit about these programs is that they reward chains of collaborations! Let's explore this concept within the Referral Program!",
+ "updated": 1630664769086
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-026-tutorial-step-the-referral-program.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-026-tutorial-step-the-referral-program.json
new file mode 100644
index 000000000..6bbe17202
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-026-tutorial-step-the-referral-program.json
@@ -0,0 +1,40 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 26,
+ "type": "Tutorial Step - The Referral Program",
+ "definition": {
+ "text": "The Referral Program incentivizes the promotion of the project, either by word-of-mouth or “en masse” through articles, social media posts, videos, and other forms of influencer marketing!",
+ "updated": 1630665298091,
+ "icon": {
+ "name": "Programs\\referral-program",
+ "project": "Governance"
+ }
+ },
+ "paragraphs": [
+ {
+ "style": "Callout",
+ "text": "Go to the Community Building Programs node and click Add Referral Program .",
+ "updated": 1630665425190
+ },
+ {
+ "style": "Text",
+ "text": "First, let's clarify what rules you must fulfill to earn your Tokens Bonus!",
+ "updated": 1630668604341
+ },
+ {
+ "style": "List",
+ "text": "You must deploy the program: Done!",
+ "updated": 1630665468816
+ },
+ {
+ "style": "List",
+ "text": "You must declare your referrer: We'll do that next!",
+ "updated": 1630665632799
+ },
+ {
+ "style": "List",
+ "text": "You must drive Token Power to the program: Wooh... token power... sounds neat? You bet!",
+ "updated": 1630666285261
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-027-tutorial-step-declare-your-referrers.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-027-tutorial-step-declare-your-referrers.json
new file mode 100644
index 000000000..d5e845b76
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-027-tutorial-step-declare-your-referrers.json
@@ -0,0 +1,30 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 27,
+ "type": "Tutorial Step - Declare Your Referrers",
+ "definition": {
+ "text": "The program is deployed! Now you have to declare your referrer to fulfill the second requirement!",
+ "icon": {
+ "name": "User\\user-referrer",
+ "project": "Governance"
+ },
+ "updated": 1630669057039
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "Maybe you learned about Superalgos from an article, a video, a comment on Reddit, a tweet, the official website, or someone who told you about us!",
+ "updated": 1630669214566
+ },
+ {
+ "style": "Success",
+ "text": "Declaring your referrers is the best way to thank the people that may have written that article or tweet, produced that video, maintained the website, or told you about Superalgos!",
+ "updated": 1630669976768
+ },
+ {
+ "style": "Text",
+ "text": "To declare a referrer, you must establish a reference from the User Referrer node to the User Profile of your referrer! Does your referrer have a User Profile?",
+ "updated": 1630681537614
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-028-tutorial-step-load-the-user-profile.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-028-tutorial-step-load-the-user-profile.json
new file mode 100644
index 000000000..fb86ec33a
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-028-tutorial-step-load-the-user-profile.json
@@ -0,0 +1,30 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 28,
+ "type": "Tutorial Step - Load the User Profile",
+ "definition": {
+ "text": "Do you know who your referrer is? Does your referrer have a User Profile? How do you find and load the right profile? Those are all good questions!",
+ "updated": 1630678332122,
+ "icon": {
+ "name": "User\\user-profile",
+ "project": "Governance"
+ }
+ },
+ "paragraphs": [
+ {
+ "style": "Callout",
+ "text": "Follow the guide on the right to find the answers!",
+ "updated": 1630678762493
+ },
+ {
+ "style": "Note",
+ "text": "I brought you to the Dummy profile mentioned in the guide to make it easier for you!",
+ "updated": 1630678841266
+ },
+ {
+ "style": "Success",
+ "text": "If the question \"who is your referrer\" has no good answer then feel free to declare one of your friends in the Community! By the way, notice that the profiles of Community Mods and Core Team members are loaded already!",
+ "updated": 1630679299290
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-029-tutorial-step-reference-the-user-profile.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-029-tutorial-step-reference-the-user-profile.json
new file mode 100644
index 000000000..72feb1802
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-029-tutorial-step-reference-the-user-profile.json
@@ -0,0 +1,30 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 29,
+ "type": "Tutorial Step - Reference the User Profile",
+ "definition": {
+ "text": "Now that you have the target User Profile on the workspace, all that is left is to establish the reference from your User Referrer node to the User Profile.",
+ "icon": {
+ "name": "delink-node",
+ "project": "Foundations"
+ },
+ "updated": 1630679894593
+ },
+ "paragraphs": [
+ {
+ "style": "Callout",
+ "text": "Just in case you're not proficient with references, here's a quick reminder of how references work!",
+ "updated": 1630680014393
+ },
+ {
+ "style": "Note",
+ "text": "By the way, if you feel like you have more than one referrer, feel free to add User Referrer nodes and set up the references with their profiles!",
+ "updated": 1630680189459
+ },
+ {
+ "style": "Success",
+ "text": "Once you're done declaring your referrers, keep going with the tutorial!",
+ "updated": 1630680219618
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-030-tutorial-step-referral-token-awards.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-030-tutorial-step-referral-token-awards.json
new file mode 100644
index 000000000..e995bd0c5
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-030-tutorial-step-referral-token-awards.json
@@ -0,0 +1,39 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 30,
+ "type": "Tutorial Step - Referral Token Awards",
+ "definition": {
+ "text": "Superalgos is a community-run project, not a VC-funded startup! We count on you helping with word-of-mouth marketing!",
+ "icon": {
+ "name": "tokens-awarded",
+ "project": "Governance"
+ },
+ "updated": 1630681292714
+ },
+ "paragraphs": [
+ {
+ "style": "Important",
+ "text": "The incentives to bring your friends, colleagues, or your following are significant! Find the short explanation below, and dive into the details on the right if so you wish!",
+ "updated": 1630681312671
+ },
+ {
+ "style": "Text",
+ "text": "This is the short version of how these programs work:",
+ "updated": 1630680801100
+ },
+ {
+ "style": "List",
+ "text": "The more people declare you as their referrers, the more tokens you earn on each and every release of the software, indefinitely!",
+ "updated": 1630680974311
+ },
+ {
+ "style": "List",
+ "text": "If the people you bring to Superalgos bring people too, you earn for those as well, and for those the latter bring, you earn too!",
+ "updated": 1630681200103
+ },
+ {
+ "style": "Text",
+ "text": ""
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-031-tutorial-step-token-power-requirement.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-031-tutorial-step-token-power-requirement.json
new file mode 100644
index 000000000..06abfbfa8
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-031-tutorial-step-token-power-requirement.json
@@ -0,0 +1,34 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 31,
+ "type": "Tutorial Step - Token Power Requirement",
+ "definition": {
+ "text": "Remember the third requirement to earn your Tokens Bonus? \"You must drive Token Power to the program\". What's that all about?",
+ "updated": 1630686739254,
+ "icon": {
+ "name": "Exchange\\exchange-account-asset",
+ "project": "Foundations"
+ }
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "We're probably getting in the weeds here, but I'll try to keep it simple!",
+ "updated": 1630683871001
+ },
+ {
+ "style": "List",
+ "text": "When your Governance Address has some tokens in its balance, then you get the same amount of Token Power in your User Profile."
+ },
+ {
+ "style": "List",
+ "text": "Token Power flows down the hierarchy like a river! The amount of Token Power you let into each Governance Program determines how strongly you wish to participate in the program and impacts the Token Rewards you may get from it.",
+ "updated": 1630684153086
+ },
+ {
+ "style": "List",
+ "text": "By default, Token Power flows in equal amounts to all offspring nodes! You may change this tough!",
+ "updated": 1630684072593
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-032-tutorial-step-controlling-flows.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-032-tutorial-step-controlling-flows.json
new file mode 100644
index 000000000..9354b89a9
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-032-tutorial-step-controlling-flows.json
@@ -0,0 +1,30 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 32,
+ "type": "Tutorial Step - Controlling Flows",
+ "definition": {
+ "text": "The configuration of each node where Token Power may go in acts as a floodgate! That's how you control Token Power Flows!",
+ "icon": {
+ "name": "Switches\\votes-switch",
+ "project": "Governance"
+ },
+ "updated": 1630687488694
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "Go back to the Onboarding Programs node. Guess what? Those programs do not need Token Power, so we will close the floodgate!",
+ "updated": 1630687366643
+ },
+ {
+ "style": "Callout",
+ "text": "Copy the below configuration and paste it into the Onboarding Programs node configuration!",
+ "updated": 1630687477137
+ },
+ {
+ "style": "Json",
+ "text": "{\n \"percentage\": 0\n }",
+ "updated": 1630687598132
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-033-tutorial-step-what-token-power.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-033-tutorial-step-what-token-power.json
new file mode 100644
index 000000000..791e3f167
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-033-tutorial-step-what-token-power.json
@@ -0,0 +1,25 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 33,
+ "type": "Tutorial Step - What Token Power?",
+ "definition": {
+ "text": "If you have no tokens in your Governance Address, then you have zero Token Power! But don't worry! We'll work something out!",
+ "updated": 1630687902755,
+ "icon": {
+ "name": "Exchange\\exchange-account-asset",
+ "project": "Foundations"
+ }
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "Whether you have any Token Power or not, notice that there is now 0% of Token Power going into the Onboarding Programs and 100% going into the Community Building Programs! Floodgates closed, the flow goes elsewhere! You can play with percentages too!",
+ "updated": 1630688907038
+ },
+ {
+ "style": "Important",
+ "text": "Now, here's the good news... Because chances are that you have no Token Power to fulfill the third requirement to participate in the Community Building Programs, we are going to delegate some power to all User Profiles in this release! Well take care of that, so forget about it! ",
+ "updated": 1630689031351
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-034-tutorial-step-support-your-supporters.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-034-tutorial-step-support-your-supporters.json
new file mode 100644
index 000000000..c0f170fa2
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-034-tutorial-step-support-your-supporters.json
@@ -0,0 +1,25 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 34,
+ "type": "Tutorial Step - Support Your Supporters",
+ "definition": {
+ "text": "The Support Program works pretty much like the Referral Program, only that you declare who your favorite Community Mods are!",
+ "updated": 1630689246772,
+ "icon": {
+ "name": "Programs\\support-program",
+ "project": "Governance"
+ }
+ },
+ "paragraphs": [
+ {
+ "style": "Callout",
+ "text": "Add the Support Program and use User Supporter nodes to set up references to your favorite moderators! Their profiles are loaded already!",
+ "updated": 1630689768928
+ },
+ {
+ "style": "Success",
+ "text": "While the Community is always ready to help with typical questions, it takes a certain level of experience and knowledge to provide effective support. This is why select Community Mods are in charge! Participating in this program is the best way to thank the people that selflessly help others!",
+ "updated": 1630689962795
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-035-tutorial-step-save-it-once-more.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-035-tutorial-step-save-it-once-more.json
new file mode 100644
index 000000000..687e2cc3d
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-035-tutorial-step-save-it-once-more.json
@@ -0,0 +1,30 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 35,
+ "type": "Tutorial Step - Save It Once More!",
+ "definition": {
+ "text": "We're done! This is as far as we'll go before submitting your profile. Now let's make sure you save it before we proceed.",
+ "updated": 1630754177369,
+ "icon": {
+ "name": "backup-entity",
+ "project": "Foundations"
+ }
+ },
+ "paragraphs": [
+ {
+ "style": "Callout",
+ "text": "Hit Ctrl + Shift + Alt + Key-S to save your User Profile one last time!",
+ "updated": 1630754322739
+ },
+ {
+ "style": "Success",
+ "text": "No harm in checking the file saved correctly, right? A file with your Github username and .json extension should exist in the below path!",
+ "updated": 1630754759392
+ },
+ {
+ "style": "Json",
+ "text": "/Projects/Governance/Plugins/User-Profiles",
+ "updated": 1630754402770
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-036-tutorial-step-thank-your-mentors.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-036-tutorial-step-thank-your-mentors.json
new file mode 100644
index 000000000..54d8ec933
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-036-tutorial-step-thank-your-mentors.json
@@ -0,0 +1,30 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 36,
+ "type": "Tutorial Step - Thank Your Mentors",
+ "definition": {
+ "text": "Mentors are crucial to developing Contributors. They are the people that go the extra mile to help you progress and master Superalgos!",
+ "updated": 1630690393118,
+ "icon": {
+ "name": "Programs\\mentorship-program",
+ "project": "Governance"
+ }
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "The Mentorship Program is very similar the Support Program, only that your mentors don't need to be moderators. It may be your friend learning Superalgos with you, or any other Community member!",
+ "updated": 1630690674482
+ },
+ {
+ "style": "Callout",
+ "text": "Deploy the program, and declare your mentors!",
+ "updated": 1630690640463
+ },
+ {
+ "style": "Success",
+ "text": "With this you've completed the setup of the main Governance Programs oriented to newcomers! Now it's time to contribute your User Profile to the Superalgos repository!",
+ "updated": 1630754628606
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-037-tutorial-step-make-it-official.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-037-tutorial-step-make-it-official.json
new file mode 100644
index 000000000..ea5d1cda0
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-037-tutorial-step-make-it-official.json
@@ -0,0 +1,29 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 37,
+ "type": "Tutorial Step - Make it Official",
+ "definition": {
+ "text": "Now you're ready to push your new profile to the main Superalgos repository!",
+ "updated": 1630607221921,
+ "icon": {
+ "name": "Programs\\github-program",
+ "project": "Governance"
+ }
+ },
+ "paragraphs": [
+ {
+ "style": "Callout",
+ "text": "Set up you Github API credentials to get ready to contribute your profile!",
+ "updated": 1630754823206
+ },
+ {
+ "style": "Warning",
+ "text": "If you don't know what I'm talking about, you may need a refresher on how to submit a contribution to Superalgos. Read these few steps taken from the Beyond the Basics Tutorial to remind you what the GitHub authentication process is like. ",
+ "updated": 1630691155123
+ },
+ {
+ "style": "Text",
+ "text": ""
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-038-tutorial-step-to-infinity-and-beyond.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-038-tutorial-step-to-infinity-and-beyond.json
new file mode 100644
index 000000000..f30ab4ac0
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-038-tutorial-step-to-infinity-and-beyond.json
@@ -0,0 +1,34 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 38,
+ "type": "Tutorial Step - To Infinity and Beyond",
+ "definition": {
+ "text": "Let's get rolling! We will be using the app.contribute command to submit your profile.",
+ "updated": 1630604507310,
+ "icon": {
+ "name": "User\\user-profile",
+ "project": "Governance"
+ }
+ },
+ "paragraphs": [
+ {
+ "style": "Callout",
+ "text": "Copy the command making sure you replace the placeholder with your Github username, paste it in the search box, and click Enter.",
+ "updated": 1630604654229
+ },
+ {
+ "style": "Json",
+ "text": "app.contribute User Profile [add your name]",
+ "updated": 1630751329550
+ },
+ {
+ "style": "Text",
+ "text": "If everything is set up correctly, you should see a message stating that your pull request has been submitted. This means that your profile has been sent to the main Superalgos repository and will be automatically merged in just a few minutes!",
+ "updated": 1630604694599
+ },
+ {
+ "style": "Text",
+ "text": ""
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-039-tutorial-step-welcome-aboard.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-039-tutorial-step-welcome-aboard.json
new file mode 100644
index 000000000..8aec7d3dc
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-039-tutorial-step-welcome-aboard.json
@@ -0,0 +1,30 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 39,
+ "type": "Tutorial Step - Welcome aboard!",
+ "definition": {
+ "text": "You did it! You are now officially taking part in the governance of Superalgos! So, what's next?",
+ "updated": 1630751721473,
+ "icon": {
+ "name": "Announcement\\announcement",
+ "project": "Foundations"
+ }
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "If you generated a new Governance Address using the Profile Constructor, you may want to connect it to a software wallet so that you have control of your tokens.",
+ "updated": 1630751845529
+ },
+ {
+ "style": "Callout",
+ "text": "See the \"Import Private Key in a Wallet\" section of this Docs page on the right. It explains how to do that using Trust Wallet. Check it out!",
+ "updated": 1630756159921
+ },
+ {
+ "style": "Note",
+ "text": "Feel free to use any other wallet that supports BEP20 tokens in the Binance Smart Chain.",
+ "updated": 1630752335924
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-040-tutorial-step-deep-governance.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-040-tutorial-step-deep-governance.json
new file mode 100644
index 000000000..6b3e99d07
--- /dev/null
+++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-040-tutorial-step-deep-governance.json
@@ -0,0 +1,30 @@
+{
+ "tutorial": "Creating Your User Profile Tutorial",
+ "pageNumber": 40,
+ "type": "Tutorial Step - Deep Governance",
+ "definition": {
+ "text": "Are you ready to go deeper into the Governance rabbit hole? If you're just starting with Superalgos, you don't need to go any further at this point!",
+ "icon": {
+ "name": "governance",
+ "project": "Governance"
+ },
+ "updated": 1630753677065
+ },
+ "paragraphs": [
+ {
+ "style": "Text",
+ "text": "However, if you're invested in the project and wish to place some Contribution Claims or cast some votes, then you have some reading to do!",
+ "updated": 1630753559879
+ },
+ {
+ "style": "Callout",
+ "text": "The Governance Project book on the right takes you deep into all Governance Programs, including those we haven't covered yet!",
+ "updated": 1630753327041
+ },
+ {
+ "style": "Success",
+ "text": "You're on your own from here on! If you have any questions about governance or the token, please join the Token Group in Telegram!",
+ "updated": 1630753481035
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Projects/Governance/UI/Function-Libraries/AirdropProgram.js b/Projects/Governance/UI/Function-Libraries/AirdropProgram.js
index ec5bb3a57..f87c72699 100644
--- a/Projects/Governance/UI/Function-Libraries/AirdropProgram.js
+++ b/Projects/Governance/UI/Function-Libraries/AirdropProgram.js
@@ -106,8 +106,13 @@ function newGovernanceFunctionLibraryAirdropProgram() {
userProfile.payload.blockchainTokens === undefined
) {
node.payload.airdropProgram.isActive = false
- userProfile.payload.uiObject.setErrorMessage("You need to setup this profile with the Profile Constructor, to access the Token Power of your account at the Blockchain.")
+ userProfile.payload.uiObject.setErrorMessage(
+ "Waiting for blockchain balance. It takes 6 seconds to load the balance of each profile, bacause you are using a free API provided by BSC Scan.",
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
+ } else {
+ userProfile.payload.uiObject.resetErrorMessage()
}
/*
Next thing to do is to validate if the airdrop user profile has a star at the Superalgos repository.
@@ -117,7 +122,10 @@ function newGovernanceFunctionLibraryAirdropProgram() {
profileSignature === undefined
) {
node.payload.airdropProgram.isActive = false
- userProfile.payload.uiObject.setErrorMessage("You need to setup this profile with the Profile Constructor, and produce a signature of your Airdrop Username.")
+ userProfile.payload.uiObject.setErrorMessage(
+ "You need to setup this profile with the Profile Constructor, and produce a signature of your Airdrop Username.",
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
}
@@ -154,7 +162,10 @@ function newGovernanceFunctionLibraryAirdropProgram() {
if (totalPowerRewardRatio < 1) { totalPowerRewardRatio = 1 }
if (programNode.tokensAwarded === undefined || programNode.tokensAwarded.payload === undefined) {
- programNode.payload.uiObject.setErrorMessage("Tokens Awarded Node is needed in order for this Program to get Tokens from the Program Pool.")
+ programNode.payload.uiObject.setErrorMessage(
+ "Tokens Awarded Node is needed in order for this Program to get Tokens from the Program Pool.",
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
}
programNode.payload.airdropProgram.awarded.tokens = programNode.payload.airdropProgram.ownPower / totalPowerRewardRatio
@@ -170,7 +181,7 @@ function newGovernanceFunctionLibraryAirdropProgram() {
node.payload.uiObject.statusAngleOffset = 0
node.payload.uiObject.statusAtAngle = false
- node.payload.uiObject.setStatus(ownPowerText + ' Airdrop Power')
+ node.payload.uiObject.setStatus(ownPowerText + ' Airdrop Power', UI.projects.governance.globals.designer.SET_STATUS_COUNTER)
}
if (node.tokensAwarded !== undefined && node.tokensAwarded.payload !== undefined) {
@@ -180,12 +191,12 @@ function newGovernanceFunctionLibraryAirdropProgram() {
node.tokensAwarded.payload.uiObject.valueAngleOffset = 0
node.tokensAwarded.payload.uiObject.valueAtAngle = false
- node.tokensAwarded.payload.uiObject.setValue(tokensAwardedText + ' SA Tokens' + tokensAwardedBTC)
+ node.tokensAwarded.payload.uiObject.setValue(tokensAwardedText + ' SA Tokens' + tokensAwardedBTC, UI.projects.governance.globals.designer.SET_VALUE_COUNTER)
node.tokensAwarded.payload.uiObject.statusAngleOffset = 0
node.tokensAwarded.payload.uiObject.statusAtAngle = false
- node.tokensAwarded.payload.uiObject.setStatus('For creating your Superalgos profile!')
+ node.tokensAwarded.payload.uiObject.setStatus('For creating your Superalgos profile!', UI.projects.governance.globals.designer.SET_STATUS_COUNTER)
}
}
}
diff --git a/Projects/Governance/UI/Function-Libraries/Assets.js b/Projects/Governance/UI/Function-Libraries/Assets.js
index 64be554bf..d9e629570 100644
--- a/Projects/Governance/UI/Function-Libraries/Assets.js
+++ b/Projects/Governance/UI/Function-Libraries/Assets.js
@@ -12,10 +12,16 @@ function newGovernanceFunctionLibraryAssets() {
let folderPath = UI.projects.foundations.utilities.nodeConfig.loadConfigProperty(node.payload, 'folderPath')
if (folderPath === undefined || folderPath === "") {
- node.payload.uiObject.setErrorMessage("folderPath Config Property undefined.")
+ node.payload.uiObject.setErrorMessage(
+ "folderPath Config Property undefined.",
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
}
- node.payload.uiObject.setInfoMessage("Hold on while we install all the assets inside the this path: " + folderPath + ". This might take a minute or two.")
+ node.payload.uiObject.setInfoMessage(
+ "Hold on while we install all the assets inside the this path: " + folderPath + ". This might take a minute or two.",
+ UI.projects.governance.globals.designer.SET_INFO_COUNTER_FACTOR
+ )
httpRequest(undefined, 'DirContent' + '/' + folderPath, onResponse)
function onResponse(err, data) {
@@ -32,7 +38,10 @@ function newGovernanceFunctionLibraryAssets() {
totalAssets++
createNodesFromPath(node, foldersArray)
}
- node.payload.uiObject.setInfoMessage("A total of : " + totalAssets + " assets have been installed.")
+ node.payload.uiObject.setInfoMessage(
+ "A total of : " + totalAssets + " assets have been installed.",
+ UI.projects.governance.globals.designer.SET_INFO_COUNTER_FACTOR
+ )
}
function removeFirstFromArray(array) {
diff --git a/Projects/Governance/UI/Function-Libraries/ClaimsProgram.js b/Projects/Governance/UI/Function-Libraries/ClaimsProgram.js
index 7c2d61174..80b03c473 100644
--- a/Projects/Governance/UI/Function-Libraries/ClaimsProgram.js
+++ b/Projects/Governance/UI/Function-Libraries/ClaimsProgram.js
@@ -350,7 +350,10 @@ function newGovernanceFunctionLibraryClaimsProgram() {
}
}
if (totalPercentage > 100) {
- node.payload.uiObject.setErrorMessage('Claim Power Switching Error. Total Percentage of children nodes is grater that 100.')
+ node.payload.uiObject.setErrorMessage(
+ 'Claim Power Switching Error. Total Percentage of children nodes is grater that 100.',
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
}
let defaultPercentage = 0
@@ -446,7 +449,7 @@ function newGovernanceFunctionLibraryClaimsProgram() {
'Shared Between: ' + node.payload.claimsProgram.share.count + ' claims' + ' - ' +
'Share of Claims: ' + node.payload.claimsProgram.share.percentage.toFixed(2) + '%'
- node.payload.uiObject.setStatus(status)
+ node.payload.uiObject.setStatus(status, UI.projects.governance.globals.designer.SET_STATUS_COUNTER)
}
function drawProgram(node) {
@@ -457,7 +460,7 @@ function newGovernanceFunctionLibraryClaimsProgram() {
node.payload.uiObject.statusAngleOffset = 0
node.payload.uiObject.statusAtAngle = false
- node.payload.uiObject.setStatus(ownPowerText + ' Claims Power')
+ node.payload.uiObject.setStatus(ownPowerText + ' Claim Power', UI.projects.governance.globals.designer.SET_STATUS_COUNTER)
}
}
@@ -472,8 +475,8 @@ function newGovernanceFunctionLibraryClaimsProgram() {
node.tokensAwarded.payload.uiObject.statusAngleOffset = 0
node.tokensAwarded.payload.uiObject.statusAtAngle = true
- node.tokensAwarded.payload.uiObject.setValue(tokensAwardedText + ' SA Tokens' + tokensAwardedBTC)
- node.tokensAwarded.payload.uiObject.setStatus('From ' + node.payload.claimsProgram.count + ' Claims.')
+ node.tokensAwarded.payload.uiObject.setValue(tokensAwardedText + ' SA Tokens' + tokensAwardedBTC, UI.projects.governance.globals.designer.SET_VALUE_COUNTER)
+ node.tokensAwarded.payload.uiObject.setStatus('From ' + node.payload.claimsProgram.count + ' Claims.', UI.projects.governance.globals.designer.SET_STATUS_COUNTER)
}
}
@@ -486,10 +489,12 @@ function newGovernanceFunctionLibraryClaimsProgram() {
node.payload.uiObject.percentageAngleOffset = 180
node.payload.uiObject.percentageAtAngle = true
- node.payload.uiObject.setValue(programPowerText)
+ node.payload.uiObject.setValue(programPowerText, UI.projects.governance.globals.designer.SET_VALUE_COUNTER)
if (percentage !== undefined) {
- node.payload.uiObject.setPercentage(percentage.toFixed(2))
+ node.payload.uiObject.setPercentage(percentage.toFixed(2),
+ UI.projects.governance.globals.designer.SET_PERCENTAGE_COUNTER
+ )
}
}
}
@@ -498,7 +503,10 @@ function newGovernanceFunctionLibraryClaimsProgram() {
function installMissingClaims(node, rootNodes) {
if (node.payload === undefined) { return }
if (node.payload.referenceParent === undefined) {
- node.payload.uiObject.setErrorMessage('To Install Missing Claims you need a Reference Parent')
+ node.payload.uiObject.setErrorMessage(
+ 'To Install Missing Claims you need a Reference Parent',
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
}
scanNodeBranch(node, node.payload.referenceParent)
diff --git a/Projects/Governance/UI/Function-Libraries/DelegationProgram.js b/Projects/Governance/UI/Function-Libraries/DelegationProgram.js
index 764efd923..b429ed4a0 100644
--- a/Projects/Governance/UI/Function-Libraries/DelegationProgram.js
+++ b/Projects/Governance/UI/Function-Libraries/DelegationProgram.js
@@ -211,7 +211,10 @@ function newGovernanceFunctionLibraryDelegationProgram() {
}
}
if (totalPercentage > 100) {
- node.payload.uiObject.setErrorMessage('Delegate Power Switching Error. Total Percentage of children nodes is grater that 100.')
+ node.payload.uiObject.setErrorMessage(
+ 'Delegate Power Switching Error. Total Percentage of children nodes is grater that 100.',
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
}
let defaultPercentage = 0
@@ -278,7 +281,9 @@ function newGovernanceFunctionLibraryDelegationProgram() {
drawProgram(node)
if (percentage !== undefined) {
- node.payload.uiObject.setPercentage(percentage.toFixed(2))
+ node.payload.uiObject.setPercentage(percentage.toFixed(2),
+ UI.projects.governance.globals.designer.SET_PERCENTAGE_COUNTER
+ )
}
return
}
@@ -294,10 +299,12 @@ function newGovernanceFunctionLibraryDelegationProgram() {
let powerType = 'Delegate Power'
const programPowerText = parseFloat(programPower.toFixed(0)).toLocaleString('en') + ' ' + powerType
- node.payload.uiObject.setValue(programPowerText)
+ node.payload.uiObject.setValue(programPowerText, UI.projects.governance.globals.designer.SET_VALUE_COUNTER)
if (percentage !== undefined) {
- node.payload.uiObject.setPercentage(percentage.toFixed(2))
+ node.payload.uiObject.setPercentage(percentage.toFixed(2),
+ UI.projects.governance.globals.designer.SET_PERCENTAGE_COUNTER
+ )
}
}
}
@@ -310,18 +317,20 @@ function newGovernanceFunctionLibraryDelegationProgram() {
node.payload.uiObject.valueAngleOffset = 180
node.payload.uiObject.valueAtAngle = true
- node.payload.uiObject.setValue(outgoingPowerText + ' Delegate Power')
+ node.payload.uiObject.setValue(outgoingPowerText + ' Delegate Power', UI.projects.governance.globals.designer.SET_VALUE_COUNTER)
node.payload.uiObject.percentageAngleOffset = 180
node.payload.uiObject.percentageAtAngle = true
- node.payload.uiObject.setPercentage(percentage)
+ node.payload.uiObject.setPercentage(percentage,
+ UI.projects.governance.globals.designer.SET_PERCENTAGE_COUNTER
+ )
if (node.payload.referenceParent !== undefined) {
node.payload.uiObject.statusAngleOffset = 0
node.payload.uiObject.statusAtAngle = true
- node.payload.uiObject.setStatus(outgoingPowerText + ' ' + ' Outgoing Power')
+ node.payload.uiObject.setStatus(outgoingPowerText + ' ' + ' Outgoing Power', UI.projects.governance.globals.designer.SET_STATUS_COUNTER)
}
}
}
@@ -334,7 +343,7 @@ function newGovernanceFunctionLibraryDelegationProgram() {
node.payload.uiObject.statusAngleOffset = 0
node.payload.uiObject.statusAtAngle = false
- node.payload.uiObject.setStatus(ownPowerText + ' Delegate Power')
+ node.payload.uiObject.setStatus(ownPowerText + ' Delegate Power', UI.projects.governance.globals.designer.SET_STATUS_COUNTER)
}
}
}
diff --git a/Projects/Governance/UI/Function-Libraries/GithubProgram.js b/Projects/Governance/UI/Function-Libraries/GithubProgram.js
index 30b919aa0..8ff7a84d8 100644
--- a/Projects/Governance/UI/Function-Libraries/GithubProgram.js
+++ b/Projects/Governance/UI/Function-Libraries/GithubProgram.js
@@ -106,8 +106,13 @@ function newGovernanceFunctionLibraryGithubProgram() {
userProfile.payload.blockchainTokens === undefined
) {
node.payload.githubProgram.isActive = false
- userProfile.payload.uiObject.setErrorMessage("You need to setup this profile with the Profile Constructor, to access the Token Power of your account at the Blockchain.")
+ userProfile.payload.uiObject.setErrorMessage(
+ "Waiting for blockchain balance. It takes 6 seconds to load the balance of each profile, bacause you are using a free API provided by BSC Scan.",
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
+ } else {
+ userProfile.payload.uiObject.resetErrorMessage()
}
/*
Next thing to do is to validate if the github user profile has a star at the Superalgos repository.
@@ -117,7 +122,10 @@ function newGovernanceFunctionLibraryGithubProgram() {
profileSignature === undefined
) {
node.payload.githubProgram.isActive = false
- userProfile.payload.uiObject.setErrorMessage("You need to setup this profile with the Profile Constructor, and produce a signature of your Github Username.")
+ userProfile.payload.uiObject.setErrorMessage(
+ "You need to setup this profile with the Profile Constructor, and produce a signature of your Github Username.",
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
}
let githubUsername = profileSignature.message
@@ -168,7 +176,10 @@ function newGovernanceFunctionLibraryGithubProgram() {
if (totalPowerRewardRatio < 1) { totalPowerRewardRatio = 1 }
if (programNode.tokensAwarded === undefined || programNode.tokensAwarded.payload === undefined) {
- programNode.payload.uiObject.setErrorMessage("Tokens Awarded Node is needed in order for this Program to get Tokens from the Program Pool.")
+ programNode.payload.uiObject.setErrorMessage(
+ "Tokens Awarded Node is needed in order for this Program to get Tokens from the Program Pool.",
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
}
const MAX_ENGAGEMENT = 3
@@ -185,7 +196,7 @@ function newGovernanceFunctionLibraryGithubProgram() {
node.payload.uiObject.statusAngleOffset = 0
node.payload.uiObject.statusAtAngle = false
- node.payload.uiObject.setStatus(ownPowerText + ' Github Power')
+ node.payload.uiObject.setStatus(ownPowerText + ' Github Power', UI.projects.governance.globals.designer.SET_STATUS_COUNTER)
}
if (node.tokensAwarded !== undefined && node.tokensAwarded.payload !== undefined) {
@@ -195,7 +206,7 @@ function newGovernanceFunctionLibraryGithubProgram() {
node.tokensAwarded.payload.uiObject.valueAngleOffset = 0
node.tokensAwarded.payload.uiObject.valueAtAngle = false
- node.tokensAwarded.payload.uiObject.setValue(tokensAwardedText + ' SA Tokens' + tokensAwardedBTC)
+ node.tokensAwarded.payload.uiObject.setValue(tokensAwardedText + ' SA Tokens' + tokensAwardedBTC, UI.projects.governance.globals.designer.SET_VALUE_COUNTER)
node.tokensAwarded.payload.uiObject.statusAngleOffset = 0
node.tokensAwarded.payload.uiObject.statusAtAngle = false
@@ -211,7 +222,7 @@ function newGovernanceFunctionLibraryGithubProgram() {
extraText = extraText + ' + 1 Fork'
}
- node.tokensAwarded.payload.uiObject.setStatus('From' + extraText)
+ node.tokensAwarded.payload.uiObject.setStatus('From' + extraText, UI.projects.governance.globals.designer.SET_STATUS_COUNTER)
}
}
}
diff --git a/Projects/Governance/UI/Function-Libraries/PluginsFunctions.js b/Projects/Governance/UI/Function-Libraries/PluginsFunctions.js
index c31b3a2b7..e8a4a29e5 100644
--- a/Projects/Governance/UI/Function-Libraries/PluginsFunctions.js
+++ b/Projects/Governance/UI/Function-Libraries/PluginsFunctions.js
@@ -12,7 +12,10 @@ function newGovernanceFunctionLibraryPluginsFunctions() {
let projectName = UI.projects.foundations.utilities.plugins.getProjectName(node)
if (projectName === "" || projectName === undefined) {
if (node.payload.parentNode !== undefined) {
- node.payload.parentNode.payload.uiObject.setErrorMessage("Config codeName must have the name of the project.")
+ node.payload.parentNode.payload.uiObject.setErrorMessage(
+ "Config codeName must have the name of the project.",
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
}
}
@@ -28,7 +31,10 @@ function newGovernanceFunctionLibraryPluginsFunctions() {
let projectName = UI.projects.foundations.utilities.plugins.getProjectName(node)
if (projectName === "" || projectName === undefined) {
if (node.payload.parentNode !== undefined) {
- node.payload.parentNode.payload.uiObject.setErrorMessage("Config codeName must have the name of the project.")
+ node.payload.parentNode.payload.uiObject.setErrorMessage(
+ "Config codeName must have the name of the project.",
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
}
}
@@ -44,7 +50,10 @@ function newGovernanceFunctionLibraryPluginsFunctions() {
let projectName = UI.projects.foundations.utilities.plugins.getProjectName(node)
if (projectName === "" || projectName === undefined) {
if (node.payload.parentNode !== undefined) {
- node.payload.parentNode.payload.uiObject.setErrorMessage("Config codeName must have the name of the project.")
+ node.payload.parentNode.payload.uiObject.setErrorMessage(
+ "Config codeName must have the name of the project.",
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
}
}
@@ -60,7 +69,10 @@ function newGovernanceFunctionLibraryPluginsFunctions() {
let projectName = UI.projects.foundations.utilities.plugins.getProjectName(node)
if (projectName === "" || projectName === undefined) {
if (node.payload.parentNode !== undefined) {
- node.payload.parentNode.payload.uiObject.setErrorMessage("Config codeName must have the name of the project.")
+ node.payload.parentNode.payload.uiObject.setErrorMessage(
+ "Config codeName must have the name of the project.",
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
}
}
@@ -76,7 +88,10 @@ function newGovernanceFunctionLibraryPluginsFunctions() {
let projectName = UI.projects.foundations.utilities.plugins.getProjectName(node)
if (projectName === "" || projectName === undefined) {
if (node.payload.parentNode !== undefined) {
- node.payload.parentNode.payload.uiObject.setErrorMessage("Config codeName must have the name of the project.")
+ node.payload.parentNode.payload.uiObject.setErrorMessage(
+ "Config codeName must have the name of the project.",
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
}
}
diff --git a/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js b/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js
index 54eb74f35..eb09d4f6f 100644
--- a/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js
+++ b/Projects/Governance/UI/Function-Libraries/ProfileConstructor.js
@@ -16,7 +16,10 @@ function newGovernanceFunctionLibraryProfileConstructor() {
let mnemonic = UI.projects.foundations.utilities.nodeConfig.loadConfigProperty(node.payload, 'mnemonic')
if (githubUsername === undefined || githubUsername === "") {
- node.payload.uiObject.setErrorMessage("githubUsername config property missing.")
+ node.payload.uiObject.setErrorMessage(
+ "githubUsername config property missing.",
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
}
@@ -48,7 +51,10 @@ function newGovernanceFunctionLibraryProfileConstructor() {
function onResponse(err, data) {
/* Lets check the result of the call through the http interface */
if (err.result !== GLOBAL.DEFAULT_OK_RESPONSE.result) {
- node.payload.uiObject.setErrorMessage('Call via HTTP Interface failed.')
+ node.payload.uiObject.setErrorMessage(
+ 'Call via HTTP Interface failed.',
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
}
@@ -58,11 +64,17 @@ function newGovernanceFunctionLibraryProfileConstructor() {
if (response.result !== GLOBAL.DEFAULT_OK_RESPONSE.result) {
if (mnemonic === undefined || mnemonic === "") {
- node.payload.uiObject.setErrorMessage('Call to WEB3 Server failed. ' + response.error)
+ node.payload.uiObject.setErrorMessage(
+ 'Call to WEB3 Server failed. ' + response.error,
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
console.log('Call to WEB3 Server failed. ' + response.error)
return
} else {
- node.payload.uiObject.setErrorMessage('Call to WEB3 Server failed. Most likely the Mnemonic provided is not correct or you need to run node setup because a dependency is missing. ' + response.error)
+ node.payload.uiObject.setErrorMessage(
+ 'Call to WEB3 Server failed. Most likely the Mnemonic provided is not correct or you need to run node setup because a dependency is missing. ' + response.error,
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
console.log('Call to WEB3 Server failed. Most likely the Mnemonic provided is not correct or you need to run node setup because a dependency is missing. ' + response.error)
return
}
@@ -88,7 +100,10 @@ function newGovernanceFunctionLibraryProfileConstructor() {
function onResponse(err, data) {
/* Lets check the result of the call through the http interface */
if (err.result !== GLOBAL.DEFAULT_OK_RESPONSE.result) {
- node.payload.uiObject.setErrorMessage('Call via HTTP Interface failed.')
+ node.payload.uiObject.setErrorMessage(
+ 'Call via HTTP Interface failed.',
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
}
@@ -96,7 +111,10 @@ function newGovernanceFunctionLibraryProfileConstructor() {
/* Lets check the result of the method call */
if (response.result !== GLOBAL.DEFAULT_OK_RESPONSE.result) {
- node.payload.uiObject.setErrorMessage('Call to WEB3 Server failed. ' + response.error)
+ node.payload.uiObject.setErrorMessage(
+ 'Call to WEB3 Server failed. ' + response.error,
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
console.log('Call to WEB3 Server failed. ' + response.error)
return
}
@@ -124,9 +142,15 @@ function newGovernanceFunctionLibraryProfileConstructor() {
Show nice message.
*/
if (mnemonic === undefined || mnemonic === "") {
- node.payload.uiObject.setInfoMessage("Profile Private Key has been successfully created. User Profile installed as a plugin and saved. Use the Private Key at a crypto wallet and delete this node once done.", 10000)
+ node.payload.uiObject.setInfoMessage(
+ "Profile Private Key has been successfully created. User Profile installed as a plugin and saved. Use the Private Key at a crypto wallet and delete this node once done.",
+ UI.projects.governance.globals.designer.SET_INFO_COUNTER_FACTOR
+ )
} else {
- node.payload.uiObject.setInfoMessage("Mnemonic successfully imported. User Profile installed as a plugin and saved. Your external wallet was sucessfully linked to your profile.", 10000)
+ node.payload.uiObject.setInfoMessage(
+ "Mnemonic successfully imported. User Profile installed as a plugin and saved. Your external wallet was sucessfully linked to your profile.",
+ UI.projects.governance.globals.designer.SET_INFO_COUNTER_FACTOR
+ )
}
}
}
diff --git a/Projects/Governance/UI/Function-Libraries/StakingProgram.js b/Projects/Governance/UI/Function-Libraries/StakingProgram.js
index 46c3f8338..d3b8a0263 100644
--- a/Projects/Governance/UI/Function-Libraries/StakingProgram.js
+++ b/Projects/Governance/UI/Function-Libraries/StakingProgram.js
@@ -106,10 +106,15 @@ function newGovernanceFunctionLibraryStakingProgram() {
userProfile.payload.blockchainTokens === undefined
) {
node.payload.stakingProgram.isActive = false
- userProfile.payload.uiObject.setErrorMessage("You need to setup this profile with the Profile Constructor, to access the Token Power of your account at the Blockchain.")
+ userProfile.payload.uiObject.setErrorMessage(
+ "Waiting for blockchain balance. It takes 6 seconds to load the balance of each profile, bacause you are using a free API provided by BSC Scan.",
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
+ } else {
+ userProfile.payload.uiObject.resetErrorMessage()
+ node.payload.stakingProgram.isActive = true
}
- node.payload.stakingProgram.isActive = true
}
function distributeProgram(programNode) {
@@ -142,7 +147,10 @@ function newGovernanceFunctionLibraryStakingProgram() {
if (totalPowerRewardRatio < 1) { totalPowerRewardRatio = 1 }
if (programNode.tokensAwarded === undefined || programNode.tokensAwarded.payload === undefined) {
- programNode.payload.uiObject.setErrorMessage("Tokens Awarded Node is needed in order for this Program to get Tokens from the Program Pool.")
+ programNode.payload.uiObject.setErrorMessage(
+ "Tokens Awarded Node is needed in order for this Program to get Tokens from the Program Pool.",
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
}
programNode.payload.stakingProgram.awarded.tokens = programNode.payload.stakingProgram.ownPower / totalPowerRewardRatio
@@ -158,7 +166,7 @@ function newGovernanceFunctionLibraryStakingProgram() {
node.payload.uiObject.statusAngleOffset = 0
node.payload.uiObject.statusAtAngle = false
- node.payload.uiObject.setStatus(ownPowerText + ' Staking Power')
+ node.payload.uiObject.setStatus(ownPowerText + ' Staking Power', UI.projects.governance.globals.designer.SET_STATUS_COUNTER)
}
if (node.tokensAwarded !== undefined && node.tokensAwarded.payload !== undefined) {
@@ -168,7 +176,7 @@ function newGovernanceFunctionLibraryStakingProgram() {
node.tokensAwarded.payload.uiObject.valueAngleOffset = 0
node.tokensAwarded.payload.uiObject.valueAtAngle = false
- node.tokensAwarded.payload.uiObject.setValue(tokensAwardedText + ' SA Tokens' + tokensAwardedBTC)
+ node.tokensAwarded.payload.uiObject.setValue(tokensAwardedText + ' SA Tokens' + tokensAwardedBTC, UI.projects.governance.globals.designer.SET_VALUE_COUNTER)
}
}
}
diff --git a/Projects/Governance/UI/Function-Libraries/TokenMining.js b/Projects/Governance/UI/Function-Libraries/TokenMining.js
index 7db6b6595..68abe13c7 100644
--- a/Projects/Governance/UI/Function-Libraries/TokenMining.js
+++ b/Projects/Governance/UI/Function-Libraries/TokenMining.js
@@ -174,8 +174,8 @@ function newGovernanceFunctionLibraryTokenMining() {
userProfile.tokensMined.payload.uiObject.valueAngleOffset = 0
userProfile.tokensMined.payload.uiObject.valueAtAngle = true
- userProfile.tokensMined.payload.uiObject.setStatus(awarded + ' Awarded + ' + bonus + ' Bonus')
- userProfile.tokensMined.payload.uiObject.setValue(total + ' SA Tokens' + tokensAwardedBTC)
+ userProfile.tokensMined.payload.uiObject.setStatus(awarded + ' Awarded + ' + bonus + ' Bonus', UI.projects.governance.globals.designer.SET_STATUS_COUNTER)
+ userProfile.tokensMined.payload.uiObject.setValue(total + ' SA Tokens' + tokensAwardedBTC, UI.projects.governance.globals.designer.SET_VALUE_COUNTER)
}
}
}
\ No newline at end of file
diff --git a/Projects/Governance/UI/Function-Libraries/TokenPower.js b/Projects/Governance/UI/Function-Libraries/TokenPower.js
index 7e38746ad..d588bc777 100644
--- a/Projects/Governance/UI/Function-Libraries/TokenPower.js
+++ b/Projects/Governance/UI/Function-Libraries/TokenPower.js
@@ -96,7 +96,10 @@ function newGovernanceFunctionLibraryTokenPower() {
Before we start we will do some validations:
*/
if (userProfile.tokenPowerSwitch === undefined) {
- userProfile.payload.uiObject.setErrorMessage("You need to have a Token Power Switch child node.")
+ userProfile.payload.uiObject.setErrorMessage(
+ "You need to have a Token Power Switch child node.",
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
}
distributeTokenPower(
@@ -119,7 +122,10 @@ function newGovernanceFunctionLibraryTokenPower() {
Before we start we will do some validations:
*/
if (userProfile.tokenPowerSwitch === undefined) {
- userProfile.payload.uiObject.setErrorMessage("You need to have a Token Power Switch child node.")
+ userProfile.payload.uiObject.setErrorMessage(
+ "You need to have a Token Power Switch child node.",
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
}
distributeTokenPower(
@@ -213,7 +219,10 @@ function newGovernanceFunctionLibraryTokenPower() {
}
}
if (totalPercentage > 100) {
- node.payload.uiObject.setErrorMessage('Token Power Switching Error. Total Percentage of children nodes is grater that 100.')
+ node.payload.uiObject.setErrorMessage(
+ 'Token Power Switching Error. Total Percentage of children nodes is grater that 100.',
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
}
let defaultPercentage = 0
@@ -287,7 +296,7 @@ function newGovernanceFunctionLibraryTokenPower() {
node.payload.uiObject.valueAngleOffset = 0
node.payload.uiObject.valueAtAngle = false
- node.payload.uiObject.setStatus(ownPowerText + ' + ' + incomingPowerText)
+ node.payload.uiObject.setStatus(ownPowerText + ' + ' + incomingPowerText, UI.projects.governance.globals.designer.SET_STATUS_COUNTER)
return
}
@@ -297,12 +306,14 @@ function newGovernanceFunctionLibraryTokenPower() {
node.payload.uiObject.valueAngleOffset = 180
node.payload.uiObject.valueAtAngle = true
- node.payload.uiObject.setValue(tokenPowerText)
+ node.payload.uiObject.setValue(tokenPowerText, UI.projects.governance.globals.designer.SET_VALUE_COUNTER)
if (percentage !== undefined) {
node.payload.uiObject.percentageAngleOffset = 180
node.payload.uiObject.percentageAtAngle = true
- node.payload.uiObject.setPercentage(percentage.toFixed(2))
+ node.payload.uiObject.setPercentage(percentage.toFixed(2),
+ UI.projects.governance.globals.designer.SET_PERCENTAGE_COUNTER
+ )
}
}
}
diff --git a/Projects/Governance/UI/Function-Libraries/Tokens.js b/Projects/Governance/UI/Function-Libraries/Tokens.js
index 4d30f56b0..2810130be 100644
--- a/Projects/Governance/UI/Function-Libraries/Tokens.js
+++ b/Projects/Governance/UI/Function-Libraries/Tokens.js
@@ -173,7 +173,7 @@ function newGovernanceFunctionLibraryTokens() {
node.payload.uiObject.statusAngleOffset = 0
node.payload.uiObject.statusAtAngle = true
- node.payload.uiObject.setStatus(status)
+ node.payload.uiObject.setStatus(status, UI.projects.governance.globals.designer.SET_STATUS_COUNTER)
} else {
status = 'Reward: ' + tokens.toLocaleString('en')
+ ' ' + 'SA' + ' ≃ ' + UI.projects.governance.utilities.conversions.estimateSATokensInBTC(tokens | 0) + ' BTC '
@@ -181,7 +181,7 @@ function newGovernanceFunctionLibraryTokens() {
node.payload.uiObject.statusAngleOffset = 0
node.payload.uiObject.statusAtAngle = false
- node.payload.uiObject.setStatus(status)
+ node.payload.uiObject.setStatus(status, UI.projects.governance.globals.designer.SET_STATUS_COUNTER)
}
}
}
\ No newline at end of file
diff --git a/Projects/Governance/UI/Function-Libraries/VotingProgram.js b/Projects/Governance/UI/Function-Libraries/VotingProgram.js
index e69bbe127..1ab72bf36 100644
--- a/Projects/Governance/UI/Function-Libraries/VotingProgram.js
+++ b/Projects/Governance/UI/Function-Libraries/VotingProgram.js
@@ -334,7 +334,10 @@ function newGovernanceFunctionLibraryVotingProgram() {
}
}
if (totalPercentage > 100) {
- node.payload.uiObject.setErrorMessage('Voting Power Switching Error. Total Percentage of children nodes is grater that 100.')
+ node.payload.uiObject.setErrorMessage(
+ 'Voting Power Switching Error. Total Percentage of children nodes is grater that 100.',
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
}
let defaultPercentage = 0
@@ -406,7 +409,9 @@ function newGovernanceFunctionLibraryVotingProgram() {
drawProgram(node, userProfile)
if (percentage !== undefined) {
- node.payload.uiObject.setPercentage(percentage.toFixed(2))
+ node.payload.uiObject.setPercentage(percentage.toFixed(2),
+ UI.projects.governance.globals.designer.SET_PERCENTAGE_COUNTER
+ )
}
return
}
@@ -457,10 +462,12 @@ function newGovernanceFunctionLibraryVotingProgram() {
node.payload.uiObject.valueAngleOffset = 0
node.payload.uiObject.valueAtAngle = true
- node.payload.uiObject.setValue(votesText)
+ node.payload.uiObject.setValue(votesText, UI.projects.governance.globals.designer.SET_VALUE_COUNTER)
if (percentage !== undefined) {
- node.payload.uiObject.setPercentage(percentage.toFixed(2))
+ node.payload.uiObject.setPercentage(percentage.toFixed(2),
+ UI.projects.governance.globals.designer.SET_PERCENTAGE_COUNTER
+ )
}
}
@@ -472,18 +479,20 @@ function newGovernanceFunctionLibraryVotingProgram() {
node.payload.uiObject.valueAngleOffset = 180
node.payload.uiObject.valueAtAngle = true
- node.payload.uiObject.setValue(outgoingPowerText + ' Voting Power')
+ node.payload.uiObject.setValue(outgoingPowerText + ' Voting Power', UI.projects.governance.globals.designer.SET_VALUE_COUNTER)
node.payload.uiObject.percentageAngleOffset = 180
node.payload.uiObject.percentageAtAngle = true
- node.payload.uiObject.setPercentage(percentage)
+ node.payload.uiObject.setPercentage(percentage,
+ UI.projects.governance.globals.designer.SET_PERCENTAGE_COUNTER
+ )
if (node.payload.referenceParent !== undefined) {
node.payload.uiObject.statusAngleOffset = 0
node.payload.uiObject.statusAtAngle = true
- node.payload.uiObject.setStatus(outgoingPowerText + ' ' + ' Outgoing Power')
+ node.payload.uiObject.setStatus(outgoingPowerText + ' ' + ' Outgoing Power', UI.projects.governance.globals.designer.SET_STATUS_COUNTER)
}
}
}
@@ -502,7 +511,7 @@ function newGovernanceFunctionLibraryVotingProgram() {
node.payload.uiObject.statusAngleOffset = 0
node.payload.uiObject.statusAtAngle = false
- node.payload.uiObject.setStatus(ownPowerText + ' Own Power' + ' + ' + incomingPowerText + ' Incoming Voting Power' + ' + ' + reputationPowerText + ' Reputation Power')
+ node.payload.uiObject.setStatus(ownPowerText + ' Own Power' + ' + ' + incomingPowerText + ' Incoming Voting Power' + ' + ' + reputationPowerText + ' Reputation Power', UI.projects.governance.globals.designer.SET_STATUS_COUNTER)
}
}
}
@@ -510,7 +519,10 @@ function newGovernanceFunctionLibraryVotingProgram() {
function installMissingVotes(node, rootNodes) {
if (node.payload === undefined) { return }
if (node.payload.referenceParent === undefined) {
- node.payload.uiObject.setErrorMessage('To install votes you need a Reference Parent')
+ node.payload.uiObject.setErrorMessage(
+ 'To install votes you need a Reference Parent',
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
}
scanNodeBranch(node, node.payload.referenceParent)
diff --git a/Projects/Governance/UI/Globals/Designer.js b/Projects/Governance/UI/Globals/Designer.js
new file mode 100644
index 000000000..9be7ea241
--- /dev/null
+++ b/Projects/Governance/UI/Globals/Designer.js
@@ -0,0 +1,11 @@
+function newGovernanceGlobalsDesigner() {
+ let thisObject = {
+ SET_VALUE_COUNTER: 1000,
+ SET_STATUS_COUNTER: 1000,
+ SET_ERROR_COUNTER_FACTOR: 10,
+ SET_INFO_COUNTER_FACTOR: 10,
+ SET_WARNING_COUNTER: 1000,
+ SET_PERCENTAGE_COUNTER: 1000
+ }
+ return thisObject
+}
\ No newline at end of file
diff --git a/Projects/Governance/UI/Spaces/Reports-Space/Claims.js b/Projects/Governance/UI/Spaces/Reports-Space/Claims.js
index 4a693249a..2765bb2fd 100644
--- a/Projects/Governance/UI/Spaces/Reports-Space/Claims.js
+++ b/Projects/Governance/UI/Spaces/Reports-Space/Claims.js
@@ -46,7 +46,7 @@ function newGovernanceReportsClaims() {
},
{
"name": "ownPower",
- "label": "Claims Power",
+ "label": "Claim Power",
"type": "number",
"order": "descending",
"textAlign": "center",
diff --git a/Projects/Governance/UI/Spaces/Reports-Space/Footer.js b/Projects/Governance/UI/Spaces/Reports-Space/Footer.js
index f6ec9335b..2c4cfae3b 100644
--- a/Projects/Governance/UI/Spaces/Reports-Space/Footer.js
+++ b/Projects/Governance/UI/Spaces/Reports-Space/Footer.js
@@ -24,131 +24,13 @@ function newGovernanceReportsFooter() {
// Buttons Section
HTML = HTML + ''
-
- // GitHub Section
-
- HTML = HTML + ''
-
- HTML = HTML + '' // Container Ends
diff --git a/Projects/Governance/UI/Spaces/Reports-Space/ReportsSpace.js b/Projects/Governance/UI/Spaces/Reports-Space/ReportsSpace.js
index 3487a3c57..af136f4fe 100644
--- a/Projects/Governance/UI/Spaces/Reports-Space/ReportsSpace.js
+++ b/Projects/Governance/UI/Spaces/Reports-Space/ReportsSpace.js
@@ -46,6 +46,8 @@ function newGobernanceReportsSpace() {
if (isInitialized === false) { return }
+ hidAppDiv()
+
thisObject.container.finalize()
thisObject.container = undefined
@@ -215,22 +217,38 @@ function newGobernanceReportsSpace() {
if (isInitialized === false) { return }
docsAppDivPhysics()
+ }
- function docsAppDivPhysics() {
- let docsSpaceDiv = document.getElementById('governance-reports-space-div')
- docsAppDivPosition = {
- x: 0,
- y: 0
- }
- docsAppDivPosition = thisObject.container.frame.frameThisPoint(docsAppDivPosition)
- docsSpaceDiv.style = ' ' +
- 'overflow-y: scroll;' +
- 'overflow-x: hidden;' +
- 'position:fixed; top:' + docsAppDivPosition.y + 'px; ' +
- 'left:' + docsAppDivPosition.x + 'px; z-index:1; ' +
- 'width: ' + thisObject.container.frame.width + 'px;' +
- 'height: ' + thisObject.container.frame.height + 'px'
+ function docsAppDivPhysics() {
+ let docsSpaceDiv = document.getElementById('governance-reports-space-div')
+ docsAppDivPosition = {
+ x: 0,
+ y: 0
}
+ docsAppDivPosition = thisObject.container.frame.frameThisPoint(docsAppDivPosition)
+ docsSpaceDiv.style = ' ' +
+ 'overflow-y: scroll;' +
+ 'overflow-x: hidden;' +
+ 'position:fixed; top:' + docsAppDivPosition.y + 'px; ' +
+ 'left:' + docsAppDivPosition.x + 'px; z-index:1; ' +
+ 'width: ' + thisObject.container.frame.width + 'px;' +
+ 'height: ' + thisObject.container.frame.height + 'px'
+ }
+
+ function hidAppDiv() {
+ let docsSpaceDiv = document.getElementById('governance-reports-space-div')
+ docsAppDivPosition = {
+ x: 100000000000,
+ y: 0
+ }
+ docsAppDivPosition = thisObject.container.frame.frameThisPoint(docsAppDivPosition)
+ docsSpaceDiv.style = ' ' +
+ 'overflow-y: scroll;' +
+ 'overflow-x: hidden;' +
+ 'position:fixed; top:' + docsAppDivPosition.y + 'px; ' +
+ 'left:' + docsAppDivPosition.x + 'px; z-index:1; ' +
+ 'width: ' + thisObject.container.frame.width + 'px;' +
+ 'height: ' + thisObject.container.frame.height + 'px'
}
function getContainer(point, purpose) {
diff --git a/Projects/Governance/UI/Spaces/User-Profile-Space/UserProfile.js b/Projects/Governance/UI/Spaces/User-Profile-Space/UserProfile.js
index 9f9a34b04..d37d0f684 100644
--- a/Projects/Governance/UI/Spaces/User-Profile-Space/UserProfile.js
+++ b/Projects/Governance/UI/Spaces/User-Profile-Space/UserProfile.js
@@ -16,11 +16,18 @@ function newGovernanceUserProfileSpace() {
let waitingForResponses = 0
const BSC_SCAN_RATE_LIMIT_DELAY = 6000
+ const DISTRIBUTION_PROCESS_RECALCULATION_DELAY = 5000
+ let intervalId
let reputationByAddress = new Map()
return thisObject
function initialize() {
+ /*
+ Here we will run the distribution process, that in turn will run all the programs.
+ */
+ intervalId = setInterval(UI.projects.governance.functionLibraries.distributionProcess.calculate, DISTRIBUTION_PROCESS_RECALCULATION_DELAY)
+
/*
Here we will get a list of all github usernames who have a star or fork and are watching the
Superalgos Repository. This will later be used to know which user profiles are participating
@@ -56,7 +63,7 @@ function newGovernanceUserProfileSpace() {
const X_STEP = SPACE_WIDTH / (userProfiles.length + 1)
const Y_STEP = 3000
- const Y_LEVEL = SPACE_HEIGHT * 0.45
+ const Y_LEVEL = SPACE_HEIGHT * 0.425
let xOffset = X_STEP
let yOffset = 0
@@ -292,6 +299,9 @@ function newGovernanceUserProfileSpace() {
}
function finalize() {
+ clearInterval(intervalId)
+ intervalId = undefined
+
thisObject.githubStars = undefined
thisObject.githubWatchers = undefined
thisObject.githubForks = undefined
@@ -320,10 +330,6 @@ function newGovernanceUserProfileSpace() {
function physics() {
if (UI.projects.foundations.spaces.designSpace.workspace === undefined) { return }
/*
- Here we will run the distribution process, that in turn will run all the programs.
- */
- UI.projects.governance.functionLibraries.distributionProcess.calculate()
- /*
Load the user profiles with Token Power.
*/
let userProfiles = UI.projects.foundations.spaces.designSpace.workspace.getHierarchyHeadsByNodeType('User Profile')
@@ -359,7 +365,10 @@ function newGovernanceUserProfileSpace() {
function onResponse(err, data) {
/* Lets check the result of the call through the http interface */
if (err.result !== GLOBAL.DEFAULT_OK_RESPONSE.result) {
- userProfile.payload.uiObject.setErrorMessage('Call via HTTP Interface failed.')
+ userProfile.payload.uiObject.setErrorMessage(
+ 'Call via HTTP Interface failed.',
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
}
@@ -367,7 +376,10 @@ function newGovernanceUserProfileSpace() {
/* Lets check the result of the method call */
if (response.result !== GLOBAL.DEFAULT_OK_RESPONSE.result) {
- userProfile.payload.uiObject.setErrorMessage('Call to WEB3 Server failed. ' + response.error)
+ userProfile.payload.uiObject.setErrorMessage(
+ 'Call to WEB3 Server failed. ' + response.error,
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
console.log('Call to WEB3 Server failed. ' + response.error)
return
}
@@ -397,7 +409,9 @@ function newGovernanceUserProfileSpace() {
if (data.result === "Max rate limit reached, please use API Key for higher rate limit") {
userProfile.payload.blockchainTokens = undefined // This enables this profile to query the blockchain again.
} else {
- userProfile.payload.uiObject.setInfoMessage(data)
+ userProfile.payload.uiObject.setInfoMessage(data,
+ UI.projects.governance.globals.designer.SET_INFO_COUNTER_FACTOR
+ )
userProfile.payload.blockchainTokens = Number(data.result) / 1000000000000000000
userProfile.payload.reputation = Math.min(reputationByAddress.get(blockchainAccount.toLowerCase()) | 0, userProfile.payload.blockchainTokens)
}
@@ -406,7 +420,9 @@ function newGovernanceUserProfileSpace() {
const message = err.message + ' - ' + 'Can not access BSC SCAN servers.'
console.log(message)
if (userProfile.payload !== undefined) {
- userProfile.payload.uiObject.setErrorMessage(message, 1000)
+ userProfile.payload.uiObject.setErrorMessage(message,
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
}
waitingForResponses--
});
diff --git a/Projects/Governance/UI/Utilities/BonusProgram.js b/Projects/Governance/UI/Utilities/BonusProgram.js
index e89450c32..5ef959426 100644
--- a/Projects/Governance/UI/Utilities/BonusProgram.js
+++ b/Projects/Governance/UI/Utilities/BonusProgram.js
@@ -101,8 +101,13 @@ function newGovernanceUtilitiesBonusProgram() {
userProfile.payload.blockchainTokens === undefined
) {
node.payload[programPropertyName].isActive = false
- userProfile.payload.uiObject.setErrorMessage("You need to setup this profile with the Profile Constructor, to access the Token Power of your account at the Blockchain.")
+ userProfile.payload.uiObject.setErrorMessage(
+ "Waiting for blockchain balance. It takes 6 seconds to load the balance of each profile, bacause you are using a free API provided by BSC Scan.",
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
+ } else {
+ userProfile.payload.uiObject.resetErrorMessage()
}
}
@@ -135,7 +140,10 @@ function newGovernanceUtilitiesBonusProgram() {
if (totalPowerRewardRatio < 1) { totalPowerRewardRatio = 1 }
if (programNode.tokensBonus === undefined || programNode.tokensBonus.payload === undefined) {
- programNode.payload.uiObject.setErrorMessage("Tokens Bonus Node is needed in order for this Program to get Tokens from the Bonus Program Pool.")
+ programNode.payload.uiObject.setErrorMessage(
+ "Tokens Bonus Node is needed in order for this Program to get Tokens from the Bonus Program Pool.",
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
}
programNode.payload[programPropertyName].bonus.tokens = programNode.payload[programPropertyName].bonusPower / totalPowerRewardRatio
@@ -152,7 +160,7 @@ function newGovernanceUtilitiesBonusProgram() {
node.tokensBonus.payload.uiObject.valueAngleOffset = 0
node.tokensBonus.payload.uiObject.valueAtAngle = true
- node.tokensBonus.payload.uiObject.setValue(tokensBonusText + ' SA Tokens' + tokensAwardedBTC)
+ node.tokensBonus.payload.uiObject.setValue(tokensBonusText + ' SA Tokens' + tokensAwardedBTC, UI.projects.governance.globals.designer.SET_VALUE_COUNTER)
}
}
}
diff --git a/Projects/Governance/UI/Utilities/DecendentProgram.js b/Projects/Governance/UI/Utilities/DecendentProgram.js
index b38ce2397..3f604e612 100644
--- a/Projects/Governance/UI/Utilities/DecendentProgram.js
+++ b/Projects/Governance/UI/Utilities/DecendentProgram.js
@@ -168,8 +168,13 @@ function newGovernanceUtilitiesDecendentProgram() {
userProfile.payload.blockchainTokens === undefined
) {
node.payload[programPropertyName].isActive = false
- userProfile.payload.uiObject.setErrorMessage("You need to setup this profile with the Profile Constructor, to access the Token Power of your account at the Blockchain.")
+ userProfile.payload.uiObject.setErrorMessage(
+ "Waiting for blockchain balance. It takes 6 seconds to load the balance of each profile, bacause you are using a free API provided by BSC Scan.",
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
+ } else {
+ userProfile.payload.uiObject.resetErrorMessage()
}
/*
As per the system rules, the Program will not give tokens
@@ -182,7 +187,10 @@ function newGovernanceUtilitiesDecendentProgram() {
(node[usersArrayPropertyName] === undefined || hasUsersDefined(node[usersArrayPropertyName]) === false)
) {
node.payload[programPropertyName].isActive = false
- node.payload.uiObject.setErrorMessage("In order to enable this program you need to add " + userNodeType + " nodes and reference a User Profile from each one.")
+ node.payload.uiObject.setErrorMessage(
+ "In order to enable this program you need to add " + userNodeType + " nodes and reference a User Profile from each one.",
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
} else {
node.payload[programPropertyName].isActive = true
}
@@ -282,7 +290,10 @@ function newGovernanceUtilitiesDecendentProgram() {
}
}
if (totalPercentage > 100) {
- node.payload.uiObject.setErrorMessage('Program Power Switching Error. Total Percentage of children nodes is grater that 100.')
+ node.payload.uiObject.setErrorMessage(
+ 'Program Power Switching Error. Total Percentage of children nodes is grater that 100.',
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
}
let defaultPercentage = 0
@@ -371,7 +382,10 @@ function newGovernanceUtilitiesDecendentProgram() {
if (totalPowerRewardRatio < 1) { totalPowerRewardRatio = 1 }
if (programNode.tokensAwarded === undefined || programNode.tokensAwarded.payload === undefined) {
- programNode.payload.uiObject.setErrorMessage("Tokens Awarded Node is needed in order for this Program to get Tokens from the Program Pool.")
+ programNode.payload.uiObject.setErrorMessage(
+ "Tokens Awarded Node is needed in order for this Program to get Tokens from the Program Pool.",
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
}
programNode.payload[programPropertyName].awarded.tokens = programNode.payload[programPropertyName].incomingPower / totalPowerRewardRatio
@@ -387,17 +401,19 @@ function newGovernanceUtilitiesDecendentProgram() {
node.payload.uiObject.valueAngleOffset = 180
node.payload.uiObject.valueAtAngle = true
- node.payload.uiObject.setValue(outgoingPowerText + ' ' + programPowerName)
+ node.payload.uiObject.setValue(outgoingPowerText + ' ' + programPowerName, UI.projects.governance.globals.designer.SET_VALUE_COUNTER)
node.payload.uiObject.percentageAngleOffset = 180
node.payload.uiObject.percentageAtAngle = true
- node.payload.uiObject.setPercentage(percentage)
+ node.payload.uiObject.setPercentage(percentage,
+ UI.projects.governance.globals.designer.SET_PERCENTAGE_COUNTER
+ )
node.payload.uiObject.statusAngleOffset = 0
node.payload.uiObject.statusAtAngle = true
- node.payload.uiObject.setStatus(outgoingPowerText + ' ' + ' Outgoing Power')
+ node.payload.uiObject.setStatus(outgoingPowerText + ' ' + ' Outgoing Power', UI.projects.governance.globals.designer.SET_STATUS_COUNTER)
}
}
@@ -410,7 +426,7 @@ function newGovernanceUtilitiesDecendentProgram() {
node.payload.uiObject.statusAngleOffset = 0
node.payload.uiObject.statusAtAngle = false
- node.payload.uiObject.setStatus(ownPowerText + ' Own Power' + ' + ' + incomingPowerText + ' Incoming ' + programPowerName)
+ node.payload.uiObject.setStatus(ownPowerText + ' Own Power' + ' + ' + incomingPowerText + ' Incoming ' + programPowerName, UI.projects.governance.globals.designer.SET_STATUS_COUNTER)
}
if (node.tokensAwarded !== undefined && node.tokensAwarded.payload !== undefined) {
@@ -422,8 +438,8 @@ function newGovernanceUtilitiesDecendentProgram() {
node.tokensAwarded.payload.uiObject.valueAngleOffset = 0
node.tokensAwarded.payload.uiObject.valueAtAngle = true
- node.tokensAwarded.payload.uiObject.setValue(tokensAwardedText + ' SA Tokens' + tokensAwardedBTC)
- node.tokensAwarded.payload.uiObject.setStatus('From ' + node.payload[programPropertyName].count + ' Descendants.')
+ node.tokensAwarded.payload.uiObject.setValue(tokensAwardedText + ' SA Tokens' + tokensAwardedBTC, UI.projects.governance.globals.designer.SET_VALUE_COUNTER)
+ node.tokensAwarded.payload.uiObject.setStatus('From ' + node.payload[programPropertyName].count + ' Descendants.', UI.projects.governance.globals.designer.SET_STATUS_COUNTER)
}
}
}
diff --git a/Projects/Governance/UI/Utilities/Validations.js b/Projects/Governance/UI/Utilities/Validations.js
index 4b23c27ce..6abe955b3 100644
--- a/Projects/Governance/UI/Utilities/Validations.js
+++ b/Projects/Governance/UI/Utilities/Validations.js
@@ -12,7 +12,10 @@ function newGovernanceUtilitiesValidations () {
let programs = UI.projects.foundations.utilities.branches.nodeBranchToArray(userProfile, programNodeType)
if (programs !== undefined) {
if (programs.length > 1) {
- userProfile.payload.uiObject.setErrorMessage('Only one ' + programNodeType + ' is allowed.')
+ userProfile.payload.uiObject.setErrorMessage(
+ 'Only one ' + programNodeType + ' is allowed.',
+ UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
+ )
return
}
if (programs.length === 1) {
diff --git a/Projects/Network/NT/Modules/WebSocketsInterface.js b/Projects/Network/NT/Modules/WebSocketsInterface.js
new file mode 100644
index 000000000..003e6798b
--- /dev/null
+++ b/Projects/Network/NT/Modules/WebSocketsInterface.js
@@ -0,0 +1,326 @@
+exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSocketsInterface() {
+
+ let thisObject = {
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ let socketServer
+ let clientInterface
+ let peerInterface
+
+ let web3 = new SA.nodeModules.web3()
+
+ return thisObject
+
+ function finalize() {
+ socketServer = undefined
+ clientInterface = undefined
+ peerInterface = undefined
+
+ web3 = undefined
+ }
+
+ function initialize() {
+ socketServer = new SA.nodeModules.ws.Server({ port: global.env.NETWORK_WEB_SOCKETS_INTERFACE_PORT })
+ clientInterface = NT.projects.socialTrading.modules.clientInterface.newSocialTradingModulesClientInterface()
+ peerInterface = NT.projects.socialTrading.modules.peerInterface.newSocialTradingModulesPeerInterface()
+
+ setUpWebSocketServer()
+ }
+
+ function setUpWebSocketServer() {
+ try {
+ socketServer.on('connection', onConnection)
+
+ function onConnection(socket) {
+ let caller = {}
+ let calledTimestamp = (new Date()).valueOf()
+
+ socket.on('message', onMenssage)
+
+ async function onMenssage(message) {
+ try {
+ let messageHeader
+ try {
+ messageHeader = JSON.parse(message)
+ } catch (err) {
+ let response = {
+ result: 'Error',
+ message: 'messageHeader Not Coorrect JSON Format.'
+ }
+ socket.send(JSON.stringify(response))
+ return
+ }
+ /*
+ We will run some validations.
+ */
+ if (messageHeader.messageType === undefined) {
+ let response = {
+ result: 'Error',
+ message: 'messageType Not Provided.'
+ }
+ socket.send(JSON.stringify(response))
+ return
+ }
+
+ switch (messageHeader.messageType) {
+ case "Handshake": {
+ handshakeProducedure(socket, caller, calledTimestamp, messageHeader)
+ break
+ }
+ case "Request": {
+
+ if (caller.userProfile === undefined) {
+ let response = {
+ result: 'Error',
+ message: 'Handshake Not Done Yet.'
+ }
+ socket.send(JSON.stringify(response))
+ return
+ }
+
+ switch (caller.role) {
+ case 'Network Client': {
+ let response = await clientInterface.messageReceived(messageHeader.payload, caller.userProfile)
+ socket.send(JSON.stringify(response))
+ break
+ }
+ case 'Network Peer': {
+ let response = await peerInterface.messageReceived(messageHeader.payload)
+ socket.send(JSON.stringify(response))
+ break
+ }
+ }
+ break
+ }
+ default: {
+ let response = {
+ result: 'Error',
+ message: 'messageType Not Supported.'
+ }
+ socket.send(JSON.stringify(response))
+ break
+ }
+ }
+ } catch (err) {
+ console.log('[ERROR] Web Sockets Interface -> setUpWebSocketServer -> err.stack = ' + err.stack)
+ }
+ }
+ }
+
+ function handshakeProducedure(socket, caller, calledTimestamp, messageHeader) {
+ /*
+ The handshage producedure have 2 steps, we need to know
+ now which one we are at.
+ */
+ if (messageHeader.step === undefined) {
+ let response = {
+ result: 'Error',
+ message: 'step Not Provided.'
+ }
+ socket.send(JSON.stringify(response))
+ return
+ }
+ if (messageHeader.step !== 'One' && messageHeader.step !== 'Two') {
+ let response = {
+ result: 'Error',
+ message: 'step Not Supported.'
+ }
+ socket.send(JSON.stringify(response))
+ return
+ }
+ switch (messageHeader.step) {
+ case 'One': {
+ handshakeStepOne()
+ break
+ }
+ case 'Two': {
+ handshakeStepTwo()
+ break
+ }
+ }
+ function handshakeStepOne() {
+ /*
+ The caller needs to identify itself as either a Network Client or Peer.
+ */
+ if (messageHeader.callerRole === undefined) {
+ let response = {
+ result: 'Error',
+ message: 'callerRole Not Provided.'
+ }
+ socket.send(JSON.stringify(response))
+ return
+ }
+
+ if (messageHeader.callerRole !== 'Network Client' && messageHeader.callerRole !== 'Network Peer') {
+ let response = {
+ result: 'Error',
+ message: 'callerRole Not Supported.'
+ }
+ socket.send(JSON.stringify(response))
+ return
+ }
+
+ caller.role = messageHeader.callerRole
+ /*
+ The caller needs to provide it's User Profile Handle.
+ */
+ if (messageHeader.callerProfileHandle === undefined) {
+ let response = {
+ result: 'Error',
+ message: 'callerProfileHandle Not Provided.'
+ }
+ socket.send(JSON.stringify(response))
+ return
+ }
+
+ caller.userProfileHandle = messageHeader.callerProfileHandle
+ /*
+ The caller needs to provide a callerTimestamp.
+ */
+ if (messageHeader.callerTimestamp === undefined) {
+ let response = {
+ result: 'Error',
+ message: 'callerTimestamp Not Provided.'
+ }
+ socket.send(JSON.stringify(response))
+ return
+ }
+ /*
+ The callerTimestamp can not be more that 1 minute old.
+ */
+ if (calledTimestamp - messageHeader.callerTimestamp > 60000) {
+ let response = {
+ result: 'Error',
+ message: 'callerTimestamp Too Old.'
+ }
+ socket.send(JSON.stringify(response))
+ return
+ }
+ /*
+ We will sign for the caller it's handle to prove our
+ Network Node identity.
+ */
+ let signedMessage = {
+ callerProfileHandle: messageHeader.callerProfileHandle,
+ calledProfileHandle: NT.NETWORK_NODE_USER_PROFILE_HANDLE,
+ callerTimestamp: messageHeader.callerTimestamp,
+ calledTimestamp: calledTimestamp
+ }
+ let signature = web3.eth.accounts.sign(JSON.stringify(signedMessage), NT.NETWORK_NODE_USER_PROFILE_PRIVATE_KEY)
+
+ let response = {
+ result: 'Ok',
+ message: 'Handshake Step One Complete',
+ signature: JSON.stringify(signature)
+ }
+ socket.send(JSON.stringify(response))
+ }
+
+ function handshakeStepTwo() {
+ /*
+ We will check that the caller role has beed defined at Step One.
+ */
+ if (caller.role === undefined) {
+ let response = {
+ result: 'Error',
+ message: 'Handshake Step One Not Completed.'
+ }
+ socket.send(JSON.stringify(response))
+ return
+ }
+ /*
+ We will check the signature at the message.
+ */
+ if (messageHeader.signature === undefined) {
+ let response = {
+ result: 'Error',
+ message: 'signature Not Provided.'
+ }
+ socket.send(JSON.stringify(response))
+ return
+ }
+
+ let signature = JSON.parse(messageHeader.signature)
+ caller.blockchainAccount = web3.eth.accounts.recover(signature)
+
+ if (caller.blockchainAccount === undefined) {
+ let response = {
+ result: 'Error',
+ message: 'Bad Signature.'
+ }
+ socket.send(JSON.stringify(response))
+ return
+ }
+ /*
+ The signature gives us the blockchain account, and the account the user profile.
+ */
+ let witnessUserProfile = NT.projects.socialTrading.globals.memory.maps.USER_PROFILES_BY_BLOCHAIN_ACCOUNT.get(caller.blockchainAccount)
+
+ if (witnessUserProfile === undefined) {
+ let response = {
+ result: 'Error',
+ message: 'userProfile Not Found.'
+ }
+ socket.send(JSON.stringify(response))
+ return
+ }
+ /*
+ The user profile based on the blockchain account, based on the signature,
+ it is our witness user profile, to validate the caller.
+ */
+ let signedMessage = JSON.parse(signature.message)
+
+ if (signedMessage.callerProfileHandle !== witnessUserProfile.userProfileHandle) {
+ let response = {
+ result: 'Error',
+ message: 'callerProfileHandle Does Not Match witnessUserProfile.'
+ }
+ socket.send(JSON.stringify(response))
+ return
+ }
+ /*
+ We will check that the signature includes this Network Node handle, to avoid
+ man in the middle attackts.
+ */
+ if (signedMessage.calledProfileHandle !== NT.NETWORK_NODE_USER_PROFILE_HANDLE) {
+ let response = {
+ result: 'Error',
+ message: 'calledProfileHandle Does Not Match This Network Node Handle.'
+ }
+ socket.send(JSON.stringify(response))
+ return
+ }
+ /*
+ We will check that the timestamp in the signature is the one we sent to the caller.
+ */
+ if (signedMessage.calledTimestamp !== calledTimestamp) {
+ let response = {
+ result: 'Error',
+ message: 'calledTimestamp Does Not Match calledTimestamp On Record.'
+ }
+ socket.send(JSON.stringify(response))
+ return
+ }
+ /*
+ All validations have been completed, the Handshake Prcedure finished well.
+ */
+ /*
+ We will remember the user profile behind this caller.
+ */
+ caller.userProfile = witnessUserProfile
+
+ let response = {
+ result: 'Ok',
+ message: 'Handshake Successful.'
+ }
+ socket.send(JSON.stringify(response))
+ }
+ }
+
+ } catch (err) {
+ console.log('[ERROR] Web Sockets Interface -> setUpWebSocketServer -> err.stack = ' + err.stack)
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Network/SA/Modules/WebSocketsClient.js b/Projects/Network/SA/Modules/WebSocketsClient.js
new file mode 100644
index 000000000..150f31932
--- /dev/null
+++ b/Projects/Network/SA/Modules/WebSocketsClient.js
@@ -0,0 +1,253 @@
+exports.newNetworkModulesWebSocketsClient = function newNetworkModulesWebSocketsClient() {
+
+ let thisObject = {
+ sendMessage: sendMessage,
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ let socketClient
+
+ let web3 = new SA.nodeModules.web3()
+ let called = {}
+ let selectedNetworkNode // This is a Network Node we pick to try to connect to.
+
+ return thisObject
+
+ function finalize() {
+ socketClient.close()
+ socketClient = undefined
+ networkInterface = undefined
+ peerInterface = undefined
+
+ web3 = undefined
+ called = 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.
+ {
+ "githubUsername": "Test-Network-Node-Profile",
+ "address": "0xa153469c57A91F5a59Fc6c45A37aD8dbad85e417"
+ }
+ */
+ selectedNetworkNode = {
+ userProfileHandle: "Test-Network-Node-Profile",
+ blockchainAccount: "0xa153469c57A91F5a59Fc6c45A37aD8dbad85e417",
+ 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 ouwn 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: DK.TEST_NETWORK_CLIENT_USER_PROFILE_HANDLE,
+ 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 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 attackts.
+ */
+ if (signedMessage.callerProfileHandle !== DK.TEST_NETWORK_CLIENT_USER_PROFILE_HANDLE) {
+ 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 attackts.
+ */
+ 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), DK.TEST_NETWORK_CLIENT_USER_PROFILE_PRIVATE_KEY)
+
+ 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
+ }
+ console.log('[INFO] Web Sockets Client -> stepTwoResponse -> response.message = ' + response.message)
+ /*
+ This was the end of the Handshake producere. We are connected to the
+ Network Node and from now on, all response messages will be received
+ at this following function.
+ */
+ 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.')
+ }
+
+ let socketMessage = {
+ messageType: 'Request',
+ payload: message
+ }
+ socketClient.onmessage = socketMessage => { onMenssage(socketMessage) }
+ socketClient.send(
+ JSON.stringify(socketMessage)
+ )
+
+ function onMenssage(socketMessage) {
+ try {
+
+ let response = JSON.parse(socketMessage.data)
+ /*
+ Chack if we are waiting for the Handshake response.
+ */
+
+ if (response.result === 'Ok') {
+ resolve(response.data)
+ } else {
+ console.log('[ERROR] Web Sockets Client -> onMenssage -> response.message = ' + response.message)
+ reject(response.message)
+ }
+
+ } catch (err) {
+ callbackFunction = undefined
+ console.log('[ERROR] Web Sockets Client -> err.stack = ' + err.stack)
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/ProjectsSchema.json b/Projects/ProjectsSchema.json
index ce4508dd5..2b8ea0bb8 100644
--- a/Projects/ProjectsSchema.json
+++ b/Projects/ProjectsSchema.json
@@ -884,12 +884,40 @@
"propertyName": "webAccess",
"functionName": "newFoundationsUtilitiesWebAccess",
"fileName": "WebAccess.js"
- },
+ }
+ ]
+ },
+ "SA": {
+ "utilities": [
{
"name": "Plugins",
"propertyName": "plugins",
"functionName": "newFoundationsUtilitiesPlugins",
"fileName": "Plugins.js"
+ },
+ {
+ "name": "Miscellaneous Functions",
+ "propertyName": "miscellaneousFunctions",
+ "functionName": "newFoundationsUtilitiesMiscellaneousFunctions",
+ "fileName": "MiscellaneousFunctions.js"
+ },
+ {
+ "name": "Files And Directories",
+ "propertyName": "filesAndDirectories",
+ "functionName": "newFoundationsUtilitiesFilesAndDirectories",
+ "fileName": "FilesAndDirectories.js"
+ },
+ {
+ "name": "Http Responses",
+ "propertyName": "httpResponses",
+ "functionName": "newFoundationsUtilitiesHttpResponses",
+ "fileName": "HttpResponses.js"
+ },
+ {
+ "name": "Http Requests",
+ "propertyName": "httpRequests",
+ "functionName": "newFoundationsUtilitiesHttpRequests",
+ "fileName": "HttpRequests.js"
}
]
},
@@ -984,18 +1012,18 @@
"folderName": "Learning-Bot/Low-Frequency-Learning"
},
{
- "name": "TensorFlow Models Manager",
- "propertyName": "tensorFlowModelsManager",
- "functionName": "newTensorFlowModelsManager",
- "fileName": "TensorFlowModelsManager.js",
- "folderName": "Learning-Bot/Low-Frequency-Learning"
+ "name": "TensorFlow Models Manager",
+ "propertyName": "tensorFlowModelsManager",
+ "functionName": "newTensorFlowModelsManager",
+ "fileName": "TensorFlowModelsManager.js",
+ "folderName": "Learning-Bot/Low-Frequency-Learning"
},
{
- "name": "ML Data Manager",
- "propertyName": "mlData",
- "functionName": "newMLDataObj",
- "fileName": "MLDataManager.js",
- "folderName": "Learning-Bot/Low-Frequency-Learning"
+ "name": "ML Data Manager",
+ "propertyName": "mlData",
+ "functionName": "newMLDataObj",
+ "fileName": "MLDataManager.js",
+ "folderName": "Learning-Bot/Low-Frequency-Learning"
}
]
}
@@ -1075,6 +1103,11 @@
"propertyName": "governance",
"UI": {
"globals": [
+ {
+ "name": "Designer",
+ "propertyName": "designer",
+ "functionName": "newGovernanceGlobalsDesigner"
+ },
{
"name": "Reports",
"propertyName": "reports",
@@ -1263,5 +1296,181 @@
"Features",
"Positions"
]
+ },
+ {
+ "name": "Network",
+ "propertyName": "network",
+ "NT": {
+ "globals": [],
+ "modules": [
+ {
+ "name": "Web Sockets Interface",
+ "propertyName": "webSocketsInterface",
+ "functionName": "newNetworkModulesWebSocketsInterface",
+ "fileName": "WebSocketsInterface.js"
+ }
+ ],
+ "utilities": []
+ },
+ "SA": {
+ "globals": [],
+ "modules": [
+ {
+ "name": "Web Sockets Client",
+ "propertyName": "webSocketsClient",
+ "functionName": "newNetworkModulesWebSocketsClient",
+ "fileName": "WebSocketsClient.js"
+ }
+ ],
+ "utilities": []
+ }
+ },
+ {
+ "name": "Social-Trading",
+ "propertyName": "socialTrading",
+ "NT": {
+ "globals": [
+ {
+ "name": "Memory",
+ "propertyName": "memory",
+ "functionName": "newSocialTradingGlobalsMemory",
+ "fileName": "Memory.js"
+ }
+ ],
+ "modules": [
+ {
+ "name": "User Profiles",
+ "propertyName": "queriesUserProfiles",
+ "functionName": "newSocialTradingModulesQueriesUserProfiles",
+ "fileName": "Queries/UserProfiles.js"
+ },
+ {
+ "name": "Bot Profile Stats",
+ "propertyName": "queriesBotProfileStats",
+ "functionName": "newSocialTradingModulesQueriesBotProfileStats",
+ "fileName": "Queries/BotProfileStats.js"
+ },
+ {
+ "name": "User Profile Stats",
+ "propertyName": "queriesUserProfileStats",
+ "functionName": "newSocialTradingModulesQueriesUserProfileStats",
+ "fileName": "Queries/UserProfileStats.js"
+ },
+ {
+ "name": "Profile Posts",
+ "propertyName": "queriesProfilePosts",
+ "functionName": "newSocialTradingModulesQueriesProfilePosts",
+ "fileName": "Queries/ProfilePosts.js"
+ },
+ {
+ "name": "Profile Followers",
+ "propertyName": "queriesProfileFollowers",
+ "functionName": "newSocialTradingModulesQueriesProfileFollowers",
+ "fileName": "Queries/ProfileFollowers.js"
+ },
+ {
+ "name": "Profile Following",
+ "propertyName": "queriesProfileFollowing",
+ "functionName": "newSocialTradingModulesQueriesProfileFollowing",
+ "fileName": "Queries/ProfileFollowing.js"
+ },
+ {
+ "name": "Post Replies",
+ "propertyName": "queriesPostReplies",
+ "functionName": "newSocialTradingModulesQueriesPostReplies",
+ "fileName": "Queries/PostReplies.js"
+ },
+ {
+ "name": "Events",
+ "propertyName": "queriesEvents",
+ "functionName": "newSocialTradingModulesQueriesEvents",
+ "fileName": "Queries/Events.js"
+ },
+ {
+ "name": "User Profile",
+ "propertyName": "socialGraphUserProfile",
+ "functionName": "newSocialTradingModulesSocialGraphUserProfile",
+ "fileName": "Social-Graph/UserProfile.js"
+ },
+ {
+ "name": "Bot Profile",
+ "propertyName": "socialGraphBotProfile",
+ "functionName": "newSocialTradingModulesSocialGraphBotProfile",
+ "fileName": "Social-Graph/BotProfile.js"
+ },
+ {
+ "name": "Post",
+ "propertyName": "socialGraphPost",
+ "functionName": "newSocialTradingModulesSocialGraphPost",
+ "fileName": "Social-Graph/Post.js"
+ },
+ {
+ "name": "Social Graph",
+ "propertyName": "socialGraph",
+ "functionName": "newSocialTradingModulesSocialGraph",
+ "fileName": "SocialGraph.js"
+ },
+ {
+ "name": "Bootstrap",
+ "propertyName": "bootstrap",
+ "functionName": "newSocialTradingModulesBootstrap",
+ "fileName": "Bootstrap.js"
+ },
+ {
+ "name": "Query",
+ "propertyName": "query",
+ "functionName": "newSocialTradingModulesQuery",
+ "fileName": "Query.js"
+ },
+ {
+ "name": "Event",
+ "propertyName": "event",
+ "functionName": "newSocialTradingModulesEvent",
+ "fileName": "Event.js"
+ },
+ {
+ "name": "Client Interface",
+ "propertyName": "clientInterface",
+ "functionName": "newSocialTradingModulesClientInterface",
+ "fileName": "ClientInterface.js"
+ },
+ {
+ "name": "Peer Interface",
+ "propertyName": "peerInterface",
+ "functionName": "newSocialTradingModulesPeerInterface",
+ "fileName": "PeerInterface.js"
+ }
+ ],
+ "utilities": [
+ {
+ "name": "Queries Validations",
+ "propertyName": "queriesValidations",
+ "functionName": "newSocialTradingUtilitiesQueriesValidations",
+ "fileName": "QueriesValidations.js"
+ }
+ ]
+ },
+ "SA": {
+ "globals": [
+ {
+ "name": "Query Constants",
+ "propertyName": "queryConstants",
+ "functionName": "newSocialTradingGlobalsQueryConstants",
+ "fileName": "QueryConstants.js"
+ },
+ {
+ "name": "Query Types",
+ "propertyName": "queryTypes",
+ "functionName": "newSocialTradingGlobalsQueryTypes",
+ "fileName": "QueryTypes.js"
+ },
+ {
+ "name": "Event Types",
+ "propertyName": "eventTypes",
+ "functionName": "newSocialTradingGlobalsEventTypes",
+ "fileName": "EventTypes.js"
+ }
+ ]
+ }
}
-]
+]
\ No newline at end of file
diff --git a/Projects/Social-Trading/NT/Globals/Memory.js b/Projects/Social-Trading/NT/Globals/Memory.js
new file mode 100644
index 000000000..6a42e762a
--- /dev/null
+++ b/Projects/Social-Trading/NT/Globals/Memory.js
@@ -0,0 +1,19 @@
+exports.newSocialTradingGlobalsMemory = function () {
+ /*
+ Here is the Data we are going to keep in memory.
+ */
+ let thisObject = {
+ 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.
+ EVENTS: new Map(), // This is the registry of all events received that prevents processing them more than once.
+ },
+ arrays: {
+ 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.
+ }
+ }
+
+ return thisObject
+}
\ No newline at end of file
diff --git a/Projects/Social-Trading/NT/Modules/Bootstrap.js b/Projects/Social-Trading/NT/Modules/Bootstrap.js
new file mode 100644
index 000000000..58ab6bbe1
--- /dev/null
+++ b/Projects/Social-Trading/NT/Modules/Bootstrap.js
@@ -0,0 +1,58 @@
+exports.newBootstrap = function newBootstrap() {
+ /*
+ This module helps the Network Node to bootstrap, by
+ loading all the services and data that needs to start
+ operating.
+ */
+ let thisObject = {
+ /* Framework Functions */
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ return thisObject
+
+ function finalize() {
+
+ }
+
+ async function initialize() {
+
+ let pluginFileNames = await SA.projects.foundations.utilities.plugins.getPluginFileNames(
+ 'Governance',
+ 'User-Profiles'
+ )
+
+ for (let i = 0; i < pluginFileNames.length; i++) {
+ let pluginFileName = pluginFileNames[i]
+
+ let pluginFileContent = await SA.projects.foundations.utilities.plugins.getPluginFileContent(
+ 'Governance',
+ 'User-Profiles',
+ pluginFileName
+ )
+
+ let userProfilePlugin = JSON.parse(pluginFileContent)
+ let config = JSON.parse(userProfilePlugin.config)
+ let signatureObject = config.signature
+ let web3 = new SA.nodeModules.web3()
+ let blockchainAccount = web3.eth.accounts.recover(signatureObject)
+ let ranking = 0 // TODO: read the blockchain balance and transactions from the Treasury Account to calculate the profile ranking.
+ let userProfileId = userProfilePlugin.id
+ let userHandle = config.signature.message
+
+ let userProfile = NT.projects.socialTrading.modules.socialGraphUserProfile.newSocialTradingModulesSocialGraphUserProfile()
+ userProfile.initialize(
+ userProfileId,
+ userHandle,
+ blockchainAccount,
+ ranking
+ )
+
+ NT.projects.socialTrading.globals.memory.maps.USER_PROFILES_BY_ID.set(userProfileId, userProfile)
+ NT.projects.socialTrading.globals.memory.maps.USER_PROFILES_BY_HANDLE.set(userHandle, userProfile)
+ NT.projects.socialTrading.globals.memory.maps.USER_PROFILES_BY_BLOCHAIN_ACCOUNT.set(blockchainAccount, userProfile)
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Social-Trading/NT/Modules/ClientInterface.js b/Projects/Social-Trading/NT/Modules/ClientInterface.js
new file mode 100644
index 000000000..16a1f1978
--- /dev/null
+++ b/Projects/Social-Trading/NT/Modules/ClientInterface.js
@@ -0,0 +1,217 @@
+exports.newSocialTradingModulesClientInterface = function newSocialTradingModulesClientInterface() {
+ /*
+ This module represents the Interface the Network Node have
+ with Network Clients connected to it. There are two things
+ 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.
+ */
+ let thisObject = {
+ messageReceived: messageReceived,
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ return thisObject
+
+ function finalize() {
+
+ }
+
+ function initialize() {
+
+ }
+
+ async function messageReceived(message, userProfile) {
+ let messageHeader
+ try {
+ messageHeader = JSON.parse(message)
+ } catch (err) {
+ let response = {
+ result: 'Error',
+ message: 'Client Interface message Not Coorrect JSON Format.'
+ }
+ return response
+ }
+
+ if (messageHeader.requestType === undefined) {
+ let response = {
+ result: 'Error',
+ message: 'Client Interface requestType Not Provided.'
+ }
+ return response
+ }
+
+ if (messageHeader.requestType !== 'Event' && messageHeader.requestType !== 'Query') {
+ let response = {
+ result: 'Error',
+ message: 'Client Interface requestType Not Supported.'
+ }
+ return response
+ }
+
+ switch (messageHeader.requestType) {
+ case 'Event': {
+ return await eventReceived(messageHeader.eventMessage, userProfile)
+ }
+ case 'Query': {
+ return await queryReceived(messageHeader.queryMessage, userProfile)
+ }
+ }
+ }
+
+ async function eventReceived(eventMessage, userProfile) {
+ /*
+ We expect here a JSON string with some or all of the following properties:
+
+ {
+ "eventId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
+ "eventType": 10,
+ "emitterUserProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
+ "targetUserProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db",
+ "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
+ }
+ */
+
+ let eventReceived
+ try {
+ eventReceived = JSON.parse(eventMessage)
+ } catch (err) {
+ let response = {
+ result: 'Error',
+ message: 'Client Interface eventMessage Not Coorrect JSON Format.'
+ }
+ return response
+ }
+ /*
+ At the Client Interface, events need to be emmitted by the same userProfile that is
+ connected at the Network Node.
+ */
+ if (eventReceived.emitterUserProfileId !== userProfile.userProfileId) {
+ let response = {
+ result: 'Error',
+ message: 'Client Interface emitterUserProfileId !== userProfileId Connected to Network Node.'
+ }
+ return response
+ }
+ /*
+ We will not accept events that have already been processed.
+ */
+
+ if (NT.projects.socialTrading.globals.memory.maps.EVENTS.get(eventReceived.eventId) !== undefined) {
+ let response = {
+ result: 'Error',
+ message: 'Client Interface Event Already Exists.'
+ }
+ return response
+ }
+ /*
+ Here we will process the event and change the state of the Social Graph.
+ */
+ try {
+ let event = NT.projects.socialTrading.modules.event.newSocialTradingModulesEvent()
+ event.initialize(eventReceived)
+ NT.projects.socialTrading.globals.memory.maps.EVENTS.set(eventReceived.eventId, event)
+
+ let response = {
+ result: 'Ok',
+ message: 'Client Interface Event Processed.'
+ }
+ return response
+
+ } catch (err) {
+ /*
+ 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.
+ */
+ let errorMessage = err.message
+ if (errorMessage === undefined) { errorMessage = err }
+ let response = {
+ result: 'Error',
+ message: 'Client Interface ' + errorMessage
+ }
+ return response
+ }
+ }
+
+ 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 Coorrect JSON Format.'
+ }
+ return response
+ }
+ /*
+ At the Client Interface, queries need to be emmitted 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)
+
+ let response = {
+ result: 'Ok',
+ message: 'Client Interface Query Processed.',
+ data: query.execute()
+ }
+ return response
+
+ } catch (err) {
+ /*
+ Any exception that happens while trying to execute the query.
+ */
+ let errorMessage = err.message
+ if (errorMessage === undefined) { errorMessage = err }
+ let response = {
+ result: 'Error',
+ message: 'Client Interface ' + errorMessage
+ }
+ return response
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Social-Trading/NT/Modules/Event.js b/Projects/Social-Trading/NT/Modules/Event.js
new file mode 100644
index 000000000..7db74847a
--- /dev/null
+++ b/Projects/Social-Trading/NT/Modules/Event.js
@@ -0,0 +1,406 @@
+exports.newSocialTradingModulesEvent = function newSocialTradingModulesEvent() {
+ /*
+ An Event is anything that happens system wide that
+ needs to be delivered to relevant entities via
+ the Superalgos Network.
+
+ An Event (in contrast to a Query) produces a change
+ on the state of the social graph.
+ */
+ let thisObject = {
+ /* Unique Key */
+ eventId: undefined,
+ /* Referenced Entities Unique Keys */
+ emitterUserProfileId: undefined,
+ targetUserProfileId: undefined,
+ emitterBotProfileId: undefined,
+ targetBotProfileId: undefined,
+ emitterPostHash: undefined,
+ targetPostHash: undefined,
+ /* Event Unitque Properties */
+ eventType: undefined,
+ timestamp: undefined,
+ /* Bot Related Properties */
+ botAsset: undefined,
+ botExchange: undefined,
+ botEnabled: undefined,
+ /* Framework Functions */
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ return thisObject
+
+ function finalize() {
+
+ }
+
+ function initialize(eventReceived) {
+ /*
+ Store the message properties into this object properties.
+ */
+ thisObject.eventId = eventReceived.eventId
+ thisObject.emitterUserProfileId = eventReceived.emitterUserProfileId
+ thisObject.targetUserProfileId = eventReceived.targetUserProfileId
+ thisObject.emitterBotProfileId = eventReceived.emitterBotProfileId
+ thisObject.targetBotProfileId = eventReceived.targetBotProfileId
+ thisObject.emitterPostHash = eventReceived.emitterPostHash
+ thisObject.targetPostHash = eventReceived.targetPostHash
+ thisObject.eventType = eventReceived.eventType
+ thisObject.timestamp = eventReceived.timestamp
+ thisObject.botAsset = eventReceived.botAsset
+ thisObject.botExchange = eventReceived.botExchange
+ thisObject.botEnabled = eventReceived.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 = NT.projects.socialTrading.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 = NT.projects.socialTrading.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 (postingEvents()) {
+ eventCounters()
+ return
+ }
+ if (followingEvents()) {
+ eventCounters()
+ return
+ }
+ if (reactionEvents()) {
+ eventCounters()
+ return
+ }
+ if (botEvents()) {
+ eventCounters()
+ return
+ }
+
+ function postingEvents() {
+ /*
+ Is is related to Posting?
+ */
+ if (
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.NEW_USER_POST ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REPLY_TO_USER_POST ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REPOST_USER_POST ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.QUOTE_REPOST_USER_POST ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.NEW_BOT_POST ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REPLY_TO_BOT_POST ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REPOST_BOT_POST ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.QUOTE_REPOST_BOT_POST
+ ) {
+ /*
+ New User Post
+ */
+ if (
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.NEW_USER_POST ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REPLY_TO_USER_POST ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REPOST_USER_POST ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.QUOTE_REPOST_USER_POST
+ ) {
+ emitterUserProfile.addPost(
+ thisObject.emitterUserProfileId,
+ thisObject.targetUserProfileId,
+ thisObject.emitterBotProfileId,
+ thisObject.targetBotProfileId,
+ thisObject.emitterPostHash,
+ thisObject.targetPostHash,
+ thisObject.eventType - 10,
+ thisObject.timestamp
+ )
+ return true
+ }
+ /*
+ New Bot Post
+ */
+ if (
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.NEW_BOT_POST ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REPLY_TO_BOT_POST ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REPOST_BOT_POST ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.QUOTE_REPOST_BOT_POST
+ ) {
+ if (emitterBotProfile === undefined) {
+ throw ('Emitter Bot Profile Id Not Provided.')
+ }
+
+ emitterBotProfile.addPost(
+ thisObject.emitterUserProfileId,
+ thisObject.targetUserProfileId,
+ thisObject.emitterBotProfileId,
+ thisObject.targetBotProfileId,
+ thisObject.emitterPostHash,
+ thisObject.targetPostHash,
+ thisObject.eventType - 20,
+ thisObject.timestamp
+ )
+ return true
+ }
+ /*
+ Remove User Post
+ */
+ if (
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REMOVE_USER_POST
+ ) {
+ emitterUserProfile.removePost(
+ thisObject.emitterPostHash
+ )
+ return true
+ }
+ /*
+ Remove Bot Post
+ */
+ if (
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REMOVE_BOT_POST
+ ) {
+ if (emitterBotProfile === undefined) {
+ throw ('Emitter Bot Profile Id Not Provided.')
+ }
+
+ emitterBotProfile.removePost(
+ thisObject.emitterPostHash
+ )
+ return true
+ }
+ }
+ }
+
+ function followingEvents() {
+ /*
+ Is is a following?
+ */
+ if (
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.FOLLOW_USER_PROFILE ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.UNFOLLOW_USER_PROFILE ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.FOLLOW_BOT_PROFILE ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.UNFOLLOW_BOT_PROFILE
+ ) {
+ switch (thisObject.eventType) {
+ case SA.projects.socialTrading.globals.eventTypes.FOLLOW_USER_PROFILE: {
+
+ if (thisObject.emitterUserProfileId === undefined) {
+ throw ('Emitter User Profile Id Not Provided.')
+ }
+
+ if (thisObject.targetUserProfileId === undefined) {
+ throw ('Target User Profile Id Not Provided.')
+ }
+
+ emitterUserProfile.addFollowing(
+ thisObject.targetUserProfileId
+ )
+ targetUserProfile.addFollower(
+ thisObject.emitterUserProfileId
+ )
+ break
+ }
+ case SA.projects.socialTrading.globals.eventTypes.UNFOLLOW_USER_PROFILE: {
+
+ if (thisObject.emitterUserProfileId === undefined) {
+ throw ('Emitter User Profile Id Not Provided.')
+ }
+
+ if (thisObject.targetUserProfileId === undefined) {
+ throw ('Target User Profile Id Not Provided.')
+ }
+
+ emitterUserProfile.removeFollowing(
+ thisObject.targetUserProfileId
+ )
+ targetUserProfile.removeFollower(
+ thisObject.emitterUserProfileId
+ )
+ break
+ }
+ case SA.projects.socialTrading.globals.eventTypes.FOLLOW_BOT_PROFILE: {
+
+ if (thisObject.emitterBotProfileId === undefined) {
+ throw ('Emitter Bot Profile Id Not Provided.')
+ }
+
+ if (thisObject.targetBotProfileId === undefined) {
+ throw ('Target Bot Profile Id Not Provided.')
+ }
+
+ emitterBotProfile.addFollowing(
+ thisObject.targetUserProfileId,
+ thisObject.targetBotProfileId
+ )
+ targetBotProfile.addFollower(
+ thisObject.emitterUserProfileId,
+ thisObject.emitterBotProfileId
+ )
+ break
+ }
+ case SA.projects.socialTrading.globals.eventTypes.UNFOLLOW_BOT_PROFILE: {
+
+ if (thisObject.emitterBotProfileId === undefined) {
+ throw ('Emitter Bot Profile Id Not Provided.')
+ }
+
+ if (thisObject.targetBotProfileId === undefined) {
+ throw ('Target Bot Profile Id Not Provided.')
+ }
+
+ emitterBotProfile.removeFollowing(
+ thisObject.targetBotProfileId
+ )
+ targetBotProfile.removeFollower(
+ thisObject.emitterBotProfileId
+ )
+ break
+ }
+ }
+ return true
+ }
+ }
+
+ function reactionEvents() {
+ /*
+ Is is a Reaction?
+ */
+ let targetPost
+
+ if (
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.ADD_REACTION_LIKE ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.ADD_REACTION_LOVE ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.ADD_REACTION_HAHA ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.ADD_REACTION_WOW ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.ADD_REACTION_SAD ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.ADD_REACTION_ANGRY ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.ADD_REACTION_CARE
+ ) {
+
+ if (targetBotProfile !== undefined) {
+ targetPost = targetBotProfile.posts.get(thisObject.targetPostHash)
+ } else {
+ targetPost = targetUserProfile.posts.get(thisObject.targetPostHash)
+ }
+
+ if (targetPost === undefined) {
+ throw ('Target Post Not Found')
+ }
+
+ targetPost.addReaction(thisObject.eventType - 100)
+ return true
+ }
+ if (
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REMOVE_REACTION_LIKE ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REMOVE_REACTION_LOVE ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REMOVE_REACTION_HAHA ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REMOVE_REACTION_WOW ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REMOVE_REACTION_SAD ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REMOVE_REACTION_ANGRY ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REMOVE_REACTION_CARE
+ ) {
+
+ if (targetBotProfile !== undefined) {
+ targetPost = targetBotProfile.posts.get(thisObject.targetPostHash)
+ } else {
+ targetPost = targetUserProfile.posts.get(thisObject.targetPostHash)
+ }
+
+ if (targetPost === undefined) {
+ throw ('Target Post Not Found')
+ }
+
+ targetPost.removeReaction(thisObject.eventType - 200)
+ return true
+ }
+ }
+
+ function botEvents() {
+ /*
+ Is is a Bot?
+ */
+ if (
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.ADD_BOT ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.REMOVE_BOT ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.ENABLE_BOT ||
+ thisObject.eventType === SA.projects.socialTrading.globals.eventTypes.DISABLE_BOT
+ ) {
+ switch (thisObject.eventType) {
+ case SA.projects.socialTrading.globals.eventTypes.ADD_BOT: {
+ emitterUserProfile.addBot(
+ thisObject.emitterUserProfileId,
+ thisObject.emitterBotProfileId,
+ thisObject.botAsset,
+ thisObject.botExchange,
+ thisObject.botEnabled
+ )
+ break
+ }
+ case SA.projects.socialTrading.globals.eventTypes.REMOVE_BOT: {
+ emitterUserProfile.removeBot(
+ thisObject.emitterBotProfileId
+ )
+ break
+ }
+ case SA.projects.socialTrading.globals.eventTypes.ENABLE_BOT: {
+ emitterUserProfile.enableBot(
+ thisObject.emitterBotProfileId
+ )
+ break
+ }
+ case SA.projects.socialTrading.globals.eventTypes.DISABLE_BOT: {
+ emitterUserProfile.disableBot(
+ thisObject.emitterBotProfileId
+ )
+ break
+ }
+ }
+ return true
+ }
+ }
+
+ function eventCounters() {
+ emitterUserProfile.emitterEventsCount++
+ if (targetUserProfile !== undefined) {
+ targetUserProfile.targetEventsCount++
+ }
+ if (emitterBotProfile !== undefined) {
+ emitterUserProfile.emitterEventsCount++
+ }
+ if (targetBotProfile !== undefined) {
+ targetBotProfile.targetEventsCount++
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Network/peerInterface.js b/Projects/Social-Trading/NT/Modules/PeerInterface.js
similarity index 71%
rename from Network/peerInterface.js
rename to Projects/Social-Trading/NT/Modules/PeerInterface.js
index 423579324..6cb730381 100644
--- a/Network/peerInterface.js
+++ b/Projects/Social-Trading/NT/Modules/PeerInterface.js
@@ -1,4 +1,4 @@
-exports.newPeerInterface = function newPeerInterface() {
+exports.newSocialTradingModulesPeerInterface = function newSocialTradingModulesPeerInterface() {
let thisObject = {
initialize: initialize,
diff --git a/Projects/Social-Trading/NT/Modules/Queries/BotProfileStats.js b/Projects/Social-Trading/NT/Modules/Queries/BotProfileStats.js
new file mode 100644
index 000000000..2db10f72b
--- /dev/null
+++ b/Projects/Social-Trading/NT/Modules/Queries/BotProfileStats.js
@@ -0,0 +1,52 @@
+exports.newSocialTradingModulesQueriesBotProfileStats = function newSocialTradingModulesQueriesBotProfileStats() {
+
+ let thisObject = {
+ profile: undefined,
+ execute: execute,
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ return thisObject
+
+ function finalize() {
+ thisObject.profile = undefined
+ }
+
+ function initialize(queryReceived) {
+ /*
+ Validate User Profile
+ */
+ let userProfile
+ if (queryReceived.targetUserProfileId !== undefined) {
+ userProfile = NT.projects.socialTrading.globals.memory.maps.USER_PROFILES_BY_ID.get(queryReceived.targetUserProfileId)
+ } else {
+ userProfile = NT.projects.socialTrading.globals.memory.maps.USER_PROFILES_BY_HANDLE.get(queryReceived.targetUserProfileHandle)
+ }
+
+ if (userProfile === undefined) {
+ throw ('Target User Profile Not Found.')
+ }
+ /*
+ Validate Bot Profile
+ */
+ thisObject.profile = userProfile.bots.get(queryReceived.targetBotProfileId)
+ if (thisObject.profile === undefined) {
+ throw ('Target Bot Profile Not Found.')
+ }
+ }
+
+ function execute() {
+
+ return {
+ "userProfileId": thisObject.profile.userProfileId,
+ "botProfileId": thisObject.profile.botProfileId,
+ "botProfileHandle": thisObject.profile.botProfileHandle,
+ "followingCount": thisObject.profile.following.size,
+ "followersCount": thisObject.profile.followers.size,
+ "postsCount": thisObject.profile.posts.size,
+ "emitterEventsCount": thisObject.profile.emitterEventsCount,
+ "targetEventsCount": thisObject.profile.targetEventsCount
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Social-Trading/NT/Modules/Queries/Events.js b/Projects/Social-Trading/NT/Modules/Queries/Events.js
new file mode 100644
index 000000000..1732fe794
--- /dev/null
+++ b/Projects/Social-Trading/NT/Modules/Queries/Events.js
@@ -0,0 +1,276 @@
+exports.newSocialTradingModulesQueriesEvents = function newSocialTradingModulesQueriesEvents() {
+ /*
+ This is the query executed to fill the timeline of a certain User or Bot Profile.
+
+ */
+ let thisObject = {
+ profile: undefined,
+ initialIndex: undefined,
+ amountRequested: undefined,
+ direction: undefined,
+ execute: execute,
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ return thisObject
+
+ function finalize() {
+ thisObject.profile = undefined
+ }
+
+ function initialize(queryReceived) {
+
+ NT.projects.socialTrading.utilities.queriesValidations.profilesValidations(queryReceived, thisObject)
+ NT.projects.socialTrading.utilities.queriesValidations.arrayValidations(queryReceived, thisObject, NT.memory.arrays.EVENTS)
+
+ }
+
+ function execute() {
+ let response = []
+ switch (thisObject.direction) {
+ case SA.projects.socialTrading.globals.queryConstants.DIRECTION_FUTURE: {
+ for (let i = thisObject.initialIndex; i < thisObject.initialIndex + thisObject.amountRequested; i++) {
+ let event = NT.memory.arrays.EVENTS[i]
+ if (event === undefined) { break }
+ checkEventContext(event)
+ }
+ break
+ }
+ case SA.projects.socialTrading.globals.queryConstants.DIRECTION_PAST: {
+ for (let i = thisObject.initialIndex; i > thisObject.initialIndex - thisObject.amountRequested; i--) {
+ let event = NT.memory.arrays.EVENTS[i]
+ if (event === undefined) { break }
+ checkEventContext(event)
+ }
+ break
+ }
+ }
+ return response
+
+ function checkEventContext(event) {
+ /*
+ For an event to be returned at the response of this query, it needs to be related
+ to the profile making the query. How it can be related?
+
+ 1. The Emitter or Target profile must be the same as the Context Profile.
+ 2. The Emitter or Traget profile must be at the Following map of the Context Profile.
+ 3. The Emmiter or Target post must be belong to any profile at the Following of the Context Profile.
+
+ Any of the above happening, means that indeed it is related.
+ */
+ let emitterUserProfile = NT.projects.socialTrading.globals.memory.maps.USER_PROFILES_BY_ID.get(eventReceived.emitterUserProfileId)
+ let emitterBotProfile = emitterUserProfile.bots.get(eventReceived.emitterBotProfileId)
+ let emitterPost = emitterUserProfile.posts.get(eventReceived.emitterPostHash)
+
+ let targetUserProfile = NT.projects.socialTrading.globals.memory.maps.USER_PROFILES_BY_ID.get(eventReceived.targetUserProfileId)
+ let targetBotProfile
+ let targetPost
+
+ if (targetUserProfile !== undefined) {
+ targetBotProfile = targetUserProfile.bots.get(eventReceived.targetBotProfileId)
+ targetPost = targetUserProfile.posts.get(eventReceived.targetPostHash)
+ }
+ /*
+ Test #1 : The Emitter or Target profile must be the same as the Context Profile.
+ */
+ if (thisObject.profile.botProfileId === undefined) {
+ /*
+ The context is a User Profile
+ */
+ if (emitterUserProfile.userProfileId === thisObject.profile.userProfileId) {
+ addToResponse(event)
+ return
+ }
+ if (targetUserProfile !== undefined) {
+ if (targetUserProfile.userProfileId === thisObject.profile.userProfileId) {
+ addToResponse(event)
+ return
+ }
+ }
+ } else {
+ /*
+ The context is a Bot Profile
+ */
+ if (emitterBotProfile !== undefined) {
+ if (emitterBotProfile.botProfileId === thisObject.profile.botProfileId) {
+ addToResponse(event)
+ return
+ }
+ }
+ if (targetBotProfile !== undefined) {
+ if (targetBotProfile.botProfileId === thisObject.profile.botProfileId) {
+ addToResponse(event)
+ return
+ }
+ }
+ }
+ /*
+ Test #2 : The Emitter or Traget profile must be at the Following map of the Context Profile.
+ */
+ if (thisObject.profile.botProfileId === undefined) {
+ /*
+ The context is a User Profile
+ */
+ if (thisObject.profile.following.get(emitterUserProfile.userProfileId) !== undefined) {
+ addToResponse(event)
+ return
+ }
+ if (targetUserProfile !== undefined) {
+ if (thisObject.profile.following.get(targetUserProfile.userProfileId) !== undefined) {
+ addToResponse(event)
+ return
+ }
+ }
+ } else {
+ /*
+ The context is a Bot Profile
+ */
+ if (emitterBotProfile !== undefined) {
+ if (thisObject.profile.following.get(emitterBotProfile.botProfileId) !== undefined) {
+ addToResponse(event)
+ return
+ }
+ }
+ if (targetBotProfile !== undefined) {
+ if (thisObject.profile.following.get(targetBotProfile.botProfileId) !== undefined) {
+ addToResponse(event)
+ return
+ }
+ }
+ }
+ /*
+ Test #3 : The Emmiter or Target post must be belong to any profile at the Following of the Context Profile.
+ */
+ if (thisObject.profile.botProfileId === undefined) {
+ /*
+ The context is a User Profile
+ */
+ if (emitterPost !== undefined) {
+ if (thisObject.profile.following.get(emitterPost.emitterUserProfileId) !== undefined) {
+ addToResponse(event)
+ return
+ }
+ }
+ if (emitterPost !== undefined) {
+ if (thisObject.profile.following.get(emitterPost.targetUserProfileId) !== undefined) {
+ addToResponse(event)
+ return
+ }
+ }
+ if (targetPost !== undefined) {
+ if (thisObject.profile.following.get(targetPost.emitterUserProfileId) !== undefined) {
+ addToResponse(event)
+ return
+ }
+ }
+ if (targetPost !== undefined) {
+ if (thisObject.profile.following.get(targetPost.targetUserProfileId) !== undefined) {
+ addToResponse(event)
+ return
+ }
+ }
+ } else {
+ /*
+ The context is a Bot Profile
+ */
+ if (emitterPost !== undefined) {
+ if (thisObject.profile.following.get(emitterPost.emitterBotProfileId) !== undefined) {
+ addToResponse(event)
+ return
+ }
+ }
+ if (emitterPost !== undefined) {
+ if (thisObject.profile.following.get(emitterPost.targetBotProfileId) !== undefined) {
+ addToResponse(event)
+ return
+ }
+ }
+ if (targetPost !== undefined) {
+ if (thisObject.profile.following.get(targetPost.emitterBotProfileId) !== undefined) {
+ addToResponse(event)
+ return
+ }
+ }
+ if (targetPost !== undefined) {
+ if (thisObject.profile.following.get(targetPost.targetBotProfileId) !== undefined) {
+ addToResponse(event)
+ return
+ }
+ }
+ }
+
+ function addToResponse(event) {
+
+ let eventResponse = {
+ eventId: event.eventId,
+ eventType: event.eventType,
+ emitterUserProfileId: event.emitterUserProfileId,
+ targetUserProfileId: event.targetUserProfileId,
+ emitterBotProfileId: event.emitterBotProfileId,
+ targetBotProfileId: event.targetBotProfileId,
+ emitterPostHash: event.emitterPostHash,
+ targetPostHash: event.targetPostHash,
+ timestamp: event.timestamp,
+ botAsset: event.botAsset,
+ botExchange: event.botExchange,
+ botEnabled: event.botEnabled
+ }
+
+ if (emitterUserProfile !== undefined) {
+ let query = NT.projects.socialTrading.modules.queriesUserProfileStats.newSocialTradingModulesQueriesUserProfileStats()
+ query.initialize({ targetUserProfileId: event.emitterUserProfileId })
+ eventResponse.emitterUserProfile = query.execute()
+ query.finalize()
+ }
+
+ if (targetUserProfile !== undefined) {
+ let query = NT.projects.socialTrading.modules.queriesUserProfileStats.newSocialTradingModulesQueriesUserProfileStats()
+ query.initialize({ targetUserProfileId: event.targetUserProfileId })
+ eventResponse.targetUserProfile = query.execute()
+ query.finalize()
+ }
+
+ if (emitterBotProfile !== undefined) {
+ let query = NT.projects.socialTrading.modules.queriesBotProfileStats.newSocialTradingModulesQueriesBotProfileStats()
+ query.initialize({ targetUserProfileId: event.emitterUserProfileId, targetBotProfileId: emitterBotProfileId })
+ eventResponse.emitterBotProfile = query.execute()
+ query.finalize()
+ }
+
+ if (targetBotProfile !== undefined) {
+ let query = NT.projects.socialTrading.modules.queriesBotProfileStats.newSocialTradingModulesQueriesBotProfileStats()
+ query.initialize({ targetUserProfileId: event.targetUserProfileId, targetBotProfileId: targetBotProfileId })
+ eventResponse.targetBotProfile = query.execute()
+ query.finalize()
+ }
+
+ if (emitterPost !== undefined) {
+ eventResponse.emitterPost = addPost(emitterPost)
+ }
+
+ if (targetPost !== undefined) {
+ eventResponse.targetPost = addPost(targetPost)
+ }
+
+ response.push(eventResponse)
+
+ function addPost(post) {
+ let postResponse = {
+ emitterUserProfileId: post.emitterUserProfileId,
+ targetUserProfileId: post.targetUserProfileId,
+ emitterBotProfileId: post.emitterBotProfileId,
+ targetBotProfileId: post.targetBotProfileId,
+ emitterPostHash: post.emitterPostHash,
+ targetPostHash: post.targetPostHash,
+ postType: post.postType,
+ timestamp: post.timestamp,
+ repliesCount: post.replies.size,
+ reactions: Array.from(post.reactions)
+ }
+ return postResponse
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Social-Trading/NT/Modules/Queries/PostReplies.js b/Projects/Social-Trading/NT/Modules/Queries/PostReplies.js
new file mode 100644
index 000000000..d9af6ea72
--- /dev/null
+++ b/Projects/Social-Trading/NT/Modules/Queries/PostReplies.js
@@ -0,0 +1,81 @@
+exports.newSocialTradingModulesQueriesPostReplies = function newSocialTradingModulesQueriesPostReplies() {
+ /*
+ Each Post regardless if it is authored by a User or Bot Profile,
+ can have replies. This query is designed for Network Clients to
+ fetch the posts metadata that are replies to a certain post.
+
+ This is the query executed at the Network Client to fill the page
+ of a certain post, with all its replies.
+ */
+ let thisObject = {
+ array: undefined,
+ profile: undefined,
+ post: undefined,
+ initialIndex: undefined,
+ amountRequested: undefined,
+ direction: undefined,
+ execute: execute,
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ return thisObject
+
+ function finalize() {
+ thisObject.array = undefined
+ thisObject.profile = undefined
+ thisObject.post = undefined
+ }
+
+ function initialize(queryReceived) {
+
+ thisObject.array = Array.from(thisObject.post.replies)
+
+ NT.projects.socialTrading.utilities.queriesValidations.profilesValidations(queryReceived, thisObject)
+ NT.projects.socialTrading.utilities.queriesValidations.postValidations(queryReceived, thisObject)
+ NT.projects.socialTrading.utilities.queriesValidations.arrayValidations(queryReceived, thisObject, thisObject.array)
+
+ }
+
+ function execute() {
+
+ let response = []
+
+
+ switch (thisObject.direction) {
+ case SA.projects.socialTrading.globals.queryConstants.DIRECTION_FUTURE: {
+ for (let i = thisObject.initialIndex; i < thisObject.initialIndex + thisObject.amountRequested; i++) {
+ let arrayItem = thisObject.array[i]
+ if (post === undefined) { break }
+ addToResponse(arrayItem)
+ }
+ break
+ }
+ case SA.projects.socialTrading.globals.queryConstants.DIRECTION_PAST: {
+ for (let i = thisObject.initialIndex; i > thisObject.initialIndex - thisObject.amountRequested; i--) {
+ let arrayItem = thisObject.array[i]
+ if (post === undefined) { break }
+ addToResponse(arrayItem)
+ }
+ break
+ }
+ }
+ return response
+
+ function addToResponse(post) {
+ let postResponse = {
+ emitterUserProfileId: post.emitterUserProfileId,
+ targetUserProfileId: post.targetUserProfileId,
+ emitterBotProfileId: post.emitterBotProfileId,
+ targetBotProfileId: post.targetBotProfileId,
+ emitterPostHash: post.emitterPostHash,
+ targetPostHash: post.targetPostHash,
+ postType: post.postType,
+ timestamp: post.timestamp,
+ repliesCount: post.replies.size,
+ reactions: Array.from(post.reactions)
+ }
+ response.push(postResponse)
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Social-Trading/NT/Modules/Queries/ProfileFollowers.js b/Projects/Social-Trading/NT/Modules/Queries/ProfileFollowers.js
new file mode 100644
index 000000000..ce9ba104d
--- /dev/null
+++ b/Projects/Social-Trading/NT/Modules/Queries/ProfileFollowers.js
@@ -0,0 +1,65 @@
+exports.newSocialTradingModulesQueriesProfileFollowers = function newSocialTradingModulesQueriesProfileFollowers() {
+ /*
+ This module represents the query that allows a Network Client to know
+ all the User or Bot profiles that are following a certain User or Bot profile.
+ */
+ let thisObject = {
+ array: undefined,
+ profile: undefined,
+ initialIndex: undefined,
+ amountRequested: undefined,
+ direction: undefined,
+ execute: execute,
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ return thisObject
+
+ function finalize() {
+ thisObject.array = undefined
+ thisObject.profile = undefined
+ }
+
+ function initialize(queryReceived) {
+
+ thisObject.array = Array.from(thisObject.profile.followers)
+
+ NT.projects.socialTrading.utilities.queriesValidations.profilesValidations(queryReceived, thisObject)
+ NT.projects.socialTrading.utilities.queriesValidations.arrayValidations(queryReceived, thisObject, thisObject.array)
+
+ }
+
+ function execute() {
+
+ let response = []
+
+ switch (thisObject.direction) {
+ case SA.projects.socialTrading.globals.queryConstants.DIRECTION_FUTURE: {
+ for (let i = thisObject.initialIndex; i < thisObject.initialIndex + thisObject.amountRequested; i++) {
+ let arrayItem = thisObject.array[i]
+ if (arrayItem === undefined) { break }
+ addToResponse(arrayItem)
+ }
+ break
+ }
+ case NT.projects.socialTrading.globals.queryConstants.DIRECTION_PAST: {
+ for (let i = thisObject.initialIndex; i > thisObject.initialIndex - thisObject.amountRequested; i--) {
+ let arrayItem = thisObject.array[i]
+ if (arrayItem === undefined) { break }
+ addToResponse(arrayItem)
+ }
+ break
+ }
+ }
+ return response
+
+ function addToResponse(arrayItem) {
+ let postResponse = {
+ emitterUserProfileId: arrayItem.emitterUserProfileId,
+ emitterBotProfileId: arrayItem.emitterBotProfileId
+ }
+ response.push(postResponse)
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Social-Trading/NT/Modules/Queries/ProfileFollowing.js b/Projects/Social-Trading/NT/Modules/Queries/ProfileFollowing.js
new file mode 100644
index 000000000..a04791cac
--- /dev/null
+++ b/Projects/Social-Trading/NT/Modules/Queries/ProfileFollowing.js
@@ -0,0 +1,65 @@
+exports.newSocialTradingModulesQueriesProfileFollowing = function newSocialTradingModulesQueriesProfileFollowing() {
+ /*
+ This module represents the query that allows a Network Client to know
+ all the User or Bot profiles that are being followed by a certain User or Bot profile.
+ */
+ let thisObject = {
+ array: undefined,
+ profile: undefined,
+ initialIndex: undefined,
+ amountRequested: undefined,
+ direction: undefined,
+ execute: execute,
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ return thisObject
+
+ function finalize() {
+ thisObject.array = undefined
+ thisObject.profile = undefined
+ }
+
+ function initialize(queryReceived) {
+
+ thisObject.array = Array.from(thisObject.profile.following)
+
+ NT.projects.socialTrading.utilities.queriesValidations.profilesValidations(queryReceived, thisObject)
+ NT.projects.socialTrading.utilities.queriesValidations.arrayValidations(queryReceived, thisObject, thisObject.array)
+
+ }
+
+ function execute() {
+
+ let response = []
+
+ switch (thisObject.direction) {
+ case SA.projects.socialTrading.globals.queryConstants.DIRECTION_FUTURE: {
+ for (let i = thisObject.initialIndex; i < thisObject.initialIndex + thisObject.amountRequested; i++) {
+ let arrayItem = thisObject.array[i]
+ if (arrayItem === undefined) { break }
+ addToResponse(arrayItem)
+ }
+ break
+ }
+ case SA.projects.socialTrading.globals.queryConstants.DIRECTION_PAST: {
+ for (let i = thisObject.initialIndex; i > thisObject.initialIndex - thisObject.amountRequested; i--) {
+ let arrayItem = thisObject.array[i]
+ if (arrayItem === undefined) { break }
+ addToResponse(arrayItem)
+ }
+ break
+ }
+ }
+ return response
+
+ function addToResponse(arrayItem) {
+ let postResponse = {
+ emitterUserProfileId: arrayItem.emitterUserProfileId,
+ emitterBotProfileId: arrayItem.emitterBotProfileId
+ }
+ response.push(postResponse)
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Social-Trading/NT/Modules/Queries/ProfilePosts.js b/Projects/Social-Trading/NT/Modules/Queries/ProfilePosts.js
new file mode 100644
index 000000000..a1971be61
--- /dev/null
+++ b/Projects/Social-Trading/NT/Modules/Queries/ProfilePosts.js
@@ -0,0 +1,76 @@
+exports.newSocialTradingModulesQueriesUserProfileStats = function newSocialTradingModulesQueriesUserProfileStats() {
+ /*
+ Each User or Bot Profile can have posts. This query
+ is designed for Network Clients to fetch the posts
+ metadata they need from the Social Graph.
+
+ This is the query to be executed to fill a Profile page
+ with all of its posts.
+ */
+ let thisObject = {
+ array: undefined,
+ profile: undefined,
+ initialIndex: undefined,
+ amountRequested: undefined,
+ direction: undefined,
+ execute: execute,
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ return thisObject
+
+ function finalize() {
+ thisObject.array = undefined
+ thisObject.profile = undefined
+ }
+
+ function initialize(queryReceived) {
+
+ thisObject.array = Array.from(thisObject.profile.posts)
+
+ NT.projects.socialTrading.utilities.queriesValidations.profilesValidations(queryReceived, thisObject)
+ NT.projects.socialTrading.utilities.queriesValidations.arrayValidations(queryReceived, thisObject, thisObject.array)
+ }
+
+ function execute() {
+
+ let response = []
+
+ switch (thisObject.direction) {
+ case SA.projects.socialTrading.globals.queryConstants.DIRECTION_FUTURE: {
+ for (let i = thisObject.initialIndex; i < thisObject.initialIndex + thisObject.amountRequested; i++) {
+ let arrayItem = thisObject.array[i]
+ if (arrayItem === undefined) { break }
+ addToResponse(arrayItem)
+ }
+ break
+ }
+ case SA.projects.socialTrading.globals.queryConstants.DIRECTION_PAST: {
+ for (let i = thisObject.initialIndex; i > thisObject.initialIndex - thisObject.amountRequested; i--) {
+ let arrayItem = thisObject.array[i]
+ if (arrayItem === undefined) { break }
+ addToResponse(arrayItem)
+ }
+ break
+ }
+ }
+ return response
+
+ function addToResponse(post) {
+ let postResponse = {
+ emitterUserProfileId: post.emitterUserProfileId,
+ targetUserProfileId: post.targetUserProfileId,
+ emitterBotProfileId: post.emitterBotProfileId,
+ targetBotProfileId: post.targetBotProfileId,
+ emitterPostHash: post.emitterPostHash,
+ targetPostHash: post.targetPostHash,
+ postType: post.postType,
+ timestamp: post.timestamp,
+ repliesCount: post.replies.size,
+ reactions: Array.from(post.reactions)
+ }
+ response.push(postResponse)
+ }
+ }
+}
\ No newline at end of file
diff --git a/Network/Queries/ProfileStats.js b/Projects/Social-Trading/NT/Modules/Queries/UserProfileStats.js
similarity index 54%
rename from Network/Queries/ProfileStats.js
rename to Projects/Social-Trading/NT/Modules/Queries/UserProfileStats.js
index 56de88255..5825be95f 100644
--- a/Network/Queries/ProfileStats.js
+++ b/Projects/Social-Trading/NT/Modules/Queries/UserProfileStats.js
@@ -1,4 +1,4 @@
-exports.newProfileStats = function newProfileStats() {
+exports.newSocialTradingModulesQueriesUserProfileStats = function newSocialTradingModulesQueriesUserProfileStats() {
let thisObject = {
profile: undefined,
@@ -10,7 +10,7 @@ exports.newProfileStats = function newProfileStats() {
return thisObject
function finalize() {
-
+ thisObject.profile = undefined
}
function initialize(queryReceived) {
@@ -18,30 +18,29 @@ exports.newProfileStats = function newProfileStats() {
Validate User Profile
*/
if (queryReceived.targetUserProfileId !== undefined) {
- thisObject.profile = NT.memory.maps.USER_PROFILES_BY_ID.get(queryReceived.targetUserProfileId)
+ thisObject.profile = NT.projects.socialTrading.globals.memory.maps.USER_PROFILES_BY_ID.get(queryReceived.targetUserProfileId)
} else {
- thisObject.profile = NT.memory.maps.USER_PROFILES_BY_HANDLE.get(queryReceived.targetUserProfileHandle)
+ thisObject.profile = NT.projects.socialTrading.globals.memory.maps.USER_PROFILES_BY_HANDLE.get(queryReceived.targetUserProfileHandle)
}
if (thisObject.profile === undefined) {
throw ('Target User Profile Not Found.')
}
-
}
function execute() {
return {
- "userProfieId": thisObject.profile.userProfieId,
+ "userProfileId": thisObject.profile.userProfileId,
"userProfileHandle": thisObject.profile.userProfileHandle,
"blockchainAccount": thisObject.profile.blockchainAccount,
"ranking": thisObject.profile.ranking,
- "followingCount": thisObject.profile.followingCount,
- "followersCount": thisObject.profile.followersCount,
+ "followingCount": thisObject.profile.following.size,
+ "followersCount": thisObject.profile.followers.size,
+ "postsCount": thisObject.profile.posts.size,
+ "botsCount": thisObject.profile.bots.size,
"emitterEventsCount": thisObject.profile.emitterEventsCount,
- "targetEventsCount": thisObject.profile.targetEventsCount,
- "postsCount": thisObject.profile.postsCount,
- "botsCount": thisObject.profile.botsCount
+ "targetEventsCount": thisObject.profile.targetEventsCount
}
}
}
\ No newline at end of file
diff --git a/Projects/Social-Trading/NT/Modules/Queries/UserProfiles.js b/Projects/Social-Trading/NT/Modules/Queries/UserProfiles.js
new file mode 100644
index 000000000..bf5223624
--- /dev/null
+++ b/Projects/Social-Trading/NT/Modules/Queries/UserProfiles.js
@@ -0,0 +1,75 @@
+exports.newSocialTradingModulesQueriesUserProfiles = function newSocialTradingModulesQueriesUserProfiles() {
+ /*
+ This query returns a list of user profiles ordered
+ by Ranking. It is useful to bootstrap new users
+ and provide them with alternative of who to follow.
+ */
+ let thisObject = {
+ array: undefined,
+ initialIndex: undefined,
+ amountRequested: undefined,
+ direction: undefined,
+ execute: execute,
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ return thisObject
+
+ function finalize() {
+ thisObject.array = undefined
+ }
+
+ function initialize(queryReceived) {
+
+ thisObject.array = Array.from(
+ NT.projects.socialTrading.globals.memory.maps.USER_PROFILES_BY_ID,
+ x => x[1]
+ )
+ thisObject.array.sort((a, b) => (a["ranking"] > b["ranking"]) ? 1 : -1)
+
+ NT.projects.socialTrading.utilities.queriesValidations.arrayValidations(queryReceived, thisObject, thisObject.array)
+
+ }
+
+ function execute() {
+
+ let response = []
+
+ switch (thisObject.direction) {
+ case SA.projects.socialTrading.globals.queryConstants.DIRECTION_FUTURE: {
+ for (let i = thisObject.initialIndex; i < thisObject.initialIndex + thisObject.amountRequested; i++) {
+ let arrayItem = thisObject.array[i]
+ if (arrayItem === undefined) { break }
+ addToResponse(arrayItem)
+ }
+ break
+ }
+ case SA.projects.socialTrading.globals.queryConstants.DIRECTION_PAST: {
+ for (let i = thisObject.initialIndex; i > thisObject.initialIndex - thisObject.amountRequested; i--) {
+ let arrayItem = thisObject.array[i]
+ if (arrayItem === undefined) { break }
+ addToResponse(arrayItem)
+ }
+ break
+ }
+ }
+ return response
+
+ function addToResponse(profile) {
+ let postResponse = {
+ "userProfileId": profile.userProfileId,
+ "userProfileHandle": profile.userProfileHandle,
+ "blockchainAccount": profile.blockchainAccount,
+ "ranking": profile.ranking,
+ "followingCount": profile.following.size,
+ "followersCount": profile.followers.size,
+ "postsCount": profile.posts.size,
+ "botsCount": profile.bots.size,
+ "emitterEventsCount": profile.emitterEventsCount,
+ "targetEventsCount": profile.targetEventsCount
+ }
+ response.push(postResponse)
+ }
+ }
+}
\ No newline at end of file
diff --git a/Projects/Social-Trading/NT/Modules/Query.js b/Projects/Social-Trading/NT/Modules/Query.js
new file mode 100644
index 000000000..d60f1e998
--- /dev/null
+++ b/Projects/Social-Trading/NT/Modules/Query.js
@@ -0,0 +1,87 @@
+exports.newSocialTradingModulesQuery = function newSocialTradingModulesQuery() {
+ /*
+ A Query is a call from a Network Client to
+ a Network Node with the purpose to get
+ relevant information from the Social Graph.
+
+ A Query does not produce changes
+ on the state of the Social Graph.
+ */
+ let thisObject = {
+ query: undefined,
+ queryType: undefined,
+ execute: execute,
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ return thisObject
+
+ function finalize() {
+ thisObject.query = undefined
+ thisObject.queryType = undefined
+ }
+
+ function initialize(queryReceived) {
+
+ thisObject.queryType = queryReceived.queryType
+
+ switch (thisObject.queryType) {
+
+ case SA.projects.socialTrading.globals.queryTypes.USER_PROFILES: {
+ thisObject.query = NT.projects.socialTrading.modules.queriesUserProfiles.newSocialTradingModulesQueriesUserProfiles()
+ thisObject.query.initialize(queryReceived)
+ break
+ }
+
+ case SA.projects.socialTrading.globals.queryTypes.USER_PROFILE_STATS: {
+ thisObject.query = NT.projects.socialTrading.modules.queriesUserProfileStats.newSocialTradingModulesQueriesUserProfileStats()
+ thisObject.query.initialize(queryReceived)
+ break
+ }
+
+ case SA.projects.socialTrading.globals.queryTypes.BOT_PROFILE_STATS: {
+ thisObject.query = NT.projects.socialTrading.modules.queriesBotProfileStats.newSocialTradingModulesQueriesBotProfileStats()
+ thisObject.query.initialize(queryReceived)
+ break
+ }
+
+ case SA.projects.socialTrading.globals.queryTypes.PROFILE_POSTS: {
+ thisObject.query = NT.projects.socialTrading.modules.queriesProfilePosts.newSocialTradingModulesQueriesProfilePosts()
+ thisObject.query.initialize(queryReceived)
+ break
+ }
+
+ case SA.projects.socialTrading.globals.queryTypes.POST_REPLIES: {
+ thisObject.query = NT.projects.socialTrading.modules.queriesPostReplies.newSocialTradingModulesQueriesPostReplies()
+ thisObject.query.initialize(queryReceived)
+ break
+ }
+
+ case SA.projects.socialTrading.globals.queryTypes.PROFILE_FOLLOWERS: {
+ thisObject.query = NT.projects.socialTrading.modules.queriesProfileFollowers.newSocialTradingModulesQueriesProfileFollowers()
+ thisObject.query.initialize(queryReceived)
+ break
+ }
+
+ case SA.projects.socialTrading.globals.queryTypes.PROFILE_FOLLOWING: {
+ thisObject.query = NT.projects.socialTrading.modules.queriesProfileFollowing.newSocialTradingModulesQueriesProfileFollowing()
+ thisObject.query.initialize(queryReceived)
+ break
+ }
+
+ case SA.projects.socialTrading.globals.queryTypes.maps.EVENTS: {
+ thisObject.query = NT.projects.socialTrading.modules.queriesEvents.newSocialTradingModulesQueriesEvents()
+ thisObject.query.initialize(queryReceived)
+ break
+ }
+ default: throw ('Query Type Not Supported.')
+ }
+ }
+
+ function execute() {
+ let response = thisObject.query.execute()
+ thisObject.query.finalize()
+ return response
+ }
+}
\ No newline at end of file
diff --git a/Projects/Social-Trading/NT/Modules/Social-Graph/BotProfile.js b/Projects/Social-Trading/NT/Modules/Social-Graph/BotProfile.js
new file mode 100644
index 000000000..2f1b41b47
--- /dev/null
+++ b/Projects/Social-Trading/NT/Modules/Social-Graph/BotProfile.js
@@ -0,0 +1,149 @@
+exports.newSocialTradingModulesSocialGraphBotProfile = function newSocialTradingModulesSocialGraphBotProfile() {
+ /*
+ Users can have a Profile that can:
+ * follow other bots profiles.
+ * be followed by other bots profiles.
+ * have posts linked to the profile.
+ */
+ let thisObject = {
+ /* Unique Keys */
+ userProfileId: undefined,
+ botProfileId: undefined,
+ botProfileHandle: undefined,
+ /* Bot Unitque Properties */
+ botAsset: undefined,
+ botExchange: undefined,
+ botEnabled: undefined,
+ /* Maps */
+ following: undefined,
+ followers: undefined,
+ posts: undefined,
+ bots: undefined,
+ /* Stats */
+ emitterEventsCount: undefined,
+ targetEventsCount: undefined,
+ /* Post Functions */
+ addPost: addPost,
+ removePost: removePost,
+ /* Follow - Unfollow Functions */
+ addFollowing: addFollowing,
+ removeFollowing: removeFollowing,
+ addFollower: addFollower,
+ removeFollower: removeFollower,
+ /* Framework Functions */
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ return thisObject
+
+ function finalize() {
+
+ thisObject.following = undefined
+ thisObject.followers = undefined
+ thisObject.posts = undefined
+
+ }
+
+ function initialize(
+ userProfileId,
+ botProfileId,
+ botAsset,
+ botExchange,
+ botEnabled
+ ) {
+ thisObject.userProfileId = userProfileId
+ thisObject.botProfileId = botProfileId
+ thisObject.botAsset = botAsset
+ thisObject.botExchange = botExchange
+ thisObject.botEnabled = botEnabled
+
+ thisObject.following = new Map()
+ thisObject.followers = new Map()
+ thisObject.posts = new Map()
+
+ thisObject.emitterEventsCount = 0
+ thisObject.targetEventsCount = 0
+
+ }
+
+ function addPost(
+ emitterUserProfileId,
+ targetUserProfileId,
+ emitterBotProfileId,
+ targetBotProfileId,
+ emitterPostHash,
+ targetPostHash,
+ postType,
+ timestamp
+ ) {
+ if (thisObject.posts.get(emitterPostHash) !== undefined) {
+ throw ('Post Already Exists.')
+ } else {
+ let post = NT.projects.socialTrading.modules.socialGraphPost.newSocialTradingModulesSocialGraphPost()
+ post.initialize(
+ emitterUserProfileId,
+ targetUserProfileId,
+ emitterBotProfileId,
+ targetBotProfileId,
+ emitterPostHash,
+ targetPostHash,
+ postType,
+ timestamp
+ )
+
+ thisObject.posts.set(emitterPostHash, post)
+ }
+ }
+
+ function removePost(
+ emitterPostHash
+ ) {
+ if (thisObject.posts.get(emitterPostHash) === undefined) {
+ throw ('Post Does Not Exist.')
+ } else {
+ let post = thisObject.posts.get(emitterPostHash)
+ post.finalize()
+ thisObject.posts.delete(emitterPostHash)
+ }
+ }
+
+ function addFollowing(
+ targetUserProfileId,
+ targetBotProfileId
+ ) {
+ if (thisObject.following.get(targetBotProfileId) === undefined) {
+ thisObject.following.set(targetBotProfileId, { targetUserProfileId: targetUserProfileId, targetBotProfileId: targetBotProfileId })
+ } else {
+ throw ('Already Following.')
+ }
+ }
+
+ function removeFollowing(
+ targetBotProfileId
+ ) {
+ if (thisObject.following.get(targetBotProfileId) !== undefined) {
+ thisObject.following.delete(targetBotProfileId)
+ } else {
+ throw ('Not Following.')
+ }
+ }
+
+ function addFollower(
+ emitterUserProfileId,
+ emitterBotProfileId
+ ) {
+ if (thisObject.followers.get(emitterBotProfileId) === undefined) {
+ thisObject.followers.set(emitterBotProfileId, { emitterUserProfileId: emitterUserProfileId, emitterBotProfileId: emitterBotProfileId })
+ }
+ }
+
+ function removeFollower(
+ emitterBotProfileId
+ ) {
+ if (thisObject.followers.get(emitterBotProfileId) !== undefined) {
+ thisObject.followers.delete(emitterBotProfileId)
+ }
+ }
+}
+
diff --git a/Projects/Social-Trading/NT/Modules/Social-Graph/Post.js b/Projects/Social-Trading/NT/Modules/Social-Graph/Post.js
new file mode 100644
index 000000000..42ffbc346
--- /dev/null
+++ b/Projects/Social-Trading/NT/Modules/Social-Graph/Post.js
@@ -0,0 +1,140 @@
+exports.newSocialTradingModulesSocialGraphPost = function newSocialTradingModulesSocialGraphPost() {
+ /*
+ Posts represent a collection of multimedia content sotored somewhere else
+ and identified by that content hash. Posts might belong to:
+ * a User Profile.
+ * a Bot Profile.
+
+ Posts might be linked to other posts when they are a reply or quote.
+
+ Posts migth have:
+ * replies, when a user or bot replies to a post.
+ * reactions, when a user or bot reacts to a post.
+ */
+ let thisObject = {
+ /* Parents Ids */
+ emitterUserProfileId: undefined,
+ targetUserProfileId: undefined,
+ emitterBotProfileId: undefined,
+ targetBotProfileId: undefined,
+ /* Unique Keys */
+ emitterPostHash: undefined,
+ targetPostHash: undefined,
+ /* Post Unitque Properties */
+ postType: undefined,
+ timestamp: undefined,
+ /* Maps */
+ replies: undefined,
+ reactions: undefined,
+ /* Reaction Functions */
+ addReaction: addReaction,
+ removeReactions: removeReaction,
+ /* Framework Functions */
+ initialize: initialize,
+ 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.reactions = new Map()
+ thisObject.reactions.set(REACTION_TYPES.REACTION_LIKE, 0)
+ thisObject.reactions.set(REACTION_TYPES.REACTION_LOVE, 0)
+ thisObject.reactions.set(REACTION_TYPES.REACTION_HAHA, 0)
+ thisObject.reactions.set(REACTION_TYPES.REACTION_WOW, 0)
+ thisObject.reactions.set(REACTION_TYPES.REACTION_SAD, 0)
+ thisObject.reactions.set(REACTION_TYPES.REACTION_ANGRY, 0)
+ thisObject.reactions.set(REACTION_TYPES.REACTION_CARE, 0)
+
+ return thisObject
+
+ function finalize() {
+ thisObject.replies = undefined
+ thisObject.reactions = undefined
+ }
+
+ function initialize(
+ emitterUserProfileId,
+ targetUserProfileId,
+ emitterBotProfileId,
+ targetBotProfileId,
+ emitterPostHash,
+ targetPostHash,
+ postType,
+ timestamp
+ ) {
+
+ thisObject.emitterUserProfileId = emitterUserProfileId
+ thisObject.targetUserProfileId = targetUserProfileId
+ thisObject.emitterBotProfileId = emitterBotProfileId
+ thisObject.targetBotProfileId = targetBotProfileId
+ thisObject.emitterPostHash = emitterPostHash
+ thisObject.targetPostHash = targetPostHash
+ thisObject.postType = postType
+ thisObject.timestamp = timestamp
+ /*
+ Let's find the Target Post
+ */
+ if (
+ thisObject.postType === POST_TYPES.REPLY_TO_POST ||
+ thisObject.postType === POST_TYPES.REPOST_ ||
+ thisObject.postType === POST_TYPES.QUOTE_REPOST_
+ ) {
+ /*
+ Validate Target User Profile.
+ */
+ let targetUserProfile = NT.projects.socialTrading.globals.memory.maps.USER_PROFILES_BY_ID.get(thisObject.targetUserProfileId)
+ if (targetUserProfile === undefined) {
+ throw ('Target User Profile Not Found.')
+ }
+
+ let targetPost = targetUserProfile.posts.get(thisObject.targetPostHash)
+
+ if (targetPost === undefined) {
+ throw ('Target Post Not Found.')
+ }
+ /*
+ Let's add this post to the replies of the Target Post
+ */
+ if (
+ thisObject.postType === POST_TYPES.REPLY_TO_POST
+ ) {
+ targetPost.replies.set(thisObject.targetPostHash, thisObject.targetPostHash)
+ }
+ }
+ }
+
+ function addReaction(reactionType) {
+ let reactionCount = thisObject.reactions.get(reactionType)
+
+ if (reactionCount === undefined) {
+ throw ('Reaction Type Not Supported.')
+ }
+
+ thisObject.reactions.set(reactionType, reactionCount + 1)
+ }
+
+ function removeReaction(reactionType) {
+ let reactionCount = thisObject.reactions.get(reactionType)
+
+ if (reactionCount === undefined) {
+ throw ('Reaction Type Not Supported.')
+ }
+
+ thisObject.reactions.set(reactionType, reactionCount - 1)
+ }
+}
\ No newline at end of file
diff --git a/Projects/Social-Trading/NT/Modules/Social-Graph/UserProfile.js b/Projects/Social-Trading/NT/Modules/Social-Graph/UserProfile.js
new file mode 100644
index 000000000..a54d0b6b2
--- /dev/null
+++ b/Projects/Social-Trading/NT/Modules/Social-Graph/UserProfile.js
@@ -0,0 +1,211 @@
+exports.newSocialTradingModulesSocialGraphUserProfile = function newSocialTradingModulesSocialGraphUserProfile() {
+ /*
+ Users can have a Profile that can:
+ * follow other user profiles.
+ * be followed by other user profiles.
+ * have posts linked to the profile.
+ * have bots linked to the profile.
+ */
+ let thisObject = {
+ /* Unique Keys */
+ userProfileId: undefined,
+ userProfileHandle: undefined,
+ /* User Unitque Properties */
+ blockchainAccount: undefined,
+ /* SA Reputation + SA Token Balance */
+ ranking: undefined,
+ /* Maps */
+ following: undefined,
+ followers: undefined,
+ posts: undefined,
+ bots: undefined,
+ /* Stats */
+ emitterEventsCount: undefined,
+ targetEventsCount: undefined,
+ /* Post Functions */
+ addPost: addPost,
+ removePost: removePost,
+ /* Follow - Unfollow Functions */
+ addFollowing: addFollowing,
+ removeFollowing: removeFollowing,
+ addFollower: addFollower,
+ removeFollower: removeFollower,
+ /* Bot Functions */
+ addBot: addBot,
+ removeBot: removeBot,
+ enableBot: enableBot,
+ disableBot: disableBot,
+ /* Framework Functions */
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ return thisObject
+
+ function finalize() {
+
+ thisObject.following = undefined
+ thisObject.followers = undefined
+ thisObject.posts = undefined
+ thisObject.bots = undefined
+
+ }
+
+ function initialize(
+ userProfileId,
+ userProfileHandle,
+ blockchainAccount,
+ ranking
+ ) {
+
+ thisObject.userProfileId = userProfileId
+ thisObject.userProfileHandle = userProfileHandle
+ thisObject.blockchainAccount = blockchainAccount
+ thisObject.ranking = ranking
+
+ thisObject.following = new Map()
+ thisObject.followers = new Map()
+ thisObject.posts = new Map()
+ thisObject.bots = new Map()
+
+ thisObject.emitterEventsCount = 0
+ thisObject.targetEventsCount = 0
+
+ }
+
+ function addPost(
+ emitterUserProfileId,
+ targetUserProfileId,
+ emitterPostHash,
+ targetPostHash,
+ postType,
+ timestamp
+ ) {
+ if (thisObject.posts.get(emitterPostHash) !== undefined) {
+ throw ('Post Already Exists.')
+ } else {
+ let post = NT.projects.socialTrading.modules.socialGraphPost.newSocialTradingModulesSocialGraphPost()
+ post.initialize(
+ emitterUserProfileId,
+ targetUserProfileId,
+ undefined,
+ undefined,
+ emitterPostHash,
+ targetPostHash,
+ postType,
+ timestamp
+ )
+
+ thisObject.posts.set(emitterPostHash, post)
+ }
+ }
+
+ function removePost(
+ emitterPostHash
+ ) {
+ if (thisObject.posts.get(emitterPostHash) === undefined) {
+ throw ('Post Does Not Exist.')
+ } else {
+ let post = thisObject.posts.get(emitterPostHash)
+ post.finalize()
+ thisObject.posts.delete(emitterPostHash)
+ }
+ }
+
+ function addFollowing(
+ targetUserProfileId
+ ) {
+ if (thisObject.following.get(targetUserProfileId) === undefined) {
+ thisObject.following.set(targetUserProfileId, targetUserProfileId)
+ } else {
+ throw ('Already Following.')
+ }
+ }
+
+ function removeFollowing(
+ targetUserProfileId
+ ) {
+ if (thisObject.following.get(targetUserProfileId) !== undefined) {
+ thisObject.following.delete(targetUserProfileId)
+ } else {
+ throw ('Not Following.')
+ }
+ }
+
+ function addFollower(
+ emitterUserProfileId
+ ) {
+ if (thisObject.followers.get(emitterUserProfileId) === undefined) {
+ thisObject.followers.set(emitterUserProfileId, emitterUserProfileId)
+ }
+ }
+
+ function removeFollower(
+ emitterUserProfileId
+ ) {
+ if (thisObject.followers.get(emitterUserProfileId) !== undefined) {
+ thisObject.followers.delete(emitterUserProfileId)
+ }
+ }
+
+ function addBot(
+ userProfileId,
+ botProfileId,
+ botAsset,
+ botExchange,
+ botEnabled
+ ) {
+ let bot = thisObject.bots.get(botProfileId)
+ if (bot !== undefined) {
+ throw ('Bot Already Exists.')
+ } else {
+ let bot = NT.projects.socialTrading.modules.BOTS.newBot()
+ bot.initialize(
+ userProfileId,
+ botProfileId,
+ botAsset,
+ botExchange,
+ botEnabled
+ )
+ thisObject.bots.set(botProfileId, bot)
+ }
+ }
+
+ function removeBot(
+ botProfileId
+ ) {
+ let bot = thisObject.bots.get(botProfileId)
+ if (bot === undefined) {
+ throw ('Bot Does Not Exist.')
+ } else {
+ thisObject.bots.get(botProfileId).finalize()
+ thisObject.bots.delete(botProfileId)
+ }
+ }
+
+ function enableBot(
+ botProfileId
+ ) {
+ let bot = thisObject.bots.get(botProfileId)
+ if (bot === undefined) {
+ throw ('Bot Does Not Exist.')
+ }
+ if (bot.botEnabled === true) {
+ throw ('Bot Already Enabled.')
+ }
+ bot.botEnabled = true
+ }
+
+ function disableBot(
+ botProfileId
+ ) {
+ let bot = thisObject.bots.get(botProfileId)
+ if (bot === undefined) {
+ throw ('Bot Does Not Exist.')
+ }
+ if (bot.botEnabled === false) {
+ throw ('Bot Already Disabled.')
+ }
+ bot.botEnabled = false
+ }
+}
\ No newline at end of file
diff --git a/Projects/Social-Trading/NT/Modules/SocialGraph.js b/Projects/Social-Trading/NT/Modules/SocialGraph.js
new file mode 100644
index 000000000..3ac068e92
--- /dev/null
+++ b/Projects/Social-Trading/NT/Modules/SocialGraph.js
@@ -0,0 +1,27 @@
+exports.newSocialGraph = function newSocialGraph() {
+ /*
+ This module represents the Social Graph Service that
+ this deals with the Social Graph this node mantains.
+ The Social Graph is one of the services the Network Node provides.
+
+ This service is responsible for mantaining the whole Social Graph
+ or relationships between User and Bot profiles and also between
+ their posts.
+ */
+ let thisObject = {
+ /* Framework Functions */
+ initialize: initialize,
+ finalize: finalize
+ }
+
+ return thisObject
+
+ function finalize() {
+
+ }
+
+ async function initialize() {
+ let bootstrapProcess = NT.projects.socialTrading.modules.bootstrap.newBootstrap()
+ await bootstrapProcess.initialize()
+ }
+}
\ No newline at end of file
diff --git a/Projects/Social-Trading/NT/Utilities/QueriesValidations.js b/Projects/Social-Trading/NT/Utilities/QueriesValidations.js
new file mode 100644
index 000000000..dd63209ae
--- /dev/null
+++ b/Projects/Social-Trading/NT/Utilities/QueriesValidations.js
@@ -0,0 +1,101 @@
+exports.newSocialTradingUtilitiesQueriesValidations = function newSocialTradingUtilitiesQueriesValidations() {
+ /*
+ This module have a few funcions that are often needed at Queries Modules.
+ */
+ let thisObject = {
+ profilesValidations: profilesValidations,
+ postValidations: postValidations,
+ arrayValidations: arrayValidations
+ }
+
+ return thisObject
+
+ function profilesValidations(queryReceived, thisObject) {
+ /*
+ Validate User Profile
+ */
+ if (queryReceived.targetUserProfileId !== undefined) {
+ thisObject.profile = NT.projects.socialTrading.globals.memory.maps.USER_PROFILES_BY_ID.get(queryReceived.targetUserProfileId)
+ }
+
+ if (thisObject.profile === undefined) {
+ throw ('Target User Profile Not Found.')
+ }
+ /*
+ Validate Bot Profile
+ */
+ if (queryReceived.targetBotProfileId !== undefined) {
+ thisObject.profile = thisObject.profile.bots.get(queryReceived.targetBotProfileId)
+ if (thisObject.profile === undefined) {
+ throw ('Target Bot Profile Not Found.')
+ }
+ }
+ }
+
+ function postValidations(queryReceived, thisObject) {
+ /*
+ Validate Post
+ */
+ thisObject.post = thisObject.profile.posts.get(queryReceived.targetPostHash)
+
+ if (thisObject.post === undefined) {
+ throw ('Target Post Not Found.')
+ }
+ }
+
+ function arrayValidations(queryReceived, thisObject, array) {
+ /*
+ Validate Initial Index
+ */
+ if (queryReceived.initialIndex === undefined) {
+ throw ('Initial Index Undefined.')
+ }
+
+ if (queryReceived.initialIndex === SA.projects.socialTrading.globals.queryConstants.INITIAL_INDEX_LAST) {
+ queryReceived.initialIndex = array.length - 1
+ }
+
+ if (queryReceived.initialIndex === SA.projects.socialTrading.globals.queryConstants.INITIAL_INDEX_FIRST) {
+ queryReceived.initialIndex = 0
+ }
+
+ if (isNaN(queryReceived.initialIndex) === true) {
+ throw ('Initial Post Is Not a Number.')
+ }
+
+ thisObject.initialIndex = queryReceived.initialIndex
+ /*
+ Validate Amount Requested
+ */
+ if (queryReceived.amountRequested === undefined) {
+ throw ('Amount Requested Undefined.')
+ }
+
+ if (isNaN(queryReceived.amountRequested) === true) {
+ throw ('Amount Requested Is Not a Number.')
+ }
+
+ if (queryReceived.amountRequested < SA.projects.socialTrading.globals.queryConstants.MIN_AMOUNT_REQUESTED) {
+ throw ('Amount Requested Below Min.')
+ }
+
+ if (queryReceived.amountRequested > SA.projects.socialTrading.globals.queryConstants.MAX_AMOUNT_REQUESTED) {
+ throw ('Amount Requested Above Max.')
+ }
+
+ thisObject.amountRequested = queryReceived.amountRequested
+ /*
+ Validate Direction
+ */
+ if (queryReceived.direction === undefined) {
+ throw ('Direction Undefined.')
+ }
+
+ if (queryReceived.direction !== SA.projects.socialTrading.globals.queryConstants.DIRECTION_FUTURE && queryReceived.direction !== SA.projects.socialTrading.globals.queryConstants.DIRECTION_PAST) {
+ throw ('Direction Not Supported.')
+ }
+
+ thisObject.direction = queryReceived.direction
+
+ }
+}
\ No newline at end of file
diff --git a/Projects/Social-Trading/SA/Globals/EventTypes.js b/Projects/Social-Trading/SA/Globals/EventTypes.js
new file mode 100644
index 000000000..e5dc63d1f
--- /dev/null
+++ b/Projects/Social-Trading/SA/Globals/EventTypes.js
@@ -0,0 +1,44 @@
+exports.newSocialTradingGlobalsEventTypes = function () {
+
+ let thisObject = {
+ /* Users Posts and Following Events */
+ NEW_USER_POST: 10,
+ REPLY_TO_USER_POST: 11,
+ REPOST_USER_POST: 12,
+ QUOTE_REPOST_USER_POST: 13,
+ REMOVE_USER_POST: 14,
+ FOLLOW_USER_PROFILE: 15,
+ UNFOLLOW_USER_PROFILE: 16,
+ /* Bots Posts and Following Events */
+ NEW_BOT_POST: 20,
+ REPLY_TO_BOT_POST: 21,
+ REPOST_BOT_POST: 22,
+ QUOTE_REPOST_BOT_POST: 23,
+ REMOVE_BOT_POST: 24,
+ FOLLOW_BOT_PROFILE: 25,
+ UNFOLLOW_BOT_PROFILE: 26,
+ /* Bots Management Events */
+ ADD_BOT: 50,
+ REMOVE_BOT: 51,
+ ENABLE_BOT: 52,
+ DISABLE_BOT: 53,
+ /* Add Reaction to Posts Events */
+ ADD_REACTION_LIKE: 100,
+ ADD_REACTION_LOVE: 101,
+ ADD_REACTION_HAHA: 102,
+ ADD_REACTION_WOW: 103,
+ ADD_REACTION_SAD: 104,
+ ADD_REACTION_ANGRY: 105,
+ ADD_REACTION_CARE: 106,
+ /* Remove Reaction to Posts Events */
+ REMOVE_REACTION_LIKE: 200,
+ REMOVE_REACTION_LOVE: 201,
+ REMOVE_REACTION_HAHA: 202,
+ REMOVE_REACTION_WOW: 203,
+ REMOVE_REACTION_SAD: 204,
+ REMOVE_REACTION_ANGRY: 205,
+ REMOVE_REACTION_CARE: 206
+ }
+
+ return thisObject
+}
\ No newline at end of file
diff --git a/Projects/Social-Trading/SA/Globals/QueryConstants.js b/Projects/Social-Trading/SA/Globals/QueryConstants.js
new file mode 100644
index 000000000..8f62db770
--- /dev/null
+++ b/Projects/Social-Trading/SA/Globals/QueryConstants.js
@@ -0,0 +1,13 @@
+exports.newSocialTradingGlobalsQueryConstants = function () {
+
+ let thisObject = {
+ INITIAL_INDEX_FIRST: 'First',
+ INITIAL_INDEX_LAST: 'Last',
+ MIN_AMOUNT_REQUESTED: 1,
+ MAX_AMOUNT_REQUESTED: 100,
+ DIRECTION_FUTURE: 'Future',
+ DIRECTION_PAST: 'Past'
+ }
+
+ return thisObject
+}
\ No newline at end of file
diff --git a/Projects/Social-Trading/SA/Globals/QueryTypes.js b/Projects/Social-Trading/SA/Globals/QueryTypes.js
new file mode 100644
index 000000000..ec010b230
--- /dev/null
+++ b/Projects/Social-Trading/SA/Globals/QueryTypes.js
@@ -0,0 +1,15 @@
+exports.newSocialTradingGlobalsQueryTypes = function () {
+
+ let thisObject = {
+ USER_PROFILES: 0,
+ USER_PROFILE_STATS: 1,
+ BOT_PROFILE_STATS: 2,
+ PROFILE_POSTS: 3,
+ PROFILE_FOLLOWERS: 4,
+ PROFILE_FOLLOWING: 5,
+ POST_REPLIES: 6,
+ EVENTS: 7
+ }
+
+ return thisObject
+}
\ No newline at end of file
diff --git a/README.md b/README.md
index 38b4a167a..816a63ab9 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@ Superalgos is not just another open-source project. We are an open and welcoming
You will notice the difference as soon as you join the [Telegram Community Group](https://t.me/superalgoscommunity) or the new [Discord Server](https://discord.gg/CGeKC6WQQb)!
-> Can't wait to contribute? Sstart by giving a star to this repository in the top-right corner of this page!
+> Can't wait to contribute? Start by giving a star to this repository in the top-right corner of this page!

@@ -196,7 +196,7 @@ If you are having difficulty running the node setup command here are a few commo
**A.** To run Superalgos, go to the Superalgos directory/folder and run this command:
```
-node run
+node platform
```
The Client will run on your terminal and the GUI will launch on your default browser. If Chrome/Safari is not your default browser, copy the URL, close the browser, open Chrome/Safari, and paste the URL. Be patient... it takes a few seconds to fully load the GUI.
diff --git a/TaskServer/.vscode/settings.json b/TaskServer/.vscode/settings.json
new file mode 100644
index 000000000..e94f27f6f
--- /dev/null
+++ b/TaskServer/.vscode/settings.json
@@ -0,0 +1,17 @@
+{
+ "files.exclude": {
+ "**/Data-Storage": true,
+ "**/Documentation": true,
+ "**/Log-Files": true,
+ "**/node_modules": true,
+ "**/Deprecated-Code": true
+ },
+ "search.exclude": {
+ "**/Data-Storage": true,
+ "**/Documentation": true,
+ "**/Log-Files": true,
+ "**/node_modules": true,
+ "**/Deprecated-Code": true
+ },
+ "search.maintainFileSearchCache": true
+}
\ No newline at end of file
diff --git a/TaskServer/MultiProject.js b/TaskServer/MultiProject.js
deleted file mode 100644
index cb64d2d0b..000000000
--- a/TaskServer/MultiProject.js
+++ /dev/null
@@ -1,109 +0,0 @@
-exports.newMultiProject = function () {
-
- let thisObject = {
- initialize: initialize
- }
-
- return thisObject;
-
- function initialize() {
- /*
- First thing is to load the project schema file.
- */
- let PROJECTS_SCHEMA = require(global.env.PATH_TO_PROJECTS_REQUIRED + '/' + 'ProjectsSchema.json')
-
- /*
- Here we will setup the TS object, with all the
- projects and modules that will have inside.
- */
- global.TS = {
- projects: {}
- }
- for (let i = 0; i < PROJECTS_SCHEMA.length; i++) {
- let projectDefinition = PROJECTS_SCHEMA[i]
- global.TS.projects[projectDefinition.propertyName] = {}
- let projectInstance = global.TS.projects[projectDefinition.propertyName]
-
- projectInstance.utilities = {}
- projectInstance.globals = {}
- projectInstance.functionLibraries = {}
- projectInstance.taskModules = {}
- projectInstance.processModules = {}
- projectInstance.botModules = {}
-
- if (projectDefinition.TS === undefined) { continue }
-
- /* Set up Utilities of this Project */
- if (projectDefinition.TS.utilities !== undefined) {
- for (let j = 0; j < projectDefinition.TS.utilities.length; j++) {
- let utilityDefinition = projectDefinition.TS.utilities[j]
- let path = global.env.PATH_TO_PROJECTS_REQUIRED + '/' + projectDefinition.name + '/' + 'TS' + '/' + 'Utilities' + '/' + utilityDefinition.fileName
-
- let requiredObject = require(path)
- let requiredFunction = requiredObject[utilityDefinition.functionName]
- projectInstance.utilities[utilityDefinition.propertyName] = requiredFunction.call()
- }
- }
-
- /* Set up Globals of this Project */
- if (projectDefinition.TS.globals !== undefined) {
- for (let j = 0; j < projectDefinition.TS.globals.length; j++) {
- let globalDefinition = projectDefinition.TS.globals[j]
- let path = global.env.PATH_TO_PROJECTS_REQUIRED + '/' + projectDefinition.name + '/' + 'TS' + '/' + 'Globals' + '/' + globalDefinition.fileName
-
- let requiredObject = require(path)
- let requiredFunction = requiredObject[globalDefinition.functionName]
- projectInstance.globals[globalDefinition.propertyName] = requiredFunction.call()
- }
- }
-
- /* Set up Function Libraries of this Project */
- if (projectDefinition.TS.functionLibraries !== undefined) {
- for (let j = 0; j < projectDefinition.TS.functionLibraries.length; j++) {
- let functionLibraryDefinition = projectDefinition.TS.functionLibraries[j]
- let path = global.env.PATH_TO_PROJECTS_REQUIRED + '/' + projectDefinition.name + '/' + 'TS' + '/' + 'Function-Libraries' + '/' + functionLibraryDefinition.fileName
-
- let requiredObject = require(path)
- let requiredFunction = requiredObject[functionLibraryDefinition.functionName]
- projectInstance.functionLibraries[functionLibraryDefinition.propertyName] = requiredFunction.call()
- }
- }
-
- /* Set up Process Modules for this Project */
- if (projectDefinition.TS.taskModules !== undefined) {
- for (let j = 0; j < projectDefinition.TS.taskModules.length; j++) {
- let taskModuleDefinition = projectDefinition.TS.taskModules[j]
- let path = global.env.PATH_TO_PROJECTS_REQUIRED + '/' + projectDefinition.name + '/' + 'TS' + '/' + 'Task-Modules' + '/' + taskModuleDefinition.fileName
-
- let requiredObject = require(path)
- projectInstance.taskModules[taskModuleDefinition.propertyName] = requiredObject
- }
- }
-
- /* Set up Process Modules for this Project */
- if (projectDefinition.TS.processModules !== undefined) {
- for (let j = 0; j < projectDefinition.TS.processModules.length; j++) {
- let processModuleDefinition = projectDefinition.TS.processModules[j]
- let path = global.env.PATH_TO_PROJECTS_REQUIRED + '/' + projectDefinition.name + '/' + 'TS' + '/' + 'Process-Modules' + '/' + processModuleDefinition.fileName
-
- let requiredObject = require(path)
- projectInstance.processModules[processModuleDefinition.propertyName] = requiredObject
- }
- }
-
- /* Set up Bot Modules for this Project */
- if (projectDefinition.TS.botModules !== undefined) {
- for (let j = 0; j < projectDefinition.TS.botModules.length; j++) {
- let botModuleDefinition = projectDefinition.TS.botModules[j]
- let path = global.env.PATH_TO_PROJECTS_REQUIRED + '/' + projectDefinition.name + '/' + 'TS' + '/' + 'Bot-Modules' + '/' + botModuleDefinition.folderName + '/' + botModuleDefinition.fileName
-
- let requiredObject = require(path)
- projectInstance.botModules[botModuleDefinition.propertyName] = requiredObject
- }
- }
- }
-
- TS.projects.foundations.globals.taskConstants.PROJECTS_SCHEMA = PROJECTS_SCHEMA
-
- }
-}
\ No newline at end of file
diff --git a/TaskServer/ProcessInstance.js b/TaskServer/ProcessInstance.js
index f0657efa9..baed01931 100644
--- a/TaskServer/ProcessInstance.js
+++ b/TaskServer/ProcessInstance.js
@@ -52,8 +52,8 @@
the bot type received via websockets events, at the PROJECTS SCHEMA a botModule must be
defined with the same type at the property botType.
*/
- for (let i = 0; i < TS.projects.foundations.globals.taskConstants.PROJECTS_SCHEMA.length; i++) {
- let project = TS.projects.foundations.globals.taskConstants.PROJECTS_SCHEMA[i]
+ for (let i = 0; i < PROJECTS_SCHEMA.length; i++) {
+ let project = PROJECTS_SCHEMA[i]
if (project.name !== TS.projects.foundations.globals.taskConstants.PROJECT_DEFINITION_NODE.config.codeName) { continue }
for (let j = 0; j < project.TS.botModules.length; j++) {
botModuleDefinition = project.TS.botModules[j]
diff --git a/TaskServer/Task.js b/TaskServer/Task.js
index dd0f3acd3..ce3c19ce7 100644
--- a/TaskServer/Task.js
+++ b/TaskServer/Task.js
@@ -8,10 +8,27 @@ let NODE_JS_PROCESS = require('./NodeJsProcess.js');
let NODE_JS_PROCESS_MODULE = NODE_JS_PROCESS.newNodeJsProcess()
NODE_JS_PROCESS_MODULE.initialize()
-/* Setting up the modules that will be available for the Task and it's processes */
-let MULTI_PROJECT = require('./MultiProject.js');
+/*
+The TS object is accesible everywhere at the Superalgos Client.
+It provides access to all modules built for the Task Server.
+*/
+global.TS = {}
+/*
+The SA object is accesible everywhere at the Superalgos Client.
+It provides access to all modules built for Superalgos in general.
+*/
+global.SA = {}
+/*
+First thing is to load the project schema file.
+*/
+global.PROJECTS_SCHEMA = require(global.env.PATH_TO_PROJECT_SCHEMA)
+/*
+Setting up the modules that will be available for the Servers Running inside this Client
+*/
+let MULTI_PROJECT = require('../MultiProject.js');
let MULTI_PROJECT_MODULE = MULTI_PROJECT.newMultiProject()
-MULTI_PROJECT_MODULE.initialize()
+MULTI_PROJECT_MODULE.initialize(TS, 'TS')
+MULTI_PROJECT_MODULE.initialize(SA, 'SA')
/* Setting up the global Event Handler */
TS.projects.foundations.globals.taskConstants.EVENT_SERVER_CLIENT_MODULE_OBJECT = TS.projects.foundations.taskModules.eventServerClient.newFoundationsTaskModulesEventServerClient()
diff --git a/desktop.js b/desktop.js
new file mode 100644
index 000000000..ced762c1a
--- /dev/null
+++ b/desktop.js
@@ -0,0 +1,66 @@
+/*
+The Superalgos Desktop is one of the 3 clients of the Superalgos Network:
+
+ * Superalgos Mobile
+ * Superalgos Desktop
+ * Superalgos Server
+
+Users can unse any of these clients for their social trading activities.
+
+This module is the starting point of the Superalgos Desktop App.
+
+*/
+
+/*
+The DK object is accesible everywhere at the Superalgos Desktop App.
+It provides access to all modules built for this App.
+*/
+global.DK = {}
+/*
+The SA object is accesible everywhere at the Superalgos Desktop App.
+It provides access to all modules built for Superalgos in general.
+*/
+global.SA = {}
+/* Load Environment Variables */
+let ENVIRONMENT = require('./EnvironmentForDebug.js');
+let ENVIRONMENT_MODULE = ENVIRONMENT.newEnvironment()
+global.env = ENVIRONMENT_MODULE
+/*
+First thing is to load the project schema file.
+*/
+global.PROJECTS_SCHEMA = require(global.env.PATH_TO_PROJECT_SCHEMA)
+/*
+Setting up the modules that will be available, defined at the Project Schema file.
+*/
+let MULTI_PROJECT = require('./MultiProject.js');
+let MULTI_PROJECT_MODULE = MULTI_PROJECT.newMultiProject()
+MULTI_PROJECT_MODULE.initialize(DK, 'DK')
+MULTI_PROJECT_MODULE.initialize(SA, 'SA')
+/*
+Setting up external dependencies.
+*/
+SA.nodeModules = {
+ fs: require('fs'),
+ web3: require('web3'),
+ ws: require('ws'),
+ open: require('open'),
+ http: require('http')
+}
+
+/*
+We will use this User Profile for Testing Purposes.
+{
+ "githubUsername": "Test-Network-Client-Profile",
+ "address": "0xA0dCDA81b42C5EBDc45EC2875C72274B67560246",
+ "privateKey": "0x5fed4817a87431c8a328d0936561e63f45b6db289adac6125b9306ded644dfe9"
+}
+*/
+
+DK.TEST_NETWORK_CLIENT_USER_PROFILE_ID = "baa2f02c-2920-4edb-a103-d452fc61d82f"
+DK.TEST_NETWORK_CLIENT_USER_PROFILE_HANDLE = "Test-Network-Client-Profile"
+DK.TEST_NETWORK_CLIENT_USER_PROFILE_PRIVATE_KEY = "0x5fed4817a87431c8a328d0936561e63f45b6db289adac6125b9306ded644dfe9"
+
+DK.app = require('./Desktop/DesktopApp.js').newDesktopApp()
+DK.app.run()
+
+console.log('Superalgos Desktop is Running.')
\ No newline at end of file
diff --git a/network.js b/network.js
new file mode 100644
index 000000000..a0b0b2c33
--- /dev/null
+++ b/network.js
@@ -0,0 +1,63 @@
+/*
+The Superalgos Network offers 3 types of services:
+
+ * Social Graph Service
+ * Search Index Service
+ * Private Message Service
+
+Users can decide which services to run at their node.(TODO)
+
+This module is the starting point of the Network Node.
+
+*/
+
+/*
+The NT object is accesible everywhere at the Superalgos Network.
+It provides access to all modules built for this Network.
+*/
+global.NT = {}
+/*
+The SA object is accesible everywhere at the Superalgos Network.
+It provides access to all modules built for Superalgos in general.
+*/
+global.SA = {}
+/* Load Environment Variables */
+let ENVIRONMENT = require('./EnvironmentForDebug.js');
+let ENVIRONMENT_MODULE = ENVIRONMENT.newEnvironment()
+global.env = ENVIRONMENT_MODULE
+/*
+First thing is to load the project schema file.
+*/
+global.PROJECTS_SCHEMA = require(global.env.PATH_TO_PROJECT_SCHEMA)
+/*
+Setting up the modules that will be available, defined at the Project Schema file.
+*/
+let MULTI_PROJECT = require('./MultiProject.js');
+let MULTI_PROJECT_MODULE = MULTI_PROJECT.newMultiProject()
+MULTI_PROJECT_MODULE.initialize(NT, 'NT')
+MULTI_PROJECT_MODULE.initialize(SA, 'SA')
+/*
+Setting up external dependencies.
+*/
+SA.nodeModules = {
+ fs: require('fs'),
+ nodeFetch: require('node-fetch'),
+ web3: require('web3'),
+ ws: require('ws')
+}
+
+/*
+We will use this User Profile for testing purposes.
+{
+ "githubUsername": "Test-Network-Node-Profile",
+ "address": "0xa153469c57A91F5a59Fc6c45A37aD8dbad85e417",
+ "privateKey": "0xac498ae59407e6b68429a814f64da2339550f93a767578e28c161ff119159271"
+}
+*/
+NT.NETWORK_NODE_USER_PROFILE_HANDLE = "Test-Network-Node-Profile"
+NT.NETWORK_NODE_USER_PROFILE_PRIVATE_KEY = "0xac498ae59407e6b68429a814f64da2339550f93a767578e28c161ff119159271"
+
+NT.app = require('./Network/NetwokNode.js').newNetworkNode()
+NT.app.run()
+
+console.log('Superalgos Network is Running.')
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 9e2d86b73..469e05fe0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,3054 @@
{
- "name": "Superalgos",
- "lockfileVersion": 2,
"requires": true,
- "packages": {}
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@ethereumjs/common": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.4.0.tgz",
+ "integrity": "sha512-UdkhFWzWcJCZVsj1O/H8/oqj/0RVYjLc1OhPjBrQdALAkQHpCp8xXI4WLnuGTADqTdJZww0NtgwG+TRPkXt27w==",
+ "requires": {
+ "crc-32": "^1.2.0",
+ "ethereumjs-util": "^7.1.0"
+ }
+ },
+ "@ethereumjs/tx": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.0.tgz",
+ "integrity": "sha512-yTwEj2lVzSMgE6Hjw9Oa1DZks/nKTWM8Wn4ykDNapBPua2f4nXO3qKnni86O6lgDj5fVNRqbDsD0yy7/XNGDEA==",
+ "requires": {
+ "@ethereumjs/common": "^2.4.0",
+ "ethereumjs-util": "^7.1.0"
+ }
+ },
+ "@ethersproject/abi": {
+ "version": "5.0.7",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.0.7.tgz",
+ "integrity": "sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw==",
+ "requires": {
+ "@ethersproject/address": "^5.0.4",
+ "@ethersproject/bignumber": "^5.0.7",
+ "@ethersproject/bytes": "^5.0.4",
+ "@ethersproject/constants": "^5.0.4",
+ "@ethersproject/hash": "^5.0.4",
+ "@ethersproject/keccak256": "^5.0.3",
+ "@ethersproject/logger": "^5.0.5",
+ "@ethersproject/properties": "^5.0.3",
+ "@ethersproject/strings": "^5.0.4"
+ }
+ },
+ "@ethersproject/abstract-provider": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.4.1.tgz",
+ "integrity": "sha512-3EedfKI3LVpjSKgAxoUaI+gB27frKsxzm+r21w9G60Ugk+3wVLQwhi1LsEJAKNV7WoZc8CIpNrATlL1QFABjtQ==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/networks": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "@ethersproject/transactions": "^5.4.0",
+ "@ethersproject/web": "^5.4.0"
+ }
+ },
+ "@ethersproject/abstract-signer": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.4.1.tgz",
+ "integrity": "sha512-SkkFL5HVq1k4/25dM+NWP9MILgohJCgGv5xT5AcRruGz4ILpfHeBtO/y6j+Z3UN/PAjDeb4P7E51Yh8wcGNLGA==",
+ "requires": {
+ "@ethersproject/abstract-provider": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0"
+ }
+ },
+ "@ethersproject/address": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.4.0.tgz",
+ "integrity": "sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/rlp": "^5.4.0"
+ }
+ },
+ "@ethersproject/base64": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.4.0.tgz",
+ "integrity": "sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0"
+ }
+ },
+ "@ethersproject/bignumber": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.4.1.tgz",
+ "integrity": "sha512-fJhdxqoQNuDOk6epfM7yD6J8Pol4NUCy1vkaGAkuujZm0+lNow//MKu1hLhRiYV4BsOHyBv5/lsTjF+7hWwhJg==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "bn.js": "^4.11.9"
+ }
+ },
+ "@ethersproject/bytes": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz",
+ "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/constants": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.4.0.tgz",
+ "integrity": "sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==",
+ "requires": {
+ "@ethersproject/bignumber": "^5.4.0"
+ }
+ },
+ "@ethersproject/hash": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.4.0.tgz",
+ "integrity": "sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA==",
+ "requires": {
+ "@ethersproject/abstract-signer": "^5.4.0",
+ "@ethersproject/address": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "@ethersproject/strings": "^5.4.0"
+ }
+ },
+ "@ethersproject/keccak256": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.4.0.tgz",
+ "integrity": "sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "js-sha3": "0.5.7"
+ },
+ "dependencies": {
+ "js-sha3": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz",
+ "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc="
+ }
+ }
+ },
+ "@ethersproject/logger": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.1.tgz",
+ "integrity": "sha512-DZ+bRinnYLPw1yAC64oRl0QyVZj43QeHIhVKfD/+YwSz4wsv1pfwb5SOFjz+r710YEWzU6LrhuSjpSO+6PeE4A=="
+ },
+ "@ethersproject/networks": {
+ "version": "5.4.2",
+ "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.4.2.tgz",
+ "integrity": "sha512-eekOhvJyBnuibfJnhtK46b8HimBc5+4gqpvd1/H9LEl7Q7/qhsIhM81dI9Fcnjpk3jB1aTy6bj0hz3cifhNeYw==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/properties": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.4.1.tgz",
+ "integrity": "sha512-cyCGlF8wWlIZyizsj2PpbJ9I7rIlUAfnHYwy/T90pdkSn/NFTa5YWZx2wTJBe9V7dD65dcrrEMisCRUJiq6n3w==",
+ "requires": {
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/rlp": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.4.0.tgz",
+ "integrity": "sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/signing-key": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.4.0.tgz",
+ "integrity": "sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "bn.js": "^4.11.9",
+ "elliptic": "6.5.4",
+ "hash.js": "1.1.7"
+ }
+ },
+ "@ethersproject/strings": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.4.0.tgz",
+ "integrity": "sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA==",
+ "requires": {
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/constants": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0"
+ }
+ },
+ "@ethersproject/transactions": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.4.0.tgz",
+ "integrity": "sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ==",
+ "requires": {
+ "@ethersproject/address": "^5.4.0",
+ "@ethersproject/bignumber": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/constants": "^5.4.0",
+ "@ethersproject/keccak256": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "@ethersproject/rlp": "^5.4.0",
+ "@ethersproject/signing-key": "^5.4.0"
+ }
+ },
+ "@ethersproject/web": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.4.0.tgz",
+ "integrity": "sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og==",
+ "requires": {
+ "@ethersproject/base64": "^5.4.0",
+ "@ethersproject/bytes": "^5.4.0",
+ "@ethersproject/logger": "^5.4.0",
+ "@ethersproject/properties": "^5.4.0",
+ "@ethersproject/strings": "^5.4.0"
+ }
+ },
+ "@sindresorhus/is": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
+ "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ=="
+ },
+ "@szmarczak/http-timer": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
+ "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
+ "requires": {
+ "defer-to-connect": "^1.0.1"
+ }
+ },
+ "@types/bn.js": {
+ "version": "4.11.6",
+ "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz",
+ "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/node": {
+ "version": "12.20.21",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.21.tgz",
+ "integrity": "sha512-Qk7rOvV2A4vNgXNS88vEvbJE1NDFPCQ8AU+pNElrU2bA4yrRDef3fg3SUe+xkwyin3Bpg/Xh5JkNWTlsOcS2tA=="
+ },
+ "@types/pbkdf2": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz",
+ "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/secp256k1": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz",
+ "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "accepts": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
+ "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+ "requires": {
+ "mime-types": "~2.1.24",
+ "negotiator": "0.6.2"
+ }
+ },
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
+ },
+ "asn1": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+ "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+ "requires": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "asn1.js": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
+ "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
+ "requires": {
+ "bn.js": "^4.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+ },
+ "async-limiter": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
+ "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+ },
+ "available-typed-arrays": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz",
+ "integrity": "sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA=="
+ },
+ "aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
+ },
+ "aws4": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
+ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
+ },
+ "base-x": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz",
+ "integrity": "sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==",
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+ "requires": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
+ "bignumber.js": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz",
+ "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA=="
+ },
+ "blakejs": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.1.tgz",
+ "integrity": "sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg=="
+ },
+ "bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
+ },
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+ },
+ "body-parser": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
+ "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
+ "requires": {
+ "bytes": "3.1.0",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "on-finished": "~2.3.0",
+ "qs": "6.7.0",
+ "raw-body": "2.4.0",
+ "type-is": "~1.6.17"
+ }
+ },
+ "brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
+ },
+ "browserify-aes": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+ "requires": {
+ "buffer-xor": "^1.0.3",
+ "cipher-base": "^1.0.0",
+ "create-hash": "^1.1.0",
+ "evp_bytestokey": "^1.0.3",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "browserify-cipher": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
+ "requires": {
+ "browserify-aes": "^1.0.4",
+ "browserify-des": "^1.0.0",
+ "evp_bytestokey": "^1.0.0"
+ }
+ },
+ "browserify-des": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
+ "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
+ "requires": {
+ "cipher-base": "^1.0.1",
+ "des.js": "^1.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "browserify-rsa": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
+ "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
+ "requires": {
+ "bn.js": "^5.0.0",
+ "randombytes": "^2.0.1"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz",
+ "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw=="
+ }
+ }
+ },
+ "browserify-sign": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
+ "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
+ "requires": {
+ "bn.js": "^5.1.1",
+ "browserify-rsa": "^4.0.1",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "elliptic": "^6.5.3",
+ "inherits": "^2.0.4",
+ "parse-asn1": "^5.1.5",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz",
+ "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw=="
+ },
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+ }
+ }
+ },
+ "bs58": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz",
+ "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=",
+ "requires": {
+ "base-x": "^3.0.2"
+ }
+ },
+ "bs58check": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz",
+ "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==",
+ "requires": {
+ "bs58": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "requires": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "buffer-to-arraybuffer": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz",
+ "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo="
+ },
+ "buffer-xor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
+ },
+ "bufferutil": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz",
+ "integrity": "sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==",
+ "requires": {
+ "node-gyp-build": "^4.2.0"
+ }
+ },
+ "bytes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
+ },
+ "cacheable-request": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
+ "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
+ "requires": {
+ "clone-response": "^1.0.2",
+ "get-stream": "^5.1.0",
+ "http-cache-semantics": "^4.0.0",
+ "keyv": "^3.0.0",
+ "lowercase-keys": "^2.0.0",
+ "normalize-url": "^4.1.0",
+ "responselike": "^1.0.2"
+ },
+ "dependencies": {
+ "get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "requires": {
+ "pump": "^3.0.0"
+ }
+ },
+ "lowercase-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+ "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="
+ }
+ }
+ },
+ "call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ }
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
+ },
+ "chownr": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
+ },
+ "cids": {
+ "version": "0.7.5",
+ "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz",
+ "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==",
+ "requires": {
+ "buffer": "^5.5.0",
+ "class-is": "^1.1.0",
+ "multibase": "~0.6.0",
+ "multicodec": "^1.0.0",
+ "multihashes": "~0.4.15"
+ },
+ "dependencies": {
+ "multicodec": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz",
+ "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==",
+ "requires": {
+ "buffer": "^5.6.0",
+ "varint": "^5.0.0"
+ }
+ }
+ }
+ },
+ "cipher-base": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+ "requires": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "class-is": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz",
+ "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw=="
+ },
+ "clone-response": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
+ "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
+ "requires": {
+ "mimic-response": "^1.0.0"
+ }
+ },
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "content-disposition": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+ "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "content-hash": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz",
+ "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==",
+ "requires": {
+ "cids": "^0.7.1",
+ "multicodec": "^0.5.5",
+ "multihashes": "^0.4.15"
+ }
+ },
+ "content-type": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
+ },
+ "cookie": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+ "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
+ },
+ "cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
+ },
+ "cookiejar": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz",
+ "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA=="
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+ },
+ "cors": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "requires": {
+ "object-assign": "^4",
+ "vary": "^1"
+ }
+ },
+ "crc-32": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz",
+ "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==",
+ "requires": {
+ "exit-on-epipe": "~1.0.1",
+ "printj": "~1.1.0"
+ }
+ },
+ "create-ecdh": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
+ "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
+ "requires": {
+ "bn.js": "^4.1.0",
+ "elliptic": "^6.5.3"
+ }
+ },
+ "create-hash": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+ "requires": {
+ "cipher-base": "^1.0.1",
+ "inherits": "^2.0.1",
+ "md5.js": "^1.3.4",
+ "ripemd160": "^2.0.1",
+ "sha.js": "^2.4.0"
+ }
+ },
+ "create-hmac": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+ "requires": {
+ "cipher-base": "^1.0.3",
+ "create-hash": "^1.1.0",
+ "inherits": "^2.0.1",
+ "ripemd160": "^2.0.0",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "crypto-browserify": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
+ "requires": {
+ "browserify-cipher": "^1.0.0",
+ "browserify-sign": "^4.0.0",
+ "create-ecdh": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "create-hmac": "^1.1.0",
+ "diffie-hellman": "^5.0.0",
+ "inherits": "^2.0.1",
+ "pbkdf2": "^3.0.3",
+ "public-encrypt": "^4.0.0",
+ "randombytes": "^2.0.0",
+ "randomfill": "^1.0.3"
+ }
+ },
+ "d": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
+ "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
+ "requires": {
+ "es5-ext": "^0.10.50",
+ "type": "^1.0.1"
+ }
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "requires": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
+ },
+ "decompress-response": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
+ "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
+ "requires": {
+ "mimic-response": "^1.0.0"
+ }
+ },
+ "defer-to-connect": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
+ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ=="
+ },
+ "define-lazy-prop": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
+ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og=="
+ },
+ "define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+ },
+ "depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+ },
+ "des.js": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
+ "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
+ "requires": {
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "destroy": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
+ },
+ "diffie-hellman": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+ "requires": {
+ "bn.js": "^4.1.0",
+ "miller-rabin": "^4.0.0",
+ "randombytes": "^2.0.0"
+ }
+ },
+ "dom-walk": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
+ "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
+ },
+ "duplexer3": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
+ },
+ "ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+ "requires": {
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+ },
+ "elliptic": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
+ "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
+ "requires": {
+ "bn.js": "^4.11.9",
+ "brorand": "^1.1.0",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.1",
+ "inherits": "^2.0.4",
+ "minimalistic-assert": "^1.0.1",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
+ },
+ "end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "requires": {
+ "once": "^1.4.0"
+ }
+ },
+ "es-abstract": {
+ "version": "1.18.5",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz",
+ "integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.2",
+ "internal-slot": "^1.0.3",
+ "is-callable": "^1.2.3",
+ "is-negative-zero": "^2.0.1",
+ "is-regex": "^1.1.3",
+ "is-string": "^1.0.6",
+ "object-inspect": "^1.11.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.2",
+ "string.prototype.trimend": "^1.0.4",
+ "string.prototype.trimstart": "^1.0.4",
+ "unbox-primitive": "^1.0.1"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "es5-ext": {
+ "version": "0.10.53",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
+ "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
+ "requires": {
+ "es6-iterator": "~2.0.3",
+ "es6-symbol": "~3.1.3",
+ "next-tick": "~1.0.0"
+ }
+ },
+ "es6-iterator": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
+ "requires": {
+ "d": "1",
+ "es5-ext": "^0.10.35",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "es6-symbol": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
+ "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
+ "requires": {
+ "d": "^1.0.1",
+ "ext": "^1.1.2"
+ }
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
+ },
+ "etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
+ },
+ "eth-ens-namehash": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz",
+ "integrity": "sha1-IprEbsqG1S4MmR58sq74P/D2i88=",
+ "requires": {
+ "idna-uts46-hx": "^2.3.1",
+ "js-sha3": "^0.5.7"
+ },
+ "dependencies": {
+ "js-sha3": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz",
+ "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc="
+ }
+ }
+ },
+ "eth-lib": {
+ "version": "0.1.29",
+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz",
+ "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==",
+ "requires": {
+ "bn.js": "^4.11.6",
+ "elliptic": "^6.4.0",
+ "nano-json-stream-parser": "^0.1.2",
+ "servify": "^0.1.12",
+ "ws": "^3.0.0",
+ "xhr-request-promise": "^0.1.2"
+ },
+ "dependencies": {
+ "ws": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
+ "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
+ "requires": {
+ "async-limiter": "~1.0.0",
+ "safe-buffer": "~5.1.0",
+ "ultron": "~1.1.0"
+ }
+ }
+ }
+ },
+ "ethereum-bloom-filters": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz",
+ "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==",
+ "requires": {
+ "js-sha3": "^0.8.0"
+ }
+ },
+ "ethereum-cryptography": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz",
+ "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==",
+ "requires": {
+ "@types/pbkdf2": "^3.0.0",
+ "@types/secp256k1": "^4.0.1",
+ "blakejs": "^1.1.0",
+ "browserify-aes": "^1.2.0",
+ "bs58check": "^2.1.2",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "hash.js": "^1.1.7",
+ "keccak": "^3.0.0",
+ "pbkdf2": "^3.0.17",
+ "randombytes": "^2.1.0",
+ "safe-buffer": "^5.1.2",
+ "scrypt-js": "^3.0.0",
+ "secp256k1": "^4.0.1",
+ "setimmediate": "^1.0.5"
+ }
+ },
+ "ethereumjs-util": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.0.tgz",
+ "integrity": "sha512-kR+vhu++mUDARrsMMhsjjzPduRVAeundLGXucGRHF3B4oEltOUspfgCVco4kckucj3FMlLaZHUl9n7/kdmr6Tw==",
+ "requires": {
+ "@types/bn.js": "^5.1.0",
+ "bn.js": "^5.1.2",
+ "create-hash": "^1.1.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "0.1.6",
+ "rlp": "^2.2.4"
+ },
+ "dependencies": {
+ "@types/bn.js": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz",
+ "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "bn.js": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz",
+ "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw=="
+ }
+ }
+ },
+ "ethjs-unit": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz",
+ "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=",
+ "requires": {
+ "bn.js": "4.11.6",
+ "number-to-bn": "1.7.0"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.11.6",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
+ "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU="
+ }
+ }
+ },
+ "ethjs-util": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz",
+ "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==",
+ "requires": {
+ "is-hex-prefixed": "1.0.0",
+ "strip-hex-prefix": "1.0.0"
+ }
+ },
+ "eventemitter3": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz",
+ "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ=="
+ },
+ "evp_bytestokey": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+ "requires": {
+ "md5.js": "^1.3.4",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "exit-on-epipe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
+ "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw=="
+ },
+ "express": {
+ "version": "4.17.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
+ "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+ "requires": {
+ "accepts": "~1.3.7",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.19.0",
+ "content-disposition": "0.5.3",
+ "content-type": "~1.0.4",
+ "cookie": "0.4.0",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "~1.1.2",
+ "fresh": "0.5.2",
+ "merge-descriptors": "1.0.1",
+ "methods": "~1.1.2",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "~2.0.5",
+ "qs": "6.7.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.1.2",
+ "send": "0.17.1",
+ "serve-static": "1.14.1",
+ "setprototypeof": "1.1.1",
+ "statuses": "~1.5.0",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ }
+ },
+ "ext": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/ext/-/ext-1.5.0.tgz",
+ "integrity": "sha512-+ONcYoWj/SoQwUofMr94aGu05Ou4FepKi7N7b+O8T4jVfyIsZQV1/xeS8jpaBzF0csAk0KLXoHCxU7cKYZjo1Q==",
+ "requires": {
+ "type": "^2.5.0"
+ },
+ "dependencies": {
+ "type": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz",
+ "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw=="
+ }
+ }
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+ },
+ "finalhandler": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "statuses": "~1.5.0",
+ "unpipe": "~1.0.0"
+ }
+ },
+ "foreach": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
+ "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k="
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
+ },
+ "form-data": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
+ },
+ "fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
+ },
+ "fs-extra": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
+ "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "fs-minipass": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
+ "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
+ "requires": {
+ "minipass": "^2.6.0"
+ }
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "get-intrinsic": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+ "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "get-stream": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+ "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+ "requires": {
+ "pump": "^3.0.0"
+ }
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "requires": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "global": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
+ "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
+ "requires": {
+ "min-document": "^2.19.0",
+ "process": "^0.11.10"
+ }
+ },
+ "got": {
+ "version": "9.6.0",
+ "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
+ "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
+ "requires": {
+ "@sindresorhus/is": "^0.14.0",
+ "@szmarczak/http-timer": "^1.1.2",
+ "cacheable-request": "^6.0.0",
+ "decompress-response": "^3.3.0",
+ "duplexer3": "^0.1.4",
+ "get-stream": "^4.1.0",
+ "lowercase-keys": "^1.0.1",
+ "mimic-response": "^1.0.1",
+ "p-cancelable": "^1.0.0",
+ "to-readable-stream": "^1.0.0",
+ "url-parse-lax": "^3.0.0"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
+ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
+ },
+ "har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
+ },
+ "har-validator": {
+ "version": "5.1.5",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+ "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+ "requires": {
+ "ajv": "^6.12.3",
+ "har-schema": "^2.0.0"
+ }
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-bigints": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
+ "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA=="
+ },
+ "has-symbol-support-x": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz",
+ "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw=="
+ },
+ "has-symbols": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+ "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw=="
+ },
+ "has-to-string-tag-x": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz",
+ "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==",
+ "requires": {
+ "has-symbol-support-x": "^1.4.1"
+ }
+ },
+ "has-tostringtag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+ "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "requires": {
+ "has-symbols": "^1.0.2"
+ }
+ },
+ "hash-base": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+ "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+ "requires": {
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ },
+ "dependencies": {
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+ }
+ }
+ },
+ "hash.js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+ "requires": {
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
+ }
+ },
+ "hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+ "requires": {
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "http": {
+ "version": "0.0.1-security",
+ "resolved": "https://registry.npmjs.org/http/-/http-0.0.1-security.tgz",
+ "integrity": "sha512-RnDvP10Ty9FxqOtPZuxtebw1j4L/WiqNMDtuc1YMH1XQm5TgDRaR1G9u8upL6KD1bXHSp9eSXo/ED+8Q7FAr+g=="
+ },
+ "http-cache-semantics": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
+ "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
+ },
+ "http-errors": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+ "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+ "requires": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.1",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.0"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ }
+ }
+ },
+ "http-https": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz",
+ "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs="
+ },
+ "http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "idna-uts46-hx": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz",
+ "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==",
+ "requires": {
+ "punycode": "2.1.0"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0="
+ }
+ }
+ },
+ "ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "internal-slot": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
+ "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
+ "requires": {
+ "get-intrinsic": "^1.1.0",
+ "has": "^1.0.3",
+ "side-channel": "^1.0.4"
+ }
+ },
+ "ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
+ },
+ "is-arguments": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
+ "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "requires": {
+ "has-bigints": "^1.0.1"
+ }
+ },
+ "is-boolean-object": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-callable": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
+ "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w=="
+ },
+ "is-date-object": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="
+ },
+ "is-function": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz",
+ "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ=="
+ },
+ "is-generator-function": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
+ "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-hex-prefixed": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz",
+ "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ="
+ },
+ "is-negative-zero": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
+ "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w=="
+ },
+ "is-number-object": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz",
+ "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==",
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-object": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz",
+ "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA=="
+ },
+ "is-plain-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+ "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
+ },
+ "is-regex": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-retry-allowed": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz",
+ "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg=="
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
+ },
+ "is-string": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "requires": {
+ "has-symbols": "^1.0.2"
+ }
+ },
+ "is-typed-array": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.7.tgz",
+ "integrity": "sha512-VxlpTBGknhQ3o7YiVjIhdLU6+oD8dPz/79vvvH4F+S/c8608UCVa9fgDpa1kZgFoUST2DCgacc70UszKgzKuvA==",
+ "requires": {
+ "available-typed-arrays": "^1.0.4",
+ "call-bind": "^1.0.2",
+ "es-abstract": "^1.18.5",
+ "foreach": "^2.0.5",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+ },
+ "is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "requires": {
+ "is-docker": "^2.0.0"
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+ },
+ "isurl": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz",
+ "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==",
+ "requires": {
+ "has-to-string-tag-x": "^1.2.0",
+ "is-object": "^1.0.1"
+ }
+ },
+ "js-sha3": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
+ "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q=="
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
+ },
+ "json-buffer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
+ "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg="
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "jsprim": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.2.3",
+ "verror": "1.10.0"
+ }
+ },
+ "keccak": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz",
+ "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==",
+ "requires": {
+ "node-addon-api": "^2.0.0",
+ "node-gyp-build": "^4.2.0",
+ "readable-stream": "^3.6.0"
+ }
+ },
+ "keyv": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
+ "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
+ "requires": {
+ "json-buffer": "3.0.0"
+ }
+ },
+ "lowercase-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
+ },
+ "md5.js": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+ "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+ "requires": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
+ },
+ "merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
+ },
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
+ },
+ "miller-rabin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+ "requires": {
+ "bn.js": "^4.0.0",
+ "brorand": "^1.0.1"
+ }
+ },
+ "mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
+ },
+ "mime-db": {
+ "version": "1.49.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz",
+ "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA=="
+ },
+ "mime-types": {
+ "version": "2.1.32",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz",
+ "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==",
+ "requires": {
+ "mime-db": "1.49.0"
+ }
+ },
+ "mimic-response": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+ "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
+ },
+ "min-document": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
+ "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=",
+ "requires": {
+ "dom-walk": "^0.1.0"
+ }
+ },
+ "minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
+ },
+ "minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
+ },
+ "minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+ },
+ "minipass": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
+ "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
+ "requires": {
+ "safe-buffer": "^5.1.2",
+ "yallist": "^3.0.0"
+ }
+ },
+ "minizlib": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
+ "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
+ "requires": {
+ "minipass": "^2.9.0"
+ }
+ },
+ "mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
+ },
+ "mkdirp-promise": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz",
+ "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=",
+ "requires": {
+ "mkdirp": "*"
+ }
+ },
+ "mock-fs": {
+ "version": "4.14.0",
+ "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz",
+ "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw=="
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "multibase": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz",
+ "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==",
+ "requires": {
+ "base-x": "^3.0.8",
+ "buffer": "^5.5.0"
+ }
+ },
+ "multicodec": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz",
+ "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==",
+ "requires": {
+ "varint": "^5.0.0"
+ }
+ },
+ "multihashes": {
+ "version": "0.4.21",
+ "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz",
+ "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==",
+ "requires": {
+ "buffer": "^5.5.0",
+ "multibase": "^0.7.0",
+ "varint": "^5.0.0"
+ },
+ "dependencies": {
+ "multibase": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz",
+ "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==",
+ "requires": {
+ "base-x": "^3.0.8",
+ "buffer": "^5.5.0"
+ }
+ }
+ }
+ },
+ "nano-json-stream-parser": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz",
+ "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18="
+ },
+ "negotiator": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
+ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
+ },
+ "next-tick": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
+ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
+ },
+ "node-addon-api": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz",
+ "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA=="
+ },
+ "node-fetch": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
+ "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
+ },
+ "node-gyp-build": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz",
+ "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg=="
+ },
+ "normalize-url": {
+ "version": "4.5.1",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz",
+ "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA=="
+ },
+ "number-to-bn": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz",
+ "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=",
+ "requires": {
+ "bn.js": "4.11.6",
+ "strip-hex-prefix": "1.0.0"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.11.6",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
+ "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU="
+ }
+ }
+ },
+ "oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ },
+ "object-inspect": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
+ "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg=="
+ },
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
+ },
+ "object.assign": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ }
+ },
+ "oboe": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz",
+ "integrity": "sha1-VVQoTFQ6ImbXo48X4HOCH73jk80=",
+ "requires": {
+ "http-https": "^1.0.0"
+ }
+ },
+ "on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "open": {
+ "version": "8.2.1",
+ "resolved": "https://registry.npmjs.org/open/-/open-8.2.1.tgz",
+ "integrity": "sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ==",
+ "requires": {
+ "define-lazy-prop": "^2.0.0",
+ "is-docker": "^2.1.1",
+ "is-wsl": "^2.2.0"
+ }
+ },
+ "p-cancelable": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
+ "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw=="
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
+ },
+ "p-timeout": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz",
+ "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=",
+ "requires": {
+ "p-finally": "^1.0.0"
+ }
+ },
+ "parse-asn1": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
+ "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
+ "requires": {
+ "asn1.js": "^5.2.0",
+ "browserify-aes": "^1.0.0",
+ "evp_bytestokey": "^1.0.0",
+ "pbkdf2": "^3.0.3",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "parse-headers": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.4.tgz",
+ "integrity": "sha512-psZ9iZoCNFLrgRjZ1d8mn0h9WRqJwFxM9q3x7iUjN/YT2OksthDJ5TiPCu2F38kS4zutqfW+YdVVkBZZx3/1aw=="
+ },
+ "parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
+ },
+ "path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
+ },
+ "pbkdf2": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
+ "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
+ "requires": {
+ "create-hash": "^1.1.2",
+ "create-hmac": "^1.1.4",
+ "ripemd160": "^2.0.1",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
+ },
+ "prepend-http": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
+ "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc="
+ },
+ "printj": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz",
+ "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ=="
+ },
+ "process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
+ },
+ "proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "requires": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ }
+ },
+ "psl": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
+ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
+ },
+ "public-encrypt": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
+ "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+ "requires": {
+ "bn.js": "^4.1.0",
+ "browserify-rsa": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "parse-asn1": "^5.0.0",
+ "randombytes": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "pump": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+ },
+ "qs": {
+ "version": "6.7.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
+ },
+ "query-string": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz",
+ "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==",
+ "requires": {
+ "decode-uri-component": "^0.2.0",
+ "object-assign": "^4.1.0",
+ "strict-uri-encode": "^1.0.0"
+ }
+ },
+ "randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "requires": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "randomfill": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+ "requires": {
+ "randombytes": "^2.0.5",
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
+ },
+ "raw-body": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
+ "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
+ "requires": {
+ "bytes": "3.1.0",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ }
+ },
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
+ "request": {
+ "version": "2.88.2",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+ "requires": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.3",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.5.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ },
+ "dependencies": {
+ "qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
+ }
+ }
+ },
+ "responselike": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
+ "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
+ "requires": {
+ "lowercase-keys": "^1.0.0"
+ }
+ },
+ "ripemd160": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+ "requires": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
+ }
+ },
+ "rlp": {
+ "version": "2.2.6",
+ "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz",
+ "integrity": "sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==",
+ "requires": {
+ "bn.js": "^4.11.1"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "scrypt-js": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz",
+ "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA=="
+ },
+ "secp256k1": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz",
+ "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==",
+ "requires": {
+ "elliptic": "^6.5.2",
+ "node-addon-api": "^2.0.0",
+ "node-gyp-build": "^4.2.0"
+ }
+ },
+ "send": {
+ "version": "0.17.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
+ "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "destroy": "~1.0.4",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "~1.7.2",
+ "mime": "1.6.0",
+ "ms": "2.1.1",
+ "on-finished": "~2.3.0",
+ "range-parser": "~1.2.1",
+ "statuses": "~1.5.0"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
+ }
+ }
+ },
+ "serve-static": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
+ "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
+ "requires": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.17.1"
+ }
+ },
+ "servify": {
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz",
+ "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==",
+ "requires": {
+ "body-parser": "^1.16.0",
+ "cors": "^2.8.1",
+ "express": "^4.14.0",
+ "request": "^2.79.0",
+ "xhr": "^2.3.3"
+ }
+ },
+ "setimmediate": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
+ },
+ "setprototypeof": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+ "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
+ },
+ "sha.js": {
+ "version": "2.4.11",
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "requires": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ }
+ },
+ "simple-concat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="
+ },
+ "simple-get": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz",
+ "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==",
+ "requires": {
+ "decompress-response": "^3.3.0",
+ "once": "^1.3.1",
+ "simple-concat": "^1.0.0"
+ }
+ },
+ "sshpk": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
+ "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+ "requires": {
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ }
+ },
+ "statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
+ },
+ "strict-uri-encode": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
+ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM="
+ },
+ "string.prototype.trimend": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
+ "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ }
+ },
+ "string.prototype.trimstart": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
+ "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ }
+ },
+ "string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "requires": {
+ "safe-buffer": "~5.2.0"
+ },
+ "dependencies": {
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+ }
+ }
+ },
+ "strip-hex-prefix": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz",
+ "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=",
+ "requires": {
+ "is-hex-prefixed": "1.0.0"
+ }
+ },
+ "swarm-js": {
+ "version": "0.1.40",
+ "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.40.tgz",
+ "integrity": "sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==",
+ "requires": {
+ "bluebird": "^3.5.0",
+ "buffer": "^5.0.5",
+ "eth-lib": "^0.1.26",
+ "fs-extra": "^4.0.2",
+ "got": "^7.1.0",
+ "mime-types": "^2.1.16",
+ "mkdirp-promise": "^5.0.1",
+ "mock-fs": "^4.1.0",
+ "setimmediate": "^1.0.5",
+ "tar": "^4.0.2",
+ "xhr-request": "^1.0.1"
+ },
+ "dependencies": {
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
+ },
+ "got": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz",
+ "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==",
+ "requires": {
+ "decompress-response": "^3.2.0",
+ "duplexer3": "^0.1.4",
+ "get-stream": "^3.0.0",
+ "is-plain-obj": "^1.1.0",
+ "is-retry-allowed": "^1.0.0",
+ "is-stream": "^1.0.0",
+ "isurl": "^1.0.0-alpha5",
+ "lowercase-keys": "^1.0.0",
+ "p-cancelable": "^0.3.0",
+ "p-timeout": "^1.1.1",
+ "safe-buffer": "^5.0.1",
+ "timed-out": "^4.0.0",
+ "url-parse-lax": "^1.0.0",
+ "url-to-options": "^1.0.1"
+ }
+ },
+ "p-cancelable": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz",
+ "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw=="
+ },
+ "prepend-http": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
+ },
+ "url-parse-lax": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
+ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
+ "requires": {
+ "prepend-http": "^1.0.1"
+ }
+ }
+ }
+ },
+ "tar": {
+ "version": "4.4.19",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz",
+ "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==",
+ "requires": {
+ "chownr": "^1.1.4",
+ "fs-minipass": "^1.2.7",
+ "minipass": "^2.9.0",
+ "minizlib": "^1.3.3",
+ "mkdirp": "^0.5.5",
+ "safe-buffer": "^5.2.1",
+ "yallist": "^3.1.1"
+ },
+ "dependencies": {
+ "mkdirp": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+ "requires": {
+ "minimist": "^1.2.5"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+ }
+ }
+ },
+ "timed-out": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
+ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8="
+ },
+ "to-readable-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
+ "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q=="
+ },
+ "toidentifier": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
+ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
+ },
+ "tough-cookie": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+ "requires": {
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
+ }
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
+ },
+ "type": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
+ "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
+ },
+ "type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "requires": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ }
+ },
+ "typedarray-to-buffer": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+ "requires": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "ultron": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
+ "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og=="
+ },
+ "unbox-primitive": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
+ "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has-bigints": "^1.0.1",
+ "has-symbols": "^1.0.2",
+ "which-boxed-primitive": "^1.0.2"
+ }
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
+ },
+ "uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "url-parse-lax": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
+ "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
+ "requires": {
+ "prepend-http": "^2.0.0"
+ }
+ },
+ "url-set-query": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz",
+ "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk="
+ },
+ "url-to-options": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz",
+ "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k="
+ },
+ "utf-8-validate": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.5.tgz",
+ "integrity": "sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ==",
+ "requires": {
+ "node-gyp-build": "^4.2.0"
+ }
+ },
+ "utf8": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz",
+ "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ=="
+ },
+ "util": {
+ "version": "0.12.4",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz",
+ "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==",
+ "requires": {
+ "inherits": "^2.0.3",
+ "is-arguments": "^1.0.4",
+ "is-generator-function": "^1.0.7",
+ "is-typed-array": "^1.1.3",
+ "safe-buffer": "^5.1.2",
+ "which-typed-array": "^1.1.2"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ },
+ "utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
+ },
+ "uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
+ },
+ "varint": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz",
+ "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow=="
+ },
+ "vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
+ },
+ "verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
+ }
+ },
+ "web3": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/web3/-/web3-1.5.2.tgz",
+ "integrity": "sha512-aapKLdO8t7Cos6tZLeeQUtCJvTiPMlLcHsHHDLSBZ/VaJEucSTxzun32M8sp3BmF4waDEmhY+iyUM1BKvtAcVQ==",
+ "requires": {
+ "web3-bzz": "1.5.2",
+ "web3-core": "1.5.2",
+ "web3-eth": "1.5.2",
+ "web3-eth-personal": "1.5.2",
+ "web3-net": "1.5.2",
+ "web3-shh": "1.5.2",
+ "web3-utils": "1.5.2"
+ }
+ },
+ "web3-bzz": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.5.2.tgz",
+ "integrity": "sha512-W/sPCdA+XQ9duUYKHAwf/g69cbbV8gTCRsa1MpZwU7spXECiyJ2EvD/QzAZ+UpJk3GELXFF/fUByeZ3VRQKF2g==",
+ "requires": {
+ "@types/node": "^12.12.6",
+ "got": "9.6.0",
+ "swarm-js": "^0.1.40"
+ }
+ },
+ "web3-core": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.5.2.tgz",
+ "integrity": "sha512-sebMpQbg3kbh3vHUbHrlKGKOxDWqjgt8KatmTBsTAWj/HwWYVDzeX+2Q84+swNYsm2DrTBVFlqTErFUwPBvyaA==",
+ "requires": {
+ "@types/bn.js": "^4.11.5",
+ "@types/node": "^12.12.6",
+ "bignumber.js": "^9.0.0",
+ "web3-core-helpers": "1.5.2",
+ "web3-core-method": "1.5.2",
+ "web3-core-requestmanager": "1.5.2",
+ "web3-utils": "1.5.2"
+ }
+ },
+ "web3-core-helpers": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.5.2.tgz",
+ "integrity": "sha512-U7LJoeUdQ3aY9t5gU7t/1XpcApsWm+4AcW5qKl/44ZxD44w0Dmsq1c5zJm3GuLr/a9MwQfXK4lpmvxVQWHHQRg==",
+ "requires": {
+ "web3-eth-iban": "1.5.2",
+ "web3-utils": "1.5.2"
+ }
+ },
+ "web3-core-method": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.5.2.tgz",
+ "integrity": "sha512-/mC5t9UjjJoQmJJqO5nWK41YHo+tMzFaT7Tp7jDCQsBkinE68KsUJkt0jzygpheW84Zra0DVp6q19gf96+cugg==",
+ "requires": {
+ "@ethereumjs/common": "^2.4.0",
+ "@ethersproject/transactions": "^5.0.0-beta.135",
+ "web3-core-helpers": "1.5.2",
+ "web3-core-promievent": "1.5.2",
+ "web3-core-subscriptions": "1.5.2",
+ "web3-utils": "1.5.2"
+ }
+ },
+ "web3-core-promievent": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.5.2.tgz",
+ "integrity": "sha512-5DacbJXe98ozSor7JlkTNCy6G8945VunRRkPxMk98rUrg60ECVEM/vuefk1atACzjQsKx6tmLZuHxbJQ64TQeQ==",
+ "requires": {
+ "eventemitter3": "4.0.4"
+ }
+ },
+ "web3-core-requestmanager": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.5.2.tgz",
+ "integrity": "sha512-oRVW9OrAsXN2JIZt68OEg1Mb1A9a/L3JAGMv15zLEFEnJEGw0KQsGK1ET2kvZBzvpFd5G0EVkYCnx7WDe4HSNw==",
+ "requires": {
+ "util": "^0.12.0",
+ "web3-core-helpers": "1.5.2",
+ "web3-providers-http": "1.5.2",
+ "web3-providers-ipc": "1.5.2",
+ "web3-providers-ws": "1.5.2"
+ }
+ },
+ "web3-core-subscriptions": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.5.2.tgz",
+ "integrity": "sha512-hapI4rKFk22yurtIv0BYvkraHsM7epA4iI8Np+HuH6P9DD0zj/llaps6TXLM9HyacLBRwmOLZmr+pHBsPopUnQ==",
+ "requires": {
+ "eventemitter3": "4.0.4",
+ "web3-core-helpers": "1.5.2"
+ }
+ },
+ "web3-eth": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.5.2.tgz",
+ "integrity": "sha512-DwWQ6TCOUqvYyo7T20S7HpQDPveNHNqOn2Q2F3E8ZFyEjmqT4XsGiwvm08kB/VgQ4e/ANyq/i8PPFSYMT8JKHg==",
+ "requires": {
+ "web3-core": "1.5.2",
+ "web3-core-helpers": "1.5.2",
+ "web3-core-method": "1.5.2",
+ "web3-core-subscriptions": "1.5.2",
+ "web3-eth-abi": "1.5.2",
+ "web3-eth-accounts": "1.5.2",
+ "web3-eth-contract": "1.5.2",
+ "web3-eth-ens": "1.5.2",
+ "web3-eth-iban": "1.5.2",
+ "web3-eth-personal": "1.5.2",
+ "web3-net": "1.5.2",
+ "web3-utils": "1.5.2"
+ }
+ },
+ "web3-eth-abi": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.5.2.tgz",
+ "integrity": "sha512-P3bJbDR5wib4kWGfVeBKBVi27T+AiHy4EJxYM6SMNbpm3DboLDdisu9YBd6INMs8rzxgnprBbGmmyn4jKIDKAA==",
+ "requires": {
+ "@ethersproject/abi": "5.0.7",
+ "web3-utils": "1.5.2"
+ }
+ },
+ "web3-eth-accounts": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.5.2.tgz",
+ "integrity": "sha512-F8mtzxgEhxfLc66vPi0Gqd6mpscvvk7Ua575bsJ1p9J2X/VtuKgDgpWcU4e4LKeROQ+ouCpAG9//0j9jQuij3A==",
+ "requires": {
+ "@ethereumjs/common": "^2.3.0",
+ "@ethereumjs/tx": "^3.2.1",
+ "crypto-browserify": "3.12.0",
+ "eth-lib": "0.2.8",
+ "ethereumjs-util": "^7.0.10",
+ "scrypt-js": "^3.0.1",
+ "uuid": "3.3.2",
+ "web3-core": "1.5.2",
+ "web3-core-helpers": "1.5.2",
+ "web3-core-method": "1.5.2",
+ "web3-utils": "1.5.2"
+ },
+ "dependencies": {
+ "eth-lib": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
+ "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
+ "requires": {
+ "bn.js": "^4.11.6",
+ "elliptic": "^6.4.0",
+ "xhr-request-promise": "^0.1.2"
+ }
+ },
+ "uuid": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
+ }
+ }
+ },
+ "web3-eth-contract": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.5.2.tgz",
+ "integrity": "sha512-4B8X/IPFxZCTmtENpdWXtyw5fskf2muyc3Jm5brBQRb4H3lVh1/ZyQy7vOIkdphyaXu4m8hBLHzeyKkd37mOUg==",
+ "requires": {
+ "@types/bn.js": "^4.11.5",
+ "web3-core": "1.5.2",
+ "web3-core-helpers": "1.5.2",
+ "web3-core-method": "1.5.2",
+ "web3-core-promievent": "1.5.2",
+ "web3-core-subscriptions": "1.5.2",
+ "web3-eth-abi": "1.5.2",
+ "web3-utils": "1.5.2"
+ }
+ },
+ "web3-eth-ens": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.5.2.tgz",
+ "integrity": "sha512-/UrLL42ZOCYge+BpFBdzG8ICugaRS4f6X7PxJKO+zAt+TwNgBpjuWfW/ZYNcuqJun/ZyfcTuj03TXqA1RlNhZQ==",
+ "requires": {
+ "content-hash": "^2.5.2",
+ "eth-ens-namehash": "2.0.8",
+ "web3-core": "1.5.2",
+ "web3-core-helpers": "1.5.2",
+ "web3-core-promievent": "1.5.2",
+ "web3-eth-abi": "1.5.2",
+ "web3-eth-contract": "1.5.2",
+ "web3-utils": "1.5.2"
+ }
+ },
+ "web3-eth-iban": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.5.2.tgz",
+ "integrity": "sha512-C04YDXuSG/aDwOHSX+HySBGb0KraiAVt+/l1Mw7y/fCUrKC/K0yYzMYqY/uYOcvLtepBPsC4ZfUYWUBZ2PO8Vg==",
+ "requires": {
+ "bn.js": "^4.11.9",
+ "web3-utils": "1.5.2"
+ }
+ },
+ "web3-eth-personal": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.5.2.tgz",
+ "integrity": "sha512-nH5N2GiVC0C5XeMEKU16PeFP3Hb3hkPvlR6Tf9WQ+pE+jw1c8eaXBO1CJQLr15ikhUF3s94ICyHcfjzkDsmRbA==",
+ "requires": {
+ "@types/node": "^12.12.6",
+ "web3-core": "1.5.2",
+ "web3-core-helpers": "1.5.2",
+ "web3-core-method": "1.5.2",
+ "web3-net": "1.5.2",
+ "web3-utils": "1.5.2"
+ }
+ },
+ "web3-net": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.5.2.tgz",
+ "integrity": "sha512-VEc9c+jfoERhbJIxnx0VPlQDot8Lm4JW/tOWFU+ekHgIiu2zFKj5YxhURIth7RAbsaRsqCb79aE+M0eI8maxVQ==",
+ "requires": {
+ "web3-core": "1.5.2",
+ "web3-core-method": "1.5.2",
+ "web3-utils": "1.5.2"
+ }
+ },
+ "web3-providers-http": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.5.2.tgz",
+ "integrity": "sha512-dUNFJc9IMYDLZnkoQX3H4ZjvHjGO6VRVCqrBrdh84wPX/0da9dOA7DwIWnG0Gv3n9ybWwu5JHQxK4MNQ444lyA==",
+ "requires": {
+ "web3-core-helpers": "1.5.2",
+ "xhr2-cookies": "1.1.0"
+ }
+ },
+ "web3-providers-ipc": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.5.2.tgz",
+ "integrity": "sha512-SJC4Sivt4g9LHKlRy7cs1jkJgp7bjrQeUndE6BKs0zNALKguxu6QYnzbmuHCTFW85GfMDjhvi24jyyZHMnBNXQ==",
+ "requires": {
+ "oboe": "2.1.5",
+ "web3-core-helpers": "1.5.2"
+ }
+ },
+ "web3-providers-ws": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.5.2.tgz",
+ "integrity": "sha512-xy9RGlyO8MbJDuKv2vAMDkg+en+OvXG0CGTCM2BTl6l1vIdHpCa+6A/9KV2rK8aU9OBZ7/Pf+Y19517kHVl9RA==",
+ "requires": {
+ "eventemitter3": "4.0.4",
+ "web3-core-helpers": "1.5.2",
+ "websocket": "^1.0.32"
+ }
+ },
+ "web3-shh": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.5.2.tgz",
+ "integrity": "sha512-wOxOcYt4Sa0AHAI8gG7RulCwVuVjSRS/M/AbFsea3XfJdN6sU13/syY7OdZNjNYuKjYTzxKYrd3dU/K2iqffVw==",
+ "requires": {
+ "web3-core": "1.5.2",
+ "web3-core-method": "1.5.2",
+ "web3-core-subscriptions": "1.5.2",
+ "web3-net": "1.5.2"
+ }
+ },
+ "web3-utils": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.5.2.tgz",
+ "integrity": "sha512-quTtTeQJHYSxAwIBOCGEcQtqdVcFWX6mCFNoqnp+mRbq+Hxbs8CGgO/6oqfBx4OvxIOfCpgJWYVHswRXnbEu9Q==",
+ "requires": {
+ "bn.js": "^4.11.9",
+ "eth-lib": "0.2.8",
+ "ethereum-bloom-filters": "^1.0.6",
+ "ethjs-unit": "0.1.6",
+ "number-to-bn": "1.7.0",
+ "randombytes": "^2.1.0",
+ "utf8": "3.0.0"
+ },
+ "dependencies": {
+ "eth-lib": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
+ "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==",
+ "requires": {
+ "bn.js": "^4.11.6",
+ "elliptic": "^6.4.0",
+ "xhr-request-promise": "^0.1.2"
+ }
+ }
+ }
+ },
+ "websocket": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz",
+ "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==",
+ "requires": {
+ "bufferutil": "^4.0.1",
+ "debug": "^2.2.0",
+ "es5-ext": "^0.10.50",
+ "typedarray-to-buffer": "^3.1.5",
+ "utf-8-validate": "^5.0.2",
+ "yaeti": "^0.0.6"
+ }
+ },
+ "which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "requires": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ }
+ },
+ "which-typed-array": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.6.tgz",
+ "integrity": "sha512-DdY984dGD5sQ7Tf+x1CkXzdg85b9uEel6nr4UkFg1LoE9OXv3uRuZhe5CoWdawhGACeFpEZXH8fFLQnDhbpm/Q==",
+ "requires": {
+ "available-typed-arrays": "^1.0.4",
+ "call-bind": "^1.0.2",
+ "es-abstract": "^1.18.5",
+ "foreach": "^2.0.5",
+ "has-tostringtag": "^1.0.0",
+ "is-typed-array": "^1.1.6"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ },
+ "ws": {
+ "version": "8.2.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.1.tgz",
+ "integrity": "sha512-XkgWpJU3sHU7gX8f13NqTn6KQ85bd1WU7noBHTT8fSohx7OS1TPY8k+cyRPCzFkia7C4mM229yeHr1qK9sM4JQ=="
+ },
+ "xhr": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz",
+ "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==",
+ "requires": {
+ "global": "~4.4.0",
+ "is-function": "^1.0.1",
+ "parse-headers": "^2.0.0",
+ "xtend": "^4.0.0"
+ }
+ },
+ "xhr-request": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz",
+ "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==",
+ "requires": {
+ "buffer-to-arraybuffer": "^0.0.5",
+ "object-assign": "^4.1.1",
+ "query-string": "^5.0.1",
+ "simple-get": "^2.7.0",
+ "timed-out": "^4.0.1",
+ "url-set-query": "^1.0.0",
+ "xhr": "^2.0.4"
+ }
+ },
+ "xhr-request-promise": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz",
+ "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==",
+ "requires": {
+ "xhr-request": "^1.1.0"
+ }
+ },
+ "xhr2-cookies": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz",
+ "integrity": "sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=",
+ "requires": {
+ "cookiejar": "^2.1.1"
+ }
+ },
+ "xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
+ },
+ "yaeti": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz",
+ "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc="
+ },
+ "yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+ }
+ }
}
diff --git a/package.json b/package.json
index 0967ef424..d083084f8 100644
--- a/package.json
+++ b/package.json
@@ -1 +1,9 @@
-{}
+{
+ "dependencies": {
+ "http": "0.0.1-security",
+ "node-fetch": "^2.6.1",
+ "open": "^8.2.1",
+ "web3": "^1.5.2",
+ "ws": "^8.2.1"
+ }
+}
diff --git a/platform.js b/platform.js
new file mode 100644
index 000000000..8b5771861
--- /dev/null
+++ b/platform.js
@@ -0,0 +1,110 @@
+
+if (
+ process.argv.includes("help") ||
+ process.argv.includes("-help") ||
+ process.argv.includes("--help") ||
+ process.argv.includes("h") ||
+ process.argv.includes("-h") ||
+ process.argv.includes("--h") ||
+ process.argv.includes("/h") ||
+ process.argv.includes("/help")) {
+
+ console.log('Superalgos')
+ console.log('')
+ console.log('VERSION: Beta 11')
+ console.log('')
+ console.log('WEB: https://www.superalgos.org')
+ console.log('')
+ console.log('GITHUB: https://www.github.com/Superalgos')
+ console.log('')
+ console.log('TELEGRAM COMMUNITY: https://t.me/superalgoscommunity')
+ console.log('')
+ console.log('USAGE: node runPlatform [help] [noBrowser] [minMemo]')
+ console.log('')
+ console.log('OPTIONS:')
+ console.log('')
+ console.log(' help: Optional. Use it to see this helping information.')
+ console.log(' noBrowser: Optional. Use it to launch Superalgos Platform Client only. The Superalgos Platform UI will not be loaded.')
+ console.log(' minMemo: Optional. Use it when your hardware has less than 8 Gb or memory.')
+ console.log('')
+ console.log('If you are having an error while trying to run the Superalgos Platform Client, consider this:')
+
+ fatalErrorHelp()
+ return
+}
+
+const OS = require("os")
+let totalRAM = OS.totalmem() // Get total ram installed
+totalRAM = totalRAM / 1024 / 1024
+let optimalRAM = totalRAM * 0.85 // Use 85% of installed RAM
+let maxOldSpaceSize = "--max-old-space-size=" + (optimalRAM.toFixed(0)).toString()
+let options
+
+console.log('')
+console.log("Total RAM istalled in this system is ........................ " + (totalRAM / 1024).toFixed(2) + " GB")
+if (process.argv.includes("minMemo")) {
+ options = {
+ stdio: 'inherit'
+ }
+ console.log("Total RAM available for Superalgos is ....................... 512 MB")
+} else {
+ options = {
+ execArgv: [maxOldSpaceSize],
+ stdio: 'inherit'
+ }
+ console.log("Total RAM available for Superalgos is ....................... " + (optimalRAM / 1024).toFixed(2) + " GB")
+ console.log('')
+ console.log('If you would like to enable less RAM than that, use the minMemo flag. Note: RAM will be allocated only if needed.')
+}
+console.log('')
+console.log('OPTIONS ACCEPTED:')
+console.log('')
+let optionsAccepted = 0
+
+
+if (process.argv.includes("minMemo")) {
+ optionsAccepted++
+ console.log('minMemo ..................................................... Running with Minimun Required Memory.')
+}
+
+if (process.argv.includes("noBrowser")) {
+ optionsAccepted++
+ console.log('noBrowser ................................................... Running without User Interface.')
+}
+
+if (optionsAccepted === 0) {
+ console.log('none ........................................................ Running without any command line options.')
+}
+console.log('')
+console.log('')
+
+const fs = require('fs')
+const path = './Platform/node_modules'
+if ( fs.existsSync(path) ) {
+
+ try {
+ const { fork } = require('child_process')
+ fork('./Platform/PlatformApp.js', process.argv, options)
+ } catch (err) {
+ console.log('')
+ console.log('Fail to create Superalgos Platform Client Process.')
+ console.log('')
+
+ fatalErrorHelp()
+ }
+} else {
+ console.log('')
+ console.log('ERROR: node_modules does not exist. Try running node setup to solve this issue. Then try again. You can finded detailed instructions for this in the ReadMe.')
+ console.log('')
+}
+
+
+function fatalErrorHelp() {
+ console.log('')
+ console.log('* If your device does not have MORE than 8GB of RAM then please use the minMemo option.')
+ console.log('* If your OS does not have a user interface, please use the noBrowser option.')
+ console.log('')
+ console.log('If you continue having trouble to start the Superalgos Platform Client try:')
+ console.log('')
+ console.log('node runPlatform minMemo noBrowser')
+}
diff --git a/run.js b/run.js
index d2af79959..cfa5e37c8 100644
--- a/run.js
+++ b/run.js
@@ -1,112 +1,7 @@
-
-if (
- process.argv.includes("help") ||
- process.argv.includes("-help") ||
- process.argv.includes("--help") ||
- process.argv.includes("h") ||
- process.argv.includes("-h") ||
- process.argv.includes("--h") ||
- process.argv.includes("/h") ||
- process.argv.includes("/help")) {
-
- console.log('Superalgos')
- console.log('')
- console.log('VERSION: Beta 11')
- console.log('')
- console.log('WEB: https://www.superalgos.org')
- console.log('')
- console.log('GITHUB: https://www.github.com/Superalgos')
- console.log('')
- console.log('DOCUMENTATION: https://docs.superalgos.org/')
- console.log('')
- console.log('TELEGRAM SUPPORT: https://t.me/superalgoscommunity')
- console.log('')
- console.log('USAGE: node run [help] [noBrowser] [minMemo]')
- console.log('')
- console.log('OPTIONS:')
- console.log('')
- console.log(' help: Optional. Use it to see this helping information.')
- console.log(' noBrowser: Optional. Use it to launch Superalgos Client only. The UI will not be loaded.')
- console.log(' minMemo: Optional. Use it when your hardware has less than 8 Gb or memory.')
- console.log('')
- console.log('If you are having an error while trying to run this Client, consider this:')
-
- fatalErrorHelp()
- return
-}
-
-const OS = require("os")
-let totalRAM = OS.totalmem() // Get total ram installed
-totalRAM = totalRAM / 1024 / 1024
-let optimalRAM = totalRAM * 0.85 // Use 85% of installed RAM
-let maxOldSpaceSize = "--max-old-space-size=" + (optimalRAM.toFixed(0)).toString()
-let options
-
+console.log('Superalgos is growing...! and now, besides the platform for algo-traders, there is a p2p Network (under development) and a Social Trading Desktop app (under development).')
console.log('')
-console.log("Total RAM istalled in this system is ........................ " + (totalRAM / 1024).toFixed(2) + " GB")
-if (process.argv.includes("minMemo")) {
- options = {
- stdio: 'inherit'
- }
- console.log("Total RAM available for Superalgos is ....................... 512 MB")
-} else {
- options = {
- execArgv: [maxOldSpaceSize],
- stdio: 'inherit'
- }
- console.log("Total RAM available for Superalgos is ....................... " + (optimalRAM / 1024).toFixed(2) + " GB")
- console.log('')
- console.log('If you would like to enable less RAM than that, use the minMemo flag. Note: RAM will be allocated only if needed.')
-}
+console.log('For that reason, the "node run" command was deprecated and now you need to use one of these:')
console.log('')
-console.log('OPTIONS ACCEPTED:')
-console.log('')
-let optionsAccepted = 0
-
-
-if (process.argv.includes("minMemo")) {
- optionsAccepted++
- console.log('minMemo ..................................................... Running with Minimun Required Memory.')
-}
-
-if (process.argv.includes("noBrowser")) {
- optionsAccepted++
- console.log('noBrowser ................................................... Running without User Interface.')
-}
-
-if (optionsAccepted === 0) {
- console.log('none ........................................................ Running without any command line options.')
-}
-console.log('')
-console.log('')
-
-const fs = require('fs')
-const path = './Client/node_modules'
-if ( fs.existsSync(path) ) {
-
- try {
- const { fork } = require('child_process')
- fork('./Client/client.js', process.argv, options)
- } catch (err) {
- console.log('')
- console.log('Fail to create Client Process.')
- console.log('')
-
- fatalErrorHelp()
- }
-} else {
- console.log('')
- console.log('ERROR: node_modules does not exist. Try running node setup to solve this issue. Then try again. You can finded detailed instructions for this in the ReadMe.')
- console.log('')
-}
-
-
-function fatalErrorHelp() {
- console.log('')
- console.log('* If your device does not have MORE than 8GB of RAM then please use the minMemo option.')
- console.log('* If your OS does not have a user interface, please use the noBrowser option.')
- console.log('')
- console.log('If you continue having trouble to start the Client try:')
- console.log('')
- console.log('node run minMemo noBrowser')
-}
+console.log('node platform --------------- This will run the Platform for algo-tarders.')
+console.log('node network --------------- This will run the p2p Network for social trading.')
+console.log('node desktop --------------- This will run the Desktop App for crypto users willing to engage in social trading.')
\ No newline at end of file
diff --git a/setup.js b/setup.js
index 6384f38e2..3e61cf7ed 100644
--- a/setup.js
+++ b/setup.js
@@ -2,6 +2,7 @@ const path = require("path");
const process = require("process");
const { exec } = require("child_process");
const systemCheck = require('./Launch-Scripts/system-check')
+const platform = require('os').platform(); // Possible values are: 'aix', 'darwin', 'freebsd', 'linux', 'openbsd', 'sunos', and 'win32'.
// Check system is set up correctly
systemCheck();
@@ -27,17 +28,21 @@ if (process.argv.includes("noShortcuts")) {
// Create Operating System compatable paths to each node_modules directory.
let nodeModulesDirs = [
- path.join( process.cwd(), "Client"),
+ path.join( process.cwd(), "Platform"),
path.join( process.cwd(), "Projects", "Foundations", "TS", "Bot-Modules", "Sensor-Bot", "Exchange-Raw-Data"),
path.join( process.cwd(), "Projects", "Foundations", "TS", "Bot-Modules", "API-Data-Fetcher-Bot"),
path.join( process.cwd(), "Projects", "Foundations", "TS", "Bot-Modules", "Trading-Bot", "Announcements"),
path.join( process.cwd(), "Projects", "Foundations", "TS", "Bot-Modules", "Trading-Bot", "Low-Frequency-Trading", "APIs"),
path.join( process.cwd(), "Projects", "Foundations", "TS", "Task-Modules"),
- /* Aug-27-21 - TensorFlow dependency integration undergoing modifications. Should be resolved within a day or two:
path.join( process.cwd(), "Projects", "TensorFlow", "TS", "Bot-Modules", "Learning-Bot", "Low-Frequency-Learning")
- */
];
+// Check if WinOS because extra dependencies may be required for tfjs:
+var tfjsWinInstallFlag = false;
+if (platform === 'win32') { // *Note: win32 == win32 || win64
+ tfjsWinInstallFlag = true;
+}
+
console.log('');
console.log("Installing node dependencies at the following directories:");
console.log('');
@@ -57,9 +62,31 @@ for (let dir of nodeModulesDirs) {
console.log("There was an error installing some dependencies error: ");
console.log('');
console.log( error );
+ if (tfjsWinInstallFlag == true && dir == path.join(process.cwd(), "Projects", "TensorFlow", "TS", "Bot-Modules", "Learning-Bot", "Low-Frequency-Learning")) {
+ tfjsWinInstall();
+ }
return;
}
console.log('');
console.log( stdout );
});
-};
\ No newline at end of file
+};
+
+
+/* If WinOS && error with tfjs installation:
+ * This is a well known and documented issue with @Tensorflow/tfjs-node installation on WinOS.
+ * npm's windows-build-tools via: `npm install --global --production windows-build-tools` &&
+ * `npm install -g node-gyp` can sometimes correct the issue but not always depending on the
+ * version and options the user defined when installing npm/nodejs.
+ * The best reliable way to correct that I (Pluvtech) have found to work on many versions of WinOS
+ * is to reinstall nodejs and select to install chocolatey during the installation configuration.
+ */
+function tfjsWinInstall() {
+ console.log("\n*** Note to Windows Users Regarding the Superalgos TensorFlow Project ***");
+ console.log("If you have no other errors with this setup script and do not wish to use the TensorFlow Project:\nThen all is successful with your Superalgos setup and you may proceed to use the software.");
+ console.log("\nIf you do wish to install the @Tensorflow/tfjs-node modules required for use with the Superalgos TensorFlow Project:");
+ console.log("In this case it is likely your system is missing some dependencies required to build the TensorFlow (tfjs-node) bindings and you will need to follow the below steps:");
+ console.log("\n1.) Reinstall node.js from https://nodejs.org/en/download/ @Version 14.17.5 or higher.\nDuring installation, when you arrive at the 'Tools for Native Modules' screen you need to select the box to:\n\t'Automatically install the necessary tools...Chocolatey...'");
+ console.log("Doing this will cause a pop-up script in a new window which will install many npm/node tools and dependencies for use within the WinOS ecosystem.");
+ console.log("2.) When the installations finally complete you need to navigate back to your Superalgos directory and run `node setup` again.\n");
+}
\ No newline at end of file