Skip to content

Commit

Permalink
Merge pull request #252 from cryptosharks131/v1.6.0
Browse files Browse the repository at this point in the history
v1.6.0
  • Loading branch information
cryptosharks131 committed Mar 29, 2023
2 parents 5be4020 + cc825fc commit c8f3211
Show file tree
Hide file tree
Showing 38 changed files with 2,784 additions and 1,457 deletions.
43 changes: 30 additions & 13 deletions gui/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,20 +63,37 @@ class Meta:
last_hop_pubkey = forms.CharField(label='funding_txid', max_length=66, required=False)
duration = forms.IntegerField(label='duration')

class AutoRebalanceForm(forms.Form):
chan_id = forms.IntegerField(label='chan_id', required=False)
enabled = forms.IntegerField(label='enabled', required=False)
target_percent = forms.FloatField(label='target_percent', required=False)
target_time = forms.IntegerField(label='target_time', required=False)
fee_rate = forms.IntegerField(label='fee_rate', required=False)
outbound_percent = forms.FloatField(label='outbound_percent', required=False)
inbound_percent = forms.FloatField(label='inbound_percent', required=False)
max_cost = forms.FloatField(label='max_cost', required=False)
variance = forms.IntegerField(label='variance', required=False)
wait_period = forms.IntegerField(label='wait_period', required=False)
autopilot = forms.IntegerField(label='autopilot', required=False)
class AutoRebalanceForm(forms.Form):
enabled = forms.IntegerField(label='enabled', required=False)
target_percent = forms.FloatField(label='target_percent', required=False)
target_time = forms.IntegerField(label='target_time', required=False)
fee_rate = forms.IntegerField(label='fee_rate', required=False)
outbound_percent = forms.FloatField(label='outbound_percent', required=False)
inbound_percent = forms.FloatField(label='inbound_percent', required=False)
max_cost = forms.FloatField(label='max_cost', required=False)
variance = forms.IntegerField(label='variance', required=False)
wait_period = forms.IntegerField(label='wait_period', required=False)
autopilot = forms.IntegerField(label='autopilot', required=False)
autopilotdays = forms.IntegerField(label='autopilotdays', required=False)
targetallchannels = forms.BooleanField(widget=forms.CheckboxSelectMultiple, required=False)
workers = forms.IntegerField(label='workers', required=False)
update_channels = forms.BooleanField(widget=forms.CheckboxSelectMultiple, required=False)

class AutoFeesForm(AutoRebalanceForm):
af_enabled = forms.IntegerField(label='af_enabled', required=False)
af_maxRate = forms.IntegerField(label='af_maxRate', required=False)
af_minRate = forms.IntegerField(label='af_minRate', required=False)
af_increment = forms.IntegerField(label='af_increment', required=False)
af_multiplier = forms.IntegerField(label='af_multiplier', required=False)
af_failedHTLCs = forms.IntegerField(label='af_failedHTLCs', required=False)
af_updateHours = forms.IntegerField(label='af_updateHours', required=False)

class GUIForm(AutoFeesForm):
gui_graphLinks = forms.CharField(label='gui_graphLinks', required=False)
gui_netLinks = forms.CharField(label='gui_netLinks', required=False)

class LocalSettingsForm(GUIForm):
lnd_cleanPayments = forms.IntegerField(label='lnd_cleanPayments', required=False)
lnd_retentionDays = forms.IntegerField(label='lnd_retentionDays', required=False)

updates_channel_codes = [
(0, 'base_fee'),
Expand Down
158 changes: 158 additions & 0 deletions gui/lnd_deps/walletkit_pb2.py

Large diffs are not rendered by default.

1,082 changes: 1,082 additions & 0 deletions gui/lnd_deps/walletkit_pb2_grpc.py

Large diffs are not rendered by default.

36 changes: 36 additions & 0 deletions gui/migrations/0035_histfailedhtlc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Generated by Django 3.2.7 on 2023-03-03 01:15

from django.db import migrations, models
import django.utils.timezone


class Migration(migrations.Migration):

dependencies = [
('gui', '0034_peerevents'),
]

operations = [
migrations.CreateModel(
name='HistFailedHTLC',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('date', models.DateField(default=django.utils.timezone.now)),
('chan_id_in', models.CharField(max_length=20)),
('chan_id_out', models.CharField(max_length=20)),
('chan_in_alias', models.CharField(max_length=32, null=True)),
('chan_out_alias', models.CharField(max_length=32, null=True)),
('htlc_count', models.IntegerField()),
('amount_sum', models.BigIntegerField()),
('fee_sum', models.BigIntegerField()),
('liq_avg', models.BigIntegerField()),
('pending_avg', models.BigIntegerField()),
('balance_count', models.IntegerField()),
('downstream_count', models.IntegerField()),
('other_count', models.IntegerField()),
],
options={
'unique_together': {('date', 'chan_id_in', 'chan_id_out')},
},
),
]
20 changes: 19 additions & 1 deletion gui/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -303,4 +303,22 @@ class PeerEvents(models.Model):
new_value = models.BigIntegerField()
out_liq = models.BigIntegerField()
class Meta:
app_label = 'gui'
app_label = 'gui'

