Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
denis-skripnik
5 лет назад

Код сервиса отправки всех токенов на биржу

Здравствуйте. В одном из предыдущих постов я рассказывал о том, что хочу создать страницу локальную, чтоб можно было выводить GOLOS И GBG на биржи, не заходя на Голос.

Внимание

Обращайте внимание на то, можно ли отправлять с одним и тем же memo, сами.
** Проверяйте memo перед отправкой, обновив страницу.**

Что запрашивает:

  1. Логин
  2. Активный ключ (Сохраняется в браузере в зашифрованном виде, никуда не отправляется);
  3. Выбор биржи (rudex или kuna.io);
  4. memo (заметку) - идентификация перевода.

После сохранения настроек ниже формы располагается кнопка "запуск". Нажмите на неё, чтобы начать мониторить балансы.

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

Ссылка

https://denis-skripnik.github.io/local-services/autotransfer.html

Код

  1. meta теги неважны, т.к. они стандартны: кодировка, указание на интерфейс и пр.
  2. title;
  3. <script src="https://unpkg.com/golos-js@latest/dist/golos.min.js"></script> - скрипт библиотеки golos-js;
  4. <script src="https://cdnjs.cloudflare.com/ajax/libs/sjcl/1.0.7/sjcl.min.js" type="text/javascript"></script> - скрипт библиотеки шифрования данных;
  5. Функции скрипта, но о них далее;

body

  1. Форма с полями всеми и заголовок её:
    <h1>Настройки</h1>
    <p>Выполнив их 1 раз в текущем браузере, сохраните.</p>
    <form>
        <p><label for="acc">Аккаунт: 
            <input type="text" name="acc" id="account" value=""></label></p>
        <p><label for="active_key">Активный ключ (не передаётся): 
                <input type="password" name="active_key" id="active" value=""></label></p>
            <p><label for="market">Биржа: 
<select name="market" id="coins_market">
<option value="kunaio">kuna.io</option>
<option value="rudex">Rudex</option></select></label></p>
<p><label for="memo">Заметка (memo) для идентификации биржей: 
    <input type="text" name="memo" id="memo" value=""></label></p>
    <p><button type="button" onclick="sendForm()">Сохранить</button></p>
</form>
  1. Заголовок и кнопка запуска. Она обёрнута в div блок. Он создан, чтобы после запуска заменять кнопку на текст о том, что работает:
<h2>Если вы настроили и обновили страницу после сохранения, ниже будет кнопка запуска</h2>
<div id="run_block"><button type="button" id="start_button" onclick="run()">Запуск</button></div>
  1. Скрипт:
<script>
if (localStorage.getItem('login') && localStorage.getItem('active_key') && localStorage.getItem('market') && localStorage.getItem('market_memo')) { // Проверяем, что в браузере сохранены логин, ключ, биржа и memo
    let acc = localStorage.getItem('login'); // Сохраняет в переменную значения логина из localStorage
    let key = sjcl.decrypt(acc, localStorage.getItem('active_key')); // Сохраняет в переменную расшифрованный активный ключ. sjcl.decrypt как раз это выполняет.
    let select_market = localStorage.getItem('market'); // Получает сохранённый memo
    let memo = localStorage.getItem('market_memo'); // Эта строка и ниже 3 - это вставка полученных настроек в поля для более лёгкого их изменения
    document.getElementById('account').value = acc;
document.getElementById('active').value = key;
document.getElementById('coins_market').value = select_market;
document.getElementById('memo').value = memo;
document.getElementById('start_button').style.display = 'inline'; // Отображение происходит кнопки, если настройки сохранены и страница после их сохранения обновлена
} else { // Скрытие кнопки, если не сохранены настройки.
    document.getElementById('start_button').style.display = 'none';
}
</script>
  1. При отправке формы настроек (кнопка "сохранить") происходит вызов функции sendForm, что в head:
