Представляю скрипт для автоматического обновления Price Feed (для делегатов)

в прошлом году
67 в делегаты

Со стартом Краудсэйла мы получили одну из недостающих переменных, от которой можно отталкиваться при расчете ценовых фидов - количество BTC, собранных на краудсэйле.

Цена рассчитывается довольно просто: общее количество собранных BTC, выраженное в долларовом эквиваленте делится на количество токенов, которое будет распределено по итогам Краудсэйла (27072000) - (либо на общее количество токенов на момент окончания Краудсэйла (45120000)).
Принимая в расчет то, что цена золотого (GBG) равна примерно цене одного миллиграмма золота, а также то, что цена золота в долларах известна - мы можем посчитать значение GBG в Голосах.

Вы можете производить расчет используя одно из значений общего количества токенов на Ваше усмотрение.

В дополнение к скрипту, опубликованному делегатом @primus Онлайн-мониторинг краудсейла: сколько Голосов вы можете купить за 1000 рублей или 1 BTC (плюс автоматизация прайс фидов для делегатов) хочу поделится с Вами скриптом для автоматической публикации фидов с учетом трех переменных:

  • баланс BTC на адресе краудсэйла
  • текущий курс BTC/USD
  • текущий курс GOLD/USD

За основу был взят и усовершенствован bash-скрипт для автоматической публикации фида делегата @xtar

Для расчета цены скрипт стягивает данные со следующих ресурсов:

актуальный баланс BTC на адресе Краудсэйла - с btc.blockr.io
текущий курс BTC/USD - с биржи btc-e.com
текущий курс GOLD/USD - с goldprice.org

Подготовка к настройке:

Необходимо, чтобы cli_wallet был запущен. Это можно сделать командой

screen -dmS cliwallet ./cli_wallet --server-rpc-endpoint=ws://127.0.0.1:8090 --rpc-http-endpoint=127.0.0.1:8091 --rpc-http-allowip 127.0.0.1 -d

где

  • ws://127.0.0.1:8090 - rpc-endpoint вашей ноды
  • 127.0.0.1:8091 - адрес на котором будет слушать команды запущенный клиент

Также необходимо установить следующие пакеты

  • jq - утилита для работы с JSON
  • bc - калькулятор
  • curl - HTTP клиент (скорее всего у Вас уже установлен)

sudo apt-get install jq bc curl

Для самого скрипта необходимо добавить в .bash_profile некоторые переменные, индивидуальные для каждого делегата

echo "export GOLOS_WALLET=http://127.0.0.1:8091" » $HOME/.bash_profile
echo "export GOLOS_PASSWORD=YOURstrongPSSWRD" » $HOME/.bash_profile
echo "export GOLOS_WITNESS=on0tole" » $HOME/.bash_profile

где

  • WALLET - rpc адрес cli_wallet
  • WITNESS - имя делегата, от имени которого будет публиковаться фид
  • PASSWORD - пароль для разблокировки cli_wallet

Код скрипта updatefeed.sh

#!/bin/bash


# Load env vars
source $HOME/.bash_profile


# cli_wallet --rpc-http-endpoint url
if [ -z $GOLOS_WALLET ]; then
        echo "ERROR: Golos wallet is not set"
        exit 1
fi
WALLET=$GOLOS_WALLET


# cli_wallet unlock password
if [ -z $GOLOS_PASSWORD ]; then
        echo "ERROR: Golos wallet password is not set"
        exit 1
fi
PASSWORD=$GOLOS_PASSWORD


# publish_feed nickname:
if [ -z $GOLOS_WITNESS ]; then
        echo "ERROR: Golos witness name is not set"
        exit 1
fi
NICKNAME=$GOLOS_WITNESS


# ICO settings
ICO_ADDRESS="3CWicRKHQqcj1N6fT1pC9J3hUzHw1KyPv3"
ICO_TOKENS=45120000


function is_locked {
        LOCKED=`curl -s --data-binary '{"id":"1","method":"is_locked","params":[""]}' "$WALLET" | jq -r '.result'`
}


function checkLockAndExit {
        if [ "$EXITLOCK" = true ]; then
                echo -n "Locking wallet again..."
                curl -s --data-binary '{"id":0,"method":"lock","params":[]}' "$WALLET" > /dev/null
                echo ""
                echo "Locked."
        fi
}


function getGoldMgPrice {
        local XAUOZ=`curl -s 'http://data-asg.goldprice.org/GetData/USD-XAU/1' | jq -r '.[0]' | cut -d ',' -f 2`
        local GRAMM_IN_OZ=31.1034768
        XAUMG=$(echo "scale=10 ; $XAUOZ / $GRAMM_IN_OZ / 1000" | bc)
}


function getIcoBalance {
        ICO_BALANCE=`curl -s 'http://btc.blockr.io/api/v1/address/balance/3CWicRKHQqcj1N6fT1pC9J3hUzHw1KyPv3?confirmations=2' | jq -r '.data.balance'`
}


function getBtcUsdPrice {
        BTC_USD=`curl -s 'https://btc-e.nz/api/3/ticker/btc_usd-btc_btc?ignore_invalid=1' | jq -r '.btc_usd.last'`
}