class HistFailedHTLC(models.Model):
date = models.DateField(default=timezone.now)
chan_id_in = models.CharField(max_length=20)
chan_id_out = models.CharField(max_length=20)
chan_in_alias = models.CharField(null=True, max_length=32)
chan_out_alias = models.CharField(null=True, max_length=32)
htlc_count = models.IntegerField()
amount_sum = models.BigIntegerField()
fee_sum = models.BigIntegerField()
liq_avg = models.BigIntegerField()
pending_avg = models.BigIntegerField()
balance_count = models.IntegerField()
downstream_count = models.IntegerField()
other_count = models.IntegerField()
class Meta:
app_label = 'gui'
unique_together = (('date', 'chan_id_in', 'chan_id_out'),)
9 changes: 8 additions & 1 deletion gui/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,8 @@ class RebalancerSerializer(serializers.HyperlinkedModelSerializer):
requested = serializers.ReadOnlyField()
start = serializers.ReadOnlyField()
stop = serializers.ReadOnlyField()
status = serializers.ReadOnlyField()
fees_paid = serializers.ReadOnlyField()
payment_hash = serializers.ReadOnlyField()
class Meta:
model = Rebalancer
exclude = []
Expand All @@ -103,6 +104,12 @@ class CloseChannelSerializer(serializers.Serializer):
target_fee = serializers.IntegerField(label='target_fee')
force = serializers.BooleanField(default=False)

class BumpFeeSerializer(serializers.Serializer):
txid = serializers.CharField(label='txid')
index = serializers.IntegerField(label='index')
target_fee = serializers.IntegerField(label='target_fee')
force = serializers.BooleanField(default=False)

class AddInvoiceSerializer(serializers.Serializer):
value = serializers.IntegerField(label='value')

Expand Down
119 changes: 119 additions & 0 deletions gui/static/api.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
async function GET(url, {method = 'GET', data = null}){
if(!data.limit) data.limit = 100000
if(!data.format) data.format = 'json'
return call({url, method, data})
}

async function POST(url, {method = 'POST', body}){
return call({url, method, body})
}

async function PUT(url, {method = 'PUT', body}){
return call({url, method, body})
}

async function PATCH(url, {method = 'PATCH', body}){
return call({url, method, body})
}

async function DELETE(url, {method = 'DELETE'}){
return call({url, method})
}

async function call({url, method, data, body, headers = {'Content-Type':'application/json'}}){
if(url.charAt(url.length-1) != '/') url += '/'
if(method != 'GET') headers['X-CSRFToken'] = document.getElementById('api').dataset.token
const result = await fetch(`api/${url}${data ? '?': ''}${new URLSearchParams(data).toString()}`, {method, body: JSON.stringify(body), headers})
return result.json()
}

class Sync{
static PUT(url, {method = 'PUT', body}, callback){
call({url, method, body}).then(res => callback(res))
}
}

function showBannerMsg(h1Msg, result){
document.getElementById('content').insertAdjacentHTML("beforebegin", `<div style="top:5px" class="w3-panel w3-orange w3-display-container"><span onclick="this.parentElement.style.display='none'" class="w3-button w3-hover-red w3-display-topright">X</span><h1 style="word-wrap: break-word">${h1Msg} updated to: ${result}</h1></div>`);
window.scrollTo(0, 0);
}

function flash(element, response){
if (response != element.value) {
element.value = response
return
}
var rgb = window.getComputedStyle(element).backgroundColor;
rgb = rgb.substring(4, rgb.length-1).replace(/ /g, '').split(',');
var r = rgb[0], g = rgb[1], bOrigin = rgb[2], b = bOrigin;
var add = false;
var complete = false;
const increment = 15;
var flashOn = setInterval(() => {
if(add){
if(b < 255 && (b+increment) <= 255){
b += increment;
}else{
add = false;
complete = true;
}
}else{
if(complete == true && b < bOrigin){
b = bOrigin;
clearInterval(flashOn);
}
else if(b > 0 && (b-increment) >= 0){
b -= increment;
}else{
add = true;
}
}
element.style.backgroundColor = 'RGB('+r+','+g+','+b+')';
if(b == bOrigin) element.style.removeProperty("background-color");
}, 50);
}