function sendForm() {
let acc = document.getElementById('account').value; // Получаем из поля логина аккаунт пользователя
let active = document.getElementById('active').value; // Получаем активный ключ
let market = document.getElementById('coins_market').value; // Получаем выбранную биржу
let memo = document.getElementById('memo').value; // и заметку
if (acc && active && market && memo) { // если все переменные содержат данные
localStorage.setItem('login', acc); // сохраняем логин
localStorage.setItem('active_key', sjcl.encrypt(acc, active)); // зашифровываем и сохраняем активный ключ
localStorage.setItem('market', market); // биржу
localStorage.setItem('market_memo', memo); // и memo
window.alert('Сохранено. Обновите страницу.'); // уведомление о сохранении.
}
}
  1. Кнопка запуска вызывает функцию run (тоже в head):
function run() {
    if (localStorage.getItem('login') && localStorage.getItem('active_key') && localStorage.getItem('market') && localStorage.getItem('market_memo')) { // Проверяем, что есть всё в localStorage
    let acc = localStorage.getItem('login'); // Сохранение в переменную полученного логина. Ниже также получаем и сохраняем активный ключ, попутно расшифровывая его, биржу и заметку.
    let key = sjcl.decrypt(acc, localStorage.getItem('active_key'));
    let select_market = localStorage.getItem('market');
    let memo = localStorage.getItem('market_memo');
    setInterval(() => check(key, acc, select_market, memo), 3000); // Передаём в функцию check всё полученное, вызываем её каждые 3 секунды.
}
}
  1. Функция check содержит следующий код:
function check(key, acc, select_market, memo) {
    document.getElementById('run_block').innerHTML = '<p>Работает. Для остановки просто закройте или обновите страницу.'; // Заменяем кнопку запуска на текст о том, что работает.
golos.api.getAccounts([acc], function(err, res) { // вызываются данные аккаунта на Голосе
if (!err) { Если нет ошибки
let golos_balance = parseFloat(res[0].balance); // получаем и сохраняем в float баланс GOLOS
golos_balance *= 1000;
golos_balance = parseInt(golos_balance);
golos_balance /= 1000; // Приводим к float с 3 знаками после запятой фиксировано
golos_balance = golos_balance.toFixed(3); // получаем в float баланс GBG
let gbg_balance = parseFloat(res[0].sbd_balance);
console.log(golos_balance, gbg_balance); // выводим в консоль балансы в текущем вызове функции по таймеру.
gbg_balance *= 1000;
gbg_balance = parseInt(gbg_balance);
gbg_balance /= 1000;
gbg_balance = gbg_balance.toFixed(3); // Также приводим к 3 знакам после запятой фиксировано
if (golos_balance > 0 && gbg_balance > 0) { // Проверяем, что все они > 0
    transferTo(key, acc, select_market, golos_balance + ' GOLOS', memo); // Передаём в функцию перевода средств
    transferTo(key, acc, select_market, gbg_balance + ' GBG', memo); // И ещё
} else if (golos_balance > 0) { // Если > 0 только GOLOS
transferTo(key, acc, select_market, golos_balance + ' GOLOS', memo); // вызываем функцию перевода 1 раз: только с указанием баланса в GOLOS
} else if (gbg_balance > 0) { // Если больше нуля только GBG
    transferTo(key, acc, select_market, gbg_balance + ' GBG', memo); // также вызываем функцию отправки GBG.
}
} else { 
window.alert(err); // сообщаем об ошибке
}
});
}
  1. Функция отправки платежа, содержит стандартный код broadcast transfer из доки golos-js:
function transferTo(wif, from, to, amount, memo) {
    golos.broadcast.transfer(wif, from, to, amount, memo, function(err, result) {
  if (!err) {
    window.alert('Отправлено', result);
  }
  else window.alert(err);
});
}

Всё

Напоминаю ссылку: https://denis-skripnik.github.io/local-services/autotransfer.html.

Благодарю за внимание.

С вами был незрячий автор, программист и делегат @denis-skripnik. До встречи в следующих постах.

0
488.501 GOLOS
На Golos с November 2017
Комментарии (6)
Сортировать по:
Сначала старые