denis-skripnik
5 лет назадКод сервиса отправки всех токенов на биржу
Здравствуйте. В одном из предыдущих постов я рассказывал о том, что хочу создать страницу локальную, чтоб можно было выводить GOLOS И GBG на биржи, не заходя на Голос.
Внимание
Обращайте внимание на то, можно ли отправлять с одним и тем же memo, сами.
** Проверяйте memo перед отправкой, обновив страницу.**
Что запрашивает:
- Логин
- Активный ключ (Сохраняется в браузере в зашифрованном виде, никуда не отправляется);
- Выбор биржи (rudex или kuna.io);
- memo (заметку) - идентификация перевода.
После сохранения настроек ниже формы располагается кнопка "запуск". Нажмите на неё, чтобы начать мониторить балансы.
Теперь достаточно будет открывать страницу, запускать и заниматься своими делами: как в кошельке появятся токены, будут отправлены на выбранную биржу.
Ссылка
https://denis-skripnik.github.io/local-services/autotransfer.html
Код
head
- meta теги неважны, т.к. они стандартны: кодировка, указание на интерфейс и пр.
- title;
<script src="https://unpkg.com/golos-js@latest/dist/golos.min.js"></script>
- скрипт библиотеки golos-js;<script src="https://cdnjs.cloudflare.com/ajax/libs/sjcl/1.0.7/sjcl.min.js" type="text/javascript"></script>
- скрипт библиотеки шифрования данных;- Функции скрипта, но о них далее;
body
- Форма с полями всеми и заголовок её:
<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>
- Заголовок и кнопка запуска. Она обёрнута в div блок. Он создан, чтобы после запуска заменять кнопку на текст о том, что работает:
<h2>Если вы настроили и обновили страницу после сохранения, ниже будет кнопка запуска</h2>
<div id="run_block"><button type="button" id="start_button" onclick="run()">Запуск</button></div>
- Скрипт:
<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>
- При отправке формы настроек (кнопка "сохранить") происходит вызов функции 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('Сохранено. Обновите страницу.'); // уведомление о сохранении.
}
}
- Кнопка запуска вызывает функцию 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 секунды.
}
}
- Функция 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); // сообщаем об ошибке
}
});
}
- Функция отправки платежа, содержит стандартный код 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. До встречи в следующих постах.