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