webworker01 7 years ago
parent
commit
63b214d5b6
No known key found for this signature in database GPG Key ID: 501ADB6B00E06F8C
  1. 2
      a-team/scripts/install/buildchips.sh
  2. 4
      dragonriders/.gitignore
  3. 314
      dragonriders/dokomodo/cli.py
  4. 5
      dragonriders/dokomodo/templates/assetchains_config.j2
  5. 63
      dragonriders/dokomodo/templates/docker-compose-new-template.conf.j2
  6. 21
      dragonriders/dokomodo/templates/docker-compose-template.conf.j2
  7. 33
      dragonriders/dokomodo/yaml/config.ini
  8. 22
      goldenman/MinedBlockCounter/README.md
  9. 184
      goldenman/MinedBlockCounter/minedBlockCounter.cpp
  10. 10
      goldenman/README.md
  11. 37
      goldenman/komodod-crash-detect/README.md
  12. 5
      webworker01/README.md
  13. 100
      webworker01/checkfork
  14. 46
      webworker01/checkmasks
  15. 56
      webworker01/kmdacfirewall
  16. 237
      webworker01/stats

2
a-team/scripts/install/buildchips.sh

@ -1,6 +1,6 @@
#Install Chips:
cd ~
git clone https://github.com/jl777/chips3.git
git clone https://github.com/jl777/chips3.git -b dev
cd chips3/
#Build Berkly DB 4.8

4
dragonriders/.gitignore

@ -1,7 +1,7 @@
*.swp
assetchains
komodotools_venv/
docker-compose_assets_development.yml
docker-compose_assets_production.yml
docker-compose_assets_*.yml
__pycache__
dokomodo.egg-info
assetchains_data.yaml

314
dragonriders/dokomodo/cli.py

