Merge branch 'release/1.2'

This commit is contained in:
osmarperez 2020-07-23 18:36:00 -05:00
commit 0910895b68
11 changed files with 1047 additions and 569 deletions

6
.envSample Normal file
View File

@ -0,0 +1,6 @@
APIKEY=
USERDB=
PASSDB=
DBNAME=
INFURAKEY=
CONTRACTADDRS=

1
.gitignore vendored
View File

@ -1,5 +1,4 @@
/node_modules
/orbitdb
package-lock.json
.env

979
ABI.js
View File

@ -1,437 +1,542 @@
const abi = [{
"constant": false,
"inputs": [],
"name": "acceptOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [{
"name": "spender",
"type": "address"
},
{
"name": "tokens",
"type": "uint256"
}
],
"name": "approve",
"outputs": [{
"name": "success",
"type": "bool"
}],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [{
"name": "spender",
"type": "address"
},
{
"name": "tokens",
"type": "uint256"
},
{
"name": "data",
"type": "bytes"
}
],
"name": "approveAndCall",
"outputs": [{
"name": "success",
"type": "bool"
}],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [{
"name": "spender",
"type": "address"
},
{
"name": "tokens",
"type": "uint256"
}
],
"name": "decreaseApproval",
"outputs": [{
"name": "success",
"type": "bool"
}],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "getETH",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [{
"name": "spender",
"type": "address"
},
{
"name": "tokens",
"type": "uint256"
}
],
"name": "increaseApproval",
"outputs": [{
"name": "success",
"type": "bool"
}],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [{
"name": "to",
"type": "address"
},
{
"name": "tokens",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [{
"name": "success",
"type": "bool"
}],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [{
"name": "tokenAddress",
"type": "address"
},
{
"name": "tokens",
"type": "uint256"
}
],
"name": "transferAnyERC20Token",
"outputs": [{
"name": "success",
"type": "bool"
}],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [{
"name": "from",
"type": "address"
},
{
"name": "to",
"type": "address"
},
{
"name": "tokens",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [{
"name": "success",
"type": "bool"
}],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [{
"name": "_newOwner",
"type": "address"
}],
"name": "transferOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [{
"name": "CCDBAddress",
"type": "string"
}],
"name": "updateCCDBAddress",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"payable": true,
"stateMutability": "payable",
"type": "fallback"
},
{
"anonymous": false,
"inputs": [{
"indexed": true,
"name": "_from",
"type": "address"
},
{
"indexed": true,
"name": "_to",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
},
{
"anonymous": false,
"inputs": [{
"indexed": true,
"name": "from",
"type": "address"
},
{
"indexed": true,
"name": "to",
"type": "address"
},
{
"indexed": false,
"name": "tokens",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"anonymous": false,
"inputs": [{
"indexed": true,
"name": "tokenOwner",
"type": "address"
},
{
"indexed": true,
"name": "spender",
"type": "address"
},
{
"indexed": false,
"name": "tokens",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"constant": true,
"inputs": [],
"name": "_CCDBAddress",
"outputs": [{
"name": "",
"type": "string"
}],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "_totalSupply",
"outputs": [{
"name": "",
"type": "uint256"
}],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [{
"name": "tokenOwner",
"type": "address"
},
{
"name": "spender",
"type": "address"
}
],
"name": "allowance",
"outputs": [{
"name": "remaining",
"type": "uint256"
}],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [{
"name": "tokenOwner",
"type": "address"
}],
"name": "balanceOf",
"outputs": [{
"name": "balance",
"type": "uint256"
}],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "bonus1Ends",
"outputs": [{
"name": "",
"type": "uint256"
}],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "bonus2Ends",
"outputs": [{
"name": "",
"type": "uint256"
}],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "decimals",
"outputs": [{
"name": "",
"type": "uint8"
}],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "endDate",
"outputs": [{
"name": "",
"type": "uint256"
}],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "name",
"outputs": [{
"name": "",
"type": "string"
}],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "newOwner",
"outputs": [{
"name": "",
"type": "address"
}],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "owner",
"outputs": [{
"name": "",
"type": "address"
}],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "preICOEnds",
"outputs": [{
"name": "",
"type": "uint256"
}],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "symbol",
"outputs": [{
"name": "",
"type": "string"
}],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "totalSupply",
"outputs": [{
"name": "",
"type": "uint256"
}],
"payable": false,
"stateMutability": "view",
"type": "function"
}
]
module.exports = abi
[
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"payable": true,
"stateMutability": "payable",
"type": "fallback"
},
{
"constant": true,
"inputs": [],
"name": "_CCDBAddress",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "spender",
"type": "address"
}
],
"name": "allowance",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "uint256",
"name": "addDays",
"type": "uint256"
}
],
"name": "appendDays",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "approve",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "bonus1Ends",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "bonus2Ends",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "decimals",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "subtractedValue",
"type": "uint256"
}
],
"name": "decreaseAllowance",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "endDate",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "getETH",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getPause",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "addedValue",
"type": "uint256"
}
],
"name": "increaseAllowance",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "isOwner",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address payable",
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "preICOEnds",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "bool",
"name": "p",
"type": "bool"
}
],
"name": "setPause",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "symbol",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "address payable",
"name": "tokenAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokens",
"type": "uint256"
}
],
"name": "transferAnyERC20Token",
"outputs": [
{
"internalType": "bool",
"name": "success",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "address payable",
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "string",
"name": "newCCDBAddress",
"type": "string"
}
],
"name": "updateCCDBAddress",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
}
]

