Merge pull request #1596 from Superalgos/develop
Develop into Master: Hot Fix of the Readme file that had broken links.
This commit is contained in:
38 files changed
+16341
-2165
No files matched your search
-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.
|
||||
@@ -16,9 +16,9 @@ global.NT = {
|
||||
},
|
||||
modules: {
|
||||
USER_PROFILE: require('./UserProfile.js'),
|
||||
BOT: require('./BotProfile.js'),
|
||||
EVENT: require('./Event.js'),
|
||||
POST: require('./Post.js'),
|
||||
BOT: require('./Bot.js'),
|
||||
QUERY: require('./Query.js'),
|
||||
QUERY_PROFILE_STATS: require('./Queries/ProfileStats.js'),
|
||||
QUERY_PROFILE_POSTS: require('./Queries/ProfilePosts.js'),
|
||||
|
||||
@@ -145,13 +145,13 @@ exports.newEvents = function newEvents() {
|
||||
Test #2 : The Emitter or Traget profile must be at the Following map of the Query Profile.
|
||||
*/
|
||||
if (emitterUserProfile !== undefined) {
|
||||
if (thisObject.profile.multiMediaPostsFollowing.get(emitterUserProfile.userProfieId) !== undefined) {
|
||||
if (thisObject.profile.following.get(emitterUserProfile.userProfieId) !== undefined) {
|
||||
addToResponse(event)
|
||||
return
|
||||
}
|
||||
}
|
||||
if (targetUserProfile !== undefined) {
|
||||
if (thisObject.profile.multiMediaPostsFollowing.get(targetUserProfile.userProfieId) !== undefined) {
|
||||
if (thisObject.profile.following.get(targetUserProfile.userProfieId) !== undefined) {
|
||||
addToResponse(event)
|
||||
return
|
||||
}
|
||||
@@ -160,25 +160,25 @@ exports.newEvents = function newEvents() {
|
||||
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.multiMediaPostsFollowing.get(emitterPost.emitterUserProfileId) !== undefined) {
|
||||
if (thisObject.profile.following.get(emitterPost.emitterUserProfileId) !== undefined) {
|
||||
addToResponse(event)
|
||||
return
|
||||
}
|
||||
}
|
||||
if (emitterPost !== undefined) {
|
||||
if (thisObject.profile.multiMediaPostsFollowing.get(emitterPost.targetUserProfileId) !== undefined) {
|
||||
if (thisObject.profile.following.get(emitterPost.targetUserProfileId) !== undefined) {
|
||||
addToResponse(event)
|
||||
return
|
||||
}
|
||||
}
|
||||
if (targetPost !== undefined) {
|
||||
if (thisObject.profile.multiMediaPostsFollowing.get(targetPost.emitterUserProfileId) !== undefined) {
|
||||
if (thisObject.profile.following.get(targetPost.emitterUserProfileId) !== undefined) {
|
||||
addToResponse(event)
|
||||
return
|
||||
}
|
||||
}
|
||||
if (targetPost !== undefined) {
|
||||
if (thisObject.profile.multiMediaPostsFollowing.get(targetPost.targetUserProfileId) !== undefined) {
|
||||
if (thisObject.profile.following.get(targetPost.targetUserProfileId) !== undefined) {
|
||||
addToResponse(event)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -36,10 +36,8 @@ exports.newProfileStats = function newProfileStats() {
|
||||
"userProfileHandle": thisObject.profile.userProfileHandle,
|
||||
"blockchainAccount": thisObject.profile.blockchainAccount,
|
||||
"ranking": thisObject.profile.ranking,
|
||||
"multiMediaPostFollowingCount": thisObject.profile.multiMediaPostFollowingCount,
|
||||
"multiMediaPostFollowersCount": thisObject.profile.multiMediaPostFollowersCount,
|
||||
"tradePostsFollowingCount": thisObject.profile.tradePostsFollowingCount,
|
||||
"tradePostsFollowersCount": thisObject.profile.tradePostsFollowersCount,
|
||||
"followingCount": thisObject.profile.followingCount,
|
||||
"followersCount": thisObject.profile.followersCount,
|
||||
"emitterEventsCount": thisObject.profile.emitterEventsCount,
|
||||
"targetEventsCount": thisObject.profile.targetEventsCount,
|
||||
"postsCount": thisObject.profile.postsCount,
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
exports.newBot = function newBot() {
|
||||
|
||||
let thisObject = {
|
||||
botId: undefined,
|
||||
botAsset: undefined,
|
||||
botExchange: undefined,
|
||||
enabled: undefined,
|
||||
initialize: initialize,
|
||||
finalize: finalize
|
||||
}
|
||||
|
||||
return thisObject
|
||||
|
||||
function finalize() {
|
||||
|
||||
}
|
||||
|
||||
function initialize(
|
||||
botId,
|
||||
botAsset,
|
||||
botExchange
|
||||
) {
|
||||
thisObject.botId = botId
|
||||
thisObject.botAsset = botAsset
|
||||
thisObject.botExchange = botExchange
|
||||
thisObject.enabled = true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,137 @@
|
||||
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--
|
||||
}
|
||||
}
|
||||
}
|
||||
+106
-42
@@ -4,6 +4,8 @@ exports.newEvent = function newEvent() {
|
||||
eventId: undefined,
|
||||
emitterUserProfileId: undefined,
|
||||
targetUserProfileId: undefined,
|
||||
emitterBotProfileId: undefined,
|
||||
targetBotProfileId: undefined,
|
||||
emitterPostHash: undefined,
|
||||
targetPostHash: undefined,
|
||||
timestamp: undefined,
|
||||
@@ -16,19 +18,21 @@ exports.newEvent = function newEvent() {
|
||||
|
||||
const EVENT_TYPES = {
|
||||
|
||||
NEW_MULTI_MEDIA_POST: 10,
|
||||
REPLY_TO_MULTI_MEDIA_POST: 11,
|
||||
REPOST_MULTI_MEDIA: 12,
|
||||
QUOTE_REPOST_MULTI_MEDIA: 13,
|
||||
FOLLOW_USER_PROFILE_MULTI_MEDIA_POSTS: 14,
|
||||
UNFOLLOW_USER_PROFILE_MULTI_MEDIA_POSTS: 15,
|
||||
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_TRADE_POST: 20,
|
||||
REPLY_TO_TRADE_POST: 21,
|
||||
RE_POST_TRADE: 22,
|
||||
QUOTE_REPOST_TRADE: 23,
|
||||
FOLLOW_USER_PROFILE_TRADE_POSTS: 24,
|
||||
UNFOLLOW_USER_PROFILE_TRADE_POSTS: 25,
|
||||
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,
|
||||
@@ -66,6 +70,8 @@ exports.newEvent = function newEvent() {
|
||||
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
|
||||
@@ -87,8 +93,8 @@ exports.newEvent = function newEvent() {
|
||||
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_MULTI_MEDIA_POST &&
|
||||
thisObject.eventType !== EVENT_TYPES.NEW_TRADE_POST
|
||||
thisObject.eventType !== EVENT_TYPES.NEW_USER_POST &&
|
||||
thisObject.eventType !== EVENT_TYPES.NEW_BOT_POST
|
||||
) {
|
||||
throw ('Target User Profile Not Found.')
|
||||
}
|
||||
@@ -96,65 +102,123 @@ exports.newEvent = function newEvent() {
|
||||
targetUserProfile.targetEventsCount++
|
||||
}
|
||||
/*
|
||||
Is is a new post?
|
||||
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_MULTI_MEDIA_POST ||
|
||||
thisObject.eventType === EVENT_TYPES.REPLY_TO_MULTI_MEDIA_POST ||
|
||||
thisObject.eventType === EVENT_TYPES.REPOST_MULTI_MEDIA ||
|
||||
thisObject.eventType === EVENT_TYPES.QUOTE_REPOST_MULTI_MEDIA ||
|
||||
thisObject.eventType === EVENT_TYPES.NEW_TRADE_POST ||
|
||||
thisObject.eventType === EVENT_TYPES.REPLY_TO_TRADE_POST ||
|
||||
thisObject.eventType === EVENT_TYPES.RE_POST_TRADE ||
|
||||
thisObject.eventType === EVENT_TYPES.QUOTE_REPOST_TRADE
|
||||
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_MULTI_MEDIA_POST ||
|
||||
thisObject.eventType === EVENT_TYPES.REPLY_TO_MULTI_MEDIA_POST ||
|
||||
thisObject.eventType === EVENT_TYPES.REPOST_MULTI_MEDIA ||
|
||||
thisObject.eventType === EVENT_TYPES.QUOTE_REPOST_MULTI_MEDIA
|
||||
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,
|
||||
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
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
/*
|
||||
Is is a following?
|
||||
*/
|
||||
if (
|
||||
thisObject.eventType === EVENT_TYPES.FOLLOW_USER_PROFILE_MULTI_MEDIA_POSTS ||
|
||||
thisObject.eventType === EVENT_TYPES.UNFOLLOW_USER_PROFILE_MULTI_MEDIA_POSTS ||
|
||||
thisObject.eventType === EVENT_TYPES.FOLLOW_USER_PROFILE_TRADE_POSTS ||
|
||||
thisObject.eventType === EVENT_TYPES.UNFOLLOW_USER_PROFILE_TRADE_POSTS
|
||||
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_MULTI_MEDIA_POSTS: {
|
||||
emitterUserProfile.addMultiMediaPostsFollowing(
|
||||
case EVENT_TYPES.FOLLOW_USER_PROFILE: {
|
||||
emitterUserProfile.addFollowing(
|
||||
targetUserProfile
|
||||
)
|
||||
targetUserProfile.addMultiMediaPostsFollower(
|
||||
targetUserProfile.addFollower(
|
||||
emitterUserProfile
|
||||
)
|
||||
break
|
||||
}
|
||||
case EVENT_TYPES.UNFOLLOW_USER_PROFILE_MULTI_MEDIA_POSTS: {
|
||||
emitterUserProfile.removeMultiMediaPostsFollowing(
|
||||
case EVENT_TYPES.UNFOLLOW_USER_PROFILE: {
|
||||
emitterUserProfile.removeFollowing(
|
||||
targetUserProfile
|
||||
)
|
||||
targetUserProfile.removeMultiMediaPostsFollower(
|
||||
targetUserProfile.removeFollower(
|
||||
emitterUserProfile
|
||||
)
|
||||
break
|
||||
}
|
||||
case EVENT_TYPES.FOLLOW_USER_PROFILE_TRADE_POSTS: {
|
||||
case EVENT_TYPES.FOLLOW_BOT_PROFILE: {
|
||||
emitterUserProfile.addTradePostsFollowing(
|
||||
targetUserProfile
|
||||
)
|
||||
@@ -163,7 +227,7 @@ exports.newEvent = function newEvent() {
|
||||
)
|
||||
break
|
||||
}
|
||||
case EVENT_TYPES.UNFOLLOW_USER_PROFILE_TRADE_POSTS: {
|
||||
case EVENT_TYPES.UNFOLLOW_BOT_PROFILE: {
|
||||
emitterUserProfile.removeTradePostsFollowing(
|
||||
targetUserProfile
|
||||
)
|
||||
|
||||
+16
-16
@@ -3,6 +3,8 @@ exports.newPost = function newPost() {
|
||||
let thisObject = {
|
||||
emitterUserProfileId: undefined,
|
||||
targetUserProfileId: undefined,
|
||||
emitterBotProfileId: undefined,
|
||||
targetBotProfileId: undefined,
|
||||
emitterPostHash: undefined,
|
||||
targetPostHash: undefined,
|
||||
postType: undefined,
|
||||
@@ -17,14 +19,10 @@ exports.newPost = function newPost() {
|
||||
}
|
||||
|
||||
const POST_TYPES = {
|
||||
NEW_MULTI_MEDIA_POST: 10,
|
||||
REPLY_TO_MULTI_MEDIA_POST: 11,
|
||||
REPOST_MULTI_MEDIA: 12,
|
||||
QUOTE_REPOST_MULTI_MEDIA: 13,
|
||||
NEW_TRADE_POST: 20,
|
||||
REPLY_TO_TRADE_POST: 21,
|
||||
RE_POST_TRADE: 22,
|
||||
QUOTE_REPOST_TRADE: 23
|
||||
NEW_POST: 0,
|
||||
REPLY_TO_POST: 1,
|
||||
REPOST_: 2,
|
||||
QUOTE_REPOST_: 3
|
||||
}
|
||||
|
||||
const REACTION_TYPES = {
|
||||
@@ -53,6 +51,8 @@ exports.newPost = function newPost() {
|
||||
function finalize() {
|
||||
thisObject.emitterUserProfileId = undefined
|
||||
thisObject.targetUserProfileId = undefined
|
||||
thisObject.emitterBotProfileId = undefined
|
||||
thisObject.targetBotProfileId = undefined
|
||||
thisObject.emitterPostHash = undefined
|
||||
thisObject.targetPostHash = undefined
|
||||
thisObject.postType = undefined
|
||||
@@ -63,6 +63,8 @@ exports.newPost = function newPost() {
|
||||
function initialize(
|
||||
emitterUserProfileId,
|
||||
targetUserProfileId,
|
||||
emitterBotProfileId,
|
||||
targetBotProfileId,
|
||||
emitterPostHash,
|
||||
targetPostHash,
|
||||
postType,
|
||||
@@ -71,6 +73,8 @@ exports.newPost = function newPost() {
|
||||
|
||||
thisObject.emitterUserProfileId = emitterUserProfileId
|
||||
thisObject.targetUserProfileId = targetUserProfileId
|
||||
thisObject.emitterBotProfileId = emitterBotProfileId
|
||||
thisObject.targetBotProfileId = targetBotProfileId
|
||||
thisObject.emitterPostHash = emitterPostHash
|
||||
thisObject.targetPostHash = targetPostHash
|
||||
thisObject.postType = postType
|
||||
@@ -83,12 +87,9 @@ exports.newPost = function newPost() {
|
||||
let targetPost
|
||||
|
||||
if (
|
||||
event.eventType === POST_TYPES.REPLY_TO_MULTI_MEDIA_POST ||
|
||||
event.eventType === POST_TYPES.REPOST_MULTI_MEDIA ||
|
||||
event.eventType === POST_TYPES.QUOTE_REPOST_MULTI_MEDIA ||
|
||||
event.eventType === POST_TYPES.REPLY_TO_TRADE_POST ||
|
||||
event.eventType === POST_TYPES.RE_POST_TRADE ||
|
||||
event.eventType === POST_TYPES.QUOTE_REPOST_TRADE
|
||||
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)
|
||||
|
||||
@@ -100,8 +101,7 @@ exports.newPost = function newPost() {
|
||||
Let's add this post to the replies of the Target Post
|
||||
*/
|
||||
if (
|
||||
event.eventType === POST_TYPES.REPLY_TO_MULTI_MEDIA_POST ||
|
||||
event.eventType === POST_TYPES.REPLY_TO_TRADE_POST
|
||||
thisObject.postType === POST_TYPES.REPLY_TO_POST
|
||||
) {
|
||||
targetPost.replies.push(thisObject)
|
||||
}
|
||||
|
||||
+38
-85
@@ -4,15 +4,11 @@ exports.newUserProfile = function newUserProfile() {
|
||||
userProfieId: undefined,
|
||||
userProfileHandle: undefined,
|
||||
blockchainAccount: undefined,
|
||||
multiMediaPostsFollowing: undefined,
|
||||
multiMediaPostsFollowers: undefined,
|
||||
tradePostsFollowing: undefined,
|
||||
tradePostsFollowers: undefined,
|
||||
ranking: undefined,
|
||||
multiMediaPostFollowingCount: undefined,
|
||||
multiMediaPostFollowersCount: undefined,
|
||||
tradePostsFollowingCount: undefined,
|
||||
tradePostsFollowersCount: undefined,
|
||||
following: undefined,
|
||||
followers: undefined,
|
||||
followingCount: undefined,
|
||||
followersCount: undefined,
|
||||
emitterEventsCount: undefined,
|
||||
targetEventsCount: undefined,
|
||||
postsCount: undefined,
|
||||
@@ -21,14 +17,10 @@ exports.newUserProfile = function newUserProfile() {
|
||||
posts: undefined,
|
||||
addPost: addPost,
|
||||
removePost: removePost,
|
||||
addMultiMediaPostsFollowing: addMultiMediaPostsFollowing,
|
||||
removeMultiMediaPostsFollowing: removeMultiMediaPostsFollowing,
|
||||
addTradePostsFollowing: addTradePostsFollowing,
|
||||
removeTradePostsFollowing: removeTradePostsFollowing,
|
||||
addMultiMediaPostsFollower: addMultiMediaPostsFollower,
|
||||
removeMultiMediaPostsFollower: removeMultiMediaPostsFollower,
|
||||
addTradePostsFollower: addTradePostsFollower,
|
||||
removeTradePostsFollower: removeTradePostsFollower,
|
||||
addFollowing: addFollowing,
|
||||
removeFollowing: removeFollowing,
|
||||
addFollower: addFollower,
|
||||
removeFollower: removeFollower,
|
||||
addBot: addBot,
|
||||
removeBot: removeBot,
|
||||
enableBot: enableBot,
|
||||
@@ -40,11 +32,8 @@ exports.newUserProfile = function newUserProfile() {
|
||||
return thisObject
|
||||
|
||||
function finalize() {
|
||||
thisObject.multiMediaPostsFollowing = undefined
|
||||
thisObject.multiMediaPostsFollowers = undefined
|
||||
|
||||
thisObject.tradePostsFollowing = undefined
|
||||
thisObject.tradePostsFollowers = undefined
|
||||
thisObject.following = undefined
|
||||
thisObject.followers = undefined
|
||||
|
||||
thisObject.posts = undefined
|
||||
thisObject.bots = undefined
|
||||
@@ -52,30 +41,27 @@ exports.newUserProfile = function newUserProfile() {
|
||||
|
||||
function initialize() {
|
||||
|
||||
thisObject.multiMediaPostsFollowing = new Map()
|
||||
thisObject.multiMediaPostsFollowers = new Map()
|
||||
thisObject.following = new Map()
|
||||
thisObject.followers = new Map()
|
||||
|
||||
thisObject.tradePostsFollowing = new Map()
|
||||
thisObject.tradePostsFollowers = new Map()
|
||||
thisObject.followingCount = 0
|
||||
thisObject.followersCount = 0
|
||||
|
||||
thisObject.multiMediaPostFollowingCount = 0
|
||||
thisObject.multiMediaPostFollowersCount = 0
|
||||
thisObject.tradePostsFollowingCount = 0
|
||||
thisObject.tradePostsFollowersCount = 0
|
||||
thisObject.emitterEventsCount = 0
|
||||
thisObject.targetEventsCount = 0
|
||||
thisObject.postsCount = 0
|
||||
thisObject.botsCount = 0
|
||||
|
||||
thisObject.posts = []
|
||||
thisObject.bots = undefined
|
||||
thisObject.bots = []
|
||||
}
|
||||
|
||||
function addPost(
|
||||
emitterUserProfileId,
|
||||
targetUserProfileId,
|
||||
emitterPostHash,
|
||||
targetPostHash,
|
||||
postType,
|
||||
userProfile,
|
||||
timestamp
|
||||
) {
|
||||
if (NT.memory.maps.POSTS.get(emitterPostHash) !== undefined) {
|
||||
@@ -84,14 +70,17 @@ exports.newUserProfile = function newUserProfile() {
|
||||
|
||||
let post = NT.modules.POST.newPost()
|
||||
post.initialize(
|
||||
emitterUserProfileId,
|
||||
targetUserProfileId,
|
||||
undefined,
|
||||
undefined,
|
||||
emitterPostHash,
|
||||
targetPostHash,
|
||||
postType,
|
||||
userProfile,
|
||||
timestamp
|
||||
)
|
||||
|
||||
thisObject.maps.POSTS.push(post)
|
||||
thisObject.posts.push(post)
|
||||
NT.memory.maps.POSTS.set(emitterPostHash, post)
|
||||
thisObject.postsCount++
|
||||
}
|
||||
@@ -116,75 +105,39 @@ exports.newUserProfile = function newUserProfile() {
|
||||
thisObject.postsCount--
|
||||
}
|
||||
|
||||
function addMultiMediaPostsFollowing(
|
||||
function addFollowing(
|
||||
userProfile
|
||||
) {
|
||||
if (thisObject.multiMediaPostsFollowing.get(userProfile.id) === undefined) {
|
||||
thisObject.multiMediaPostsFollowing.set(userProfile.id, userProfile)
|
||||
thisObject.multiMediaPostFollowingCount++
|
||||
if (thisObject.following.get(userProfile.id) === undefined) {
|
||||
thisObject.following.set(userProfile.id, userProfile)
|
||||
thisObject.followingCount++
|
||||
}
|
||||
}
|
||||
|
||||
function removeMultiMediaPostsFollowing(
|
||||
function removeFollowing(
|
||||
userProfile
|
||||
) {
|
||||
if (thisObject.multiMediaPostsFollowing.get(userProfile.id) !== undefined) {
|
||||
thisObject.multiMediaPostsFollowing.delete(userProfile.id)
|
||||
thisObject.multiMediaPostFollowingCount--
|
||||
if (thisObject.following.get(userProfile.id) !== undefined) {
|
||||
thisObject.following.delete(userProfile.id)
|
||||
thisObject.followingCount--
|
||||
}
|
||||
}
|
||||
|
||||
function addTradePostsFollowing(
|
||||
function addFollower(
|
||||
userProfile
|
||||
) {
|
||||
if (thisObject.tradePostsFollowingCount.get(userProfile.id) === undefined) {
|
||||
thisObject.tradePostsFollowingCount.set(userProfile.id, userProfile)
|
||||
thisObject.tradePostsFollowingCount++
|
||||
if (thisObject.followers.get(userProfile.id) === undefined) {
|
||||
thisObject.followers.set(userProfile.id, userProfile)
|
||||
thisObject.followersCount++
|
||||
}
|
||||
}
|
||||
|
||||
function removeTradePostsFollowing(
|
||||
function removeFollower(
|
||||
userProfile
|
||||
) {
|
||||
if (thisObject.tradePostsFollowingCount.get(userProfile.id) !== undefined) {
|
||||
thisObject.tradePostsFollowingCount.delete(userProfile.id)
|
||||
thisObject.tradePostsFollowingCount--
|
||||
}
|
||||
}
|
||||
|
||||
function addMultiMediaPostsFollower(
|
||||
userProfile
|
||||
) {
|
||||
if (thisObject.multiMediaPostsFollowers.get(userProfile.id) === undefined) {
|
||||
thisObject.multiMediaPostsFollowers.set(userProfile.id, userProfile)
|
||||
thisObject.multiMediaPostFollowersCount++
|
||||
}
|
||||
}
|
||||
|
||||
function removeMultiMediaPostsFollower(
|
||||
userProfile
|
||||
) {
|
||||
if (thisObject.multiMediaPostsFollowers.get(userProfile.id) !== undefined) {
|
||||
thisObject.multiMediaPostsFollowers.delete(userProfile.id)
|
||||
thisObject.multiMediaPostFollowersCount--
|
||||
}
|
||||
}
|
||||
|
||||
function addTradePostsFollower(
|
||||
userProfile
|
||||
) {
|
||||
if (thisObject.tradePostsFollowers.get(userProfile.id) === undefined) {
|
||||
thisObject.tradePostsFollowers.set(userProfile.id, userProfile)
|
||||
thisObject.tradePostsFollowersCount++
|
||||
}
|
||||
}
|
||||
|
||||
function removeTradePostsFollower(
|
||||
userProfile
|
||||
) {
|
||||
if (thisObject.tradePostsFollowers.get(userProfile.id) !== undefined) {
|
||||
thisObject.tradePostsFollowers.delete(userProfile.id)
|
||||
thisObject.tradePostsFollowersCount--
|
||||
if (thisObject.followers.get(userProfile.id) !== undefined) {
|
||||
thisObject.followers.delete(userProfile.id)
|
||||
thisObject.followersCount--
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
+4
@@ -217,6 +217,10 @@
|
||||
"text": "Before you go any further, do the Beyond the Basics tutorial in the Getting Started plugin workspace so that you learn the basics on how to deal with contributions from within the app. The tutorial will help you get your setup right so that contributions are seamless.",
|
||||
"updated": 1613828879531
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": ""
|
||||
},
|
||||
{
|
||||
"style": "Block",
|
||||
"text": "Dummy",
|
||||
|
||||
+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": [
|
||||
{
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 14 KiB |
@@ -0,0 +1,783 @@
|
||||
{
|
||||
"type": "User Profile",
|
||||
"name": "9808us",
|
||||
"config": "{\n \"signature\": {\n \"message\": \"9808us\",\n \"messageHash\": \"0x979b53056d1e29f7e1801d0784d3228c463b3173d55bb43faa4f95b29a5fced1\",\n \"v\": \"0x1b\",\n \"r\": \"0x156fe1757248fe5a6752fa24d83985f4ee59f4bf9b09f55429c85eb7521c4b87\",\n \"s\": \"0x2fe78103a631760ecd41913ba30ad67fc7e3116378d0cc574aaabb99b0e0be37\",\n \"signature\": \"0x156fe1757248fe5a6752fa24d83985f4ee59f4bf9b09f55429c85eb7521c4b872fe78103a631760ecd41913ba30ad67fc7e3116378d0cc574aaabb99b0e0be371b\"\n }\n}",
|
||||
"project": "Governance",
|
||||
"tokenPowerSwitch": {
|
||||
"type": "Token Power Switch",
|
||||
"name": "New Token Power Switch",
|
||||
"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": "85d3b184-0122-4cb3-a83c-b3c00d626767",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 30248.408006401078,
|
||||
"y": 16722.954681296138
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 30471.351454044296,
|
||||
"y": 16923.693863203796
|
||||
},
|
||||
"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": 30471.351454044296,
|
||||
"y": 16923.693863203796
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 30694.294901687514,
|
||||
"y": 17124.433045111455
|
||||
},
|
||||
"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": 30819.04191617817,
|
||||
"y": 16537.544484671173
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 30756.66840893284,
|
||||
"y": 16830.988764891314
|
||||
},
|
||||
"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": 30756.66840893284,
|
||||
"y": 16830.988764891314
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 30694.294901687514,
|
||||
"y": 17124.433045111455
|
||||
},
|
||||
"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": 30694.294901687514,
|
||||
"y": 17124.433045111455
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 30786.999999999996,
|
||||
"y": 17409.75
|
||||
},
|
||||
"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": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "10938918-7341-47fd-84ea-ddc86904ec58",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 31136.025304362334,
|
||||
"y": 16659.761926593106
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 31151.726091235218,
|
||||
"y": 16959.350787019477
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
"isFrozen": false,
|
||||
"isCollapsed": false,
|
||||
"angleToParent": 3,
|
||||
"distanceToParent": 3,
|
||||
"arrangementStyle": 0
|
||||
},
|
||||
"uiObject": {
|
||||
"isRunning": false
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "User Referrer",
|
||||
"name": "",
|
||||
"config": "{}",
|
||||
"project": "Governance",
|
||||
"id": "d004c04d-aa54-4805-9e92-c7783e0cab0a",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 31229.371804765975,
|
||||
"y": 16669.573039132756
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 31151.726091235218,
|
||||
"y": 16959.350787019477
|
||||
},
|
||||
"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": 31352.465273142876,
|
||||
"y": 16736.40733937626
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 31151.726091235218,
|
||||
"y": 16959.350787019477
|
||||
},
|
||||
"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": "4849966e-c897-4222-9c46-b2e425f53810",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 31384.869879672307,
|
||||
"y": 16770.554669704525
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 31151.726091235218,
|
||||
"y": 16959.350787019477
|
||||
},
|
||||
"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": 31151.726091235218,
|
||||
"y": 16959.350787019477
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 31029.70509831248,
|
||||
"y": 17233.414424312257
|
||||
},
|
||||
"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": 31516.857784237913,
|
||||
"y": 16968.91209689487
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 31328.06166692296,
|
||||
"y": 17202.05588533196
|
||||
},
|
||||
"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": 31626.41823553344,
|
||||
"y": 17170.697346351662
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 31328.06166692296,
|
||||
"y": 17202.05588533196
|
||||
},
|
||||
"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": 31561.20545536005,
|
||||
"y": 17390.852002646912
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 31328.06166692296,
|
||||
"y": 17202.05588533196
|
||||
},
|
||||
"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": 31328.06166692296,
|
||||
"y": 17202.05588533196
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 31029.70509831248,
|
||||
"y": 17233.414424312257
|
||||
},
|
||||
"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": 31029.70509831248,
|
||||
"y": 17233.414424312257
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 30786.999999999996,
|
||||
"y": 17409.75
|
||||
},
|
||||
"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": "{}",
|
||||
"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": 31626.41823553344,
|
||||
"y": 17648.802653648338
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 31328.06166692296,
|
||||
"y": 17617.44411466804
|
||||
},
|
||||
"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": 31328.06166692296,
|
||||
"y": 17617.44411466804
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 31029.70509831248,
|
||||
"y": 17586.085575687743
|
||||
},
|
||||
"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": [],
|
||||
"featureClaimsFolders": [],
|
||||
"positionClaimsFolders": [],
|
||||
"tokensAwarded": {
|
||||
"type": "Tokens Awarded",
|
||||
"name": "New Tokens Awarded",
|
||||
"project": "Governance",
|
||||
"id": "b3a93cc0-0801-4f6e-9488-435a1d272bff",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 31273.747084157956,
|
||||
"y": 18134.212850273303
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 31151.726091235218,
|
||||
"y": 17860.149212980523
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
"isFrozen": false,
|
||||
"isCollapsed": false,
|
||||
"angleToParent": 1,
|
||||
"distanceToParent": 3,
|
||||
"arrangementStyle": 0
|
||||
},
|
||||
"uiObject": {
|
||||
"isRunning": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"id": "98125357-80c3-4d3b-9b91-059298515c11",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 31151.726091235218,
|
||||
"y": 17860.149212980523
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 31029.70509831248,
|
||||
"y": 17586.085575687743
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
"isFrozen": false,
|
||||
"isCollapsed": false,
|
||||
"angleToParent": 2,
|
||||
"distanceToParent": 3,
|
||||
"arrangementStyle": 0
|
||||
},
|
||||
"uiObject": {
|
||||
"isRunning": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"id": "a79ace48-ae15-4359-95c1-371df5e41291",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 31029.70509831248,
|
||||
"y": 17586.085575687743
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 30786.999999999996,
|
||||
"y": 17409.75
|
||||
},
|
||||
"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": "{}",
|
||||
"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": 30819.04191617817,
|
||||
"y": 18281.955515328827
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 30756.66840893284,
|
||||
"y": 17988.511235108686
|
||||
},
|
||||
"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": 30756.66840893284,
|
||||
"y": 17988.511235108686
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 30694.294901687514,
|
||||
"y": 17695.066954888545
|
||||
},
|
||||
"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": [],
|
||||
"tokensBonus": {
|
||||
"type": "Tokens Bonus",
|
||||
"name": "New Tokens Bonus",
|
||||
"project": "Governance",
|
||||
"id": "ef6f8b6c-6e85-4d6c-ad64-b1e6ddd1248f",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 30248.408006401078,
|
||||
"y": 18096.545318703862
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 30471.351454044296,
|
||||
"y": 17895.806136796204
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
"isFrozen": false,
|
||||
"isCollapsed": false,
|
||||
"angleToParent": 1,
|
||||
"distanceToParent": 3,
|
||||
"arrangementStyle": 0
|
||||
},
|
||||
"uiObject": {
|
||||
"isRunning": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"id": "ee380273-eced-4761-b91e-94b542beb5de",
|
||||
"savedPayload": {
|
||||
"position": {
|
||||
"x": 30471.351454044296,
|
||||
"y": 17895.806136796204
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 30694.294901687514,
|
||||
"y": 17695.066954888545
|
||||
},
|
||||
"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": 30694.294901687514,
|
||||
"y": 17695.066954888545
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 30786.999999999996,
|
||||
"y": 17409.75
|
||||
},
|
||||
"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": 30786.999999999996,
|
||||
"y": 17409.75
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 30486.999999999996,
|
||||
"y": 17409.75
|
||||
},
|
||||
"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": 30186.999999999996,
|
||||
"y": 17409.75
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 30486.999999999996,
|
||||
"y": 17409.75
|
||||
},
|
||||
"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": 30486.999999999996,
|
||||
"y": 17409.75
|
||||
},
|
||||
"targetPosition": {
|
||||
"x": 30486.999999999996,
|
||||
"y": 17409.75
|
||||
},
|
||||
"floatingObject": {
|
||||
"isPinned": false,
|
||||
"isFrozen": false,
|
||||
"isCollapsed": false,
|
||||
"angleToParent": 1,
|
||||
"distanceToParent": 3,
|
||||
"arrangementStyle": 0
|
||||
},
|
||||
"uiObject": {
|
||||
"isRunning": false
|
||||
}
|
||||
}
|
||||
}
|
||||
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 the tokens to be distributed as bonuses for participating in certain Governance Programs. Each program that features a Token Bonus has its Bonus Pool defined under the Governance Programs section of the Superalgos Pools hierarchy. A bonus represents an incentive to participate in the given program and is displayed Tokens Bonus node.",
|
||||
"updated": 1630169555986
|
||||
},
|
||||
"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."
|
||||
}
|
||||
]
|
||||
}
|
||||
+4
-3
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"type": "Governance Address",
|
||||
"definition": {
|
||||
"text": "Your Governance Address is a Superalgos SA Token address generated from within Superalgos, using the Profile Constructor. The tokens you hold in this address confer you Token Power, that you may use from within your User Profile to participate in governance.",
|
||||
"updated": 1624722123314
|
||||
"text": "Your Governance Address is a Superalgos SA Token address generated from within Superalgos, using the Profile Constructor. The tokens you hold in this address confer you Token Power which you may use from within your User Profile to participate in governance.",
|
||||
"updated": 1630083503097
|
||||
},
|
||||
"paragraphs": [
|
||||
{
|
||||
@@ -12,7 +12,8 @@
|
||||
},
|
||||
{
|
||||
"style": "Callout",
|
||||
"text": "Your Governance Address is a Superalgos SA Token address generated from within Superalgos, using the Profile Constructor. The tokens you hold in this address confer you Token Power, that you may use from within your User Profile to participate in governance."
|
||||
"text": "Your Governance Address is a Superalgos SA Token address generated from within Superalgos, using the Profile Constructor. The tokens you hold in this address confer you Token Power which you may use from within your User Profile to participate in governance.",
|
||||
"updated": 1630083498247
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -39,8 +39,8 @@
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "Let's unwrap the above statement with an example.",
|
||||
"updated": 1630064638172
|
||||
"text": "Let's unpack the above statement with an example.",
|
||||
"updated": 1630089275940
|
||||
},
|
||||
{
|
||||
"style": "List",
|
||||
@@ -74,8 +74,8 @@
|
||||
},
|
||||
{
|
||||
"style": "Note",
|
||||
"text": "Once you have contributed to Superalgos, you should always be able to leverage your reputation in Governance. However, if you divest your Superalgos SA Token holdings, that is, if you remove some skin from the game, then your reputation will go down too. That said, you can always get your reputation back by putting the skin back in the game.",
|
||||
"updated": 1630065338721
|
||||
"text": "Once you have contributed to Superalgos, you should always be able to leverage your reputation in Governance. However, if you divest your Superalgos SA Token holdings, that is, if you remove some skin from the game, then your reputation will go down too. That said, you can always get your reputation back by putting skin back in the game.",
|
||||
"updated": 1630089391699
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"type": "Reusable Governance Snippets",
|
||||
"definition": {
|
||||
"text": "A collection of reusable snippets of text to be reused within the Governance Project.",
|
||||
"updated": 1630091213561
|
||||
},
|
||||
"paragraphs": [
|
||||
{
|
||||
"style": "Title",
|
||||
"text": "Computational Limitations"
|
||||
},
|
||||
{
|
||||
"style": "Block",
|
||||
"text": "Computational Limitations"
|
||||
},
|
||||
{
|
||||
"style": "Title",
|
||||
"text": ""
|
||||
},
|
||||
{
|
||||
"style": "Note",
|
||||
"text": "The governance system does all calculations dynamically, in real-time, with every change in the definitions, and computes all the hierarchies loaded in the Current Workspace."
|
||||
},
|
||||
{
|
||||
"style": "Important",
|
||||
"text": "The above means that the calculations that you see from within any given Workspace is a partial calculation within the scope of the Current Workspace only. Definitions, claims, votes, and so on, existing on other workspaces or plugins are not computed."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"type": "Rewards Pool",
|
||||
"definition": {
|
||||
"text": "A Rewards Pool allocates the tokens to be distributed as rewards for contributions on several of the existing Governance Programs. Each program that distributes rewards has its Rewards Pool defined under the Governance Programs section of the Superalgos Pools hierarchy. Rewards represent the value of your contributions to each of the programs. Each program calculates rewards in a particular way and displays the result in its Tokens Rewards node.",
|
||||
"updated": 1630169267228
|
||||
},
|
||||
"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."
|
||||
}
|
||||
]
|
||||
}
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"type": "Superalgos Pools",
|
||||
"definition": {
|
||||
"text": "Superalgos Pools is the top-level hierarchy kickstarting the definition of the whole Superalgos Project. It features the definition of several Pool nodes describing the main areas of project development that the Community wishes to incentivize.",
|
||||
"updated": 1630170275507
|
||||
},
|
||||
"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."
|
||||
},
|
||||
{
|
||||
"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 will be distributed in the release."
|
||||
}
|
||||
]
|
||||
}
|
||||
+48
-3
@@ -1,13 +1,58 @@
|
||||
{
|
||||
"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": "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.",
|
||||
"updated": 1630168361008
|
||||
},
|
||||
{
|
||||
"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 Rewards Pools are distributed in the case of Community Building Programs. In general terms, the Referral Program, Support Program, and Mentorship Program all have the following common rules:",
|
||||
"updated": 1630168572231
|
||||
},
|
||||
{
|
||||
"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": 1630170860166
|
||||
}
|
||||
]
|
||||
}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"type": "Influencer Program",
|
||||
"definition": {
|
||||
"text": "The Influencers Program is currently unavailable. It will be implemented at a later stage. Driving Token Power into this program has no effect, so you may as well use it somewhere else.",
|
||||
"updated": 1630089551098
|
||||
},
|
||||
"paragraphs": [
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "Right click and select the pencil button to enter edit mode."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -56,16 +56,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",
|
||||
|
||||
+5
-4
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"type": "Token Power Switch",
|
||||
"definition": {
|
||||
"text": "The concept of a switch may be used throughout the different programs in the User Profile hierarchy. A switch is a device used to distribute the flow of Token Power to multiple offspring nodes. In the case of the Token Power Switch, it is the sole offspring node of the User Profile hierarchy used to distribute Token Power to the different programs.",
|
||||
"updated": 1624726163960
|
||||
"text": "The concept of a switch may be used throughout the different programs in the User Profile hierarchy. A switch is a device used to distribute the flow of Token Power to offspring nodes. In the case of the Token Power Switch, it is the sole offspring node of the User Profile hierarchy used to distribute Token Power to the different programs.",
|
||||
"updated": 1630094625909
|
||||
},
|
||||
"paragraphs": [
|
||||
{
|
||||
@@ -11,8 +11,9 @@
|
||||
"updated": 1624726181844
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "Other switches in the hierarchy adopt specific names describing what exactly is that they distribute among offspring nodes."
|
||||
"style": "Note",
|
||||
"text": "Most nodes in the hierarchy act as switches, even when their name does not include the word switch!",
|
||||
"updated": 1630094810003
|
||||
},
|
||||
{
|
||||
"style": "Block",
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"type": "Tokens Awarded",
|
||||
"definition": {
|
||||
"text": "The Tokens Awarded node is present on each of the programs in the hierarchy. It exists to accumulate and display the number of Superalgos SA Tokens awarded to your profile through each of the existing programs.",
|
||||
"updated": 1624726369909
|
||||
"text": "The Tokens Awarded node is present on each of the programs in the hierarchy. It exists to accumulate and display the number of Superalgos SA Tokens awarded to your profile through each program.",
|
||||
"updated": 1630164138055
|
||||
},
|
||||
"paragraphs": [
|
||||
{
|
||||
@@ -12,11 +12,26 @@
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "The information on how many tokens the particular program has awarded you is displayed as a notice below the node, along with the number of people that helped you get them."
|
||||
"text": "The information on how many tokens the particular program has awarded you is displayed as a notice below the node, along with other relevant information that depends on the context, like the number of people that helped you get them, or the number of claims computed, etc.",
|
||||
"updated": 1630095366072
|
||||
},
|
||||
{
|
||||
"style": "Callout",
|
||||
"text": "The system calculates the token distribution dynamically with every change in the definitions, and computes all the hierarchies loaded in and referenced from the Current Workspace. This may or may not be accurate, depending on many things, including whether or not you are computing all relevant hierarchies."
|
||||
"style": "Subtitle",
|
||||
"text": "Community Building Programs Calculations",
|
||||
"updated": 1630165409867
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "The Community Building Programs node page explains how Tokens Rewards are calculated for these particular program.",
|
||||
"updated": 1630171164026
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": ""
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": ""
|
||||
},
|
||||
{
|
||||
"style": "Block",
|
||||
|
||||
@@ -1,14 +1,39 @@
|
||||
{
|
||||
"type": "Tokens Bonus",
|
||||
"definition": {
|
||||
"text": "A Token Bonus is a reward in tokens that you obtain for participating in a program that is incentivized. Taking part in these programs is desirable, as they foster Community bonds, develop healthy social relations, or encourage specific collaborative dynamics. It is for those reasons that participation is incentivized. Programs that feature a Token Bonus define a specific Pool to allocate tokens for the bonus. You participate in those rewards in a Direct Proportion to the Token Power that you let flow into the said program.",
|
||||
"updated": 1624726819483
|
||||
"text": "A Tokens Bonus is a reward that you obtain for participating in a program that is incentivized. Taking part in these programs is desirable, as they foster Community bonds, develop healthy social relations, or encourage specific collaborative dynamics. It is for those reasons that participation is incentivized.",
|
||||
"updated": 1630141035393
|
||||
},
|
||||
"paragraphs": [
|
||||
{
|
||||
"style": "Block",
|
||||
"text": "Content",
|
||||
"updated": 1624726836479
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "Programs that feature a Tokens Bonus have an associated Bonus Pool under the Governance Programs section of the Superalgos Pools hierarchy. These pools are used specifically to allocate tokens for these incentives.",
|
||||
"updated": 1630168414638
|
||||
},
|
||||
{
|
||||
"style": "Callout",
|
||||
"text": "The Tokens Bonus you may get on any given program is in a Direct Proportion to the Token Power that you drive into the said program. That is, the more Token Power you drive into an incentivized program, the more tokens you get from the corresponding pool.",
|
||||
"updated": 1630141193081
|
||||
},
|
||||
{
|
||||
"style": "Subtitle",
|
||||
"text": "Calculation",
|
||||
"updated": 1630141623710
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "The calculation of the Tokens Bonus is a direct Rule of Three:",
|
||||
"updated": 1630142120510
|
||||
},
|
||||
{
|
||||
"style": "Json",
|
||||
"text": "Total Token Power [*] -> 100% of the pool\n Your Token Power [**] -> X% of the pool -> Tokens Bonus\n\nTokens Bonus = Your Token Power * 100% / Total Token Power\n\n[*] The power driven to the given program by all User Profiles combined.\n[**] The power you drive to the given program.",
|
||||
"updated": 1630171226134
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"type": "Tokens Mined",
|
||||
"definition": {
|
||||
"text": "The Tokens Mined node features the total number of tokens you will get, adding all Token Rewards and Tokens Bonus from the programs you participate in.",
|
||||
"updated": 1630090191493
|
||||
},
|
||||
"paragraphs": [
|
||||
{
|
||||
"style": "Block",
|
||||
"text": "Content",
|
||||
"updated": 1630157979224
|
||||
},
|
||||
{
|
||||
"style": "Include",
|
||||
"text": "Governance->Concept->Reusable Governance Snippets->Computational Limitations"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -12,12 +12,17 @@
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "As explained in the Building Your Profile page, your User Profile must be paired with your Governance Address. The tokens you send to this address confer you Token Power that you may use to influence how Superalgos distributes the tokens allocated to each release.",
|
||||
"updated": 1624726114245
|
||||
"text": "As explained in the Building Your Profile page, your User Profile is paired with your Governance Address. The tokens you hold in this address confer you Token Power that you may use to influence how Superalgos distributes the tokens allocated to each release.",
|
||||
"updated": 1630091460767
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "After building your profile, you should see your Token Power flowing to the Token Switch node, the first offspring of the head of the hierarchy. This principle is maintained throughout the hierarchy: Token Power flows down to offsprings, through each section of the hierarchy."
|
||||
"text": "After building your profile, you should see your Token Power flowing to the Token Power Switch node, the first offspring of the head of the hierarchy. This principle is maintained throughout the hierarchy: Token Power flows down to offspring nodes, through each section of the hierarchy.",
|
||||
"updated": 1630094400877
|
||||
},
|
||||
{
|
||||
"style": "Title",
|
||||
"text": "Token Power Flow"
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
@@ -25,11 +30,13 @@
|
||||
},
|
||||
{
|
||||
"style": "List",
|
||||
"text": "By default, Token Power flows in equal proportion to each of the programs."
|
||||
"text": "By default, Token Power flows in equal proportion to each direct offspring node.",
|
||||
"updated": 1630093090611
|
||||
},
|
||||
{
|
||||
"style": "List",
|
||||
"text": "You may override the defaults by explicitly defining the percentage of the Token Power you wish to allocate to each program. If you define less than a total of 100%, then the remaining Token Power is distributed evenly across the programs for which there is no definition."
|
||||
"text": "You may override the defaults by explicitly defining the percentage of the Token Power you wish to allocate to each offspring. If you define less than a total of 100%, then the remaining Token Power is distributed evenly across the offspring for which there is no definition.",
|
||||
"updated": 1630093129825
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
@@ -40,6 +47,49 @@
|
||||
"text": "{\n \"percentage\": 50\n}",
|
||||
"updated": 1624726090541
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "For example, let's say you have 1,000 Token Power flowing into your Token Power Switch node. Let's say you spawn the Onboarding Programs, Community Building Programs, Votes and Claims Programs, and Financial Programs nodes.",
|
||||
"updated": 1630094336717
|
||||
},
|
||||
{
|
||||
"style": "Callout",
|
||||
"text": "As soon as you deploy these four offspring of the Token Power Switch node, you will see that each of these nodes gets 25% of the Token Power by default.",
|
||||
"updated": 1630094063741
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "But you wish to limit the Token Power flowing into the Onboarding Programs to zero, as those programs do not require Token Power. To do that, you set up the following in the Onboarding Programs node configuration:",
|
||||
"updated": 1630093868178
|
||||
},
|
||||
{
|
||||
"style": "Json",
|
||||
"text": "{\n \"percentage\": 0\n}",
|
||||
"updated": 1630093495369
|
||||
},
|
||||
{
|
||||
"style": "Callout",
|
||||
"text": "Once the configuration is in place, you will notice that the Onboarding Programs node shows 0% and 0 Token Power flowing into the node. You will also notice that the rest of the nodes are getting 33.33% of the Token Power each.",
|
||||
"updated": 1630093693182
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "Now let's say you wish to use only 10% of your Token Power in the Onboarding Programs. So you set up the following config:"
|
||||
},
|
||||
{
|
||||
"style": "Json",
|
||||
"text": "{\n \"percentage\": 10\n}",
|
||||
"updated": 1630093961107
|
||||
},
|
||||
{
|
||||
"style": "Callout",
|
||||
"text": "As a result, 10% of the Token Power flows into the Onboarding Programs, while the remaining nodes get 45% of the Token Power each.",
|
||||
"updated": 1630094141031
|
||||
},
|
||||
{
|
||||
"style": "Success",
|
||||
"text": "The same logic applies to the flow of Token Power throughout the hierarchy!"
|
||||
},
|
||||
{
|
||||
"style": "Block",
|
||||
"text": "Configuration"
|
||||
|
||||
+5
-6
@@ -62,14 +62,13 @@
|
||||
"updated": 1629992750219
|
||||
},
|
||||
{
|
||||
"style": "Note",
|
||||
"text": "The system does all calculations dynamically, in real-time, with every change in the definitions, and computes all the hierarchies loaded in the Current Workspace.",
|
||||
"updated": 1629992786999
|
||||
"style": "Include",
|
||||
"text": "Governance->Concept->Reusable Governance Snippets->Computational Limitations",
|
||||
"updated": 1630091330176
|
||||
},
|
||||
{
|
||||
"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.",
|
||||
"updated": 1629993191549
|
||||
"style": "Block",
|
||||
"text": "Transparency and Auditability"
|
||||
},
|
||||
{
|
||||
"style": "Title",
|
||||
|
||||
+84
-77
@@ -51,56 +51,58 @@
|
||||
},
|
||||
{
|
||||
"style": "Subtitle",
|
||||
"text": "2. Add User Profile and Profile Constructor"
|
||||
"text": "2. Spawn and Configure the Profile Constructor",
|
||||
"updated": 1630079965869
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "The Profile Constructor is the device you will use to link your Github.com identity with the BSC address where you hold or plan to hold your Superalgos SA Tokens. We call it your Governance Address.",
|
||||
"updated": 1630080366604
|
||||
},
|
||||
{
|
||||
"style": "Include",
|
||||
"text": "Governance->Concept->Governance Address->Content"
|
||||
},
|
||||
{
|
||||
"style": "Important",
|
||||
"text": "Once you are done setting up the address, you need to back up your private key in whatever way you desire, and delete the Profile Constructor so that the private key is removed from the Workspace. No worries… I’ll remind you of all this when the time comes."
|
||||
},
|
||||
{
|
||||
"style": "List",
|
||||
"text": "Go to the Governance Project hierarchy and select Add User Profile on the menu. "
|
||||
"text": "Go to the Governance Project hierarchy and select Add Profile Constructor on the menu.",
|
||||
"updated": 1630079909997
|
||||
},
|
||||
{
|
||||
"style": "List",
|
||||
"text": "Needless to say, the User Profile is your profile. Name it with your GitHub.com username, your real name, or any pseudonymous name you may wish to identify with."
|
||||
"text": "Access the configuration and enter your GitHub.com username.",
|
||||
"updated": 1630080009714
|
||||
},
|
||||
{
|
||||
"style": "List",
|
||||
"text": "If you already have a Superalgos SA Token address, you may enter the associated mnemonic phrase to verify the ownership of the address. If you don't have an address, leave the mnemonic property empty so that the Profile Constructor creates a new address for you.",
|
||||
"updated": 1630080154442
|
||||
},
|
||||
{
|
||||
"style": "List",
|
||||
"text": "Go ahead and select Add Profile Constructor too."
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "The Profile Constructor is the device you will use to set up the BSC address you will use to feed your profile with Token Power from your Superalgos SA Token holdings. This means that you will not be able to use your existing addresses, but will create a new one. We call it your Governance Address."
|
||||
},
|
||||
{
|
||||
"style": "Include",
|
||||
"text": "Governance->Concept->Governance Address->Content",
|
||||
"updated": 1624722289979
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "Once you are done setting up the address, you need to back up your private key in whatever way you desire, and delete the Profile Constructor so that the private key is removed from the Workspace. No worries… I’ll remind you of all this when the time comes."
|
||||
},
|
||||
{
|
||||
"style": "Subtitle",
|
||||
"text": "3. Build Your Profile"
|
||||
},
|
||||
{
|
||||
"style": "List",
|
||||
"text": "Establish a reference from the Profile Constructor node to your User Profile node."
|
||||
},
|
||||
{
|
||||
"style": "List",
|
||||
"text": "Access the configuration of the Profile Constructor and enter your GitHub.com username."
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "The next step involves building the profile, but before you do so, let me explain what the process involves:"
|
||||
},
|
||||
{
|
||||
"style": "List",
|
||||
"text": "A BSC address and the corresponding private key will be generated. This is the BSC address you will use to interact with the governance system."
|
||||
"text": "If you didn't enter a mnemonic, a BSC address and the corresponding private key will be generated.",
|
||||
"updated": 1630080750557
|
||||
},
|
||||
{
|
||||
"style": "List",
|
||||
"text": "A cryptographic message with your GitHub.com username will be signed with the private key corresponding to the address just generated. This message will be stored in your User Profile so that we may authenticate it comes from you once you submit your profile as a plugin in the Governance Project."
|
||||
"text": "A cryptographic message with your GitHub.com username will be signed with the private key corresponding to the address just generated or the mnemonic you entered. This message will be stored in your User Profile so that we may authenticate it comes from you once you submit your profile as a plugin in the Governance Project.",
|
||||
"updated": 1630080772975
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
@@ -110,6 +112,25 @@
|
||||
"style": "List",
|
||||
"text": "Access the menu of the Profile Constructor and click the Build Profile option. Click again to confirm the operation."
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "That's it!",
|
||||
"updated": 1630082601712
|
||||
},
|
||||
{
|
||||
"style": "Note",
|
||||
"text": "If you already have tokens in your Governance Address, you should see the Blockchain Power coming into your User Profile. It may take a minute or so for the system to get the data from the blockchain. If you have no tokens, then you will get zero Blockchain Power.",
|
||||
"updated": 1630082879935
|
||||
},
|
||||
{
|
||||
"style": "Png",
|
||||
"text": "PNGs/Governance/Docs/building-profile/building-profile-07.png"
|
||||
},
|
||||
{
|
||||
"style": "Title",
|
||||
"text": "Check Your Configurations",
|
||||
"updated": 1630082922435
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "Now, take a minute to check the configuration of the User Profile node. You should see a message similar to the one below:"
|
||||
@@ -121,12 +142,28 @@
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "As explained earlier, this is how the governance system will know that this User Profile belongs to the private key that signed the message, which in turn belongs to the address that will hold the tokens that confer your profile with Token Power.",
|
||||
"updated": 1624722409704
|
||||
"text": "This is how the governance system will know that this User Profile belongs to the private key that signed the message, which in turn belongs to the address that will hold the tokens that confer your profile with Token Power.",
|
||||
"updated": 1630080906578
|
||||
},
|
||||
{
|
||||
"style": "Title",
|
||||
"text": "Back-Up Your Keys",
|
||||
"updated": 1630083527720
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "If you used a mnemonic to authenticate an existing address, you may safely disregard what comes next.",
|
||||
"updated": 1630083542691
|
||||
},
|
||||
{
|
||||
"style": "Warning",
|
||||
"text": "This is the most important part of this guide! You must back up your private key! Later on, you will move Superalgos SA Tokens to the address you just generated, so, before you do that, you must safely store the private key that you will use to access the address. At this point, Superalgos doesn’t offer a built-in solution to securely back up your private keys. All the system does at this point is generate a BSC address / private key pair and deliver it in the configuration of the Profile Constructor node. It is up to you to decide how you are going to handle this sensitive information."
|
||||
"text": "This is very important! If you chose to generate a new address, you must back up your private key! Later on, you will hold Superalgos SA Tokens in this address. Before you do that, you must safely store the private key that you will use to access the address.",
|
||||
"updated": 1630083582536
|
||||
},
|
||||
{
|
||||
"style": "Important",
|
||||
"text": "At this point, Superalgos doesn’t offer a built-in solution to securely back up your private keys. All the system does at this point is create a BSC address / private key pair and deliver it in the configuration of the Profile Constructor node. It is up to you to decide how you are going to handle this sensitive information.",
|
||||
"updated": 1630083613308
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
@@ -142,18 +179,29 @@
|
||||
"text": ""
|
||||
},
|
||||
{
|
||||
"style": "Warning",
|
||||
"text": "Once you are satisfied with your backup of the private key, delete the Profile Constructor node! It is not safe to store your private key at the Workspace, as you may accidentally submit it to GitHub.com with one of your contributions. Also, remember that workspaces are saved on disk as unencrypted JSON files, with no security whatsoever.",
|
||||
"updated": 1624722590003
|
||||
"style": "Title",
|
||||
"text": "Delete the Constructor",
|
||||
"updated": 1630083196550
|
||||
},
|
||||
{
|
||||
"style": "Subtitle",
|
||||
"text": "4. Import Private Key in a Wallet"
|
||||
"style": "Warning",
|
||||
"text": "Once you are satisfied with your backup of the private key, or if you used a mnemonic of an existing address, you must delete the Profile Constructor node! It is not safe to store your private key at the Workspace, as you may accidentally submit it to GitHub.com with one of your contributions. Also, remember that workspaces are saved on disk as unencrypted JSON files, with no security whatsoever.",
|
||||
"updated": 1630083271674
|
||||
},
|
||||
{
|
||||
"style": "Title",
|
||||
"text": "Import Private Key in a Wallet",
|
||||
"updated": 1630083092448
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "This step is not required for interacting with governance, however, we’ll cover it as you most likely will want to do it at some point, and it is recommended anyway, even if not strictly necessary."
|
||||
},
|
||||
{
|
||||
"style": "Note",
|
||||
"text": "This step is relevant only if you created a new BSC address. If instead, you entered the mnemonic of an existing address, then you may safely skip this part.",
|
||||
"updated": 1630083638851
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "The idea is to import the address / private key you just created into a functional hardware or software wallet, so that you may control the tokens you will eventually send to this address."
|
||||
@@ -218,8 +266,8 @@
|
||||
},
|
||||
{
|
||||
"style": "Note",
|
||||
"text": "We have no images of the previous and the next few screens are Trust Wallet won't allow capturing these pages.",
|
||||
"updated": 1624724274610
|
||||
"text": "We have no images of the previous and the next few screens as Trust Wallet won't allow capturing these pages.",
|
||||
"updated": 1630082470933
|
||||
},
|
||||
{
|
||||
"style": "List",
|
||||
@@ -237,47 +285,6 @@
|
||||
"style": "Png",
|
||||
"text": "PNGs/Governance/Docs/building-profile/building-profile-06.png",
|
||||
"updated": 1624724788900
|
||||
},
|
||||
{
|
||||
"style": "Subtitle",
|
||||
"text": "5. Move Funds to the Address"
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "You’re almost ready to move some Superalgos SA Tokens to your new address. Before you do that it’s a good idea to configure the Superalgos SA Token first."
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "If you don’t know how to do that, follow the instructions in this Medium article:"
|
||||
},
|
||||
{
|
||||
"style": "Link",
|
||||
"text": "How to Configure the Superalgos SA Token in Trust Wallet->medium.com/superalgos/how-to-configure-the-superalgos-sa-token-in-trust-wallet-5cfc63800447"
|
||||
},
|
||||
{
|
||||
"style": "Text",
|
||||
"text": "For your convenience, this is the Superalgos SA Token BSC contract:"
|
||||
},
|
||||
{
|
||||
"style": "Json",
|
||||
"text": "0xfb981ed9a92377ca4d75d924b9ca06df163924fd"
|
||||
},
|
||||
{
|
||||
"style": "List",
|
||||
"text": "When you’re ready, send a few Superalgos SA Tokens to your new address."
|
||||
},
|
||||
{
|
||||
"style": "List",
|
||||
"text": "Once the tokens arrive, refresh the browser tab running Superalgos."
|
||||
},
|
||||
{
|
||||
"style": "List",
|
||||
"text": "Expand your User Profile node. You should see the same number of tokens you sent to your new address as Token Power on top of the dotted line connecting to the Token Switch node. This is the total Token Power that you may use to influence the governance of Superalgos."
|
||||
},
|
||||
{
|
||||
"style": "Png",
|
||||
"text": "PNGs/Governance/Docs/building-profile/building-profile-07.png",
|
||||
"updated": 1624725097347
|
||||
}
|
||||
]
|
||||
}
|
||||
+40
-5
@@ -30,18 +30,53 @@
|
||||
},
|
||||
{
|
||||
"style": "Title",
|
||||
"text": "Tokens Awarded",
|
||||
"updated": 1624732384407
|
||||
"text": "Tokens Mined",
|
||||
"updated": 1630157369136
|
||||
},
|
||||
{
|
||||
"style": "Include",
|
||||
"text": "Governance->Node->Tokens Awarded->Definition",
|
||||
"updated": 1624732391024
|
||||
"text": "Governance->Node->Tokens Mined->Definition",
|
||||
"updated": 1630157540123
|
||||
},
|
||||
{
|
||||
"style": "Include",
|
||||
"text": "Governance->Node->Tokens Mined->Content",
|
||||
"updated": 1630157564129
|
||||
},
|
||||
{
|
||||
"style": "Title",
|
||||
"text": ""
|
||||
},
|
||||
{
|
||||
"style": "Title",
|
||||
"text": "Tokens Awarded"
|
||||
},
|
||||
{
|
||||
"style": "Include",
|
||||
"text": "Governance->Node->Tokens Awarded->Definition"
|
||||
},
|
||||
{
|
||||
"style": "Include",
|
||||
"text": "Governance->Node->Tokens Awarded->Content",
|
||||
"updated": 1624732395456
|
||||
"updated": 1630157469517
|
||||
},
|
||||
{
|
||||
"style": "Title",
|
||||
"text": ""
|
||||
},
|
||||
{
|
||||
"style": "Title",
|
||||
"text": "Tokens Bonus"
|
||||
},
|
||||
{
|
||||
"style": "Include",
|
||||
"text": "Governance->Node->Tokens Bonus->Definition",
|
||||
"updated": 1630157687352
|
||||
},
|
||||
{
|
||||
"style": "Include",
|
||||
"text": "Governance->Node->Tokens Bonus->Content",
|
||||
"updated": 1630157696368
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -41,6 +41,51 @@ function newGovernanceUserProfileSpace() {
|
||||
/*
|
||||
We are going to collapse all User Profiles to save processing resources at the UI
|
||||
*/
|
||||
for (let i = 0; i < userProfiles.length; i++) {
|
||||
let userProfile = userProfiles[i]
|
||||
if (userProfile.payload.floatingObject.isCollapsed !== true) {
|
||||
userProfile.payload.floatingObject.collapseToggle()
|
||||
}
|
||||
}
|
||||
/*
|
||||
Here we will change the Y position of all profiles so that they are all at the same level.
|
||||
*/
|
||||
const SPACE_WIDTH = UI.projects.foundations.spaces.floatingSpace.container.frame.width
|
||||
const SPACE_HEIGHT = UI.projects.foundations.spaces.floatingSpace.container.frame.height
|
||||
|
||||
const X_STEP = SPACE_WIDTH / (userProfiles.length + 1)
|
||||
const Y_STEP = 3000
|
||||
|
||||
const Y_LEVEL = SPACE_HEIGHT * 0.45
|
||||
let xOffset = X_STEP
|
||||
let yOffset = 0
|
||||
|
||||
for (let i = 0; i < userProfiles.length; i++) {
|
||||
userProfiles[i].payload.floatingObject.container.frame.position.x = xOffset
|
||||
xOffset = xOffset + X_STEP
|
||||
}
|
||||
for (let i = 0; i < userProfiles.length; i++) {
|
||||
switch (true) {
|
||||
case (yOffset === 0): {
|
||||
yOffset = Y_STEP
|
||||
break
|
||||
}
|
||||
case (yOffset === Y_STEP): {
|
||||
yOffset = 1
|
||||
break
|
||||
}
|
||||
case (yOffset === 1): {
|
||||
yOffset = -Y_STEP
|
||||
break
|
||||
}
|
||||
case (yOffset === -Y_STEP): {
|
||||
yOffset = 0
|
||||
break
|
||||
}
|
||||
}
|
||||
userProfiles[i].payload.floatingObject.container.frame.position.y = Y_LEVEL + yOffset
|
||||
}
|
||||
|
||||
for (let i = 0; i < userProfiles.length; i++) {
|
||||
let userProfile = userProfiles[i]
|
||||
if (userProfile.payload.floatingObject.isCollapsed !== true) {
|
||||
|
||||
@@ -1,110 +1,375 @@
|
||||
# Superalgos Beta 11
|
||||
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
Superalgos is not just another open-source project. We are an open and welcoming community devised, nurtured, and incentivized with the project's native <a href="https://superalgos.org/token-overview.shtml" target="_blank">Superalgos (SA) token</a> to grow into a massive trading collaboration. You will notice the difference as soon as you join the [Telegram Community Group](https://t.me/superalgoscommunity) or the new [Discord Server](https://discord.gg/CGeKC6WQQb).
|
||||
Superalgos is not just another open-source project. We are an open and welcoming community devised, nurtured, and incentivized with the project's native <a href="https://superalgos.org/token-overview.shtml" target="_blank">Superalgos (SA) Token</a> to build an <a href="https://superalgos.org/" target="_blank">open trading intelligence network</a>.
|
||||
|
||||
> Can't wait to contribute? No need to wait! You may start by giving a star to this repository in the top-right corner of this page!
|
||||
You will notice the difference as soon as you join the [Telegram Community Group](https://t.me/superalgoscommunity) or the new [Discord Server](https://discord.gg/CGeKC6WQQb)!
|
||||
|
||||
> Can't wait to contribute? Sstart by giving a star to this repository in the top-right corner of this page!
|
||||
|
||||

|
||||
|
||||
# Getting Started Guide
|
||||
|
||||
Follow the link to [INSTALL.md](https://github.com/Superalgos/Superalgos/blob/develop/INSTALL.md).
|
||||
All procedures are the same for Windows, Linux, or Mac OS. Raspberry Pi terminal commands have been included for ease of use.
|
||||
|
||||
# The Superalgos Project
|
||||
> **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.
|
||||
|
||||
## Superalgos is a token-incentivized open-source project
|
||||
# Pre-Requisites
|
||||
|
||||
The protocol incentivizes users to improve Superalgos. To do that, users contribute to the codebase, add to the library of trading intelligence, and help with project development in general, earning Superalgos (SA) tokens for their contributions. Protocol-incentivized contributions allow the project to distribute free of charge, high-quality trading intelligence over the Superalgos peer-to-peer network, currently in the making.
|
||||
## 1. Node JS Installation
|
||||
|
||||
## Superalgos is an open-network project built on top of other open networks: Internet + Bitcoin + Lightning
|
||||
If you don't have it yet, download and install Node.js.
|
||||
|
||||
Because it's an open network, our target audience is, theoretically, 8 billion people. While all products and services provided by the project are free of charge, third-party products and services distributed through the Superalgos Network will be payable in bitcoin over the Lighting Network.
|
||||
Node JS is an open-source server environment required to run Superalgos.
|
||||
|
||||
## The Superalgos Network is an open trading intelligence network distributing trading signals
|
||||
**A.** Go to the Node JS [download page](https://nodejs.org/en/download/).
|
||||
|
||||
Anyone may plug in to provide or consume trading signals in a permissionless manner. Signals are cryptographically signed by trading intelligence providers with a reputation reflected in their token holdings. The Superalgos p2p Network prioritizes signals distribution according to the token holdings of consumers.
|
||||
**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.
|
||||
|
||||
## Superalgos has a scalable and defensible business model
|
||||
**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).
|
||||
|
||||
* Everything is open-source and free of charge for all users: trading automation tools to produce trading intelligence, and mobile apps to consume it.
|
||||
<hr>
|
||||
|
||||
* Algo traders compete to mine SA tokens, producing high-quality, ever-evolving trading intelligence paid for by the protocol.
|
||||
**NODE JS INSTALLATION FOR RASPBERRY PI USERS**
|
||||
|
||||
* Trading Intelligence is distributed via a p2p network with zero network fees.
|
||||
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.
|
||||
|
||||
* The long-term viability is guaranteed since the business model is undisruptable.
|
||||
**NOTE:** It is best to use the most current and updated version of the FULL PiOS image.
|
||||
|
||||
## With all friction removed, mass adoption is inevitable
|
||||
```
|
||||
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
|
||||
```
|
||||
|
||||
* Users do not pay for the mobile app.
|
||||
<hr>
|
||||
|
||||
* Users do not pay for trading intelligence.
|
||||
## 2. Git Installation
|
||||
|
||||
* Algo traders do not pay for the tools to produce trading intelligence.
|
||||
Download and install Git.
|
||||
|
||||
* Trading Intelligence does not need to be bought or sold. The project pays for trading intelligence by minting new tokens and distributes intelligence to all users, free of charge.
|
||||
Git is an open-source distributed version control system required to download and stay up to date with Superalgos.
|
||||
|
||||
* The Superalgos (SA) token use case does not require spending, avoiding blockchain fees. Only wallet balance is relevant to determining the reputation and skin in the game of intelligence providers. The same is true for consumers. It is their wallet balance that defines the order of distribution of signals.
|
||||
**A.** Go to the Git [download page](https://git-scm.com/downloads).
|
||||
|
||||
## Holding the SA Token is the business model for all participants
|
||||
**B.** Download the version for your Operating System.
|
||||
|
||||
* Buying pressure will come from users competing to be among the first to receive trading signals.
|
||||
**C.** Run the installer with the default configuration — just click Next until Git is fully installed.
|
||||
|
||||
* Algo traders build up their holdings by producing top trading intelligence and compete for the reputation entailed in their holdings.
|
||||
**IMPORTANT:** The latest version of Git is required to handle the authentication with GitHub.com.
|
||||
|
||||
* Project developers earn tokens for their contributions.
|
||||
**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.
|
||||
|
||||
## Superalgos will become a powerful consumer brand because it is user-centric:
|
||||
<hr>
|
||||
|
||||
* We are building a brand 100% in line with consumer interests.
|
||||
**GIT INSTALLATION FOR RASPBERRY PI USERS**
|
||||
|
||||
* We cherish the values of a decentralized, token-incentivized, open-source project.
|
||||
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
|
||||
```
|
||||
|
||||
* The project acts as a union, acquiring benefits for users, like better exchange fees for all.
|
||||
<hr>
|
||||
|
||||
* We do not collect or sell user data.
|
||||
## 3. Google Chrome or Safari
|
||||
|
||||
* We do not sell ads.
|
||||
Use Chrome, or Safari on Mac. These are the only tested browsers.
|
||||
|
||||
* We do not collect or sell user trading information.
|
||||
**A.** Go to the Chrome [download page](https://www.google.com/chrome/).
|
||||
|
||||
* We know how we are going to make money: token appreciation.
|
||||
**B.** Run the installer.
|
||||
|
||||
* Founders and team are just token holders, like every other contributor.
|
||||
Before you begin, it is recommended that you set up Chrome/Safari as your default browser.
|
||||
|
||||
## Superalgos Mobile Apps will feature a seamless user experience
|
||||
**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.
|
||||
|
||||
* The app will consume top-quality trading intelligence and autonomously execute trades.
|
||||
# Superalgos Client Installation
|
||||
|
||||
* Users will select an exchange, provide an exchange access token, define their base asset, initial capital, and trading intelligence providers.
|
||||
## 1. Fork the Superalgos Repository
|
||||
|
||||
* A mobile phone will become a 24/7 trading bot plugged into the Superalgos Network, receiving trading signals and firing orders on any exchange.
|
||||
**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.
|
||||
|
||||
* Similar to a bitcoin wallet, anyone will be able to develop Superalgos Mobile Apps to consume trading signals. This open competition will be a race to the best UX possible.
|
||||
**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" 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.
|
||||
|
||||
* Crypto wallets and trading apps will plug into the Superalgos Network and consume real-time trading intelligence for free.
|
||||
## 2. Clone Your Fork
|
||||
|
||||
## The Superalgos Project does not sell tokens
|
||||
**A.** Once the fork is created, you will land on the page of your fork. Copy the URL from your browser's address bar.
|
||||
|
||||
The protocol distributes Superalgos (SA) Tokens after each software release, among contributors of that release. If you wish to mine tokens, you may start contributing anytime. You may also hire/sponsor someone (usually a developer or trader) to do it on your behalf.
|
||||
**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:
|
||||
|
||||
# Software Architecture
|
||||
```
|
||||
git clone <URL of your Superalgos fork>
|
||||
```
|
||||
|
||||
Superalgos features three main components:
|
||||
For example, if your Github username is John, the command will look like this:
|
||||
|
||||
1. **Superalgos Platform:** A set of tools designed for algo-traders to design, build, test, and deploy trading bots and produce trading signals. The platform has been trading live since mid-2020 and is virtually ready to go out of beta.
|
||||
```
|
||||
git clone https://github.com/John/Superalgos
|
||||
```
|
||||
|
||||
2. **Superalgos Mobile:** An under-development mobile app reference implementation that consumes existing trading intelligence to automate trading.
|
||||
This creates the `Superalgos` folder in the current directory, which contains the whole installation.
|
||||
|
||||
3. **Superalgos Network:** An under-development open p2p network for distributing trading intelligence from providers (algo-traders) to consumers (the project's user base).
|
||||
## 3. Install Node Dependencies
|
||||
|
||||
All of the above is or will be hosted in this repository.
|
||||
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."
|
||||
|
||||
## 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, 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.
|
||||
|
||||
# Superalgos is User-centric
|
||||
|
||||
|
||||
Reference in new issue
Block a user