Merge branch 'develop' into develop

This commit is contained in:
mARTin-B78 authored and GitHub committed 2021-10-19 23:26:27 +02:00
commit dbdb7cb16f
41 files changed
+247864 -70879

No files matched your search

+21 -19
View File
@@ -3,25 +3,27 @@
# These owners will be the default owners for everything in
# the repo. Unless a later match takes precedence, these will be requested for
# review when someone opens a pull request.
* @superalgos/core-devs
* @Superalgos/core-devs
# Project Teams
/Projects/Algorithmic-Trading @superalgos/algorithmic-trading-project
/Projects/Community-Plugins @superalgos/community-plugins-project
/Projects/Data-Mining @superalgos/data-mining-project
/Projects/Education @superalgos/education-project
/Projects/Ethereum @superalgos/ethereum-project
/Projects/Foundations @superalgos/foundations-project
/Projects/Governance @superalgos/governance-project
/Projects/Machine-Learning @superalgos/machine-learning-project
/Projects/Network @superalgos/network-project
/Projects/Social-Bots @superalgos/social-bots-project
/Projects/Social-Trading @superalgos/social-trading-project
/Projects/TensorFlow @superalgos/tensorflow-project
/Projects/Visual-Scripting @superalgos/visual-scripting-project
/Projects/Algorithmic-Trading @Superalgos/algorithmic-trading-project
/Projects/Community-Plugins @Superalgos/community-plugins-project
/Projects/Data-Mining @Superalgos/data-mining-project
/Projects/Ethereum @Superalgos/ethereum-project
/Projects/Foundations @Superalgos/foundations-project
/Projects/Governance @Superalgos/governance-project
/Projects/Machine-Learning @Superalgos/machine-learning-project
/Projects/Network @Superalgos/network-project
/Projects/Social-Bots @Superalgos/social-bots-project
/Projects/Social-Trading @Superalgos/social-trading-project
/Projects/TensorFlow @Superalgos/tensorflow-project
/Projects/Visual-Scripting @Superalgos/visual-scripting-project
/.github @superalgos/sysadmins-team
/Docker @superalgos/sysadmins-team
.git* @superalgos/sysadmins-team
.docker* @superalgos/sysadmins-team
package*.json @superalgos/sysadmins-team
/Projects/Education @Superalgos/education-project
Docs*/ @Superalgos/education-project
/.github @Superalgos/sysadmins-team
/Docker @Superalgos/sysadmins-team
.git* @Superalgos/sysadmins-team
.docker* @Superalgos/sysadmins-team
package*.json @Superalgos/sysadmins-team
+8 -2
View File
@@ -1,9 +1,14 @@
name: Build/release
name: Build/release Binaries
on:
push:
branches: [master]
tags:
- '*'
release:
types: [published, created, edited]
workflow_dispatch:
jobs:
release:
@@ -28,7 +33,8 @@ jobs:
# GitHub token, automatically provided to the action
# (No need to define this secret in the repo settings)
github_token: ${{ secrets.github_token }}
args: "-c.extraMetadata.main=electron-wrapper.js -c build/electron-builder.json"
# If the commit is tagged with a version (e.g. "v1.0.0"),
# release the app after building
release: ${{ startsWith(github.ref, 'refs/tags/v') }}
release: ${{ startsWith(github.ref, 'refs/tags/') }}
+80
View File
@@ -0,0 +1,80 @@
name: Nightly develop Binaries
on:
schedule:
- cron: '20 3 * * *'
workflow_dispatch:
jobs:
create-release:
runs-on: ubuntu-latest
steps:
- name: Download a file
run: curl "https://raw.githubusercontent.com/${{ github.repository }}/develop/package.json" -o package.json
- name: Get current date
id: date
run: echo "::set-output name=date::$(date +'%Y%m%d')"
- name: get-version
id: version
uses: nyaa8/package-version@v1
with:
path: './package.json'
- name: Create nightly release
id: create_release
uses: viperproject/create-nightly-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ env.PACKAGE_VERSION }}.${{ steps.date.outputs.date }}
release_name: Superalgos ${{ env.PACKAGE_VERSION }} Snapshot ${{ steps.date.outputs.date }}
keep_num: 5
keep_tags: false
build-release:
runs-on: ${{ matrix.os }}
needs: create-release
strategy:
matrix:
os: [windows-latest, macos-latest]
steps:
- name: Get current date
id: date
run: echo "::set-output name=date::$(date +'%Y%m%d')"
- name: Check out Git repository
uses: actions/checkout@v2
with:
ref: develop
- name: Install Node.js, NPM and Yarn
uses: actions/setup-node@v1
with:
node-version: 14
- name: get-version
id: version
uses: nyaa8/package-version@v1
with:
path: './package.json'
- name: Build/release Electron app
#env:
# DATE: ${{ steps.date.outputs.date }}
uses: samuelmeuli/action-electron-builder@v1
with:
# GitHub token, automatically provided to the action
# (No need to define this secret in the repo settings)
github_token: ${{ secrets.github_token }}
args: "-c.extraMetadata.main=electron-wrapper.js -c.extraMetadata.version=${{ env.PACKAGE_VERSION }}.${{ steps.date.outputs.date }} -c build/electron-builder.json -p onTagOrDraft"
# If the commit is tagged with a version (e.g. "v1.0.0"),
# release the app after building
# release: ${{ startsWith(github.ref, 'refs/tags/v') }}
release: true
+10 -10
View File
@@ -4,22 +4,22 @@
"**/Log-Files": true,
"**/node_modules": true,
"**/My-Social-Trading-Data": true,
"**/My-Network-Nodes-Data": true,
"**/My-Workspaces": false,
"**/My-Secrets": true,
"**/My-Data-Storage": true,
"**/My-Log-Files": true,
"**/My-Network-Nodes-Data": true,
"**/My-Workspaces": true,
"**/My-Secrets": true,
"**/My-Data-Storage": true,
"**/My-Log-Files": true,
},
"search.exclude": {
"**/Data-Storage": true,
"**/Log-Files": true,
"**/node_modules": true,
"**/My-Social-Trading-Data": true,
"**/My-Network-Nodes-Data": true,
"**/My-Workspaces": true,
"**/My-Secrets": true,
"**/My-Data-Storage": true,
"**/My-Log-Files": true,
"**/My-Network-Nodes-Data": true,
"**/My-Workspaces": true,
"**/My-Secrets": true,
"**/My-Data-Storage": true,
"**/My-Log-Files": true,
},
"search.maintainFileSearchCache": true
}
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -11,6 +11,11 @@
"text": "Proses pembaruan berjalan lancar namun tidak ada perubahan karena versi instalasi sudah terbaru dengan branch sekarang . Tidak perlu tindakan lebih lanjut.",
"updated": 1616761518007,
"style": "Definition"
},
{
"language": "DE",
"text": "Der Aktualisierungsprozess wurde erfolgreich durchgeführt, aber es wurden keine Änderungen vorgenommen, da Ihre Installation mit dem aktuellen Zweig auf dem neuesten Stand ist. Es sind keine weiteren Maßnahmen erforderlich.",
"updated": 1634485256076
}
]
},
@@ -25,6 +30,11 @@
"text": "Anda sudah diversi paling up-to-date. Tidak perlu me-reboot Client atau merefresh halaman UI ini.",
"updated": 1613892633200,
"style": "Success"
},
{
"language": "DE",
"text": "Sie sind auf dem neuesten Stand. Sie müssen den Client nicht neu starten oder die UI-Website aktualisieren.",
"updated": 1634485290648
}
]
}
@@ -4,32 +4,74 @@
"type": "Fundamental Charting Space Concepts",
"definition": {
"text": "The charting space provides great control over how information generated on other hierarchies is visualized.",
"updated": 1610134431825
"updated": 1610134431825,
"translations": [
{
"language": "DE",
"text": "Der Charting Space bietet eine große Kontrolle darüber, wie die auf anderen Hierarchien erzeugten Informationen visualisiert werden.",
"updated": 1634486374442
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "Conceptually, Superalgos places the focus on the visual experience. Not just because it’s nice to see data in a graphical representation, but because our analysis capabilities are extended when we incorporate senses in the mix. Human’s capacity to think abstractly may be more or less developed across individuals, but one thing is clear: our thought process benefits from being able to see.",
"updated": 1610134441689
"updated": 1610134441689,
"translations": [
{
"language": "DE",
"text": "Das Konzept von Superalgos legt den Schwerpunkt auf die visuelle Erfahrung. Nicht nur, weil es schön ist, Daten in einer grafischen Darstellung zu sehen, sondern weil unsere Analysefähigkeiten erweitert werden, wenn wir Sinne mit einbeziehen. Die Fähigkeit des Menschen, abstrakt zu denken, mag bei jedem Menschen mehr oder weniger ausgeprägt sein, aber eines ist klar: Unser Denkprozess profitiert davon, dass wir sehen können.",
"updated": 1634486364773
}
]
},
{
"style": "Text",
"text": "The Charting Space is conceived to provide an unprecedented level of flexibility and control over the way information is displayed graphically. Everything that you see in the form of charts when you pull the slider down is configured in the charting space hierarchy while using the information available in other hierarchies.",
"updated": 1610134480039
"updated": 1610134480039,
"translations": [
{
"language": "DE",
"text": "Der Charting Space ist so konzipiert, dass er ein noch nie dagewesenes Maß an Flexibilität und Kontrolle über die Art und Weise bietet, wie Informationen grafisch dargestellt werden. Alles, was Sie in Form von Diagrammen sehen, wenn Sie den Schieberegler nach unten ziehen, wird in der Hierarchie des Charting Space konfiguriert, wobei die in anderen Hierarchien verfügbaren Informationen verwendet werden.",
"updated": 1634486341592
}
]
},
{
"style": "Text",
"text": "In other words, you use the charting space hierarchy to create Time Machines and Timeline Charts, and to configure their scales and so on, but the information feeding those charts come from bots running on the Network hierarchy. Those bots obtain exchange and market information from the Crypto Ecosystem hierarchy via references, and their source code is defined in Data Mines.",
"updated": 1610134533861
"updated": 1610134533861,
"translations": [
{
"language": "DE",
"text": "Mit anderen Worten: Sie verwenden die Charting Space Hierarchie, um Time Machines und Timeline Charts zu erstellen und ihre Skalen usw. zu konfigurieren, aber die Informationen, die diese Charts speisen, stammen von Bots, die auf der Network hierarchy ( Hierarchie) laufen. Diese Bots beziehen Börsen- und Marktinformationen über Referenzen aus der Crypto Ecosystem Hierarchie, und ihr Quellcode ist in Data Mines definiert.",
"updated": 1634486583344
}
]
},
{
"style": "Text",
"text": "The above means that, in order to have information to visualize, you will first need to run sensor and indicator bots. We call that data mining, and it’s done from the data mining section of the network hierarchy."
"text": "The above means that, in order to have information to visualize, you will first need to run sensor and indicator bots. We call that data mining, and it’s done from the data mining section of the network hierarchy.",
"translations": [
{
"language": "DE",
"text": "Das bedeutet, dass Sie zunächst Sensor- und Indicator-Bots ausführen müssen, um Informationen zur Visualisierung zu erhalten. Wir nennen das Data-Mining, und es wird im Data-Mining-Bereich der network hierarchy durchgeführt.",
"updated": 1634486674422
}
]
},
{
"style": "Text",
"text": "The workspaces shipping with the system feature several configurations of exchanges, markets, and charts that you may start using right away. To configure your own charts, you will need to learn the basics of the Charting Space, and that is exactly the information covered on these pages.",
"updated": 1610134602649
"updated": 1610134602649,
"translations": [
{
"language": "DE",
"text": "Die mit dem System gelieferten Arbeitsbereiche enthalten mehrere Konfigurationen von Börsen, Märkten und Charts, die Sie sofort verwenden können. Um Ihre eigenen Charts zu konfigurieren, müssen Sie die Grundlagen des Charting Space erlernen, und genau diese Informationen werden auf diesen Seiten behandelt.",
"updated": 1634486718746
}
]
}
]
}
@@ -4,7 +4,14 @@
"type": "Charting Space Hierarchy",
"definition": {
"text": "The charting space hierarchy organizes the charts on the Viewport and controls their behavior.",
"updated": 1610134676796
"updated": 1610134676796,
"translations": [
{
"language": "DE",
"text": "Die Hierarchie des Charting Space organisiert die Diagramme im Viewport und steuert ihr Verhalten.",
"updated": 1634486807958
}
]
},
"paragraphs": [
{
@@ -7,7 +7,7 @@
"updated": 1613822257340,
"translations": [
{
"language": "DE",
"language": "DE",
"text": "Die Docs sind ursprünglich in Englisch geschrieben. Superalgos zugänglicher zu machen ist ein wichtiges Ziel, um die Gemeinschaft und die Community zu vergrößern. Die Übersetzung von Tutorials und Software-Dokumentation in andere Sprachen als Englisch ist von großem Wert! Ins deutsche übersetzt von gitforkgit.",
"updated": 1634133734053,
"style": "Definition"
@@ -509,7 +509,7 @@
"language": "ES",
"text": "De todos modos, este no es siempre el caso. Algunos pasos de los tutoriales están configurados para cerrar los dcumentos o el editor, y cuando abre los documentos manualmente, la página del paso del tutorial no se carga automáticamente. En estos casos, deberá buscar la pagina por su nombre — la cual debería coincidir con el titulo del paso en el tutorial — podrá acceder a la página en forma manual.",
"updated": 1633279497908,
"style": "Important"
"style": "Important"
}
]
}
@@ -4,43 +4,99 @@
"type": "Data Mining - Introduction",
"definition": {
"text": "Data Mining in Superalgos means extracting data from external sources and processing that data in order to have it ready for consumption by trading strategies.",
"updated": 1622200589433
"updated": 1622200589433,
"translations": [
{
"language": "DE",
"text": "Data Mining in Superalgos bedeutet die Extraktion von Daten aus externen Quellen und die Verarbeitung dieser Daten, um sie für Handelsstrategien nutzbar zu machen. Ins deutsche übersetzt von gitforkgit.",
"updated": 1634502828004
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "Superalgos offers an extensive set of Data Mining tools. These tools allow users to fetch data from external sources, process that data into more elaborate datasets, plot the datasets within the Charting Space, feed ML Bot's models, and ultimately consume the data within their trading strategies.",
"updated": 1622200769538
"updated": 1622200769538,
"translations": [
{
"language": "DE",
"text": "Superalgos bietet ein umfangreiches Set von Data-Mining-Tools. Mit diesen Werkzeugen können Benutzer Daten aus externen Quellen abrufen, diese Daten zu komplexeren Datensätzen verarbeiten, die Datensätze im Charting Space darstellen, die Modelle von ML Bot füttern und die Daten schließlich in ihre Handelsstrategien einfließen lassen.",
"updated": 1634502210131
}
]
},
{
"style": "Title",
"text": "The Big Picture",
"updated": 1622188702833
"updated": 1622188702833,
"translations": [
{
"language": "DE",
"text": "Das Große Ganze",
"updated": 1634502312960
}
]
},
{
"style": "Text",
"text": "All of the data inside the Superalgos system has an origin somewhere outside the system, usually somewhere on the Internet. There are currently 3 ways to bring data into the system:",
"updated": 1622200785987
"updated": 1622200785987,
"translations": [
{
"language": "DE",
"text": "Alle Daten innerhalb des Superalgos-Systems haben ihren Ursprung irgendwo außerhalb des Systems, normalerweise irgendwo im Internet. Derzeit gibt es 3 Möglichkeiten, Daten in das System einzubringen:",
"updated": 1634502941525
}
]
},
{
"style": "List",
"text": "By coding an Algorithm: with this method, users who have developer skills can extract data from any source imaginable. The way to do it is by implementing a new process within the already existing Sensor Bot. In other words, the sensor bot allows users to write code that extracts data from different places outside of the system. This method is ideal for when it is not possible to use the second method listed below. An example of such algorithms is the Historic-OHLCVs which uses the CCXT open source library to extract one minute candles from any exchange supported by that library.",
"updated": 1622201355726
"updated": 1622201355726,
"translations": [
{
"language": "DE",
"text": "Durch das Programmieren eines Algorithmus: Mit dieser Methode können Benutzer, die über Entwicklerfähigkeiten (Programmierwissen) verfügen, Daten aus jeder erdenklichen Quelle extrahieren. Dies geschieht durch die Implementierung eines neuen Prozesses innerhalb des bereits bestehenden Sensor Bots. Mit anderen Worten: Der Sensor Bot ermöglicht es den Benutzern, Code zu schreiben, der Daten von verschiedenen Stellen außerhalb des Systems extrahiert. Diese Methode ist ideal, wenn es nicht möglich ist, die zweite unten aufgeführte Methode zu verwenden. Ein Beispiel für einen solchen Algorithmus ist der Historic-OHLCVs, der die Open-Source-Bibliothek CCXT verwendet, um einminütige Kerzen von jeder von dieser Bibliothek unterstützten Börse zu extrahieren.",
"updated": 1634503371051
}
]
},
{
"style": "List",
"text": "Without coding an Algorithm: (available since Beta 10) via the API Data Fetcher Bot. This method involves designing an API Map which is later feed to an API Data Fetcher Bot at runtime. From there it can fetch data from APIs without needing the user to write a single line of code.",
"updated": 1622201515378
"updated": 1622201515378,
"translations": [
{
"language": "DE",
"text": "Ohne einen Algorithmus zu programmieren: (verfügbar seit Beta 10) über den API Data Fetcher Bot. Bei dieser Methode wird eine API Map entworfen, die später zur Laufzeit an einen API Data Fetcher Bot übergeben wird. Von dort aus kann er Daten von APIs abrufen, ohne dass der Benutzer eine einzige Zeile Code schreiben muss.",
"updated": 1634503494799
}
]
},
{
"style": "List",
"text": "External processing: it is also possible to gather data and process it outside the system. Once data has been processed in this manner, it can be put in the right folder, with the right format, and the system will pick it up from there. This use case is not the most popular, but it is a valid possibility.",
"updated": 1622201656015
"updated": 1622201656015,
"translations": [
{
"language": "DE",
"text": "Externe Verarbeitung: Es ist auch möglich, Daten zu sammeln und sie außerhalb des Systems zu verarbeiten. Sobald die Daten auf diese Weise verarbeitet wurden, können sie in den richtigen Ordner mit dem richtigen Format gelegt werden, und das System übernimmt sie von dort. Dieser Anwendungsfall ist nicht der populärste, aber er ist eine gute Möglichkeit.",
"updated": 1634503579635
}
]
},
{
"style": "Text",
"text": "Once data is within the system, it is then processed for different reasons by Indicator Bots. Some of the processed data might be plotted, some might feed machine learning bots, and some might be consumed by a Trading Strategy.",
"updated": 1622201764822
"updated": 1622201764822,
"translations": [
{
"language": "DE",
"text": "Sobald die Daten im System sind, werden sie aus verschiedenen Gründen von Indikator-Bots verarbeitet. Einige der verarbeiteten Daten werden geplottet, andere können Bots für maschinelles Lernen füttern, und wieder andere können von einer Trading Strategy (Handelsstrategie) genutzt werden.",
"updated": 1634504086365
}
]
}
]
}
@@ -4,22 +4,50 @@
"type": "Data Mining - Workflows",
"definition": {
"text": "Superalgos enables users to setup powerful data mining operations. This page will introduce the workflows that are involved in data mining.",
"updated": 1622201830789
"updated": 1622201830789,
"translations": [
{
"language": "DE",
"text": "Superalgos ermöglicht es Benutzern, leistungsstarke Data-Mining-Operationen einzurichten. Auf dieser Seite werden die Arbeitsabläufe vorgestellt, die beim Data Mining involviert sind.",
"updated": 1634578254653
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "In general, data flows from the Internet into the Superalgos system. Once inside, it is then processed and reprocessed and finally consumed by trading strategies.",
"updated": 1622201876819
"updated": 1622201876819,
"translations": [
{
"language": "DE",
"text": "Im Allgemeinen fließen die Daten aus dem Internet in das Superalgos-System. Dort werden sie anschließend verarbeitet und weiterverarbeitet und schließlich von den trading strategies (Handelsstrategien) verbraucht.",
"updated": 1634578330154
}
]
},
{
"style": "Note",
"text": "As more users jump in to contribute and create more assets that they share with the community, the data mining capabilities of the system will expand.",
"updated": 1622201931367
"updated": 1622201931367,
"translations": [
{
"language": "DE",
"text": "Bedingt dadurch, dass sich mehr Nutzer beteiligen und mehr Inhalte erstellen, die sie mit der Gemeinschaft teilen, werden die Data-Mining-Funktionen des Systems erweitert.",
"updated": 1634578512210
}
]
},
{
"style": "Title",
"text": "Two Main Data Workflows"
"text": "Two Main Data Workflows",
"translations": [
{
"language": "DE",
"text": "Die zwei Haupt Daten-Workflows:",
"updated": 1634578558625
}
]
},
{
"style": "Title",
@@ -28,74 +56,180 @@
{
"style": "List",
"text": "Sensor Bot Workflow: Data arrives into the system through a Sensor Bot. In this main workflow, the resulting dataset serves as an input for an Indicator Bot that will further process it. ",
"updated": 1622202312743
"updated": 1622202312743,
"translations": [
{
"language": "DE",
"text": "Sensor Bot Workflow: Die Daten werden über einen Sensor Bot in das System eingespeist. In diesem Haupt-Workflow dient der resultierende Datensatz als Input für einen Indicator Bot, der ihn weiterverarbeitet.",
"updated": 1634580249065
}
]
},
{
"style": "Success",
"text": "Why? Because the data arrives in a format that is not standardized to be consumed by trading strategies or plotted at the charts just yet (except for Webhooks that record data in the Single-File Dataset type which can be consumed by plotters and trading strategies)."
"text": "Why? Because the data arrives in a format that is not standardized to be consumed by trading strategies or plotted at the charts just yet (except for Webhooks that record data in the Single-File Dataset type which can be consumed by plotters and trading strategies).",
"translations": [
{
"language": "DE",
"text": "Warum? Weil die Daten in einem Format ankommen, das noch nicht standardisiert ist, um von Handelsstrategien verarbeitet oder in Charts dargestellt zu werden (mit Ausnahme von Webhooks, die Daten im Typ Single-File Dataset aufzeichnen, der von Plottern und trading strategies (Handelsstrategien) verarbeitet werden kann).",
"updated": 1634580399832
}
]
},
{
"style": "List",
"text": "API Data Fetcher Bot Workflow: Data arrives into the system through an API Data Fetcher Bot. In this main workflow, the resulting dataset serves as an input for an Indicator Bot that will further process it.",
"updated": 1622202181798
"updated": 1622202181798,
"translations": [
{
"language": "DE",
"text": "API Data Fetcher Bot Workflow: Die Daten werden über einen API Data Fetcher Bot in das System eingespeist. In diesem Haupt-Workflow dient der resultierende Datensatz als Eingabe für einen Indicator Bot, der ihn danach weiter verarbeitet.",
"updated": 1634580475107
}
]
},
{
"style": "Note",
"text": "The data arriving from an external source is considered Raw Data. Both of these 2 workflows produce Raw Data that has to be digested by Indicator Bots.",
"updated": 1622202291043
"updated": 1622202291043,
"translations": [
{
"language": "DE",
"text": "Die Daten, die von einer externen Quelle kommen, werden als Raw Data (Rohdaten) betrachtet. Beide Workflows erzeugen Rohdaten, die von Indikator-Bots verarbeitet werden müssen.",
"updated": 1634580517112
}
]
},
{
"style": "Subtitle",
"text": "Raw Data -> Indicator Bots",
"updated": 1621698286836
"updated": 1621698286836,
"translations": [
{
"language": "DE",
"text": "Rohdaten -> Indicator-Bots",
"updated": 1634580556564
}
]
},
{
"style": "Text",
"text": "Indicator bots have two different purposes. "
"text": "Indicator bots have two different purposes:",
"translations": [
{
"language": "DE",
"text": "Indicator-Bots haben zwei unterschiedliche Zwecke:",
"updated": 1634580952464
}
],
"updated": 1634580879323
},
{
"style": "List",
"text": "Standardize Datasets: They are used for standardization of raw data extracted from the Internet by a Sensor Bot or an API Data Fetcher Bot. Once data is standardized, it can be run through other Indicator Bots that will extract the juice out of them. Once standardized, data can also be plotted and consumed by Trading Strategies. By standardizing, we are specifically referring to transforming the data into a Dataset type that can be used for plotting charts, or feeding Learning and Trading Bots. These Dataset types are Multi-Time-Frame-Daily and Multi-Time-Frame-Market.",
"updated": 1622203207179
"updated": 1622203207179,
"translations": [
{
"language": "DE",
"text": "Datensätze standardisieren: Sie werden zur Standardisierung von Rohdaten verwendet, die von einem Sensor Bot oder einem API Data Fetcher Bot aus dem Internet extrahiert wurden. Sobald die Daten standardisiert sind, können sie durch andere Indikator-Bots geleitet werden, die das Beste aus ihnen herausholen. Sobald die Daten standardisiert sind, können sie auch geplottet und von Trading Strategies (Handelsstrategien) verwendet werden. Mit Standardisierung meinen wir insbesondere die Umwandlung der Daten in einen Dataset Typ, der zum Plotten von Diagrammen oder zum Füttern von Lern- und Trading-Bots verwendet werden kann. Diese Datensatztypen sind Multi-Time-Frame-Daily und Multi-Time-Frame-Market.",
"updated": 1634582999079
}
]
},
{
"style": "List",
"text": "Process Data: This means processing the data in any way that makes sense for users. Many users use Indicator Bots to calculate standard indicators, others calculate non-standard stuff, even ideas of what could be useful to extract from a certain dataset can be implemented. The system is open and allows users to do just that, play with the data by transforming it in any way they wish.",
"updated": 1622203469938
"updated": 1622203469938,
"translations": [
{
"language": "DE",
"text": "Daten verarbeiten: Dies bedeutet, dass die Daten auf jede Art und Weise verarbeitet werden, die für die Nutzer sinnvoll ist. Viele Nutzer verwenden Indicator Bots, um Standardindikatoren zu berechnen, andere berechnen nicht standardisierte Dinge, sogar Ideen, was aus einem bestimmten Datensatz nützlich sein könnte, können umgesetzt werden. Das System ist offen und erlaubt es den Nutzern, mit den Daten zu spielen, indem sie sie auf jede beliebige Art und Weise umwandeln.",
"updated": 1634583321196
}
]
},
{
"style": "Subtitle",
"text": "Indicators -> Plotters",
"updated": 1621900608845
"updated": 1621900608845,
"translations": [
{
"language": "DE",
"text": "Indicators -> Plotter",
"updated": 1634583699357
}
]
},
{
"style": "Text",
"text": "Plotters are tools for users, not for bots. Plotters will render the information of a Dataset at the charts based on the plotter's definition. This allows users to visually discover patterns in datasets and generate ideas. These ideas can then help the user decide how to process the data further or feed the data to a Learning Bot or a Trading Bot.",
"updated": 1622203827359
"updated": 1622203827359,
"translations": [
{
"language": "DE",
"text": "Plotter sind Werkzeuge für Benutzer, nicht für Bots. Plotter stellen die Informationen eines Datensatzes auf der Grundlage der Definition des Plotters in den Diagrammen dar. Auf diese Weise können Nutzer visuell Muster in Datensätzen entdecken und Ideen entwickeln. Diese Ideen können dem Nutzer dann bei der Entscheidung helfen, wie er die Daten weiterverarbeitet oder sie an einen Learning Bot oder Trading Bot weitergibt.",
"updated": 1634583962530
}
]
},
{
"style": "Important",
"text": "Plotters can only read data from certain Dataset types, you will learn which ones later on in this Topic."
"text": "Plotters can only read data from certain Dataset types, you will learn which ones later on in this Topic.",
"translations": [
{
"language": "DE",
"text": "Plotter können nur Daten von bestimmten Dataset Typen lesen. Welche das sind, erfahren Sie später in diesem Thema.",
"updated": 1634583996041
}
]
},
{
"style": "Subtitle",
"text": "Indicators -> Learning Bots (under development)",
"updated": 1621698378105
"updated": 1621698378105,
"translations": [
{
"language": "DE",
"text": "Indikatoren -> Learning Bots (stecken mitten in der Entwicklung):",
"updated": 1634585606476
}
]
},
{
"style": "Text",
"text": "Learning Bots have access to mined data which they use to train their AI Models. Once trained, these AI Models can be used by trading strategies to request predictions and act upon them.",
"updated": 1622204001242
"updated": 1622204001242,
"translations": [
{
"language": "DE",
"text": "Learning Bots haben Zugang zu geschürften Daten, die sie zum Trainieren ihrer KI-Modelle verwenden. Einmal trainiert, können diese KI-Modelle von Trading-Strategien genutzt werden, um Vorhersagen anzufordern und daraufhin zu handeln.",
"updated": 1634585521697
}
]
},
{
"style": "Subtitle",
"text": "Indicators -> Trading Bots",
"updated": 1621698387166
"updated": 1621698387166,
"translations": [
{
"language": "DE",
"text": "Indikatoren -> Trading Bots",
"updated": 1634585651731
}
]
},
{
"style": "Text",
"text": "Trading bots are the ultimate consumer of data. They use the data they receive to make trading decisions based on their definitions. The ultimate purpose of the whole Data Mining operation is to digest data so that it is easily accessible for trading strategies.",
"updated": 1622204325508
"updated": 1622204325508,
"translations": [
{
"language": "DE",
"text": "Trading Bots sind die ultimativen Konsumenten von Daten. Sie nutzen die Daten, die sie erhalten, um auf der Grundlage ihrer Definitionen Handelsentscheidungen zu treffen. Der ultimative Zweck der gesamten Data-Mining-Operation besteht darin, Daten so zu verarbeiten, dass sie für Handelsstrategien leicht zugänglich sind.",
"updated": 1634585828124
}
]
}
]
}
@@ -4,7 +4,14 @@
"type": "Data Mining - Dataset Types",
"definition": {
"text": "Superalgos organizes data into datasets. These datasets are standardized across the system using different type definitions.",
"updated": 1622204454559
"updated": 1622204454559,
"translations": [
{
"language": "DE",
"text": "Zusammenfassung: Superalgos organisiert Daten in Datasets (Datensätze). Diese Datensätze sind systemübergreifend durch unterschiedliche Typdefinitionen standardisiert.",
"updated": 1634586751277
}
]
},
"paragraphs": [
{
@@ -15,16 +22,37 @@
{
"style": "Title",
"text": "Dataset Types",
"updated": 1622227827875
"updated": 1622227827875,
"translations": [
{
"language": "DE",
"text": "Datensatz-Typen:",
"updated": 1634586996444
}
]
},
{
"style": "Text",
"text": "This is the complete list of Dataset types currently supported by the system:"
"text": "This is the complete list of Dataset types currently supported by the system:",
"translations": [
{
"language": "DE",
"text": "Dies ist die vollständige Liste der derzeit vom System unterstützten Dataset Typen:",
"updated": 1634587492613
}
]
},
{
"style": "List",
"text": "Single-File: As the name suggests, this Dataset consists of only one file containing all the data. This Dataset type can be plotted and its data consumed by and within Trading Strategies. The API Data Fetcher Bot can also save Raw Data in this type of dataset, if needed.",
"updated": 1622204763019
"updated": 1622204763019,
"translations": [
{
"language": "DE",
"text": "Single-File (Einzeldatei): Wie der Name schon sagt, besteht dieses Dataset aus nur einer Datei, die alle Daten enthält. Dieser Dataset-Typ kann geplottet werden und seine Daten können von und in Handelsstrategien verwendet werden. Der API Data Fetcher Bot kann bei Bedarf auch Rohdaten in diesem Dataset-Typ speichern.",
"updated": 1634588065048
}
]
},
{
"style": "Note",
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

+103 -42
View File
@@ -295,11 +295,11 @@
"savedPayload": {
"position": {
"x": 16657.465367689296,
"y": 44560.21626285766
"y": 44561.21626285766
},
"targetPosition": {
"x": 16445.333333333332,
"y": 44772.348297213626
"y": 44773.348297213626
},
"floatingObject": {
"isPinned": false,
@@ -448,11 +448,11 @@
"savedPayload": {
"position": {
"x": 16745.333333333332,
"y": 44772.348297213626
"y": 44773.348297213626
},
"targetPosition": {
"x": 16445.333333333332,
"y": 44772.348297213626
"y": 44773.348297213626
},
"floatingObject": {
"isPinned": false,
@@ -483,12 +483,12 @@
"id": "5bd09ac2-6c9f-4a7d-a547-c05a8a1e98e2",
"savedPayload": {
"position": {
"x": 16953.771869867836,
"y": 44937.549992057524
"x": 16947.243115576017,
"y": 44907.83461803883
},
"targetPosition": {
"x": 16657.465367689296,
"y": 44984.48033156959
"y": 44985.48033156959
},
"floatingObject": {
"isPinned": false,
@@ -520,12 +520,12 @@
"id": "9eb846a4-effb-4380-9487-1a82011b0488",
"savedPayload": {
"position": {
"x": 17192.069282202316,
"y": 45256.87463141332
"x": 17237.020863462738,
"y": 45140.771758631105
},
"targetPosition": {
"x": 16924.767324945806,
"y": 45120.67748149145
"x": 16947.243115576017,
"y": 45063.12604510035
},
"floatingObject": {
"isPinned": false,
@@ -544,12 +544,12 @@
"id": "80d4f08f-bb7f-48a2-9cef-be12befcac2e",
"savedPayload": {
"position": {
"x": 16924.767324945806,
"y": 45120.67748149145
"x": 16947.243115576017,
"y": 45063.12604510035
},
"targetPosition": {
"x": 16657.465367689296,
"y": 44984.48033156959
"y": 44985.48033156959
},
"floatingObject": {
"isPinned": false,
@@ -581,12 +581,12 @@
"id": "d2cf4c65-b4bd-4fa8-b0da-f73a38b8419a",
"savedPayload": {
"position": {
"x": 16929.859667533023,
"y": 45519.08424608261
"x": 17081.729436401223,
"y": 45409.74440028152
},
"targetPosition": {
"x": 16793.66251761116,
"y": 45251.7822888261
"x": 16869.59740204526,
"y": 45197.61236592555
},
"floatingObject": {
"isPinned": false,
@@ -605,12 +605,73 @@
"id": "68e3f570-4156-4be6-8881-c526a06f85d0",
"savedPayload": {
"position": {
"x": 16793.66251761116,
"y": 45251.7822888261
"x": 16869.59740204526,
"y": 45197.61236592555
},
"targetPosition": {
"x": 16657.465367689296,
"y": 44984.48033156959
"y": 44985.48033156959
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
{
"type": "Pool Class",
"name": "Liquidity Program",
"config": "{}",
"project": "Governance",
"poolClasses": [],
"pools": [
{
"type": "Pool",
"name": "Liquidity Rewards",
"config": "{\n \"codeName\": \"Liquidity-Rewards\"\n}",
"project": "Governance",
"poolClasses": [],
"pools": [],
"id": "a7651e92-ab96-49fc-af9c-f936682dd7a4",
"savedPayload": {
"position": {
"x": 16812.75679475081,
"y": 45565.03582734303
},
"targetPosition": {
"x": 16735.111081220053,
"y": 45275.25807945631
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
}
],
"id": "477faa7a-da4f-4949-9439-a2475ed683de",
"savedPayload": {
"position": {
"x": 16735.111081220053,
"y": 45275.25807945631
},
"targetPosition": {
"x": 16657.465367689296,
"y": 44985.48033156959
},
"floatingObject": {
"isPinned": false,
@@ -642,12 +703,12 @@
"id": "24e62dd3-4d7b-4eba-b401-493c155d85d0",
"savedPayload": {
"position": {
"x": 16563.604688665157,
"y": 45577.09333592668
"x": 16502.17394062778,
"y": 45565.03582734303
},
"targetPosition": {
"x": 16610.535028177226,
"y": 45280.786833748134
"x": 16579.81965415854,
"y": 45275.25807945631
},
"floatingObject": {
"isPinned": false,
@@ -666,12 +727,12 @@
"id": "f09429a2-3f6c-4210-bb73-0c8efd254c82",
"savedPayload": {
"position": {
"x": 16610.535028177226,
"y": 45280.786833748134
"x": 16579.81965415854,
"y": 45275.25807945631
},
"targetPosition": {
"x": 16657.465367689296,
"y": 44984.48033156959
"y": 44985.48033156959
},
"floatingObject": {
"isPinned": false,
@@ -692,11 +753,11 @@
"savedPayload": {
"position": {
"x": 16657.465367689296,
"y": 44984.48033156959
"y": 44985.48033156959
},
"targetPosition": {
"x": 16445.333333333332,
"y": 44772.348297213626
"y": 44773.348297213626
},
"floatingObject": {
"isPinned": false,
@@ -717,11 +778,11 @@
"savedPayload": {
"position": {
"x": 16445.333333333332,
"y": 44772.348297213626
"y": 44773.348297213626
},
"targetPosition": {
"x": 16145.333333333332,
"y": 44772.348297213626
"y": 44773.348297213626
},
"floatingObject": {
"isPinned": false,
@@ -754,11 +815,11 @@
"savedPayload": {
"position": {
"x": 15633.201298977368,
"y": 44984.48033156959
"y": 44985.48033156959
},
"targetPosition": {
"x": 15845.333333333332,
"y": 44772.348297213626
"y": 44773.348297213626
},
"floatingObject": {
"isPinned": false,
@@ -797,11 +858,11 @@
"savedPayload": {
"position": {
"x": 15545.333333333332,
"y": 44772.348297213626
"y": 44773.348297213626
},
"targetPosition": {
"x": 15845.333333333332,
"y": 44772.348297213626
"y": 44773.348297213626
},
"floatingObject": {
"isPinned": false,
@@ -840,11 +901,11 @@
"savedPayload": {
"position": {
"x": 15633.201298977368,
"y": 44560.21626285766
"y": 44561.21626285766
},
"targetPosition": {
"x": 15845.333333333332,
"y": 44772.348297213626
"y": 44773.348297213626
},
"floatingObject": {
"isPinned": false,
@@ -877,11 +938,11 @@
"savedPayload": {
"position": {
"x": 15845.333333333332,
"y": 44772.348297213626
"y": 44773.348297213626
},
"targetPosition": {
"x": 16145.333333333332,
"y": 44772.348297213626
"y": 44773.348297213626
},
"floatingObject": {
"isPinned": false,
@@ -902,11 +963,11 @@
"savedPayload": {
"position": {
"x": 16145.333333333332,
"y": 44772.348297213626
"y": 44773.348297213626
},
"targetPosition": {
"x": 16145.333333333332,
"y": 44772.348297213626
"y": 44773.348297213626
},
"floatingObject": {
"isPinned": false,
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -26,12 +26,12 @@
"id": "deaea400-fa7f-48fd-a3fe-653b1bd18650",
"savedPayload": {
"position": {
"x": 13636.363636363636,
"y": 23431.384757729335
"x": 4448.90800640108,
"y": 32513.204681296134
},
"targetPosition": {
"x": 13786.363636363636,
"y": 23691.192378864667
"x": 4671.8514540442975,
"y": 32713.943863203793
},
"floatingObject": {
"isPinned": false,
@@ -49,12 +49,12 @@
"id": "97ae26ad-542d-4373-806a-593e979e1a1b",
"savedPayload": {
"position": {
"x": 13786.363636363636,
"y": 23691.192378864667
"x": 4671.8514540442975,
"y": 32713.943863203793
},
"targetPosition": {
"x": 13936.363636363636,
"y": 23951
"x": 4894.794901687515,
"y": 32914.68304511145
},
"floatingObject": {
"isPinned": false,
@@ -81,12 +81,12 @@
"id": "54a2fcd6-e80c-4a30-84c0-d80ae9d197e9",
"savedPayload": {
"position": {
"x": 14236.363636363636,
"y": 23431.384757729335
"x": 5019.541916178172,
"y": 32327.79448467117
},
"targetPosition": {
"x": 14086.363636363636,
"y": 23691.192378864667
"x": 4957.168408932844,
"y": 32621.23876489131
},
"floatingObject": {
"isPinned": false,
@@ -104,12 +104,12 @@
"id": "786e62d1-6b32-49d9-8046-9c8577dbcd87",
"savedPayload": {
"position": {
"x": 14086.363636363636,
"y": 23691.192378864667
"x": 4957.168408932844,
"y": 32621.23876489131
},
"targetPosition": {
"x": 13936.363636363636,
"y": 23951
"x": 4894.794901687515,
"y": 32914.68304511145
},
"floatingObject": {
"isPinned": false,
@@ -127,12 +127,12 @@
"id": "7e7f3e6e-30f4-400d-a1f6-b3611498b7bf",
"savedPayload": {
"position": {
"x": 13936.363636363636,
"y": 23951
"x": 4894.794901687515,
"y": 32914.68304511145
},
"targetPosition": {
"x": 13936.363636363636,
"y": 24251
"x": 4987.5,
"y": 33200
},
"floatingObject": {
"isPinned": false,
@@ -310,14 +310,12 @@
"referenceParent": {
"type": "User Profile",
"name": "Julian-Molina",
"id": "1fd95e41-4b22-48d5-be3a-904c37afcb11"
"id": "b85aaac1-0708-4aec-97f9-bc3cc70e530a"
},
"referenceParentCombinedNodePath": [
[
"Julian-Molina",
"User Profile",
"Governance",
"1fd95e41-4b22-48d5-be3a-904c37afcb11"
"User Profile"
]
]
}
@@ -528,12 +526,12 @@
"id": "db99bd94-cded-4ef0-bfb2-979cac295f7f",
"savedPayload": {
"position": {
"x": 14536.363636363636,
"y": 24251
"x": 5558.133909777092,
"y": 33014.589803375035
},
"targetPosition": {
"x": 13936.363636363636,
"y": 24251
"x": 4987.5,
"y": 33200
},
"floatingObject": {
"isPinned": false,
@@ -572,304 +570,18 @@
"config": "{}",
"project": "Governance",
"claimVotesSwitch": [],
"positionClaimVotes": [
{
"type": "Position Claim Vote",
"name": "Tentacule23 Moderator Community Management",
"config": "{}",
"project": "Governance",
"id": "ddfeb70e-06ca-4354-88e5-eac680aa6a66",
"savedPayload": {
"position": {
"x": 15125.339299243353,
"y": 24105.412192876047
},
"targetPosition": {
"x": 15017.828914379763,
"y": 24385.486320825206
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
},
"referenceParent": {
"type": "Position Contribution Claim",
"name": "Moderator Community Management",
"id": "9c74a2a8-4bcf-42b7-b53d-7ba68f3acfc2"
},
"referenceParentCombinedNodePath": [
[
"Tentacule23",
"User Profile",
"Governance",
"7af21baa-ebc0-436f-94a7-a1746209418e"
],
[
"New Token Power Switch",
"Token Power Switch",
"Governance",
"5683e2bf-45ca-4dd6-9ade-53b4cad76ed0"
],
[
"New Votes And Claims Programs",
"Votes And Claims Programs",
"Governance",
"705bfab3-e851-4469-ab70-ac972950de6c"
],
[
"New Claims Program",
"Claims Program",
"Governance",
"cce1f59a-bb5d-4700-abf8-ab8d2932ff6a"
],
[
"New Position Claims Folder",
"Position Claims Folder",
"Governance",
"be3ab259-2505-4200-a8cc-a373874aedb0"
],
[
"Moderator Community Management",
"Position Contribution Claim",
"Governance",
"9c74a2a8-4bcf-42b7-b53d-7ba68f3acfc2"
]
]
}
}
],
"positionClaimVotes": [],
"assetClaimVotes": [],
"featureClaimVotes": [
{
"type": "Feature Claim Vote",
"name": "Tentacule23 ",
"config": "{}",
"project": "Governance",
"id": "48a23c6d-51fa-4049-bb51-b37c9881a711",
"savedPayload": {
"position": {
"x": 15269.43008476339,
"y": 24222.0946103207
},
"targetPosition": {
"x": 15017.828914379763,
"y": 24385.486320825206
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
},
"referenceParent": {
"type": "Feature Contribution Claim",
"name": "",
"id": "5d6b30bc-4f05-4001-87ba-45cba35fe1ce"
},
"referenceParentCombinedNodePath": [
[
"Tentacule23",
"User Profile",
"Governance",
"7af21baa-ebc0-436f-94a7-a1746209418e"
],
[
"New Token Power Switch",
"Token Power Switch",
"Governance",
"5683e2bf-45ca-4dd6-9ade-53b4cad76ed0"
],
[
"New Votes And Claims Programs",
"Votes And Claims Programs",
"Governance",
"705bfab3-e851-4469-ab70-ac972950de6c"
],
[
"New Claims Program",
"Claims Program",
"Governance",
"cce1f59a-bb5d-4700-abf8-ab8d2932ff6a"
],
[
"New Feature Claims Folder",
"Feature Claims Folder",
"Governance",
"eb425c2c-6b7c-460d-a74e-650691f52fc7"
],
[
"",
"Feature Contribution Claim",
"Governance",
"5d6b30bc-4f05-4001-87ba-45cba35fe1ce"
]
]
}
},
{
"type": "Feature Claim Vote",
"name": "Tentacule23 ",
"config": "{}",
"project": "Governance",
"id": "6a6f2a21-930b-4403-bcee-80ea71022927",
"savedPayload": {
"position": {
"x": 15317.417774806136,
"y": 24401.18710769809
},
"targetPosition": {
"x": 15017.828914379763,
"y": 24385.486320825206
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
},
"referenceParent": {
"type": "Feature Contribution Claim",
"name": "",
"id": "d7c5da08-3757-46b4-8175-bc9a7b02359f"
},
"referenceParentCombinedNodePath": [
[
"Tentacule23",
"User Profile",
"Governance",
"7af21baa-ebc0-436f-94a7-a1746209418e"
],
[
"New Token Power Switch",
"Token Power Switch",
"Governance",
"5683e2bf-45ca-4dd6-9ade-53b4cad76ed0"
],
[
"New Votes And Claims Programs",
"Votes And Claims Programs",
"Governance",
"705bfab3-e851-4469-ab70-ac972950de6c"
],
[
"New Claims Program",
"Claims Program",
"Governance",
"cce1f59a-bb5d-4700-abf8-ab8d2932ff6a"
],
[
"New Feature Claims Folder",
"Feature Claims Folder",
"Governance",
"eb425c2c-6b7c-460d-a74e-650691f52fc7"
],
[
"",
"Feature Contribution Claim",
"Governance",
"d7c5da08-3757-46b4-8175-bc9a7b02359f"
]
]
}
},
{
"type": "Feature Claim Vote",
"name": "Tentacule23 ",
"config": "{}",
"project": "Governance",
"id": "050787ad-5f04-45c5-8ded-e3c452ab2bee",
"savedPayload": {
"position": {
"x": 15250.972702816855,
"y": 24574.28243814016
},
"targetPosition": {
"x": 15017.828914379763,
"y": 24385.486320825206
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
},
"referenceParent": {
"type": "Feature Contribution Claim",
"name": "",
"id": "faa99198-6c04-4722-bbc2-f4dd4f9d297f"
},
"referenceParentCombinedNodePath": [
[
"Tentacule23",
"User Profile",
"Governance",
"7af21baa-ebc0-436f-94a7-a1746209418e"
],
[
"New Token Power Switch",
"Token Power Switch",
"Governance",
"5683e2bf-45ca-4dd6-9ade-53b4cad76ed0"
],
[
"New Votes And Claims Programs",
"Votes And Claims Programs",
"Governance",
"705bfab3-e851-4469-ab70-ac972950de6c"
],
[
"New Claims Program",
"Claims Program",
"Governance",
"cce1f59a-bb5d-4700-abf8-ab8d2932ff6a"
],
[
"New Feature Claims Folder",
"Feature Claims Folder",
"Governance",
"eb425c2c-6b7c-460d-a74e-650691f52fc7"
],
[
"",
"Feature Contribution Claim",
"Governance",
"faa99198-6c04-4722-bbc2-f4dd4f9d297f"
]
]
}
}
],
"featureClaimVotes": [],
"id": "008b3b69-cc01-4e09-9122-ec885a882d76",
"savedPayload": {
"position": {
"x": 15017.828914379763,
"y": 24385.486320825206
"x": 6524.472195592687,
"y": 32643.27984087776
},
"targetPosition": {
"x": 14728.051166493042,
"y": 24463.132034355964
"x": 6190.057024127859,
"y": 32944.38861373925
},
"floatingObject": {
"isPinned": false,
@@ -890,12 +602,12 @@
"id": "fb7f7b7e-a2fb-421f-8158-faa5006f4636",
"savedPayload": {
"position": {
"x": 14728.051166493042,
"y": 24463.132034355964
"x": 6190.057024127859,
"y": 32944.38861373925
},
"targetPosition": {
"x": 14438.27341860632,
"y": 24540.77774788672
"x": 5855.641852663031,
"y": 33245.497386600735
},
"floatingObject": {
"isPinned": false,
@@ -918,12 +630,12 @@
"id": "2bc7d2be-bd4a-47b8-966f-349202f799bf",
"savedPayload": {
"position": {
"x": 14650.405452962284,
"y": 24752.909782242685
"x": 6283.61728499585,
"y": 33384.55503406946
},
"targetPosition": {
"x": 14438.27341860632,
"y": 24540.77774788672
"x": 5855.641852663031,
"y": 33245.497386600735
},
"floatingObject": {
"isPinned": false,
@@ -941,12 +653,12 @@
"id": "f16e524c-4e32-4a6e-840b-bfdd6080f20c",
"savedPayload": {
"position": {
"x": 14438.27341860632,
"y": 24540.77774788672
"x": 5855.641852663031,
"y": 33245.497386600735
},
"targetPosition": {
"x": 14148.4956707196,
"y": 24463.132034355964
"x": 5415.475432332819,
"y": 33339.057647468726
},
"floatingObject": {
"isPinned": false,
@@ -983,12 +695,12 @@
"id": "d7c5da08-3757-46b4-8175-bc9a7b02359f",
"savedPayload": {
"position": {
"x": 15050.519437783434,
"y": 24861.44121194655
"x": 6892.281898350884,
"y": 33257.13643010531
},
"targetPosition": {
"x": 14615.852815953353,
"y": 24977.909782242685
"x": 6390.659141153643,
"y": 33708.79958939754
},
"floatingObject": {
"isPinned": false,
@@ -1042,12 +754,12 @@
"id": "5d6b30bc-4f05-4001-87ba-45cba35fe1ce",
"savedPayload": {
"position": {
"x": 15005.56424765635,
"y": 25202.909782242685
"x": 7064.73407711298,
"y": 33744.126359861526
},
"targetPosition": {
"x": 14615.852815953353,
"y": 24977.909782242685
"x": 6390.659141153643,
"y": 33708.79958939754
},
"floatingObject": {
"isPinned": false,
@@ -1101,12 +813,12 @@
"id": "faa99198-6c04-4722-bbc2-f4dd4f9d297f",
"savedPayload": {
"position": {
"x": 14732.321386249487,
"y": 25412.576404072766
"x": 6842.322300445872,
"y": 34210.42234659478
},
"targetPosition": {
"x": 14615.852815953353,
"y": 24977.909782242685
"x": 6390.659141153643,
"y": 33708.79958939754
},
"floatingObject": {
"isPinned": false,
@@ -1156,12 +868,12 @@
"id": "eb425c2c-6b7c-460d-a74e-650691f52fc7",
"savedPayload": {
"position": {
"x": 14615.852815953353,
"y": 24977.909782242685
"x": 6390.659141153643,
"y": 33708.79958939754
},
"targetPosition": {
"x": 14226.141384250355,
"y": 24752.909782242685
"x": 5716.5842051943055,
"y": 33673.47281893355
},
"floatingObject": {
"isPinned": false,
@@ -1187,18 +899,18 @@
"positionContributionClaims": [
{
"type": "Position Contribution Claim",
"name": "Moderator Community Management",
"name": "",
"config": "{}",
"project": "Governance",
"id": "9c74a2a8-4bcf-42b7-b53d-7ba68f3acfc2",
"savedPayload": {
"position": {
"x": 14381.432811311866,
"y": 25332.465278016127
"x": 6318.801750917279,
"y": 34342.3031618632
},
"targetPosition": {
"x": 14303.78709778111,
"y": 25042.687530129406
"x": 6017.692978055792,
"y": 34007.887990398376
},
"floatingObject": {
"isPinned": false,
@@ -1248,12 +960,12 @@
"id": "be3ab259-2505-4200-a8cc-a373874aedb0",
"savedPayload": {
"position": {
"x": 14303.78709778111,
"y": 25042.687530129406
"x": 6017.692978055792,
"y": 34007.887990398376
},
"targetPosition": {
"x": 14226.141384250355,
"y": 24752.909782242685
"x": 5716.5842051943055,
"y": 33673.47281893355
},
"floatingObject": {
"isPinned": false,
@@ -1276,12 +988,12 @@
"id": "9673136d-ac9a-40b7-bd6f-6c8c3fbbb384",
"savedPayload": {
"position": {
"x": 14076.141384250355,
"y": 25012.717403378017
"x": 5693.0330248849805,
"y": 34122.856109573106
},
"targetPosition": {
"x": 14226.141384250355,
"y": 24752.909782242685
"x": 5716.5842051943055,
"y": 33673.47281893355
},
"floatingObject": {
"isPinned": false,
@@ -1299,12 +1011,12 @@
"id": "cce1f59a-bb5d-4700-abf8-ab8d2932ff6a",
"savedPayload": {
"position": {
"x": 14226.141384250355,
"y": 24752.909782242685
"x": 5716.5842051943055,
"y": 33673.47281893355
},
"targetPosition": {
"x": 14148.4956707196,
"y": 24463.132034355964
"x": 5415.475432332819,
"y": 33339.057647468726
},
"floatingObject": {
"isPinned": false,
@@ -1322,19 +1034,102 @@
"id": "705bfab3-e851-4469-ab70-ac972950de6c",
"savedPayload": {
"position": {
"x": 14148.4956707196,
"y": 24463.132034355964
"x": 5415.475432332819,
"y": 33339.057647468726
},
"targetPosition": {
"x": 13936.363636363636,
"y": 24251
"x": 4987.5,
"y": 33200
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"distanceToParent": 4,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"financialPrograms": {
"type": "Financial Programs",
"name": "New Financial Programs",
"config": "{}",
"project": "Governance",
"liquidityProgram": {
"type": "Liquidity Program",
"name": "New Liquidity Program",
"config": "{}",
"project": "Governance",
"tokensAwarded": {
"type": "Tokens Awarded",
"name": "New Tokens Awarded",
"project": "Governance",
"id": "bf4385e4-36b4-46b9-980f-40040b9bbd5c",
"savedPayload": {
"position": {
"x": 5371.842302750968,
"y": 34264.82039324994
},
"targetPosition": {
"x": 5107.338939219355,
"y": 33900.76274578121
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"id": "304d9993-0a02-4532-a8ce-6a1a0d13f571",
"savedPayload": {
"position": {
"x": 5107.338939219355,
"y": 33900.76274578121
},
"targetPosition": {
"x": 4842.835575687742,
"y": 33536.70509831249
},
"floatingObject": {
"isPinned": false,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 3,
"arrangementStyle": 0
},
"uiObject": {
"isRunning": false
}
}
},
"id": "d120d972-5bec-4e8a-9811-3a51b8bd70b4",
"savedPayload": {
"position": {
"x": 4842.835575687742,
"y": 33536.70509831249
},
"targetPosition": {
"x": 4987.5,
"y": 33200
},
"floatingObject": {
"isPinned": true,
"isFrozen": false,
"isCollapsed": false,
"angleToParent": 2,
"distanceToParent": 4,
"arrangementStyle": 0
},
"uiObject": {
@@ -1345,12 +1140,12 @@
"id": "5683e2bf-45ca-4dd6-9ade-53b4cad76ed0",
"savedPayload": {
"position": {
"x": 13936.363636363636,
"y": 24251
"x": 4987.5,
"y": 33200
},
"targetPosition": {
"x": 13636.363636363636,
"y": 24251
"x": 4687.5,
"y": 33200
},
"floatingObject": {
"isPinned": false,
@@ -1372,12 +1167,12 @@
"id": "96f1c595-f94e-4207-9828-4199c74c4bfd",
"savedPayload": {
"position": {
"x": 13336.363636363636,
"y": 24251
"x": 4387.5,
"y": 33200
},
"targetPosition": {
"x": 13636.363636363636,
"y": 24251
"x": 4687.5,
"y": 33200
},
"floatingObject": {
"isPinned": false,
@@ -1395,12 +1190,12 @@
"id": "7af21baa-ebc0-436f-94a7-a1746209418e",
"savedPayload": {
"position": {
"x": 13636.363636363636,
"y": 24251
"x": 4687.5,
"y": 33200
},
"targetPosition": {
"x": 13636.363636363636,
"y": 24251
"x": 4687.5,
"y": 33200
},
"floatingObject": {
"isPinned": false,
File diff suppressed because it is too large. Load diff
@@ -18,6 +18,16 @@
"relatedUiObject": "Staking Program",
"relatedUiObjectProject": "Governance"
},
{
"action": "Add UI Object",
"actionProject": "Visual-Scripting",
"actionFunction": "payload.executeAction",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "stakingProgram",
"label": "Add Liquidity Program",
"relatedUiObject": "Liquidity Program",
"relatedUiObjectProject": "Governance"
},
{
"action": "Add UI Object",
"actionProject": "Visual-Scripting",
@@ -58,6 +68,12 @@
"childType": "Staking Program",
"autoAdd": false
},
{
"name": "liquidityProgram",
"type": "node",
"childType": "Liquidity Program",
"autoAdd": false
},
{
"name": "delegationProgram",
"type": "node",
@@ -0,0 +1,52 @@
{
"type": "Liquidity Program",
"menuItems": [
{
"action": "Configure",
"actionFunction": "uiObject.configEditor.activate",
"label": "Configure",
"iconPathOn": "configuration",
"iconPathOff": "configuration"
},
{
"action": "Add UI Object",
"actionProject": "Visual-Scripting",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "tokensAwarded",
"actionFunction": "payload.executeAction",
"label": "Add Tokens Awarded",
"relatedUiObject": "Tokens Awarded",
"relatedUiObjectProject": "Governance"
},
{
"action": "Delete UI Object",
"actionProject": "Visual-Scripting",
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
"editors": {
"config": true
},
"initialValues": {
"config": "{}"
},
"attachingRules": {
"compatibleTypes": "->Financial Programs->"
},
"addLeftIcons": true,
"level": 1,
"propertyNameAtParent": "liquidityProgram",
"childrenNodesProperties": [
{
"name": "tokensAwarded",
"type": "node",
"childType": "Tokens Awarded",
"autoAdd": true
}
]
}
@@ -6,8 +6,8 @@ function newGovernanceFunctionLibraryDistributionProcess() {
}
const DISTRIBUTION_PROCESS_RECALCULATION_DELAY = 5000
let loop
let loop
return thisObject
function initialize() {
@@ -18,7 +18,7 @@ function newGovernanceFunctionLibraryDistributionProcess() {
function finalize() {
loop = false
}
function calculate() {
let pools = UI.projects.foundations.spaces.designSpace.workspace.getHierarchyHeadsByNodeType('Pools')
@@ -110,6 +110,13 @@ function newGovernanceFunctionLibraryDistributionProcess() {
userProfiles
)
/*
Run the Liquidity Program
*/
UI.projects.governance.functionLibraries.liquidityProgram.calculate(
pools,
userProfiles
)
/*
Run the Claims Program
*/
UI.projects.governance.functionLibraries.claimsProgram.calculate(
@@ -0,0 +1,176 @@
function newGovernanceFunctionLibraryLiquidityProgram() {
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 Liquidity 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, "Liquidity-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, "Liquidity 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, "Liquidity 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, "Liquidity Program")
if (program === undefined) { continue }
if (program.payload === undefined) { continue }
if (program.payload.liquidityProgram.isActive === false) { continue }
distributeProgram(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, "Liquidity Program")
if (program === undefined) { continue }
if (program.payload === undefined) { continue }
if (program.payload.liquidityProgram.isActive === false) { continue }
calculateProgram(program)
}
function resetProgram(node) {
if (node === undefined) { return }
if (node.payload === undefined) { return }
if (node.payload.liquidityProgram === undefined) {
node.payload.liquidityProgram = {
count: 0,
percentage: 0,
outgoingPower: 0,
ownPower: 0,
incomingPower: 0,
awarded: {
tokens: 0,
percentage: 0
}
}
} else {
node.payload.liquidityProgram.count = 0
node.payload.liquidityProgram.percentage = 0
node.payload.liquidityProgram.outgoingPower = 0
node.payload.liquidityProgram.ownPower = 0
node.payload.liquidityProgram.incomingPower = 0
node.payload.liquidityProgram.awarded = {
tokens: 0,
percentage: 0
}
}
}
function validateProgram(node, userProfile) {
/*
This program is not going to run unless the Profile has Liquidity Tokens, and for
that users needs to execute the setup procedure of signing their Github
username with their private key.
*/
if (
userProfile.payload.liquidityTokens === undefined
) {
node.payload.liquidityProgram.isActive = false
userProfile.payload.uiObject.setErrorMessage(
"Waiting for liquidity balance. It takes 6 seconds to load the liquidity provided by each profile, bacause you are using a free API provided by BSC Scan.",
UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
)
return
} else {
userProfile.payload.uiObject.resetErrorMessage()
node.payload.liquidityProgram.isActive = true
}
}
function distributeProgram(programNode, userProfile) {
if (programNode === undefined || programNode.payload === undefined) { return }
/*
Here we will convert Liquidity Tokens into Liquidity Power.
As per system rules Liquidity Powar = userProfile.payload.liquidityTokens
*/
let programPower = userProfile.payload.liquidityTokens
programNode.payload.liquidityProgram.ownPower = programPower
accumulatedProgramPower = accumulatedProgramPower + programPower
}
function calculateProgram(programNode) {
if (programNode.payload === undefined) { return }
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.",
UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
)
return
}
/*
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.
*/
programNode.payload.liquidityProgram.awarded.percentage = programNode.payload.liquidityProgram.ownPower * 100 / accumulatedProgramPower
programNode.payload.liquidityProgram.awarded.tokens = programPoolTokenReward * programNode.payload.liquidityProgram.awarded.percentage / 100
drawProgram(programNode)
}
function drawProgram(node) {
if (node.payload !== undefined) {
const ownPowerText = parseFloat(node.payload.liquidityProgram.ownPower.toFixed(2)).toLocaleString('en')
const percentageText = parseFloat(node.payload.liquidityProgram.awarded.percentage.toFixed(2)).toLocaleString('en')
node.payload.uiObject.statusAngleOffset = 0
node.payload.uiObject.statusAtAngle = false
node.payload.uiObject.setStatus(ownPowerText + ' Liquidity Power' + ' - ' + percentageText + ' % Pool ', UI.projects.governance.globals.designer.SET_STATUS_COUNTER)
}
if (node.tokensAwarded !== undefined && node.tokensAwarded.payload !== undefined) {
const tokensAwardedText = parseFloat(node.payload.liquidityProgram.awarded.tokens.toFixed(0)).toLocaleString('en')
const tokensAwardedBTC = ' ≃ ' + UI.projects.governance.utilities.conversions.estimateSATokensInBTC(node.payload.liquidityProgram.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, UI.projects.governance.globals.designer.SET_VALUE_COUNTER)
}
}
}
}
+2 -1
View File
@@ -3,7 +3,8 @@ function newGovernanceGlobalsSaToken() {
SA_TOKEN_BSC_CONTRACT_ADDRESS: '0xfb981ed9a92377ca4d75d924b9ca06df163924fd',
SA_TOKEN_BSC_CONTRACT_ABI: '[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"amount","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"listAddress","type":"address"},{"name":"isBlackListed","type":"bool"}],"name":"blackListAddress","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_decimals","type":"uint256"},{"name":"_supply","type":"uint256"},{"name":"tokenOwner","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"burner","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"blackListed","type":"address"},{"indexed":false,"name":"value","type":"bool"}],"name":"Blacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value",Line truncated
SA_TOKEN_BSC_TREASURY_ACCOUNT_ADDRESS: '0x8d4d2557ce99f83f658adf61eef3e61e04c2ac2c',
SA_TOKEN_BSC_DECIMAL_FACTOR: 1000000000000000000
SA_TOKEN_BSC_DECIMAL_FACTOR: 1000000000000000000,
SA_TOKEN_BSC_PANCAKE_LIQUIDITY_POOL_CONTRACT_ADDRESS: '0x7164b91db59c50156b63d0e31da08cd47b031711'
}
return thisObject
}
@@ -0,0 +1,122 @@
function newGovernanceReportsLiquidity() {
let thisObject = {
addHTML: addHTML,
initialize: initialize,
finalize: finalize
}
return thisObject
function initialize() {
}
function finalize() {
}
function addHTML(tabIndex, filters) {
/*
Parameters
*/
let table = 'Liquidity'
let programName = 'Liquidity Program'
let programPropertyName = 'liquidityProgram'
/*
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": "LiquidityPower",
"label": "Liquidity Power",
"type": "number",
"order": "descending",
"textAlign": "center",
"format": "2 decimals"
},
{
"name": "Percentage",
"label": "Percentage",
"type": "number",
"order": "descending",
"textAlign": "center",
"format": "percentage"
},
{
"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,
"LiquidityPower": program.payload[programPropertyName].ownPower,
"percentage": program.payload[programPropertyName].awarded.percentage,
"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
)
}
}
@@ -41,6 +41,7 @@ function newGovernanceReportsReportsPage() {
'Claims',
'Votes',
'Staking',
'Liquidity',
'Delegation',
'Pools',
'Assets',
@@ -133,6 +134,12 @@ function newGovernanceReportsReportsPage() {
resultCounter = response.resultCounter
break
}
case 'Liquidity': {
let response = UI.projects.governance.spaces.reportsSpace.liquidity.addHTML(10, filters)
HTML = HTML + response.HTML
resultCounter = response.resultCounter
break
}
case 'Delegation': {
let response = UI.projects.governance.spaces.reportsSpace.delegation.addHTML(11, filters)
HTML = HTML + response.HTML
@@ -15,6 +15,7 @@ function newGobernanceReportsSpace() {
claims: undefined,
votes: undefined,
staking: undefined,
liquidity: undefined,
delegations: undefined,
github: undefined,
airdrop: undefined,
@@ -91,6 +92,9 @@ function newGobernanceReportsSpace() {
thisObject.staking.finalize()
thisObject.staking = undefined
thisObject.liquidity.finalize()
thisObject.liquidity = undefined
thisObject.delegation.finalize()
thisObject.delegation = undefined
@@ -150,6 +154,7 @@ function newGobernanceReportsSpace() {
thisObject.claims = newGovernanceReportsClaims()
thisObject.votes = newGovernanceReportsVotes()
thisObject.staking = newGovernanceReportsStaking()
thisObject.liquidity = newGovernanceReportsLiquidity()
thisObject.delegation = newGovernanceReportsDelegation()
thisObject.github = newGovernanceReportsGithub()
thisObject.airdrop = newGovernanceReportsAirdrop()
@@ -171,6 +176,7 @@ function newGobernanceReportsSpace() {
thisObject.claims.initialize()
thisObject.votes.initialize()
thisObject.staking.initialize()
thisObject.liquidity.initialize()
thisObject.delegation.initialize()
thisObject.github.initialize()
thisObject.airdrop.initialize()
@@ -15,7 +15,7 @@ function newGovernanceUserProfileSpace() {
}
let waitingForResponses = 0
const BSC_SCAN_RATE_LIMIT_DELAY = 6000
const BSC_SCAN_RATE_LIMIT_DELAY = 12000
let reputationByAddress = new Map()
return thisObject
@@ -422,6 +422,9 @@ function newGovernanceUserProfileSpace() {
blockchainAccount !== "" &&
userProfile.payload.blockchainTokens === undefined
) {
waitingForResponses++
userProfile.payload.liquidityTokens = 0 // We need to set this value here so that the next call to BSCSCAN is not done more than once.
setTimeout(getBPancakeTokens, BSC_SCAN_RATE_LIMIT_DELAY / 2, userProfile, blockchainAccount)
waitingForResponses++
userProfile.payload.blockchainTokens = 0 // We need to set this value here so that the next call to BSCSCAN is not done more than once.
setTimeout(getBlockchainTokens, BSC_SCAN_RATE_LIMIT_DELAY, userProfile, blockchainAccount)
@@ -459,6 +462,36 @@ function newGovernanceUserProfileSpace() {
waitingForResponses--
});
}
function getBPancakeTokens(userProfile, blockchainAccount) {
console.log('[INFO] Loading Pancake Balance for User Profile: ', userProfile.name, 'blockchainAccount: ', blockchainAccount)
const url = "https://api.bscscan.com/api?module=account&action=tokenbalance&contractaddress=" + UI.projects.governance.globals.saToken.SA_TOKEN_BSC_PANCAKE_LIQUIDITY_POOL_CONTRACT_ADDRESS + "&address=" + blockchainAccount + "&tag=latest&apikey=YourApiKeyToken"
fetch(url).then(function (response) {
return response.json();
}).then(function (data) {
//console.log(data)
if (data.result === "Max rate limit reached, please use API Key for higher rate limit") {
userProfile.payload.liquidityTokens = undefined // This enables this profile to query the blockchain again.
} else {
userProfile.payload.uiObject.setInfoMessage('Pancake Balance Succesfully Loaded.',
UI.projects.governance.globals.designer.SET_INFO_COUNTER_FACTOR
)
userProfile.payload.liquidityTokens = Number(data.result) / 1000000000000000000
console.log('Liquidity of ' + userProfile.name + ' is ', userProfile.payload.liquidityTokens)
}
waitingForResponses--
}).catch(function (err) {
const message = err.message + ' - ' + 'Can not access BSC SCAN servers.'
console.log(message)
if (userProfile.payload !== undefined) {
userProfile.payload.uiObject.setErrorMessage(message,
UI.projects.governance.globals.designer.SET_ERROR_COUNTER_FACTOR
)
}
waitingForResponses--
});
}
}
function draw() {
+3 -2
View File
@@ -135,17 +135,18 @@ function newGovernanceUtilitiesTables() {
}
}
let value = tableRecord[property]
if (value === undefined) { value = 0 }
switch (format) {
case 'text': {
break
}
case 'integer': {
value = parseFloat(parseFloat(value | 0).toFixed(0)).toLocaleString('en')
value = parseFloat(parseFloat(value).toFixed(0)).toLocaleString('en')
break
}
case '2 decimals': {
value = parseFloat(parseFloat(value | 0).toFixed(2)).toLocaleString('en')
value = parseFloat(parseFloat(value).toFixed(2)).toLocaleString('en')
break
}
case 'percentage': {
+5
View File
@@ -1239,6 +1239,11 @@
"propertyName": "stakingProgram",
"functionName": "newGovernanceFunctionLibraryStakingProgram"
},
{
"name": "Liquidity Program",
"propertyName": "liquidityProgram",
"functionName": "newGovernanceFunctionLibraryLiquidityProgram"
},
{
"name": "Profile Constructor",
"propertyName": "profileConstructor",
+8
View File
@@ -84,6 +84,9 @@ You can use the windows installer (Setup file) which will install all the necess
> **NOTE**
> There's a known issue where the screen stays white. In this case, go to "View/Reload" and it should work.
> **NOTE**
> The application is not signed yet. The antivirus probably will flag the file as unsecure. You can force the installation and running or way for the signed app.
The manual installation option, tailored for users who are experienced and who want to contribute to the project (highly appreciated and rewarded with SA tokens). Follow the install wizards to install the latest NodeJS and Github Desktop applications.
- [Node.js download page](https://nodejs.org/en/download/). Select "Current" then "Windows Installer", then follow the wizard to install after the download completes.
@@ -93,6 +96,11 @@ The manual installation option, tailored for users who are experienced and who w
### Mac OS Install
You can use the MacOS installer (DMG file) which will install all the necessary dependencies and files for you to run the platform. Also the shortcuts are placed. This application will notify you and update as new releases come (to be released).
> **NOTE**
> The application is not signed. To be able to run you have to permit it in System Preferences > Security & Privacy > General > Open Anyway.
[Homebrew](https://brew.sh/) can be used to install the requirements with minimal effort on Mac OS. After you clone the repository, change directory to the Superalgos base and install the requirements using the Brewfile. Python 3 is only required for running machine learning (TensorFlow).
```sh
+52
View File
@@ -0,0 +1,52 @@
{
"appId": "org.superalgos.platform",
"productName": "Superalgos",
"asar": false,
"generateUpdatesFilesForAllChannels": true,
"files": [
"**/*",
"!.github",
"!.vscode",
"!.dockerignore${/*}",
"!Platform/My-Data-Storage/*",
"!Platform/My-Log-Files/*",
"!Platform/My-Workspaces/*",
"!Docker",
"!Launch-Scripts",
"!run.js",
"!setup.js",
"!uninstall.js"
],
"win": {
"target": [
{
"target": "nsis",
"arch": "x64"
}
],
"artifactName": "${productName}-${os}-${version}.${ext}",
"icon": "./build/superalgos.ico"
},
"publish": {
"provider": "github",
"vPrefixedTagName": false,
"releaseType": "prerelease"
},
"nsis": {
"oneClick": false,
"perMachine": false,
"allowElevation": false,
"allowToChangeInstallationDirectory": true,
"createDesktopShortcut": true,
"createStartMenuShortcut": true,
"license": "./LICENSE",
"runAfterFinish": false,
"artifactName": "${productName}_Setup_${os}_${version}.${ext}"
},
"mac": {
"artifactName": "${productName}-${os}-${version}.${ext}",
"category": "public.app-category.finance",
"target": "default",
"icon": "build/icon.icns"
}
}
-5
View File
@@ -1,5 +0,0 @@
/* Load Environment Variables */
let ENVIRONMENT = require('./Environment.js');
let ENVIRONMENT_MODULE = ENVIRONMENT.newEnvironment()
global.env = ENVIRONMENT_MODULE
-61
View File
@@ -1,61 +0,0 @@
/**
* @name get list of links
*
* @desc Scrapes docs div for links
*/
const fs = require('fs');
const puppeteer = require('puppeteer');
// URL of the page we want to scrape
const url = 'http://localhost:34248';
const path = "docs/" + `page-${Date.now()}.html`;
(async () => {
const browser = await puppeteer.launch({ headless: false })
const page = await browser.newPage()
await page.setViewport({ width: 1280, height: 720 })
// Wait that network traffic stops. This is localhost, maybe not relevant?
await page.goto(url, {waitUntil: 'networkidle2'})
// Wait for page load and get the selector needed
await page.waitForSelector('.credits', {hidden: false});
//await page.waitForNavigation(5); // Another solution??
// Gather asset page urls for all the document pages
const assetUrls = await page.$$eval(
'a.onClick', onClick => { return anchors.map(anchor => anchor.textContent)});
const results = [];
// Visit each assets page one by one
for (let assetsUrl of assetUrls) {
await page.goto(assetsUrl);
// Now collect all the ICO urls.
const icoUrls = await page.$$eval(
'#page-wrapper > main > div.container > div > table > tbody > tr > td:nth-child(2) a',
links => links.map(link => link.href)
);
// Visit each ICO one by one and collect the data.
for (let icoUrl of icoUrls) {
await page.goto(icoUrl);
const icoImgUrl = await page.$eval('#asset-logo-wrapper img', img => img.src);
const icoName = await page.$eval('h1', h1 => h1.innerText.trim());
// TODO: Gather all the needed info like description etc here.
results.push([{
icoName,
icoUrl,
icoImgUrl
}]);
}
}
// Results are ready
console.log(results);
fs.writeFileSync(path, await page.content());
await page.tracing.stop()
await browser.close()
})()
-190
View File
@@ -1,190 +0,0 @@
/**
* Copyright 2018 Google Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* @author ebidel@ (Eric Bidelman)
*/
/**
* Discovers all the pages in site or single page app (SPA) and creates
* a tree of the result in ./output/<site slug/crawl.json. Optionally
* takes screenshots of each page as it is visited.
*
* Usage:
* node crawlsite.js
* URL=https://yourspa.com node crawlsite.js
* URL=https://yourspa.com node crawlsite.js --screenshots
*
* Then open the visualizer in a browser:
* http://localhost:8080/html/d3tree.html
* http://localhost:8080/html/d3tree.html?url=../output/https___yourspa.com/crawl.json
*
*Start Server:
* node server.js
*
*/
/**
* Altered for Superalgos documentation export
*
* @author NAmorim@ (Nuno Amorim)
*
*/
const fs = require('fs');
const del = require('del');
const util = require('util');
const puppeteer = require('puppeteer');
const sharp = require('sharp');
const URL = process.env.URL || 'http://localhost:34248/';
const SCREENSHOTS = process.argv.includes('--screenshots');
const DEPTH = parseInt(process.env.DEPTH) || 2;
const VIEWPORT = SCREENSHOTS ? {width: 1028, height: 800, deviceScaleFactor: 2} : null;
const OUT_DIR = process.env.OUTDIR || `doc_output/${slugify(URL)}`;
const crawledPages = new Map();
const maxDepth = DEPTH; // Subpage depth to crawl site.
function slugify(str) {
return str.replace(/[\/:]/g, '_');
}
function mkdirSync(dirPath) {
try {
dirPath.split('/').reduce((parentPath, dirName) => {
const currentPath = parentPath + dirName;
if (!fs.existsSync(currentPath)) {
fs.mkdirSync(currentPath);
}
return currentPath + '/';
}, '');
} catch (err) {
if (err.code !== 'EEXIST') {
throw err;
}
}
}
/**
* Finds all anchors on the page, inclusive of those within shadow roots.
* Note: Intended to be run in the context of the page.
* @param {boolean=} sameOrigin When true, only considers links from the same origin as the app.
* @return {!Array<string>} List of anchor hrefs.
*/
function collectAllSameOriginAnchorsDeep(sameOrigin = true) {
const allElements = [];
const findAllElements = function(nodes) {
for (let i = 0, el; el = nodes[i]; ++i) {
allElements.push(el);
// If the element has a shadow root, dig deeper.
if (el.shadowRoot) {
findAllElements(el.shadowRoot.querySelectorAll('*'));
}
}
};
findAllElements(document.querySelectorAll('doc*'));
const filtered = allElements
.filter(el => el.localName === 'a' && el.href) // element is an anchor with an href.
.filter(el => el.href !== location.href) // link doesn't point to page's own URL.
.filter(el => {
if (sameOrigin) {
return new URL(location).origin === new URL(el.href).origin;
}
return true;
})
.map(a => a.href);
return Array.from(new Set(filtered));
}
/**
* Crawls a URL by visiting an url, then recursively visiting any child subpages.
* @param {!Browser} browser
* @param {{url: string, title: string, img?: string, children: !Array<!Object>}} page Current page.
* @param {number=} depth Current subtree depth of crawl.
*/
async function crawl(browser, page, depth = 0) {
if (depth > maxDepth) {
return;
}
// If we've already crawled the URL, we know its children.
if (crawledPages.has(page.url)) {
console.log(`Reusing route: ${page.url}`);
const item = crawledPages.get(page.url);
page.title = item.title;
page.img = item.img;
page.children = item.children;
// Fill in the children with details (if they already exist).
page.children.forEach(c => {
const item = crawledPages.get(c.url);
c.title = item ? item.title : '';
c.img = item ? item.img : null;
});
return;
} else {
console.log(`Loading: ${page.url}`);
const newPage = await browser.newPage();
await newPage.goto(page.url, {waitUntil: 'networkidle2'});
let anchors = await newPage.evaluate(collectAllSameOriginAnchorsDeep);
anchors = anchors.filter(a => a !== URL) // link doesn't point to start url of crawl.
page.title = await newPage.evaluate('document.title');
page.children = anchors.map(url => ({url}));
if (SCREENSHOTS) {
const path = `./${OUT_DIR}/${slugify(page.url)}.png`;
let imgBuff = await newPage.screenshot({fullPage: false});
imgBuff = await sharp(imgBuff).resize(null, 150).toBuffer(); // resize image to 150 x auto.
util.promisify(fs.writeFile)(path, imgBuff); // async
page.img = `data:img/png;base64,${imgBuff.toString('base64')}`;
}
crawledPages.set(page.url, page); // cache it.
await newPage.close();
}
// Crawl subpages.
for (const childPage of page.children) {
await crawl(browser, childPage, depth + 1);
}
}
(async() => {
mkdirSync(OUT_DIR); // create output dir if it doesn't exist.
await del([`${OUT_DIR}/*`]); // cleanup after last run.
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
if (VIEWPORT) {
await page.setViewport(VIEWPORT);
}
const root = {url: URL};
await crawl(browser, root);
await util.promisify(fs.writeFile)(`./${OUT_DIR}/crawl.json`, JSON.stringify(root, null, ' '));
await browser.close();
})();
-253
View File
@@ -826,16 +826,6 @@
"integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==",
"dev": true
},
"@types/yauzl": {
"version": "2.9.2",
"resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz",
"integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==",
"dev": true,
"optional": true,
"requires": {
"@types/node": "*"
}
},
"abort-controller": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
@@ -858,15 +848,6 @@
"resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz",
"integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0="
},
"agent-base": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
"integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
"dev": true,
"requires": {
"debug": "4"
}
},
"ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@@ -1151,30 +1132,6 @@
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz",
"integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA=="
},
"bl": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
"integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
"dev": true,
"requires": {
"buffer": "^5.5.0",
"inherits": "^2.0.4",
"readable-stream": "^3.4.0"
},
"dependencies": {
"readable-stream": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
"dev": true,
"requires": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
"util-deprecate": "^1.0.1"
}
}
}
},
"blakejs": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.1.tgz",
@@ -2083,12 +2040,6 @@
"dev": true,
"optional": true
},
"devtools-protocol": {
"version": "0.0.901419",
"resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.901419.tgz",
"integrity": "sha512-4INMPwNm9XRpBukhNbF7OB6fNTTCaI8pzy/fXg0xQzAy5h3zL1P8xT3QazgKqBrb/hAYwIBizqDBZ7GtJE74QQ==",
"dev": true
},
"diffie-hellman": {
"version": "5.0.3",
"resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
@@ -2944,16 +2895,6 @@
}
}
},
"find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
"requires": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
}
},
"foreach": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
@@ -2984,12 +2925,6 @@
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
},
"fs-constants": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
"dev": true
},
"fs-extra": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
@@ -3345,16 +3280,6 @@
"resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz",
"integrity": "sha1-PDfHrhqO65ZpBKKtHpdaGUt+06Q="
},
"https-proxy-agent": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
"integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
"dev": true,
"requires": {
"agent-base": "6",
"debug": "4"
}
},
"iconv-corefoundation": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.6.tgz",
@@ -3878,15 +3803,6 @@
"resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz",
"integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q=="
},
"locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"requires": {
"p-locate": "^4.1.0"
}
},
"lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
@@ -4265,35 +4181,11 @@
"resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
"integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
},
"p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"requires": {
"p-try": "^2.0.0"
}
},
"p-locate": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"requires": {
"p-limit": "^2.2.0"
}
},
"p-timeout": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-4.1.0.tgz",
"integrity": "sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw=="
},
"p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true
},
"package-json": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
@@ -4352,12 +4244,6 @@
}
}
},
"path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true
},
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
@@ -4405,15 +4291,6 @@
"dev": true,
"optional": true
},
"pkg-dir": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
"integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
"dev": true,
"requires": {
"find-up": "^4.0.0"
}
},
"plist": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/plist/-/plist-3.0.4.tgz",
@@ -4475,12 +4352,6 @@
"ipaddr.js": "1.9.1"
}
},
"proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
"dev": true
},
"psl": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
@@ -4522,76 +4393,6 @@
"escape-goat": "^2.0.0"
}
},
"puppeteer": {
"version": "10.4.0",
"resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-10.4.0.tgz",
"integrity": "sha512-2cP8mBoqnu5gzAVpbZ0fRaobBWZM8GEUF4I1F6WbgHrKV/rz7SX8PG2wMymZgD0wo0UBlg2FBPNxlF/xlqW6+w==",
"dev": true,
"requires": {
"debug": "4.3.1",
"devtools-protocol": "0.0.901419",
"extract-zip": "2.0.1",
"https-proxy-agent": "5.0.0",
"node-fetch": "2.6.1",
"pkg-dir": "4.2.0",
"progress": "2.0.1",
"proxy-from-env": "1.1.0",
"rimraf": "3.0.2",
"tar-fs": "2.0.0",
"unbzip2-stream": "1.3.3",
"ws": "7.4.6"
},
"dependencies": {
"debug": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"dev": true,
"requires": {
"ms": "2.1.2"
}
},
"extract-zip": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
"integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
"dev": true,
"requires": {
"@types/yauzl": "^2.9.1",
"debug": "^4.1.1",
"get-stream": "^5.1.0",
"yauzl": "^2.10.0"
}
},
"get-stream": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
"integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
"dev": true,
"requires": {
"pump": "^3.0.0"
}
},
"node-fetch": {
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
"integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==",
"dev": true
},
"progress": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz",
"integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==",
"dev": true
},
"ws": {
"version": "7.4.6",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
"integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
"dev": true
}
}
},
"qs": {
"version": "6.5.2",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
@@ -5310,44 +5111,6 @@
}
}
},
"tar-fs": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz",
"integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==",
"dev": true,
"requires": {
"chownr": "^1.1.1",
"mkdirp": "^0.5.1",
"pump": "^3.0.0",
"tar-stream": "^2.0.0"
}
},
"tar-stream": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
"integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
"dev": true,
"requires": {
"bl": "^4.0.3",
"end-of-stream": "^1.4.1",
"fs-constants": "^1.0.0",
"inherits": "^2.0.3",
"readable-stream": "^3.1.1"
},
"dependencies": {
"readable-stream": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
"dev": true,
"requires": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
"util-deprecate": "^1.0.1"
}
}
}
},
"telegraf": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/telegraf/-/telegraf-4.4.2.tgz",
@@ -5403,12 +5166,6 @@
}
}
},
"through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
"integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
"dev": true
},
"timed-out": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
@@ -5550,16 +5307,6 @@
"which-boxed-primitive": "^1.0.2"
}
},
"unbzip2-stream": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz",
"integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==",
"dev": true,
"requires": {
"buffer": "^5.2.1",
"through": "^2.3.8"
}
},
"unique-string": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
+3 -49
View File
@@ -2,7 +2,6 @@
"name": "superalgos",
"version": "0.0.12-beta",
"description": "Superalgos is a free, open-source crypto trading bot",
"main": "electron-wrapper.js",
"license": "Apache License 2.0",
"homepage": "https://www.superalgos.org/",
"author": {
@@ -11,9 +10,8 @@
"scripts": {
"start": "node platform minMemo noBrowser",
"setup": "node setup noShortcuts",
"release": "electron-builder -w",
"postinstall": "electron-builder install-app-deps",
"genDoc": "node gen_docs"
"dist": "electron-builder",
"postinstall": "electron-builder install-app-deps"
},
"dependencies": {
"@octokit/rest": "^18.11.4",
@@ -39,50 +37,6 @@
},
"devDependencies": {
"electron": "^15.1.0",
"electron-builder": "^22.11.7",
"puppeteer": "^10.4.0"
},
"build": {
"appId": "org.superalgos.platform",
"productName": "Superalgos",
"asar": false,
"files": [
"**/*",
"!.github",
"!.vscode",
"!.dockerignore${/*}",
"!Platform/My-Data-Storage/*",
"!Platform/My-Log-Files/*",
"!Platform/My-Workspaces/*",
"!Docker",
"!Launch-Scripts",
"!run.js",
"!setup.js",
"!uninstall.js"
],
"win": {
"target": [
{
"target": "nsis",
"arch": "x64"
}
],
"icon": "./build/superalgos.ico"
},
"nsis": {
"oneClick": false,
"perMachine": false,
"allowElevation": false,
"allowToChangeInstallationDirectory": true,
"createDesktopShortcut": true,
"createStartMenuShortcut": true,
"license": "./LICENSE",
"runAfterFinish": false
},
"mac": {
"category": "public.app-category.finance",
"target": "default",
"icon": "build/icon.icns"
}
"electron-builder": "^22.11.7"
}
}