function formatDate(start, end = new Date().getTime() + new Date().getTimezoneOffset()*60000){
if (end == null) return '---'
end = new Date(end)
if (start == null) return '---'
difference = (end - new Date(start))/1000
if (difference < 0) return 'Just now'
if (difference < 60) {
if (Math.floor(difference) == 1){
return `a second ago`;
}else{
return `${Math.floor(difference)} seconds ago`;
}
} else if (difference < 3600) {
if (Math.floor(difference / 60) == 1){
return `a minute ago`;
}else{
return `${Math.floor(difference / 60)} minutes ago`;
}
} else if (difference < 86400) {
if (Math.floor(difference / 3600) == 1){
return `an hour ago`;
}else{
return `${Math.floor(difference / 3600)} hours ago`;
}
} else if (difference < 2620800) {
if (Math.floor(difference / 86400) == 1){
return `a day ago`;
}else{
return `${Math.floor(difference / 86400)} days ago`;
}
} else if (difference < 31449600) {
if (Math.floor(difference / 2620800) == 1){
return `a month ago`;
}else{
return `${Math.floor(difference / 2620800)} months ago`;
}
} else {
if (Math.floor(difference / 31449600) == 1){
return `a year ago`;
}else{
return `${Math.floor(difference / 31449600)} years ago`;
}
}
}
32 changes: 8 additions & 24 deletions gui/static/dark_mode.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,31 +11,15 @@ function getCookie(cname) {
}
}
return "";
}
function applyTheme(){
if(getCookie("darkmode") == "true"){
toggleTheme();
}

function darkMode() {
let darkmode = getCookie("darkmode");
if (darkmode != "") {
if (darkmode == "true") {
document.cookie = "darkmode=false";
} else {
document.cookie = "darkmode=true";
}
} else {
document.cookie = "darkmode=true";
}
var element = document.body;
element.classList.toggle("dark-mode");
element.classList.toggle("dark-mode-table1");
element.classList.toggle("dark-mode-table2");
}

function checkDarkMode() {
let darkmode = getCookie("darkmode");
if (darkmode == "true") {
var element = document.body;
element.classList.toggle("dark-mode");
element.classList.toggle("dark-mode-table1");
element.classList.toggle("dark-mode-table2");
}
function toggleTheme() {
var element = document.body;
element.classList.toggle("dark-mode")
document.cookie = `darkmode=${element.classList.contains("dark-mode")}`
}
1 change: 1 addition & 0 deletions gui/static/qrcode.js

Large diffs are not rendered by default.

34 changes: 16 additions & 18 deletions gui/static/sort_table.js
Original file line number Diff line number Diff line change
@@ -1,35 +1,33 @@
function sortTable(n, type, tableName, skip=0, link=false) {
var table, rows, switching, i, x, y, shouldSwitch, dir, switchcount = 0;
function sortTable(header, n, type, skip=0, tag="td") {
var switching, i, curr_row, next_row, shouldSwitch, dir, switchcount = 0;
var upArrow = " ▲", downArrow = " ▼";
table = document.getElementById(tableName);
header = table.rows[0+skip].getElementsByTagName("TH")[n];
var table = header.parentElement.parentElement.parentElement; //th.tr.tbody.table
var rows = table.rows;

switching = true;
dir = "asc";
while (switching) {
switching = false;
rows = table.rows;
for (i=1+skip; i<(rows.length-1); i++) {
shouldSwitch = false;
if (link == true) {
x = rows[i].getElementsByTagName("A")[n];
y = rows[i+1].getElementsByTagName("A")[n];
} else {
x = rows[i].getElementsByTagName("TD")[n];
y = rows[i+1].getElementsByTagName("TD")[n];
}
curr_row = rows[i].children[n]
next_row = rows[i+1].children[n]
if(tag !== "td"){
curr_row = curr_row.getElementsByTagName(tag)[0];
next_row = next_row.getElementsByTagName(tag)[0];
}
if (dir == "asc") {
if (type == "String" && x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()
|| type == "int" && parseInt(x.innerHTML.replace(/,/g, '')) > parseInt(y.innerHTML.replace(/,/g, ''))
|| type != "String" && type != "int" && Number(x.innerHTML.toLowerCase().split(type)[0].replace(/,/g, '')) > Number(y.innerHTML.toLowerCase().split(type)[0].replace(/,/g, '')))
if (type == "String" && curr_row.innerHTML.toLowerCase() > next_row.innerHTML.toLowerCase()
|| type == "int" && parseInt(curr_row.innerHTML.replace(/,/g, '')) > parseInt(next_row.innerHTML.replace(/,/g, ''))
|| type != "String" && type != "int" && Number(curr_row.innerHTML.toLowerCase().split(type)[0].replace(/,/g, '')) > Number(next_row.innerHTML.toLowerCase().split(type)[0].replace(/,/g, '')))
{
shouldSwitch = true;
break;
}
} else if (dir == "desc") {
if (type == "String" && x.innerHTML.toLowerCase() < y.innerHTML.toLowerCase()
|| type == "int" && parseInt(x.innerHTML.replace(/,/g, '')) < parseInt(y.innerHTML.replace(/,/g, ''))
|| type != "String" && type != "int" && Number(x.innerHTML.toLowerCase().split(type)[0].replace(/,/g, '')) < Number(y.innerHTML.toLowerCase().split(type)[0].replace(/,/g, '')))
if (type == "String" && curr_row.innerHTML.toLowerCase() < next_row.innerHTML.toLowerCase()
|| type == "int" && parseInt(curr_row.innerHTML.replace(/,/g, '')) < parseInt(next_row.innerHTML.replace(/,/g, ''))
|| type != "String" && type != "int" && Number(curr_row.innerHTML.toLowerCase().split(type)[0].replace(/,/g, '')) < Number(next_row.innerHTML.toLowerCase().split(type)[0].replace(/,/g, '')))
{
shouldSwitch = true;
break;
Expand Down
Loading

0 comments on commit c8f3211

Please sign in to comment.