На данный момент на крипторынке торги токенизированного золота (XAUT) достаточно ликвидны и имеют незначительные отклонения курса от эталонных значений. При тестировании, отличия в результатах не превышали 0.01% между данным скриптом и скриптом от @vvk.
Для работы скрипта необходимы три библиотеки:
Для запуска по расписанию, заменить последнюю строку main() на feed_publish()
#!/usr/bin/env python
from golosbase.operations import FeedPublish
from golos.steem import Steem
from xrpl.models.requests import AccountLines
from xrpl.clients import JsonRpcClient
from xrpl.account import get_balance
from xrpl.utils import drops_to_xrp
from decimal import Decimal
import importlib.util
# Обязательно для публикации feed
_WALL = ["аккаунт", "active ключ"]
# Можно выбрать любую поддерживаемую ccxt биржу где торгуется XRP и XAUT
# Регистрация на бирже не нужна, скрипт использует публичный API запрос
# XAUT можно заменить на любой другой ликвидный вариант токенизированного золота
# Рекомендую не использовать пары к стабилкоинам [USDT,USDC,...]
_CEX = "bitfinex"
_GOLD = "XAUT/USD"
# Адрес AMM pool GLS/XRP
amm_pool = "rPuxHkfL5LCjNjfpSZiywJdm4ToXLenNpx"
golos = Steem(["https://golos.lexai.top", "https://api-golos.blckchnd.com", "https://api.aleksw.space", "https://golosapi.ecurrex.ru"])
ripple = JsonRpcClient("https://s1.ripple.com:51234/")
def account_lines():
try:
data = ripple.request(AccountLines(account=amm_pool)).result
for line in data["lines"]:
if line["currency"] == "GLS": return line["balance"]
except Exception:
pass
return None
def check_rate_amm():
try:
value_xrp = drops_to_xrp(str(get_balance(amm_pool, ripple)))
return Decimal(value_xrp) / Decimal(account_lines())
except Exception:
return None
def check_rate_feed():
try:
api = getattr(importlib.import_module(f"ccxt.{_CEX}"), _CEX)()
price_gbg = Decimal(api.fetch_ticker(_GOLD)["bid"]) / Decimal("31103.4768")
price_gls = Decimal(api.fetch_ticker("XRP/USD")["bid"]) * check_rate_amm()
return (price_gls / price_gbg).quantize(Decimal("0.001"))
except Exception:
return None
def secure_signing(transaction):
try:
golos.commit.wallet.setKeys(_WALL[1])
golos.commit.finalizeOp(transaction, _WALL[0], "active")
return True
except Exception:
return False
def feed_publish():
try:
exchange_rate = {"base": f"{check_rate_feed()} GBG", "quote": "1.000 GOLOS"}
transaction = FeedPublish({"publisher": _WALL[0], "exchange_rate": exchange_rate})
return secure_signing(transaction)
except Exception:
return False
def main():
num = int(input("""
1. Рассчитать PriceFeed
2. Рассчитать и опубликовать PriceFeed
> """))
match num:
case 1:
print(f"PriceFeed: {check_rate_feed()} GBG за 1 GOLOS")
case 2:
if feed_publish(): print("PriceFeed опубликован")
else: print("PriceFeed error")
case _:
exit()
if __name__ == '__main__':
main()
@gusaru, а насколько результат отличается от альтернативного скрипта, считающего через битшары и золото от центробанка?
https://github.com/jackvote/price_feed
@retroscope, не проверял, не использовал этот скрипт.
Считаю, чем больше будет разных подходов к расчету PriceFeed, тем надёжнее система.
@gusaru, результат можно глянуть здесь и сравнить. Даже устанавливать никуда не нужно.
https://expertgroup.org/get_feed.php
@retroscope, тем более Вам не составит труда сравнить с тем PriceFeed который опубликован моим скриптом.
@gusaru, в посте не сказано, что скрипт уже применяется для делегата.
0.002 GBG против 0.006 GBG
У остальных тоже 0.006 GBG, видимо, с использованием скрипта от Vik
@retroscope, расчёт в Вашем скрипте идёт через пару BTS/GOLOS, на которой в стаканах пусто и последние торги 27.11.2023
@gusaru, на rudex есть только такие пары с голосом:
{"GLS_BTC":{"last_price":"0.00000025",
"base_volume":"0",
"quote_volume":"0",
"timestamp":"2025-09-16 09:00:00"},
"GLS_USDT":{"last_price":"0.000719996790898729016",
"base_volume":"0",
"quote_volume":"0",
"timestamp":"2025-09-16 09:00:00"},
"GLS_BTS":{"last_price":"0.207533085114548020508",
"base_volume":"0",
"quote_volume":"0",
"timestamp":"2025-09-16 09:00:00"},
}
Через какие пары ещё можно делать расчёт? Вообще где-то торги по голосу идут, чтобы взять основу для расчёта?
@retroscope, скрипт обновляет PriceFeed моего делегата.
Используйте более ликвидные пары для определения цены GOLOS.