@ -11,10 +11,14 @@ from py import path
from sys import exit
from os import path as expander
from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
import requests
import json
import re
# asset_data_url = ("https://raw.githubusercontent.com/patchkez/kmdplatform/"
# "master/yaml/data.yaml")
new_asset_data_url = ("https://raw.githubusercontent.com/patchkez/SuperNET/"
"separate_json_data_dev_cherrypick/iguana/coins/tmp_cleanup/assetchains_data.yml")
yamlname = 'assetchains_data.yaml'
env = Environment(loader=FileSystemLoader('./dokomodo/templates/'), trim_blocks=True,
lstrip_blocks=True)
@ -23,10 +27,79 @@ config_dir = path.local('/yaml_data')
if config_dir.check() is False:
config_dir = path.local('dokomodo/yaml')
global dump
# TEMPORARY CODE
# Temporary - download yaml file with iguana addcoin methods and supplies
def download_assets_data():
global dump
file = requests.get(new_asset_data_url, stream=True)
# dump = file.raw
dump = file.text
def save_assets_data():
global dump
newyaml = path.local(config_dir).join(yamlname)
try:
myfile2 = newyaml.open(mode='w', ensure=True)
myfile2.write(dump)
except OSError as exception:
click.echo('File could not be opened in write mode or be written: {}'.format(exception))
del dump
click.echo('Downloading preparsed {} as {}'.format(new_asset_data_url, yamlname))
download_assets_data()
save_assets_data()
# This is common function for sending rpc requests to bitcoind and komodod
def send_request(rpc_host, rpc_port, rpc_user, rpc_password):
# assetchain_rpcuser = 'rpcuser'
# assetchain_rpcpassword = 'rpcpassword'
# request_url = (
# 'http://' + asset_rpcuser + ':' + asset_rpcpassword + '@' + assetchain_name + ':' +
# assetchain_rpcport)
return AuthServiceProxy("http://{}:{}@{}:{}".format(rpc_user,
rpc_password, rpc_host, int(rpc_port)))
# try:
# # rpc_connection.sendmany("", ctx.sendtomany_recipients)
# click.echo(rpc_connection.getinfo())
# except JSONRPCException as e:
# click.echo("Error: %s" % e.error['message'])
# Common fucntion for sending any http API request e.g. to iguana
def post_rpc(url, payload, auth):
try:
r = requests.post(url, data=json.dumps(payload), auth=auth)
return(json.loads(r.text))
except Exception as e:
print("Couldn't connect to " + url, e)
exit(0)
# Common functions for getting data from web servers
def get_rpc(url):
try:
r = requests.get(url)
# return(json.loads(r.text))
return(r.text)
except Exception as e:
print("Couldn't connect to " + url, e)
exit(0)
class Config(object):
def __init__(self, *args, **kwargs):
self.config = config_dir.join('data.yaml')
self.new_config = config_dir.join('assetchains_data.yaml')
self.config_ini = config_dir.join('config.ini')
super(Config, self).__init__(*args, **kwargs)
@ -36,6 +109,7 @@ class Config(object):
# Configure yaml loader
yaml = YAML(typ='safe', pure=True)
yaml.default_flow_style = True
yaml.width = 8096 # or some other big enough value to prevent line-wrap
# Try to read yaml file
try:
self.config_data = yaml.load(self.config.read())
@ -44,6 +118,21 @@ class Config(object):
self.branches = self.config_data['assetchains']
self.seed_ip = gethostbyname(self.config_data['seed_host'])
def load_new_asset(self):
"""Try to load the yaml"""
# Configure yaml loader
yaml = YAML(typ='safe', pure=True)
yaml.default_flow_style = True
# Try to read yaml file
try:
self.new_config_data = yaml.load(self.new_config.read())
except OSError as exception:
click.echo('{} yaml file could not be read: {}'.format(self.config.read, exception))
# self.branches = self.new_config_data['assetchains']
# self.seed_ip = gethostbyname(self.config_data['seed_host'])
# self.supply = self
self.seed_ip2 = gethostbyname(self.new_config_data['seed_ip'])
def load_ini(self):
# initialize INI parser
ini_parser = ConfigParser()
@ -60,7 +149,14 @@ class Config(object):
self.delay_asset = float(self.assetchains['delay_asset'])
self.rpc_username = self.assetchains['rpc_username']
self.rpc_password = self.assetchains['rpc_password']
self.rpc_bind = self.assetchains['rpc_bind']
self.rpc_allowip = self.assetchains['rpc_allowip']
self.write_path_conf = self.assetchains['write_path_conf']
self.iguana = ini_parser['IGUANA']
self.production_coins = self.iguana['production_coins']
self.development_coins = self.iguana['development_coins']
self.iguana_url = self.iguana['iguana_url']
self.iguana_home_dir = self.iguana['iguana_home_dir']
self.scaling_tests = ini_parser['SCALING_TESTING']
self.sendtomany_recipients = self.scaling_tests['sendtomany_recipients']
@ -92,18 +188,19 @@ pass_config = click.make_pass_decorator(Config, ensure=True)
@pass_config
def cli(config):
config.load()
config.load_new_asset()
config.load_ini()
@click.command('generate_docker_compose',
short_help='Generates docker-compose file with all assetchains')
short_help='OLD - Generates docker-compose file with all assetchains')
@click.option('-b', '--branch', required=True, type=click.Choice(['development', 'production',
'test']),
prompt=True)
@pass_config
def generate_docker_compose(ctx, branch):
""" TODO """
filename = 'docker-compose_assets_' + branch + '.yml'
filename = 'docker-compose-assets-' + branch + '.yml'
dirname = "./"
click.echo('Writing new docker compose file into: {}'.format(filename))
template = env.get_template('docker-compose-template.conf.j2')
@ -113,6 +210,45 @@ def generate_docker_compose(ctx, branch):
ctx.write_config(dirname, filename=filename, templatized_config=templatized_config)
@click.command('generate_new_docker_compose',
short_help='PROD - Generates docker-compose file with all assetchains')
@click.option('-b', '--branch', required=True, type=click.Choice(['development', 'production',
'test']), prompt=True)
@click.option('-a', '--asset', required=False, help='name of assetchain in capital \
letters e.g. SUPERNET')
@click.option('-i', '--image', required=True, help='name of image used for assetchains, \
it must match image name you use for komodod e.g. kmdplatform_komodod_dev or \
kmdplatform_komodod')
@pass_config
def generate_new_docker_compose(ctx, branch, asset, image):
""" TODO """
filename = 'docker-compose-assets-' + branch + '.yml'
dirname = "./"
click.echo('Writing new docker compose file into: {}'.format(filename))
yaml = YAML(typ='safe', pure=True)
yaml.default_flow_style = True
dic = {}
def filtered_yaml():
coins = branch + '_coins_assets'
for assetchain_key in ctx.assetchains[coins].split(', '):
x = ctx.new_config_data['assetchains'][assetchain_key]
dic[assetchain_key] = x
if asset and asset == assetchain_key:
pass
elif asset:
pass
else:
pass
return dic
template = env.get_template('docker-compose-new-template.conf.j2')
templatized_config = template.render(items=filtered_yaml(),
seed_ip=ctx.seed_ip2, mined=ctx.mined_coins, btcpubkey=ctx.btcpubkey, image_name=image)
ctx.write_config(dirname, filename=filename, templatized_config=templatized_config)
@click.command('assetchains', short_help='Replacement for assetchains script')
@click.option('-b', '--branch', required=True, type=click.Choice(['development', 'production',
'test']),
@ -151,7 +287,11 @@ def generate_assetchains_conf(ctx, branch, asset):
asset_templatized_config = asset_template.render(
rpcuser=ctx.rpc_username,
rpcpassword=ctx.rpc_password,
rpcport=ctx.config_data['assetchains'][branch][assetchain_name]['rpc_port'],
rpcbind=ctx.rpc_bind,
rpcallowip=ctx.rpc_allowip,
# rpcport=ctx.config_data['assetchains'][branch][assetchain_name]['rpc_port'],
rpcport=ctx.new_config_data['assetchains'][assetchain_name]['iguana_payload'][
'rpc'],
btcpubkey=ctx.btcpubkey
)
@ -160,63 +300,143 @@ def generate_assetchains_conf(ctx, branch, asset):
# return click.echo(asset_templatized_config)
return asset_templatized_config
for assetchain_name in ctx.config_data['assetchains'][branch]:
if asset and asset == assetchain_name:
click.echo('Writing CONFIG_FILE: {}'.format(assetchain_name))
templatize(assetchain_name)
coins = branch + '_coins_assets'
for assetchain_key in ctx.assetchains[coins].split(', '):
# for assetchain_name in ctx.config_data['assetchains'][branch]:
if asset and asset == assetchain_key:
click.echo('Writing CONFIG_FILE: {}'.format(assetchain_key))
templatize(assetchain_key)
elif asset:
pass
else:
click.echo('Writing CONFIG_FILE: {}'.format(assetchain_name))
templatize(assetchain_name)
click.echo('Writing CONFIG_FILE: {}'.format(assetchain_key))
templatize(assetchain_key)
@click.command('sendmany_assetchains', short_help='Import private key into assetchains')
@click.command('importprivkey', short_help='Importprivkey into assetchains')
@click.option('-b', '--branch', required=True, type=click.Choice(['development', 'production',
'test']))
@click.option('-a', '--asset', required=False)
@click.option('-h', '--rpchost', prompt=True, hide_input=False, confirmation_prompt=False,
help='RPC host')
@click.option('-u', '--rpcuser', prompt=True, hide_input=False, confirmation_prompt=False,
help='RPC username')
@click.option('-r', '--rpcpassword', prompt=True, hide_input=False, confirmation_prompt=False,
help='RPC password')
@click.option('-k', '--btcdprivkey', prompt=True, hide_input=True, confirmation_prompt=True,
help='BTCD privkey')
@pass_config
def sendmany_assetchains(ctx, branch, asset):
def send_request(assetchain_name, assetchain_rpcport):
assetchain_rpcuser = 'rpcuser'
assetchain_rpcpassword = 'rpcpassword'
# request_url = (
# 'http://' + asset_rpcuser + ':' + asset_rpcpassword + '@' + assetchain_name + ':' +
# assetchain_rpcport)
rpc_connection = AuthServiceProxy("http://%s:%s@%s:%s" % (assetchain_rpcuser,
assetchain_rpcpassword, assetchain_name, int(assetchain_rpcport)))
try:
rpc_connection.sendmany("", ctx.sendtomany_recipients)
except JSONRPCException as e:
click.echo("Error: %s" % e.error['message'])
counter = 0
while counter < float(ctx.number_of_requests):
# click.echo(ctx.config_data['assetchains'][branch])
for assetchain_name in ctx.config_data['assetchains'][branch]:
# click.echo(type(assetchain_name))
rpc_port = ctx.config_data['assetchains'][branch][assetchain_name]['rpc_port']
if asset and asset == assetchain_name:
click.echo('Sending request to: {}'.format(assetchain_name))
send_request(assetchain_name, rpc_port)
elif asset:
pass
else:
click.echo('Sending request to: {}'.format(assetchain_name))
send_request(assetchain_name, rpc_port)
counter += 1
sleep(ctx.delay_between_requests)
def importprivkey(ctx, branch, asset, rpchost, rpcuser, rpcpassword, btcdprivkey):
coins = branch + '_coins_assets'
for assetchain_key in ctx.assetchains[coins].split(', '):
# method = 'importprivkey' + '(privkey=' + btcdprivkey + ' , rescan=False)'
rpcport = int(ctx.new_config_data['assetchains'][assetchain_key]['iguana_payload']['rpc'])
click.echo(ctx.new_config_data['assetchains'][assetchain_key]['iguana_payload']['rpc'])
rpc = send_request(rpc_host=rpchost, rpc_port=rpcport, rpc_user=rpcuser,
rpc_password=rpcpassword)
if asset and asset == assetchain_key:
click.echo('Sending request to: {}'.format(assetchain_key))
# send_request(assetchain_name, rpc_port, method)
click.echo(rpc.importprivkey(btcdprivkey, '', False))
elif asset:
pass
else:
click.echo('Sending request to: {}'.format(assetchain_key))
click.echo(rpc.importprivkey(btcdprivkey, '', False))
# send_request(assetchain_name, rpc_port, method)
# click.echo(rpc.getinfo())
sleep(1)
@click.command('start_iguana', short_help='Add all methods into iguana')
@click.option('-b', '--branch', required=True, type=click.Choice(['development', 'production']))
@click.option('-a', '--asset', required=False, help='name of assetchain in capital \
letters e.g. SUPERNET')
@click.option('-p', '--password', prompt=True, hide_input=True, confirmation_prompt=True,
help='iguana passphrase')
@click.option('-m', '--myip', required=False, prompt=True, hide_input=False,
confirmation_prompt=False, help='provide public IP of your NN if run via SSH session')
@pass_config
def start_iguana(ctx, branch, asset, password, myip):
url = ctx.iguana_url
# No authentication is needed for iguana
auth = ('', '')
# My IP
if myip:
response = myip
else:
# get public IP address of this host
myip = 'http://' + ctx.new_config_data['check_my_ip']
response = get_rpc(myip).rstrip()
click.echo('My IP address is: {}'.format(response))
myipmethod = ctx.new_config_data['misc_methods']['supernet_myip']
myipmethod['ipaddr'] = response
# click.echo('MY IP method: {}'.format(myipmethod))
post_rpc(url, myipmethod, auth)
sleep(3)
# Add notaries
for notary in ctx.new_config_data['misc_methods']['notaries']:
click.echo('Adding notary: {}'.format(notary))
post_rpc(url, ctx.new_config_data['misc_methods']['notaries'][notary], auth)
# Walletpassphrase
click.echo('Adding walletpassphrase!')
wallet = ctx.new_config_data['misc_methods']['wallet_passphrase']
# Replace password with the one provided by user
wallet['params'][0] = password
# click.echo(wallet)
post_rpc(url, wallet, auth)
# Add coins + DPOW
coins = branch + '_coins'
for assetchain_key in ctx.iguana[coins].split(', '):
# Read only assetchains payloads
payload = ctx.new_config_data['assetchains'][assetchain_key]['iguana_payload']
# Replace ${HOME#/} with value in our INI file
# remove first '/'
home = re.sub(r"\/", "", ctx.iguana_home_dir, 1)
# Read value of 'path' key
line = payload['path']
# Substitute
newline = re.sub(r"\$\{HOME\#\/\}", home, line)
# Update value in loaded dictionary
ctx.new_config_data['assetchains'][assetchain_key]['iguana_payload']['path'] = newline
# Dpow
dpow = ctx.new_config_data['misc_methods']['dpow']
dpow['pubkey'] = ctx.btcpubkey
dpow['symbol'] = assetchain_key
# click.echo(wallet)
if asset and asset == assetchain_key:
click.echo('Sending addcoin request to: {}'.format(assetchain_key))
post_rpc(url, payload, auth)
# sleep(3)
click.echo('Sending dpow {} request to: {}'.format(dpow, assetchain_key))
post_rpc(url, dpow, auth)
elif asset:
pass
else:
click.echo('Sending addcoin request to: {}'.format(assetchain_key))
post_rpc(url, payload, auth)
# sleep(10)
click.echo('Sending dpow {} request to: {}'.format(dpow, assetchain_key))
post_rpc(url, dpow, auth)
# sleep(10)
# Add functions into cli() function which is main group for all commands
cli.add_command(generate_docker_compose)
cli.add_command(generate_new_docker_compose)
cli.add_command(assetchains)
cli.add_command(generate_assetchains_conf)
cli.add_command(sendmany_assetchains)
cli.add_command(importprivkey)
cli.add_command(start_iguana)
if __name__ == "__main__":

5
dragonriders/dokomodo/templates/assetchains_config.j2

@ -4,7 +4,10 @@ rpcpassword={% if rpcpassword|default('rpcpassword') %}{{ rpcpassword }}
{% endif %}
rpcport={% if rpcport|default('10000') %}{{ rpcport }}
{% endif %}
rpcbind={% if rpcbind|default('0.0.0.0') %}{{ rpcbind }}
{% endif %}
rpcallowip={% if rpcallowip|default('0.0.0.0/0') %}{{ rpcallowip }}
{% endif %}
server=1
txindex=1
rpcworkqueue={{ rpcworkqueue|default('64') }}

63
dragonriders/dokomodo/templates/docker-compose-new-template.conf.j2

@ -0,0 +1,63 @@
# vim: ts=2 sw=2 et
version: '3'
services:
{% for assetname, asset in items.items() %}
{{ assetname }}:
image: {{ image_name }}
# network_mode: "host"
networks:
- komodo
ports:
{% if asset.iguana_payload.rpc %}
- "127.0.0.1:{{ asset.iguana_payload.rpc }}:{{ asset.iguana_payload.rpc }}"
{% endif %}
{% if asset.iguana_payload.p2p %}
- "127.0.0.1:{{ asset.iguana_payload.p2p }}:{{ asset.iguana_payload.p2p }}"
{% endif %}
volumes:
- komodo-data:/home/komodo/.komodo
- shared-data:/home/komodo/.shared:ro
environment:
- ASSET_RPC_USER=${ASSET_RPC_USER}
- ASSET_RPC_PASSWORD=${ASSET_RPC_PASSWORD}
- ASSET_RPC_WORKQUEUE=64
- ASSET_BIND=127.0.0.1
- ASSET_RPC_BIND=0.0.0.0
- ASSET_RPC_ALLOWIP=0.0.0.0/0
- ASSET_RPC_PORT={{ asset.iguana_payload.rpc }}
- ASSET_NAME={{ assetname }}
- KOMODO_RPC_USER=${KOMODO_RPC_USER}
- KOMODO_RPC_PASSWORD=${KOMODO_RPC_PASSWORD}
# - KOMODO_BIND = ${KOMODO_BIND}
# - KOMODO_RPC_BIND = ${KOMODO_RPC_BIND}
# - KOMODO_RPC_ALLOWIP = ${KOMODO_RPC_ALLOWIP}
command: >
bash -c "komodod -pubkey={{ btcpubkey }}
-ac_name={{ assetname }}
-ac_supply={{ asset.supply }}
-addnode={{ seed_ip }}{% for mine in mined %}
{% if assetname in mine %} -gen{% endif %}
{% if 'random' in mine %}
{% if range(0, 32767) | random % 10 == 1 %}
-gen{% endif %}
{% endif %}
{% endfor %}"
{% endfor %}
volumes:
komodo-data:
driver_opts:
type: none
device: ${KOMODO_DATA}
o: bind
shared-data:
driver_opts:
type: none
device: ${SHARED_DATA}
o: bind
networks:
komodo:

21
dragonriders/dokomodo/templates/docker-compose-template.conf.j2

@ -5,7 +5,9 @@ services:
{% for assetname, asset in items.items() %}
{{ assetname }}:
image: kmdplatform_komodo
network_mode: "host"
# network_mode: "host"
networks:
- komodo
ports:
{% if asset.rpc_port %}
- "127.0.0.1:{{ asset.rpc_port }}:{{ asset.rpc_port }}"
@ -21,22 +23,22 @@ services:
- ASSET_RPC_PASSWORD=${RPC_PASSWORD}
- ASSET_RPC_WORKQUEUE=64
- ASSET_BIND=127.0.0.1
- ASSET_RPC_BIND=127.0.0.1
- ASSET_RPC_ALLOWIP=0.0.0.0
- ASSET_RPC_BIND=0.0.0.0
- ASSET_RPC_ALLOWIP=0.0.0.0/0
- ASSET_RPC_PORT={{ asset.p2p_port }}
- ASSET_NAME={{ assetname }}
command: >
command: >
bash -c "komodod -pubkey={{ btcpubkey }}
-ac_name={{ assetname }}
-ac_supply={{ asset.amount }}
-ac_name={{ assetname }}
-ac_supply={{ asset.amount }}
-addnode={{ seed_ip }}{% for mine in mined %}
{% if assetname in mine %} -gen{% endif %}
{% if 'random' in mine %}
{% if range(0, 32767) | random % 10 == 1 %}
{% if range(0, 32767) | random % 10 == 1 %}
-gen{% endif %}
{% endif %}
{% endfor %}"
{% endfor %}
volumes:
@ -50,3 +52,6 @@ volumes:
type: none
device: ${SHARED_DATA}
o: bind
networks:
komodo:

33
dragonriders/dokomodo/yaml/config.ini

@ -1,6 +1,6 @@
[DEFAULT]
btcpubkey = <test_btc_pubkey_replace_me>
btcpubkey = <btcpubkey>
[ASSETCHAINS]
# mined_coins is list of assetchains for which mining will be enabled
@ -20,11 +20,38 @@ mined_coins =
# Delay in seconds between each assetchain is started
delay_asset = 20
rpc_username = rpcusernameINI
rpc_password = rpcpasswordINI
# These are used for templatazing assetchains configuration file on iguana
rpc_username = rpcusername
rpc_password = rpcpassword
rpc_bind = 127.0.0.1
rpc_allowip = 0.0.0.0/0
# this is temporary, we need to find aout way from where to read IPs - etcd?
rpc_ip = 127.0.0.1
write_path_conf = ~/.komodo
# List of assetchains to be started, it does not mean when they ar estarted that they are also notarized!!!
# List is used to create configuration files for assetchains
# to access its data in central registry file
production_coins_assets = REVS, SUPERNET, DEX, PANGEA, JUMBLR, BET, CRYPTO, HODL, MSHARK, BOTS, MGW, COQUI, WLC, KV, CEAL, MESH, MNZ, AXO, ETOMIC, BTCH, VOTE2018, PIZZA, BEER, NINJA, OOT, BNTN, CHAIN, PRLPAY, DSEC, GLXT, EQL, ZILLA, RFOX
development_coins_assets = PIZZA, BEER
[IGUANA]
iguana_home_dir = /home/iguana
iguana_host = localhost
iguana_rpc_port = 7776
# extra 's' is due to how configparser interpolates variables
iguana_url = http://%(iguana_host)s:%(iguana_rpc_port)s
# List of chains which will be notarized!!!
# This will be used mostly for iguana methods, this list will be used in loop and key of coin will be used
# to access its data in central registry file
production_coins = KMD, BTC, LTC, CHIPS, REVS, SUPERNET, DEX, PANGEA, JUMBLR, BET, CRYPTO, HODL, MSHARK, BOTS, MGW, COQUI, WLC, KV, CEAL, MESH, MNZ, AXO, ETOMIC, BTCH, VOTE2018, NINJA, OOT, BNTN, CHAIN, PRLPAY, GAME, DSEC, GLXT, EQL, ZILLA, VRSC, RFOX
development_coins = KMD, PIZZA, BEER
[SCALING_TESTING]

22
goldenman/MinedBlockCounter/README.md

@ -0,0 +1,22 @@
# Mined Block Counter
### instruction
0. Precondition : komodo installed and you are KMD miner
1. please install jsoncpp library to parse response of komodod
```
sudo apt-get install libjsoncpp-dev
```
2. how to compile :
```
$ g++ -o exefileName sourceFile.cpp -ljsoncpp
ex) $ g++ -o nodeMined minedBlockCounter.cpp -ljsoncpp
```
3. how to run
```
$ ./nodeMined
```

184
goldenman/MinedBlockCounter/minedBlockCounter.cpp

@ -0,0 +1,184 @@
/****
* Please read READMD.md
*
* install lib : $ sudo apt-get install libjsoncpp-dev
*
* how to compile :
* $ g++ -o exefileName sourceFile.cpp -ljsoncpp
* ex) $ g++ -o nodeMined minedBlockCounter.cpp -ljsoncpp
*
* how to run
* $ ./nodeMined
*/
#include <iostream>
#include <fstream>
#include <jsoncpp/json/json.h>
#include <vector>
#include <stdio.h> /* printf */
#include <stdlib.h>
#include <unistd.h>
//#include <conio.h>
#include <vector>
#include <map>
#include <algorithm>
#include <time.h>
using namespace std;
/*
template<template <typename> class P = std::less >
struct sortMapByValue {
template<class T1, class T2> bool operator()(const std::pair<T1, T2>&left, const std::pair<T1, T2>&right) {
return P<T2>()(left.second, right.second);
}
};
*/
struct Block
{
int height;
int blockTime;
double amount;
};
string myExec(const char* cmd) {
char buffer[512];
std::string result = "";
FILE* pipe = popen(cmd, "r");
if (!pipe) throw std::runtime_error("popen() failed!");
try {
while (!feof(pipe)) {
if (fgets(buffer, 128, pipe) != NULL)
result += buffer;
}
} catch (...) {
pclose(pipe);
throw;
}
pclose(pipe);
return result;
}
int getHeight(string hash) {
int height = 0;
string cmd = "~/komodo/src/komodo-cli getblock " + hash;
string jsonOutput = myExec(cmd.c_str());
Json::Reader reader;
Json::Value obj;
reader.parse(jsonOutput, obj); // Reader can also read strings
height = obj["height"].asInt();
return height;
}
string getTimeStr(int timestamp) {
time_t rawtime = timestamp;
struct tm * timeinfo;
char buffer [80];
//time (&rawtime);
timeinfo = localtime (&rawtime);
strftime (buffer,80,"%F %R",timeinfo);
return buffer;
}
int main() {
Json::Reader reader;
Json::Value obj;
cout << "Loading blockchain info...please wait..." << endl;
string jsonOutput = myExec("~/komodo/src/komodo-cli listsinceblock 01d2c8f63c0c4b0da415a928a94f05b8c1a6070d092e3800ab8bbb37f36b842d"); // since block 814000
reader.parse(jsonOutput, obj); // Reader can also read strings
int size = obj["transactions"].size();
int i=0, j=0;
double total = 0;
int lastBlock = getHeight(obj["lastblock"].asString());
map<int, Block> my_map; // height, amount
cout << fixed;
cout.precision(8);
cout << "--------------------------------------------------------" << endl;
cout << "num\t" << "Amount\t\t" << "Height" << "\t\tTime Interval(M)" << endl;
cout << "--------------------------------------------------------" << endl;
for (i=0; i< size; i++)
{
if (obj["transactions"][i]["generated"].asBool() == false) {
// cout << "generated : false" << endl;
continue;
}
double amountIn = obj["transactions"][i]["amount"].asDouble();;
string hash = obj["transactions"][i]["blockhash"].asString();
int time = obj["transactions"][i]["blocktime"].asInt();
int height = getHeight(hash);
Block blockinfo;
blockinfo.height = height;
blockinfo.amount = amountIn;
blockinfo.blockTime = time;
my_map[height] = blockinfo;
total += amountIn;
j++;
}
vector<pair<int, Block> > my_vector(my_map.begin(), my_map.end()); // height, amount
//sort(my_vector.begin(), my_vector.end(), sortMapByValue<less>());
int sumTime = 0;
for (i=0; i < j; i++) {
Block block = my_vector[i].second;
double amount = block.amount;
if (i > 0) {
int sub = my_vector[i].first - my_vector[i-1].first;
Block prevBlock = my_vector[i-1].second;
int timesub = (block.blockTime - prevBlock.blockTime) / 60;
sumTime += timesub;
//string time = getTimeStr(timesub);
cout << i+1 << "\t" << amount << "\t" << my_vector[i].first << " (+" << sub << ")\t" << timesub << endl;
} else {
cout << i+1 << "\t" << amount << "\t" << my_vector[i].first << "\t-----" << endl;
}
}
int average = (my_vector[j-2].first - my_vector[0].first) / (j-1);
int nextTarget = my_vector[j-1].first + average;
int now = time(NULL);
Block lastblock = my_vector[j-1].second;
int last = lastblock.blockTime;
double minedPerHour = total / sumTime * 60;
cout << "--------------------------------------------------------" << endl;
cout << "Total : " << total << " KMD" << " (avrg interval : " << average << ")" << endl;
cout << "--------------------------------------------------------" << endl;
cout << "Cur last block : " << lastBlock << endl;
cout << "Est next block : " << nextTarget << " (" << nextTarget - lastBlock << " left)" << endl;
cout << "--------------------------------------------------------" << endl;
cout << "Time mined : " << getTimeStr(last) << " (-" << (now-last)/60 << " mins)" << endl;
cout << "Time curr : " << getTimeStr(now) << endl;
cout << "--------------------------------------------------------" << endl;
cout << "Mined per Hour : " << minedPerHour << " KMD" << endl;
cout << "Mined per Day : " << minedPerHour * 24 << " KMD" << endl;
cout << "--------------------------------------------------------" << endl;
return 1;
}

10
goldenman/README.md

@ -0,0 +1,10 @@
# komodod-crash-detect
Instruction to detect komodo daemon crash and auto re-run.
--------------------
# Mined Block Counter
you can get list of block height and amount of mined KMD.

37
goldenman/komodod-crash-detect/README.md

@ -0,0 +1,37 @@
# komodo daemon crash detect and re-run automatically
### 1. creat shell script in home dir
```
$ vim check_komodo.sh
```
```
#!/bin/bash
dt=$(date '+%Y/%m/%d_%H:%M:%S');
psresult=$(ps aux | grep -c "komodod -gen");
#echo "$dt-$psresult"
if [ $psresult -eq 2 ]
then
echo "$dt - result = $psresult - Okay"
else
echo "$dt - result = $psresult - NG"
~/start &
echo "$dt - re-run komodo daemon"
fi
```
This shell will check komodod process is on process list and if not exist, call `~/start` to re-run daemon.
### 2. add this script on `crontab`
```
$ crontab -e
```
And add below at the end of editor
```
# m h dom mon dow command
*/5 * * * * ~/check_komodo.sh >> ~/check_komodo.log 2>&1
```
This will run shell every 5 minute. You can edit interval to check daemon crash.

5
webworker01/README.md

@ -3,10 +3,12 @@ Scripts I like to keep handy for running my node.
Script Name | Function
----------- | --------
**acsplit** | Create UTXOs as needed although Iguana handles this as long as you didn't hit the base58 lottery
**checkforks** | Script to quickly check all assetchains for possible forks
**checkmasks** | Check your nodes connectivity to the notary node network
**coinlist** | Handy way to keep coin list in one place for other scripts to use (thanks to a-team)
**fail2banstatusall** | Get stats of fail2ban jails
**freshubuntu** | Run this for initial setup of your server for basic security needs (generalized on purpose so it can be used on any server)
**killthemall** | Hard kill komodo related processes
**killemall** | Hard kill komodo related processes
**killthemsoftly** | Kill komodo processes nicely
**kmdacfirewall** | UFW settings with commentary
**networktweaksundo.txt** | Reference to my default Ubuntu 16.04 net config "just in case"
@ -17,3 +19,4 @@ Script Name | Function
**startac** | Start assetchains
**stats** | Fancy cli stats for notary nodes
Donate to motivate! :D RNFgPeabWXWeSq2NnYfvdsjuok5Tccd7xM

100
webworker01/checkfork

@ -0,0 +1,100 @@
#!/bin/bash
#You can modify this list of ACs to exclude or comment out the line to show all
ignoreacs=('VOTE2018' 'BEER' 'PIZZA')
#how far ahead or behind before being marked as a fork
variance=3
source coinlist
forked=false
remotecheck=$(curl -Ssf https://komodostats.com/api/notary/summary.json)
remotecheck2=$(curl -Ssf https://dexstats.info/api/explorerstatus.php)
format="%-8s %8s %8s %8s %8s\n"
redformat="\033[0;31m$format\033[0m"
printf "$format" "-ASSET-" "-BLOCKS-" "-LONG-" "-RMT1-" "-RMT2-"
#KMD
blocks=$(komodo-cli getinfo | jq .blocks)
longest=$(komodo-cli getinfo | jq .longestchain)
remoteblocks=$(echo $remotecheck | jq '.[] | select(.ac_name=="KMD") | .blocks')
remoteblocks2=$(echo $remotecheck2 | jq '.status[] | select(.chain=="KMD") | .height | tonumber')
diff1=$((blocks-remoteblocks))
diff2=$((blocks-remoteblocks2))
thisformat=$format
if ((blocks < longest)); then
forked=true
thisformat=$redformat
fi
if (( diff1 < variance * -1 )) || (( diff1 > variance )); then
forked=true
thisformat=$redformat
fi
if (( diff2 < variance * -1 )) || (( diff2 > variance )); then
forked=true
thisformat=$redformat
fi
printf "$thisformat" "KMD" "$blocks" "$longest" "$remoteblocks" "$remoteblocks2"
#CHIPS
blocks=$(chips-cli getinfo | jq .blocks)
longest=$(chips-cli getinfo | jq .headers)
remoteblocks=$(echo $remotecheck | jq '.[] | select(.ac_name=="CHIPS") | .blocks')
diff1=$((blocks-remoteblocks))
thisformat=$format
if ((blocks < longest)); then
forked=true
thisformat=$redformat
fi
if (( diff1 < variance * -1 )) || (( diff1 > variance )); then
forked=true
thisformat=$redformat
fi
printf "$thisformat" "CHIPS" "$blocks" "$longest" "$remoteblocks"
#GAME
blocks=$(gamecredits-cli getinfo | jq .blocks)
remoteblocks=$(echo $remotecheck | jq '.[] | select(.ac_name=="GAME") | .blocks')
diff1=$((blocks-remoteblocks))
thisformat=$format
if (( diff1 < variance * -1 )) || (( diff1 > variance )); then
forked=true
thisformat=$redformat
fi
printf "$thisformat" "GAME" "$blocks" " " "$remoteblocks"
for coins in "${coinlist[@]}"; do
coin=($coins)
if [[ ! ${ignoreacs[*]} =~ ${coin[0]} ]]; then
blocks=$(komodo-cli -ac_name=${coin[0]} getinfo | jq .blocks)
longest=$(komodo-cli -ac_name=${coin[0]} getinfo | jq .longestchain)
remoteblocks=$(echo $remotecheck | jq --arg acname ${coin[0]} '.[] | select(.ac_name==$acname) | .blocks')
remoteblocks2=$(echo $remotecheck2 | jq --arg acname ${coin[0]} '.status[] | select(.chain==$acname) | .height | tonumber')
diff1=$((blocks-remoteblocks))
diff2=$((blocks-remoteblocks2))
thisformat=$format
if ((blocks < longest)); then
forked=true
thisformat=$redformat
fi
if (( diff1 < variance * -1 )) || (( diff1 > variance )); then
forked=true
thisformat=$redformat
fi
if (( diff2 < variance * -1 )) || (( diff2 > variance )); then
forked=true
thisformat=$redformat
fi
printf "$thisformat" "${coin[0]}" "$blocks" "$longest" "$remoteblocks" "$remoteblocks2"
fi
done
if [ "$forked" = false ]; then
printf "\033[0;32mAll coins are fine\033[0m\n"
else
printf "\033[0;31mPossible fork!\033[0m\n"
fi

46
webworker01/checkmasks

@ -0,0 +1,46 @@
#!/bin/bash
#Running with no parameter will give a summary
#./checkmasks all - will output detail for each node
#./checkmasks <maskhex> - will output detail for a specific mask
#which notaryid to use as "seednode" reference starting at 0 to 63
seednode=1
if [[ ! -z $1 ]]
then
if [[ "$1" == "all" ]]
then
curl -s --url "http://127.0.0.1:7776" --data "{\"agent\":\"dpow\",\"method\":\"active\"}" | jq -c -r .[]
else
curl -s --url "http://127.0.0.1:7776" --data "{\"agent\":\"dpow\",\"method\":\"active\",\"maskhex\":\"$1\"}" | jq -c -r .
fi
else
mynotaryid=$(komodo-cli getinfo | jq .notaryid)
bestmaskdata=$(curl -s --url "http://127.0.0.1:7776" --data "{\"agent\":\"dpow\",\"method\":\"active\"}")
seedrecvmask=$(echo $bestmaskdata | jq --arg seedid $seednode '.[$seedid|tonumber] | .recvmask' | sed 's/"//g' | awk '{$1=$1};1')
echo "Seed recvmask: $seedrecvmask"
curl -s --url "http://127.0.0.1:7776" --data "{\"agent\":\"dpow\",\"method\":\"active\",\"maskhex\":\"$seedrecvmask\"}" | jq -c -r '. | del(.maskhex) | del(.tag) | .set'
echo "not:"
curl -s --url "http://127.0.0.1:7776" --data "{\"agent\":\"dpow\",\"method\":\"active\",\"maskhex\":\"$seedrecvmask\"}" | jq -c -r '. | del(.maskhex) | del(.tag) | .not'
myrecvmask=$(echo $bestmaskdata | jq --arg nodeid $mynotaryid '.[$nodeid|tonumber].recvmask' | sed 's/"//g' | awk '{$1=$1};1')
echo
echo "My recvmask: $myrecvmask"
curl -s --url "http://127.0.0.1:7776" --data "{\"agent\":\"dpow\",\"method\":\"active\",\"maskhex\":\"$myrecvmask\"}" | jq -c -r '.set'
bestmask=$(echo $bestmaskdata | jq -c 'group_by(.bestmask) | del(.[] | select(.[0].bestmask == " 0" )) | del(.[] | select(.[0].bestmask == " 0" )) | map ({ "total":length, "bestmask":.[0].bestmask }) | sort_by(.total) | reverse')
bestmaskmask=$(echo $bestmask | jq .[0].bestmask | sed 's/"//g' | awk '{$1=$1};1')
bestmaskcount=$(echo $bestmask | jq .[0].total | sed 's/"//g')
echo
echo "Best bestmask: $bestmaskmask [$bestmaskcount agree]"
curl -s --url "http://127.0.0.1:7776" --data "{\"agent\":\"dpow\",\"method\":\"active\",\"maskhex\":\"$bestmaskmask\"}" | jq -c -r '.set'
mybestmask=$(echo $bestmaskdata | jq --arg nodeid $mynotaryid '.[$nodeid|tonumber].bestmask' | sed 's/"//g' | awk '{$1=$1};1')
echo
echo "My bestmask: $mybestmask"
curl -s --url "http://127.0.0.1:7776" --data "{\"agent\":\"dpow\",\"method\":\"active\",\"maskhex\":\"$mybestmask\"}" | jq -c -r '.set'
fi

56
webworker01/kmdacfirewall

@ -1,38 +1,46 @@
#!/bin/bash
sudo apt-get install ufw
sudo ufw disable
sudo ufw default deny incoming
sudo ufw allow 22 comment 'SSH port'
sudo ufw allow 7770 comment 'KMD port'
sudo ufw allow 7775 comment 'Iguana port'
sudo ufw allow 8333 comment 'BTC port'
sudo ufw allow 57777 comment 'CHIPS port'
sudo ufw allow 10195 comment 'REVS asset chain port'
sudo ufw allow 11340 comment 'SUPERNET asset chain port'
sudo ufw allow 11889 comment 'DEX asset chain port'
sudo ufw allow 14067 comment 'PANGEA asset chain port'
sudo ufw allow 15105 comment 'JUMBLR asset chain port'
sudo ufw allow 14249 comment 'BET asset chain port'
sudo ufw allow 8515 comment 'CRYPTO asset chain port'
sudo ufw allow 14430 comment 'HODL asset chain port'
#sudo ufw allow 10113 comment 'SHARK asset chain port'
sudo ufw allow 11963 comment 'BOTS asset chain port'
sudo ufw allow 12385 comment 'MGW asset chain port'
sudo ufw allow 8654 comment 'MVP asset chain port'
sudo ufw allow 12166 comment 'WLC asset chain port'
sudo ufw allow 8298 comment 'KV asset chain port'
sudo ufw allow 11115 comment 'CEAL asset chain port'
sudo ufw allow 9454 comment 'MESH asset chain port'
sudo ufw allow 14336 comment 'MNZ asset chain port'
sudo ufw allow 22 comment 'SSH'
sudo ufw allow 7770 comment 'KMD'
sudo ufw allow 17775 comment 'Iguana Notary'
#sudo ufw allow 8333 comment 'BTC'
sudo ufw allow 57777 comment 'CHIPS'
sudo ufw allow 10195 comment 'REVS'
sudo ufw allow 11340 comment 'SUPERNET'
sudo ufw allow 11889 comment 'DEX'
sudo ufw allow 14067 comment 'PANGEA'
sudo ufw allow 15105 comment 'JUMBLR'
sudo ufw allow 14249 comment 'BET'
sudo ufw allow 8515 comment 'CRYPTO'
sudo ufw allow 14430 comment 'HODL'
sudo ufw allow 11963 comment 'BOTS'
sudo ufw allow 12385 comment 'MGW'
sudo ufw allow 8654 comment 'MVP'
sudo ufw allow 12166 comment 'WLC'
sudo ufw allow 8298 comment 'KV'
sudo ufw allow 11115 comment 'CEAL'
sudo ufw allow 9454 comment 'MESH'
sudo ufw allow 14336 comment 'MNZ'
sudo ufw allow 14275 comment 'COQUI'
sudo ufw allow 8845 comment 'MSHARK'
sudo ufw allow 12926 comment 'AXO'
sudo ufw allow 8799 comment 'BTCH'
sudo ufw allow 10270 comment 'ETOMIC'
sudo ufw allow 15487 comment 'VOTE2018'
sudo ufw allow 8426 comment 'NINJA'
sudo ufw allow 8922 comment 'BEER'
sudo ufw allow 8426 comment 'NINJA'
sudo ufw allow 8922 comment 'BEER'
sudo ufw allow 11607 comment 'PIZZA'
sudo ufw allow 12466 comment 'OOT'
sudo ufw allow 14357 comment 'BNTN'
sudo ufw allow 15586 comment 'CHAIN'
sudo ufw allow 9678 comment 'PRLPAY'
sudo ufw allow 11556 comment 'DSEC'
sudo ufw allow 15722 comment 'GLXT'
sudo ufw allow 10305 comment 'EQL'
sudo ufw enable
# check the status again
sudo ufw status

237
webworker01/stats

@ -1,71 +1,212 @@
#!/bin/bash
IFS=
source coinlist
#Change to sleepytime=false if you don't want it to loop
#Stats script for Komodo Notary Nodes
#
#Requires jq v1.5+ and bitcoin-cli, komodo-cli, chips-cli and gamecredits-cli installed (e.g. symlinked to /usr/local/bin)
#==Options - Only Change These==
#Seconds in display loop, change to false if you don't want it to loop
sleepytime=600
#How many transactions back to scan for notarizations
txscanamount=77777
#You can modify this list of ACs to exclude or comment out the line to show all
ignoreacs=('VOTE2018' 'BEER' 'PIZZA')
#git checking - path and remote branch
declare -A repos=(
[KMD]='$HOME/komodo origin/dev'
[SUPERNET]='$HOME/SuperNET origin/dev'
[CHIPS]='$HOME/chips3 origin/dev'
[GAME]='/home/gamecredits/GameCredits origin/master'
)
#==End Options==
timeSince () {
local currentimestamp=$(date +%s)
local timecompare=$1
if [ ! -z $timecompare ] && [[ $timecompare != "null" ]]
then
local t=$((currentimestamp-timecompare))
local d=$((t/60/60/24))
local h=$((t/60/60%24))
local m=$((t/60%60))
local s=$((t%60))
if [[ $d > 0 ]]; then
echo -n "${d}d"
fi
if [[ $h > 0 ]]; then
echo -n "${h}h"
fi
if [[ $d = 0 && $m > 0 ]]; then
echo -n "${m}m"
fi
if [[ $d = 0 && $h = 0 && $m = 0 ]]; then
echo -n "${s}s"
fi
fi
}
checkRepo () {
if [ -z $1 ] || [ -z $2 ] || [ -z $3 ]; then
return
fi
prevdir=${PWD}
eval cd "$2"
color_red=$'\033[0;31m'
color_reset=$'\033[0m'
git remote update > /dev/null 2>&1
localrev=$(git rev-parse HEAD)
remoterev=$(git rev-parse $3)
cd $prevdir
if [ $localrev != $remoterev ]; then
printf "$color_red[U]$color_reset"
fi
case $1 in
KMD)
printf " "
;;
CHIPS)
printf " "
;;
GAME)
printf " "
;;
esac
}
#Do not change below for any reason!
#The BTC and KMD address here must remain the same. Do not need to enter yours!
source coinlist
utxoamt=0.00010000
ntrzdamt=-0.00083600
btcntrzaddr=1P3rU1Nk1pmc2BiWC8dEy9bZa1ZbMp5jfg
kmdntrzaddr=RXL3YXG2ceaB6C5hfJcN4fvmLH2C34knhA
#Only count KMD->BTC after this timestamp (block 814000)
timefilter=1525032458
#Second time filter for assetchains (SuperNET commit 07515fb)
timefilter2=1525513998
#How many transactions back to scan for notarizations
txscanamount=77777
format="%-11s %6s %6s %7s %.12s %6s %6s %6s"
format="%-8s %7s %6s %7s %12s\n"
othercoins=(
'CHIPS chips-cli'
'GAME gamecredits-cli'
)
outputstats ()
{
count=0
now=$(date +"%Y-%m-%d %T%z")
totalntrzd=0
now=$(date +"%H:%M")
printf "\n\n%-8s %7s %6s %7s %12s\n" "-ASSET-" "-NTRZd-" "-UTXO-" "-BLOX-" "-BALANCE-";
printf "\n\n"
printf "%-11s %6s %6s %7s %12s %6s %6s %6s\n" "-ASSET-" "-NOTR-" "-UTXO-" "-BLOX-" "-BALANCE-" "-LAST-" "-CNCT-";
printf "%-8s %7s %6s %7s %12s\n" "BTC" \
"$(bitcoin-cli listtransactions "" $txscanamount | grep $btcntrzaddr | wc -l)" \
"$(bitcoin-cli listunspent | grep $utxoamt | wc -l)" \
"$(bitcoin-cli getblockchaininfo | awk ' /\"blocks\"/ {printf $2}' | sed 's/,//')" \
"$(bitcoin-cli getbalance)"
btctxinfo=$(bitcoin-cli listtransactions "" $txscanamount)
btclastntrztime=$(echo $btctxinfo | jq -r --arg address "$btcntrzaddr" '[.[] | select(.address==$address)] | sort_by(.time) | last | "\(.time)"')
btcntrzd=$(echo $btctxinfo | jq --arg address "$btcntrzaddr" --arg timefilter $timefilter '[.[] | select(.time>=($timefilter|tonumber) and .address==$address and .category=="send")] | length')
totalntrzd=$(( $totalntrzd + $btcntrzd ))
printf "$format\n" "BTC" \
"$btcntrzd" \
"$(bitcoin-cli listunspent | jq --arg amt "$utxoamt" '[.[] | select(.amount==($amt|tonumber))] | length')" \
"$(bitcoin-cli getblockchaininfo | jq .blocks)" \
"$(printf "%12.8f" $(bitcoin-cli getbalance))" \
"$(timeSince $btclastntrztime)" \
"$(bitcoin-cli getnetworkinfo | jq .connections)"
kmdinfo=$(komodo-cli getinfo)
printf "$format" "KMD" \
"$(komodo-cli listtransactions "" $txscanamount | grep $kmdntrzaddr | wc -l)" \
"$(komodo-cli listunspent | grep $utxoamt | wc -l)" \
"$(echo $kmdinfo | awk ' /\"blocks\"/ {printf $2}' | sed 's/,//')" \
"$(echo $kmdinfo | awk ' /\"balance\"/ {printf $2}' | sed 's/,//')" \
chipsinfo=$(chips-cli getinfo)
printf "$format" "CHIPS" \
"$(chips-cli listtransactions "" $txscanamount | grep $kmdntrzaddr | wc -l)" \
"$(chips-cli listunspent | grep $utxoamt | wc -l)" \
"$(echo $chipsinfo | awk ' /\"blocks\"/ {printf $2}' | sed 's/,//')" \
"$(echo $chipsinfo | awk ' /\"balance\"/ {printf $2}' | sed 's/,//')" \
while [ "x${coinlist[count]}" != "x" ]
do
all=${coinlist[count]}
name=${all%% *}
#if [ "$name" != "" ]
if [ "$name" != "" ] && [ "$name" != "VOTE2018" ]
then
info=$(komodo-cli -ac_name=$name getinfo)
txinfo=$(komodo-cli -ac_name=$name listtransactions "" $txscanamount)
printf "$format" "$name" \
"$(echo $txinfo | grep -- $kmdntrzaddr | wc -l)" \
"$(komodo-cli -ac_name=$name listunspent | grep $utxoamt | wc -l)" \
"$(echo $info | awk ' /\"blocks\"/ {printf $2}' | sed 's/,//')" \
"$(echo $info | awk ' /\"balance\"/ {printf $2}' | sed 's/,//')"
kmdtxinfo=$(komodo-cli listtransactions "" $txscanamount)
kmdlastntrztime=$(echo $kmdtxinfo | jq -r --arg address "$kmdntrzaddr" '[.[] | select(.address==$address)] | sort_by(.time) | last | "\(.time)"')
repo=(${repos[KMD]})
printf "$format\n" "KMD$(checkRepo KMD ${repo[0]} ${repo[1]})" \
" " \
"$(komodo-cli listunspent | jq --arg amt "$utxoamt" '[.[] | select(.amount==($amt|tonumber))] | length')" \
"$(echo $kmdinfo | jq .blocks)" \
"$(printf "%12.8f" $(echo $kmdinfo | jq .balance))" \
"$(timeSince $kmdlastntrztime)" \
"$(echo $kmdinfo | jq .connections)" \
"$(echo $kmdtxinfo | jq '[.[] | select(.generated==true)] | length') mined"
for coins in "${othercoins[@]}"; do
coin=($coins)
if [[ ${coin[0]} == "GAME" ]]; then
coinsutxoamount=0.00100000
coinsntraddr=Gftmt8hgzgNu6f1o85HMPuwTVBMSV2TYSt
else
coinsutxoamount=$utxoamt
coinsntraddr=$kmdntrzaddr
fi
coinsinfo=$(${coin[1]} getinfo)
coinstxinfo=$(${coin[1]} listtransactions "" $txscanamount)
coinslastntrztime=$(echo $coinstxinfo | jq -r --arg address "$coinsntraddr" '[.[] | select(.address==$address)] | sort_by(.time) | last | "\(.time)"')
coinsntrzd=$(echo $coinstxinfo | jq --arg address "$coinsntraddr" --arg timefilter $timefilter2 '[.[] | select(.time>=($timefilter|tonumber) and .address==$address and .category=="send")] | length')
totalntrzd=$(( $totalntrzd + $coinsntrzd ))
repo=(${repos[${coin[0]}]})
printf "$format\n" "${coin[0]}$(checkRepo ${coin[0]} ${repo[0]} ${repo[1]})" \
"$coinsntrzd" \
"$(${coin[1]} listunspent | jq --arg amt "$coinsutxoamount" '[.[] | select(.amount==($amt|tonumber))] | length')" \
"$(echo $coinsinfo | jq .blocks)" \
"$(printf "%12.8f" $(echo $coinsinfo | jq -r '. | (.balance|tostring)'))" \
"$(timeSince $coinslastntrztime)" \
"$(echo $coinsinfo | jq .connections)"
done
lastcoin=(${coinlist[-1]})
secondlast=(${coinlist[-2]})
for coins in "${coinlist[@]}"; do
coin=($coins)
if [[ ! ${ignoreacs[*]} =~ ${coin[0]} ]]; then
info=$(komodo-cli -ac_name=${coin[0]} getinfo)
mininginfo=$(komodo-cli -ac_name=${coin[0]} getmininginfo)
txinfo=$(komodo-cli -ac_name=${coin[0]} listtransactions "" $txscanamount)
lastntrztime=$(echo $txinfo | jq -r --arg address "$kmdntrzaddr" '[.[] | select(.address==$address)] | sort_by(.time) | last | "\(.time)"')
acntrzd=$(echo $txinfo | jq --arg address "$kmdntrzaddr" --arg timefilter $timefilter2 '[.[] | select(.time>=($timefilter|tonumber) and .address==$address and .category=="send")] | length')
totalntrzd=$(( $totalntrzd + $acntrzd ))
repo=(${repos[${coin[0]}]})
laststring=""
if [[ ${coin[0]} == ${lastcoin[0]} ]]; then
laststring="@ $now"
fi
if [[ ${coin[0]} == ${secondlast[0]} ]]; then
laststring="All:$totalntrzd"
fi
printf "$format" "${coin[0]}$(checkRepo ${coin[0]} ${repo[0]} ${repo[1]})" \
"$acntrzd" \
"$(komodo-cli -ac_name=${coin[0]} listunspent | jq --arg amt "$utxoamt" '[.[] | select(.amount==($amt|tonumber))] | length')" \
"$(echo $info | jq .blocks)" \
"$(printf "%12.8f" $(echo $info | jq .balance))" \
"$(timeSince $lastntrztime)" \
"$(echo $info | jq .connections)" \
"$laststring"
if [[ ${coin[0]} != ${lastcoin[0]} ]]; then
echo
fi
fi
count=$(( $count +1 ))
done
printf "$now";
}
if [ "$sleepytime" != "false" ]
then
while true
do
if [ "$sleepytime" != "false" ]; then
while true; do
outputstats
sleep $sleepytime
done

Loading…
Cancel
Save