Merge branch 'develop' of https://github.com/Superalgos/Superalgos into develop
This commit is contained in:
commit
66e3e205ef
187 files changed
+11605
-3699
No files matched your search
Vendored
+10
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"folders": [
|
||||
{
|
||||
"path": "C:\\Superalgos"
|
||||
}
|
||||
],
|
||||
"settings": {
|
||||
"search.maintainFileSearchCache": true
|
||||
}
|
||||
}
|
||||
Vendored
+10
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"folders": [
|
||||
{
|
||||
"path": "C:\\Superalgos"
|
||||
}
|
||||
],
|
||||
"settings": {
|
||||
"search.maintainFileSearchCache": true
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
-7
@@ -54,9 +54,6 @@ global.CUSTOM_FAIL_RESPONSE = {
|
||||
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')
|
||||
@@ -74,16 +71,31 @@ let WEB_SOCKETS_INTERFACE = require('./webSocketsInterface.js')
|
||||
let HTTP_INTERFACE = require('./httpInterface.js')
|
||||
|
||||
try {
|
||||
/*
|
||||
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')
|
||||
}
|
||||
@@ -151,7 +163,7 @@ try {
|
||||
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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1350,7 +1350,7 @@ exports.newHttpInterface = function newHttpInterface() {
|
||||
let project = unescape(requestParameters[2])
|
||||
let folder = unescape(requestParameters[3])
|
||||
|
||||
let response = await CL.projects.foundations.utilities.plugins.getPluginFileNames(
|
||||
let response = await SA.projects.foundations.utilities.plugins.getPluginFileNames(
|
||||
project,
|
||||
folder
|
||||
)
|
||||
@@ -1384,7 +1384,7 @@ exports.newHttpInterface = function newHttpInterface() {
|
||||
let folder = unescape(requestParameters[3])
|
||||
let fileName = unescape(requestParameters[4])
|
||||
|
||||
let response = await CL.projects.foundations.utilities.plugins.getPluginFileContent(
|
||||
let response = await SA.projects.foundations.utilities.plugins.getPluginFileContent(
|
||||
project,
|
||||
folder,
|
||||
fileName
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
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
|
||||
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
exports.newDesktopApp = function newDesktopApp() {
|
||||
|
||||
let thisObject = {
|
||||
run: run
|
||||
}
|
||||
|
||||
return thisObject
|
||||
|
||||
function run() {
|
||||
/*
|
||||
Let's start the Network Interfaces
|
||||
*/
|
||||
DK.webSocketsClient = SA.projects.network.modules.webSocketsClient.newNetworkModulesWebSocketsClient()
|
||||
DK.webSocketsClient.initialize()
|
||||
|
||||
|
||||
return
|
||||
start()
|
||||
|
||||
async function start() {
|
||||
let socialGraphService = NT.projects.network.modules.socialGraph.newSocialGraph()
|
||||
await socialGraphService.initialize()
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
+3
-2
@@ -2,13 +2,14 @@ exports.newEnvironment = function () {
|
||||
|
||||
let thisObject = {
|
||||
WEB_SERVER_URL: 'localhost',
|
||||
WEB_SOCKETS_INTERFACE_PORT: 18041,
|
||||
CLIENT_WEB_SOCKETS_INTERFACE_PORT: 18041,
|
||||
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_PROJECTS_REQUIRED: './Projects',
|
||||
PATH_TO_PROJECT_SCHEMA: '../Projects/ProjectsSchema.json',
|
||||
PATH_TO_UI: './UI',
|
||||
PATH_TO_DATA_FILES: './UI/Data-Files/src',
|
||||
PATH_TO_CLIENT: './Client/',
|
||||
|
||||
@@ -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,
|
||||
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_PROJECT_SCHEMA: './Projects/ProjectsSchema.json',
|
||||
PATH_TO_UI: './UI',
|
||||
PATH_TO_DATA_FILES: './UI/Data-Files/src',
|
||||
PATH_TO_CLIENT: './Client/',
|
||||
PATH_TO_DEFAULT_WORKSPACE: './Projects/Foundations/Plugins/Workspaces',
|
||||
PATH_TO_MY_WORKSPACES: './My-Workspaces',
|
||||
PATH_TO_FONTS: './Client/WebServer/Fonts'
|
||||
}
|
||||
|
||||
return thisObject
|
||||
}
|
||||
-361
@@ -1,361 +0,0 @@
|
||||
# Getting Started Guide
|
||||
|
||||
All procedures are the same for Windows, Linux, or Mac OS. Raspberry Pi terminal commands have been included for ease of use.
|
||||
|
||||
> **IMPORTANT:** Remote installations and minimalist hardware —both virtual and physical— are better suited for production deployments, where the use of the GUI is minimal. We highly recommend learning Superalgos in a local installation. Mastering the system takes time, and the use of the GUI to go through in-app tutorials is crucial during the learning process. Your experience will be orders of magnitude better if you follow this advice: leave remote installations and minimalist hardware for when you are ready to start trading live.
|
||||
|
||||
|
||||
|
||||
# Pre-Requisites
|
||||
|
||||
## 1. Node JS Installation
|
||||
|
||||
If you don't have it yet, download and install Node.js.
|
||||
|
||||
Node JS is an open-source server environment required to run Superalgos.
|
||||
|
||||
**A.** Go to the Node JS [download page](https://nodejs.org/en/download/).
|
||||
|
||||
**B.** Download your system's installer. Select *LTS Recommended for Most Users* and click the big Windows or macOS Installer button. If you are on Linux, the installer is listed further down the page.
|
||||
|
||||
**C.** Run the installer with the default configuration — just click Next until Node.JS is fully installed. That's it! You can continue with step 2 (Git Installation).
|
||||
|
||||
<hr>
|
||||
|
||||
**NODE JS INSTALLATION FOR RASPBERRY PI USERS**
|
||||
|
||||
You may install Node.JS just like you would on any other machine as per the above instructions. As an alternative, you may also try the following from the SSH Terminal.
|
||||
|
||||
**NOTE:** It is best to use the most current and updated version of the FULL PiOS image.
|
||||
|
||||
```
|
||||
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
|
||||
```
|
||||
Followed by:
|
||||
```
|
||||
sudo apt-get install -y nodejs
|
||||
```
|
||||
It is also required to install the Node Package Manager for dependancy management.
|
||||
```
|
||||
sudo apt install npm
|
||||
```
|
||||
You may also type the following to verify Node.js and NPM installation and version.
|
||||
```
|
||||
node -v
|
||||
```
|
||||
```
|
||||
npm -v
|
||||
```
|
||||
|
||||
<hr>
|
||||
|
||||
## 2. Git Installation
|
||||
|
||||
Download and install Git.
|
||||
|
||||
Git is an open-source distributed version control system required to download and stay up to date with Superalgos.
|
||||
|
||||
**A.** Go to the Git [download page](https://git-scm.com/downloads).
|
||||
|
||||
**B.** Download the version for your Operating System.
|
||||
|
||||
**C.** Run the installer with the default configuration — just click Next until Git is fully installed.
|
||||
|
||||
**IMPORTANT:** The latest version of Git is required to handle the authentication with GitHub.com.
|
||||
|
||||
**NOTE FOR MAC USERS:** Depending on your setup, installing Git may be optional. The native XCode Command Line Developer Tools seems to work well. If you do install Git, we have tested Tim Harper's binary installer successfully.
|
||||
|
||||
<hr>
|
||||
|
||||
**GIT INSTALLATION FOR RASPBERRY PI USERS**
|
||||
|
||||
Just like with Node.JS, you may follow the above instructions to install Git, or use the SSH Terminal command. The most recent version of PiOS has Git already installed, so this may give you an error. The error will not affect your installation.
|
||||
```
|
||||
sudo apt-get install git
|
||||
```
|
||||
|
||||
<hr>
|
||||
|
||||
## 3. Google Chrome or Safari
|
||||
|
||||
Use Chrome, or Safari on Mac. These are the only tested browsers.
|
||||
|
||||
**A.** Go to the Chrome [download page](https://www.google.com/chrome/).
|
||||
|
||||
**B.** Run the installer.
|
||||
|
||||
Before you begin, it is recommended that you set up Chrome/Safari as your default browser.
|
||||
|
||||
**IMPORTANT:** Use Chrome/Safari so that you have a similar environment as the dev team in case you need help. We are not testing on any other browsers, and it is a well-known fact that browsers behave differently.
|
||||
|
||||
# Superalgos Client Installation
|
||||
|
||||
## 1. Fork the Superalgos Repository
|
||||
|
||||
**A.** Scroll the page all the way to the top. Find and click the **Fork** button to create your fork/copy of this repository. To fork Superalgos you need a Github account. If you don't have one, go ahead and create it.
|
||||
|
||||
**NOTE:** A Fork is required for your contributions to the project. The reason why Superalgos is free and open-source is that the project has set up a <a href="https://superalgos.org/project-one-pager.shtml" target="_blank">Collective Business</a> in which all users may participate. The way to participate is to <a href="https://superalgos.org/community-contribute.shtml" target="_blank">contribute</a> to make Superalgos better. The project's <a href="https://superalgos.org/token-overview.shtml" target="_blank">token</a> is distributed among contributors.
|
||||
|
||||
## 2. Clone Your Fork
|
||||
|
||||
**A.** Once the fork is created, you will land on the page of your fork. Copy the URL from your browser's address bar.
|
||||
|
||||
**B.** In your computer/laptop/server, open a command prompt or terminal. Make sure you are in a directory where you have write permissions (on most systems the terminal will open in your user's home directory, so you're good). Clone the git repository using the command:
|
||||
|
||||
```
|
||||
git clone <URL of your Superalgos fork>
|
||||
```
|
||||
|
||||
For example, if your Github username is John, the command will look like this:
|
||||
|
||||
```
|
||||
git clone https://github.com/John/Superalgos
|
||||
```
|
||||
|
||||
This creates the `Superalgos` folder in the current directory, which contains the whole installation.
|
||||
|
||||
## 3. Install Node Dependencies
|
||||
|
||||
After the Superalgos directory has been installed, the final step of installation is to set up the necessary node dependencies. In the same command prompt or terminal you just used, type the following:
|
||||
|
||||
```
|
||||
cd Superalgos
|
||||
```
|
||||
|
||||
That should take you inside the Superalgos folder created by the `git clone` command earlier. Now, run the following command:
|
||||
|
||||
```
|
||||
node setup
|
||||
```
|
||||
|
||||
Then wait until you are able to type within the terminal again.
|
||||
|
||||
This command will install and configure all additional dependencies needed by Superalgos. It will also install desktop and start menu shortcuts.
|
||||
|
||||
**NOTE FOR USERS INSTALLING MULTIPLE INSTANCES OF SUPERALGOS ON THE SAME MACHINE:** In order to avoid name conflicts between shortcuts, make sure to rename each Superalgos directory before running `node setup`.
|
||||
|
||||
Congratulations your installation is complete!
|
||||
|
||||
> **The Usage section below explains how to run the app.**
|
||||
|
||||
<hr>
|
||||
|
||||
**DEPENDENCY INSTALLATION FOR RASPBERRY PI USERS**
|
||||
|
||||
As noted above, running `node setup` installs GUI shortcuts by default. To suppress this behavior in headless installations, add the `noShortcuts` flag as follows:
|
||||
|
||||
```
|
||||
node setup noShortcuts
|
||||
```
|
||||
|
||||
<hr>
|
||||
|
||||
**Troubleshooting Dependency Installation**
|
||||
|
||||
If you are having difficulty running the node setup command here are a few common issues that may be getting in the way.
|
||||
|
||||
**1.** Check the version of node and npm you have installed. Make sure that you are running an updated version of node greater than version 12 and npm greater than version 5. You can check which version you have by typing `node -v` and `npm -v` into a command prompt or terminal. If your version numbers are below these, you can update your installation by following the instructions outlined in the "Node JS Installation" step above.
|
||||
|
||||
|
||||
**2.** If you are installing Superalgos in an administratively protected directory you will need to do one of the following:
|
||||
|
||||
- For Windows start your command prompt as an administrator.
|
||||
|
||||
- For Linux and Mac Systems make sure to add the sudo command to node setup. This will look like `sudo node setup`.
|
||||
|
||||
|
||||
**3.** For Windows it is important that you have C:\Windows\System32 added to your global PATH. For instructions on how to do this google "add to the path on Windows 10."
|
||||
|
||||
<hr>
|
||||
|
||||
## 4. Installation Notes
|
||||
|
||||
**A.** You need to make a fork so that you may contribute work. Superalgos is a Community project and you are expected to contribute, like everyone else. You don't need to be a technical person to contribute. Fixing a typo in the docs or translating a paragraph into your native language are valuable contributions too. Superalgos has built-in features that make contributing easy. Help make Superalgos better and Superalgos will better serve you! [Free-riding is not cool](https://en.wikipedia.org/wiki/Free-rider_problem), particularly on free, open-source, Community-driven projects.
|
||||
|
||||
**B.** The software includes an in-app self-update command / feature. It will help you stay up-to-date with the latest version of the software. Updates are on-demand, so don't worry about undesired updates. The project moves very fast and new features become available regularly, particularly if you choose to run the software in the ```develop``` branch (you may switch branches from within the app).
|
||||
|
||||
**C.** It is a good idea to perodically run the `node setup` command to keep the underlying dependencies for your Superalgos installation up to date.
|
||||
|
||||
**D.** Before installing the client on a remote computer in an attempt to access the UI from a different machine, we highly recommend you do a standard installation on your PC / laptop first. Leave your Raspberry Pi or VPS for later, once you have done all available tutorials. This single tip will save you a lot of time: you don't need to add complexity before you learn how to handle the app, and the GUI performs best in a local installation.
|
||||
|
||||
# Usage
|
||||
|
||||
## 1. Run the Client and GUI
|
||||
|
||||
**A.** To run Superalgos, go to the Superalgos directory/folder and run this command:
|
||||
|
||||
```
|
||||
node run
|
||||
```
|
||||
|
||||
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.
|
||||
|
||||
A Welcome Tutorial pops-up automatically. You must do this Tutorial to finish the setup and to learn the basics. It's the ultimate onboarding experience, superior to all other resources available, including videos and the Docs.
|
||||
|
||||

|
||||
|
||||
If you are running a headless Raspberry Pi (one without a screen) you may need to change directories first and run Superalgos with the `minMemo` and `noBrowser` options.
|
||||
```
|
||||
cd Superalgos
|
||||
```
|
||||
then
|
||||
```
|
||||
node run minMemo noBrowser
|
||||
```
|
||||
|
||||
In addition, you may use any of the automatically installed desktop and start menu shortcuts to launch Superalgos.
|
||||
|
||||
**NOTE:** Shortcuts are not currently supported on Mac. Collaborators are needed to finish this feature.
|
||||
|
||||
**B.** Enable Desktop Shortcut on Ubuntu
|
||||
|
||||
The majority of shortcuts that are automatically installed will work out of the box. Desktop shortcuts on Ubuntu, however, require a few additional steps to set up.
|
||||
|
||||
First, desktop icons need to be enabled within the Tweaks app.
|
||||
* Check if Tweaks is installed.
|
||||
* If not go to Ubuntu Software.
|
||||
* Install Tweaks.
|
||||
* Open Tweaks.
|
||||
* Under extensions turn on Desktop Icons
|
||||
|
||||

|
||||
|
||||
**TIP:** If you do not see the desktop shortcut appear right away you may need to restart your computer.
|
||||
|
||||
Finally, you will need to enable the desktop shortcut.
|
||||
* Right click Superalgos.desktop and select Allow Launching.
|
||||
|
||||

|
||||
|
||||
Now both launcher and desktop shortcuts will launch Superalgos like any other program on your computer.
|
||||
|
||||
## 3. Usage Notes
|
||||
|
||||
We are testing the UI on Google Chrome and Safari on macOS only. It may work on other browsers as well — or not. If you are running on a different browser and ever need support, make sure you mention that fact upfront, or even better, try on Chrome/Safari first.
|
||||
|
||||
**TIP:** If your computer has 8 GB of RAM or less, use ```node run minMemo``` to run the system with minimal RAM requirements.
|
||||
|
||||
# Running Superalgos on a Headless Linux Server as a Daemon
|
||||
|
||||
If you're running Superalgos on a headless linux server like a Raspberry Pi, you might want to run it as a daemon so it isn't attached to your current login session. The easiest, most standard way to go about this is probably using `systemd`. Most linux distributions use it as default init system/service manager.
|
||||
|
||||
## Using `systemd`
|
||||
|
||||
Create a `superalgos.service` file looking like this (change `<user>` to your user name and `/path/to/Superalgos` to your Superalgos folder, for instance `/home/John/Superalgos`):
|
||||
```
|
||||
[Unit]
|
||||
Description=Superalgos client
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=<user>
|
||||
WorkingDirectory=/path/to/Superalgos
|
||||
ExecStart=/usr/bin/node run minMemo noBrowser
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
|
||||
```
|
||||
There is no need to run Superalgos as root so we're running it as a user. The `minMemo` option assumes you're running on a small machine like a Raspberry Pi, while `noBrowser` makes sense for running daemonized.
|
||||
|
||||
Now, as root (or using `sudo`), put the file `superalgos.service` you just created in `/etc/systemd/system/` and issue the command
|
||||
```
|
||||
systemctl enable superalgos
|
||||
```
|
||||
This will install the service so that Superalgos is started on boot. To start it manually, do (again as root or with `sudo`)
|
||||
```
|
||||
systemctl start superalgos
|
||||
```
|
||||
|
||||
To see the output of Superalgos, use
|
||||
```
|
||||
journalctl -u superalgos
|
||||
```
|
||||
or to follow the output,
|
||||
```
|
||||
journalctl -u superalgos -f
|
||||
```
|
||||
|
||||
# Uninstall
|
||||
|
||||
Superalgos writes nothing outside of the ```Superalgos``` folder other than shortcut files. To uninstall the software, follow these steps:
|
||||
|
||||
Open a terminal or command prompt and navigate to your main Superalgos directory and type the following command:
|
||||
```
|
||||
node uninstall
|
||||
```
|
||||
This will remove any shortcut files that have been installed.
|
||||
|
||||
Then simply delete the `Superalgos` folder. There will be nothing left on your computor.
|
||||
|
||||
# Welcome Tutorial
|
||||
|
||||
Once the app finishes loading, an interactive tutorial takes you by the hand and walks you all around the system while you learn the basic skills required to use the interface, mine data, backtest strategies, and even run a live trading session. It is highly recommended you follow the tutorial until the end, as it is carefully crafted to make your onboarding as easy as possible. Tutorials are the absolute best way to tackle the learning curve. You should do all tutorials before you start exploring other avenues on your own.
|
||||
|
||||

|
||||
|
||||
**NOTE:** The tutorial uses Binance or Binance US as the exchange of choice. If you don't have an account with Binance or Binance US, you will still be able to follow 100% of the tutorial. When you get to the live trading section, keep going even if you don't intend to run the session. You may learn how to work with other exchanges later on.
|
||||
|
||||
# Docker Deployments
|
||||
|
||||
Docker container images can be found at https://github.com/users/Superalgos/packages/container/package/superalgos
|
||||
|
||||
If you wish to run Superalgos over docker platform, follow these steps.
|
||||
|
||||
**Note:** This has not been extensively tested yet. If you run into troubles, please contact us at the [Superalgos Support Group](https://t.me/superalgossupport).
|
||||
|
||||
## 1. Install Docker
|
||||
|
||||
Follow the link to [install docker](https://docs.docker.com/engine/install/).
|
||||
|
||||
## 2. Run
|
||||
|
||||
|
||||
### Option A. Using pre-built container
|
||||
|
||||
You will need to create local storage directories beforehand, by example with `mkdir Data-Storage Log-Files My-Workspaces`
|
||||
|
||||
```
|
||||
docker run \
|
||||
-d \
|
||||
--rm \
|
||||
--name superalgos \
|
||||
-p 18041:18041 \
|
||||
-p 34248:34248 \
|
||||
-v $(pwd)/Data-Storage:/app/Data-Storage \
|
||||
-v $(pwd)/Log-Files:/app/Log-Files \
|
||||
-v $(pwd)/My-Workspaces:/app/My-Workspaces \
|
||||
ghcr.io/superalgos/superalgos:latest
|
||||
```
|
||||
|
||||
Now you can access the Superalgos UI at http://127.0.0.1:34248
|
||||
|
||||
To see console logs you can use `docker logs superalgos -f`
|
||||
|
||||
When you're done just exec `docker kill superalgos`
|
||||
|
||||
### Option B. Build container locally using docker-compose
|
||||
|
||||
Follow the link to [install docker-compose](https://docs.docker.com/compose/install/)
|
||||
|
||||
Run `docker-compose -f Docker/docker-compose.yml up`.
|
||||
|
||||
## Configure the Container Environment
|
||||
|
||||
### Available image tags
|
||||
|
||||
To avoid breaking changes, the `shasum hash` and the `release` tags are the best to use. These will generally ensure you are always running the same code. The other tags will change which code they are pointing to more frequently and without notice.
|
||||
|
||||
- `latest` : the absolute latest build
|
||||
- `master` : the latest master branch build
|
||||
- `develop` : the latest develop branch build
|
||||
- `<shasum hash>` : a specific git commit hash
|
||||
- `<release>` : corresponds with a Github Release (git tag), i.e. `beta-10`
|
||||
|
||||
### Environment variables
|
||||
|
||||
`PUID` and `GUID` environment variables can be used to help avoid permissions issues in the mounted volumes between the container environment and the local OS environment. The default `PUID` and `GUID` is `1000`. You can view the current user's PUID and GUID with the `id` command.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
Some users have reported the Docker installation was not working, and the root cause was that the ad blocker was blocking the scripts to run.
|
||||
+116
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"folders": [
|
||||
{
|
||||
"path": "C:\\Superalgos\\Network"
|
||||
},
|
||||
{
|
||||
"path": "C:\\Superalgos\\Projects\\Network"
|
||||
},
|
||||
{
|
||||
"path": "C:\\Superalgos\\Projects\\Social-Trading"
|
||||
}
|
||||
],
|
||||
"settings": {}
|
||||
}
|
||||
+20
-24
@@ -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.
|
||||
let thisObject = {
|
||||
run: run
|
||||
}
|
||||
},
|
||||
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')
|
||||
|
||||
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()
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
@@ -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--
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
-129
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
+2
-2
@@ -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) {
|
||||
@@ -1,13 +1,14 @@
|
||||
{
|
||||
"type": "Community",
|
||||
"definition": {
|
||||
"text": "The Community, or the Superalgos Community, is the group of entities participating in the Superalgos project, either actively contributing to advancing the project or passively using the Superalgos software.",
|
||||
"updated": 1618832930339,
|
||||
"text": "The Community, or the Superalgos Community, is the group of entities participating in the Superalgos project, either actively contributing to advancing the project or passively using the Superalgos Network.",
|
||||
"updated": 1630096402584,
|
||||
"translations": [
|
||||
{
|
||||
"language": "ES",
|
||||
"text": "La Community, o la Superalgos Community, es el grupo de entidades que participan en el proyecto Superalgos, ya sea contribuyendo activamente al avance del proyecto o utilizando pasivamente el software Superalgos.",
|
||||
"updated": 1628046272721
|
||||
"updated": 1628046272721,
|
||||
"style": "Definition"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
+14
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"type": "Superalgos Network",
|
||||
"definition": {
|
||||
"text": "The Superalgos Network is a future, to be launched network that will allow users to setup their Client to be part of. Once done Clients will connect to each other in a p2p way, enabling from there the exchange of data and services between users.",
|
||||
"updated": 1621955485325
|
||||
"text": "The Superalgos Network is an open, peer-to-peer network, currently in the making. The network will enable users to set up their Clients to interact with other Clients. Such connectivity enables the exchange and dissemination of products and services from and to users.",
|
||||
"updated": 1630096650321
|
||||
},
|
||||
"paragraphs": [
|
||||
{
|
||||
|
||||
+13
@@ -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."
|
||||
}
|
||||
]
|
||||
}
|
||||
+2
-1
@@ -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",
|
||||
|
||||
+38
-6
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
+26
-5
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
+26
-5
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
+2
-2
@@ -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++) {
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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
|
||||
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. */
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"type": "User Profile",
|
||||
"name": "ssplatt",
|
||||
"config": "{\n \"signature\": {\n \"message\": \"ssplatt\",\n \"messageHash\": \"0xbef81935208a5ef082638306a20998b2102881c5e48c2e646b771d41eeae6105\",\n \"v\": \"0x1c\",\n \"r\": \"0x69300bf3278cb434dea26ede48097dbf5c7023e3d7918d5ca0cdef7432d1c6ee\",\n \"s\": \"0x15abc24988775e3ecef9cb4e013376e0232a8e2da134c9c6b1cb16b6e4ee759a\",\n \"signature\": \"0x69300bf3278cb434dea26ede48097dbf5c7023e3d7918d5ca0cdef7432d1c6ee15abc24988775e3ecef9cb4e013376e0232a8e2da134c9c6b1cb16b6e4ee759a1c\"\n },\n \"codeName\": \"ssplatt\"\n}",
|
||||
"config": "{\"signature\":{\"message\":\"ssplatt\",\"messageHash\":\"0xbef81935208a5ef082638306a20998b2102881c5e48c2e646b771d41eeae6105\",\"v\":\"0x1c\",\"r\":\"0x69300bf3278cb434dea26ede48097dbf5c7023e3d7918d5ca0cdef7432d1c6ee\",\"s\":\"0x15abc24988775e3ecef9cb4e013376e0232a8e2da134c9c6b1cb16b6e4ee759a\",\"signature\":\"0x69300bf3278cb434dea26ede48097dbf5c7023e3d7918d5ca0cdef7432d1c6ee15abc24988775e3ecef9cb4e013376e0232a8e2da134c9c6b1cb16b6e4ee759a1c\"},\"codeName\":\"ssplatt\"}",
|
||||
"project": "Governance",
|
||||
"tokenPowerSwitch": {
|
||||
"type": "Token Power Switch",
|
||||
@@ -9,6 +9,541 @@
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"tokenPowerSwitch": [],
|
||||
"onboardingPrograms": {
|
||||
"type": "Onboarding Programs",
|
||||
"name": "New Onboarding Programs",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"airdropProgram": {
|
||||
"type": "Airdrop Program",
|
||||
"name": "New Airdrop Program",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"tokensAwarded": {
|
||||
"type": "Tokens Awarded",
|
||||
"name": "New Tokens Awarded",
|
||||
"project": "Governance",
|
||||
"id": "e6bad077-b21f-4ad5-acf8-eeb293ef1c2e",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 20144.708572938485,
|
||||
"y": 19148.37783738477
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 20222.354286469243,
|
||||
"y": 19438.155585271492
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
"isFrozen": false,
|
||||
"isCollapsed": false,
|
||||
"angleToParent": 1,
|
||||
"distanceToParent": 3,
|
||||
"arrangementStyle": 0
|
||||
},
|
||||
"uiObject": {
|
||||
"isRunning": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"id": "21fc9fe9-020e-46e6-aeb2-764f1838fac9",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 20222.354286469243,
|
||||
"y": 19438.155585271492
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 20300,
|
||||
"y": 19727.933333158213
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
"isFrozen": false,
|
||||
"isCollapsed": false,
|
||||
"angleToParent": 3,
|
||||
"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": "50079cf4-9746-420e-80c3-2e6b85298ac7",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 20455.291427061515,
|
||||
"y": 19148.37783738477
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 20377.645713530757,
|
||||
"y": 19438.155585271492
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
"isFrozen": false,
|
||||
"isCollapsed": false,
|
||||
"angleToParent": 1,
|
||||
"distanceToParent": 3,
|
||||
"arrangementStyle": 0
|
||||
},
|
||||
"uiObject": {
|
||||
"isRunning": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"id": "e1c18d16-d11d-4fbe-9e4d-7e1288221c6f",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 20377.645713530757,
|
||||
"y": 19438.155585271492
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 20300,
|
||||
"y": 19727.933333158213
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
"isFrozen": false,
|
||||
"isCollapsed": false,
|
||||
"angleToParent": 3,
|
||||
"distanceToParent": 3,
|
||||
"arrangementStyle": 0
|
||||
},
|
||||
"uiObject": {
|
||||
"isRunning": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"id": "1bc0ffaa-83d2-44c7-8231-74fb6b747487",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 20300,
|
||||
"y": 19727.933333158213
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 20300,
|
||||
"y": 20027.933333158213
|
||||
},
|
||||
"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": "{}",
|
||||
"project": "Governance",
|
||||
"userReferrers": [
|
||||
{
|
||||
"type": "User Referrer",
|
||||
"name": "Luis-Fernando-Molina",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "18ca0727-c296-4059-aef0-a75c324e526e",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 20937.45333466609,
|
||||
"y": 19588.155585271492
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 20859.807621135333,
|
||||
"y": 19877.933333158213
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
"isFrozen": false,
|
||||
"isCollapsed": false,
|
||||
"angleToParent": 2,
|
||||
"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"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"tokensAwarded": {
|
||||
"type": "Tokens Awarded",
|
||||
"name": "New Tokens Awarded",
|
||||
"project": "Governance",
|
||||
"id": "43b6c240-ff85-41cf-b423-963ad99a8e9c",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 21119.615242270665,
|
||||
"y": 19727.933333158213
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 20859.807621135333,
|
||||
"y": 19877.933333158213
|
||||
},
|
||||
"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": "7afeae27-2cc1-4888-b8d2-9c5536c6e9ae",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 21149.585369022054,
|
||||
"y": 19955.57904668897
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 20859.807621135333,
|
||||
"y": 19877.933333158213
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
"isFrozen": false,
|
||||
"isCollapsed": false,
|
||||
"angleToParent": 2,
|
||||
"distanceToParent": 3,
|
||||
"arrangementStyle": 0
|
||||
},
|
||||
"uiObject": {
|
||||
"isRunning": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"id": "68e7a305-2909-4741-9b12-624d7e556915",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 20812.132034355964,
|
||||
"y": 19815.80129880225
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 20600,
|
||||
"y": 20027.933333158213
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
"isFrozen": false,
|
||||
"isCollapsed": true,
|
||||
"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": "Luis-Fernando-Molina",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "8ca39d43-eb8b-4ea8-b5e1-594230285470",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 21149.585369022054,
|
||||
"y": 20100.287619627456
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 20859.807621135333,
|
||||
"y": 20177.933333158213
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
"isFrozen": false,
|
||||
"isCollapsed": false,
|
||||
"angleToParent": 2,
|
||||
"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"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"tokensAwarded": {
|
||||
"type": "Tokens Awarded",
|
||||
"name": "New Tokens Awarded",
|
||||
"project": "Governance",
|
||||
"id": "4a32dc2c-14e4-4678-a3e9-54acabfcd427",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 21119.615242270665,
|
||||
"y": 20327.933333158213
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 20859.807621135333,
|
||||
"y": 20177.933333158213
|
||||
},
|
||||
"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": "e0a87fb2-2fff-42ba-a51a-2ca560b9bb70",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 20937.45333466609,
|
||||
"y": 20467.711081044934
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 20859.807621135333,
|
||||
"y": 20177.933333158213
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
"isFrozen": false,
|
||||
"isCollapsed": false,
|
||||
"angleToParent": 2,
|
||||
"distanceToParent": 3,
|
||||
"arrangementStyle": 0
|
||||
},
|
||||
"uiObject": {
|
||||
"isRunning": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"id": "411a6083-99ae-4ece-9334-42801ee0fc8c",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 20900,
|
||||
"y": 20027.933333158213
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 20600,
|
||||
"y": 20027.933333158213
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
"isFrozen": false,
|
||||
"isCollapsed": true,
|
||||
"angleToParent": 2,
|
||||
"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": "84ce8ba3-c177-43ed-b9f3-c901d014db2c",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 21112.132034355964,
|
||||
"y": 20240.065367514177
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 20812.132034355964,
|
||||
"y": 20240.065367514177
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
"isFrozen": false,
|
||||
"isCollapsed": false,
|
||||
"angleToParent": 2,
|
||||
"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"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"tokensAwarded": {
|
||||
"type": "Tokens Awarded",
|
||||
"name": "New Tokens Awarded",
|
||||
"project": "Governance",
|
||||
"id": "6028a9fa-2862-4e8e-8b20-15b1871502e9",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 21024.264068711927,
|
||||
"y": 20452.19740187014
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 20812.132034355964,
|
||||
"y": 20240.065367514177
|
||||
},
|
||||
"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": "e537f875-0429-46c7-9e22-9f363b49e440",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 20812.132034355964,
|
||||
"y": 20540.065367514177
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 20812.132034355964,
|
||||
"y": 20240.065367514177
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
"isFrozen": false,
|
||||
"isCollapsed": false,
|
||||
"angleToParent": 2,
|
||||
"distanceToParent": 3,
|
||||
"arrangementStyle": 0
|
||||
},
|
||||
"uiObject": {
|
||||
"isRunning": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"id": "ef87e43d-72f8-4ff4-915d-38d376a381ed",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 20812.132034355964,
|
||||
"y": 20240.065367514177
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 20600,
|
||||
"y": 20027.933333158213
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
"isFrozen": false,
|
||||
"isCollapsed": true,
|
||||
"angleToParent": 2,
|
||||
"distanceToParent": 3,
|
||||
"arrangementStyle": 0
|
||||
},
|
||||
"uiObject": {
|
||||
"isRunning": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"id": "ad9c1239-f4dd-4e12-8998-ecead32065ab",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 20600,
|
||||
"y": 20027.933333158213
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 20300,
|
||||
"y": 20027.933333158213
|
||||
},
|
||||
"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",
|
||||
@@ -35,18 +570,18 @@
|
||||
"id": "72e640dd-cbe8-40eb-82e3-d58714736714",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 6621.192378864668,
|
||||
"y": 25328
|
||||
"x": 20859.807621135333,
|
||||
"y": 20477.933333158213
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 6881,
|
||||
"y": 25478
|
||||
"x": 20600,
|
||||
"y": 20627.933333158213
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
"isFrozen": false,
|
||||
"isCollapsed": false,
|
||||
"angleToParent": 1,
|
||||
"angleToParent": 2,
|
||||
"distanceToParent": 3,
|
||||
"arrangementStyle": 0
|
||||
},
|
||||
@@ -61,23 +596,33 @@
|
||||
"referenceParentCombinedNodePath": [
|
||||
[
|
||||
"Superalgos-Docker",
|
||||
"Assets"
|
||||
"Assets",
|
||||
"Governance",
|
||||
"f92d7a00-be08-4f44-b000-e0f8c4658f14"
|
||||
],
|
||||
[
|
||||
"Docker",
|
||||
"Asset Class"
|
||||
"Asset Class",
|
||||
"Governance",
|
||||
"a56c295d-b3ea-4c29-917d-a05654851232"
|
||||
],
|
||||
[
|
||||
"Superalgos",
|
||||
"Asset Class"
|
||||
"Asset Class",
|
||||
"Governance",
|
||||
"d1ec3e31-62ba-443c-b765-63cb7eaf2cc9"
|
||||
],
|
||||
[
|
||||
"Docker",
|
||||
"Asset Class"
|
||||
"Asset Class",
|
||||
"Governance",
|
||||
"f279ee42-d52b-46a4-8070-3354efe82dbf"
|
||||
],
|
||||
[
|
||||
"docker-compose.yml",
|
||||
"Asset"
|
||||
"Asset",
|
||||
"Governance",
|
||||
"8b11af37-04c0-4932-93a4-538c96e90393"
|
||||
]
|
||||
]
|
||||
}
|
||||
@@ -90,18 +635,18 @@
|
||||
"id": "f8a0c977-7987-483e-9f01-6ea3ad544efe",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 7140.807621135332,
|
||||
"y": 25328
|
||||
"x": 20859.807621135333,
|
||||
"y": 20777.933333158213
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 6881,
|
||||
"y": 25478
|
||||
"x": 20600,
|
||||
"y": 20627.933333158213
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
"isFrozen": false,
|
||||
"isCollapsed": false,
|
||||
"angleToParent": 1,
|
||||
"angleToParent": 2,
|
||||
"distanceToParent": 3,
|
||||
"arrangementStyle": 0
|
||||
},
|
||||
@@ -116,23 +661,33 @@
|
||||
"referenceParentCombinedNodePath": [
|
||||
[
|
||||
"Superalgos-Docker",
|
||||
"Assets"
|
||||
"Assets",
|
||||
"Governance",
|
||||
"f92d7a00-be08-4f44-b000-e0f8c4658f14"
|
||||
],
|
||||
[
|
||||
"Docker",
|
||||
"Asset Class"
|
||||
"Asset Class",
|
||||
"Governance",
|
||||
"a56c295d-b3ea-4c29-917d-a05654851232"
|
||||
],
|
||||
[
|
||||
"Superalgos",
|
||||
"Asset Class"
|
||||
"Asset Class",
|
||||
"Governance",
|
||||
"d1ec3e31-62ba-443c-b765-63cb7eaf2cc9"
|
||||
],
|
||||
[
|
||||
"Docker",
|
||||
"Asset Class"
|
||||
"Asset Class",
|
||||
"Governance",
|
||||
"f279ee42-d52b-46a4-8070-3354efe82dbf"
|
||||
],
|
||||
[
|
||||
"Dockerfile",
|
||||
"Asset"
|
||||
"Asset",
|
||||
"Governance",
|
||||
"c106ff98-190a-4209-b325-074f8f16d9dc"
|
||||
]
|
||||
]
|
||||
}
|
||||
@@ -141,12 +696,12 @@
|
||||
"id": "bb3c760b-f5bc-4085-9b25-bce13f68d4b6",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 6881,
|
||||
"y": 25478
|
||||
"x": 20600,
|
||||
"y": 20627.933333158213
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 6881,
|
||||
"y": 25778
|
||||
"x": 20300,
|
||||
"y": 20627.933333158213
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -167,19 +722,27 @@
|
||||
"referenceParentCombinedNodePath": [
|
||||
[
|
||||
"Superalgos-Docker",
|
||||
"Assets"
|
||||
"Assets",
|
||||
"Governance",
|
||||
"f92d7a00-be08-4f44-b000-e0f8c4658f14"
|
||||
],
|
||||
[
|
||||
"Docker",
|
||||
"Asset Class"
|
||||
"Asset Class",
|
||||
"Governance",
|
||||
"a56c295d-b3ea-4c29-917d-a05654851232"
|
||||
],
|
||||
[
|
||||
"Superalgos",
|
||||
"Asset Class"
|
||||
"Asset Class",
|
||||
"Governance",
|
||||
"d1ec3e31-62ba-443c-b765-63cb7eaf2cc9"
|
||||
],
|
||||
[
|
||||
"Docker",
|
||||
"Asset Class"
|
||||
"Asset Class",
|
||||
"Governance",
|
||||
"f279ee42-d52b-46a4-8070-3354efe82dbf"
|
||||
]
|
||||
]
|
||||
}
|
||||
@@ -202,12 +765,12 @@
|
||||
"id": "bc3448ff-42b0-4ce0-8701-b06687e83baf",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 7481,
|
||||
"y": 25778
|
||||
"x": 20300,
|
||||
"y": 21227.933333158213
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 7181,
|
||||
"y": 25778
|
||||
"x": 20300,
|
||||
"y": 20927.933333158213
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -228,19 +791,27 @@
|
||||
"referenceParentCombinedNodePath": [
|
||||
[
|
||||
"Superalgos",
|
||||
"Positions"
|
||||
"Positions",
|
||||
"Governance",
|
||||
"50c68665-5da2-48a8-b229-7a1563ae82d2"
|
||||
],
|
||||
[
|
||||
"Rewarded Positions",
|
||||
"Position Class"
|
||||
"Position Class",
|
||||
"Governance",
|
||||
"8b29fcb2-3b9a-444f-b3b0-05976da9a18f"
|
||||
],
|
||||
[
|
||||
"Community Management",
|
||||
"Position Class"
|
||||
"Position Class",
|
||||
"Governance",
|
||||
"35b790f0-c567-498c-83fd-ac0aacd8720b"
|
||||
],
|
||||
[
|
||||
"Moderator",
|
||||
"Position"
|
||||
"Position",
|
||||
"Governance",
|
||||
"6e141ab6-cc79-44b6-a58a-60b6480f706e"
|
||||
]
|
||||
]
|
||||
}
|
||||
@@ -249,12 +820,12 @@
|
||||
"id": "13d0ff82-dc45-45cd-95cf-0834dce22a52",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 7181,
|
||||
"y": 25778
|
||||
"x": 20300,
|
||||
"y": 20927.933333158213
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 6881,
|
||||
"y": 25778
|
||||
"x": 20300,
|
||||
"y": 20627.933333158213
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -275,15 +846,21 @@
|
||||
"referenceParentCombinedNodePath": [
|
||||
[
|
||||
"Superalgos",
|
||||
"Positions"
|
||||
"Positions",
|
||||
"Governance",
|
||||
"50c68665-5da2-48a8-b229-7a1563ae82d2"
|
||||
],
|
||||
[
|
||||
"Rewarded Positions",
|
||||
"Position Class"
|
||||
"Position Class",
|
||||
"Governance",
|
||||
"8b29fcb2-3b9a-444f-b3b0-05976da9a18f"
|
||||
],
|
||||
[
|
||||
"Community Management",
|
||||
"Position Class"
|
||||
"Position Class",
|
||||
"Governance",
|
||||
"35b790f0-c567-498c-83fd-ac0aacd8720b"
|
||||
]
|
||||
]
|
||||
}
|
||||
@@ -296,12 +873,12 @@
|
||||
"id": "299232ef-1aa4-4ea1-9872-56d396957fc9",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 6881,
|
||||
"y": 26078
|
||||
"x": 20000,
|
||||
"y": 20627.933333158213
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 6881,
|
||||
"y": 25778
|
||||
"x": 20300,
|
||||
"y": 20627.933333158213
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -319,12 +896,12 @@
|
||||
"id": "efb5c85c-0a81-4c64-9e00-4211fdbfd558",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 6881,
|
||||
"y": 25778
|
||||
"x": 20300,
|
||||
"y": 20627.933333158213
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 6581,
|
||||
"y": 25778
|
||||
"x": 20300,
|
||||
"y": 20327.933333158213
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -342,12 +919,12 @@
|
||||
"id": "768ed0b3-bb30-49df-a068-11b3bff1ab93",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 6581,
|
||||
"y": 25778
|
||||
"x": 20300,
|
||||
"y": 20327.933333158213
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 6281,
|
||||
"y": 25778
|
||||
"x": 20300,
|
||||
"y": 20027.933333158213
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -365,12 +942,12 @@
|
||||
"id": "e056163b-0413-488e-913a-8baa59d41a4f",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 6281,
|
||||
"y": 25778
|
||||
"x": 20300,
|
||||
"y": 20027.933333158213
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 5981,
|
||||
"y": 25778
|
||||
"x": 20000,
|
||||
"y": 20027.933333158213
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -392,12 +969,12 @@
|
||||
"id": "ed7a0fad-e0cb-479d-b197-ae5301647fdb",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 5681,
|
||||
"y": 25778
|
||||
"x": 19700,
|
||||
"y": 20027.933333158213
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 5981,
|
||||
"y": 25778
|
||||
"x": 20000,
|
||||
"y": 20027.933333158213
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
@@ -415,17 +992,17 @@
|
||||
"id": "56600855-7a91-49e8-8a58-2fa28d07efd1",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 5981,
|
||||
"y": 25778
|
||||
"x": 20000,
|
||||
"y": 20027.933333158213
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 5981,
|
||||
"y": 25778
|
||||
"x": 20000,
|
||||
"y": 20027.933333158213
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
"isFrozen": false,
|
||||
"isCollapsed": true,
|
||||
"isCollapsed": false,
|
||||
"angleToParent": 1,
|
||||
"distanceToParent": 3,
|
||||
"arrangementStyle": 0
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"type": "Bonus Pool",
|
||||
"definition": {
|
||||
"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": [
|
||||
{
|
||||
"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."
|
||||
}
|
||||
]
|
||||
}
|
||||
+13
@@ -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."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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."
|
||||
}
|
||||
]
|
||||
}
|
||||
+2
-1
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
+13
@@ -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."
|
||||
}
|
||||
]
|
||||
}
|
||||
+13
@@ -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."
|
||||
}
|
||||
]
|
||||
}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"type": "Direct Proportion",
|
||||
"definition": {
|
||||
"text": "When the relationship between two quantities is such that if we increase one, the other will also increase, and if we decrease one the other quantity will also decrease, then the two quantities are said to be in a direct proportion",
|
||||
"updated": 1630140935167
|
||||
},
|
||||
"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."
|
||||
}
|
||||
]
|
||||
}
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"type": "Distribution Event",
|
||||
"definition": {
|
||||
"text": "The Superalgos Project distributes its native Superalgos SA Tokens after each release to compensate 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": 1630234849482
|
||||
},
|
||||
"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."
|
||||
}
|
||||
]
|
||||
}
|
||||
+13
@@ -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."
|
||||
}
|
||||
]
|
||||
}
|
||||
+18
@@ -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."
|
||||
}
|
||||
]
|
||||
}
|
||||
+13
@@ -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."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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."
|
||||
},
|
||||
{
|
||||
|
||||
+99
-3
@@ -5,14 +5,17 @@
|
||||
"updated": 1630091213561
|
||||
},
|
||||
"paragraphs": [
|
||||
{
|
||||
"style": "Title",
|
||||
"text": "Computational Limitations"
|
||||
},
|
||||
{
|
||||
"style": "Block",
|
||||
"text": "Computational Limitations",
|
||||
"updated": 1630091226791
|
||||
"text": "Computational Limitations"
|
||||
},
|
||||
{
|
||||
"style": "Title",
|
||||
"text": "Computational Limitations"
|
||||
"text": ""
|
||||
},
|
||||
{
|
||||
"style": "Note",
|
||||
@@ -21,6 +24,99 @@
|
||||
{
|
||||
"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": "Dummy",
|
||||
"updated": 1630230740442
|
||||
},
|
||||
{
|
||||
"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
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"type": "Rewards Pool",
|
||||
"definition": {
|
||||
"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": [
|
||||
{
|
||||
"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."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"type": "Rule of Three",
|
||||
"definition": {
|
||||
"text": "In math, the rule of three is a form that allows the resolution of problems of proportionality between three known values and an unknown. In other words, it is an operation that allows you to find the fourth term with respect to a given proportion.",
|
||||
"updated": 1630142150472
|
||||
},
|
||||
"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."
|
||||
}
|
||||
]
|
||||
}
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"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": 1630426704558
|
||||
},
|
||||
"paragraphs": [
|
||||
{
|
||||
"style": "Block",
|
||||
"text": "Content",
|
||||
"updated": 1630170343846
|
||||
},
|
||||
{
|
||||
"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.",
|
||||
"updated": 1630426648511
|
||||
},
|
||||
{
|
||||
"style": "Success",
|
||||
"text": "Many of the Pool nodes defined in this hierarchy link to further definitions on other hierarchies, some of which may exist on other workspaces. To learn more about project definitions, read the Introduction to Governance Definitions page.",
|
||||
"updated": 1630170330253
|
||||
},
|
||||
{
|
||||
"style": "Note",
|
||||
"text": "The configuration of the top-level node in the hierarchy determines how many tokens are distributed in the Distribution Event.",
|
||||
"updated": 1630426722866
|
||||
}
|
||||
]
|
||||
}
|
||||
+78
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
+17
-4
@@ -1,13 +1,26 @@
|
||||
{
|
||||
"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": "Block",
|
||||
"text": "Configuration"
|
||||
},
|
||||
{
|
||||
"style": "Title",
|
||||
"text": "Configuration"
|
||||
}
|
||||
]
|
||||
}
|
||||
+5
-9
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
+5
-4
@@ -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",
|
||||
|
||||
+17
-4
@@ -1,13 +1,26 @@
|
||||
{
|
||||
"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": "Block",
|
||||
"text": "Configuration"
|
||||
},
|
||||
{
|
||||
"style": "Title",
|
||||
"text": "Configuration"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
+35
-4
@@ -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",
|
||||
|
||||
+109
-3
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
+62
-3
@@ -1,13 +1,72 @@
|
||||
{
|
||||
"type": "Community Building Programs",
|
||||
"definition": {
|
||||
"text": "Superalgos thrives through contributions and collaboration. We designed the Community Building Programs to foster a community in which members are always ready to help and give back!",
|
||||
"updated": 1629994549969
|
||||
"text": "Superalgos thrives through contributions and collaboration. We designed the Community Building Programs to foster a community in which members are always ready to help and give back! The node may spawn the Referral Program, Support Program, and Mentorship Program nodes.",
|
||||
"updated": 1630167175719
|
||||
},
|
||||
"paragraphs": [
|
||||
{
|
||||
"style": "Block",
|
||||
"text": "Content",
|
||||
"updated": 1630165468473
|
||||
},
|
||||
{
|
||||
"style": "Success",
|
||||
"text": "Learn more about how Token Power Flows into these programs!",
|
||||
"updated": 1630218909731
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "Right click and select the pencil button to enter edit mode."
|
||||
"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",
|
||||
"text": "The incentives entailed in a Bonus Pool are explained in the Tokens Bonus node.",
|
||||
"updated": 1630170463942
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"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",
|
||||
"text": "When your profile is referenced by others through their User Referrer, User Supporter, or User Mentor nodes, they pass on 10% of the Referral Power, Support Power, or Mentorship Power available in the node to you. This is your Incoming Power in the corresponding program.",
|
||||
"updated": 1630166954607
|
||||
},
|
||||
{
|
||||
"style": "List",
|
||||
"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": "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
|
||||
},
|
||||
{
|
||||
"style": "Note",
|
||||
"text": "Pretty much the same happens with the Support Program and the Mentorship Program."
|
||||
},
|
||||
{
|
||||
"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
|
||||
},
|
||||
{
|
||||
"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": 1630215178623
|
||||
},
|
||||
{
|
||||
"style": "Block",
|
||||
"text": "Configuration",
|
||||
"updated": 1630215228441
|
||||
},
|
||||
{
|
||||
"style": "Title",
|
||||
"text": "Configuration",
|
||||
"updated": 1630215233190
|
||||
}
|
||||
]
|
||||
}
|
||||
-13
@@ -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."
|
||||
}
|
||||
]
|
||||
}
|
||||
+34
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
+35
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
+17
-4
@@ -1,13 +1,26 @@
|
||||
{
|
||||
"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": "Text",
|
||||
"text": "Right click and select the pencil button to enter edit mode."
|
||||
"style": "Block",
|
||||
"text": "Content",
|
||||
"updated": 1630351115901
|
||||
},
|
||||
{
|
||||
"style": "Include",
|
||||
"text": "Governance->Concept->Reusable Governance Snippets->Claim Votes Content"
|
||||
},
|
||||
{
|
||||
"style": "Block",
|
||||
"text": "Configuration"
|
||||
},
|
||||
{
|
||||
"style": "Title",
|
||||
"text": "Configuration"
|
||||
}
|
||||
]
|
||||
}
|
||||
+5
-9
@@ -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",
|
||||
|
||||
+5
-4
@@ -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",
|
||||
|
||||
+17
-4
@@ -1,13 +1,26 @@
|
||||
{
|
||||
"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": "Block",
|
||||
"text": "Configuration"
|
||||
},
|
||||
{
|
||||
"style": "Title",
|
||||
"text": "Configuration"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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",
|
||||
|
||||
@@ -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": [
|
||||
{
|
||||
|
||||
+15
-2
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
+21
-7
@@ -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",
|
||||
|
||||
+26
-3
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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",
|
||||
|
||||
+18
-4
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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."
|
||||
},
|
||||
{
|
||||
|
||||
@@ -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 Plugin 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",
|
||||
@@ -56,16 +58,14 @@
|
||||
"text": "Superalgos Pools"
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "The Superalgos Pools hierarchy is where everything starts, meaning that it is the top-level hierarchy kickstarting the definition of the whole Project."
|
||||
"style": "Include",
|
||||
"text": "Governance->Concept->Superalgos Pools->Definition",
|
||||
"updated": 1630171005510
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "Many of the Pool nodes defined in this hierarchy link to further definitions on other hierarchies. "
|
||||
},
|
||||
{
|
||||
"style": "Note",
|
||||
"text": "The configuration of the top-level node in the hierarchy determines how many tokens will be distributed in the release."
|
||||
"style": "Include",
|
||||
"text": "Governance->Concept->Superalgos Pools->Content",
|
||||
"updated": 1630171012564
|
||||
},
|
||||
{
|
||||
"style": "Block",
|
||||
|
||||
+18
-4
@@ -1,13 +1,27 @@
|
||||
{
|
||||
"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": "Block",
|
||||
"text": "Configuration"
|
||||
},
|
||||
{
|
||||
"style": "Title",
|
||||
"text": "Configuration"
|
||||
}
|
||||
]
|
||||
}
|
||||
+5
-9
@@ -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",
|
||||
|
||||
+2
-2
@@ -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": [
|
||||
{
|
||||
|
||||
+5
-4
@@ -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",
|
||||
|
||||
+17
-4
@@ -1,13 +1,26 @@
|
||||
{
|
||||
"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": "Block",
|
||||
"text": "Configuration"
|
||||
},
|
||||
{
|
||||
"style": "Title",
|
||||
"text": "Configuration"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
+15
-9
@@ -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",
|
||||
|
||||
Loaded 100 of 187 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user