Merge pull request #1428 from Superalgos/develop

Develop into Plugins Docs
This commit is contained in:
Luis Fernando Molina authored and GitHub committed 2021-08-08 03:56:38 -04:00
commit 418efe032c
154 files changed
+109027 -54705

No files matched your search

+342 -10
View File
@@ -1022,20 +1022,28 @@ exports.newHttpInterface = function newHttpInterface(WEB_SERVER, DATA_FILE_SERVE
case 'Gov': {
switch (requestParameters[2]) { // switch by command
case 'getGithubStars': {
getProfiles('activity', 'listStargazersForRepo')
getGithubUsernames('activity', 'listStargazersForRepo')
break
}
case 'getGithubWatchers': {
getProfiles('activity', 'listWatchersForRepo')
getGithubUsernames('activity', 'listWatchersForRepo')
break
}
case 'getGithubForks': {
getProfiles('repos', 'listForks')
getGithubUsernames('repos', 'listForks')
break
}
case 'PRs': {
mergeGithubPullRequests()
break
}
case 'Pay': {
payToContributors()
break
}
}
function getProfiles(endpoint, method) {
function getGithubUsernames(endpoint, method) {
try {
const GITHUB_API_WAITING_TIME = 250
const repository = unescape(requestParameters[3])
@@ -1099,13 +1107,13 @@ exports.newHttpInterface = function newHttpInterface(WEB_SERVER, DATA_FILE_SERVE
for (let i = 0; i < listResponse.data.length; i++) {
let listItem = listResponse.data[i]
let githubUsername
switch(endpoint) {
case 'activity' : {
let githubUsername
switch (endpoint) {
case 'activity': {
githubUsername = listItem.login
break
}
case 'repos' : {
case 'repos': {
githubUsername = listItem.owner.login
break
}
@@ -1114,8 +1122,8 @@ exports.newHttpInterface = function newHttpInterface(WEB_SERVER, DATA_FILE_SERVE
githubListArray.push(githubUsername)
}
console.log('[INFO] httpInterface -> Gov -> getRepoInfo -> doGithub -> getList -> ' + method + ' Page = ' + page)
console.log('[INFO] httpInterface -> Gov -> getRepoInfo -> doGithub -> getList -> ' + method + ' Received = ' + listResponse.data.length)
console.log('[INFO] httpInterface -> Gov -> getRepoInfo -> doGithub -> getList -> ' + method + ' Page = ' + page)
console.log('[INFO] httpInterface -> Gov -> getRepoInfo -> doGithub -> getList -> ' + method + ' Received = ' + listResponse.data.length)
} catch (err) {
console.log(err)
@@ -1152,6 +1160,7 @@ exports.newHttpInterface = function newHttpInterface(WEB_SERVER, DATA_FILE_SERVE
respondWithContent(JSON.stringify(error), httpResponse)
}
}
function respondWithDocsObject(docs, error) {
if (error.message !== undefined) {
@@ -1186,6 +1195,295 @@ exports.newHttpInterface = function newHttpInterface(WEB_SERVER, DATA_FILE_SERVE
respondWithContent(JSON.stringify(customResponse), httpResponse)
}
function mergeGithubPullRequests() {
try {
let commitMessage = unescape(requestParameters[3])
/* Unsavping # */
for (let i = 0; i < 10; i++) {
commitMessage = commitMessage.replace('_SLASH_', '/')
commitMessage = commitMessage.replace('_HASHTAG_', '#')
}
const GITHUB_API_WAITING_TIME = 250
const repository = 'Superalgos'
const username = unescape(requestParameters[4])
const token = unescape(requestParameters[5])
let error
let githubPrListArray = []
processOpenPullRequests()
async function processOpenPullRequests() {
await doGithub()
if (error !== undefined) {
let docs = {
project: 'Governance',
category: 'Topic',
type: 'Gov Error - Merge Pull Requests',
anchor: undefined,
placeholder: {}
}
respondWithDocsObject(docs, error)
return
}
respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
}
async function doGithub() {
try {
const repo = repository
const owner = 'Superalgos'
const { Octokit } = require("@octokit/rest")
const octokit = new Octokit({
auth: token,
userAgent: 'Superalgos Beta 11'
})
await getPrList()
await mergePrs()
async function getPrList() {
const per_page = 100 // Max
let page = 0
let lastPage = false
while (lastPage === false) {
try {
page++
await sleep(GITHUB_API_WAITING_TIME)
let listResponse = await octokit.rest.pulls.list({
owner: owner,
repo: repo,
state: 'open',
head: 'develop',
base: 'develop',
sort: undefined,
direction: undefined,
per_page: per_page,
page: page
});
if (listResponse.data.length < 100) {
lastPage = true
}
console.log('[INFO] httpInterface -> Gov -> mergeGithubPullRequests -> doGithub -> getPrList -> Receiving Page = ' + page)
for (let i = 0; i < listResponse.data.length; i++) {
let pullRequest = listResponse.data[i]
console.log('[INFO] httpInterface -> Gov -> mergeGithubPullRequests -> doGithub -> getPrList -> Pull Request "' + pullRequest.title + '" found and added to the list to validate. ')
githubPrListArray.push(pullRequest)
}
console.log('[INFO] httpInterface -> Gov -> mergeGithubPullRequests -> doGithub -> getPrList -> Received = ' + listResponse.data.length)
} catch (err) {
console.log(err)
if (err.stack.indexOf('last page') >= 0) {
return
} else {
console.log('[ERROR] httpInterface -> Gov -> mergeGithubPullRequests -> doGithub -> getPrList ->Method call produced an error.')
console.log('[ERROR] httpInterface -> Gov -> mergeGithubPullRequests -> doGithub -> getPrList ->err.stack = ' + err.stack)
console.log('[ERROR] httpInterface -> Gov -> mergeGithubPullRequests -> doGithub -> getPrList ->repository = ' + repository)
console.log('[ERROR] httpInterface -> Gov -> mergeGithubPullRequests -> doGithub -> getPrList ->username = ' + username)
console.log('[ERROR] httpInterface -> Gov -> mergeGithubPullRequests -> doGithub -> getPrList ->token starts with = ' + token.substring(0, 10) + '...')
console.log('[ERROR] httpInterface -> Gov -> mergeGithubPullRequests -> doGithub -> getPrList ->token ends with = ' + '...' + token.substring(token.length - 10))
error = err
}
}
}
}
async function mergePrs() {
/*
In order to automatically merge a PRs we will run several validations first.
We want to automate specifically the merging of Profile File changes at the
Governance System done by the same Github user name that matches the profile
changed. We will also not do the merge if there are more than one file at the
PR.
We will go through the list of open PRs and run the validations at each one of them.
*/
console.log('[INFO] httpInterface -> Gov -> mergeGithubPullRequests -> Ready to Validate ' + githubPrListArray.length + ' pull requests. ')
for (let i = 0; i < githubPrListArray.length; i++) {
let pullRequest = githubPrListArray[i]
/*
Lets get the files changed at this Pull Request.
*/
await sleep(GITHUB_API_WAITING_TIME)
let listResponse = await octokit.rest.pulls.listFiles({
owner: owner,
repo: repo,
pull_number: pullRequest.number
});
/*
Validation #1: If the PR has more than one file, then we will not automatically
merge it.
*/
if (listResponse.data.length !== 1) {
console.log('[INFO] httpInterface -> Gov -> mergeGithubPullRequests -> Validation #1 Failed -> Pull Request "' + pullRequest.title + '" not merged because it contains more than 1 file. -> fileCount = ' + listResponse.data.length)
/*
We will close PRs that contains any User Profile file together with other files in the same Pull Request.
This will avoid manual merges to include User Profile files.
*/
for (j = 0; j < listResponse.data.length; j++) {
let pullRequestFile = listResponse.data[j]
let fileContentUrl = pullRequestFile.raw_url
if (fileContentUrl.indexOf('Governance/Plugins/User-Profiles') >= 0) {
await sleep(GITHUB_API_WAITING_TIME)
await octokit.rest.issues.createComment({
owner: owner,
repo: repo,
issue_number: pullRequest.number,
body: 'This Pull Request could not be automatically merged and was closed by the Superalgos Governance System because it was detected that a User Profile file... \n\n' + fileContentUrl + '\n\n...was submitted together with ' + (listResponse.data.length - 1) + ' other file/s. User Profiles files as per the Governance System rules, must be the only file present at a Pull Request in order to pass all the validations and be automatically merged.'
});
await sleep(GITHUB_API_WAITING_TIME)
await octokit.rest.pulls.update({
owner: owner,
repo: repo,
pull_number: pullRequest.number,
state: 'closed'
});
break
}
}
continue
}
let pullRequestFile = listResponse.data[0]
/*
Validation #2: File Name must be the same to the Github Username of the PR owner.
*/
let fileContentUrl = pullRequestFile.raw_url
if (fileContentUrl.indexOf('Governance/Plugins/User-Profiles') < 0) {
/*
If it is not a user profile then there is no need to auto merge.
*/
console.log('[INFO] httpInterface -> Gov -> mergeGithubPullRequests -> Validation #2 Failed -> Pull Request "' + pullRequest.title + '" not merged because the file modified at the Pull Request is not a User Profile file. -> fileContentUrl = ' + fileContentUrl)
continue
}
let splittedURL = fileContentUrl.split('/')
let fileName = splittedURL[splittedURL.length - 1]
let splittedFileName = fileName.split('.')
fileName = splittedFileName[0]
let githubUsername = pullRequest.user.login
if (githubUsername !== fileName) {
console.log('[INFO] httpInterface -> Gov -> mergeGithubPullRequests -> Validation #2 Failed -> Pull Request "' + pullRequest.title + '" not merged because the Github Username is not equal to the File Name. -> Github Username = ' + githubUsername + '-> fileName = ' + fileName)
await sleep(GITHUB_API_WAITING_TIME)
await octokit.rest.issues.createComment({
owner: owner,
repo: repo,
issue_number: pullRequest.number,
body: 'This Pull Request could not be automatically merged and was closed by the Superalgos Governance System because it was detected that the Github User "' + githubUsername + '" who submitted it, is not equal to the name of the User Profile Plugin File.\n\n File Name = "' + fileName + '"'
});
await sleep(GITHUB_API_WAITING_TIME)
await octokit.rest.pulls.update({
owner: owner,
repo: repo,
pull_number: pullRequest.number,
state: 'closed'
});
continue
}
await sleep(GITHUB_API_WAITING_TIME)
let fileContent = await fetchAPIDataFile(fileContentUrl)
let userProfile = JSON.parse(fileContent)
/*
Validation #3: The file changed at the PR is a User Profile.
*/
if (userProfile.type !== 'User Profile') {
console.log('[INFO] httpInterface -> Gov -> mergeGithubPullRequests -> Validation #3 Failed -> Pull Request "' + pullRequest.title + '" not merged because the file modified is not a User Profile. -> Type = ' + userProfile.type)
continue
}
/*
Validation #4: The message signed at the config is not the Github Username.
*/
let config = JSON.parse(userProfile.config)
let messageSigned = config.signature.message
if (messageSigned !== githubUsername) {
console.log('[INFO] httpInterface -> Gov -> mergeGithubPullRequests -> Validation #4 Failed -> Pull Request "' + pullRequest.title + '" not merged because the Github Username is not equal to the Message Signed at the User Profile. -> Github Username = ' + githubUsername + '-> messageSigned = ' + messageSigned)
await sleep(GITHUB_API_WAITING_TIME)
await octokit.rest.issues.createComment({
owner: owner,
repo: repo,
issue_number: pullRequest.number,
body: 'This Pull Request could not be automatically merged and was closed by the Superalgos Governance System because it was detected that the Github User "' + githubUsername + '" who submitted it, is not equal to the Message Signed at the User Profile.\n\n Message Signed = "' + messageSigned + '"'
});
await sleep(GITHUB_API_WAITING_TIME)
await octokit.rest.pulls.update({
owner: owner,
repo: repo,
pull_number: pullRequest.number,
state: 'closed'
});
continue
}
/*
All validations passed, we will proceed an merge this Pull Request.
*/
await sleep(GITHUB_API_WAITING_TIME)
let mergeResponse = await octokit.rest.pulls.merge({
owner: owner,
repo: repo,
pull_number: pullRequest.number,
commit_title: 'Changes in User Profile done by Profile Owner ' + githubUsername + ' automatically merged by Superalgos.'
});
if (mergeResponse.data.merged !== true) {
console.log('[WARN] httpInterface -> Gov -> mergeGithubPullRequests -> Merge Failed -> Pull Request "' + pullRequest.title + '" not merged because Github could not merge it. -> mergeResponse.message = ' + mergeResponse.data.message)
continue
} else {
console.log('[INFO] httpInterface -> Gov -> mergeGithubPullRequests -> Merge Succed -> Pull Request "' + pullRequest.title + '" successfully merged. -> mergeResponse.message = ' + mergeResponse.data.message)
await sleep(GITHUB_API_WAITING_TIME)
await octokit.rest.issues.createComment({
owner: owner,
repo: repo,
issue_number: pullRequest.number,
body: 'This Pull Request was automatically merged by the Superalgos Governance System because it was detected that the Github User " ' + githubUsername + '" who submitted it, modified its own User Profile Plugin File and nothning else but that file. All validations were successfull.'
});
continue
}
}
}
} catch (err) {
console.log('[ERROR] httpInterface -> Gov -> mergeGithubPullRequests -> doGithub -> err.stack = ' + err.stack)
}
}
} catch (err) {
console.log('[ERROR] httpInterface -> Gov -> mergeGithubPullRequests -> Method call produced an error.')
console.log('[ERROR] httpInterface -> Gov -> mergeGithubPullRequests -> err.stack = ' + err.stack)
console.log('[ERROR] httpInterface -> Gov -> mergeGithubPullRequests -> repository = ' + repository)
console.log('[ERROR] httpInterface -> Gov -> mergeGithubPullRequests -> username = ' + username)
console.log('[ERROR] httpInterface -> Gov -> mergeGithubPullRequests -> token starts with = ' + token.substring(0, 10) + '...')
console.log('[ERROR] httpInterface -> Gov -> mergeGithubPullRequests -> token ends with = ' + '...' + token.substring(token.length - 10))
let error = {
result: 'Fail Because',
message: err.message,
stack: err.stack
}
respondWithContent(JSON.stringify(error), httpResponse)
}
}
function payToContributors() {
}
}
break
@@ -2139,4 +2437,38 @@ exports.newHttpInterface = function newHttpInterface(WEB_SERVER, DATA_FILE_SERVE
setTimeout(resolve, ms)
})
}
async function fetchAPIDataFile(url) {
let promise = new Promise((resolve, reject) => {
const fetch = require('node-fetch')
/*
This is how we call the API.
*/
fetch(url)
.then((response) => {
if (response.status !== 200) {
console.log('[ERROR] fetchAPIData -> then -> url =' + url)
reject()
return
}
getResponseBody()
function getResponseBody() {
response.text().then(body => {
resolve(body)
})
}
})
.catch(err => {
console.log('[ERROR] fetchAPIData -> url =' + url)
reject()
})
}
)
return promise
}
}
+1993 -1364
View File
File diff suppressed because it is too large. Load diff
+6 -5
View File
@@ -7,14 +7,15 @@
"name": "Luis-Fernando-Molina"
},
"dependencies": {
"@octokit/rest": "^18.0.12",
"@octokit/rest": "^18.9.0",
"ccxt": "^1.51.98",
"child_process": "^1.0.2",
"lookpath": "^1.2.1",
"lookpath": "^1.2.2",
"open": "^6.4.0",
"rimraf": "^3.0.2",
"simple-git": "^2.31.0",
"web3": "^1.3.0",
"ws": "^7.4.6"
"simple-git": "^2.42.0",
"web3": "^1.5.0",
"ws": "^7.4.6",
"node-fetch": "2.6.1"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

@@ -1,26 +1 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="206 -206 512 512" style="enable-background:new 206 -206 512 512;" xml:space="preserve">
<style type="text/css">
.st0{display:none;}
.st1{display:inline;}
.st2{fill:#E6EAEA;}
.st3{fill:#CDD4D5;}
.st4{fill:#FF8C29;}
.st5{fill:#FD6A33;}
</style>
<g id="Layer_3" class="st0">
<rect x="1030" y="-1030.4" class="st1" width="512" height="512.8"/>
</g>
<path class="st2" d="M462-206v512c141.4,0,256-114.6,256-256S603.4-206,462-206z"/>
<path class="st3" d="M206,50c0,141.4,114.6,256,256,256v-512C320.6-206,206-91.4,206,50z"/>
<polygon class="st4" points="462,-0.2 462,100.2 512.2,50 "/>
<polygon class="st5" points="411.8,50 462,100.2 462,-0.2 "/>
<polygon id="Fill-162" class="st4" points="576.2,50 576,50.2 622.6,96.8 669.4,50 622.2,2.9 575.6,49.5 "/>
<polygon class="st4" points="462,-157.4 462,-64.2 543.9,17.8 590.5,-28.8 "/>
<polygon class="st5" points="334.7,-30 381.2,16.6 462,-64.2 462,-157.4 "/>
<polygon class="st4" points="544.3,81.9 462,164.2 462,257.4 590.9,128.5 "/>
<polygon class="st5" points="380.5,82.6 333.9,129.2 462,257.4 462,164.2 "/>
<polygon class="st5" points="303,1.7 254.6,50 302.2,97.5 348.8,50.9 347.8,50 349.6,48.3 "/>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><style>.cls-1{fill:#e6eaea;}.cls-2{fill:#ff8c29;}.cls-3{fill:#fd6a33;}</style></defs><title>binance-coin</title><g id="Circle"><g id="Circle_Back" data-name="Circle Back"><path class="cls-1" d="M0,256C0,397.4,114.6,512,256,512V0C114.6,0,0,114.6,0,256Z"/><path class="cls-1" d="M256,0V512c141.4,0,256-114.6,256-256S397.4,0,256,0Z"/></g></g><g id="bnb"><g id="Layer_2" data-name="Layer 2"><path class="cls-2" d="M189.8,228.8,256,162.6l66.23,66.23,38.52-38.52L256,85.56,151.28,190.28,189.8,228.8M85.56,256l38.52-38.53L162.6,256l-38.52,38.52ZM189.8,283.2,256,349.4l66.23-66.23,38.54,38.5,0,0L256,426.44,151.28,321.72l-.05-.05L189.8,283.2M349.4,256l38.52-38.52L426.44,256l-38.52,38.52Z"/><path class="cls-2" d="M295.07,256h0L256,216.89l-28.89,28.88h0l-3.32,3.32L217,255.94l-.06.05.06.06L256,295.11,295.09,256l0,0,0,0"/></g><polygon class="cls-3" points="151.28 190.28 189.8 228.8 189.8 228.8 256 162.6 256.02 162.62 256.02 85.58 256 85.56 151.28 190.28"/><rect class="cls-3" x="96.84" y="228.76" width="54.48" height="54.47" transform="translate(-144.68 162.73) rotate(-45)"/><polygon class="cls-3" points="189.8 283.2 189.8 283.2 151.23 321.67 151.28 321.72 256 426.44 256.02 426.42 256.02 349.38 256 349.4 189.8 283.2"/><polygon class="cls-3" points="227.11 245.77 223.79 249.09 216.95 255.94 216.89 255.99 216.95 256.05 256 295.11 256.02 295.09 256.02 216.91 256 216.89 227.11 245.77"/></g></svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

@@ -0,0 +1 @@
<svg id="Layer_3" data-name="Layer 3" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><style>.cls-1{fill:#e6eaea;}.cls-2{fill:#ff8c29;stroke:#f0b90b;}.cls-3{fill:#fd6a33;}</style></defs><title>binance-usd</title><path class="cls-1" d="M0,256C0,397.4,114.6,512,256,512V0C114.6,0,0,114.6,0,256Z"/><path class="cls-1" d="M256,0V512c141.4,0,256-114.6,256-256S397.4,0,256,0Z"/><g id="Layer_1-2" data-name="Layer 1-2"><path class="cls-2" d="M256,88l41.5,42.5L193,235l-41.5-41.5Z"/><path class="cls-2" d="M319,151l41.5,42.5L193,361l-41.5-41.5Z"/><path class="cls-2" d="M130,214l41.5,42.5L130,298,88.5,256.5Z"/><path class="cls-2" d="M382,214l41.5,42.5L256,424l-41.5-41.5Z"/></g><polygon class="cls-3" points="193 235 256 172 256 88 151.5 193.5 193 235"/><polygon class="cls-3" points="193 361 256 298 256 214.38 151.5 319.5 193 361"/><polygon class="cls-3" points="130 214 88.5 256.5 130 298 171.5 256.5 130 214"/><polygon class="cls-3" points="214.5 382.5 256 424 256 340.75 214.5 382.5"/></svg>

After

Width:  |  Height:  |  Size: 1004 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><style>.cls-1{fill:#e6eaea;}.cls-2{fill:#0295aa;}.cls-3{fill:#4acfd9;}</style></defs><title>chainlink</title><g id="circle"><g id="Circle_Back" data-name="Circle Back"><path class="cls-1" d="M0,256C0,397.4,114.6,512,256,512V0C114.6,0,0,114.6,0,256Z"/><path class="cls-1" d="M256,0V512c141.4,0,256-114.6,256-256S397.4,0,256,0Z"/></g></g><g id="link"><g id="Layer_1-2" data-name="Layer 1-2"><path class="cls-2" d="M256,156.52,342.23,206v99.45l-86,49.79-86.14-49.36V206.49l85.9-50m0-73L224.42,101.8l-86.08,50L106.73,170V342.47l31.61,18.24,86.2,49.49,31.61,18.23,31.61-18.23,85.9-49.85,31.61-18.24V169.4l-31.61-18.23L287.52,101.8,255.91,83.57Z"/></g><polygon class="cls-3" points="224.42 101.8 138.34 151.77 106.73 170.01 106.73 342.48 138.34 360.71 224.54 410.2 256 428.35 256 355.08 170.13 305.88 170.13 206.49 256 156.53 256 83.62 255.97 83.6 224.42 101.8"/><polygon class="cls-3" points="255.97 83.6 256 83.58 256 83.57 255.91 83.57 255.97 83.6"/></g></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

@@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><style>.cls-1{fill:#365558;}.cls-2{fill:#0295aa;}.cls-3{fill:#fff;}.cls-4{fill:#e6eaea;}</style></defs><title>euro</title><path class="cls-1" d="M1,257C1,398.4,115.6,513,257,513V1C115.6,1,1,115.6,1,257Z"/><path class="cls-2" d="M257,1V513c141.4,0,256-114.6,256-256S398.4,1,257,1Z"/><path class="cls-3" d="M317.66,328.42c-14.4,17.8-34.14,28.8-55.93,28.8-44.05,0-72.06-44.87-72.06-100.21s28-100.2,72.06-100.2c21.79,0,41.53,11,55.93,28.78l23.87-25.15c-20.33-26.86-49-43.65-80.87-43.65C199,116.79,156.51,179.56,156.51,257S199,397.21,260.66,397.21c31.84,0,60.53-16.77,80.87-43.65Z"/><rect class="cls-3" x="167.89" y="216.71" width="115.17" height="28.65"/><rect class="cls-3" x="167.89" y="270.08" width="115.17" height="27.23"/><path class="cls-4" d="M156.51,256.8c0,75.89,40.84,137.69,100.49,140.13v-40.1c-30.21-2.26-52.23-26.17-61.89-59.72H167.89V269.88h22.32q-.54-6.42-.54-13.07,0-5.91.43-11.65H167.89V216.51h27.22c9.66-33.54,31.68-57.46,61.89-59.72V116.68C197.35,119.11,156.51,180.91,156.51,256.8Z"/><polygon class="cls-4" points="167.89 216.51 167.89 245.16 190.1 245.16 257 245.16 257 216.51 195.11 216.51 167.89 216.51"/><polygon class="cls-4" points="167.89 269.88 167.89 297.12 195.11 297.12 257 297.12 257 269.88 190.21 269.88 167.89 269.88"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -0,0 +1 @@
<svg id="P_with_dark_bg" data-name="P with dark bg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><style>.cls-1{fill:#365558;}.cls-2{fill:#fff;}.cls-3{fill:#f0353d;}.cls-4{fill:#e6eaea;}</style></defs><title>polkadot</title><path class="cls-1" d="M0,256C0,397.4,114.6,512,256,512V0C114.6,0,0,114.6,0,256Z"/><path class="cls-1" d="M256,0V512c141.4,0,256-114.6,256-256S397.4,0,256,0Z"/><g id="P."><path class="cls-2" d="M256,105.36A114.53,114.53,0,0,0,141.58,219.78,119.75,119.75,0,0,0,147.64,257a16,16,0,0,0,30.27-10.29,80.48,80.48,0,0,1-4.54-29.36c1.21-42.68,35.71-77.79,78.39-79.91a82.46,82.46,0,0,1,9.08,164.66s-16,.91-23.91,2.12c-3.93.6-7,1.21-9.08,1.51a1.21,1.21,0,0,1-1.51-1.51l2.72-13.32,14.83-68.41A15.79,15.79,0,1,0,213,215.84s-35.72,166.48-36,168.3a15.79,15.79,0,0,0,30.87,6.66c.31-1.82,5.15-23.92,5.15-23.92a40.2,40.2,0,0,1,33.9-31.48c3.63-.6,17.86-1.51,17.86-1.51A114.43,114.43,0,0,0,256,105.36Z"/><path class="cls-3" d="M264.17,368.7A19.17,19.17,0,1,0,279,391.4C281.12,380.81,274.77,370.82,264.17,368.7Z"/></g><path class="cls-4" d="M167.92,267a16.15,16.15,0,0,0,10-20.28,80.48,80.48,0,0,1-4.54-29.36c1.21-42.68,35.71-77.79,78.39-79.91,1.42-.08,2.84-.11,4.24-.11v-32A114.53,114.53,0,0,0,141.58,219.78,119.75,119.75,0,0,0,147.64,257,16.14,16.14,0,0,0,167.92,267Z"/><path class="cls-4" d="M256,302.41c-5.37.37-13.95,1-19.07,1.82-3.93.6-7,1.21-9.08,1.51a1.21,1.21,0,0,1-1.51-1.51l2.72-13.32,14.83-68.41A15.79,15.79,0,1,0,213,215.84s-35.72,166.48-36,168.3a15.79,15.79,0,0,0,30.87,6.66c.31-1.82,5.15-23.92,5.15-23.92a40.2,40.2,0,0,1,33.9-31.48c1.63-.27,5.42-.6,9.08-.89Z"/></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><style>.cls-1{fill:#365558;}.cls-2{fill:#0295aa;}.cls-3{fill:#e6eaea;}.cls-4{fill:#cdd4d5;}</style></defs><title>solana2</title><g id="Circle"><g id="Circle_Back" data-name="Circle Back"><path class="cls-1" d="M0,256C0,397.4,114.6,512,256,512V0C114.6,0,0,114.6,0,256Z"/><path class="cls-2" d="M256,0V512c141.4,0,256-114.6,256-256S397.4,0,256,0Z"/></g></g><g id="Layer_9" data-name="Layer 9"><path class="cls-3" d="M346,232a8.59,8.59,0,0,0-6.15-2.62H127A4.48,4.48,0,0,0,124,237L166,280.05a8.59,8.59,0,0,0,6.15,2.62H385a4.48,4.48,0,0,0,3.08-7.62Z"/><path class="cls-3" d="M166,312.19a8.61,8.61,0,0,1,6.15-2.6H385a4.45,4.45,0,0,1,3.08,7.58L346,360.07a8.66,8.66,0,0,1-6.15,2.6H127a4.46,4.46,0,0,1-3.08-7.59Z"/><path class="cls-3" d="M166,151.93a8.66,8.66,0,0,1,6.15-2.6H385a4.46,4.46,0,0,1,3.08,7.59L346,199.81a8.61,8.61,0,0,1-6.15,2.6H127a4.45,4.45,0,0,1-3.08-7.58Z"/><path class="cls-4" d="M124,237,166,280.05a8.59,8.59,0,0,0,6.15,2.62H256V229.33H127A4.48,4.48,0,0,0,124,237Z"/><path class="cls-4" d="M166,312.19l-42,42.89a4.46,4.46,0,0,0,3.08,7.59H256V309.59H172.15A8.61,8.61,0,0,0,166,312.19Z"/><path class="cls-4" d="M166,151.93l-42,42.9a4.45,4.45,0,0,0,3.08,7.58H256V149.33H172.15A8.66,8.66,0,0,0,166,151.93Z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><style>.cls-1{fill:#f0353d;}.cls-2{fill:#fd6a33;}.cls-3{fill:#fff;fill-rule:evenodd;}.cls-4{fill:#e6eaea;}</style></defs><title>swipe</title><path class="cls-1" d="M1,257C1,398.4,115.6,513,257,513V1C115.6,1,1,115.6,1,257Z"/><path class="cls-2" d="M257,1V513c141.4,0,256-114.6,256-256S398.4,1,257,1Z"/><path class="cls-3" d="M247.73,93.35a65.13,65.13,0,0,0-39.13,19.21c-7.85,7.77-15.28,15.74-23.23,23.59-4,4.08-8,8-12,12.08s-8.46,8.31-12.64,12.54-7.65,7.94-11.51,11.87q-9.06,9.06-18.13,18.18c-4.63,4.8-9.16,9.74-13.75,14.52-2.7,2.86-5.61,5.51-8.15,8.51a71.7,71.7,0,0,0-16.26,45.46c0,1,0,2,.06,2.95a59.48,59.48,0,0,0,7.29,27.19,103.3,103.3,0,0,0,9,14.43c2.24,3.15,3.87,3.1,6.83.66a15.21,15.21,0,0,0,1.58-1.53c2.9-3.06,5.75-6.12,8.71-9.17,4.18-4.39,8.46-8.76,12.64-13.2s8.71-9.32,13.09-13.9c2.09-2.25,4.32-4.32,6.42-6.53,4.48-4.74,8.87-9.62,13.35-14.31s9-9.07,13.4-13.65,9.77-10.2,14.7-15.25,9.12-9.37,13.7-14.06c6-6.17,11.78-12.49,17.68-18.65,3.67-3.77,7.44-7.39,11.11-11.11,5.09-5.09,9.83-10.19,14.83-15.28s8.71-8.51,13-12.89q14.35-14.5,28.66-29.18a18.62,18.62,0,0,0,1.73-1.93c2.35-3,2.54-3.62-.36-5.7A91.32,91.32,0,0,0,286.19,99,66.51,66.51,0,0,0,258,92.71h-.48a79.23,79.23,0,0,0-9.74.62h-.05Zm84.32,62.72h-.61a28.76,28.76,0,0,0-22,10.19q-.74.81-1.53,1.53l-15.59,15.28c-5.09,5.11-10.6,10.66-15.95,16-4.43,4.42-8.86,8.76-13.24,13.19s-9.07,9.38-13.81,14-9.78,9.5-14.67,14.27l-17.38,17.52L185,290.38l-42.75,42.89c-2.75,2.71-2.8,3.06,0,6C149.07,346.17,156,353,162.62,360a27.19,27.19,0,0,0,15.39,8.2,36.43,36.43,0,0,0,16.77-.56,25.33,25.33,0,0,0,11-5.86l16.92-16.34c4-3.81,8-7.58,11.92-11.46,7.84-7.77,15.58-15.59,23.43-23.3,6.37-6.27,12.9-12.48,19.36-18.75L304,266q12.38-12.17,24.91-24.36a5.46,5.46,0,0,1,9.62,1.08A37.2,37.2,0,0,1,345,263.8a38,38,0,0,1-.19,3.85A35.22,35.22,0,0,1,335.89,288c-6.12,6.58-12.64,12.79-19,19.11-4.53,4.48-9.17,8.86-13.71,13.39-5.86,5.81-11.61,11.72-17.47,17.53-.87,1-1.68,2-2.59,2.9l-5.76,6c-4.32,4.31-8.71,8.51-12.95,12.83s-9.1,9.38-13.63,14.11c-.41.45-.87.76-1.27,1.16-5.1,4.74-9.79,9.5-14.63,14.27-2.29,2.24-4.48,4.53-6.73,6.77-3.86,3.93-7.84,7.77-11.56,11.78-2.29,2.39-2.29,3.86.41,5.75a97.72,97.72,0,0,0,14.11,9,71.14,71.14,0,0,0,39.38,5.61A64.35,64.35,0,0,0,306.17,412c7.54-6.62,14.27-14.06,21.29-21.19,5.1-5.1,10.2-10.54,15.64-15.79l14.73-14.83c4.49-4.53,8.92-9.07,13.46-13.55s10.18-9.83,15.27-14.88,10.2-10.18,15.29-15.59a117.28,117.28,0,0,0,11.22-13.25,72.16,72.16,0,0,0,11.57-32,66,66,0,0,0-10.75-45.5A82.32,82.32,0,0,0,399.63,209c-14.11-14-28.18-28.12-42-42.44a32.15,32.15,0,0,0-23.87-10.65h-.19l-1.52.21Z"/><path class="cls-4" d="M249.36,226.28c-4.74,4.64-9.78,9.5-14.67,14.27l-17.38,17.52L185,290.38l-42.75,42.89c-2.75,2.71-2.8,3.06,0,6C149.07,346.17,156,353,162.62,360a27.19,27.19,0,0,0,15.39,8.2,36.43,36.43,0,0,0,16.77-.56,25.33,25.33,0,0,0,11-5.86l16.92-16.34c4-3.81,8-7.58,11.92-11.46,7.48-7.41,14.88-14.87,22.36-22.24V218.59C254.49,221.16,251.94,223.76,249.36,226.28Z"/><path class="cls-4" d="M249.52,375c-5.1,4.74-9.79,9.5-14.63,14.27-2.29,2.24-4.48,4.53-6.73,6.77-3.86,3.93-7.84,7.77-11.56,11.78-2.29,2.39-2.29,3.86.41,5.75a97.72,97.72,0,0,0,14.11,9A71.09,71.09,0,0,0,257,428.84V367.41c-2.08,2.15-4.18,4.34-6.21,6.46C250.38,374.32,249.92,374.63,249.52,375Z"/><path class="cls-4" d="M247.72,93.28v.07a65.13,65.13,0,0,0-39.13,19.21c-7.85,7.77-15.28,15.74-23.23,23.59-4,4.08-8,8-12,12.08s-8.46,8.31-12.64,12.54-7.65,7.94-11.51,11.87q-9.06,9.06-18.13,18.18c-4.63,4.8-9.16,9.74-13.75,14.52-2.7,2.86-5.61,5.51-8.15,8.51a71.7,71.7,0,0,0-16.26,45.46c0,1,0,2,.06,2.95a59.48,59.48,0,0,0,7.29,27.19,103.3,103.3,0,0,0,9,14.43c2.24,3.15,3.87,3.1,6.83.66a15.21,15.21,0,0,0,1.58-1.53c2.9-3.06,5.75-6.12,8.71-9.17,4.18-4.39,8.46-8.76,12.64-13.2s8.71-9.32,13.09-13.9c2.09-2.25,4.32-4.32,6.42-6.53,4.48-4.74,8.87-9.62,13.35-14.31s9-9.07,13.4-13.65S195.07,222.05,200,217s9.12-9.37,13.7-14.06c6-6.17,11.78-12.49,17.68-18.65,3.67-3.77,7.44-7.39,11.11-11.11,5-5,9.62-10,14.5-14.94V92.72a76.91,76.91,0,0,0-9.23.61Z"/></svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

@@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><style>.cls-1{fill:#fff;}.cls-2,.cls-3{fill:#f0353d;}.cls-3{fill-rule:evenodd;}</style></defs><title>uniswap</title><path class="cls-1" d="M0,256C0,397.4,114.6,512,256,512V0C114.6,0,0,114.6,0,256Z"/><path class="cls-1" d="M256,0V512c141.4,0,256-114.6,256-256S397.4,0,256,0Z"/><path class="cls-2" d="M219.79,150.55c-4.18-.65-4.36-.72-2.39-1,3.77-.58,12.68.21,18.82,1.67,14.33,3.4,27.36,12.13,41.28,27.62l3.7,4.12,5.29-.85c22.28-3.58,44.95-.74,63.91,8,5.22,2.41,13.44,7.21,14.47,8.44a22.43,22.43,0,0,1,1.34,5.62c1.41,9.34.7,16.49-2.15,21.84-1.56,2.91-1.65,3.83-.6,6.32a6.11,6.11,0,0,0,5.46,3.45c4.71,0,9.78-7.62,12.13-18.22l.94-4.21,1.85,2.09c10.14,11.5,18.11,27.17,19.47,38.32l.36,2.91L402,254a32.79,32.79,0,0,0-9.66-10.15c-6.81-4.5-14-6-33.06-7-17.21-.9-26.95-2.37-36.61-5.52-16.43-5.36-24.72-12.5-44.24-38.11-8.67-11.37-14-17.67-19.36-22.74C246.93,159,235,152.92,219.79,150.55Z"/><path class="cls-2" d="M368.75,176c.44-7.62,1.47-12.65,3.55-17.24a18.13,18.13,0,0,1,1.71-3.3,11.45,11.45,0,0,1-.79,3c-1.52,4.45-1.76,10.55-.72,17.64,1.32,9,2.07,10.29,11.58,20,4.46,4.56,9.65,10.31,11.53,12.78l3.42,4.49-3.42-3.21c-4.18-3.92-13.8-11.57-15.93-12.66-1.42-.74-1.63-.73-2.51.15s-1,2-1.09,7.74c-.18,8.92-1.39,14.65-4.33,20.38-1.59,3.09-1.84,2.43-.4-1.06,1.07-2.61,1.18-3.76,1.17-12.4,0-17.35-2.07-21.53-14.16-28.67-3.06-1.81-8.1-4.42-11.2-5.81a42.08,42.08,0,0,1-5.48-2.67c.34-.34,12.12,3.1,16.87,4.92,7.05,2.72,8.22,3.07,9.07,2.74C368.2,182.54,368.47,180.87,368.75,176Z"/><path class="cls-2" d="M227.92,205.64c-8.5-11.69-13.75-29.61-12.61-43l.35-4.15,1.93.36a48.44,48.44,0,0,1,12.82,4.77c8,4.88,11.52,11.31,15.07,27.82,1,4.84,2.4,10.31,3,12.17,1,3,4.82,9.94,7.92,14.47,2.23,3.26.75,4.8-4.18,4.36C244.7,221.75,234.5,214.7,227.92,205.64Z"/><path class="cls-2" d="M358.45,292.65c-39.68-16-53.65-29.85-53.65-53.25a37.25,37.25,0,0,1,.26-6.26,30.7,30.7,0,0,1,3.41,2.53c8,6.45,17.06,9.21,42,12.85,14.68,2.14,22.94,3.87,30.56,6.39,24.22,8,39.21,24.34,42.78,46.54,1,6.45.43,18.55-1.25,24.93-1.33,5-5.39,14.11-6.46,14.46-.3.1-.59-1-.67-2.6-.41-8.34-4.62-16.46-11.7-22.54C395.69,308.79,384.88,303.29,358.45,292.65Z"/><path class="cls-2" d="M330.6,299.28a70.54,70.54,0,0,0-1.92-8.39l-1-3,1.88,2.11a33.81,33.81,0,0,1,6.4,11.64c1.33,3.8,1.48,4.93,1.47,11.1s-.18,7.34-1.41,10.76a33.94,33.94,0,0,1-8.37,13.32c-7.25,7.38-16.57,11.46-30,13.16-2.33.29-9.15.79-15.14,1.1-15.09.78-25,2.41-34,5.54a7.34,7.34,0,0,1-2.54.61c-.36-.36,5.71-4,10.74-6.4,7.07-3.41,14.12-5.27,29.91-7.9,7.8-1.3,15.85-2.88,17.9-3.51C323.84,333.48,333.77,318.2,330.6,299.28Z"/><path class="cls-2" d="M348.79,331.59c-5.28-11.33-6.49-22.28-3.6-32.48.31-1.09.81-2,1.11-2a10.8,10.8,0,0,1,2.76,1.5c2.43,1.63,7.3,4.39,20.29,11.47,16.19,8.83,25.43,15.67,31.71,23.48a51,51,0,0,1,10.54,24.14c.93,5.39.39,18.34-1,23.76-4.36,17.09-14.48,30.52-28.92,38.35a37.32,37.32,0,0,1-4.22,2.1c-.2,0,.57-2,1.71-4.36,4.86-10.15,5.41-20,1.74-31-2.25-6.73-6.83-15-16.09-28.83C354.07,341.58,351.43,337.28,348.79,331.59Z"/><path class="cls-2" d="M199.74,392.74c14.72-12.43,33-21.26,49.73-24,7.2-1.16,19.18-.7,25.84,1,10.68,2.74,20.23,8.86,25.19,16.15,4.86,7.12,6.94,13.33,9.11,27.15.85,5.45,1.78,10.92,2.07,12.16,1.62,7.16,4.79,12.89,8.72,15.76,6.24,4.57,17,4.85,27.54.73a13.53,13.53,0,0,1,3.46-1.07c.38.38-4.94,3.94-8.69,5.81a29.57,29.57,0,0,1-14.4,3.5c-9.68,0-17.71-4.92-24.41-15a117.16,117.16,0,0,1-6.59-13.15c-7.08-16.14-10.57-21-18.79-26.44-7.15-4.68-16.37-5.52-23.31-2.12-9.12,4.47-11.66,16.12-5.13,23.5a20.2,20.2,0,0,0,11.39,6,12.15,12.15,0,0,0,13.76-12.18c0-4.85-1.87-7.62-6.56-9.74-6.41-2.89-13.3.49-13.27,6.52,0,2.56,1.13,4.18,3.71,5.34,1.65.75,1.69.81.34.53-5.88-1.22-7.26-8.31-2.53-13,5.68-5.65,17.42-3.16,21.45,4.56,1.7,3.24,1.89,9.69.42,13.59-3.31,8.72-13,13.31-22.73,10.81-6.65-1.7-9.36-3.54-17.39-11.81-13.95-14.36-19.36-17.15-39.47-20.28l-3.85-.61Z"/><path class="cls-3" d="M94.57,70.93C141.14,127.46,213,215.47,216.51,220.4c3,4.06,1.84,7.72-3.2,10.59a30.68,30.68,0,0,1-11.46,3.21,14.66,14.66,0,0,1-9.62-4.12c-1.89-1.79-9.53-13.2-27.17-40.57-13.49-20.94-24.79-38.31-25.1-38.6-.71-.67-.7-.65,23.72,43.05C179,221.4,184.2,231.1,184.2,232.39c0,2.64-.72,4-4,7.66-5.43,6-7.85,12.86-9.6,26.93-2,15.78-7.49,26.93-22.78,46-9,11.17-10.42,13.21-12.68,17.71-2.85,5.67-3.63,8.85-3.95,16a50,50,0,0,0,2.63,19.69c2,6.33,4.14,10.52,9.54,18.88,4.66,7.22,7.35,12.59,7.35,14.69,0,1.67.31,1.67,7.54,0,17.28-3.91,31.32-10.77,39.21-19.19,4.89-5.2,6-8.08,6.07-15.22,0-4.66-.14-5.64-1.4-8.33-2.05-4.37-5.79-8-14-13.63-10.8-7.39-15.41-13.33-16.69-21.5-1-6.71.17-11.44,6.15-24,6.18-13,7.71-18.48,8.75-31.54.67-8.44,1.59-11.77,4-14.44s4.8-3.73,11.06-4.58c10.21-1.4,16.7-4,22-9,4.64-4.27,6.57-8.38,6.87-14.57l.23-4.7-2.59-3c-9.38-10.93-139.67-154-140.25-154C87.59,62.34,90.68,66.2,94.57,70.93ZM156,355.27a8.31,8.31,0,0,0-2.55-10.94c-3.35-2.23-8.56-1.18-8.56,1.73,0,.88.49,1.53,1.6,2.09,1.85,1,2,2,.53,4.23s-1.36,4.19.33,5.52C150.08,360,154,358.86,156,355.27Z"/><path class="cls-3" d="M237,250.08Line truncated

After

Width:  |  Height:  |  Size: 5.2 KiB

@@ -1,36 +1 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="-59 167 201 200" style="enable-background:new -59 167 201 200;" xml:space="preserve">
<style type="text/css">
.st0{display:none;fill:#FFFFFF;}
.st1{display:none;fill:#E6EAEA;}
.st2{fill:#F0353D;}
.st3{fill:#0295AA;}
.st4{fill:#FFFFFF;}
</style>
<title>BTC</title>
<desc>Created with Sketch.</desc>
<path class="st0" d="M66,270.3c-3.9-3.8-10.7-7.3-20.5-10.4v-21.3c2.8,0.3,4.9,1.4,6.4,3.3s2.3,4.7,2.5,8.3h16
c-0.4-7.5-2.7-13.4-7-17.7c-4.3-4.2-10.2-6.6-17.8-6.9v-7.5H42v104.2h3.6v-11.1c8.4-0.7,14.8-3.2,19.4-7.7
c4.6-4.5,6.9-10.5,6.9-17.9C71.8,279.2,69.9,274.1,66,270.3z M52.8,294.8c-1.7,1.9-4.1,3.1-7.3,3.5v-22.1c3.4,1.1,5.9,2.5,7.5,4.3
s2.3,4.1,2.3,6.8C55.4,290.4,54.5,292.9,52.8,294.8z"/>
<path class="st1" d="M38.5,218.1v7.5c-7.6,0.2-13.7,2.4-18.3,6.8c-4.6,4.4-6.8,10.2-6.8,17.3c0,6.4,1.9,11.5,5.7,15.1
c3.8,3.7,10.2,6.7,19.4,9.1v24.3c-3.4-0.7-5.9-2.2-7.7-4.7s-2.8-5.8-3-10H12.2c0,8.6,2.2,15.2,6.6,19.8s11,7.1,19.8,7.7v11.3H42
V218.1H38.5z M38.5,258.2c-3.2-1.1-5.6-2.4-7.1-4c-1.5-1.6-2.2-3.6-2.2-6c0-2.9,0.8-5.1,2.4-6.9c1.6-1.7,3.9-2.8,6.9-3.1V258.2z"/>
<path class="st0" d="M104.2,239c7.6,0,13.4,2.7,17.3,8c4,5.3,5.9,13.1,5.9,23.2c0,10.3-2,18.1-5.9,23.4c-3.9,5.3-9.7,7.9-17.4,7.9
H83.4V239L104.2,239L104.2,239z M104.2,250.6h-7.6v39.2h7.6c3.4,0,5.9-1.5,7.4-4.6c1.5-3,2.3-8,2.3-15c0-6.4-0.8-11.3-2.5-14.6
C109.8,252.3,107.4,250.6,104.2,250.6z"/>
<path class="st2" d="M141.5,267c0-55.1-44.6-99.8-99.6-100v200C97,366.8,141.5,322.1,141.5,267z"/>
<path class="st3" d="M41.5,167c-55.2,0-100,44.8-100,100s44.8,100,100,100c0.1,0,0.2,0,0.4,0V167C41.8,167,41.7,167,41.5,167z"/>
<polygon class="st4" points="1.8,206.8 -3.4,190.9 -8.6,206.8 -25.4,206.9 -11.8,216.7 -17,232.7 -3.4,222.8 10.1,232.7 5,216.7
18.5,206.9 "/>
<polygon class="st4" points="1.8,260.3 -3.4,244.3 -8.6,260.3 -25.4,260.3 -11.8,270.2 -17,286.1 -3.4,276.3 10.1,286.1 5,270.2
18.5,260.3 "/>
<polygon class="st4" points="1.8,313.7 -3.4,297.8 -8.6,313.7 -25.4,313.7 -11.8,323.6 -17,339.5 -3.4,329.7 10.1,339.5 5,323.6
18.5,313.7 "/>
<path class="st4" d="M-39.9,266.7l-5.2-15.9l13.5-9.9l-16.7,0l-3.4-10.4c-3.7,9.4-6,19.4-6.7,29.9l4.9-3.5L-39.9,266.7z"/>
<path class="st4" d="M-45,304.2l13.5-9.9l-16.7,0l-5.2-15.9l-3,9.1c2.1,10.1,5.7,19.6,10.6,28.3l5.9,4.3L-45,304.2z"/>
<path class="st4" d="M41.9,239.3V306h91.7c5.1-12,7.9-25.2,7.9-39c0-9.6-1.4-18.9-3.9-27.7H41.9z"/>
<rect x="41.5" y="239.3" class="st4" width="0.4" height="66.7"/>
</svg>
<svg id="Layer_13" data-name="Layer 13" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><style>.cls-1{fill:#f0353d;}.cls-2{fill:#0295aa;}.cls-3{fill:#fff;}</style></defs><title>us-dollar</title><path class="cls-1" d="M512,256C512,114.94,397.82.51,257,0V512C398.08,511.49,512,397.06,512,256Z"/><path class="cls-2" d="M256,0C114.69,0,0,114.69,0,256S114.69,512,256,512h1V0Z"/><polygon class="cls-3" points="154.37 101.89 141.06 61.18 127.74 101.89 84.74 102.14 119.55 127.23 106.24 168.19 141.06 142.85 175.62 168.19 162.56 127.23 197.12 102.14 154.37 101.89"/><polygon class="cls-3" points="154.37 238.85 141.06 197.89 127.74 238.85 84.74 238.85 119.55 264.19 106.24 304.9 141.06 279.81 175.62 304.9 162.56 264.19 197.12 238.85 154.37 238.85"/><polygon class="cls-3" points="154.37 375.55 141.06 334.85 127.74 375.55 84.74 375.55 119.55 400.9 106.24 441.6 141.06 416.51 175.62 441.6 162.56 400.9 197.12 375.55 154.37 375.55"/><path class="cls-3" d="M47.62,255.23,34.3,214.53l34.56-25.35H26.11l-8.7-26.62A254.35,254.35,0,0,0,.26,239.1l12.54-9Z"/><path class="cls-3" d="M34.56,351.23l34.56-25.34H26.37L13.06,285.18l-7.68,23.3a251.68,251.68,0,0,0,27.13,72.45l15.11,11Z"/><path class="cls-3" d="M257,185.09V355.84H491.78A254.9,254.9,0,0,0,512,256a259.28,259.28,0,0,0-10-70.91Z"/><rect class="cls-3" x="256" y="185.09" width="1.02" height="170.75"/></svg>

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -1,12 +1 @@
<svg width="112" height="112" viewBox="0 0 112 112" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0)">
<path d="M56 112C67.0758 112 77.9028 108.716 87.1119 102.562C96.3211 96.4089 103.499 87.6629 107.737 77.4303C111.976 67.1976 113.085 55.9379 110.924 45.0749C108.763 34.212 103.43 24.2338 95.598 16.402C87.7662 8.57027 77.788 3.23679 66.9251 1.07602C56.0621 -1.08475 44.8024 0.0242338 34.5697 4.26274C24.3371 8.50125 15.5911 15.6789 9.4377 24.8881C3.28434 34.0972 0 44.9242 0 56C0 70.8521 5.89998 85.0959 16.402 95.598C26.9041 106.1 41.1479 112 56 112V112Z" fill="#23292F"/>
<path d="M76.49 32.15H84.91L67.4 49.62C64.3568 52.6598 60.2314 54.3673 55.93 54.3673C51.6286 54.3673 47.5032 52.6598 44.46 49.62L27 32.15H35.41L48.71 45.42C50.6375 47.3454 53.2506 48.4269 55.975 48.4269C58.6994 48.4269 61.3125 47.3454 63.24 45.42L76.49 32.15Z" fill="white"/>
<path d="M35.37 80.74H27L44.57 63.16C47.6132 60.1202 51.7386 58.4127 56.04 58.4127C60.3414 58.4127 64.4668 60.1202 67.51 63.16L85.12 80.74H76.71L63.31 67.36C61.3825 65.4346 58.7694 64.3531 56.045 64.3531C53.3206 64.3531 50.7075 65.4346 48.78 67.36L35.37 80.74Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0">
<rect width="112" height="112" fill="white"/>
</clipPath>
</defs>
</svg>
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><style>.cls-1{fill:#365558;}.cls-2{fill:#e6eaea;}.cls-3{fill:#fff;}.cls-4{fill:none;}</style></defs><title>Artboard 1</title><path class="cls-1" d="M256,0V512c141.4,0,256-114.6,256-256S397.4,0,256,0Z"/><path class="cls-1" d="M0,256C0,397.4,114.6,512,256,512V0C114.6,0,0,114.6,0,256Z"/><g id="Canvas"><g id="xrp-symbol-white"><path id="Vector" class="cls-2" d="M353.83,141.41h40l-83.28,82.41a77.76,77.76,0,0,1-109.17,0l-83.28-82.41h40L221.43,204a49.26,49.26,0,0,0,69.14,0Z"/><path id="Vector_2" data-name="Vector 2" class="cls-2" d="M157.65,370.59h-40l83.8-82.92a77.74,77.74,0,0,1,109.16,0l83.8,82.92h-40l-63.78-63.12a49.26,49.26,0,0,0-69.14,0Z"/></g></g><path class="cls-3" d="M311.48,223.82l83.28-82.41h-40L291.47,204a49,49,0,0,1-34.57,14.17v28A77.34,77.34,0,0,0,311.48,223.82Z"/><path class="cls-3" d="M311.49,287.67a77.38,77.38,0,0,0-54.59-22.38v28a49,49,0,0,1,34.57,14.17l63.78,63.12h40Z"/><path class="cls-4" d="M158.56,370.59h-40l83.79-82.92a77.35,77.35,0,0,1,54.58-22.38V246.2a77.34,77.34,0,0,1-54.58-22.38L119,141.41h40L222.33,204a49,49,0,0,0,34.57,14.17V0H.9V512h256V293.3a49,49,0,0,0-34.57,14.17Z"/></svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 12 KiB

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
File diff suppressed because it is too large. Load diff
@@ -25,7 +25,7 @@
"config": true
},
"initialValues": {
"config": "{ \n\"codeName\": \"Type the code name of the asset\"\n}"
"config": "{ \n\"codeName\": \"Type_the_code_name_of_the_asset\"\n}"
},
"attachingRules": {
"compatibleTypes": "->Exchange Assets->"
@@ -107,6 +107,34 @@
{
"codeName": "DOGE",
"iconName": "dogecoin"
},
{
"codeName": "SOL",
"iconName": "solana"
},
{
"codeName": "DOT",
"iconName": "polkadot"
},
{
"codeName": "UNI",
"iconName": "uniswap"
},
{
"codeName": "BUSD",
"iconName": "binance-usd"
},
{
"codeName": "SXP",
"iconName": "swipe"
},
{
"codeName": "LINK",
"iconName": "chainlink"
},
{
"codeName": "EUR",
"iconName": "euro"
}
]
}
}
@@ -61,7 +61,7 @@
"name": "pluginFilePosition",
"type": "node",
"childType": "Plugin File Position",
"autoAdd": true
"autoAdd": false
}
]
}
@@ -37,6 +37,12 @@
"workDoneLabel": "Done",
"relatedUiObject": "Workspace",
"actionFunction": "payload.executeAction"
},
{
"action": "Check For Missing References",
"label": "Check For Missing References",
"relatedUiObject": "Workspace",
"actionFunction": "payload.executeAction"
}
],
"initialValues": {
@@ -14,8 +14,8 @@
},
{
"style": "Text",
"text": "Maybe you realized that you are doing repetitive actions at the Design Space and you can benefit from automating them. If your actions are constrained to manipulating the nodes at the workspace, by either creating new nodes, deleting existing ones, changing nodes configs, establishing references or some other similar stuff, then you might be able to create an Action function that can automate all this. This will allow you to stop doing those repetitive tasks youself and the ones that will come after you if you contribute these changes to the project.",
"updated": 1614940379811
"text": "Maybe you realized that you are doing repetitive actions at the Design Space and you can benefit from automating them. If your actions are constrained to manipulating the nodes at the workspace, by either creating new nodes, deleting existing ones, changing nodes configs, establishing references or something similar, then you might be able to create an Action function that can automate all this. This will allow you to complete the action with the click of a button and stop doing those repetitive tasks youself. Not to mention help make Superalgos easier to use for everyone once you contribute your action!",
"updated": 1628255167092
},
{
"style": "Title",
@@ -23,8 +23,8 @@
},
{
"style": "Text",
"text": "New Actions are implemented as functions inside a Function Library. So the basic workflow to implement a new Action is the following:",
"updated": 1614940407806
"text": "New Actions are implemented as functions inside a Function Library. So the basic workflow to implement a new Action is as follows:",
"updated": 1628255279553
},
{
"style": "List",
@@ -43,8 +43,8 @@
},
{
"style": "List",
"text": "Connect Menu Item to your Code: Finally you will connect the Menu Item to that function you wrote.",
"updated": 1614940545908
"text": "Connect Menu Item to your Code: Finally you will connect the Menu Item to the function you wrote.",
"updated": 1628255317721
}
]
}
@@ -14,17 +14,18 @@
},
{
"style": "Text",
"text": "Check out the page of the App Schema concept. After that, locate the App Schema file you will need to edit at the Projects folder. There is one App Schema file for Project, pick the right one and edit it with VS Code."
"text": "Check out the page of the App Schema concept. After that, locate the App Schema file you will need to edit at the Projects folder. There is one App Schema file for each Project, pick the right one and edit it with VS Code.",
"updated": 1628255380671
},
{
"style": "Warning",
"text": "Be carefull not to damage anything in the App Schema file while editing it. You will get into trouble if you do so. It can not only produce the UI not to load, but it can also damage the workspace you are working at.",
"updated": 1614940590024
"text": "Be carefull not to damage anything in the App Schema file while editing it. You will get into trouble if you do. It can not only cause the UI to not load, but also damage the workspace you are working at.",
"updated": 1628255452468
},
{
"style": "Success",
"text": "If you are not sure which project a certain node belongs to, there is a trick to find it out: close the Docs tab, and make focus on the node you want to add an Action to. While on focus, use Ctrl + Shift + Alt + F12 to log in the browser console the Node object. Inspect it to see the project property. Most likely it will be a Superalgos project's node.",
"updated": 1614940654950
"text": "If you are not sure which project a certain node belongs to, there is a trick to find it: close the Docs tab, and make focus on the node you want to add an Action to. While on focus, use Ctrl + Shift + Alt + F12 to log in the browser console the Node object. Inspect it to see the project property. Most likely it will be a Foundations project's node.",
"updated": 1628255532030
},
{
"style": "Title",
@@ -37,8 +38,8 @@
},
{
"style": "Json",
"text": "{\n \"action\": \"Add UI Object\",\n \"actionFunction\": \"payload.executeAction\",\n \"label\": \"Add Image\",\n \"relatedUiObject\": \"Image\"\n }",
"updated": 1614789262250
"text": "{\n \"action\": \"Add Missing Workspace Projects\",\n \"label\": \"Add Missing Projects\",\n \"relatedUiObject\": \"Workspace\",\n \"actionFunction\": \"payload.executeAction\"\n}",
"updated": 1628255951872
},
{
"style": "Text",
@@ -90,6 +91,11 @@
{
"style": "List",
"text": "propertyToCheckFor: read the previous property."
},
{
"style": "List",
"text": "workDoneLabel: text to display when action has completed",
"updated": 1628256114205
}
]
}
@@ -9,18 +9,18 @@
"paragraphs": [
{
"style": "Text",
"text": "The procedure to locate a suitable Function Library is very easy. Open the Projects folder, getting into the Project the Node where the action is going to be triggered at is defined. Inside that project Folder get into the UI folder and then into Function-Libraries folder.",
"updated": 1614940833232
"text": "The procedure to locate a suitable Function Library is very easy. Open the Projects folder, then open the Project associated with the Node you are attaching your action to. Inside that project Folder open the UI folder and then you will see the Function-Libraries folder.",
"updated": 1628256668116
},
{
"style": "Note",
"text": "Each file in there is a Function Library except for the one called ActionSwitch.js, which is the place where you connect the Action Function name you defined at the App Schema with the function that will host the code for the new Action.",
"updated": 1614928708817
"text": "Each file within the Function Library folder is a set of functions. The only exception to this is ActionSwitch.js. This file is the place where you will connect the Action Function name you defined at the App Schema with the function that will host the code for the new Action.",
"updated": 1628256808055
},
{
"style": "Text",
"text": "Inspect each of these files and see at their header the functions they already implement. After a quick scan over all of them you can decide which one is where your action belongs to. If you believe that your Action should be placed at a new Function Library, then you can try to add a new one and set it up at the Project Schema file, but that is out of the scope of this guide.",
"updated": 1614928780531
"text": "Inspect each of these files and see at their header the functions they already implement. After a quick scan over all of them you can decide which one fits best with your new action. If you believe that your Action should be placed at a new Function Library, then you can try to add a new one and set it up at the Project Schema file, but that is out of the scope of this guide.",
"updated": 1628256858024
},
{
"style": "Title",
@@ -3,18 +3,19 @@
"pageNumber": 4,
"type": "Automating Actions - Adding your Function",
"definition": {
"text": "Take a look at how other functions are implemented in the Function Library and try to follow that way.",
"updated": 1614941850917
"text": "Take a look at how other functions are implemented in the Function Library and try to follow the same format.",
"updated": 1628257476029
},
"paragraphs": [
{
"style": "Text",
"text": "The basic procedure is quite straight forward. First add the function name to the thisObject and the write you function at the most appropiate place at the Function Library. ",
"updated": 1614941084806
"text": "The basic procedure is quite straight forward. First add the function name to the thisObject and then write your function at the most appropiate place at the Function Library.",
"updated": 1628257461177
},
{
"style": "Important",
"text": "Please document your function the best you can, even if you see the other functions implemented at the same library poorly documented. See if you can make your function the best documented in the whole library."
"text": "Please document your function the best you can, even if you see other functions implemented at the same library poorly documented. See if you can make your function the best documented in the whole library.",
"updated": 1628257493687
},
{
"style": "Title",
@@ -9,8 +9,8 @@
"paragraphs": [
{
"style": "Text",
"text": "It is a very good idea to invest some time at the Utilities folder, scaning the files in there to see what you already have available to use at your actions. You will see that other actions in Function Libraries heavily rely on utilities functions defined at one of the files at the Utilities folder.",
"updated": 1614930012933
"text": "It is a very good idea to invest some time at the Utilities folder, scaning the files in there to see what you already have available to use at your actions. You will see that other actions in Function Libraries heavily rely on utilities functions defined at one of the files within the Utilities folder.",
"updated": 1628257595439
},
{
"style": "Title",
@@ -19,7 +19,8 @@
},
{
"style": "Text",
"text": "At runtime, all utility objects will be already instantiated by the time your Action function code runs. You just need to get to the object that host the utility funtion you want to execute via the UI Global Object that is available to you. For exmaple:"
"text": "At runtime, all utility objects will be already instantiated by the time your Action function code runs. You just need to get to the object that hosts the utility function you want to execute via the UI Global Object that is available to you. For example:",
"updated": 1628257649169
},
{
"style": "Javascript",
@@ -3,14 +3,14 @@
"pageNumber": 6,
"type": "Automating Actions - Using Function Libraries",
"definition": {
"text": "You might also as well other functions located at Function Libraries from within your Action Function. In order to do this, you just need to locate the instance of the Function Library Object and call any of it's functions.",
"updated": 1614942828678
"text": "You can also utilize other functions located within the Function Libraries to help build your Action Function. In order to do this, you just need to locate the instance of the Function Library Object and call any of it's functions.",
"updated": 1628257841959
},
"paragraphs": [
{
"style": "Text",
"text": "It is a very good idea to invest some time at the Function-Libraries folder, scaning the files in there to see what you already have available to use at your actions. You will see that other actions in Function Libraries heavily rely on functions defined at one of the files at the Function-Libraries folder.",
"updated": 1614942900881
"text": "It is a very good idea to invest some time at the Function-Libraries folder, scaning the files in there to see what you already have available to use at your actions. You will see that other actions in Function Libraries heavily rely on functions defined at one of the files within the Function-Libraries folder.",
"updated": 1628257873103
},
{
"style": "Title",
@@ -19,8 +19,8 @@
},
{
"style": "Text",
"text": "At runtime, all Funtion Library objects will be already instantiated by the time your Action function code runs. You just need to get to the object that host the Function Library funtion you want to execute via the UI Global Object that is available to you. For exmaple:",
"updated": 1614942976608
"text": "At runtime, all Function Library objects will be already instantiated by the time your Action function code runs. You just need to get to the object that host the Function Library funtion you want to execute via the UI Global Object that is available to you. For exmaple:",
"updated": 1628257884243
},
{
"style": "Javascript",
@@ -48,8 +48,8 @@
},
{
"style": "Text",
"text": "At your own Action Function you might likely need to execute these functions, belonging to popular actions done at Action Functions:",
"updated": 1614943932540
"text": "At your own Action Function you will likely need to execute these or similar functions, belonging to popular actions defined within other Action Functions:",
"updated": 1628257991399
},
{
"style": "Subtitle",
@@ -57,7 +57,8 @@
},
{
"style": "Text",
"text": "The following is an example on how to add a new children to an existing Node:"
"text": "The following is an example on how to add a new child to an existing Node:",
"updated": 1628258008587
},
{
"style": "Javascript",
@@ -87,13 +88,13 @@
},
{
"style": "Text",
"text": "Example of how to set the Reference Parent of a Node (in this case no Function Library is needed):",
"updated": 1614944033214
"text": "Example of how to set the Reference Parent of a Node:",
"updated": 1628258163153
},
{
"style": "Javascript",
"text": "node.payload.referenceParent = baseAsset\n",
"updated": 1614943688069
"text": "UI.projects.foundations.functionLibraries.attachDetach.referenceAttachNode(timeMachine, session)",
"updated": 1628258141256
},
{
"style": "Text",
@@ -3,8 +3,8 @@
"pageNumber": 8,
"type": "Automating Actions - Adding an Action Switch Case",
"definition": {
"text": "This steps create the mapping betwheen the actionFunction name you defined at the Menu Item of the node that can trigger your Action, and the function you coded inside a Function Library that will execute the code for the new Action. ",
"updated": 1614941772231
"text": "This step creates the mapping between the actionFunction name you defined at the Menu Item of the node to can trigger your Action, and the function you coded inside a Function Library that will execute the code for the new Action.",
"updated": 1628258863939
},
"paragraphs": [
{
@@ -18,8 +18,8 @@
},
{
"style": "Text",
"text": "Find within the list of cases some of the cases pointint to the same Function Library your new Action is hosted at, so that you can add a new case together with the rest.",
"updated": 1614937904095
"text": "Find within the list of cases some of the cases pointing to the same Function Library your new Action is hosted at, so that you can add a new case together with the rest.",
"updated": 1628258889849
},
{
"style": "Title",
@@ -37,8 +37,12 @@
},
{
"style": "Success",
"text": "As you can see will you most likely be sending the node and rootNodes parameters into your Action function. You might want to also send other parameters from data you might find into the action object available to you at that point.",
"updated": 1614938157839
"text": "As you can see you will most likely be sending the node and rootNodes parameters into your Action function. However, you might want to also send other parameters with data you find available within the system at this point into the action object. ",
"updated": 1628259076042
},
{
"style": "Note",
"text": "Setting a breakpoint here within Chrome's devTools is a convenient way to check the system for available data. "
},
{
"style": "Text",
@@ -14,7 +14,8 @@
},
{
"style": "Text",
"text": "In order to debug your action, you will need to open the developer tool, and at the Sources tab, locate the Function Library file where you added your action, place a breakpoint at the begining of your function and go and click at the node Menu Item you added."
"text": "In order to debug your action, you will need to open the developer tool, and at the Sources tab, locate the Function Library file where you added your action, place a breakpoint at the beginning of your function and go and click at the node Menu Item you added.",
"updated": 1628261072790
},
{
"style": "Success",
@@ -6,7 +6,7 @@
"text": "I hear my friend the Welcome tutorial showed you around and mesmerized you with a few cheap tricks... What a show-off!",
"updated": 1615310208456,
"icon": {
"name": "tutorial",
"name": "Tutorial\\tutorial",
"project": "Foundations"
},
"translations": [
@@ -1,12 +1,12 @@
{
"tutorial": "Basic Education",
"pageNumber": 7,
"pageNumber": 6,
"type": "Tutorial Step - Mary Go Round",
"definition": {
"text": "By default, nodes are locked to a rotational symmetry around their parent node. The symmetry may span 360 degrees or less, depending on the setting!",
"updated": 1615316869620,
"icon": {
"name": "set-angle-to-parent-node-to-360-degrees",
"name": "Set\\set-angle-to-parent-node-to-360-degrees",
"project": "Foundations"
},
"translations": [
@@ -1,12 +1,12 @@
{
"tutorial": "Basic Education",
"pageNumber": 8,
"pageNumber": 7,
"type": "Tutorial Step - 180 Degrees",
"definition": {
"text": "When all offspring nodes are set to 180 degrees angle, each node takes a slot in a fraction of a circumference spanning 180 degrees, normal to the parent.",
"updated": 1615319473489,
"icon": {
"name": "set-angle-to-parent-node-to-180-degrees",
"name": "Set\\set-angle-to-parent-node-to-180-degrees",
"project": "Foundations"
},
"translations": [
@@ -1,12 +1,12 @@
{
"tutorial": "Basic Education",
"pageNumber": 9,
"pageNumber": 8,
"type": "Tutorial Step - Node's Independence",
"definition": {
"text": "Notice how you changed the Angle to Parent setting on different siblings and each of them reacted to the new setting independently from the rest!",
"updated": 1615319889017,
"icon": {
"name": "set-angle-to-parent-node-to-90-degrees",
"name": "Set\\set-angle-to-parent-node-to-90-degrees",
"project": "Foundations"
},
"translations": [
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 10,
"pageNumber": 9,
"type": "Tutorial Step - Free-range Nodes",
"definition": {
"text": "When you select the option to cancel the Angle to Parent setting, the node is free to take any angle relative to its parent and siblings!",
@@ -1,11 +1,11 @@
{
"tutorial": "Basic Education",
"pageNumber": 11,
"pageNumber": 10,
"type": "Tutorial Step - Controlling Distances",
"definition": {
"text": "The next option in the menu controls the distance from the node to its parent. Clicking on the button cycles through options.",
"icon": {
"name": "set-distance-to-parent-node-to-one",
"name": "Set\\set-distance-to-parent-node-to-one",
"project": "Foundations"
},
"updated": 1615474588252,
@@ -1,11 +1,11 @@
{
"tutorial": "Basic Education",
"pageNumber": 12,
"pageNumber": 11,
"type": "Tutorial Step - Play With The Tape!",
"definition": {
"text": "Try the different distance settings of the Lightning Strike Trading System Reference node! Go ahead! Click the tape button!",
"icon": {
"name": "trading-system-reference",
"name": "Trading\\trading-system-reference",
"project": "Foundations"
},
"updated": 1615476811627,
@@ -1,12 +1,12 @@
{
"tutorial": "Basic Education",
"pageNumber": 13,
"pageNumber": 12,
"type": "Tutorial Step - How About The Hierarchy?",
"definition": {
"text": "The reason why the distance to the parent node is relative to the distance of the parent to its parent is so that you may affect long structures of nodes!",
"updated": 1615477794893,
"icon": {
"name": "set-distance-to-parent-node-to-one-and-a-half",
"name": "Set\\set-distance-to-parent-node-to-one-and-a-half",
"project": "Foundations"
},
"translations": [
@@ -1,11 +1,11 @@
{
"tutorial": "Basic Education",
"pageNumber": 14,
"pageNumber": 13,
"type": "Tutorial Step - Arrangement Style",
"definition": {
"text": "The button cycles through several arrangement options that affect where a node is placed in relation to its parent.",
"icon": {
"name": "set-node-arrangement-to-concave",
"name": "Set\\set-node-arrangement-to-concave",
"project": "Foundations"
},
"updated": 1615491939732,
@@ -4,12 +4,64 @@
"type": "Tutorial Step - Shall We Improve This?",
"definition": {
"text": "If you experiment with this feature, you will notice that the behavior of each of the settings is not clear or predictable.",
"updated": 1615492937986
"updated": 1615492937986,
"icon": {
"name": "Set\\set-node-arrangement-to-concave",
"project": "Foundations"
},
"translations": [
{
"language": "IT",
"text": "Sperimentando con questa proprietà, ti accorgerai che spesso non si comporta in modo chiaro o prevedibile.",
"updated": 1619461378348,
"style": "Definition"
},
{
"language": "ES",
"text": "Si experimentas con esta función, notarás que el comportamiento de cada una de las configuraciones no es claro ni predecible. ",
"updated": 1626040532082,
"style": "Definition"
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "Right click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use docs.save to save your changes and app.contribute to send it to the main repository."
"style": "Important",
"text": "The current implementation of this feature is not optimal, and the behavior of some of the options is hard to predict. If you are a developer, this may be a great opportunity to iterate on the existing code and take this feature to a more usable state!",
"updated": 1615493927202,
"translations": [
{
"language": "IT",
"text": "L'implementazione attuale di questa proprietà non è ottimale. Se sei uno sviluppatore, questa potrebbe essere una grande opportunità per analizzare il codice esistente e rendere più utilizzabile questa funzionalità!",
"updated": 1619461465723,
"style": "Important"
},
{
"language": "ES",
"text": "La implementación actual de esta función no es óptima y el comportamiento de algunas de las opciones es difícil de predecir. Si eres un desarrollador, esta puede ser una gran oportunidad para iterar sobre el código existente y llevar esta función a un estado más utilizable.",
"updated": 1626040570613,
"style": "Important"
}
]
},
{
"style": "Callout",
"text": "Feel free to try this feature, but you will most likely want to go back to the default setting!",
"updated": 1615493850572,
"translations": [
{
"language": "IT",
"text": "Sperimenta pure con questa funzionalità, ma probabilmente vorrai tornare alla proprietà di default!",
"updated": 1619461498671,
"style": "Callout"
},
{
"language": "ES",
"text": "No dudes en probar esta función, pero lo más probable es que desee volver a la configuración predeterminada.",
"updated": 1626040601344,
"style": "Callout"
}
]
}
]
}
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 17,
"pageNumber": 16,
"type": "Tutorial Step - Freeze!",
"definition": {
"text": "The freeze button makes sense under very specific circumstances: when physics are activated at the level of the Design Space.",
@@ -1,67 +0,0 @@
{
"tutorial": "Basic Education",
"pageNumber": 16,
"type": "Tutorial Step - Shall We Improve This?",
"definition": {
"text": "If you experiment with this feature, you will notice that the behavior of each of the settings is not clear or predictable.",
"updated": 1615492937986,
"icon": {
"name": "set-node-arrangement-to-concave",
"project": "Foundations"
},
"translations": [
{
"language": "IT",
"text": "Sperimentando con questa proprietà, ti accorgerai che spesso non si comporta in modo chiaro o prevedibile.",
"updated": 1619461378348,
"style": "Definition"
},
{
"language": "ES",
"text": "Si experimentas con esta función, notarás que el comportamiento de cada una de las configuraciones no es claro ni predecible. ",
"updated": 1626040532082,
"style": "Definition"
}
]
},
"paragraphs": [
{
"style": "Important",
"text": "The current implementation of this feature is not optimal, and the behavior of some of the options is hard to predict. If you are a developer, this may be a great opportunity to iterate on the existing code and take this feature to a more usable state!",
"updated": 1615493927202,
"translations": [
{
"language": "IT",
"text": "L'implementazione attuale di questa proprietà non è ottimale. Se sei uno sviluppatore, questa potrebbe essere una grande opportunità per analizzare il codice esistente e rendere più utilizzabile questa funzionalità!",
"updated": 1619461465723,
"style": "Important"
},
{
"language": "ES",
"text": "La implementación actual de esta función no es óptima y el comportamiento de algunas de las opciones es difícil de predecir. Si eres un desarrollador, esta puede ser una gran oportunidad para iterar sobre el código existente y llevar esta función a un estado más utilizable.",
"updated": 1626040570613,
"style": "Important"
}
]
},
{
"style": "Callout",
"text": "Feel free to try this feature, but you will most likely want to go back to the default setting!",
"updated": 1615493850572,
"translations": [
{
"language": "IT",
"text": "Sperimenta pure con questa funzionalità, ma probabilmente vorrai tornare alla proprietà di default!",
"updated": 1619461498671,
"style": "Callout"
},
{
"language": "ES",
"text": "No dudes en probar esta función, pero lo más probable es que desee volver a la configuración predeterminada.",
"updated": 1626040601344,
"style": "Callout"
}
]
}
]
}
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 18,
"pageNumber": 17,
"type": "Tutorial Step - Let's Talk Backups",
"definition": {
"text": "Backups are very powerful, and there are multiple use cases! When you click on the backup button, the node and its offspring are saved on a JSON file!",
@@ -1,12 +1,12 @@
{
"tutorial": "Basic Education",
"pageNumber": 19,
"pageNumber": 18,
"type": "Tutorial Step - Working With Versions",
"definition": {
"text": "Let's say you want to test a strategy with different sets of parameters, so you take a backup of the Trading Parameters node!",
"updated": 1615571330616,
"icon": {
"name": "hand-drag",
"name": "Mouse\\hand-drag",
"project": "Foundations"
},
"translations": [
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 20,
"pageNumber": 19,
"type": "Tutorial Step - Detaching and Attaching",
"definition": {
"text": "Now follow my lead! We are not really going to test the strategy with different parameters... we are just simulating a use case!",
@@ -1,11 +1,11 @@
{
"tutorial": "Basic Education",
"pageNumber": 21,
"pageNumber": 20,
"type": "Tutorial Step - Attaching The Backup",
"definition": {
"text": "Now we need to attach the backup of the Trading Parameters node to the Backtesting Session. How do we do that?",
"icon": {
"name": "mouse-right-click",
"name": "Mouse\\mouse-right-click",
"project": "Foundations"
},
"updated": 1615573035743,
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 22,
"pageNumber": 21,
"type": "Tutorial Step - Irrelevant Nodes",
"definition": {
"text": "Nodes that are not attached to a hierarchy are not computed. They exist in the workspace, but they don't affect the workings of the system at any level.",
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 23,
"pageNumber": 22,
"type": "Tutorial Step - Nodes' Attaching Rules",
"definition": {
"text": "Click the help button on the Trading Parameters node to access the node's Docs page. I'm going to show you something...",
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 24,
"pageNumber": 23,
"type": "Tutorial Step - Dealing with References",
"definition": {
"text": "References are how a node may obtain information about another otherwise unrelated node. This is a crucial concept so pay attention!",
@@ -1,12 +1,12 @@
{
"tutorial": "Basic Education",
"pageNumber": 25,
"pageNumber": 24,
"type": "Tutorial Step - Let's See Some References",
"definition": {
"text": "Notice the two nodes under the Backtesting Session: Trading System Reference and Trading Engine Reference. Why do we need these nodes?",
"updated": 1615798435799,
"icon": {
"name": "trading-system-reference",
"name": "Trading\\trading-system-reference",
"project": "Foundations"
},
"translations": [
@@ -1,11 +1,11 @@
{
"tutorial": "Basic Education",
"pageNumber": 26,
"pageNumber": 25,
"type": "Tutorial Step - Visualizing References",
"definition": {
"text": "When you hover the mouse pointer over a node with an outgoing reference, the reference becomes visible.",
"icon": {
"name": "key-r",
"name": "Key\\key-r",
"project": "Foundations"
},
"updated": 1615804514428,
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 27,
"pageNumber": 26,
"type": "Tutorial Step - Establishing References",
"definition": {
"text": "At some point, you will need to establish a reference, so let's do some basic training to develop the formidable skills required!",
@@ -1,12 +1,12 @@
{
"tutorial": "Basic Education",
"pageNumber": 28,
"pageNumber": 27,
"type": "Tutorial Step - Let's Get On With It!",
"definition": {
"text": "What if the nodes are far away from each other, maybe even in different hierarchies? Watch the video to learn a few tricks!",
"updated": 1616098998366,
"icon": {
"name": "mouse-right-click",
"name": "Mouse\\mouse-right-click",
"project": "Foundations"
},
"translations": [
@@ -1,12 +1,12 @@
{
"tutorial": "Basic Education",
"pageNumber": 29,
"pageNumber": 28,
"type": "Tutorial Step - Is It Done?",
"definition": {
"text": "If you haven't yet, go ahead and establish a reference from the Trading System Reference to the Lightning Strike Trading System!",
"updated": 1615808208398,
"icon": {
"name": "trading-system",
"name": "Trading\\trading-system",
"project": "Foundations"
},
"translations": [
@@ -1,11 +1,11 @@
{
"tutorial": "Basic Education",
"pageNumber": 30,
"pageNumber": 29,
"type": "Tutorial Step - One Last Point!",
"definition": {
"text": "Pretty much like with Node Attaching Rules, nodes that may establish references also have rules in that regard.",
"icon": {
"name": "trading-system-reference",
"name": "Trading\\trading-system-reference",
"project": "Foundations"
},
"updated": 1615809225061,
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 31,
"pageNumber": 30,
"type": "Tutorial Step - Back to Backups!",
"definition": {
"text": "Now that you understand references, we can go deeper into Backups, and maybe even discuss the differences with Clones!",
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 32,
"pageNumber": 31,
"type": "Tutorial Step - Hammering Backups Home",
"definition": {
"text": "Let's go over the same examples that you just read about so that you learn this by heart!",
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 33,
"pageNumber": 32,
"type": "Tutorial Step - Back It Up Again!",
"definition": {
"text": "I told you I was going to hammer home this topic! Let's try the second example!",
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 34,
"pageNumber": 33,
"type": "Tutorial Step - One Last Backup!",
"definition": {
"text": "Let's try the third example! Notice the references flowing from polygon vertices to points under the Chart Points node!",
@@ -1,12 +1,12 @@
{
"tutorial": "Basic Education",
"pageNumber": 35,
"pageNumber": 34,
"type": "Tutorial Step - No Need to Memorize",
"definition": {
"text": "I hope you got to grasp the intricacies of backups and how references are affected in each particular restoration case!",
"updated": 1615831565379,
"icon": {
"name": "docs-warning-style",
"name": "Docs\\docs-warning-style",
"project": "Foundations"
},
"translations": [
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 36,
"pageNumber": 35,
"type": "Tutorial Step - What About Clones?",
"definition": {
"text": "Clones differ from backups in that the feature is designed to replicate data structures so that the copies resemble the original.",
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 37,
"pageNumber": 36,
"type": "Tutorial Step - Only Share Shares!",
"definition": {
"text": "Shares are just like Backups, but the resulting file is stripped off sensitive personal information!",
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 38,
"pageNumber": 37,
"type": "Tutorial Step - Working with Workspaces",
"definition": {
"text": "You may think of a workspace as a stage in a theatre. It is the setting on which something will play out!",
@@ -1,11 +1,11 @@
{
"tutorial": "Basic Education",
"pageNumber": 39,
"pageNumber": 38,
"type": "Tutorial Step - Your Workspace vs Plugins",
"definition": {
"text": "Go to your File Explorer app and look for the following paths relative to the root Superalgos folder...",
"icon": {
"name": "plugins",
"name": "Plugins\\plugins",
"project": "Foundations"
},
"updated": 1615906049600,
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 40,
"pageNumber": 39,
"type": "Tutorial Step - The Current Workspace",
"definition": {
"text": "The current workspace is the User Workspace you are using at any point.",
@@ -1,12 +1,12 @@
{
"tutorial": "Basic Education",
"pageNumber": 41,
"pageNumber": 40,
"type": "Tutorial Step - Let's Talk Plugins",
"definition": {
"text": "Plugins are data structures that ship with the system and that you may call into any workspace using the Plugins hierarchy.",
"updated": 1615914003358,
"icon": {
"name": "plugins",
"name": "Plugins\\plugins",
"project": "Foundations"
},
"translations": [
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 42,
"pageNumber": 41,
"type": "Tutorial Step - How Plugins Work",
"definition": {
"text": "Find the Plugin Trading Systems node and expand it! Note the Plugin File node named Masters-Lightning-Strike...",
@@ -1,12 +1,12 @@
{
"tutorial": "Basic Education",
"pageNumber": 43,
"pageNumber": 42,
"type": "Tutorial Step - Positioning Plugins",
"definition": {
"text": "Here's the crazy bit... the Plugin File Position node determines where in the workspace the plugin is placed!",
"updated": 1615921131447,
"icon": {
"name": "plugin-file-position",
"name": "Plugins\\plugin-file-position",
"project": "Foundations"
},
"translations": [
@@ -1,11 +1,11 @@
{
"tutorial": "Basic Education",
"pageNumber": 44,
"pageNumber": 43,
"type": "Tutorial Step - Placing Plugins",
"definition": {
"text": "To place a plugin in a workspace you must select the option to add the missing plugins on the node of the matching type!",
"icon": {
"name": "plugin-trading-systems",
"name": "Plugins\\plugin-trading-systems",
"project": "Foundations"
},
"updated": 1615925984822,
@@ -1,11 +1,11 @@
{
"tutorial": "Basic Education",
"pageNumber": 45,
"pageNumber": 44,
"type": "Tutorial Step - Non-Persistence of Changes",
"definition": {
"text": "Remember I said that the plugin file is loaded every time the workspace is loaded? This feature has an immediate consequence...",
"icon": {
"name": "bullet-error",
"name": "Bullet\\bullet-error",
"project": "Foundations"
},
"updated": 1615978752612,
@@ -27,8 +27,8 @@
"paragraphs": [
{
"style": "Warning",
"text": "Hierarchies included in the workspace as plugins are not saved at the workspace level. As such, changes made in those hierarchies do not persist. If you wish to modify a plugin and keep working with the modified version in the future, you must either clone or backup the plugin and work on the resulting copy instead.",
"updated": 1615978808209,
"text": "Hierarchies included in the workspace as plugins are not saved by default. As such, changes made in those hierarchies do not persist. ",
"updated": 1628349317266,
"translations": [
{
"language": "IT",
@@ -45,9 +45,9 @@
]
},
{
"style": "Success",
"text": "I will go through some specific use cases in the next few steps!",
"updated": 1615978913703,
"style": "Text",
"text": "If you would like to make changes to a plugin you will need to enable saving. To do this find the Plugin File node associated with the hierarchy you would like to save. Then simply click the Enable Saving with Workspace button. It's that easy!",
"updated": 1628349401737,
"translations": [
{
"language": "IT",
@@ -62,6 +62,10 @@
"style": "Success"
}
]
},
{
"style": "Success",
"text": "I will go through some specific use cases in the next few steps!"
}
]
}
@@ -0,0 +1,16 @@
{
"tutorial": "Basic Education",
"pageNumber": 45,
"type": "Tutorial Step - GIF Saving Plugins",
"definition": {
"text": "This step will play a video in full screen mode.",
"updated": 1628348731575
},
"paragraphs": [
{
"style": "Gif",
"text": "GIFs/Foundations/Tutorials/save-plugins.gif",
"updated": 1628348627960
}
]
}
@@ -1,11 +1,11 @@
{
"tutorial": "Basic Education",
"pageNumber": 6,
"pageNumber": 46,
"type": "Tutorial Step - Starting From a Plugin",
"definition": {
"text": "A typical case is when you wish to introduce changes to a strategy shipping with the system to start with a proven setup!",
"icon": {
"name": "trading-system",
"name": "Trading\\trading-system",
"project": "Foundations"
},
"updated": 1615995229226,
@@ -27,8 +27,8 @@
"paragraphs": [
{
"style": "Text",
"text": "Let's say you are just starting with Superalgos, did a few tutorials, and are ready to start playing with a strategy. You want to start with an existing strategy and introduce minor modifications to better understand how things work. The strategy in question is included as a plugin in a specific workspace.",
"updated": 1615995721361,
"text": "Let's say you are just starting with Superalgos, did a few tutorials, and are ready to start playing with a strategy. You want to start with an existing strategy and introduce minor modifications to better understand how things work. The strategy in question is included as a plugin in a specific workspace. Simply enable saving and you are good to go!",
"updated": 1628349943318,
"translations": [
{
"language": "IT",
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 46,
"pageNumber": 47,
"type": "Tutorial Step - Improving a Plugin",
"definition": {
"text": "Let's say you are a developer and are testing a new exchange. You wish to modify the Sensor Bot to introduce a new feature or param.",
@@ -26,8 +26,8 @@
"paragraphs": [
{
"style": "Text",
"text": "The Sensor Bot is part of the Candles Data Mine, which is usually included as a plugin in most plugin workspaces. In such a case, you must proceed like in the previous case: delete the Plugin File node corresponding to the Candles data mine and restore the data mine file from the Plugins\\Data-Mines folder as if it was a backup.",
"updated": 1622377634945,
"text": "The Sensor Bot is part of the Candles Data Mine, which is usually included as a plugin in most plugin workspaces. In such a case, you must proceed like in the previous case: enable saving and get to work! You can find your new modified file in the Plugins\\Data-Mines folder as if it was a backup.",
"updated": 1628350435675,
"translations": [
{
"language": "IT",
@@ -44,8 +44,8 @@
},
{
"style": "Success",
"text": "Once you finish, take a backup of the modified Candles Data Mine node and use the backup file to replace the Candles plugin file! Make sure you give it the same name! Then, submit a PR to contribute the improvements on the bot!",
"updated": 1622377657281,
"text": "Once you finish, submit a PR to contribute the improvements on the bot!",
"updated": 1628350465749,
"translations": [
{
"language": "IT",
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 47,
"pageNumber": 48,
"type": "Tutorial Step - Talking Exchanges",
"definition": {
"text": "Now that I mentioned testing exchanges, let's talk a bit about how Superalgos deals with them and which ones you may use...",
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 48,
"pageNumber": 49,
"type": "Tutorial Step - Testing New Exchanges",
"definition": {
"text": "If you are a developer and your preferred exchange hasn't been tested, you may join the effort and help with testing!",
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 49,
"pageNumber": 50,
"type": "Tutorial Step - Clean Workspace",
"definition": {
"text": "Talking about tested exchanges and plugins, there is one plugin workspace you may use as a clean slate when designing new stuff!",
@@ -26,8 +26,8 @@
"paragraphs": [
{
"style": "Note",
"text": "It's the Tested Exchanges Plugin Workspace!",
"updated": 1616173130789,
"text": "It's the Blake Template Plugin Workspace!",
"updated": 1628356623276,
"translations": [
{
"language": "IT",
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 50,
"pageNumber": 51,
"type": "Tutorial Step - Dealing With Data",
"definition": {
"text": "The data you download from exchanges and process with indicators is available across the board, accessible from any workspace and strategy.",
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 51,
"pageNumber": 52,
"type": "Tutorial Step - About Other Markets",
"definition": {
"text": "You may work with any of the markets listed at the exchange! Take a look at the setup in the Exchange Markets node!",
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 52,
"pageNumber": 53,
"type": "Tutorial Step - Building Indicators",
"definition": {
"text": "If you are a developer or have at least a basic understanding of JavaScript you will be able to create your own indicators!",
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 53,
"pageNumber": 54,
"type": "Tutorial Step - More Indicators?",
"definition": {
"text": "Indicators are built by the Community! Usually, a developer will build a few indicators he or she needs, and contribute them to the project in a new Data Mine!",
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 54,
"pageNumber": 55,
"type": "Tutorial Step - Lost? Get an API Map!",
"definition": {
"text": "Are you wondering how to get data from sources other than exchanges in CCXT? Messari? Twitter? We've got you covered!",
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 55,
"pageNumber": 56,
"type": "Tutorial Step - How About Strategies?",
"definition": {
"text": "The Community may also contribute Trading Systems! At this point, there're only a few, but we hope more will emerge soon!",
@@ -1,6 +1,6 @@
{
"tutorial": "Basic Education",
"pageNumber": 56,
"pageNumber": 57,
"type": "Tutorial Step - Your Graduation",
"definition": {
"text": "Congratulations! You've graduated from your Basic Education and are ready to move on to more advanced stuff!",
@@ -6,7 +6,7 @@
"text": "Users are contributing translations so that you may choose your preferred language! This Community is awesome!",
"updated": 1619801502482,
"icon": {
"name": "Languages/EN",
"name": "Languages\\EN",
"project": "Foundations"
},
"translations": [
@@ -4,7 +4,7 @@
"type": "Tutorial Step - Click & Drag Baby!",
"definition": {
"icon": {
"name": "Mouse/hand-drag",
"name": "Mouse\\hand-drag",
"project": "Foundations"
},
"text": "I want to show you something while the data mining operation progresses. I'll teach you how to walk... in two seconds!",
@@ -4,7 +4,7 @@
"type": "Tutorial Step - The Bright Side",
"definition": {
"icon": {
"name": "Charting-Space/charting-space",
"name": "Charting-Space\\charting-space",
"project": "Foundations"
},
"text": "So far, you've been confined to the dark side of Superalgos. Get ready to be exposed to the bright side: the Charting Space.",
@@ -4,7 +4,7 @@
"type": "Tutorial Step - Putting Things in Order",
"definition": {
"icon": {
"name": "Mouse/hand-drag",
"name": "Mouse\\hand-drag",
"project": "Foundations"
},
"text": "One more thing before we dive into the charts. You need to know how to put the house in order!",
@@ -4,7 +4,7 @@
"type": "Tutorial Step - Playing with the Rate Scale!",
"definition": {
"icon": {
"name": "Charting-Space/rate-scale",
"name": "Charting-Space\\rate-scale",
"project": "Foundations"
},
"text": "Do I need to tell you how the Rate Scale works or can you figure it out on your own? Ok... I'll give you a hint...",
Loaded 100 of 154 files, more files were not shown because too many files have changed in this diff. Show more