Skip to content

Commit

Permalink
app: Add relay fee setting
Browse files Browse the repository at this point in the history
Add a relay fee to settings and allow changing. The fee is not yet used.

Save the relay fee with the account. Allow changing of the relay fee in
Account settings as apposed to App settings. Change relay fee input
field to radio buttons with labels low, default, and high. Set
appropriate values for low (4000) and high (114000).
  • Loading branch information
JoeGruffins committed Apr 17, 2020
1 parent 300906b commit 0c9f14f
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 3 deletions.
6 changes: 5 additions & 1 deletion decred/decred/dcr/account.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from decred import DecredError
from decred.crypto import crypto, opcode
from decred.dcr import addrlib
from decred.dcr.txscript import DefaultRelayFeePerKb
from decred.util import encode, helpers
from decred.util.encode import BuildyBytes, ByteArray, unblobCheck

Expand Down Expand Up @@ -801,6 +802,7 @@ def __init__(
self.coinID = BIPID
self.netID = netID
self.netParams = nets.parse(netID)
self.relayFee = int(DefaultRelayFeePerKb)
# For external addresses, the cursor can sit on the last seen address,
# so start the lastSeen at the 0th external address. This is necessary
# because the currentAddress method grabs the address at the current
Expand Down Expand Up @@ -856,14 +858,15 @@ def blob(acct):
.addData(encode.intToBytes(acct.cursorExt, signed=True))
.addData(acct.cursorInt)
.addData(acct.gapLimit)
.addData(acct.relayFee)
.b
)

@staticmethod
def unblob(b):
"""Satisfies the encode.Blobber API"""
ver, d = encode.decodeBlob(b)
unblobCheck("Account", ver, len(d), {0: 8})
unblobCheck("Account", ver, len(d), {0: 9})

iFunc = encode.intFromBytes

Expand All @@ -876,6 +879,7 @@ def unblob(b):
acct.cursorExt = iFunc(d[5], signed=True)
acct.cursorInt = iFunc(d[6])
acct.gapLimit = iFunc(d[7])
acct.relayFee = iFunc(d[8])
return acct

@staticmethod
Expand Down
75 changes: 73 additions & 2 deletions tinywallet/tinywallet/screens.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
from decred.crypto import crypto
from decred.dcr import constants as DCR, nets
from decred.dcr.blockchain import LocalNode
from decred.dcr.txscript import DefaultRelayFeePerKb
from decred.dcr.vsp import VotingServiceProvider
from decred.util import chains, database, helpers
from decred.wallet.wallet import Wallet
Expand Down Expand Up @@ -475,7 +476,9 @@ def __init__(self, acctMgr, acct, assetScreen):
self.canGoHome = False
self.ticketStats = None
self.balance = None
self.settingsScreen = AccountSettingsScreen(self.saveName)
self.settingsScreen = AccountSettingsScreen(
self.account.relayFee, self.saveName, self.saveRelayFee
)
self.stakeScreen = StakingScreen(acct)
self.wgt.setFixedSize(
TinyDialog.maxWidth * 0.9,
Expand Down Expand Up @@ -716,6 +719,16 @@ def saveName(self, newName):
self.assetScreen.doButtons()
app.home()

def saveRelayFee(self, relayFee):
"""
Changes and saves the relayFee of the account.
Args:
int: The new relayFee.
"""
self.account.relayFee = relayFee
self.acctMgr.saveAccount(self.account.idx)

def stackAndSync(self):
"""
Start syncing the account.
Expand Down Expand Up @@ -1832,7 +1845,7 @@ class AccountSettingsScreen(Screen):
Account settings screen.
"""

def __init__(self, saveName):
def __init__(self, relayFee, saveName, saveRelayFee):
"""
Args:
saveName (function): A callback function to be called after the user
Expand All @@ -1846,6 +1859,7 @@ def __init__(self, saveName):
TinyDialog.maxHeight * 0.9 - TinyDialog.topMenuHeight,
)
self.saveName = saveName
self.saveRelayFee = saveRelayFee

gear = SVGWidget("gear", h=20)
lbl = Q.makeLabel("Account Settings", 22)
Expand All @@ -1869,6 +1883,50 @@ def __init__(self, saveName):
bttn.clicked.connect(self.nameChangeClicked)
grid.addWidget(bttn, row, 1)

# RELAY FEE

# Set string constants.
self.lowStr = "low"
self.defaultStr = "default"
self.highStr = "high"

# Set values that are considered low, default, and high.
self.feeRates = {
self.lowStr: 4000,
self.defaultStr: int(DefaultRelayFeePerKb),
self.highStr: 114000,
}
self.feeLvl = ""

# Find the current level. Warn if the current level isn't one of the
# three.
for k, v in self.feeRates.items():
if v == relayFee:
self.feeLvl = k
break
else:
log.warn(f"non standard relay fee set: {relayFee}")

# Helper to check the current value.
def setChecked(btn):
if self.feeLvl == btn.text():
btn.setChecked(True)

row += 1
grid.addWidget(Q.makeLabel("Relay Fee", 14, Q.ALIGN_LEFT), row, 0)
row += 1
btn1 = QtWidgets.QRadioButton(self.lowStr)
setChecked(btn1)
btn1.toggled.connect(lambda: self.relayFeeChangeClicked(self.lowStr))
btn2 = QtWidgets.QRadioButton(self.defaultStr)
setChecked(btn2)
btn2.toggled.connect(lambda: self.relayFeeChangeClicked(self.defaultStr))
btn3 = QtWidgets.QRadioButton(self.highStr)
setChecked(btn3)
btn3.toggled.connect(lambda: self.relayFeeChangeClicked(self.highStr))
wgt, _ = Q.makeRow(btn1, btn2, btn3)
grid.addWidget(wgt, row, 0, 1, -1)

self.layout.addStretch(1)

def nameChangeClicked(self, e):
Expand All @@ -1882,6 +1940,19 @@ def nameChangeClicked(self, e):
self.nameField.setText("")
self.saveName(newName)

def relayFeeChangeClicked(self, feeLvl, e=None):
"""
Qt slot connected to relay fee radio button clicked signal. Changes the
relay fee to feeLvl.
"""
if self.feeLvl == feeLvl:
return
self.feeLvl = feeLvl
fee = self.feeRates[feeLvl]
self.saveRelayFee(fee)
log.info(f"relay fee changed to {fee} atoms/kb")
app.appWindow.showSuccess(f"using {feeLvl} fees")


class NewAccountScreen(Screen):
"""
Expand Down

0 comments on commit 0c9f14f

Please sign in to comment.