From 734b7b3d60edb5a04082bc0bd0c320edaa71b68a Mon Sep 17 00:00:00 2001 From: denis-skripnik Date: Tue, 12 Jan 2021 15:29:38 +0700 Subject: [PATCH] Add steem/swap, add orders in steem/profiles, update menu --- blockchains/steem/apps/profiles/index.php | 13 +- .../steem/apps/profiles/page/orders.php | 87 +++++++ blockchains/steem/apps/swap/config.json | 6 + blockchains/steem/apps/swap/content.php | 32 +++ blockchains/steem/apps/swap/index.php | 2 + blockchains/steem/apps/swap/js/app.js | 220 ++++++++++++++++++ menu.json | 2 +- 7 files changed, 360 insertions(+), 2 deletions(-) create mode 100644 blockchains/steem/apps/profiles/page/orders.php create mode 100644 blockchains/steem/apps/swap/config.json create mode 100644 blockchains/steem/apps/swap/content.php create mode 100644 blockchains/steem/apps/swap/index.php create mode 100644 blockchains/steem/apps/swap/js/app.js diff --git a/blockchains/steem/apps/profiles/index.php b/blockchains/steem/apps/profiles/index.php index 7c096779..1e590293 100644 --- a/blockchains/steem/apps/profiles/index.php +++ b/blockchains/steem/apps/profiles/index.php @@ -23,6 +23,7 @@ function generateAppPages($blockchain_snippet) { Посты подписчиков Комментарии Делегат +Ордера '; if (!isset(pageUrl()[3])) { $data['title'] .= ' - основное'; @@ -163,8 +164,18 @@ function generateAppPages($blockchain_snippet) { $data['content'] .= $blockchain_snippet; $data['content'] .= $pages; $data['content'] .= require_once(__DIR__.'/page/feed.php'); +} else if (isset(pageUrl()[3]) && pageUrl()[3] == 'orders') { + $data['title'] .= ' - ордера на dex'; + $data['description'] .= ' - ордера на dex'; + $data['content'] = ''; + $data['content'] .= $blockchain_snippet; + $data['content'] .= $pages; +$data['content'] .= require_once(__DIR__.'/page/orders.php'); } - } return $data; } diff --git a/blockchains/steem/apps/profiles/page/orders.php b/blockchains/steem/apps/profiles/page/orders.php new file mode 100644 index 00000000..a00df310 --- /dev/null +++ b/blockchains/steem/apps/profiles/page/orders.php @@ -0,0 +1,87 @@ + ['fill_order']]); + +$mass = $res['result']; + + if (! $mass) { + $result['content'] = '

Результатов нет. Возможно все подходящие операции в истории далеко или такого пользователя не существует. Проверьте правильность написания логина. Сейчас введён: '.$user.'

'; + if (isset($_REQUEST['options']) || isset($_GET['options'])) { + echo json_encode($result); + return; + } else { + return $result['content']; + } + } + + krsort($mass); + + $result['content'] = '

Ордера на внутренней бирже, связанные с пользователем '.$user.'

+ + + + + + +'; + foreach ($mass as $datas) { + if ($rowCount === AUTHOR_REWARDS_LIMIT) { + break; + } + $startWith = $datas[0] - 1; + + + $op = $datas[1]['op']; + $month = array('01' => 'января', '02' => 'февраля', '03' => 'марта', '04' => 'апреля', '05' => 'мая', '06' => 'июня', '07' => 'июля', '08' => 'августа', '09' => 'сентября', '10' => 'октября', '11' => 'ноября', '12' => 'декабря'); + $timestamp1 = $datas[1]['timestamp']; + $timestamp2 = strtotime($timestamp1); + $month2 = date('m', $timestamp2); + $timestamp = date('j', $timestamp2).' '.$month[$month2].' '.date('Y г. H:i:s', $timestamp2); + $timestamp = ''.$timestamp.''; + $op1 = $op[1]; + if ($op[0] == 'fill_order') { + $rowCount++; + $seller = $op[1]['current_owner'] ?? ""; + $buyer = $op[1]['open_owner'] ?? ""; + $sell_amount = $op[1]['current_pays'] ?? ""; + $buy_amount = $op[1]['open_pays']; + $result['content'] .= ' + + + + '; + } + } + + $result['content'] .= '
Дата и времяпродавецпокупательсумма на продажуСумма на покупку
' . $timestamp . ''.$seller.''.$buyer.''.$sell_amount.''.$buy_amount.'

'; + + $result['nextIsExists'] = $startWith !== ''; + if ($result['nextIsExists']) { + $result['next'] = $startWith; + } + $result['content'] .= '
'; + if (isset($_REQUEST['options']) || isset($_GET['options'])) { + echo json_encode($result); + } else { + return $result['content']; + } \ No newline at end of file diff --git a/blockchains/steem/apps/swap/config.json b/blockchains/steem/apps/swap/config.json new file mode 100644 index 00000000..8bb71d00 --- /dev/null +++ b/blockchains/steem/apps/swap/config.json @@ -0,0 +1,6 @@ +{ +"title": "Dpos.space Steem swap", +"description": "Dpos.space Steem swap - сервис по обмену STEEM и SBD.", +"in_menu": "Swap", +"category": "tools" +} \ No newline at end of file diff --git a/blockchains/steem/apps/swap/content.php b/blockchains/steem/apps/swap/content.php new file mode 100644 index 00000000..894a5e2d --- /dev/null +++ b/blockchains/steem/apps/swap/content.php @@ -0,0 +1,32 @@ +

Для обмена необходим активный ключ. Укажите его на странице аккаунтов. Если вы авторизованы, удалите аккаунт и добавьте с активным ключом; Если нет, авторизуйтесь с указанием обоих ключей.

+
+

Обменять

+

Отображаются только токены с ненулевым балансом, т.к. если у вас 0, нечего обменивать.

+
+
+ +

+

Покупаем

+

+
+

Курс:

+

+
+

Открытые ордера

+ + + + + + + + +
Дата созданияСумма продажиСумма покупкиКурсДействие
+

История обменов

+
'; ?> \ No newline at end of file diff --git a/blockchains/steem/apps/swap/index.php b/blockchains/steem/apps/swap/index.php new file mode 100644 index 00000000..207e8122 --- /dev/null +++ b/blockchains/steem/apps/swap/index.php @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/blockchains/steem/apps/swap/js/app.js b/blockchains/steem/apps/swap/js/app.js new file mode 100644 index 00000000..fa7d5a50 --- /dev/null +++ b/blockchains/steem/apps/swap/js/app.js @@ -0,0 +1,220 @@ +Number.prototype.toFixedNoRounding = function(n) { + const reg = new RegExp(`^-?\\d+(?:\\.\\d{0,${n}})?`, 'g') + const a = this.toString().match(reg)[0]; + const dot = a.indexOf('.'); + + if (dot === -1) { + return a + '.' + '0'.repeat(n); + } + + const b = n - (a.length - dot) + 1; + + return b > 0 ? (a + '0'.repeat(b)) : a; + } + + async function deleteOrder(orderid) { + let q = window.confirm('Вы действительно хотите удалить этот ордер?'); + if (q == true) { + try { + await steem.broadcast.limitOrderCancelAsync(active_key, steem_login, orderid); + window.alert('Ордер удалён.'); + await myOrders(); + await getSelectedToken(); + } catch(e) { + console.log(e); + } + } + } + + function fast_str_replace(search,replace,str){ + return str.split(search).join(replace); + } + + function date_str(timestamp,add_time,add_seconds,remove_today=false){ + if(-1==timestamp){ + var d=new Date(); + } + else{ + var d=new Date(timestamp); + } + var day=d.getDate(); + if(day<10){ + day='0'+day; + } + var month=d.getMonth()+1; + if(month<10){ + month='0'+month; + } + var minutes=d.getMinutes(); + if(minutes<10){ + minutes='0'+minutes; + } + var hours=d.getHours(); + if(hours<10){ + hours='0'+hours; + } + var seconds=d.getSeconds(); + if(seconds<10){ + seconds='0'+seconds; + } + var datetime_str=day+'.'+month+'.'+d.getFullYear(); + if(add_time){ + datetime_str=datetime_str+' '+hours+':'+minutes; + if(add_seconds){ + datetime_str=datetime_str+':'+seconds; + } + } + if(remove_today){ + datetime_str=fast_str_replace(date_str(-1)+' ','',datetime_str); + } + return datetime_str; + } + + async function myOrders() { + $('#my_orders_list').css('display', 'block'); + let sell_token = $('#sell_token').val(); + let buy_token = $('#buy_token').html(); + try { +let orders = await steem.api.getOpenOrdersAsync(steem_login); +const timezoneOffset = (new Date()).getTimezoneOffset() * 60000; + let table = ''; + for (let order of orders) { + let sell_price = order.sell_price; + let get_time = Date.parse(order.created); + + table += ` + ${date_str(get_time - timezoneOffset, true, false, true)} + ${sell_price.base} + ${sell_price.quote} + ${parseFloat(order.real_price).toFixed(5)} ${buy_token} / ${sell_token} + Удалить + `; + } + $('#my_orders_list').html(table); + } catch(e) { + console.log('Ошибка: ' + e); + } + } + +async function creationOrder(sell_amount, selected_sell_token, selected_buy_token) { + $('#buy_amount').val(''); + $('#market_price').html(''); + $('#action_buy_token').attr('disabled', true); + + let get_orders = await steem.api.getOrderBookAsync(100); + let orders = get_orders.bids; + if (selected_sell_token === 'SBD') { + orders = get_orders.asks; + } + if (orders.length > 0) { + let asset1_counter = 0; + let price_counter = 0; + let orders_counter = 0; + for (let order of orders) { + orders_counter++; + asset1_counter += parseFloat(order[selected_sell_token.toLowerCase()]) / (10 ** 3); + price_counter += parseFloat(order.real_price); + if (asset1_counter >= sell_amount) { + break; + } +} +if (asset1_counter < sell_amount) { +window.alert(`Сумма продажи больше имеющейся на рынке ${asset1_counter.toFixedNoRounding(3)} ${selected_buy_token}. Попробуйте позже или измените цену продажи на меньшую.`); +$('#action_buy_token').attr('disabled', true); +} else { + $('#action_buy_token').attr('disabled', false); + let price = price_counter / orders_counter; + price = price.toFixedNoRounding(8); + price = parseFloat(price); + let buy_amount = sell_amount * price; + if (selected_sell_token === 'SBD') { + buy_amount = sell_amount / price; + } + if (buy_amount && parseFloat(buy_amount.toFixedNoRounding(3)) === 0) $('#action_buy_token').attr('disabled', true); // Либо добавить атрибут disabled window.alert(buu) + $('#buy_amount').val(buy_amount.toFixedNoRounding(3)); + $('#market_price').html(`${price.toFixed(5)} ${selected_buy_token} / ${selected_sell_token}`); + } + } else { + window.alert(`Ордеров на покупку ${selected_sell_token} за ${selected_buy_token} нет.`); + } +} + +async function getSelectedToken() { +let accounts = await steem.api.getAccountsAsync([steem_login]); +if (accounts && accounts.length > 0) { + let acc = accounts[0]; + let selected = $('#sell_token').val(); + if (selected === 'STEEM') { + $('#max_amount').html(parseFloat(acc.balance)); + $('#buy_token').html('SBD'); + } else { + $('#max_amount').html(parseFloat(acc.sbd_balance)); + $('#buy_token').html('STEEM'); + } +} +} + +$(document).ready(async function() { + $('#orders_history').attr('href', `https://dpos.space/steem/profiles/${steem_login}/orders`); + $('#action_buy_token').attr('disabled', true); // Либо добавить атрибут disabled + +await getSelectedToken(); +await myOrders(); + +$('#sell_token').change(async function() { + await getSelectedToken(); +await myOrders(); +}); + +$('#max_amount').click(async function() { + let max_amount = $('#max_amount').html(); + $('#sell_amount').val(max_amount); + await creationOrder(max_amount, $('#sell_token').val(), $('#buy_token').html()); +}); + +$('#sell_amount').change(async function() { + await creationOrder($('#sell_amount').val(), $('#sell_token').val(), $('#buy_token').html()); +}); + +$('#action_buy_token').click(async function() { + let selected_sell_token = $('#sell_token').val(); + let selected_buy_token = $('#buy_token').html(); + let sell_amount = parseFloat($('#sell_amount').val()); + let buy_amount = parseFloat($('#buy_amount').val()); + let q = window.confirm('Вы действительно хотите совершить обмен?'); + if (q == true) { + let orderid = Math.floor(Date.now() / 1000); // it is steemit.com way and it is preferred + let expiration = new Date(); + expiration.setHours(expiration.getHours() + 24); + expiration = expiration.toISOString().substr(0, 19); // i.e. 2020-09-07T11:33:00 + let moment_swap = JSON.parse($('#change_mode').attr('data-mode')); + try { + let res = await steem.broadcast.limitOrderCreateAsync(active_key, steem_login, orderid, sell_amount.toFixedNoRounding(3) + ' ' + selected_sell_token, buy_amount.toFixedNoRounding(3) + ' ' + selected_buy_token, moment_swap, expiration); +if (res) { +if (moment_swap === true) { + window.alert('Обмен произведён'); +} else { + window.alert('Ордер успешно создан.'); +await myOrders(); +} +location.reload(); +} +} catch(e) { + window.alert(e); + } + } +}); + +$('#change_mode').on('click', function() { + let moment_swap = $('#change_mode').attr('data-mode'); + if (moment_swap === 'true') { + $('#change_mode').attr('data-mode', `false`); + $('#change_mode').html('Моментальный обмен'); + $('#buy_amount').attr('readonly', false); +} else { + $('#change_mode').attr('data-mode', `true`); + $('#change_mode').html('Создать произвольный ордер'); + $('#buy_amount').attr('readonly', true); +} +}); +}); // end document ready function. \ No newline at end of file diff --git a/menu.json b/menu.json index e1031f85..6071b26f 100644 --- a/menu.json +++ b/menu.json @@ -1 +1 @@ -{"viz":{"name":"Viz","services":{"no_category":{"name":"","accounts":"Аккаунты","profiles":"Профили","projects":"Проекты","wallet":"Кошелёк"},"tools":{"name":"Инструменты","awards":"Награждение","calc":"Калькулятор","custom-generator":"JSON-генератор","randomblockchain":"ГСЧ","search":"Viz-links","exchange":"Обмен","manage":"Управление","polls":"Опросы"},"reytings":{"name":"Рейтинги","top":"Пользователи","witnesses-rewards":"Делегаты"},"info":{"name":"Информация","explorer":"Explorer","buy":"Купить VIZ","help":"Справка"}}},"golos":{"name":"Golos","services":{"reytings":{"name":"Рейтинги","activities":"Активность","donates":"Донаты","referrers":"Рефереры","top":"Пользователи","witnesses-rewards":"Делегаты"},"tools":{"name":"Инструменты","backup":"Бекап постов","calc":"Калькулятор","polls":"Опросы","randomblockchain":"ГСЧ","swap":"Swap","post":"Редактор","manage":"Управление"},"games":{"name":"Игры","stakebot":"Stake_bot"},"no_category":{"name":"","accounts":"Аккаунты","profiles":"Профили","wallet":"кошелёк","explorer":"Explorer","help":"Справка"}}},"steem":{"name":"Steem","services":{"no_category":{"name":"","accounts":"Аккаунты","wallet":"Кошелёк","profiles":"Профили","post":"Редактор","manage":"Управление"},"tools":{"name":"Инструменты","randomblockchain":"ГСЧ","calc":"Калькулятор","backup":"Бекап постов"}}},"hive":{"name":"Hive","services":{"tools":{"name":"Инструменты","calc":"Калькулятор","randomblockchain":"ГСЧ","backup":"Бекап постов"},"no_category":{"name":"","profiles":"Профили","accounts":"Аккаунты","wallet":"Кошелёк","post":"Редактор","manage":"Управление"}}},"minter":{"name":"Minter","services":{"no_category":{"name":"","randomblockchain":"ГСЧ","profiles":"Профили"}}},"cyber":{"name":"Cyber","services":{"no_category":{"name":"","profiles":"Профили","wallet":"Кошелёк","validators":"Валидаторы","explorer":"Explorer","accounts":"Аккаунты"},"tools":{"name":"Инструменты","linker":"Линкер","randomblockchain":"ГСЧ","ipfs":"IPFS"}}}} \ No newline at end of file +{"viz":{"name":"Viz","services":{"no_category":{"name":"","accounts":"Аккаунты","profiles":"Профили","projects":"Проекты","wallet":"Кошелёк"},"tools":{"name":"Инструменты","awards":"Награждение","calc":"Калькулятор","custom-generator":"JSON-генератор","randomblockchain":"ГСЧ","search":"Viz-links","exchange":"Обмен","manage":"Управление","polls":"Опросы"},"reytings":{"name":"Рейтинги","top":"Пользователи","witnesses-rewards":"Делегаты"},"info":{"name":"Информация","explorer":"Explorer","buy":"Купить VIZ","help":"Справка"}}},"golos":{"name":"Golos","services":{"reytings":{"name":"Рейтинги","activities":"Активность","donates":"Донаты","referrers":"Рефереры","top":"Пользователи","witnesses-rewards":"Делегаты"},"tools":{"name":"Инструменты","backup":"Бекап постов","calc":"Калькулятор","polls":"Опросы","randomblockchain":"ГСЧ","swap":"Swap","post":"Редактор","manage":"Управление"},"games":{"name":"Игры","stakebot":"Stake_bot"},"no_category":{"name":"","accounts":"Аккаунты","profiles":"Профили","wallet":"кошелёк","explorer":"Explorer","help":"Справка"}}},"steem":{"name":"Steem","services":{"no_category":{"name":"","accounts":"Аккаунты","wallet":"Кошелёк","profiles":"Профили","post":"Редактор","manage":"Управление"},"tools":{"name":"Инструменты","randomblockchain":"ГСЧ","calc":"Калькулятор","backup":"Бекап постов","swap":"Swap"}}},"hive":{"name":"Hive","services":{"tools":{"name":"Инструменты","calc":"Калькулятор","randomblockchain":"ГСЧ","backup":"Бекап постов"},"no_category":{"name":"","profiles":"Профили","accounts":"Аккаунты","wallet":"Кошелёк","post":"Редактор","manage":"Управление"}}},"minter":{"name":"Minter","services":{"no_category":{"name":"","randomblockchain":"ГСЧ","profiles":"Профили"}}},"cyber":{"name":"Cyber","services":{"no_category":{"name":"","profiles":"Профили","wallet":"Кошелёк","validators":"Валидаторы","explorer":"Explorer","accounts":"Аккаунты"},"tools":{"name":"Инструменты","linker":"Линкер","randomblockchain":"ГСЧ","ipfs":"IPFS"}}}} \ No newline at end of file