242
README.md
View File

@ -1,3 +1,243 @@
# DecaGraphics
Deca Graphics
DECA Charts Code and settings to calculate price, quantity and percentage of reserve in carbon credits.
**IMPORTANT: Please verify that the database address matches the smart contract address.**
Official Carbon credits database address ([orbitdb](https://github.com/orbitdb/orbit-db))
**/orbitdb/zdpuAykPJ4qtBg2toS2vxr5eaPfGEBJmvGerM7V7x8qn5c8hW/decaCCDB**
## Table of Contents
[[_TOC_]]
## General Folder Structure
```sh
├── ABI.js
├── getEth.js
├── index.js
├── package.json
├── README.md
├── scriptChildNode.js
├── scriptMainNode.js
└── services
├── decaGraphicsChild.service
└── decaGraphicsMain.service
```
## Prerequisites
Before you begin, ensure you have met the following requirements:
* Node.js >= 10
## Installation
**Download and install Node.js v10.x and npm.**
> Using Ubuntu
```sh
$ curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
$ sudo apt-get install -y nodejs
```
> Using Debian, as root
```sh
$ curl -sL https://deb.nodesource.com/setup_10.x | bash -
$ apt-get install -y nodejs
```
**Clone the repo, switch to decagraphics and run npm install**
```sh
$ git clone https://gitlab.com/deca-currency/decagraphics.git
$ cd decagraphics
$ npm install
```
> It's recommended to fix security vulnerabilities in dependencies using the command.
```sh
$ npm audit fix
```
It is necessary to have installed mongodb locally in case of making a connection to another server modify the connection url of mongodb.
> Once the installation is done, it is necessary to create a database with three collections with the following names:
```sh
$ mongo
use DecaGraphics
db.createCollection("decaPrice")
db.createCollection("decaGeth")
db.createCollection("decaCCTS")
```
> After that it is necessary to set the environment variables in an .env file as in the example .envSample file.
```sh
APIKEY=
USERDB=
PASSDB=
DBNAME=
INFURAKEY=
CONTRACTADDRS=
```
In both scripts it is necessary to set the variable 'dates' to the following date in unixtime from there the script will start to run the calculations automatically.
**Once everything is configured it is necessary to have ipfs running as a service the configuration can be found in [carboncreditsbacklog](https://gitlab.com/deca-currency/carboncreditsbacklog) as well connecting to the nodes mentioned there in order to replicate the orbitdb carbon credits database bd.**
> The scripts can be tested using node as well the service rest which will take the data from mongodb and expose it in a json format in order to do the calculations on the web page
```sh
$ node scriptMainNode.js
$ node index.js
```
To verify the data can be done from a browser taking into account the use of cors or from a bash.
```sh
$ curl localhost:5000/decaPrice
$ curl localhost:5000/decaGeth
$ curl localhost:5000/decaCCTS
```
## Development
* The dependencies are already in the package.json
* Ethereum Node
* Bitcoinaverage Api
The rest service was made in express.js and cors was applied to accept only requests coming from deca.eco as well as helmet.js was used to give a better security to the application and the good practices of [express](https://expressjs.com/es/advanced/best-practice-security.html).
The main script is scriptMainNode.js performs the calculations found in the document [DECAAnalyticsETHPrice](./pdf/DECAAnalyticsETHPrice.pdf) the other script is backup and is used on another node in case the main one fails.
## Deploy
### Prerequisites
* Nginx >= 1.14.0
* Certbot >= 1.6
Install Nginx
```sh
$ sudo apt update
$ sudo apt install nginx
```
Install Certbot
```sh
$ sudo add-apt-repository ppa:certbot/certbot
```
> The script is configured as a service to be able to perform the calculations automatically. The configuration file is located in the service folder.
```sh
$ sudo vim /etc/systemd/system/decaGraphics.service
[Unit]
Description=Deca Graphics Updater
[Service]
WorkingDirectory=/home/nodemaster/decagraphics/
ExecStart=/usr/local/bin/node /home/nodemaster/decagraphics/scriptMainNode.js
User=nodemaster
Restart=always
LimitNOFILE=10240
[Install]
WantedBy=multi-user.target
```
**NOTE: in this example user that runs ipfs, node and orbitdb instance is nodemaster, also the node location is at /usr/local/bin/node**
**NOTE1: set WorkingDirectory where is the repository, for this example /home/nodemaster/decagraphics/**
**NOTE2: set where is index.js mostly in the repository as follow path to node path, for this example /home/nodemaster/decagraphics/scriptMainNode.js**
> Enable the service
```sh
$ sudo systemctl daemon-reload
$ sudo systemctl enable decaGraphics.service
$ sudo systemctl start decaGraphics.service
$ sudo systemctl status decaGraphics.service
```
**NOTE: service must be set as active (running), if not please verify the preview steps**
> It is possible to check in the service logs if any error occurred in the service.
```sh
● graphicsDeca.service - Graphing Calculator
Loaded: loaded (/lib/systemd/system/graphicsDeca.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2020-07-23 17:18:50 UTC; 4h 23min ago
Main PID: 629182 (node)
Tasks: 12 (limit: 464185)
CGroup: /system.slice/graphicsDeca.service
└─629182 /usr/bin/node /home/nodemaster/decagraphics/scriptMainNode.js
Jul 23 21:40:02 icowebsrv node[629182]: zdpuAzCgWw1vAt8yKXFUR49uyhuD4W2jN4fKVmzwXwc9QvKzm
Jul 23 21:40:02 icowebsrv node[629182]: Insert decaPrice
Jul 23 21:40:02 icowebsrv node[629182]: zdpuB1YDWAcW9Ljq6WFo4HKXoaHRYKXfL1B9H4dMDRttcGzXF
Jul 23 21:40:02 icowebsrv node[629182]: Insert decaGeth
Jul 23 21:40:02 icowebsrv node[629182]: zdpuAwMn2mjAMAq9w2siJzi6wqc1W7rDi1fw61iuJdaUTnji8
Jul 23 21:40:02 icowebsrv node[629182]: Insert decaCCTS
```
Once the service is working properly it is necessary to configure the service subtract to be able to access the data from [deca.eco](https://deca.eco/).
In the nginx config add the proxy pass
```sh
$ vim /etc/nginx/conf.d/example.com.conf
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
try_files $uri /index.html;
location / {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
```
**Remember to open the port in the firewall**
**Remember to leave the rest service running in a tmux session and check the port.**
**Now restart up Nginx!**
### Add SSL Certificate
```sh
$ sudo certbot --nginx -d api.deca.eco
```
**It is recommended to redirect all http traffic to https**
Finally renew the certificate with the following command and restart nginx
```sh
$ sudo certbot renew --dry-run
$ sudo service nginx restart
```
# Information and contacts.
***Developers***
- Jose [jose@deca.eco](mailto:jose@deca.eco)

58
index.js Normal file
View File

@ -0,0 +1,58 @@
require('dotenv').config()
var helmet = require('helmet');
const MongoClient = require('mongodb').MongoClient;
const url = "mongodb://" + process.env.USERDB + ":" + encodeURIComponent(process.env.PASSDB) + "@localhost:27017/" + process.env.DBNAME
const express = require("express");
const app = express();
const cors = require('cors')
app.use(express.json());
app.use(cors({
origin: 'https://deca.eco',
methods: ['GET']
}));
app.use(helmet())
app.listen(5000, () => {
app.get('/decaPrice', async function (req, res) {
const dbm = await MongoClient.connect(url, {
useUnifiedTopology: true
}).catch(err => {
console.log(err);
});
var db = dbm.db("DECAGraphics");
db.collection("decaPrice").find({}).toArray(function (err, response) {
if (err) throw err;
res.json(response);
});
});
app.get('/decaGeth', async function (req, res) {
const dbm = await MongoClient.connect(url, {
useUnifiedTopology: true
}).catch(err => {
console.log(err);
});
var db = dbm.db("DECAGraphics");
db.collection("decaGeth").find({}).toArray(function (err, response) {
if (err) throw err;
res.json(response);
});
});
app.get('/decaCCTS', async function (req, res) {
const dbm = await MongoClient.connect(url, {
useUnifiedTopology: true
}).catch(err => {
console.log(err);
});
var db = dbm.db("DECAGraphics");
db.collection("decaCCTS").find({}).toArray(function (err, response) {
if (err) throw err;
res.json(response);
});
});
console.log("El servidor está inicializado en el puerto 5000");
});

View File

@ -1,7 +1,7 @@
{
"name": "scriptgraficas",
"name": "decagraphics",
"version": "1.0.0",
"description": "",
"description": "Script to generate and send data to show graphs in deca.eco",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
@ -15,6 +15,19 @@
"orbit-db": "^0.24.1",
"orbit-db-docstore": "^1.9.0",
"orbit-db-store": "^3.3.0",
"dotenv": "^8.2.0"
}
"body-parser": "^1.19.0",
"cors": "^2.8.5",
"dotenv": "^8.2.0",
"express": "^4.17.1",
"helmet": "^3.23.3",
"mongodb": "^3.5.9"
},
"repository": {
"type": "git",
"url": "git+ssh://git@gitlab.com:deca-currency/decagraphics.git"
},
"bugs": {
"url": "https://gitlab.com/deca-currency/decagraphics/issues"
},
"homepage": "https://gitlab.com/deca-currency/decagraphics"
}

Binary file not shown.

View File

@ -1,11 +1,12 @@
//Load Environment Variables
require('dotenv').config()
//IPFS
const IpfsClient = require('ipfs-http-client');
const OrbitDB = require('orbit-db');
//Instance of IPFS locally in IPFS daemon
const node = IpfsClient('http://localhost:5001');
const MongoClient = require('mongodb').MongoClient;
const url = "mongodb://" + process.env.USERDB + ":" + encodeURIComponent(process.env.PASSDB) + "@localhost:27017/" + process.env.DBNAME;
//Module for get prices
var getEth = require('./getEth');
@ -18,68 +19,12 @@ const Web3 = require('web3');
const web3 = new Web3(new Web3.providers.WebsocketProvider(process.env.INFURAKEY));
//DECA Contract instance
const decaContract = new web3.eth.Contract(abi, '0xD60DC0805f44d10cAc6594f1a501c67929448957');
async function index() {
//Open and load orbitdb databases
const orbitdb = await OrbitDB.createInstance(node)
const db = await orbitdb.docs('/orbitdb/zdpuAykPJ4qtBg2toS2vxr5eaPfGEBJmvGerM7V7x8qn5c8hW/decaCCDB', {
indexBy: 'CCID'
});
await db.load();
const db2 = await orbitdb.docs('decaPrices', {
indexBy: 'dates'
});
await db2.load();
const db3 = await orbitdb.docs('decaGeth', {
indexBy: 'dates'
});
await db3.load();
const db4 = await orbitdb.docs('decaCCT', {
indexBy: 'dates'
});
await db4.load();
//Flag to save the following data
let dates = 1591980300;
while (true) {
//Get Carbon Credits Data
const data = db.get('');
//Compare flag and unixtime to add data
if (Math.round(new Date().getTime() / 1000) == dates) {
dates += 300;
//Get data from functions
let elemsGeth = await getGethElems(dates);
let elemsDECAPrice = await getEth(dates);
let ccTotalEth = await getEthSum(data, dates);
//checks every 2 minutes to see if the data has already been inserted into the DBs if not
setTimeout(function () {
const query1 = db2.query((doc) => doc.dates == dates);
const query2 = db3.query((doc) => doc.dates == dates);
const query3 = db4.query((doc) => doc.dates == dates);
if(query1.length > 0){
const hash1 = await db2.put(elemsDECAPrice);
console.log(hash1);
}
if(query2.length > 0){
const hash2 = await db3.put(elemsGeth);
console.log(hash2);
}
if(query3.length > 0){
const hash3 = await db4.put(ccTotalEth);
console.log(hash3);
}
}, 20000);
}
}
}
index();
const decaContract = new web3.eth.Contract(abi, process.env.CONTRACTADDRS);
//Function to save data from web3 and contract (ret TotalSupply, Ethereum, Date)
const getGethElems = async (dates) => {
let ret = {};
var balanceEthereum = await web3.eth.getBalance('0xD60DC0805f44d10cAc6594f1a501c67929448957');
var balanceEthereum = await web3.eth.getBalance(process.env.CONTRACTADDRS);
var totalSupply = await decaContract.methods.totalSupply().call();
totalSupply = web3.utils.fromWei(totalSupply, 'ether');
balanceEthereum = web3.utils.fromWei(balanceEthereum, 'ether');
@ -96,12 +41,81 @@ const getEthSum = async (elemsCC, dates) => {
let sumCC = 0;
for (let key in elemsCC) {
sum += elemsCC[key]['conversionPrice']['ETH'];
}
for (let key in elemsCC) {
sumCC += 1;
}
ret.ccTotal = sumCC;
ret.ccTS = sum;
ret.dates = dates;
return ret;
}
}
async function index() {
//Open and load orbitdb databases
const orbitdb = await OrbitDB.createInstance(node)
const db = await orbitdb.docs('/orbitdb/zdpuAykPJ4qtBg2toS2vxr5eaPfGEBJmvGerM7V7x8qn5c8hW/decaCCDB', {
indexBy: 'CCID'
});
await db.load();
const db2 = await orbitdb.docs('/orbitdb/zdpuB1E3gfmmo17cFD2LEgxsjLzU9pxyW1q1Wde5TNL5QjiJG/decaPrice', {
indexBy: 'dates'
});
await db2.load();
const db3 = await orbitdb.docs('/orbitdb/zdpuB3ND1iK3NvYQx939ErZ2WXCaDoz4Lw3hazFUkdVupstBv/decaGeth', {
indexBy: 'dates'
});
await db3.load();
const db4 = await orbitdb.docs('/orbitdb/zdpuB2ZiX2QX8Qwwc1EXxo1y944tG6JcBk5UTLHm9b9Nv3Gna/decaCCTS', {
indexBy: 'dates'
});
await db4.load();
const dbm = await MongoClient.connect(url, {
useUnifiedTopology: true
}).catch(err => {
console.log(err);
});
//Flag to save the following data
let dates = 1594230300;
while (true) {
//Compare flag and unixtime to add data
if (Math.round(new Date().getTime() / 1000) == dates) {
var dbo = dbm.db(process.env.DBNAME);
//Get data from functions
const data = db.get('');
let elemsGeth = await getGethElems(dates);
let elemsDECAPrice = await getEth(dates);
let ccTotalEth = await getEthSum(data, dates);
//checks every 2 minutes to see if the data has already been inserted into the DBs if not
const query1 = db2.query((doc) => doc.dates == dates);
const query2 = db3.query((doc) => doc.dates == dates);
const query3 = db4.query((doc) => doc.dates == dates);
dbo.collection("decaPrice").insertOne(elemsDECAPrice, function (err, res) {
if (err) throw err;
console.log("Insert decaPrice")
});
dbo.collection("decaGeth").insertOne(elemsGeth, function (err, res) {
if (err) throw err;
console.log("Insert decaGeth")
});
dbo.collection("decaCCTS").insertOne(ccTotalEth, function (err, res) {
if (err) throw err;
console.log("Insert decaCCTS")
});
await new Promise(r => setTimeout(r, 180000));
if (query1.length > 0) {
const hash1 = await db2.put(elemsDECAPrice);
console.log(hash1);
}
if (query2.length > 0) {
const hash2 = await db3.put(elemsGeth);
console.log(hash2);
}
if (query3.length > 0) {
const hash3 = await db4.put(ccTotalEth);
console.log(hash3);
}
dates += 300;
}
}
}
index();

View File

@ -1,11 +1,12 @@
//Load Environment Variables
require('dotenv').config()
//IPFS
const IpfsClient = require('ipfs-http-client');
const OrbitDB = require('orbit-db');
//Instance of IPFS locally in IPFS daemon
const node = IpfsClient('http://localhost:5001');
const MongoClient = require('mongodb').MongoClient;
const url = "mongodb://" + process.env.USERDB + ":" + encodeURIComponent(process.env.PASSDB) + "@localhost:27017/" + process.env.DBNAME;
//Module for get prices
var getEth = require('./getEth');
@ -17,72 +18,13 @@ const abi = require("./ABI.js");
const Web3 = require('web3');
const web3 = new Web3(new Web3.providers.WebsocketProvider(process.env.INFURAKEY));
//DECA Contract instance
const decaContract = new web3.eth.Contract(abi, '0xD60DC0805f44d10cAc6594f1a501c67929448957');
async function index() {
//Open and load orbitdb databases
const orbitdb = await OrbitDB.createInstance(node)
const db = await orbitdb.docs('/orbitdb/zdpuAykPJ4qtBg2toS2vxr5eaPfGEBJmvGerM7V7x8qn5c8hW/decaCCDB', {
indexBy: 'CCID'
});
await db.load();
const db2 = await orbitdb.docs('decaPrices', {
indexBy: 'dates'
});
await db2.load();
const db3 = await orbitdb.docs('decaGeth', {
indexBy: 'dates'
});
await db3.load();
const db4 = await orbitdb.docs('decaCCT', {
indexBy: 'dates'
});
await db4.load();
//Flag to save the following data
let dates = 1592331780;
while (true) {
//Get Carbon Credits Data
const data = db.get('');
//Compare flag and unixtime to add data
if (Math.round(new Date().getTime() / 1000) == dates) {
dates += 120;
//Get data from functions
try{
let elemsDECAPrice = await getEth(dates);
console.log(elemsDECAPrice);
const hash1 = await db2.put(elemsDECAPrice);
console.log(hash1);
}catch{
console.error("Error in DECA Prices");
}
try{
let elemsGeth = await getGethElems(dates);
console.log(elemsGeth);
const hash2 = await db3.put(elemsGeth);
console.log(hash2);
}catch{
console.error("Error in GETH");
}
try{
let ccTotalEth = await getEthSum(data, dates);
console.log(ccTotalEth);
const hash3 = await db4.put(ccTotalEth);
console.log(hash3);
}catch{
console.error("Error in CCDB")
}
}
}
}
index();
//DECA Contract instance
const decaContract = new web3.eth.Contract(abi, process.env.CONTRACTADDRS);
//Function to save data from web3 and contract (ret TotalSupply, Ethereum, Date)
const getGethElems = async (dates) => {
let ret = {};
var balanceEthereum = await web3.eth.getBalance('0xD60DC0805f44d10cAc6594f1a501c67929448957');
var balanceEthereum = await web3.eth.getBalance(process.env.CONTRACTADDRS);
var totalSupply = await decaContract.methods.totalSupply().call();
totalSupply = web3.utils.fromWei(totalSupply, 'ether');
balanceEthereum = web3.utils.fromWei(balanceEthereum, 'ether');
@ -99,10 +41,87 @@ const getEthSum = async (elemsCC, dates) => {
let sumCC = 0;
for (let key in elemsCC) {
sum += elemsCC[key]['conversionPrice']['ETH'];
sumCC +=1;
sumCC += 1;
}
ret.ccTotal = sumCC;
ret.ccTS = sum;
ret.dates = dates;
return ret;
}
async function index() {
//Open and load orbitdb databases
const orbitdb = await OrbitDB.createInstance(node)
const db = await orbitdb.docs('/orbitdb/zdpuAykPJ4qtBg2toS2vxr5eaPfGEBJmvGerM7V7x8qn5c8hW/decaCCDB', {
indexBy: 'CCID'
});
await db.load();
const db2 = await orbitdb.docs('/orbitdb/zdpuB1E3gfmmo17cFD2LEgxsjLzU9pxyW1q1Wde5TNL5QjiJG/decaPrice', {
indexBy: 'dates'
});
await db2.load();
const db3 = await orbitdb.docs('/orbitdb/zdpuB3ND1iK3NvYQx939ErZ2WXCaDoz4Lw3hazFUkdVupstBv/decaGeth', {
indexBy: 'dates'
});
await db3.load();
const db4 = await orbitdb.docs('/orbitdb/zdpuB2ZiX2QX8Qwwc1EXxo1y944tG6JcBk5UTLHm9b9Nv3Gna/decaCCTS', {
indexBy: 'dates'
});
await db4.load();
const dbm = await MongoClient.connect(url, {
useUnifiedTopology: true
})
.catch(err => {
console.log(err);
});
//Flag to save the following data
let dates = 1595524800;
while (true) {
//Compare flag and unixtime to add data
if (Math.round(new Date().getTime() / 1000) == dates) {
dates += 300;
//Get data from functions
var dbo = dbm.db(process.env.DBNAME);
try {
let elemsDECAPrice = await getEth(dates);
const hash1 = await db2.put(elemsDECAPrice);
dbo.collection("decaPrice").insertOne(elemsDECAPrice, function (err, res) {
if (err) throw err;
console.log("Insert decaPrice")
});
console.log(hash1);
} catch (error) {
console.log(error);
console.error("Error in DECA Prices");
}
try {
let elemsGeth = await getGethElems(dates);
console.log(elemsGeth)
const hash2 = await db3.put(elemsGeth);
dbo.collection("decaGeth").insertOne(elemsGeth, function (err, res) {
if (err) throw err;
console.log("Insert decaGeth")
});
console.log(hash2);
} catch (error) {
console.log(error);
console.error("Error in GETH");
}
try {
const data = await db.get('');
let ccTotalEth = await getEthSum(data, dates);
const hash3 = await db4.put(ccTotalEth);
dbo.collection("decaCCTS").insertOne(ccTotalEth, function (err, res) {
if (err) throw err;
console.log("Insert decaCCTS")
});
console.log(hash3);
} catch (error) {
console.log(error);
console.error("Error in CCDB")
}
}
}
}
index();

View File

@ -0,0 +1,12 @@
[Unit]
Description=Deca Graphics Updater
[Service]
WorkingDirectory=/home/nodemaster/decagraphics/
ExecStart=/usr/local/bin/node /home/nodemaster/decagraphics/scriptChildNode.js
User=nodemaster
Restart=always
LimitNOFILE=10240
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1,12 @@
[Unit]
Description=Deca Graphics Updater
[Service]
WorkingDirectory=/home/nodemaster/decagraphics/
ExecStart=/usr/local/bin/node /home/nodemaster/decagraphics/scriptMainNode.js
User=nodemaster
Restart=always
LimitNOFILE=10240
[Install]
WantedBy=multi-user.target