
Со стартом Краудсэйла мы получили одну из недостающих переменных, от которой можно отталкиваться при расчете ценовых фидов - количество 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 минут. Вы можете указать свое время, чтобы делегаты не публиковали фиды одновременно. Либо использовать свои настройки с желаемой периодичностью.
Настройте скрипт прямо сейчас и Вы больше не будете просыпаться по ночам в холодном поту, вспоминая не забыли ли Вы выставить корректный фид

Фидбэк приветствуется, всем доброго времени суток!
Отлично, благодарю!
Спасибо, Толя!
Восхищаюсь програмистами! Для меня эти скрипты - каляки маляки)) ничего не ясно..спасибо за вашу работу делегаты!)
Здорово. Получи заслуженный голос!)
Отлично!
Чем больше разных независимых скриптов для обновления цен, тем лучше.
Децентрализация же)
Добавлю лишь, что перед запуском нннадо:
Спасибо, добавил +
Если нода в РФ, то на btc-e.com может не пустить за ценой на бтк.
Теоретически это возможно, спасибо - изменил на btc-e.nz, прайс тянет=)
thanks wonderful!
Не знаю у кого как, а у меня не работает))) Ругается на таймер.
0 * * * * * root cd /root/ && ( date >> updatefeed.log; ./updatefeed.sh >> updatefeed.log )
*/10 * * * * ~/updatefeed.sh
Запустил так.
Тут одна * лишняя. С ней крон не настроится. Не понимаю зачем запускать его под рутом? Лично я запускаю под обычным пользователем.
И вывод времени в лог я бы вынес не в команду запуска а внутрь самого скрипта
Я бы ещё добавил, что редактировать файл крона можно коммандой crontab -e
Сам файл должен обязательно заканчиваться пустой строкой
Спасибо, откуда то затесалась лишняя. Вообще каждый может настроить под себя как ему удобно,, все равно с выходом на биржи будет другой скрипт
Тест бота @on0tole
Да уж!!! Не каждому дано это понять)))
Спасибо за скрипт!
Скрипт пишет Feed was updates succesfully даже если не смог сделать unlock cli_wallet
@on0tole, многие делегаты твой скрипт используют для выставления фидов.
Думаю, нужно поправить ошибку - после окончания краудсейла с адреса 3CWicRKHQqcj1N6fT1pC9J3hUzHw1KyPv3 были списания (основателям Голоса, за лицензию в Стим и т.п.).
В итоге сейчас на баланесе этого кошелька всего 420 BTC, вместо собранных 600.18454536
Соответственно и прайс-фид у всех, использующих ваш скрипт стоит на уровне 5.26 GOLOS/GBG вместо 3.6
Надо поправить.
Поправил у себя.
надо вместо
написать
ICO_BALANCE=600.18454536
Спасибо, совсем забыл про это=) сейчас подправлю, залью фикс - надо будет оповестить всех, кто его использует