Merge pull request #1374 from Superalgos/develop

Develop into Plugins Docs
This commit is contained in:
Luis Fernando Molina authored and GitHub committed 2021-08-05 06:01:02 -04:00
commit 7bafbdfd59
81 files changed
+23724 -11531

No files matched your search

+4 -1
View File
@@ -885,7 +885,10 @@
#governance-tab10:checked ~ .governance-search-result-content #content10,
#governance-tab11:checked ~ .governance-search-result-content #content11,
#governance-tab12:checked ~ .governance-search-result-content #content12,
#governance-tab13:checked ~ .governance-search-result-content #content13 {
#governance-tab13:checked ~ .governance-search-result-content #content13,
#governance-tab14:checked ~ .governance-search-result-content #content14,
#governance-tab15:checked ~ .governance-search-result-content #content15,
#governance-tab16:checked ~ .governance-search-result-content #content16 {
display: block;
}
+6 -6
View File
@@ -133,18 +133,18 @@ try {
console.log('Http Interface .............................................. Listening at port ' + global.env.HTTP_INTERFACE_PORT)
console.log('')
console.log("You are running Superalgos Beta 10")
console.log("You are running Superalgos Beta 11")
console.log('')
console.log("What's new? These are the main new features in this version:")
console.log('')
console.log('API Maps and Data Fetcher Bots ............................. Allows to map any API and fetch data into the Superalgos workflow.')
console.log('Market Data Structure ....................................... Allows trading systems to use data from markets different from the one the session is running on.')
console.log('Exchange Data Structure ..................................... Allows trading systems to use data from exchanges and markets different from the one the session is running on.')
console.log('Governance System ........................................... Automates the distribution of SA Tokens and allow users to vote on the direction of the project.')
console.log('TensorFlow Integration ...................................... Allows creating and training ML models and use them in trading strategies.')
console.log('')
console.log("What's next? This is the current development pipeline:")
console.log('')
console.log('Contribution Management ..................................... Will allow the management of contributions at scale and more efficient and transparent distribution of the SA token.')
console.log('Tensor Flow Integration ..................................... Still at the experimental phase, will allow the creation and training of ML models to use for optimization and predictions.')
console.log('Superalgos P2P Network ...................................... Will allow algo-traders to share trading signals with Superalgos users consuming these signals via a mobile app.')
console.log('Real-time Trading Signals ................................... Will allow users to emit trading signals and be rewarded with SA Tokens.')
console.log('Superalgos Mobile ........................................... Will allow users to consume trading signals for free and autonomously execute trades from their mobile phones.')
console.log('Ethereum Integration ........................................ Will allow mining data from an Ethereum network node, and bring it into the Superalgos workflow.')
console.log('')
+179 -2
View File
@@ -734,7 +734,7 @@ exports.newHttpInterface = function newHttpInterface(WEB_SERVER, DATA_FILE_SERVE
const octokit = new Octokit({
auth: token,
userAgent: 'Superalgos Beta 10'
userAgent: 'Superalgos Beta 11'
})
const repo = 'Superalgos'
@@ -773,7 +773,8 @@ exports.newHttpInterface = function newHttpInterface(WEB_SERVER, DATA_FILE_SERVE
console.log('[ERROR] httpInterface -> App -> Contribute -> err.stack = ' + err.stack)
console.log('[ERROR] httpInterface -> App -> Contribute -> commitMessage = ' + commitMessage)
console.log('[ERROR] httpInterface -> App -> Contribute -> username = ' + username)
console.log('[ERROR] httpInterface -> App -> Contribute -> token = ' + token)
console.log('[ERROR] httpInterface -> App -> Contribute -> token starts with = ' + token.substring(0, 10) + '...')
console.log('[ERROR] httpInterface -> App -> Contribute -> token ends with = ' + '...' + token.substring(token.length - 10))
console.log('[ERROR] httpInterface -> App -> Contribute -> currentBranch = ' + currentBranch)
console.log('[ERROR] httpInterface -> App -> Contribute -> contributionsBranch = ' + contributionsBranch)
@@ -1018,6 +1019,176 @@ exports.newHttpInterface = function newHttpInterface(WEB_SERVER, DATA_FILE_SERVE
}
break
case 'Gov': {
switch (requestParameters[2]) { // switch by command
case 'getGithubStars': {
getProfiles('activity', 'listStargazersForRepo')
break
}
case 'getGithubWatchers': {
getProfiles('activity', 'listWatchersForRepo')
break
}
case 'getGithubForks': {
getProfiles('repos', 'listForks')
break
}
}
function getProfiles(endpoint, method) {
try {
const GITHUB_API_WAITING_TIME = 250
const repository = unescape(requestParameters[3])
const username = unescape(requestParameters[4])
const token = unescape(requestParameters[5])
let error
let githubListArray = []
getRepoInfo()
async function getRepoInfo() {
await doGithub()
if (error !== undefined) {
let docs = {
project: 'Governance',
category: 'Topic',
type: 'Gov Error - Get Repository Information',
anchor: undefined,
placeholder: {}
}
respondWithDocsObject(docs, error)
return
}
respondWithContent(JSON.stringify(githubListArray), httpResponse)
}
async function doGithub() {
const { Octokit } = require("@octokit/rest")
const octokit = new Octokit({
auth: token,
userAgent: 'Superalgos Beta 11'
})
await getList()
async function getList() {
const repo = repository
const owner = 'Superalgos'
const per_page = 100 // Max
let page = 0
let lastPage = false
while (lastPage === false) {
try {
page++
await sleep(GITHUB_API_WAITING_TIME)
let listResponse = await octokit[endpoint][method]({
owner,
repo,
per_page,
page
});
if (listResponse.data.length < 100) {
lastPage = true
}
for (let i = 0; i < listResponse.data.length; i++) {
let listItem = listResponse.data[i]
let githubUsername
switch(endpoint) {
case 'activity' : {
githubUsername = listItem.login
break
}
case 'repos' : {
githubUsername = listItem.owner.login
break
}
}
//console.log(listItem)
githubListArray.push(githubUsername)
}
console.log('[INFO] httpInterface -> Gov -> getRepoInfo -> doGithub -> getList -> ' + method + ' Page = ' + page)
console.log('[INFO] httpInterface -> Gov -> getRepoInfo -> doGithub -> getList -> ' + method + ' Received = ' + listResponse.data.length)
} catch (err) {
console.log(err)
if (err.stack.indexOf('last page') >= 0) {
return
} else {
console.log('[ERROR] httpInterface -> Gov -> getRepoInfo -> doGithub -> getList ->Method call produced an error.')
console.log('[ERROR] httpInterface -> Gov -> getRepoInfo -> doGithub -> getList ->err.stack = ' + err.stack)
console.log('[ERROR] httpInterface -> Gov -> getRepoInfo -> doGithub -> getList ->repository = ' + repository)
console.log('[ERROR] httpInterface -> Gov -> getRepoInfo -> doGithub -> getList ->username = ' + username)
console.log('[ERROR] httpInterface -> Gov -> getRepoInfo -> doGithub -> getList ->token starts with = ' + token.substring(0, 10) + '...')
console.log('[ERROR] httpInterface -> Gov -> getRepoInfo -> doGithub -> getList ->token ends with = ' + '...' + token.substring(token.length - 10))
error = err
}
}
}
}
}
} catch (err) {
console.log('[ERROR] httpInterface -> Gov -> getRepoInfo -> Method call produced an error.')
console.log('[ERROR] httpInterface -> Gov -> getRepoInfo -> err.stack = ' + err.stack)
console.log('[ERROR] httpInterface -> Gov -> getRepoInfo -> repository = ' + repository)
console.log('[ERROR] httpInterface -> Gov -> getRepoInfo -> username = ' + username)
console.log('[ERROR] httpInterface -> Gov -> getRepoInfo -> token starts with = ' + token.substring(0, 10) + '...')
console.log('[ERROR] httpInterface -> Gov -> getRepoInfo -> token ends with = ' + '...' + token.substring(token.length - 10))
let error = {
result: 'Fail Because',
message: err.message,
stack: err.stack
}
respondWithContent(JSON.stringify(error), httpResponse)
}
}
function respondWithDocsObject(docs, error) {
if (error.message !== undefined) {
docs.placeholder.errorMessage = {
style: 'Error',
text: error.message
}
}
if (error.stack !== undefined) {
docs.placeholder.errorStack = {
style: 'Javascript',
text: error.stack
}
}
if (error.code !== undefined) {
docs.placeholder.errorCode = {
style: 'Json',
text: error.code
}
}
docs.placeholder.errorDetails = {
style: 'Json',
text: JSON.stringify(error, undefined, 4)
}
let customResponse = {
result: global.CUSTOM_FAIL_RESPONSE.result,
docs: docs
}
respondWithContent(JSON.stringify(customResponse), httpResponse)
}
}
break
case 'LegacyPlotter.js':
{
respondWithFile(global.env.PATH_TO_CLIENT + 'WebServer/LegacyPlotter.js', httpResponse)
@@ -1962,4 +2133,10 @@ exports.newHttpInterface = function newHttpInterface(WEB_SERVER, DATA_FILE_SERVE
return files.reduce((a, f) => a.concat(f), []);
}
}
function sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms)
})
}
}
+357
View File
@@ -0,0 +1,357 @@
# 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/community-business.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
**A.** After the Superalgos directory has been installed, the final step of installation is to set up the necessary node dependencies.
**B.** In the same command prompt or terminal you just used, type 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.
![run-the-system-01](https://user-images.githubusercontent.com/13994516/107037804-e5fc6200-67bb-11eb-82f2-d0f40247fa14.gif)
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
![enable-ubuntu-shortcut](https://user-images.githubusercontent.com/55707292/117553927-f0780300-b019-11eb-9e36-46b509653283.gif)
**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.
![allow-launching](https://user-images.githubusercontent.com/55707292/117553933-fcfc5b80-b019-11eb-872c-4fad81b184d2.gif)
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 &mdash; 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.
![welcome-tutorial-00](https://user-images.githubusercontent.com/13994516/107038771-4a6bf100-67bd-11eb-92e0-353525a972a9.gif)
**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.
@@ -77,6 +77,10 @@
"style": "List",
"text": "App Update Command"
},
{
"style": "List",
"text": "Governance Workspaces"
},
{
"style": "Include",
"text": "Foundations->Topic->App Contribute Command->Block Authentication",
@@ -643,9 +643,15 @@ function newFoundationsActionSwitch() {
break
case 'Open Documentation':
{
let definition = getSchemaDocument(action.node)
if (definition !== undefined) {
UI.projects.education.spaces.docsSpace.openSpaceAreaAndNavigateTo(action.node.project, 'Node', action.node.type)
let docs = UI.projects.foundations.utilities.nodeConfig.loadConfigProperty(action.node.payload, 'docs')
if (docs === undefined) {
let definition = getSchemaDocument(action.node)
if (definition !== undefined) {
UI.projects.education.spaces.docsSpace.openSpaceAreaAndNavigateTo(action.node.project, 'Node', action.node.type)
}
} else {
UI.projects.education.spaces.docsSpace.openSpaceAreaAndNavigateTo(docs.project, docs.category, docs.type, docs.anchor, docs.nodeId, docs.placeholder)
}
}
break
@@ -141,7 +141,7 @@ function newFoundationsFunctionLibraryChartingSpaceFunctions() {
let mineProducts
let timeMachine = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(dashboard, 'Time Machine')
let exchange = market.payload.parentNode.payload.parentNode
timeMachine.payload.referenceParent = session
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(timeMachine, session)
timeMachine.name = session.name + ' ' + session.type + ' ' + networkNode.name + ' ' + exchange.name + ' ' + market.name
timeMachine.payload.floatingObject.collapseToggle()
timeMachine.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180
@@ -170,7 +170,7 @@ function newFoundationsFunctionLibraryChartingSpaceFunctions() {
for (let k = 0; k < 3; k++) {
let timelineChart = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(timeMachine, 'Timeline Chart')
timelineChart.layerManager.payload.referenceParent = mineProduct
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(timelineChart.layerManager, mineProduct)
timelineChart.payload.floatingObject.collapseToggle()
timelineChart.layerManager.payload.floatingObject.collapseToggle()
timelineChart.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180
@@ -229,7 +229,7 @@ function newFoundationsFunctionLibraryChartingSpaceFunctions() {
for (let k = 0; k < 3; k++) {
let timelineChart = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(timeMachine, 'Timeline Chart')
timelineChart.layerManager.payload.referenceParent = mineProduct
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(timelineChart.layerManager, mineProduct)
timelineChart.payload.floatingObject.collapseToggle()
timelineChart.layerManager.payload.floatingObject.collapseToggle()
timelineChart.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180
@@ -287,7 +287,7 @@ function newFoundationsFunctionLibraryChartingSpaceFunctions() {
*/
mineProduct.payload.uiObject.invisiblePhysics()
timelineChart.name = mineProduct.name + ' Data'
timelineChart.layerManager.payload.referenceParent = mineProduct
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(timelineChart.layerManager, mineProduct)
timelineChart.payload.floatingObject.collapseToggle()
timelineChart.layerManager.payload.floatingObject.collapseToggle()
timelineChart.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180
@@ -322,13 +322,13 @@ function newFoundationsFunctionLibraryChartingSpaceFunctions() {
if (UI.projects.foundations.utilities.children.isMissingChildrenById(node, testingTradingTasks, true) === true) {
let dashboard = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, 'Dashboard')
dashboard.payload.referenceParent = testingTradingTasks
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(dashboard, testingTradingTasks)
dashboard.name = testingTradingTasks.type + ' ' + networkNode.name
}
if (UI.projects.foundations.utilities.children.isMissingChildrenById(node, productionTradingTasks, true) === true) {
let dashboard = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, 'Dashboard')
dashboard.payload.referenceParent = productionTradingTasks
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(dashboard, productionTradingTasks)
dashboard.name = productionTradingTasks.type + ' ' + networkNode.name
}
}
@@ -347,7 +347,7 @@ function newFoundationsFunctionLibraryChartingSpaceFunctions() {
if (projectDefinition !== undefined) {
if (UI.projects.foundations.utilities.children.isMissingChildrenById(node, projectDefinition, true) === true) {
let projectTasks = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, 'Project Dashboards', undefined, project)
projectTasks.payload.referenceParent = projectDefinition
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(projectTasks, projectDefinition)
}
}
}
@@ -363,7 +363,7 @@ function newFoundationsFunctionLibraryChartingSpaceFunctions() {
for (let i = 0; i < plotterModule.panels.length; i++) {
let plotterPanel = plotterModule.panels[i]
let layerPanel = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, 'Layer Panel')
layerPanel.payload.referenceParent = plotterPanel
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(layerPanel, plotterPanel)
}
}
@@ -381,7 +381,7 @@ function newFoundationsFunctionLibraryChartingSpaceFunctions() {
for (let i = 0; i < plotterModule.shapes.polygons.length; i++) {
let polygon = plotterModule.shapes.polygons[i]
let layerPolygon = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, 'Layer Polygon')
layerPolygon.payload.referenceParent = polygon
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(layerPolygon, polygon)
}
}
@@ -199,8 +199,8 @@ function newFoundationsFunctionLibraryCryptoEcosystemFunctions() {
newMarket.quotedAsset.payload.floatingObject.distanceToParent = DISTANCE_TO_PARENT.PARENT_100X
newMarket.baseAsset.payload.floatingObject.arrangementStyle = ARRANGEMENT_STYLE.CONCAVE
newMarket.quotedAsset.payload.floatingObject.arrangementStyle = ARRANGEMENT_STYLE.CONCAVE
newMarket.baseAsset.payload.referenceParent = baseAsset
newMarket.quotedAsset.payload.referenceParent = quotedAsset
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(newMarket.baseAsset, baseAsset)
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(newMarket.quotedAsset, quotedAsset)
currentMarkets.set(name, newMarket)
}
@@ -76,7 +76,7 @@ function newFoundationsFunctionLibraryDataStorageFunctions() {
if (rootNode.type === 'Data Mine') {
let dataMineProducts = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, 'Data Mine Products')
dataMineProducts.payload.referenceParent = rootNode
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(dataMineProducts, rootNode)
}
}
}
@@ -87,7 +87,7 @@ function newFoundationsFunctionLibraryDataStorageFunctions() {
if (rootNode.type === 'Trading Mine') {
let tradingMineProducts = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, 'Trading Mine Products')
tradingMineProducts.payload.referenceParent = rootNode
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(tradingMineProducts, rootNode)
}
}
}
@@ -98,7 +98,7 @@ function newFoundationsFunctionLibraryDataStorageFunctions() {
if (rootNode.type === 'Learning Mine') {
let learningMineProducts = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, 'Learning Mine Products')
learningMineProducts.payload.referenceParent = rootNode
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(learningMineProducts, rootNode)
}
}
}
@@ -155,7 +155,7 @@ function newFoundationsFunctionLibraryDataStorageFunctions() {
function createSessionReference(node, session, nodeType) {
let sessionReference = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, nodeType)
sessionReference.payload.referenceParent = session
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(sessionReference, session)
}
function addMissingMarketDataProducts(node, rootNodes) {
@@ -179,7 +179,7 @@ function newFoundationsFunctionLibraryDataStorageFunctions() {
let market = marketsArray[i]
if (UI.projects.foundations.utilities.children.isMissingChildrenById(node, market, true) === true) {
let marketDataProducts = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, newNodeType)
marketDataProducts.payload.referenceParent = market
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(marketDataProducts, market)
}
}
}
@@ -207,7 +207,7 @@ function newFoundationsFunctionLibraryDataStorageFunctions() {
let cryptoExchange = cryptoExchanges.exchanges[k]
if (UI.projects.foundations.utilities.children.isMissingChildrenById(node, cryptoExchange, true) === true) {
let exchange = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, newNodeType)
exchange.payload.referenceParent = cryptoExchange
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(exchange, cryptoExchange)
}
}
}
@@ -240,7 +240,7 @@ function newFoundationsFunctionLibraryDataStorageFunctions() {
if (projectDefinition !== undefined) {
if (UI.projects.foundations.utilities.children.isMissingChildrenById(node, projectDefinition, true) === true) {
let projectTasks = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, newNodeType, undefined, project)
projectTasks.payload.referenceParent = projectDefinition
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(projectTasks, projectDefinition)
}
}
}
@@ -96,7 +96,7 @@ function newFoundationsFunctionLibraryMineFunctions() {
if (rootNode.type === 'Data Mine') {
let dataMineDataDependencies = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, 'Data Mine Data Dependencies')
dataMineDataDependencies.payload.referenceParent = rootNode
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(dataMineDataDependencies, rootNode)
}
}
}
@@ -167,10 +167,21 @@ function newFoundationsFunctionLibraryNodeCloning() {
name: node.payload.referenceParent.name,
id: node.payload.referenceParent.id
}
// If the path has not been saved save it now
if (node.payload.referenceParentCombinedNodePath === undefined) {
let attachNodePath = UI.projects.foundations.utilities.hierarchy.getNodeNameTypePath(node.payload.referenceParent)
// Save path to reference parent for auto restore
savedPayload.referenceParentCombinedNodePath = attachNodePath
} else {
// Save path to reference parent for auto restore
savedPayload.referenceParentCombinedNodePath = node.payload.referenceParentCombinedNodePath
}
} else {
/* The referenceParent property can be inherited from the previous saved payload. */
if (node.savedPayload !== undefined) {
savedPayload.referenceParent = node.savedPayload.referenceParent
// Save path to reference parent for auto restore
savedPayload.referenceParentCombinedNodePath = node.savedPayload.referenceParentCombinedNodePath
}
}
@@ -259,13 +259,25 @@ function newFoundationsFunctionLibraryProtocolNode() {
name: node.payload.referenceParent.name,
id: node.payload.referenceParent.id
}
// If the path has not been saved save it now
if (node.payload.referenceParentCombinedNodePath === undefined) {
let attachNodePath = UI.projects.foundations.utilities.hierarchy.getNodeNameTypePath(node.payload.referenceParent)
// Save path to reference parent for auto restore
savedPayload.referenceParentCombinedNodePath = attachNodePath
} else {
// Save path to reference parent for auto restore
savedPayload.referenceParentCombinedNodePath = node.payload.referenceParentCombinedNodePath
}
} else {
/* The referenceParent property can be inherited from the previous saved payload. */
if (node.savedPayload !== undefined) {
savedPayload.referenceParent = node.savedPayload.referenceParent
// Save path to reference parent for auto restore
savedPayload.referenceParentCombinedNodePath = node.savedPayload.referenceParentCombinedNodePath
}
}
}
return savedPayload
}
}
@@ -1,3 +1,4 @@
// These function are used across the system to establish and remove references between nodes
function newFoundationsFunctionLibraryAttachDetach() {
let thisObject = {
referenceDetachNode: referenceDetachNode,
@@ -7,17 +8,44 @@ function newFoundationsFunctionLibraryAttachDetach() {
return thisObject
function referenceDetachNode(node) {
completeDetachment(node)
cleanAttachNodePath(node)
completeDetachment(node)
}
function referenceAttachNode(node, attachToNode) {
storeAttachNodePath(node, attachToNode)
completeAttachment(node, attachToNode)
}
// Store the path to the reference parent to make restoring it possible if the reference parent is updated and given a new id
function storeAttachNodePath(node, attachToNode) {
let attachNodePath = UI.projects.foundations.utilities.hierarchy.getNodeNameTypePath(attachToNode)
// Remove unused node id, and project tag from stored path
for (let i = 0; i < attachNodePath.length; i++ ) {
attachNodePath[i].splice(2,2)
}
// Save attach path to active payload
node.payload.referenceParentCombinedNodePath = attachNodePath
}
// Clear the path to reference parent when the reference is cleared
function cleanAttachNodePath(node){
if (node.payload !== undefined) {
node.payload.referenceParentCombinedNodePath = undefined
if (node.savedPayload !== undefined) {
node.savedPayload.referenceParentCombinedNodePath = undefined
}
}
}
// Establish the reference between node and it's reference parent
function completeAttachment(node, attachToNode) {
node.payload.referenceParent = attachToNode
}
// Detach the reference between node and it's reference parent
function completeDetachment(node) {
if (node.payload !== undefined) {
if (node.payload.referenceParent !== undefined) {
@@ -37,7 +37,7 @@ function newFoundationsFunctionLibrarySuperScriptsFunctions() {
}
if (targetExchange === undefined) {
targetExchange = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(target, exchangeNodeType)
targetExchange.payload.referenceParent = exchange
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(targetExchange, exchange)
}
let nodesArray = targetExchange[arrayPropertyName]
nodesArray.push(templateClone)
@@ -611,7 +611,7 @@ function newFoundationsFunctionLibraryTaskFunctions() {
if (projectDefinition !== undefined) {
if (UI.projects.foundations.utilities.children.isMissingChildrenById(node, projectDefinition, true) === true) {
let projectTasks = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, newNodeType, undefined, project)
projectTasks.payload.referenceParent = projectDefinition
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(projectTasks, projectDefinition)
}
}
}
@@ -642,7 +642,7 @@ function newFoundationsFunctionLibraryTaskFunctions() {
let cryptoExchange = cryptoExchanges.exchanges[k]
if (UI.projects.foundations.utilities.children.isMissingChildrenById(node, cryptoExchange, true) === true) {
let exchangeTasks = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, newNodeType)
exchangeTasks.payload.referenceParent = cryptoExchange
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(exchangeTasks, cryptoExchange)
}
}
}
@@ -674,7 +674,7 @@ function newFoundationsFunctionLibraryTaskFunctions() {
if (UI.projects.foundations.utilities.children.isMissingChildrenById(node, market, true) === true) {
let marketDataTasks = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, newNodeType)
marketDataTasks.payload.referenceParent = market
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(marketDataTasks, market)
}
}
}
@@ -699,7 +699,7 @@ function newFoundationsFunctionLibraryTaskFunctions() {
if (UI.projects.foundations.utilities.children.isMissingChildrenById(node, mine, true) === true) {
let dataMineTasks = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, newNodeType)
dataMineTasks.payload.referenceParent = mine
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(dataMineTasks, mine)
}
}
}
@@ -846,12 +846,12 @@ function newFoundationsFunctionLibraryTaskFunctions() {
switch (bot.type) {
case 'Sensor Bot': {
processInstance = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(botInstance, 'Sensor Process Instance')
processInstance.payload.referenceParent = process
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(processInstance, process)
break
}
case 'API Data Fetcher Bot': {
processInstance = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(botInstance, 'API Data Fetcher Process Instance')
processInstance.payload.referenceParent = process
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(processInstance, process)
/*
We will locate and reference the API MAP that has the same codeName than the data mine.
@@ -863,7 +863,7 @@ function newFoundationsFunctionLibraryTaskFunctions() {
let mineCodeName = UI.projects.foundations.utilities.nodeConfig.loadConfigProperty(mine.payload, 'codeName')
if (apiMapCodeName === mineCodeName) {
processInstance.apiMapReference.payload.referenceParent = apiMap
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(processInstance.apiMapReference, apiMap)
break
}
}
@@ -871,12 +871,12 @@ function newFoundationsFunctionLibraryTaskFunctions() {
}
case 'Indicator Bot': {
processInstance = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(botInstance, 'Indicator Process Instance')
processInstance.payload.referenceParent = process
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(processInstance, process)
break
}
case 'Trading Bot': {
processInstance = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(botInstance, 'Trading Process Instance')
processInstance.payload.referenceParent = process
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(processInstance, process)
if (node.payload.parentNode === undefined) { return }
if (node.payload.parentNode.payload === undefined) { return }
@@ -911,15 +911,15 @@ function newFoundationsFunctionLibraryTaskFunctions() {
let rootNode = rootNodes[m]
if (rootNode.type === 'Trading Engine' && rootNode.isPlugin === true) {
let tradingEngine = rootNode
session.tradingEngineReference.payload.referenceParent = tradingEngine
session.tradingSystemReference.payload.referenceParent = systemNode
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(session.tradingEngineReference, tradingEngine)
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(session.tradingSystemReference, systemNode)
}
}
}
}
case 'Learning Bot': {
processInstance = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(botInstance, 'Learning Process Instance')
processInstance.payload.referenceParent = process
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(processInstance, process)
let session
addSession(sessionType)
@@ -936,8 +936,8 @@ function newFoundationsFunctionLibraryTaskFunctions() {
let rootNode = rootNodes[m]
if (rootNode.type === 'Learning Engine' && rootNode.isPlugin === true) {
let learningEngine = rootNode
session.learningEngineReference.payload.referenceParent = learningEngine
session.learningSystemReference.payload.referenceParent = systemNode
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(session.learningEngineReference, learningEngine)
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(session.learningSystemReference, systemNode)
}
}
}
@@ -295,6 +295,7 @@ function newFoundationsFunctionLibraryUiObjectsFromNodes() {
console.log('ACA')
}
if (node.payload === undefined) { continue }
if (node.payload.referenceParent !== undefined) {
if (node.payload.referenceParent.cleaned === true) {
node.payload.referenceParent = mapOfNodes.get(node.payload.referenceParent.id)
@@ -306,13 +307,88 @@ function newFoundationsFunctionLibraryUiObjectsFromNodes() {
continue // In this case the reference is already good.
}
}
if (node.savedPayload !== undefined) {
if (node.savedPayload.referenceParent !== undefined) { // these are children recreated
// Reestablish based on Id
node.payload.referenceParent = mapOfNodes.get(node.savedPayload.referenceParent.id)
// if Reestablishment failed now reestablish reference based on saved path
if (node.payload.referenceParent === undefined) {
// Gather saved path
let rawPath = node.savedPayload.referenceParentCombinedNodePath
if (rawPath !== undefined) {
// Step down node hierarchy to find missing referenceParent
let pathNode
let pathName
let pathType
for (let i = 0; i < rawPath.length; i++) {
// Get Hierarchy head node
if (i === 0) {
pathName = rawPath[i][0]
pathType = rawPath[i][1]
pathNode = UI.projects.foundations.spaces.designSpace.workspace.getHierarchyHeadsByCodeNameAndNodeType( pathName, pathType )
// If reference parent is workspace node grab node
if (pathType === "Workspace") {
pathNode = UI.projects.foundations.spaces.designSpace.workspace.workspaceNode
}
continue
} else { // Walk through children nodes and find the next node from saved path
pathName = rawPath[i][0]
pathType = rawPath[i][1]
pathNode = getNextNodeFromPath(pathNode, pathName, pathType)
}
}
if (pathNode !== undefined ) {
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(node, pathNode)
} else {
console.log("[WARN] ", node.name, ' ', node.type, "failed to fix reference. Unable to find reference parent ", pathName, ' ', pathType )
}
function getNextNodeFromPath(node, pathName, pathType) {
let schemaDocument = getSchemaDocument(node)
let nextNode = undefined
for (let i = 0; i < schemaDocument.childrenNodesProperties.length; i++) {
let property = schemaDocument.childrenNodesProperties[i]
switch (property.type) {
// If child node is directly withing parent node look for it
case 'node': {
if (node[property.name] !== undefined) {
if (node[property.name].name === pathName && node[property.name].type === pathType) {
nextNode = node[property.name]
console.log("we have a match!", nextNode)
return nextNode
}
}
break
}
// If child node is in an array look for it
case 'array': {
if (node[property.name] !== undefined) {
let nodePropertyArray = node[property.name]
for (let m = 0; m < nodePropertyArray.length; m++) {
if (nodePropertyArray[m].name === pathName && nodePropertyArray[m].type === pathType) {
nextNode = nodePropertyArray[m]
return nextNode
}
}
}
break
}
}
}
}
}
}
if (node.payload.referenceParent === undefined) {
//console.log('[WARN]' + node.type + ' ' + node.name + ' reference parent lost during re-binding phase.')
console.log('[WARN]' + node.type + ' ' + node.name + ' reference parent lost during re-binding phase.')
}
}
}
}
}
}
@@ -558,6 +558,9 @@ function newWorkspace() {
let hierarchyHeadCodeName = UI.projects.foundations.utilities.nodeConfig.loadConfigProperty(hierarchyHead.payload, 'codeName')
if (hierarchyHeadCodeName === codeName && hierarchyHead.type === nodeType) {
return hierarchyHead
} else if (hierarchyHead.name === codeName && hierarchyHead.type === nodeType) {
// This condition is used for auto fixing references in UiObjectsFromNodes.js
return hierarchyHead
}
}
}
+2 -2
View File
@@ -43,7 +43,7 @@ function newFoundationsUtilitiesFolders() {
to its origin object counter part.
*/
let clonedObject = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(destinationNode, clonedObjectType)
clonedObject.payload.referenceParent = originObject
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(clonedObject, originObject)
} else {
/*
In this second Use Case, we are going to connect an inner object that is
@@ -54,7 +54,7 @@ function newFoundationsUtilitiesFolders() {
for (let n = 0; n < originObjectArray.length; n++) {
let originObjectArrayItem = originObjectArray[n]
let clonedObject = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(destinationNode, clonedObjectType)
clonedObject.payload.referenceParent = originObjectArrayItem
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(clonedObject, originObjectArrayItem)
}
}
}
@@ -220,7 +220,7 @@ function newFoundationsUtilitiesNodeChildren() {
let child
if (isMissingChildrenById(startingNode, referencedNode, true) === true) {
child = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(startingNode, childType)
child.payload.referenceParent = referencedNode
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(child, referencedNode)
} else {
child = findChildReferencingThisNode(startingNode, referencedNode)
}
@@ -239,7 +239,7 @@ function newFoundationsUtilitiesNodeChildren() {
UI.projects.foundations.functionLibraries.nodeDeleter.deleteUIObject(child, rootNodes)
}
child = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(startingNode, childType)
child.payload.referenceParent = referencedNode
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(child, referencedNode)
return child
}
@@ -95,6 +95,7 @@ function newFoundationsUtilitiesPlugins() {
data = JSON.parse(data)
if (err.result === GLOBAL.DEFAULT_OK_RESPONSE.result && data.result === GLOBAL.DEFAULT_OK_RESPONSE.result) {
pluginFile.payload.uiObject.setInfoMessage('Plugin Saved.', 5)
pluginToSave.payload.uiObject.setInfoMessage('Plugin Saved.', 5)
return
}
console.log('[ERROR] Saving Plugin File: ' + JSON.stringify(data))
Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

File diff suppressed because it is too large. Load diff
@@ -0,0 +1,123 @@
{
"type": "Assets",
"name": "Foundations-Project Plugins API-Data-Mines Rewards",
"config": "{\"codeName\":\"Foundations-Project-Plugins\"}",
"project": "Governance",
"assetClasses": [
{
"type": "Asset Class",
"name": "Plugins Rewards",
"config": "{\n \"folderPath\": \"Foundations/Plugins\"\n}",
"project": "Governance",
"assetClasses": [
{
"type": "Asset Class",
"name": "Data-Mines",
"config": "{\"codeName\":\"Data-Mines\"}",
"project": "Governance",
"assetClasses": [],
"assets": [
{
"type": "Asset",
"name": "API-Data-Mines wit Indicators, Plotters and Sample Workspace with Trading-System",
"config": "{}",
"project": "Governance",
"assetClasses": [],
"assets": [],
"id": "c39ab3e2-6525-4789-af1c-54b0cc095ef7",
"savedPayload": {
"position": {
"x": 25080.166666666668,
"y": 38515.81154239019
},
"targetPosition": {
"x": 25080.166666666668,
"y": 38215.81154239019
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
],
"id": "f738a3d2-9105-436e-ba39-a08f90be6bf7",
"savedPayload": {
"position": {
"x": 25080.166666666668,
"y": 38215.81154239019
},
"targetPosition": {
"x": 25080.166666666668,
"y": 37915.81154239019
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
],
"assets": [],
"id": "a50d7d18-bbdf-449b-8212-fcc72fdc9ff6",
"savedPayload": {
"position": {
"x": 25080.166666666668,
"y": 37915.81154239019
},
"targetPosition": {
"x": 25080.166666666668,
"y": 37615.81154239019
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
],
"assets": [],
"id": "4e1ff7bb-dc41-42c7-8ca6-552a9521d4f4",
"savedPayload": {
"position": {
"x": 25080.166666666668,
"y": 37615.81154239019
},
"targetPosition": {
"x": 25080.166666666668,
"y": 37615.81154239019
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
@@ -0,0 +1,123 @@
{
"type": "Assets",
"name": "Foundations-Project Plugins Data-Mines Rewards",
"config": "{\"codeName\":\"Foundations-Project-Plugins\"}",
"project": "Governance",
"assetClasses": [
{
"type": "Asset Class",
"name": "Plugins Rewards",
"config": "{\n \"folderPath\": \"Foundations/Plugins\"\n}",
"project": "Governance",
"assetClasses": [
{
"type": "Asset Class",
"name": "Data-Mines",
"config": "{\"codeName\":\"Data-Mines\"}",
"project": "Governance",
"assetClasses": [],
"assets": [
{
"type": "Asset",
"name": "Data Mines wit Indicators, Plotters and Sample Workspace with Trading-System ",
"config": "{}",
"project": "Governance",
"assetClasses": [],
"assets": [],
"id": "fb57cfb4-a688-4521-8fb0-7f329484b902",
"savedPayload": {
"position": {
"x": 19313.166666666668,
"y": 38525.31154239019
},
"targetPosition": {
"x": 19313.166666666668,
"y": 38225.31154239019
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
],
"id": "f60b754f-83b7-4d54-9daa-99888b805e1a",
"savedPayload": {
"position": {
"x": 19313.166666666668,
"y": 38225.31154239019
},
"targetPosition": {
"x": 19313.166666666668,
"y": 37925.31154239019
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
],
"assets": [],
"id": "8742112d-7227-4678-a435-bf11956c0b54",
"savedPayload": {
"position": {
"x": 19313.166666666668,
"y": 37925.31154239019
},
"targetPosition": {
"x": 19313.166666666668,
"y": 37625.31154239019
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
],
"assets": [],
"id": "cfc85fed-e63c-4a02-9d25-f7bacec173d4",
"savedPayload": {
"position": {
"x": 19313.166666666668,
"y": 37625.31154239019
},
"targetPosition": {
"x": 19313.166666666668,
"y": 37625.31154239019
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
@@ -0,0 +1,123 @@
{
"type": "Assets",
"name": "Foundations-Project Plugins Trading-Systems Rewards",
"config": "{\"codeName\":\"Foundations-Project-Plugins\"}",
"project": "Governance",
"assetClasses": [
{
"type": "Asset Class",
"name": "Plugins Rewards",
"config": "{\n \"folderPath\": \"Foundations/Plugins\"\n}",
"project": "Governance",
"assetClasses": [
{
"type": "Asset Class",
"name": "Trading-Systems",
"config": "{\"codeName\":\"Trading-Systems\"}",
"project": "Governance",
"assetClasses": [],
"assets": [
{
"type": "Asset",
"name": "Elaborated Plug & Play Trading System",
"config": "{\n }",
"project": "Governance",
"assetClasses": [],
"assets": [],
"id": "67730415-7d0a-493a-a3ff-bc2683e97cad",
"savedPayload": {
"position": {
"x": 13518.166666666668,
"y": 38507.31154239019
},
"targetPosition": {
"x": 13518.166666666668,
"y": 38207.31154239019
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
],
"id": "3bd41614-ce3e-4866-bf2c-08161eb22cd3",
"savedPayload": {
"position": {
"x": 13518.166666666668,
"y": 38207.31154239019
},
"targetPosition": {
"x": 13518.166666666668,
"y": 37907.31154239019
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
],
"assets": [],
"id": "b23b34d1-a935-49d1-b507-503b9b4838bb",
"savedPayload": {
"position": {
"x": 13518.166666666668,
"y": 37907.31154239019
},
"targetPosition": {
"x": 13518.166666666668,
"y": 37607.31154239019
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
],
"assets": [],
"id": "519d2386-ccef-4e6c-af91-9169fc2a4a6f",
"savedPayload": {
"position": {
"x": 13518.166666666668,
"y": 37607.31154239019
},
"targetPosition": {
"x": 13518.166666666668,
"y": 37607.31154239019
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
@@ -118,8 +118,8 @@
"id": "c3dbcb43-d981-45e7-b92a-6f6af5180592",
"savedPayload": {
"position": {
"x": 19816.001851143188,
"y": 46548.44535202786
"x": 19807.837132668446,
"y": 46539.95354133178
},
"targetPosition": {
"x": 19595.705098312483,
@@ -148,8 +148,8 @@
"id": "e1f53501-bbce-4075-a6cd-e6a8eb61f2a0",
"savedPayload": {
"position": {
"x": 19851.49714761871,
"y": 46595.336006272955
"x": 19838.410196624965,
"y": 46575.75
},
"targetPosition": {
"x": 19595.705098312483,
@@ -178,8 +178,8 @@
"id": "1626d693-5206-484e-b0fd-30d598d3d138",
"savedPayload": {
"position": {
"x": 19877.162499089227,
"y": 46648.25045856449
"x": 19863.007055568993,
"y": 46615.88842576588
},
"targetPosition": {
"x": 19595.705098312483,
@@ -208,8 +208,8 @@
"id": "212b2b4b-a234-4b58-abf4-0cd16e8ced05",
"savedPayload": {
"position": {
"x": 19892.011600491023,
"y": 46705.15523617568
"x": 19881.022053201028,
"y": 46659.380477375256
},
"targetPosition": {
"x": 19595.705098312483,
@@ -238,8 +238,8 @@
"id": "e49df7d9-ee09-4f47-8f71-abf29d588420",
"savedPayload": {
"position": {
"x": 19895.4738091847,
"y": 46763.86352041546
"x": 19892.011600491023,
"y": 46705.15523617568
},
"targetPosition": {
"x": 19595.705098312483,
@@ -268,8 +268,8 @@
"id": "c1574672-0a07-4821-8a6e-642d39d20d11",
"savedPayload": {
"position": {
"x": 19887.416074431785,
"y": 46822.119184844516
"x": 19895.705098312483,
"y": 46752.08557568774
},
"targetPosition": {
"x": 19595.705098312483,
@@ -298,8 +298,8 @@
"id": "9dd0804a-91ad-4160-8288-139c6d78a094",
"savedPayload": {
"position": {
"x": 19868.148050460008,
"y": 46877.68349694897
"x": 19892.011600491023,
"y": 46799.01591519981
},
"targetPosition": {
"x": 19595.705098312483,
@@ -328,8 +328,8 @@
"id": "e70ea49a-419b-4838-a82a-af934368d53e",
"savedPayload": {
"position": {
"x": 19838.410196624965,
"y": 46928.421151375485
"x": 19881.022053201028,
"y": 46844.79067400023
},
"targetPosition": {
"x": 19595.705098312483,
@@ -358,8 +358,8 @@
"id": "f3e6edf8-b21a-4489-923c-b7b3efa77620",
"savedPayload": {
"position": {
"x": 19799.345321972367,
"y": 46972.38232851845
"x": 19863.007055568993,
"y": 46888.282725609606
},
"targetPosition": {
"x": 19595.705098312483,
@@ -388,8 +388,8 @@
"id": "f99ac562-4315-46f7-9466-6a2578925bea",
"savedPayload": {
"position": {
"x": 19752.454667727266,
"y": 47007.87762499397
"x": 19838.410196624965,
"y": 46928.421151375485
},
"targetPosition": {
"x": 19595.705098312483,
@@ -418,8 +418,8 @@
"id": "a5d80050-4ed3-45a3-aebc-9d3fae8bf015",
"savedPayload": {
"position": {
"x": 19699.54021543573,
"y": 47033.54297646449
"x": 19807.837132668446,
"y": 46964.21761004371
},
"targetPosition": {
"x": 19595.705098312483,
@@ -448,8 +448,8 @@
"id": "d23538f8-26ee-4ac0-9919-59678206ba6f",
"savedPayload": {
"position": {
"x": 19642.635437824552,
"y": 47048.39207786629
"x": 19772.040674000225,
"y": 46994.79067400023
},
"targetPosition": {
"x": 19595.705098312483,
@@ -478,8 +478,8 @@
"id": "b92aa988-21d0-4a01-996a-5e3aa4fe24b4",
"savedPayload": {
"position": {
"x": 19583.927153584762,
"y": 47051.85428655996
"x": 19731.902248234346,
"y": 47019.38753294425
},
"targetPosition": {
"x": 19595.705098312483,
@@ -508,8 +508,8 @@
"id": "3199d2fd-f090-4307-b43e-285bc174ff0f",
"savedPayload": {
"position": {
"x": 19525.67148915571,
"y": 47043.79655180705
"x": 19688.410196624965,
"y": 47037.40253057629
},
"targetPosition": {
"x": 19595.705098312483,
@@ -538,8 +538,128 @@
"id": "3f0c0152-1777-4773-8592-3b3d826066f7",
"savedPayload": {
"position": {
"x": 19470.107177051254,
"y": 47024.52852783527
"x": 19642.635437824552,
"y": 47048.39207786629
},
"targetPosition": {
"x": 19595.705098312483,
"y": 46752.08557568774
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
{
"type": "Asset",
"name": "Barcelona.json",
"config": "{\"codeName\":\"Barcelona.json\"}",
"project": "Governance",
"assetClasses": [],
"assets": [],
"id": "469377ea-5761-4b65-bb43-6e286832f53e",
"savedPayload": {
"position": {
"x": 19595.705098312483,
"y": 47052.08557568774
},
"targetPosition": {
"x": 19595.705098312483,
"y": 46752.08557568774
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
{
"type": "Asset",
"name": "Heikin.json",
"config": "{\"codeName\":\"Heikin.json\"}",
"project": "Governance",
"assetClasses": [],
"assets": [],
"id": "1fff7f0d-be90-4d8b-9b69-7784d15c60c2",
"savedPayload": {
"position": {
"x": 19548.774758800413,
"y": 47048.39207786629
},
"targetPosition": {
"x": 19595.705098312483,
"y": 46752.08557568774
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
{
"type": "Asset",
"name": "Indicator-Add-ons.json",
"config": "{\"codeName\":\"Indicator-Add-ons.json\"}",
"project": "Governance",
"assetClasses": [],
"assets": [],
"id": "57bafbea-3fed-4081-a8e9-76ec9f8cbf04",
"savedPayload": {
"position": {
"x": 19503,
"y": 47037.40253057629
},
"targetPosition": {
"x": 19595.705098312483,
"y": 46752.08557568774
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
{
"type": "Asset",
"name": "Quasar.json",
"config": "{\"codeName\":\"Quasar.json\"}",
"project": "Governance",
"assetClasses": [],
"assets": [],
"id": "f0b452b5-45fb-487a-a725-705325d075e3",
"savedPayload": {
"position": {
"x": 19459.50794839062,
"y": 47019.38753294425
},
"targetPosition": {
"x": 19595.705098312483,
@@ -983,6 +1103,36 @@
"isRunning": false
}
}
},
{
"type": "Asset",
"name": "LiveTester-Chart-Scanner.json",
"config": "{\"codeName\":\"LiveTester-Chart-Scanner.json\"}",
"project": "Governance",
"assetClasses": [],
"assets": [],
"id": "790140ed-8794-46c1-8f28-522b5b49529e",
"savedPayload": {
"position": {
"x": 19036.294901687517,
"y": 46824.08557568774
},
"targetPosition": {
"x": 19110.294901687517,
"y": 46752.08557568774
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
],
"id": "fe941ab2-b0ab-40eb-9f65-d0e874a0ae24",
@@ -0,0 +1,245 @@
{
"type": "Assets",
"name": "Superalgos Exchanges",
"config": "{\n\"folderPath\": \"\"\n}",
"project": "Governance",
"assetClasses": [
{
"type": "Asset Class",
"name": "SA Token Listings Rewards",
"config": "{\n\"folderPath\": \"\"\n}",
"project": "Governance",
"assetClasses": [
{
"type": "Asset Class",
"name": "CMC Top 10",
"config": "{\n\"folderPath\": \"\"\n}",
"project": "Governance",
"assetClasses": [],
"assets": [
{
"type": "Asset",
"name": "First Listing",
"config": "{}",
"project": "Governance",
"assetClasses": [],
"assets": [],
"id": "548dd163-9991-4de3-9e68-9e8a9a051a2f",
"savedPayload": {
"position": {
"x": 10018.264068711927,
"y": 38520.76406871193
},
"targetPosition": {
"x": 9806.132034355964,
"y": 38308.632034355964
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
],
"id": "7793964e-794b-4d76-b5fd-4ee67c3f3aab",
"savedPayload": {
"position": {
"x": 9806.132034355964,
"y": 38308.632034355964
},
"targetPosition": {
"x": 9594,
"y": 38096.5
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
{
"type": "Asset Class",
"name": "CMC Top 50",
"config": "{\n\"folderPath\": \"\"\n}",
"project": "Governance",
"assetClasses": [],
"assets": [
{
"type": "Asset",
"name": "Second Listing",
"config": "{}",
"project": "Governance",
"assetClasses": [],
"assets": [],
"id": "e4e7addb-a840-4ce9-9e01-74c7e57c24ad",
"savedPayload": {
"position": {
"x": 9594,
"y": 38696.5
},
"targetPosition": {
"x": 9594,
"y": 38396.5
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
],
"id": "ffec9d04-21ef-48eb-a29f-51d1e1c5cb59",
"savedPayload": {
"position": {
"x": 9594,
"y": 38396.5
},
"targetPosition": {
"x": 9594,
"y": 38096.5
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
{
"type": "Asset Class",
"name": "CMC Top 100",
"config": "{\n\"folderPath\": \"\"\n}",
"project": "Governance",
"assetClasses": [],
"assets": [
{
"type": "Asset",
"name": "Third Listing",
"config": "{}",
"project": "Governance",
"assetClasses": [],
"assets": [],
"id": "73c64b92-467f-4e27-8c3b-a624f00bbf53",
"savedPayload": {
"position": {
"x": 9169.735931288073,
"y": 38520.76406871193
},
"targetPosition": {
"x": 9381.867965644036,
"y": 38308.632034355964
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
],
"id": "6d69d279-c79d-4565-b8a2-5a612ef8b7b3",
"savedPayload": {
"position": {
"x": 9381.867965644036,
"y": 38308.632034355964
},
"targetPosition": {
"x": 9594,
"y": 38096.5
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
],
"assets": [],
"id": "492669d5-223f-426d-845a-f26dd1ae251e",
"savedPayload": {
"position": {
"x": 9594,
"y": 38096.5
},
"targetPosition": {
"x": 9594,
"y": 37796.5
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
],
"assets": [],
"id": "2cefeb95-9fde-418b-a35b-6178a97cac9d",
"savedPayload": {
"position": {
"x": 9594,
"y": 37796.5
},
"targetPosition": {
"x": 9594,
"y": 37796.5
},
"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
@@ -6,123 +6,122 @@
"featureClasses": [
{
"type": "Feature Class",
"name": "Superalgos",
"name": "Project Features",
"config": "{\n \"description\": \"\", \"relativeWeight\": 0 \n}",
"project": "Governance",
"featureClasses": [
{
"type": "Feature Class",
"name": "Visual Designer",
"config": "{\n \"description\": \"\", \"relativeWeight\": 0 \n}",
"name": "Superalgos Algo-traders Platform",
"config": "{}",
"project": "Governance",
"featureClasses": [],
"features": [],
"id": "18584f3f-6e48-4a68-89f1-0268185156e9",
"savedPayload": {
"position": {
"x": 35870.70509831249,
"y": 38274.83557568774
},
"targetPosition": {
"x": 35628,
"y": 38098.5
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
{
"type": "Feature Class",
"name": "Visual Debugger",
"config": "{\n \"description\": \"\", \"relativeWeight\": 0 \n}",
"project": "Governance",
"featureClasses": [],
"features": [],
"id": "0e329071-a542-405f-ae8c-2933098759c1",
"savedPayload": {
"position": {
"x": 35720.70509831249,
"y": 38383.81695488855
},
"targetPosition": {
"x": 35628,
"y": 38098.5
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
{
"type": "Feature Class",
"name": "Charting System",
"config": "{\n \"description\": \"\", \"relativeWeight\": 0 \n}",
"project": "Governance",
"featureClasses": [],
"features": [],
"id": "7edc83c0-74fc-4427-816d-4db5d840577f",
"savedPayload": {
"position": {
"x": 35535.29490168751,
"y": 38383.81695488855
},
"targetPosition": {
"x": 35628,
"y": 38098.5
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
{
"type": "Feature Class",
"name": "Data Mining",
"config": "{\n \"description\": \"\", \"relativeWeight\": 0 \n}",
"project": "Governance",
"featureClasses": [],
"features": [
"featureClasses": [
{
"type": "Feature",
"name": "Feature X",
"type": "Feature Class",
"name": "Charting System",
"config": "{}",
"project": "Governance",
"featureClasses": [],
"features": [],
"id": "1b9dd977-f388-4434-a3f9-2e7a10726848",
"id": "02848ef4-c9b9-40aa-8a3c-47f15ebea53f",
"savedPayload": {
"position": {
"x": 35142.58980337503,
"y": 38451.171151375485
"x": 36136.43853653451,
"y": 38263.7016948439
},
"targetPosition": {
"x": 35385.29490168751,
"y": 38274.83557568774
"x": 35840.132034355964,
"y": 38310.632034355964
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
{
"type": "Feature Class",
"name": "Data Mining",
"config": "{}",
"project": "Governance",
"featureClasses": [],
"features": [],
"id": "13c737ea-7b4c-4f8c-b1d5-e619904c6ab3",
"savedPayload": {
"position": {
"x": 36107.43399161247,
"y": 38446.82918427783
},
"targetPosition": {
"x": 35840.132034355964,
"y": 38310.632034355964
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
{
"type": "Feature Class",
"name": "Visual Designer",
"config": "{}",
"project": "Governance",
"featureClasses": [],
"features": [],
"id": "9247390f-4ac1-42da-855c-730052bb7f4c",
"savedPayload": {
"position": {
"x": 35976.32918427783,
"y": 38577.93399161247
},
"targetPosition": {
"x": 35840.132034355964,
"y": 38310.632034355964
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
{
"type": "Feature Class",
"name": "Visual Debugger",
"config": "{}",
"project": "Governance",
"featureClasses": [],
"features": [],
"id": "549e88f0-a000-4078-b0b9-6846c5e798ef",
"savedPayload": {
"position": {
"x": 35793.2016948439,
"y": 38606.93853653451
},
"targetPosition": {
"x": 35840.132034355964,
"y": 38310.632034355964
},
"floatingObject": {
"isPinned": false,
@@ -138,11 +137,194 @@
}
}
],
"id": "025c0e15-ad8d-49ae-b501-577bb82c207d",
"features": [],
"id": "f83a751e-ff0c-49bd-a306-8b5ab6a8cc83",
"savedPayload": {
"position": {
"x": 35385.29490168751,
"y": 38274.83557568774
"x": 35840.132034355964,
"y": 38310.632034355964
},
"targetPosition": {
"x": 35628,
"y": 38098.5
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": true,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
{
"type": "Feature Class",
"name": "Superalgos Mobile App",
"config": "{}",
"project": "Governance",
"featureClasses": [],
"features": [
{
"type": "Feature",
"name": "Android Mobile App",
"config": "{}",
"project": "Governance",
"featureClasses": [],
"features": [],
"id": "22e0864c-5a2a-40b5-a24d-fe46cde7dd64",
"savedPayload": {
"position": {
"x": 35840.132034355964,
"y": 38610.632034355964
},
"targetPosition": {
"x": 35628,
"y": 38398.5
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
{
"type": "Feature",
"name": "iOS Mobile App",
"config": "{}",
"project": "Governance",
"featureClasses": [],
"features": [],
"id": "dc029fe2-d4f7-46a1-908d-3d3251af002e",
"savedPayload": {
"position": {
"x": 35628,
"y": 38698.5
},
"targetPosition": {
"x": 35628,
"y": 38398.5
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
{
"type": "Feature",
"name": "Huawei Mobile App",
"config": "{}",
"project": "Governance",
"featureClasses": [],
"features": [],
"id": "198f47fc-61bd-41a1-9b2f-7bc1bea082f9",
"savedPayload": {
"position": {
"x": 35415.867965644036,
"y": 38610.632034355964
},
"targetPosition": {
"x": 35628,
"y": 38398.5
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
],
"id": "f193b1f9-c97d-4831-87b4-defe9f6aab9a",
"savedPayload": {
"position": {
"x": 35628,
"y": 38398.5
},
"targetPosition": {
"x": 35628,
"y": 38098.5
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
{
"type": "Feature Class",
"name": "Superalgos P2P Network",
"config": "{}",
"project": "Governance",
"featureClasses": [],
"features": [
{
"type": "Feature",
"name": "Node.js Implementation",
"config": "{}",
"project": "Governance",
"featureClasses": [],
"features": [],
"id": "bda64809-41d7-41a8-9166-792a6df000e1",
"savedPayload": {
"position": {
"x": 35203.73593128807,
"y": 38522.76406871193
},
"targetPosition": {
"x": 35415.867965644036,
"y": 38310.632034355964
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
],
"id": "e205d4f2-140e-4d4b-a839-e37a6537dfa9",
"savedPayload": {
"position": {
"x": 35415.867965644036,
"y": 38310.632034355964
},
"targetPosition": {
"x": 35628,
@@ -201,7 +383,7 @@
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": true,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
File diff suppressed because it is too large. Load diff
@@ -6,32 +6,32 @@
"positionClasss": [
{
"type": "Position Class",
"name": "Community Management",
"name": "Rewarded Positions",
"config": "{}",
"project": "Governance",
"positions": [
{
"type": "Position",
"name": "Moderator",
"name": "Project Lead",
"config": "{}",
"project": "Governance",
"positions": [],
"positionClasss": [],
"id": "6e141ab6-cc79-44b6-a58a-60b6480f706e",
"id": "0c2e2b7c-3786-4810-9f0f-a287857ca83d",
"savedPayload": {
"position": {
"x": 30831,
"y": 37770
"x": 30473.705098312483,
"y": 38246.33557568774
},
"targetPosition": {
"x": 30531,
"y": 37770
"x": 30231,
"y": 38070
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
@@ -41,52 +41,54 @@
}
}
],
"positionClasss": [],
"id": "35b790f0-c567-498c-83fd-ac0aacd8720b",
"savedPayload": {
"position": {
"x": 30531,
"y": 37770
},
"targetPosition": {
"x": 30231,
"y": 37770
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
{
"type": "Position Class",
"name": "Marketing",
"config": "{}",
"project": "Governance",
"positions": [
"positionClasss": [
{
"type": "Position",
"name": "Marketing Lead",
"type": "Position Class",
"name": "Community Management",
"config": "{}",
"project": "Governance",
"positions": [],
"positions": [
{
"type": "Position",
"name": "Moderator",
"config": "{}",
"project": "Governance",
"positions": [],
"positionClasss": [],
"id": "6e141ab6-cc79-44b6-a58a-60b6480f706e",
"savedPayload": {
"position": {
"x": 30416.410196624965,
"y": 38640.6339097771
},
"targetPosition": {
"x": 30323.705098312483,
"y": 38355.31695488855
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
],
"positionClasss": [],
"id": "59369731-0766-4d13-aec2-db218b5455e4",
"id": "35b790f0-c567-498c-83fd-ac0aacd8720b",
"savedPayload": {
"position": {
"x": 30546.6485459557,
"y": 38256.05613679621
},
"targetPosition": {
"x": 30323.705098312483,
"y": 38055.31695488855
"y": 38355.31695488855
},
"targetPosition": {
"x": 30231,
"y": 38070
},
"floatingObject": {
"isPinned": false,
@@ -102,21 +104,143 @@
}
},
{
"type": "Position",
"name": "Advisor",
"type": "Position Class",
"name": "Business",
"config": "{}",
"project": "Governance",
"positions": [],
"positions": [
{
"type": "Position",
"name": "Business Lead",
"config": "{}",
"project": "Governance",
"positions": [],
"positionClasss": [],
"id": "b29c3581-089f-41fd-9421-3e9b518a9c7b",
"savedPayload": {
"position": {
"x": 30122.594114814634,
"y": 38654.90581531492
},
"targetPosition": {
"x": 30138.294901687517,
"y": 38355.31695488855
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 3,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
{
"type": "Position",
"name": "Advisor",
"config": "{}",
"project": "Governance",
"positions": [],
"positionClasss": [],
"id": "88a25b7c-df9f-4268-8216-5cb4a90a72dc",
"savedPayload": {
"position": {
"x": 29974.90319118301,
"y": 38606.918125272176
},
"targetPosition": {
"x": 30138.294901687517,
"y": 38355.31695488855
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 3,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
],
"positionClasss": [],
"id": "da7c7b94-d675-402e-9178-b219ff9a672c",
"id": "520de537-9ab0-41d6-8bd0-950fe9524e4d",
"savedPayload": {
"position": {
"x": 30261.331591067155,
"y": 38348.761235108694
"x": 30138.294901687517,
"y": 38355.31695488855
},
"targetPosition": {
"x": 30323.705098312483,
"y": 38055.31695488855
"x": 30231,
"y": 38070
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
{
"type": "Position Class",
"name": "Core Team",
"config": "{}",
"project": "Governance",
"positions": [
{
"type": "Position",
"name": "Member",
"config": "{}",
"project": "Governance",
"positions": [],
"positionClasss": [],
"id": "63bbf7f7-2d71-4075-8498-f09f754d8c0b",
"savedPayload": {
"position": {
"x": 29745.589803375035,
"y": 38422.671151375485
},
"targetPosition": {
"x": 29988.294901687517,
"y": 38246.33557568774
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
],
"positionClasss": [],
"id": "0dc6759d-459b-45ff-83c5-220b7a323f75",
"savedPayload": {
"position": {
"x": 29988.294901687517,
"y": 38246.33557568774
},
"targetPosition": {
"x": 30231,
"y": 38070
},
"floatingObject": {
"isPinned": false,
@@ -132,12 +256,11 @@
}
}
],
"positionClasss": [],
"id": "93b22245-d3a2-42d7-9743-8d8a681842e6",
"id": "8b29fcb2-3b9a-444f-b3b0-05976da9a18f",
"savedPayload": {
"position": {
"x": 30323.705098312483,
"y": 38055.31695488855
"x": 30231,
"y": 38070
},
"targetPosition": {
"x": 30231,
@@ -147,191 +270,7 @@
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
{
"type": "Position Class",
"name": "Business",
"config": "{}",
"project": "Governance",
"positions": [
{
"type": "Position",
"name": "Business Lead",
"config": "{}",
"project": "Governance",
"positions": [],
"positionClasss": [],
"id": "b29c3581-089f-41fd-9421-3e9b518a9c7b",
"savedPayload": {
"position": {
"x": 29866.27390876478,
"y": 38220.39921298053
},
"targetPosition": {
"x": 29988.294901687517,
"y": 37946.33557568774
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
{
"type": "Position",
"name": "Advisor",
"config": "{}",
"project": "Governance",
"positions": [],
"positionClasss": [],
"id": "88a25b7c-df9f-4268-8216-5cb4a90a72dc",
"savedPayload": {
"position": {
"x": 29689.938333077036,
"y": 37977.69411466804
},
"targetPosition": {
"x": 29988.294901687517,
"y": 37946.33557568774
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
],
"positionClasss": [],
"id": "520de537-9ab0-41d6-8bd0-950fe9524e4d",
"savedPayload": {
"position": {
"x": 29988.294901687517,
"y": 37946.33557568774
},
"targetPosition": {
"x": 30231,
"y": 37770
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
{
"type": "Position Class",
"name": "Core Team",
"config": "{}",
"project": "Governance",
"positions": [
{
"type": "Position",
"name": "Member",
"config": "{}",
"project": "Governance",
"positions": [],
"positionClasss": [],
"id": "63bbf7f7-2d71-4075-8498-f09f754d8c0b",
"savedPayload": {
"position": {
"x": 29745.589803375035,
"y": 37417.328848624515
},
"targetPosition": {
"x": 29988.294901687517,
"y": 37593.66442431226
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
],
"positionClasss": [],
"id": "0dc6759d-459b-45ff-83c5-220b7a323f75",
"savedPayload": {
"position": {
"x": 29988.294901687517,
"y": 37593.66442431226
},
"targetPosition": {
"x": 30231,
"y": 37770
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
],
"positions": [
{
"type": "Position",
"name": "Project Lead",
"config": "{\n \"description\": \"\", \"relativeWeight\": 0 \n}",
"project": "Governance",
"positions": [],
"positionClasss": [],
"id": "5f694173-4568-46b2-a52c-4244320919f7",
"savedPayload": {
"position": {
"x": 30323.705098312483,
"y": 37484.68304511145
},
"targetPosition": {
"x": 30231,
"y": 37770
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
@@ -341,6 +280,7 @@
}
}
],
"positions": [],
"id": "50c68665-5da2-48a8-b229-7a1563ae82d2",
"savedPayload": {
"position": {
@@ -354,7 +294,7 @@
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": true,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
@@ -0,0 +1,84 @@
{
"type": "User Profile",
"name": "Bitstudiocoin",
"config": "{\n \"signature\": {\n \"message\": \"Bitstudiocoin\",\n \"messageHash\": \"0xf1cb5f478ccca12afeb83bafdcde74aef98ec8eedd8ce00749f5d83c368231cc\",\n \"v\": \"0x1c\",\n \"r\": \"0x9ea7876e0531fae0e811802d426f1cf1712292766c3046bdebcd2a815d2e12f1\",\n \"s\": \"0x419ca6767dc6299953dc589267effa177d69abeef0699372e55bcea1974c3b00\",\n \"signature\": \"0x9ea7876e0531fae0e811802d426f1cf1712292766c3046bdebcd2a815d2e12f1419ca6767dc6299953dc589267effa177d69abeef0699372e55bcea1974c3b001c\"\n }\n}",
"project": "Governance",
"tokenPowerSwitch": {
"type": "Token Power Switch",
"name": "New Token Power Switch",
"config": "{}",
"project": "Governance",
"tokenPowerSwitch": [],
"id": "cc163c5c-b468-48f9-95d6-f8025ae34797",
"savedPayload": {
"position": {
"x": 13880,
"y": 10816.5
},
"targetPosition": {
"x": 13580,
"y": 10816.5
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"tokensMined": {
"type": "Tokens Mined",
"name": "New Tokens Mined",
"project": "Governance",
"id": "c26295d4-e813-4104-b7b8-148fc766707c",
"savedPayload": {
"position": {
"x": 13280,
"y": 10816.5
},
"targetPosition": {
"x": 13580,
"y": 10816.5
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"id": "05a8fbaf-4e84-4939-800f-b74580517b88",
"savedPayload": {
"position": {
"x": 13580,
"y": 10816.5
},
"targetPosition": {
"x": 13580,
"y": 10816.5
},
"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
@@ -0,0 +1,84 @@
{
"type": "User Profile",
"name": "Lantschirky",
"config": "{\n \"signature\": {\n \"message\": \"Lantschirky\",\n \"messageHash\": \"0x1b79be6842729e220247448ede7b032d95910ab138eb632761c01cf57265f209\",\n \"v\": \"0x1c\",\n \"r\": \"0x2f83a05859796e1ce83a2ac9bf633768525f78b04089c96e972f139e091af335\",\n \"s\": \"0x725596cb459b25940c17ba4061b93c1692e11f84a54a3ce94897fac8168d83e8\",\n \"signature\": \"0x2f83a05859796e1ce83a2ac9bf633768525f78b04089c96e972f139e091af335725596cb459b25940c17ba4061b93c1692e11f84a54a3ce94897fac8168d83e81c\"\n }\n}",
"project": "Governance",
"tokenPowerSwitch": {
"type": "Token Power Switch",
"name": "New Token Power Switch",
"config": "{}",
"project": "Governance",
"tokenPowerSwitch": [],
"id": "344e11e1-2ec0-4f82-a164-0800aea86b5c",
"savedPayload": {
"position": {
"x": 13779,
"y": 10737.5
},
"targetPosition": {
"x": 13479,
"y": 10737.5
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"tokensMined": {
"type": "Tokens Mined",
"name": "New Tokens Mined",
"project": "Governance",
"id": "3e3e188a-b20a-4eed-b825-d04161d121ea",
"savedPayload": {
"position": {
"x": 13179,
"y": 10737.5
},
"targetPosition": {
"x": 13479,
"y": 10737.5
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"id": "c07f1ad2-31cf-4b93-bcf1-182ed1f1b6e6",
"savedPayload": {
"position": {
"x": 13479,
"y": 10737.5
},
"targetPosition": {
"x": 13479,
"y": 10737.5
},
"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
@@ -0,0 +1,84 @@
{
"type": "User Profile",
"name": "SSChana",
"config": "{\n \"signature\": {\n \"message\": \"sschana\",\n \"messageHash\": \"0x2e36e81c4f8ce7d1edb3978a607b9bb45441b8fc4ad367ad87d714a006827aca\",\n \"v\": \"0x1c\",\n \"r\": \"0xebf3d9ba1f1b2305398d3ec18e7f4dc98b6c42a44dad5807bdf415cdad790553\",\n \"s\": \"0x5675ba3e9e60fc692668f1363d27c34a6ea142d7146b25982448d09de3b9ce0e\",\n \"signature\": \"0xebf3d9ba1f1b2305398d3ec18e7f4dc98b6c42a44dad5807bdf415cdad7905535675ba3e9e60fc692668f1363d27c34a6ea142d7146b25982448d09de3b9ce0e1c\"\n }\n}",
"project": "Governance",
"tokenPowerSwitch": {
"type": "Token Power Switch",
"name": "New Token Power Switch",
"config": "{}",
"project": "Governance",
"tokenPowerSwitch": [],
"id": "a8bffe94-3a5a-4700-9615-bee48a07b62b",
"savedPayload": {
"position": {
"x": 35947,
"y": 23090
},
"targetPosition": {
"x": 35647,
"y": 23090
},
"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": "73a440c3-0192-46fd-9b00-ab5f092217aa",
"savedPayload": {
"position": {
"x": 35347,
"y": 23090
},
"targetPosition": {
"x": 35647,
"y": 23090
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 1,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"id": "a01f4099-9db3-4fdb-be41-6297c93c3ded",
"savedPayload": {
"position": {
"x": 35647,
"y": 23090
},
"targetPosition": {
"x": 35647,
"y": 23090
},
"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
@@ -0,0 +1,51 @@
{
"type": "Airdrop Program",
"menuItems": [
{
"action": "Configure",
"actionFunction": "uiObject.configEditor.activate",
"label": "Configure",
"iconPathOn": "configuration",
"iconPathOff": "configuration"
},
{
"action": "Add UI Object",
"actionProject": "Foundations",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "tokensAwarded",
"actionFunction": "payload.executeAction",
"label": "Add Tokens Awarded",
"relatedUiObject": "Tokens Awarded"
},
{
"action": "Delete UI Object",
"actionProject": "Foundations",
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
"editors": {
"config": true
},
"initialValues": {
"config": "{}"
},
"attachingRules": {
"compatibleTypes": "->Token Power Switch->"
},
"addLeftIcons": true,
"level": 1,
"propertyNameAtParent": "airdropProgram",
"childrenNodesProperties": [
{
"name": "tokensAwarded",
"type": "node",
"childType": "Tokens Awarded",
"autoAdd": true
}
]
}
@@ -0,0 +1,51 @@
{
"type": "Github Program",
"menuItems": [
{
"action": "Configure",
"actionFunction": "uiObject.configEditor.activate",
"label": "Configure",
"iconPathOn": "configuration",
"iconPathOff": "configuration"
},
{
"action": "Add UI Object",
"actionProject": "Foundations",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "tokensAwarded",
"actionFunction": "payload.executeAction",
"label": "Add Tokens Awarded",
"relatedUiObject": "Tokens Awarded"
},
{
"action": "Delete UI Object",
"actionProject": "Foundations",
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
"editors": {
"config": true
},
"initialValues": {
"config": "{}"
},
"attachingRules": {
"compatibleTypes": "->Token Power Switch->"
},
"addLeftIcons": true,
"level": 1,
"propertyNameAtParent": "githubProgram",
"childrenNodesProperties": [
{
"name": "tokensAwarded",
"type": "node",
"childType": "Tokens Awarded",
"autoAdd": true
}
]
}
@@ -0,0 +1,79 @@
{
"type": "Influencer Program",
"menuItems": [
{
"action": "Configure",
"actionFunction": "uiObject.configEditor.activate",
"label": "Configure",
"iconPathOn": "configuration",
"iconPathOff": "configuration"
},
{
"action": "Add UI Object",
"actionProject": "Foundations",
"actionFunction": "payload.executeAction",
"label": "Add User Influencer",
"relatedUiObject": "User Influencer"
},
{
"action": "Add UI Object",
"actionProject": "Foundations",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "tokensAwarded",
"actionFunction": "payload.executeAction",
"label": "Add Tokens Awarded",
"relatedUiObject": "Tokens Awarded"
},
{
"action": "Add UI Object",
"actionProject": "Foundations",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "tokensBonus",
"actionFunction": "payload.executeAction",
"label": "Add Tokens Bonus",
"relatedUiObject": "Tokens Bonus"
},
{
"action": "Delete UI Object",
"actionProject": "Foundations",
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
"editors": {
"config": true
},
"initialValues": {
"config": "{}"
},
"attachingRules": {
"compatibleTypes": "->Token Power Switch->"
},
"addLeftIcons": true,
"level": 1,
"propertyNameAtParent": "influencerProgram",
"childrenNodesProperties": [
{
"name": "userInfluencers",
"type": "array",
"childType": "User Influencer",
"autoAdd": false
},
{
"name": "tokensAwarded",
"type": "node",
"childType": "Tokens Awarded",
"autoAdd": true
},
{
"name": "tokensBonus",
"type": "node",
"childType": "Tokens Bonus",
"autoAdd": true
}
]
}
@@ -44,9 +44,6 @@
"attachingRules": {
"compatibleTypes": "->Pools->Pool Class->"
},
"referencingRules": {
"compatibleTypes": "->Position Class->Position->"
},
"propertyNameAtParent": "poolClasses",
"childrenNodesProperties": [
{
@@ -15,6 +15,24 @@
"label": "Add Token Power Switch",
"relatedUiObject": "Token Power Switch"
},
{
"action": "Add UI Object",
"actionProject": "Foundations",
"actionFunction": "payload.executeAction",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "airdropProgram",
"label": "Add Airdrop Program",
"relatedUiObject": "Airdrop Program"
},
{
"action": "Add UI Object",
"actionProject": "Foundations",
"actionFunction": "payload.executeAction",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "githubProgram",
"label": "Add Github Program",
"relatedUiObject": "Github Program"
},
{
"action": "Add UI Object",
"actionProject": "Foundations",
@@ -42,6 +60,15 @@
"label": "Add Mentorship Program",
"relatedUiObject": "Mentorship Program"
},
{
"action": "Add UI Object",
"actionProject": "Foundations",
"actionFunction": "payload.executeAction",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "influencerProgram",
"label": "Add Influencer Program",
"relatedUiObject": "Influencer Program"
},
{
"action": "Add UI Object",
"actionProject": "Foundations",
@@ -98,7 +125,7 @@
"addLeftIcons": true,
"level": 2,
"attachingRules": {
"compatibleTypes": "->User Profile->"
"compatibleTypes": "->User Profile->Token Power Switch->"
},
"propertyNameAtParent": "tokenPowerSwitch",
"childrenNodesProperties": [
@@ -108,6 +135,18 @@
"childType": "Token Power Switch",
"autoAdd": false
},
{
"name": "airdropProgram",
"type": "node",
"childType": "Airdrop Program",
"autoAdd": false
},
{
"name": "githubProgram",
"type": "node",
"childType": "Github Program",
"autoAdd": false
},
{
"name": "referralProgram",
"type": "node",
@@ -126,6 +165,12 @@
"childType": "Mentorship Program",
"autoAdd": false
},
{
"name": "influencerProgram",
"type": "node",
"childType": "Influencer Program",
"autoAdd": false
},
{
"name": "claimsProgram",
"type": "node",
@@ -15,7 +15,7 @@
"addLeftIcons": true,
"level": 2,
"attachingRules": {
"compatibleTypes": "->Referral Program->Mentorship Program->Support Program->Claims Program->Staking Program->"
"compatibleTypes": "->Referral Program->Mentorship Program->Support Program->Claims Program->Staking Program->Github Program->Airdrop Program->Influencer Program->"
},
"propertyNameAtParent": "tokensAwarded"
}
@@ -15,7 +15,7 @@
"addLeftIcons": true,
"level": 2,
"attachingRules": {
"compatibleTypes": "->Referral Program->Mentorship Program->Support Program->Voting Program->"
"compatibleTypes": "->Referral Program->Mentorship Program->Support Program->Voting Program->Influencer Program->"
},
"propertyNameAtParent": "tokensBonus"
}
@@ -0,0 +1,40 @@
{
"type": "User Influencer",
"menuItems": [
{
"action": "Configure",
"actionFunction": "uiObject.configEditor.activate",
"label": "Configure",
"iconPathOn": "configuration",
"iconPathOff": "configuration"
},
{
"action": "Delete UI Object",
"actionProject": "Foundations",
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
"title": [
"Use Reference Parent"
],
"editors": {
"config": true
},
"initialValues": {
"config": "{}"
},
"addLeftIcons": true,
"level": 2,
"attachingRules": {
"compatibleTypes": "->Support Program->"
},
"referencingRules": {
"compatibleTypes": "->User Profile->"
},
"propertyNameAtParent": "userInfluencers"
}
@@ -0,0 +1,192 @@
function newGovernanceFunctionLibraryAirdropProgram() {
let thisObject = {
calculate: calculate
}
return thisObject
function calculate(
pools,
userProfiles
) {
let programPoolTokenReward
/*
In order to be able to calculate the share of the Program Pool for each User Profile,
we need to accumulate all the Airdrop Power that each User Profile at their Program
node has, because with that Power is that each Program node gets a share of the pool.
*/
let accumulatedProgramPower = 0
/* Scan Pools Until finding the Pool for this program*/
for (let i = 0; i < pools.length; i++) {
let poolsNode = pools[i]
programPoolTokenReward = UI.projects.governance.utilities.pools.findPool(poolsNode, "Airdrop-Rewards")
if (programPoolTokenReward !== undefined) { break }
}
if (programPoolTokenReward === undefined || programPoolTokenReward === 0) { return }
for (let i = 0; i < userProfiles.length; i++) {
let userProfile = userProfiles[i]
if (userProfile.tokenPowerSwitch === undefined) { continue }
let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, "Airdrop Program")
if (program === undefined) { continue }
if (program.payload === undefined) { continue }
resetProgram(program)
}
for (let i = 0; i < userProfiles.length; i++) {
let userProfile = userProfiles[i]
if (userProfile.tokenPowerSwitch === undefined) { continue }
let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, "Airdrop Program")
if (program === undefined) { continue }
if (program.payload === undefined) { continue }
validateProgram(program, userProfile)
}
for (let i = 0; i < userProfiles.length; i++) {
let userProfile = userProfiles[i]
if (userProfile.tokenPowerSwitch === undefined) { continue }
let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, "Airdrop Program")
if (program === undefined) { continue }
if (program.payload === undefined) { continue }
if (program.payload.airdropProgram.isActive === false) { continue }
distributeProgram(program)
}
for (let i = 0; i < userProfiles.length; i++) {
let userProfile = userProfiles[i]
if (userProfile.tokenPowerSwitch === undefined) { continue }
let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, "Airdrop Program")
if (program === undefined) { continue }
if (program.payload === undefined) { continue }
if (program.payload.airdropProgram.isActive === false) { continue }
calculateProgram(program)
}
function resetProgram(node) {
if (node === undefined) { return }
if (node.payload === undefined) { return }
if (node.payload.airdropProgram === undefined) {
node.payload.airdropProgram = {
count: 0,
percentage: 0,
outgoingPower: 0,
ownPower: 0,
incomingPower: 0,
awarded: {
tokens: 0,
percentage: 0
}
}
} else {
node.payload.airdropProgram.count = 0
node.payload.airdropProgram.percentage = 0
node.payload.airdropProgram.outgoingPower = 0
node.payload.airdropProgram.ownPower = 0
node.payload.airdropProgram.incomingPower = 0
node.payload.airdropProgram.awarded = {
tokens: 0,
percentage: 0
}
}
}
function validateProgram(node, userProfile) {
/*
This program is not going to run unless the Profile has Tokens, and for
that users needs to execute the setup procedure of signing their Airdrop
username with their private key.
*/
if (
userProfile.payload.blockchainTokens === undefined
) {
node.payload.airdropProgram.isActive = false
userProfile.payload.uiObject.setErrorMessage("You need to setup this profile with the Profile Constructor, to access the Token Power of your account at the Blockchain.")
return
}
/*
Next thing to do is to validate if the airdrop user profile has a star at the Superalgos repository.
*/
let profileSignature = UI.projects.foundations.utilities.nodeConfig.loadConfigProperty(userProfile.payload, 'signature')
if (
profileSignature === undefined
) {
node.payload.airdropProgram.isActive = false
userProfile.payload.uiObject.setErrorMessage("You need to setup this profile with the Profile Constructor, and produce a signature of your Airdrop Username.")
return
}
node.payload.airdropProgram.isActive = true
}
function distributeProgram(programNode) {
if (programNode === undefined || programNode.payload === undefined) { return }
/*
Here we will convert Token Power into Airdrop Power.
As per system rules Airdrop Powar = 1000 SA Tokens.
*/
let programPower = 1000
programNode.payload.airdropProgram.ownPower = programPower
accumulatedProgramPower = accumulatedProgramPower + programPower
}
function calculateProgram(programNode) {
/*
Here we will calculate which share of the Program Pool this user will get in tokens.
To do that, we use the ownPower, to see which proportion of the accumulatedProgramPower
represents.
*/
if (programNode.payload === undefined) { return }
/*
If the accumulatedProgramPower is not grater the amount of tokens at the Program Pool, then
this user will get the exact amount of tokens from the pool as incomingPower he has.
If the accumulatedProgramPower is grater the amount of tokens at the Program Pool, then
the amount ot tokens to be received is a proportional to the share of incomingPower in accumulatedProgramPower.
*/
let totalPowerRewardRatio = accumulatedProgramPower / programPoolTokenReward
if (totalPowerRewardRatio < 1) { totalPowerRewardRatio = 1 }
if (programNode.tokensAwarded === undefined || programNode.tokensAwarded.payload === undefined) {
programNode.payload.uiObject.setErrorMessage("Tokens Awarded Node is needed in order for this Program to get Tokens from the Program Pool.")
return
}
programNode.payload.airdropProgram.awarded.tokens = programNode.payload.airdropProgram.ownPower / totalPowerRewardRatio
drawProgram(programNode)
}
function drawProgram(node) {
if (node.payload !== undefined) {
const ownPowerText = parseFloat(node.payload.airdropProgram.ownPower.toFixed(0)).toLocaleString('en')
node.payload.uiObject.statusAngleOffset = 0
node.payload.uiObject.statusAtAngle = false
node.payload.uiObject.setStatus(ownPowerText + ' Airdrop Power')
}
if (node.tokensAwarded !== undefined && node.tokensAwarded.payload !== undefined) {
const tokensAwardedText = parseFloat(node.payload.airdropProgram.awarded.tokens.toFixed(0)).toLocaleString('en')
const tokensAwardedBTC = ' ≃ ' + UI.projects.governance.utilities.conversions.estimateSATokensInBTC(node.payload.airdropProgram.awarded.tokens | 0) + ' BTC'
node.tokensAwarded.payload.uiObject.valueAngleOffset = 0
node.tokensAwarded.payload.uiObject.valueAtAngle = false
node.tokensAwarded.payload.uiObject.setValue(tokensAwardedText + ' SA Tokens' + tokensAwardedBTC)
node.tokensAwarded.payload.uiObject.statusAngleOffset = 0
node.tokensAwarded.payload.uiObject.statusAtAngle = false
node.tokensAwarded.payload.uiObject.setStatus('For creating your Superalgos profile!')
}
}
}
}
@@ -94,7 +94,7 @@ function newGovernanceFunctionLibraryClaimsProgram() {
if (
node.payload.votingProgram !== undefined &&
node.payload.votingProgram.votes !== undefined
) {
) {
node.payload.claimsProgram = {
count: 0,
votes: 0
@@ -465,13 +465,14 @@ function newGovernanceFunctionLibraryClaimsProgram() {
if (node.tokensAwarded !== undefined && node.tokensAwarded.payload !== undefined) {
const tokensAwardedText = parseFloat(node.payload.claimsProgram.awarded.tokens.toFixed(0)).toLocaleString('en')
const tokensAwardedBTC = ' ≃ ' + UI.projects.governance.utilities.conversions.estimateSATokensInBTC(node.payload.claimsProgram.awarded.tokens | 0) + ' BTC'
node.tokensAwarded.payload.uiObject.valueAngleOffset = 0
node.tokensAwarded.payload.uiObject.valueAtAngle = true
node.tokensAwarded.payload.uiObject.statusAngleOffset = 0
node.tokensAwarded.payload.uiObject.statusAtAngle = true
node.tokensAwarded.payload.uiObject.setValue(tokensAwardedText + ' SA Tokens')
node.tokensAwarded.payload.uiObject.setValue(tokensAwardedText + ' SA Tokens' + tokensAwardedBTC)
node.tokensAwarded.payload.uiObject.setStatus('From ' + node.payload.claimsProgram.count + ' Claims.')
}
}
@@ -531,7 +532,7 @@ function newGovernanceFunctionLibraryClaimsProgram() {
if (originNodeChild === undefined) {
originNodeChild = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(originNode, originNodeChildType)
}
originNodeChild.payload.referenceParent = destinationNodeChild
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(originNodeChild, destinationNodeChild)
scanNodeBranch(originNodeChild, destinationNodeChild)
}
break
@@ -548,7 +549,7 @@ function newGovernanceFunctionLibraryClaimsProgram() {
if (originNodeChild === undefined) {
originNodeChild = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(originNode, originNodeChildType)
}
originNodeChild.payload.referenceParent = destinationNodeChild
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(originNodeChild, destinationNodeChild)
scanNodeBranch(originNodeChild, destinationNodeChild)
}
}
@@ -75,6 +75,13 @@ function newGovernanceFunctionLibraryDistributionProcess() {
userProfiles
)
/*
Run the Influencer Program
*/
UI.projects.governance.functionLibraries.influencerProgram.calculate(
pools,
userProfiles
)
/*
Run the Mentorship Program
*/
UI.projects.governance.functionLibraries.mentorshipProgram.calculate(
@@ -98,11 +105,25 @@ function newGovernanceFunctionLibraryDistributionProcess() {
userProfiles
)
/*
Run the Github Program
*/
UI.projects.governance.functionLibraries.githubProgram.calculate(
pools,
userProfiles
)
/*
Run the Airdrop Program
*/
UI.projects.governance.functionLibraries.airdropProgram.calculate(
pools,
userProfiles
)
/*
After all the programs were ran, we can calculate the tokens mining
calculation each profile.
*/
UI.projects.governance.functionLibraries.tokenMining.calculate(
userProfiles
)
userProfiles
)
}
}
@@ -0,0 +1,218 @@
function newGovernanceFunctionLibraryGithubProgram() {
let thisObject = {
calculate: calculate
}
return thisObject
function calculate(
pools,
userProfiles
) {
let programPoolTokenReward
/*
In order to be able to calculate the share of the Program Pool for each User Profile,
we need to accumulate all the Github Power that each User Profile at their Program
node has, because with that Power is that each Program node gets a share of the pool.
*/
let accumulatedProgramPower = 0
/* Scan Pools Until finding the Pool for this program*/
for (let i = 0; i < pools.length; i++) {
let poolsNode = pools[i]
programPoolTokenReward = UI.projects.governance.utilities.pools.findPool(poolsNode, "Github-Rewards")
if (programPoolTokenReward !== undefined) { break }
}
if (programPoolTokenReward === undefined || programPoolTokenReward === 0) { return }
for (let i = 0; i < userProfiles.length; i++) {
let userProfile = userProfiles[i]
if (userProfile.tokenPowerSwitch === undefined) { continue }
let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, "Github Program")
if (program === undefined) { continue }
if (program.payload === undefined) { continue }
resetProgram(program)
}
for (let i = 0; i < userProfiles.length; i++) {
let userProfile = userProfiles[i]
if (userProfile.tokenPowerSwitch === undefined) { continue }
let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, "Github Program")
if (program === undefined) { continue }
if (program.payload === undefined) { continue }
validateProgram(program, userProfile)
}
for (let i = 0; i < userProfiles.length; i++) {
let userProfile = userProfiles[i]
if (userProfile.tokenPowerSwitch === undefined) { continue }
let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, "Github Program")
if (program === undefined) { continue }
if (program.payload === undefined) { continue }
if (program.payload.githubProgram.isActive === false) { continue }
distributeProgram(program)
}
for (let i = 0; i < userProfiles.length; i++) {
let userProfile = userProfiles[i]
if (userProfile.tokenPowerSwitch === undefined) { continue }
let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, "Github Program")
if (program === undefined) { continue }
if (program.payload === undefined) { continue }
if (program.payload.githubProgram.isActive === false) { continue }
calculateProgram(program)
}
function resetProgram(node) {
if (node === undefined) { return }
if (node.payload === undefined) { return }
if (node.payload.githubProgram === undefined) {
node.payload.githubProgram = {
count: 0,
percentage: 0,
outgoingPower: 0,
ownPower: 0,
incomingPower: 0,
awarded: {
tokens: 0,
percentage: 0
}
}
} else {
node.payload.githubProgram.count = 0
node.payload.githubProgram.percentage = 0
node.payload.githubProgram.outgoingPower = 0
node.payload.githubProgram.ownPower = 0
node.payload.githubProgram.incomingPower = 0
node.payload.githubProgram.awarded = {
tokens: 0,
percentage: 0
}
}
}
function validateProgram(node, userProfile) {
/*
This program is not going to run unless the Profile has Tokens, and for
that users needs to execute the setup procedure of signing their Github
username with their private key.
*/
if (
userProfile.payload.blockchainTokens === undefined
) {
node.payload.githubProgram.isActive = false
userProfile.payload.uiObject.setErrorMessage("You need to setup this profile with the Profile Constructor, to access the Token Power of your account at the Blockchain.")
return
}
/*
Next thing to do is to validate if the github user profile has a star at the Superalgos repository.
*/
let profileSignature = UI.projects.foundations.utilities.nodeConfig.loadConfigProperty(userProfile.payload, 'signature')
if (
profileSignature === undefined
) {
node.payload.githubProgram.isActive = false
userProfile.payload.uiObject.setErrorMessage("You need to setup this profile with the Profile Constructor, and produce a signature of your Github Username.")
return
}
let githubUsername = profileSignature.message
node.payload.githubProgram.starsCount = UI.projects.governance.spaces.userProfileSpace.githubStars.get(githubUsername)
node.payload.githubProgram.watchersCount = UI.projects.governance.spaces.userProfileSpace.githubWatchers.get(githubUsername)
node.payload.githubProgram.forksCount = UI.projects.governance.spaces.userProfileSpace.githubForks.get(githubUsername)
node.payload.githubProgram.engagement = 0
if (node.payload.githubProgram.starsCount > 0) { node.payload.githubProgram.engagement = node.payload.githubProgram.engagement + node.payload.githubProgram.starsCount }
if (node.payload.githubProgram.watchersCount > 0) { node.payload.githubProgram.engagement = node.payload.githubProgram.engagement + node.payload.githubProgram.watchersCount }
if (node.payload.githubProgram.forksCount > 0) { node.payload.githubProgram.engagement = node.payload.githubProgram.engagement + node.payload.githubProgram.forksCount }
if (
node.payload.githubProgram.engagement > 0) {
node.payload.githubProgram.isActive = true
} else {
node.payload.githubProgram.isActive = false
}
}
function distributeProgram(programNode) {
if (programNode === undefined || programNode.payload === undefined) { return }
/*
Here we will convert Token Power into Github Power.
As per system rules Github Powar = 1200 SA Tokens.
*/
let programPower = 3000
programNode.payload.githubProgram.ownPower = programPower
accumulatedProgramPower = accumulatedProgramPower + programPower
}
function calculateProgram(programNode) {
/*
Here we will calculate which share of the Program Pool this user will get in tokens.
To do that, we use the ownPower, to see which proportion of the accumulatedProgramPower
represents.
*/
if (programNode.payload === undefined) { return }
/*
If the accumulatedProgramPower is not grater the amount of tokens at the Program Pool, then
this user will get the exact amount of tokens from the pool as incomingPower he has.
If the accumulatedProgramPower is grater the amount of tokens at the Program Pool, then
the amount ot tokens to be received is a proportional to the share of incomingPower in accumulatedProgramPower.
*/
let totalPowerRewardRatio = accumulatedProgramPower / programPoolTokenReward
if (totalPowerRewardRatio < 1) { totalPowerRewardRatio = 1 }
if (programNode.tokensAwarded === undefined || programNode.tokensAwarded.payload === undefined) {
programNode.payload.uiObject.setErrorMessage("Tokens Awarded Node is needed in order for this Program to get Tokens from the Program Pool.")
return
}
const MAX_ENGAGEMENT = 3
programNode.payload.githubProgram.awarded.tokens = programNode.payload.githubProgram.ownPower / totalPowerRewardRatio * programNode.payload.githubProgram.engagement / MAX_ENGAGEMENT
drawProgram(programNode)
}
function drawProgram(node) {
if (node.payload !== undefined) {
const ownPowerText = parseFloat(node.payload.githubProgram.ownPower.toFixed(0)).toLocaleString('en')
node.payload.uiObject.statusAngleOffset = 0
node.payload.uiObject.statusAtAngle = false
node.payload.uiObject.setStatus(ownPowerText + ' Github Power')
}
if (node.tokensAwarded !== undefined && node.tokensAwarded.payload !== undefined) {
const tokensAwardedText = parseFloat(node.payload.githubProgram.awarded.tokens.toFixed(0)).toLocaleString('en')
const tokensAwardedBTC = ' ≃ ' + UI.projects.governance.utilities.conversions.estimateSATokensInBTC(node.payload.githubProgram.awarded.tokens | 0) + ' BTC'
node.tokensAwarded.payload.uiObject.valueAngleOffset = 0
node.tokensAwarded.payload.uiObject.valueAtAngle = false
node.tokensAwarded.payload.uiObject.setValue(tokensAwardedText + ' SA Tokens' + tokensAwardedBTC)
node.tokensAwarded.payload.uiObject.statusAngleOffset = 0
node.tokensAwarded.payload.uiObject.statusAtAngle = false
let extraText = ''
if (node.payload.githubProgram.starsCount > 0) {
extraText = extraText + ' + 1 Star'
}
if (node.payload.githubProgram.watchersCount > 0) {
extraText = extraText + ' + 1 Watch'
}
if (node.payload.githubProgram.forksCount > 0) {
extraText = extraText + ' + 1 Fork'
}
node.tokensAwarded.payload.uiObject.setStatus('From' + extraText)
}
}
}
}
@@ -0,0 +1,31 @@
function newGovernanceFunctionLibraryInfluencerProgram() {
let thisObject = {
calculate: calculate
}
return thisObject
function calculate(
pools,
userProfiles
) {
UI.projects.governance.utilities.decendentProgram.run(
pools,
userProfiles,
"influencerProgram",
"Influencer-Rewards",
"Influencer Program",
"Influencer Power",
"userInfluencerers",
"User Influencerer"
)
UI.projects.governance.utilities.bonusProgram.run(
pools,
userProfiles,
"influencerProgram",
"Influencer-Bonus",
"Influencer Program"
)
}
}
@@ -17,10 +17,11 @@ function newGovernanceFunctionLibraryStakingProgram() {
*/
let accumulatedProgramPower = 0
/* Scan Pools Until finding the Mentoship-Program Pool */
/* Scan Pools Until finding the Pool for this program*/
for (let i = 0; i < pools.length; i++) {
let poolsNode = pools[i]
programPoolTokenReward = UI.projects.governance.utilities.pools.findPool(poolsNode, "Staking-Rewards")
if (programPoolTokenReward !== undefined) { break }
}
if (programPoolTokenReward === undefined || programPoolTokenReward === 0) { return }
@@ -144,7 +145,7 @@ function newGovernanceFunctionLibraryStakingProgram() {
programNode.payload.uiObject.setErrorMessage("Tokens Awarded Node is needed in order for this Program to get Tokens from the Program Pool.")
return
}
programNode.payload.stakingProgram.awarded.tokens = programNode.payload.stakingProgram.ownPower * totalPowerRewardRatio
programNode.payload.stakingProgram.awarded.tokens = programNode.payload.stakingProgram.ownPower / totalPowerRewardRatio
drawProgram(programNode)
}
@@ -162,11 +163,12 @@ function newGovernanceFunctionLibraryStakingProgram() {
if (node.tokensAwarded !== undefined && node.tokensAwarded.payload !== undefined) {
const tokensAwardedText = parseFloat(node.payload.stakingProgram.awarded.tokens.toFixed(0)).toLocaleString('en')
const tokensAwardedBTC = ' ≃ ' + UI.projects.governance.utilities.conversions.estimateSATokensInBTC(node.payload.stakingProgram.awarded.tokens | 0) + ' BTC'
node.tokensAwarded.payload.uiObject.valueAngleOffset = 0
node.tokensAwarded.payload.uiObject.valueAtAngle = false
node.tokensAwarded.payload.uiObject.setValue(tokensAwardedText + ' SA Tokens')
node.tokensAwarded.payload.uiObject.setValue(tokensAwardedText + ' SA Tokens' + tokensAwardedBTC)
}
}
}
@@ -46,6 +46,16 @@ function newGovernanceFunctionLibraryTokenMining() {
for (let i = 0; i < userProfiles.length; i++) {
let userProfile = userProfiles[i]
if (userProfile.tokenPowerSwitch === undefined) { continue }
let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, "Influencer Program")
if (program === undefined) { continue }
if (program.payload === undefined) { continue }
calculateProgram(userProfile, program, "influencerProgram")
}
for (let i = 0; i < userProfiles.length; i++) {
let userProfile = userProfiles[i]
if (userProfile.tokenPowerSwitch === undefined) { continue }
let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, "Claims Program")
if (program === undefined) { continue }
@@ -83,6 +93,26 @@ function newGovernanceFunctionLibraryTokenMining() {
calculateProgram(userProfile, program, "delegationProgram")
}
for (let i = 0; i < userProfiles.length; i++) {
let userProfile = userProfiles[i]
if (userProfile.tokenPowerSwitch === undefined) { continue }
let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, "Github Program")
if (program === undefined) { continue }
if (program.payload === undefined) { continue }
calculateProgram(userProfile, program, "githubProgram")
}
for (let i = 0; i < userProfiles.length; i++) {
let userProfile = userProfiles[i]
if (userProfile.tokenPowerSwitch === undefined) { continue }
let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, "Airdrop Program")
if (program === undefined) { continue }
if (program.payload === undefined) { continue }
calculateProgram(userProfile, program, "airdropProgram")
}
for (let i = 0; i < userProfiles.length; i++) {
let userProfile = userProfiles[i]
@@ -139,12 +169,13 @@ function newGovernanceFunctionLibraryTokenMining() {
const awarded = parseFloat(userProfile.tokensMined.payload.tokensMined.awarded.toFixed(0)).toLocaleString('en')
const bonus = parseFloat(userProfile.tokensMined.payload.tokensMined.bonus.toFixed(0)).toLocaleString('en')
const total = parseFloat(userProfile.tokensMined.payload.tokensMined.total.toFixed(0)).toLocaleString('en')
const tokensAwardedBTC = ' ≃ ' + UI.projects.governance.utilities.conversions.estimateSATokensInBTC(userProfile.tokensMined.payload.tokensMined.total | 0) + ' BTC'
userProfile.tokensMined.payload.uiObject.valueAngleOffset = 0
userProfile.tokensMined.payload.uiObject.valueAtAngle = true
userProfile.tokensMined.payload.uiObject.setStatus(awarded + ' Awarded + ' + bonus + ' Bonus')
userProfile.tokensMined.payload.uiObject.setValue(total + ' SA Tokens')
userProfile.tokensMined.payload.uiObject.setValue(total + ' SA Tokens' + tokensAwardedBTC)
}
}
}
@@ -46,10 +46,13 @@ function newGovernanceFunctionLibraryTokenPower() {
node.type === 'Referral Program' ||
node.type === 'Mentorship Program' ||
node.type === 'Support Program' ||
node.type === 'Influencer Program' ||
node.type === 'Voting Program' ||
node.type === 'Claims Program' ||
node.type === 'Staking Program' ||
node.type === 'Delegation Program'
node.type === 'Delegation Program' ||
node.type === 'Github Program' ||
node.type === 'Airdrop Program'
) { return }
/*
We will reset token power of children.
@@ -146,10 +149,13 @@ function newGovernanceFunctionLibraryTokenPower() {
node.type === 'Referral Program' ||
node.type === 'Mentorship Program' ||
node.type === 'Support Program' ||
node.type === 'Influencer Program' ||
node.type === 'Voting Program' ||
node.type === 'Claims Program' ||
node.type === 'Staking Program' ||
node.type === 'Delegation Program'
node.type === 'Delegation Program' ||
node.type === 'Github Program' ||
node.type === 'Airdrop Program'
) { return }
/*
We will redistribute token power among children.
@@ -164,17 +164,23 @@ function newGovernanceFunctionLibraryTokens() {
}
function drawTokenFlow(node, tokens, weight) {
if (tokens.toFixed === undefined) { return }
if (node.payload === undefined) { return }
tokens = tokens | 0
let status
if (weight !== undefined && weight !== 0) {
status = parseFloat(tokens.toFixed(0)).toLocaleString('en')
+ ' ' + 'SA Tokens Reward' + ' - ' + 'Weight: ' + (weight * 100).toFixed(2) + " %"
status = 'Reward: ' + tokens.toLocaleString('en')
+ ' ' + 'SA' + ' ≃ ' + UI.projects.governance.utilities.conversions.estimateSATokensInBTC(tokens | 0) + ' BTC ' + ' + Weight: ' + (weight * 100).toFixed(2) + " %"
node.payload.uiObject.statusAngleOffset = 0
node.payload.uiObject.statusAtAngle = true
node.payload.uiObject.setStatus(status)
} else {
status = parseFloat(tokens.toFixed(0)).toLocaleString('en')
+ ' ' + 'SA Tokens Reward'
}
status = 'Reward: ' + tokens.toLocaleString('en')
+ ' ' + 'SA' + ' ≃ ' + UI.projects.governance.utilities.conversions.estimateSATokensInBTC(tokens | 0) + ' BTC '
node.payload.uiObject.statusAngleOffset = 0
node.payload.uiObject.statusAtAngle = false
if (node.payload !== undefined) {
node.payload.uiObject.setStatus(status)
}
}
@@ -447,6 +447,10 @@ function newGovernanceFunctionLibraryVotingProgram() {
}
const votesText = parseFloat(votes.toFixed(0)).toLocaleString('en') + ' ' + voteType
node.payload.uiObject.valueAngleOffset = 0
node.payload.uiObject.valueAtAngle = true
node.payload.uiObject.setValue(votesText)
if (percentage !== undefined) {
@@ -513,7 +517,7 @@ function newGovernanceFunctionLibraryVotingProgram() {
) {
originNode.name = destinationNode.name + ' ' + destinationNode.type + ' ' + ' Vote'
} else {
originNode.name = destinationNode.name + ' ' + destinationNode.type
originNode.name = destinationNode.name
}
let schemaDocument = getSchemaDocument(destinationNode)
@@ -534,7 +538,7 @@ function newGovernanceFunctionLibraryVotingProgram() {
if (originNodeChild === undefined) {
originNodeChild = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(originNode, originNodeChildType)
}
originNodeChild.payload.referenceParent = destinationNodeChild
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(originNodeChild, destinationNodeChild)
scanNodeBranch(originNodeChild, destinationNodeChild)
}
break
@@ -551,7 +555,7 @@ function newGovernanceFunctionLibraryVotingProgram() {
if (originNodeChild === undefined) {
originNodeChild = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(originNode, originNodeChildType)
}
originNodeChild.payload.referenceParent = destinationNodeChild
UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(originNodeChild, destinationNodeChild)
scanNodeBranch(originNodeChild, destinationNodeChild)
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
function newGovernanceGlobalsReports() {
let thisObject = {
REPORTS_SPACE_WIDTH: 1150
REPORTS_SPACE_WIDTH: 1550
}
return thisObject
}
@@ -0,0 +1,113 @@
function newGovernanceReportsAirdrop() {
let thisObject = {
addHTML: addHTML,
initialize: initialize,
finalize: finalize
}
return thisObject
function initialize() {
}
function finalize() {
}
function addHTML(tabIndex, filters) {
/*
Parameters
*/
let table = 'airdrop'
let programName = 'Airdrop Program'
let programPropertyName = 'airdropProgram'
/*
Setup Filters
*/
let filtersObject
if (filters !== undefined) {
try {
filtersObject = JSON.parse(filters)
} catch (err) { }
}
/*
Other Variables
*/
let tableRecords = []
let tableRecordDefinition = {
"properties": [
{
"name": "name",
"label": "User Profile",
"type": "string",
"order": "ascending",
"textAlign": "left"
},
{
"name": "airdropPower",
"label": "Airdrop Power",
"type": "number",
"order": "descending",
"textAlign": "center",
"format": "2 decimals"
},
{
"name": "tokensAwarded",
"label": "Awarded",
"type": "number",
"order": "descending",
"textAlign": "center",
"format": "2 decimals"
}
]
}
/*
Here we get from the workspace all User Profiles.
*/
let userProfiles = UI.projects.foundations.spaces.designSpace.workspace.getHierarchyHeadsByNodeType('User Profile')
/*
Transform the result array into table records.
*/
for (let j = 0; j < userProfiles.length; j++) {
let userProfile = userProfiles[j]
if (userProfile.tokenPowerSwitch === undefined) { continue }
let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, programName)
if (program === undefined) { continue }
if (program.payload === undefined) { continue }
if (program.payload[programPropertyName] === undefined) { continue }
let tableRecord = {
"name": userProfile.name,
"airdropPower": program.payload[programPropertyName].ownPower | 0,
"tokensAwarded": program.payload[programPropertyName].awarded.tokens | 0
}
if (UI.projects.governance.utilities.filters.applyFilters(filters, filtersObject, tableRecord) === true) {
tableRecords.push(tableRecord)
}
}
/*
Get the sorting order for this table.
*/
let sortingOrder = UI.projects.governance.spaces.reportsSpace.tablesSortingOrders[table]
/*
Set the default sorting order for this table.
*/
if (sortingOrder === undefined) {
UI.projects.governance.spaces.reportsSpace.tablesSortingOrders[table] = {
property: 'tokensAwarded',
order: 'descending'
}
sortingOrder = UI.projects.governance.spaces.reportsSpace.tablesSortingOrders[table]
}
return UI.projects.governance.utilities.tables.addHTML(
table,
tableRecords,
tableRecordDefinition,
sortingOrder,
tabIndex
)
}
}
@@ -76,6 +76,7 @@ function newGovernanceReportsClaims() {
let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, programName)
if (program === undefined) { continue }
if (program.payload === undefined) { continue }
if (program.payload[programPropertyName] === undefined) { continue }
let tableRecord = {
"name": userProfile.name,
@@ -76,6 +76,7 @@ function newGovernanceReportsDelegation() {
let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, programName)
if (program === undefined) { continue }
if (program.payload === undefined) { continue }
if (program.payload[programPropertyName] === undefined) { continue }
let tableRecord = {
"name": userProfile.name,
@@ -0,0 +1,140 @@
function newGovernanceReportsGithub() {
let thisObject = {
addHTML: addHTML,
initialize: initialize,
finalize: finalize
}
return thisObject
function initialize() {
}
function finalize() {
}
function addHTML(tabIndex, filters) {
/*
Parameters
*/
let table = 'github'
let programName = 'Github Program'
let programPropertyName = 'githubProgram'
/*
Setup Filters
*/
let filtersObject
if (filters !== undefined) {
try {
filtersObject = JSON.parse(filters)
} catch (err) { }
}
/*
Other Variables
*/
let tableRecords = []
let tableRecordDefinition = {
"properties": [
{
"name": "name",
"label": "User Profile",
"type": "string",
"order": "ascending",
"textAlign": "left"
},
{
"name": "githubPower",
"label": "Github Power",
"type": "number",
"order": "descending",
"textAlign": "center",
"format": "2 decimals"
},
{
"name": "stars",
"label": "Stars",
"type": "number",
"order": "descending",
"textAlign": "center",
"format": "integer"
},
{
"name": "watching",
"label": "Watching",
"type": "number",
"order": "descending",
"textAlign": "center",
"format": "integer"
},
{
"name": "forks",
"label": "Forks",
"type": "number",
"order": "descending",
"textAlign": "center",
"format": "integer"
},
{
"name": "tokensAwarded",
"label": "Awarded",
"type": "number",
"order": "descending",
"textAlign": "center",
"format": "2 decimals"
}
]
}
/*
Here we get from the workspace all User Profiles.
*/
let userProfiles = UI.projects.foundations.spaces.designSpace.workspace.getHierarchyHeadsByNodeType('User Profile')
/*
Transform the result array into table records.
*/
for (let j = 0; j < userProfiles.length; j++) {
let userProfile = userProfiles[j]
if (userProfile.tokenPowerSwitch === undefined) { continue }
let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, programName)
if (program === undefined) { continue }
if (program.payload === undefined) { continue }
if (program.payload[programPropertyName] === undefined) { continue }
let tableRecord = {
"name": userProfile.name,
"githubPower": program.payload[programPropertyName].ownPower | 0,
"stars": program.payload[programPropertyName].starsCount | 0,
"watching": program.payload[programPropertyName].watchersCount | 0,
"forks": program.payload[programPropertyName].forksCount | 0,
"tokensAwarded": program.payload[programPropertyName].awarded.tokens | 0
}
if (UI.projects.governance.utilities.filters.applyFilters(filters, filtersObject, tableRecord) === true) {
tableRecords.push(tableRecord)
}
}
/*
Get the sorting order for this table.
*/
let sortingOrder = UI.projects.governance.spaces.reportsSpace.tablesSortingOrders[table]
/*
Set the default sorting order for this table.
*/
if (sortingOrder === undefined) {
UI.projects.governance.spaces.reportsSpace.tablesSortingOrders[table] = {
property: 'tokensAwarded',
order: 'descending'
}
sortingOrder = UI.projects.governance.spaces.reportsSpace.tablesSortingOrders[table]
}
return UI.projects.governance.utilities.tables.addHTML(
table,
tableRecords,
tableRecordDefinition,
sortingOrder,
tabIndex
)
}
}
@@ -0,0 +1,27 @@
function newGovernanceReportsInfluencers() {
let thisObject = {
addHTML: addHTML,
initialize: initialize,
finalize: finalize
}
return thisObject
function initialize() {
}
function finalize() {
}
function addHTML(tabIndex, filters) {
return UI.projects.governance.utilities.decendentTables.addHTML(
'influencers',
'Influencer Program',
'influencerProgram',
tabIndex,
filters
)
}
}
@@ -45,7 +45,7 @@ function newGovernanceReportsMining() {
"label": "Blockchain Account",
"type": "string",
"order": "ascending",
"textAlign": "left"
"textAlign": "center"
},
{
"name": "tokensAwarded",
@@ -53,7 +53,7 @@ function newGovernanceReportsMining() {
"type": "number",
"order": "descending",
"textAlign": "center",
"format": "2 decimals"
"format": "integer"
},
{
"name": "tokensBonus",
@@ -61,7 +61,7 @@ function newGovernanceReportsMining() {
"type": "number",
"order": "descending",
"textAlign": "center",
"format": "2 decimals"
"format": "integer"
},
{
"name": "tokensMined",
@@ -69,7 +69,15 @@ function newGovernanceReportsMining() {
"type": "number",
"order": "descending",
"textAlign": "center",
"format": "2 decimals"
"format": "integer"
},
{
"name": "minedInBTC",
"label": "Mined In BTC",
"type": "number",
"order": "descending",
"textAlign": "center",
"format": "text"
}
]
}
@@ -93,7 +101,8 @@ function newGovernanceReportsMining() {
"blockchainAccount": userProfile.payload.blockchainAccount,
"tokensAwarded": userProfile.tokensMined.payload.tokensMined.awarded | 0,
"tokensBonus": userProfile.tokensMined.payload.tokensMined.bonus | 0,
"tokensMined": userProfile.tokensMined.payload.tokensMined.total | 0
"tokensMined": userProfile.tokensMined.payload.tokensMined.total | 0,
"minedInBTC": UI.projects.governance.utilities.conversions.estimateSATokensInBTC(userProfile.tokensMined.payload.tokensMined.total | 0)
}
if (UI.projects.governance.utilities.filters.applyFilters(filters, filtersObject, tableRecord) === true) {
@@ -30,7 +30,24 @@ function newGovernanceReportsReportsPage() {
buildHTML()
function buildHTML() {
const tabs = ['Profiles', 'Referrals', 'Supporters', 'Mentors', 'Claims', 'Votes', 'Staking', 'Delegation', 'Pools', 'Assets', 'Features', 'Positions', 'Mining']
const tabs = [
'Profiles',
'Airdrop',
'Github',
'Referrals',
'Supporters',
'Mentors',
'Influencers',
'Claims',
'Votes',
'Staking',
'Delegation',
'Pools',
'Assets',
'Features',
'Positions',
'Mining'
]
let HTML = ''
HTML = HTML + '<section id="governance-report-page-div" class="governance-search-page-container">'
HTML = HTML + UI.projects.governance.spaces.reportsSpace.filtersHeader.addFilterHeader()
@@ -62,74 +79,92 @@ function newGovernanceReportsReportsPage() {
resultCounter = response.resultCounter
break
}
case 'Airdrop': {
let response = UI.projects.governance.spaces.reportsSpace.airdrop.addHTML(2, filters)
HTML = HTML + response.HTML
resultCounter = response.resultCounter
break
}
case 'Github': {
let response = UI.projects.governance.spaces.reportsSpace.github.addHTML(3, filters)
HTML = HTML + response.HTML
resultCounter = response.resultCounter
break
}
case 'Referrals': {
let response = UI.projects.governance.spaces.reportsSpace.referrals.addHTML(2, filters)
let response = UI.projects.governance.spaces.reportsSpace.referrals.addHTML(4, filters)
HTML = HTML + response.HTML
resultCounter = response.resultCounter
break
}
case 'Supporters': {
let response = UI.projects.governance.spaces.reportsSpace.supports.addHTML(3, filters)
let response = UI.projects.governance.spaces.reportsSpace.supports.addHTML(5, filters)
HTML = HTML + response.HTML
resultCounter = response.resultCounter
break
}
case 'Mentors': {
let response = UI.projects.governance.spaces.reportsSpace.mentors.addHTML(4, filters)
let response = UI.projects.governance.spaces.reportsSpace.mentors.addHTML(6, filters)
HTML = HTML + response.HTML
resultCounter = response.resultCounter
break
}
case 'Influencers': {
let response = UI.projects.governance.spaces.reportsSpace.influencers.addHTML(7, filters)
HTML = HTML + response.HTML
resultCounter = response.resultCounter
break
}
case 'Claims': {
let response = UI.projects.governance.spaces.reportsSpace.claims.addHTML(5, filters)
let response = UI.projects.governance.spaces.reportsSpace.claims.addHTML(8, filters)
HTML = HTML + response.HTML
resultCounter = response.resultCounter
break
}
case 'Votes': {
let response = UI.projects.governance.spaces.reportsSpace.votes.addHTML(6, filters)
let response = UI.projects.governance.spaces.reportsSpace.votes.addHTML(9, filters)
HTML = HTML + response.HTML
resultCounter = response.resultCounter
break
}
case 'Staking': {
let response = UI.projects.governance.spaces.reportsSpace.staking.addHTML(7, filters)
let response = UI.projects.governance.spaces.reportsSpace.staking.addHTML(10, filters)
HTML = HTML + response.HTML
resultCounter = response.resultCounter
break
}
case 'Delegation': {
let response = UI.projects.governance.spaces.reportsSpace.delegation.addHTML(8, filters)
let response = UI.projects.governance.spaces.reportsSpace.delegation.addHTML(11, filters)
HTML = HTML + response.HTML
resultCounter = response.resultCounter
break
}
case 'Pools': {
let response = UI.projects.governance.spaces.reportsSpace.pools.addHTML(9, filters)
let response = UI.projects.governance.spaces.reportsSpace.pools.addHTML(12, filters)
HTML = HTML + response.HTML
resultCounter = response.resultCounter
break
}
case 'Assets': {
let response = UI.projects.governance.spaces.reportsSpace.assets.addHTML(10, filters)
let response = UI.projects.governance.spaces.reportsSpace.assets.addHTML(13, filters)
HTML = HTML + response.HTML
resultCounter = response.resultCounter
break
}
case 'Features': {
let response = UI.projects.governance.spaces.reportsSpace.features.addHTML(11, filters)
let response = UI.projects.governance.spaces.reportsSpace.features.addHTML(14, filters)
HTML = HTML + response.HTML
resultCounter = response.resultCounter
break
}
case 'Positions': {
let response = UI.projects.governance.spaces.reportsSpace.positions.addHTML(12, filters)
let response = UI.projects.governance.spaces.reportsSpace.positions.addHTML(15, filters)
HTML = HTML + response.HTML
resultCounter = response.resultCounter
break
}
case 'Mining': {
let response = UI.projects.governance.spaces.reportsSpace.mining.addHTML(13, filters)
let response = UI.projects.governance.spaces.reportsSpace.mining.addHTML(16, filters)
HTML = HTML + response.HTML
resultCounter = response.resultCounter
break
@@ -11,10 +11,13 @@ function newGobernanceReportsSpace() {
referrals: undefined,
supports: undefined,
mentors: undefined,
influencers: undefined,
claims: undefined,
votes: undefined,
staking: undefined,
delegations: undefined,
github: undefined,
airdrop: undefined,
pools: undefined,
assets: undefined,
features: undefined,
@@ -73,6 +76,9 @@ function newGobernanceReportsSpace() {
thisObject.mentors.finalize()
thisObject.mentors = undefined
thisObject.influencers.finalize()
thisObject.influencers = undefined
thisObject.claims.finalize()
thisObject.claims = undefined
@@ -85,6 +91,12 @@ function newGobernanceReportsSpace() {
thisObject.delegation.finalize()
thisObject.delegation = undefined
thisObject.github.finalize()
thisObject.github = undefined
thisObject.airdrop.finalize()
thisObject.airdrop = undefined
thisObject.pools.finalize()
thisObject.pools = undefined
@@ -104,6 +116,9 @@ function newGobernanceReportsSpace() {
}
function initialize() {
/*
If the workspace is not related to governance, then we exit the Intialize Function
*/
let resultsArary = UI.projects.foundations.spaces.designSpace.workspace.getHierarchyHeadsByNodeType('User Profile')
if (resultsArary.length === 0) { return }
@@ -123,11 +138,14 @@ function newGobernanceReportsSpace() {
thisObject.userProfiles = newGovernanceReportsUserProfiles()
thisObject.referrals = newGovernanceReportsReferrals()
thisObject.supports = newGovernanceReportsSupports()
thisObject.influencers = newGovernanceReportsInfluencers()
thisObject.mentors = newGovernanceReportsMentors()
thisObject.claims = newGovernanceReportsClaims()
thisObject.votes = newGovernanceReportsVotes()
thisObject.staking = newGovernanceReportsStaking()
thisObject.delegation = newGovernanceReportsDelegation()
thisObject.github = newGovernanceReportsGithub()
thisObject.airdrop = newGovernanceReportsAirdrop()
thisObject.pools = newGovernanceReportsPools()
thisObject.assets = newGovernanceReportsAssets()
thisObject.features = newGovernanceReportsFeatures()
@@ -139,11 +157,15 @@ function newGobernanceReportsSpace() {
thisObject.filtersHeader.initialize()
thisObject.userProfiles.initialize()
thisObject.referrals.initialize()
thisObject.supports.initialize()
thisObject.mentors.initialize()
thisObject.influencers.initialize()
thisObject.claims.initialize()
thisObject.votes.initialize()
thisObject.staking.initialize()
thisObject.delegation.initialize()
thisObject.github.initialize()
thisObject.airdrop.initialize()
thisObject.pools.initialize()
thisObject.assets.initialize()
thisObject.features.initialize()
@@ -45,16 +45,8 @@ function newGovernanceReportsStaking() {
"textAlign": "left"
},
{
"name": "ownPower",
"label": "Own Power",
"type": "number",
"order": "descending",
"textAlign": "center",
"format": "2 decimals"
},
{
"name": "incoming",
"label": "Incoming",
"name": "stakingPower",
"label": "Staking Power",
"type": "number",
"order": "descending",
"textAlign": "center",
@@ -84,11 +76,11 @@ function newGovernanceReportsStaking() {
let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, programName)
if (program === undefined) { continue }
if (program.payload === undefined) { continue }
if (program.payload[programPropertyName] === undefined) { continue }
let tableRecord = {
"name": userProfile.name,
"ownPower": program.payload[programPropertyName].ownPower | 0,
"incoming": program.payload[programPropertyName].incomingPower | 0,
"stakingPower": program.payload[programPropertyName].ownPower | 0,
"tokensAwarded": program.payload[programPropertyName].awarded.tokens | 0
}
@@ -84,6 +84,7 @@ function newGovernanceReportsVotes() {
let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, programName)
if (program === undefined) { continue }
if (program.payload === undefined) { continue }
if (program.payload[programPropertyName] === undefined) { continue }
let tableRecord = {
"name": userProfile.name,
@@ -2,6 +2,9 @@ function newGovernanceUserProfileSpace() {
const MODULE_NAME = 'User Profile Space'
let thisObject = {
githubStars: undefined,
githubWatchers: undefined,
githubForks: undefined,
container: undefined,
physics: physics,
draw: draw,
@@ -17,13 +20,126 @@ function newGovernanceUserProfileSpace() {
let waitingForResponses = 0
let timer = 0
thisObject.githubStars = new Map()
thisObject.githubWatchers = new Map()
thisObject.githubForks = new Map()
return thisObject
function initialize() {
/*
Here we will get a list of all github usernames who have a star or fork and are watching the
Superalgos Repository. This will later be used to know which user profiles are participating
at the Github Program.
*/
/*
If the workspace is not related to governance, then we exit the Intialize Function
*/
let resultsArary = UI.projects.foundations.spaces.designSpace.workspace.getHierarchyHeadsByNodeType('User Profile')
if (resultsArary.length === 0) { return }
/* Find the Username and Password */
let apisNode = UI.projects.foundations.spaces.designSpace.workspace.getHierarchyHeadByNodeType('APIs')
if (apisNode === undefined) {
UI.projects.education.spaces.docsSpace.navigateTo('Foundations', 'Topic', 'App Error - Github Credentials Missing', 'Anchor Github Credentials Missing')
UI.projects.education.spaces.docsSpace.sidePanelTab.open()
return
}
if (apisNode.githubAPI === undefined) {
UI.projects.education.spaces.docsSpace.navigateTo('Foundations', 'Topic', 'App Error - Github Credentials Missing', 'Anchor Github Credentials Missing')
UI.projects.education.spaces.docsSpace.sidePanelTab.open()
return
}
let config = JSON.parse(apisNode.githubAPI.config)
if (config.username === undefined || config.username === "") {
UI.projects.education.spaces.docsSpace.navigateTo('Foundations', 'Topic', 'App Error - Github Credentials Missing', 'Anchor Github Credentials Missing')
UI.projects.education.spaces.docsSpace.sidePanelTab.open()
return
}
if (config.token === undefined || config.token === "") {
UI.projects.education.spaces.docsSpace.navigateTo('Foundations', 'Topic', 'App Error - Github Credentials Missing', 'Anchor Github Credentials Missing')
UI.projects.education.spaces.docsSpace.sidePanelTab.open()
return
}
requestStars()
function requestStars() {
httpRequest(
undefined,
'Gov/getGithubStars/' +
'Superalgos' + '/' +
config.username + '/' +
config.token
, onGithubStarsResponse)
}
function requestWatchers() {
httpRequest(
undefined,
'Gov/getGithubWatchers/' +
'Superalgos' + '/' +
config.username + '/' +
config.token
, onGithubWatchersResponse)
}
function requestForks() {
httpRequest(
undefined,
'Gov/getGithubForks/' +
'Superalgos' + '/' +
config.username + '/' +
config.token
, onGithubForksResponse)
}
function onGithubStarsResponse(err, githubData) {
//console.log(githubData)
/* Lets check the result of the call through the http interface */
let githubStarsArray = JSON.parse(githubData)
for (let i = 0; i < githubStarsArray.length; i++) {
let githubUsername = githubStarsArray[i]
thisObject.githubStars.set(githubUsername, 1)
}
requestWatchers()
}
function onGithubWatchersResponse(err, githubData) {
//console.log(githubData)
/* Lets check the result of the call through the http interface */
let githubWatchersArray = JSON.parse(githubData)
for (let i = 0; i < githubWatchersArray.length; i++) {
let githubUsername = githubWatchersArray[i]
thisObject.githubWatchers.set(githubUsername, 1)
}
requestForks()
}
function onGithubForksResponse(err, githubData) {
//console.log(githubData)
/* Lets check the result of the call through the http interface */
let githubForksArray = JSON.parse(githubData)
for (let i = 0; i < githubForksArray.length; i++) {
let githubUsername = githubForksArray[i]
thisObject.githubForks.set(githubUsername, 1)
}
}
}
function finalize() {
thisObject.githubStars = undefined
thisObject.container.finalize()
thisObject.container = undefined
}
@@ -20,10 +20,11 @@ function newGovernanceUtilitiesBonusProgram() {
*/
let accumulatedProgramPower = 0
/* Scan Pools Until finding the Mentoship-Program Pool */
/* Scan Pools Until finding the Pool for this program*/
for (let i = 0; i < pools.length; i++) {
let poolsNode = pools[i]
programPoolTokenReward = UI.projects.governance.utilities.pools.findPool(poolsNode, programCodeName)
if (programPoolTokenReward !== undefined) { break }
}
if (programPoolTokenReward === undefined || programPoolTokenReward === 0) { return }
@@ -113,7 +114,7 @@ function newGovernanceUtilitiesBonusProgram() {
be used to compute Bonuses.
*/
programNode.payload[programPropertyName].bonusPower = programNode.payload[programPropertyName].usedPower | 0
accumulatedProgramPower = accumulatedProgramPower + programNode.payload[programPropertyName].bonusPower
accumulatedProgramPower = accumulatedProgramPower + programNode.payload[programPropertyName].bonusPower
}
function calculateProgram(programNode) {
@@ -137,7 +138,7 @@ function newGovernanceUtilitiesBonusProgram() {
programNode.payload.uiObject.setErrorMessage("Tokens Bonus Node is needed in order for this Program to get Tokens from the Bonus Program Pool.")
return
}
programNode.payload[programPropertyName].bonus.tokens = programNode.payload[programPropertyName].bonusPower * totalPowerRewardRatio
programNode.payload[programPropertyName].bonus.tokens = programNode.payload[programPropertyName].bonusPower / totalPowerRewardRatio
drawProgram(programNode)
}
@@ -146,11 +147,12 @@ function newGovernanceUtilitiesBonusProgram() {
if (node.tokensBonus !== undefined && node.tokensBonus.payload !== undefined) {
const tokensBonusText = parseFloat(node.payload[programPropertyName].bonus.tokens.toFixed(0)).toLocaleString('en')
const tokensAwardedBTC = ' ≃ ' + UI.projects.governance.utilities.conversions.estimateSATokensInBTC(node.payload[programPropertyName].bonus.tokens | 0) + ' BTC'
node.tokensBonus.payload.uiObject.valueAngleOffset = 0
node.tokensBonus.payload.uiObject.valueAtAngle = true
node.tokensBonus.payload.uiObject.setValue(tokensBonusText + ' SA Tokens')
node.tokensBonus.payload.uiObject.setValue(tokensBonusText + ' SA Tokens' + tokensAwardedBTC)
}
}
}
@@ -37,7 +37,15 @@ function newGovernanceUtilitiesCommonTables() {
"type": "number",
"order": "descending",
"textAlign": "center",
"format": "2 decimals"
"format": "integer"
},
{
"name": "rewardInBTC",
"label": "Reward In BTC",
"type": "number",
"order": "descending",
"textAlign": "center",
"format": "8 decimals"
},
{
"name": "weight",
@@ -66,12 +74,27 @@ function newGovernanceUtilitiesCommonTables() {
*/
for (let j = 0; j < nodes.length; j++) {
let node = nodes[j]
let name = ''
if (node.payload.parentNode !== undefined) {
if (node.payload.parentNode.payload.parentNode !== undefined) {
if (node.payload.parentNode.payload.parentNode.payload.parentNode !== undefined) {
if (node.payload.parentNode.payload.parentNode.payload.parentNode.payload.parentNode !== undefined) {
name = name + node.payload.parentNode.payload.parentNode.payload.parentNode.payload.parentNode.name + ' - '
}
name = name + node.payload.parentNode.payload.parentNode.payload.parentNode.name + ' - '
}
name = name + node.payload.parentNode.payload.parentNode.name + ' - '
}
name = name + node.payload.parentNode.name + ' - '
}
name = name + node.name
let tableRecord = {
"name": node.payload.parentNode.name + ' - ' + node.name,
"name": name,
"tokensReward": node.payload.tokens | 0,
"rewardInBTC": UI.projects.governance.utilities.conversions.estimateSATokensInBTC(node.payload.tokens | 0),
"weight": node.payload.weight,
"weightPower": node.payload.votingProgram.votes
"weightPower": node.payload.votingProgram.votes | 0
}
if (UI.projects.governance.utilities.filters.applyFilters(filters, filtersObject, tableRecord) === true) {
@@ -0,0 +1,14 @@
function newGovernanceUtilitiesConversions () {
let thisObject = {
estimateSATokensInBTC: estimateSATokensInBTC
}
return thisObject
function estimateSATokensInBTC(SATokens) {
const SA_BTC_BASELINE_EXCHANGE_RATE = 1.5 / 1000000
const BTC = SATokens * SA_BTC_BASELINE_EXCHANGE_RATE
return BTC.toFixed(3)
}
}
@@ -35,10 +35,11 @@ function newGovernanceUtilitiesDecendentProgram() {
*/
let accumulatedIncomingProgramPower = 0
/* Scan Pools Until finding the Mentoship-Program Pool */
/* Scan Pools Until finding the Pool for this program*/
for (let i = 0; i < pools.length; i++) {
let poolsNode = pools[i]
programPoolTokenReward = UI.projects.governance.utilities.pools.findPool(poolsNode, programCodeName)
if (programPoolTokenReward !== undefined) { break }
}
if (programPoolTokenReward === undefined || programPoolTokenReward === 0) { return }
/*
@@ -373,7 +374,7 @@ function newGovernanceUtilitiesDecendentProgram() {
programNode.payload.uiObject.setErrorMessage("Tokens Awarded Node is needed in order for this Program to get Tokens from the Program Pool.")
return
}
programNode.payload[programPropertyName].awarded.tokens = programNode.payload[programPropertyName].incomingPower * totalPowerRewardRatio
programNode.payload[programPropertyName].awarded.tokens = programNode.payload[programPropertyName].incomingPower / totalPowerRewardRatio
drawProgram(programNode)
}
@@ -414,13 +415,14 @@ function newGovernanceUtilitiesDecendentProgram() {
if (node.tokensAwarded !== undefined && node.tokensAwarded.payload !== undefined) {
const tokensAwardedText = parseFloat(node.payload[programPropertyName].awarded.tokens.toFixed(0)).toLocaleString('en')
const tokensAwardedBTC = ' ≃ ' + UI.projects.governance.utilities.conversions.estimateSATokensInBTC(node.payload[programPropertyName].awarded.tokens | 0) + ' BTC'
node.tokensAwarded.payload.uiObject.statusAngleOffset = 0
node.tokensAwarded.payload.uiObject.statusAtAngle = true
node.tokensAwarded.payload.uiObject.valueAngleOffset = 0
node.tokensAwarded.payload.uiObject.valueAtAngle = true
node.tokensAwarded.payload.uiObject.setValue(tokensAwardedText + ' SA Tokens')
node.tokensAwarded.payload.uiObject.setValue(tokensAwardedText + ' SA Tokens' + tokensAwardedBTC)
node.tokensAwarded.payload.uiObject.setStatus('From ' + node.payload[programPropertyName].count + ' Descendants.')
}
}
@@ -90,6 +90,7 @@ function newGovernanceUtilitiesDecendentTables() {
let program = UI.projects.governance.utilities.validations.onlyOneProgram(userProfile, programName)
if (program === undefined) { continue }
if (program.payload === undefined) { continue }
if (program.payload[programPropertyName] === undefined) { continue }
let tableRecord = {
"name": userProfile.name,
@@ -15,6 +15,7 @@ function newGovernanceUtilitiesPools() {
function findTokensAtPool(node, codeNameToFind) {
if (node === undefined) { return }
if (node.payload === undefined) { return }
if (tokens !== undefined) { return }
/*
This function allows us to find a Pool within a Pool hierarchy that
has a give codeName config property.
+2 -2
View File
@@ -141,11 +141,11 @@ function newGovernanceUtilitiesTables() {
break
}
case 'integer': {
value = parseFloat(value.toFixed(0)).toLocaleString('en')
value = parseFloat(value | 0).toLocaleString('en')
break
}
case '2 decimals': {
value = parseFloat(value.toFixed(2)).toLocaleString('en')
value = parseFloat(value | 2).toLocaleString('en')
break
}
case 'percentage': {
+90 -70
View File
@@ -965,6 +965,76 @@
]
}
},
{
"name": "Education",
"propertyName": "education",
"UI": {
"globals": [
{
"name": "Docs",
"propertyName": "docs",
"functionName": "newEducationGlobalsDocs"
}
],
"functionLibraries": [],
"utilities": [
{
"name": "Languages",
"propertyName": "languages",
"functionName": "newEducationUtilitiesLanguages"
},
{
"name": "Docs",
"propertyName": "docs",
"functionName": "newEducationUtilitiesDocs"
}
],
"spaces": [
{
"name": "Docs Space",
"folderName": "Docs-Space",
"propertyName": "docsSpace",
"functionName": "newEducationDocSpace",
"initializationIndex": 0,
"animationPhysicsIndex": 0,
"animationDrawIndex": 0,
"onMouseWheelIndex": 0,
"onMouseOverIndex": 0,
"onMouseClickIndex": 0,
"onMouseDownIndex": 0
},
{
"name": "Tutorial Space",
"folderName": "Tutorial-Space",
"propertyName": "tutorialSpace",
"functionName": "newEducationTutorialSpace",
"initializationIndex": 1,
"animationPhysicsIndex": 1,
"animationDrawIndex": 1,
"onMouseWheelIndex": 1,
"onMouseOverIndex": 1,
"onMouseClickIndex": 1,
"onMouseDownIndex": 1
}
]
},
"TS": {
"globals": [],
"functionLibraries": [],
"utilities": [
{
"name": "Docs Functions",
"propertyName": "docsFunctions",
"functionName": "newEducationUtilitiesDocsFunctions",
"fileName": "DocsFunctions.js"
}
],
"taskModules": [],
"processModules": [],
"botModules": []
},
"CL": {}
},
{
"name": "Governance",
"propertyName": "governance",
@@ -1037,6 +1107,11 @@
"propertyName": "supportProgram",
"functionName": "newGovernanceFunctionLibrarySupportProgram"
},
{
"name": "Influencer Program",
"propertyName": "influencerProgram",
"functionName": "newGovernanceFunctionLibraryInfluencerProgram"
},
{
"name": "Mentorship Program",
"propertyName": "mentorshipProgram",
@@ -1051,6 +1126,16 @@
"name": "Profile Constructor",
"propertyName": "profileConstructor",
"functionName": "newGovernanceFunctionLibraryProfileConstructor"
},
{
"name": "Github Program",
"propertyName": "githubProgram",
"functionName": "newGovernanceFunctionLibraryGithubProgram"
},
{
"name": "Airdrop Program",
"propertyName": "airdropProgram",
"functionName": "newGovernanceFunctionLibraryAirdropProgram"
}
],
"utilities": [
@@ -1093,6 +1178,11 @@
"name": "Filters",
"propertyName": "filters",
"functionName": "newGovernanceUtilitiesFilters"
},
{
"name": "Conversions",
"propertyName": "conversions",
"functionName": "newGovernanceUtilitiesConversions"
}
],
"spaces": [
@@ -1133,75 +1223,5 @@
"Features",
"Positions"
]
},
{
"name": "Education",
"propertyName": "education",
"UI": {
"globals": [
{
"name": "Docs",
"propertyName": "docs",
"functionName": "newEducationGlobalsDocs"
}
],
"functionLibraries": [],
"utilities": [
{
"name": "Languages",
"propertyName": "languages",
"functionName": "newEducationUtilitiesLanguages"
},
{
"name": "Docs",
"propertyName": "docs",
"functionName": "newEducationUtilitiesDocs"
}
],
"spaces": [
{
"name": "Docs Space",
"folderName": "Docs-Space",
"propertyName": "docsSpace",
"functionName": "newEducationDocSpace",
"initializationIndex": 0,
"animationPhysicsIndex": 0,
"animationDrawIndex": 0,
"onMouseWheelIndex": 0,
"onMouseOverIndex": 0,
"onMouseClickIndex": 0,
"onMouseDownIndex": 0
},
{
"name": "Tutorial Space",
"folderName": "Tutorial-Space",
"propertyName": "tutorialSpace",
"functionName": "newEducationTutorialSpace",
"initializationIndex": 1,
"animationPhysicsIndex": 1,
"animationDrawIndex": 1,
"onMouseWheelIndex": 1,
"onMouseOverIndex": 1,
"onMouseClickIndex": 1,
"onMouseDownIndex": 1
}
]
},
"TS": {
"globals": [],
"functionLibraries": [],
"utilities": [
{
"name": "Docs Functions",
"propertyName": "docsFunctions",
"functionName": "newEducationUtilitiesDocsFunctions",
"fileName": "DocsFunctions.js"
}
],
"taskModules": [],
"processModules": [],
"botModules": []
},
"CL": {}
}
]
+114 -427
View File
@@ -1,4 +1,4 @@
# Superalgos Beta 10
# Superalgos Beta 11
![contributors](https://img.shields.io/github/contributors-anon/Superalgos/Superalgos?label=Contributors)
@@ -7,428 +7,125 @@
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 the ultimate market research and trading automation platform. The software is contributor-centric, built by contributors, for contributors. It is also free and open-source.
> 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!
![superalgos-readme](https://user-images.githubusercontent.com/13994516/106380124-844d8980-63b0-11eb-9bd9-4f977b6c183b.gif)
# 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/community-business.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
**A.** After the Superalgos directory has been installed, the final step of installation is to set up the necessary node dependencies.
**B.** In the same command prompt or terminal you just used, type 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.
## 5. Migrating from Superalgos Beta 9
### Changes in Dependency Managment
**IMPORTANT:** Superalgos no longer contains the node dependencies needed to run within this repository. Follow these steps to make sure your installation updates correctly.
**A.** Check to make sure 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.
**B.** Launch your old Superalgos instance and run `app.update` to gather the Beta 10 update.
**C.** Then close the UI and shutdown the Client.
**D.** Open a fresh terminal or command prompt and navigate to your Superalgos directory.
**E.** Enter the following command:
```
node setup
```
Then wait until you are able to type within the terminal again.
**NOTE FOR USERS RUNNING IN HEADLESS ENVIRONMENT:** You will need to add the `noShortcuts` flag while running `node setup` to suppress installing GUI shortcuts. To do this type:
```
node setup noShortcuts
```
### Refactoring
In order to migrate your workspaces to Beta 10, you will need to open My-Workspaces folder with an IDE like VS Code and do some refactorings. The following refactoring has been done over the codebase and all plugins of every type. For your workspaces to be ported, you will need to refactor the contents of your My-Workspaces folder and any plugins of your own as well.
| Find | Replace With |
| :----------------: | :---------------------: |
| Multi-Period | Multi-Time-Frame |
| Multi Period | Multi Time Frame |
| MultiPeriod | MultiTimeFrame |
| multiPeriod | multiTimeFrame |
| @Period | @TimeFrame |
| periodName | timeFrameLabel |
| Muti-Period-Market | Multi-Time-Frame-Market |
Your refactoring needs to include Folder Names. You will find several folders to rename at the Data-Storage folder structure. Because of the changes derived from splitting the Master Data Mine into several different Data Mines, you will probably need to reprocess all your indicators.
An easy way to deal with all this is to:
1. Delete the Log-Files folder.
2. At Data Storage, delete all except Masters / Exchange Raw Data and Masters / Candles Volumes. This will prevent you from downloading all data again and building all candles agains, which is the most time consuming process. The rest of the indicators you can then reprocess.
# 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.
![run-the-system-01](https://user-images.githubusercontent.com/13994516/107037804-e5fc6200-67bb-11eb-82f2-d0f40247fa14.gif)
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
![enable-ubuntu-shortcut](https://user-images.githubusercontent.com/55707292/117553927-f0780300-b019-11eb-9e36-46b509653283.gif)
**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.
![allow-launching](https://user-images.githubusercontent.com/55707292/117553933-fcfc5b80-b019-11eb-872c-4fad81b184d2.gif)
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 &mdash; 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.
![welcome-tutorial-00](https://user-images.githubusercontent.com/13994516/107038771-4a6bf100-67bd-11eb-92e0-353525a972a9.gif)
**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.
Follow the link to [INSTALL.md](https://github.com/Superalgos/Superalgos/blob/develop/INSTALL.md).
# What is Superalgos?
Superalgos is a platform to automate crypto-trading. It is implemented as a Node JS Client + Web App that runs on your hardware and scales from a single Raspberry Pi to a Trading Farm. Superalgos is **Free** and **Open-Source**.
## Superalgos is a token-incentivized open-source project.
## Superalgos Features
The project incentivizes users to continuously improve Superalgos. Users contribute to the codebase, to the library of trading intelligence, and to project development in general -- and earn SA tokens for their contributions. Providing free, high-quality, real-time trading-intelligence over the Superalgos peer-to-peer network is a key activity, also incentivized.
## Superalgos is an open-network project built on top of the Internet + Bitcoin + Lighting open networks.
This means that the Superalgos open network target audience is 8 billion people and that payments of products and services offered through the Superalgos Network are done with bitcoin over the Lighting Network.
## Superalgos is a free and open trading-intelligence network anyone can plug-in to emit or consume real-time trading signals.
Signals are cryptographically signed by trading intelligence producers and backed by their token holdings and reputation. The Superalgos p2p Network sorts how signals are distributed, prioritizing signals-consumers with the biggest token holdings.
## Superalgos has the ultimate scalable and defensible business model.
* Everything is free and open source for its user base: trading automation tools + mobile apps for consuming real-time trading intelligence.
* The Superalgos algo-traders community members compete with each other to mine SA tokens by producing high quality real-time trading intelligence which is consumed for free by the Superalgos user base to automate their trading.
* Trading Intelligence is distributed via a protocol-incentivized p2p network with no network fees.
* The long term viability is guaranteed since the business model can not be disrupted.
## Superalgos massive adoption is highly likely since all friction has been removed.
* Users don’t need to pay for the mobile app to consume trading intelligence.
* Users don’t need to pay for high-quality trading intelligence.
* Algo-traders don’t need to pay for the tools to produce trading intelligence.
* Real-time trading Intelligence does not need to be bought or sold. The Superalgos Project buys real-time trading intelligence (via minting new tokens) from the algo-traders community and distributes it for free to all the user base via its p2p network.
* The Superalgos SA token does not need to be spent to be used, avoiding the need to pay blockchain fees. Only it’s balance is relevant to backup the user profile’s reputation and skin on the game, and in the case of real-time trading intelligence consumers give them priority access to signals.
## Holding the SA Token is the open network business model for all participants.
* Tokens should appreciate in value as the network effects and game theory embedded in the system design kicks in over time.
* Buying pressure will come from users competing to be among the first to receive the trading-signals.
* Buying pressure will also come from algo-traders competing to be at the top of the list of real-time trading intelligence providers.
* Algo trades make money, users make money, the token appreciates, everyone wins.
## Superalgos will become one of the most powerful consumer brands on the planet because:
* We are building a brand that is inline and incentivized with our users.
* We have the business acumen and profile of a token-incentivized-open source project.
* The project acts as an union, collecting benefits for its user base, like better exchange fees for all.
* We don’t collect or sell user data.
* We don’t sell ads to anyone.
* We don’t collect or sell users trading information that can be used to front run them.
* We know how we are going to make money, and it is on token appreciation.
* Founders and team are just token holders as any other contributors.
## Superalgos Mobile Apps will have the best user experience possible because:
* The best user experience means users should be able to consume top quality, free real-time trading intelligence and autonomously execute trades while they are sleeping.
* Users just need to select their exchange, provide an exchange access token, define their base asset, amount of funds to be traded and trading intelligence providers.
* Their mobile phone will become a 24/7 trading bot plugged into the Superalgos Network to receive trading signals and firing trading orders at any exchange.
* Similar to a bitcoin wallet, anyone will be able to develop Superalgos Mobile Apps for consuming trading-signals. This open competition will be a race to the best UX possible.
* Established crypto wallets or any trading app in general, can plugin into the Superalgos Network and consume real-time trading intelligence for free.
## Superalgos does not sell it’s tokens to anyone for any reason.
SA Tokens are distributed after each software release among the contributors of that release. If you want to mine SA tokens you can start contributing yourself or hire / sponsor someone (usually a developer or trader) to do it on your behalf.
Users are free to buy or sell their SA Tokens. No exchange has listed SA Tokens yet. We expect that to happen soon.
# Software Architecture
Superalgos features these 3 main components:
1. **Superalgos Platform:** An already functional set of tools designed for algo-traders for automating their own trading and producing trading-signals.
2. **Superalgos Mobile:** An under-development mobile app reference implementation for cosuming real-time trading intelligence and automate users trading.
3. **Superalgos Network:** An under-development open p2p network for distributing real-time trading intelligence between producers (algo-traders) and consumers (the project's user base).
All of the above is / will be hosted in this repository.
# Superalgos is User-centric
* No ads, anywhere.
* No sign up / logins.
* No user/usage data collection of any kind.
* No user trading information collected or sold.
* Runs 100% on uncompiled code anyone can read and audit.
# Superalgos Development Pipeline
* **Superalgos P2P Network:** will allow algo-traders to share trading signals with Superalgos users consuming these signals via a mobile app.
* **Real-time Trading Signals:** will allow users to emit trading signals and be rewarded with SA Tokens.
* **Superalgos Mobile:** Will allow users to consume trading signals for free and autonomously execute trades from their mobile phones.
* **Ethereum Integration:** Will allow mining data from an Ethereum network node, and bring it into the Superalgos workflow.
# What is the Superalgos Platform?
Superalgos Platform is a set of tools to automate crypto-trading. It is implemented as a Node JS Client + Web App that runs on your hardware and scales from a single Raspberry Pi to a Trading Farm. The Platform is fully functional and has been used for trading live since 2020.
At Beta 12, trading signals will be able to be sent to the Suerpalgos Network from the Superalgos Platform.
## Superalgos Platform Features
* A Visual Scripting Designer.
* Integrated Charting System.
* A Visual Strategy Debugger.
* Data Mining Tools.
* Coordinated Task Management across a Trading Farm.
* Community-built strategies to learn and start from.
* TensorFlow Machine Learning integration.
* In-App Tutorials.
* Complete In-App Documentation.
* SA Token / Project Governance System.
## Superalgos Allows You To...
## Superalgos Platform Allows You To...
* Visually design your trading strategies.
* Visually debug your trading strategies.
@@ -440,29 +137,16 @@ Superalgos is a platform to automate crypto-trading. It is implemented as a Node
* Run live trading sessions.
* Run arbitrary data-mining operations of any size.
* Feed your trading strategies with the data mined.
* Use your token holdings to vote and influence the direction of the project development.
* Produce real-time trading signals and send them via the p2p network. (under development)
## Superalgos Development Pipeline
# Superalgos Platform for Developers
* Ethereum Integration: will allow you to data mine your own Ethereum node and use the mined data in your strategies.
* Machine Learning: will allow you to run a Reinforcement Learning Algorithm and feed it with mined data for it to learn how to make decisions relevant to your strategies.
## Superalgos is User-centric
* No ads, anywhere.
* No sign up / logins.
* No user/usage data collection of any kind.
* Runs 100% on uncompiled code anyone can read and audit.
# Superalgos for Developers
* You are free to customize Superalgos for your customers. No royalties, no license fees.
* Everything extra your customers may need may be coded by yourself or requested as new features.
* You may use Superalgos as a platform or as a component of a larger system.
* No proprietary code/libraries. All open-source and free.
* Superalgos features a library of community-contributed plugins (workspaces, strategies, indicators, plotters, tutorials, etc.).
## Superalgos Saves You Time
## Superalgos Platform Saves You Time
* No need to code the download of historical data from crypto exchanges.
* No need to code the streaming of market data from crypto exchanges.
@@ -471,7 +155,7 @@ Superalgos is a platform to automate crypto-trading. It is implemented as a Node
* No need to integrate a charting library, Superalgos features an integrated Charting System.
* No need to manage task data or execution dependencies. Superalgos allows you to define Tasks and distribute them across a Trading Farm and takes care of the data and execution dependencies so that each task automatically starts when their dependencies are ready.
## Superalgos is Permissionless
## Superalgos Platform is Permissionless
* Don't like the UI?
* Don't like the icons used?
@@ -486,7 +170,7 @@ Superalgos is a platform to automate crypto-trading. It is implemented as a Node
No problem, code or integrate libraries with your own version of any component and we promise we will merge your work and provide it as an alternative to users. We believe in Permissionless Innovation and that users, not team members, are the final judges and the ones who decide what they prefer to use. You are free to create an alternative for any part of the system that you believe that should work or should have been done in a different way. We will help you integrate your vision into the next release and enable a way for users to choose between different implementations of the same functionality. You will also be granted the title of maintainer of the functionality you provide and have decision power on how it evolves in the future.
# Superalgos for Individuals
# Superalgos Platform for Algo-Trders
* Superalgos is easy to install/uninstall.
* Superalgos is easy to run.
@@ -496,7 +180,7 @@ No problem, code or integrate libraries with your own version of any component a
* Superalgos is well documented.
* You have free online support via Telegram and Discord.
## Superalgos Saves You Money
## Superalgos Platform Saves You Money
* There are no paid plans or anything that costs you money.
* There is no locked functionality. You may use the full capacity of the software.
@@ -509,7 +193,7 @@ No problem, code or integrate libraries with your own version of any component a
* Your installations may be used by as many people as required.
* You may connect to as many crypto exchanges as you wish.
## Superalgos Minimizes Risks
## Superalgos Platform Minimizes Risks
* No one can know what strategies you design/run.
* No one can front-run you.
@@ -517,12 +201,15 @@ No problem, code or integrate libraries with your own version of any component a
* No one knows how much capital you trade.
* No one can see your exchange keys.
# Superalgos for Companies
# Superalgos Platform for Companies
* No need to buy expensive software for monitoring crypto markets or trading execution.
* No need to hire your own developers.
* All your employees can use Superalgos for free.
* You can use Superalgos to its full capacity or just the features you are currently interested in.
* Superalgos may be integrated into your existing operation, feeding to and from other systems.
* You've got a growing community of algo-traders constantly improving the software at zero cost for you.
* You've got free online customer support via Telegram or Discord.
# Support
@@ -584,7 +271,7 @@ Superalgos is a Community Project built by users for users. Learn [how you may c
## Top Contributors
Luis Fernando Molina, Julian Molina, Andreja Cobeljic, Ira Miller, matbenitez, bearcanrun, nikolabjelo, 9808us, pmmax, suttridge, Basalt09, Mhnramin, 0xperez, infin1t3, benitezme, whtv, cozed-gh, Eduardo678-dotcom, Smidy13, teehanming, 64bittuning, joenij, apronotti, Noeljarillo, ssplatt, rico4dev, DougJCook, mane, Cordo-van-Saviour, CarnivalBen, Sil3ntLight, pisukesoramame, Edodi, harrellbm, CaptainJeff, Jeff Braun, Francisco J. Santillán, Norman, Viktoria B., Guillermo V., Daniel J., Javier A., Gustavo J., Romina GS, Pedro P., Thais M., Andrey M., Loui M., Natalia M., Bashar A., Carlos V., Diego M., Sebastian E., Bogdan P., Marko V., Igor S., Niksa K., Rodrigo M., Nicanor M., Mateo H., Lan T., Leon A., Uroš R., Filip M., Vladimir J. and Pavle B.
Luis Fernando Molina, Julian Molina, Andreja Cobeljic, Ira Miller, matbenitez, bearcanrun, nikolabjelo, 9808us, pmmax, suttridge, Basalt09, Mhnramin, 0xperez, infin1t3, benitezme, whtv, cozed-gh, Eduardo678-dotcom, Smidy13, teehanming, 64bittuning, joenij, apronotti, Noeljarillo, ssplatt, rico4dev, DougJCook, mane, Cordo-van-Saviour, CarnivalBen, Sil3ntLight, pisukesoramame, Edodi, harrellbm, CaptainJeff, Jeff Braun, Francisco J. Santillán, Norman, Viktoria B., Guillermo V., Daniel J., Javier A., Gustavo J., Romina GS, Pedro P., Thais M., Andrey M., Loui M., Natalia M., Bashar A., Carlos V., Diego M., Sebastian E., Bogdan P., Marko V., Igor S., Niksa K., Rodrigo M., Nicanor M., Mateo H., Lan T., Leon A., Uroš R., Filip M., Vladimir J. and Pavle B., brycey12, GENS-Tools, rjkilpatrick, superharoun, frysee, RalfWeiss
# License
+1 -1
View File
@@ -11,7 +11,7 @@ if (
console.log('Superalgos')
console.log('')
console.log('VERSION: Beta 10')
console.log('VERSION: Beta 11')
console.log('')
console.log('WEB: https://www.superalgos.org')
console.log('')