is_locked
if [ "$LOCKED" == "true" ]; then
        EXITLOCK=true
        echo -n "Wallet is locked. Trying to unlock..."
        curl -s --data-binary '{"id":"1","method":"unlock","params":["'"$PASSWORD"'"]}' "$WALLET" > /dev/null
        echo ""
        is_locked
        if [ "$LOCKED" == "true" ]; then
                echo "Can't unlock wallet, exiting."
                checkLockAndExit                
        else
                echo "Wallet unlocked."
        fi
else
        if [ "$LOCKED" == "false" ]; then
                EXITLOCK=false
                echo "Wallet was unlocked before."
        else
                echo "Some error. Is cli_wallet running? Exit."
                exit
        fi
fi




# Getting input data
getGoldMgPrice
getIcoBalance
getBtcUsdPrice


# Calc
GOLOS_USD=$(echo "scale=10 ; $ICO_BALANCE * $BTC_USD / $ICO_TOKENS" | bc)
GBG_GOLOS=$(echo "scale=3 ; $XAUMG / $GOLOS_USD" | bc)


# Publish
BASE="1.000"
QUOTE=$GBG_GOLOS


PUB=`curl -s --data-binary '{"id":"2","method":"publish_feed","params":["'"$NICKNAME"'",{"base":"'"$BASE GBG"'", "quote":"'"$QUOTE GOLOS"'"}, true],"jsonrpc":"2.0"}' "$WALLET" | jq -r '.id'`
if [ $PUB -eq 2 ]; then
        echo "Feed was updated successfully. 'base'=${BASE} 'quote'=${QUOTE}"                
else
        echo "Some error. Feed wasn't updated."                
fi


checkLockAndExit

Не забудьте сделать скрипт исполняемым (спасибо @dark.sun ):
chmod +x updatefeed.sh

P.S. я использую для расчета общее количество токенов равное 45 млн, если Вы планируете использовать 27 млн, либо любое другое значение - отредактируйте данный параметр:

ICO_TOKENS=45120000

Запуск скрипта в Cron:

0 * * * * root cd /root/ && ( date >> updatefeed.log; ./updatefeed.sh >> updatefeed.log )

В данном случае скрипт будет выполняться каждый час ровно в hh:00 минут. Вы можете указать свое время, чтобы делегаты не публиковали фиды одновременно. Либо использовать свои настройки с желаемой периодичностью.

Настройте скрипт прямо сейчас и Вы больше не будете просыпаться по ночам в холодном поту, вспоминая не забыли ли Вы выставить корректный фид

Фидбэк приветствуется, всем доброго времени суток!

Авторы получают вознаграждение, когда пользователи голосуют за их посты.
Голосующие читатели также получают вознаграждение за свой голос.
Порядок сортировки:  Популярное

Отлично, благодарю!

Спасибо, Толя!

Здорово. Получи заслуженный голос!)

Отлично!

Чем больше разных независимых скриптов для обновления цен, тем лучше.

·

Децентрализация же)

Добавлю лишь, что перед запуском нннадо:

chmod +x updatefeed.sh

·

Спасибо, добавил +

Если нода в РФ, то на btc-e.com может не пустить за ценой на бтк.

·

Теоретически это возможно, спасибо - изменил на btc-e.nz, прайс тянет=)

thanks wonderful!

@on0tole, многие делегаты твой скрипт используют для выставления фидов.

Думаю, нужно поправить ошибку - после окончания краудсейла с адреса 3CWicRKHQqcj1N6fT1pC9J3hUzHw1KyPv3 были списания (основателям Голоса, за лицензию в Стим и т.п.).

В итоге сейчас на баланесе этого кошелька всего 420 BTC, вместо собранных 600.18454536

Соответственно и прайс-фид у всех, использующих ваш скрипт стоит на уровне 5.26 GOLOS/GBG вместо 3.6

Надо поправить.

·

Поправил у себя.
надо вместо

ICO_BALANCE=curl -s 'http://btc.blockr.io/api/v1/address/balance/3CWicRKHQqcj1N6fT1pC9J3hUzHw1KyPv3?confirmations=2' | jq -r '.data.balance'

написать
ICO_BALANCE=600.18454536

·

Спасибо, совсем забыл про это=) сейчас подправлю, залью фикс - надо будет оповестить всех, кто его использует

Запуск скрипта в Cron:
0 * * * * *

Тут одна * лишняя. С ней крон не настроится. Не понимаю зачем запускать его под рутом? Лично я запускаю под обычным пользователем.

И вывод времени в лог я бы вынес не в команду запуска а внутрь самого скрипта
Я бы ещё добавил, что редактировать файл крона можно коммандой crontab -e
Сам файл должен обязательно заканчиваться пустой строкой

·

Спасибо, откуда то затесалась лишняя. Вообще каждый может настроить под себя как ему удобно,, все равно с выходом на биржи будет другой скрипт

68
  ·  в прошлом году

Тест бота @on0tole

66
  ·  в прошлом году

Восхищаюсь програмистами! Для меня эти скрипты - каляки маляки)) ничего не ясно..спасибо за вашу работу делегаты!)

Да уж!!! Не каждому дано это понять)))

Спасибо за скрипт!

Скрипт пишет Feed was updates succesfully даже если не смог сделать unlock cli_wallet

Не знаю у кого как, а у меня не работает))) Ругается на таймер.
0 * * * * * root cd /root/ && ( date >> updatefeed.log; ./updatefeed.sh >> updatefeed.log )

*/10 * * * * ~/updatefeed.sh
Запустил так.