diff --git a/configure.ac b/configure.ac
index b5893eedaa73..2ec7bcc2d84d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2,8 +2,8 @@ dnl require autoconf 2.60 (AS_ECHO/AS_ECHO_N)
AC_PREREQ([2.60])
define(_CLIENT_VERSION_MAJOR, 0)
define(_CLIENT_VERSION_MINOR, 12)
-define(_CLIENT_VERSION_REVISION, 0)
-define(_CLIENT_VERSION_BUILD, 55)
+define(_CLIENT_VERSION_REVISION, 1)
+define(_CLIENT_VERSION_BUILD, 0)
define(_CLIENT_VERSION_IS_RELEASE, true)
define(_COPYRIGHT_YEAR, 2015)
AC_INIT([Dash Core],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[info@dashpay.io],[dash])
diff --git a/contrib/linearize/README.md b/contrib/linearize/README.md
index 157586e4d4e0..84a415154ccf 100644
--- a/contrib/linearize/README.md
+++ b/contrib/linearize/README.md
@@ -1,6 +1,10 @@
# Linearize
Construct a linear, no-fork, best version of the blockchain.
+## Step 0: Install dash_hash
+
+https://github.com/dashpay/dash_hash
+
## Step 1: Download hash list
$ ./linearize-hashes.py linearize.cfg > hashlist.txt
@@ -20,13 +24,12 @@ Required configuration file settings:
* "input": bitcoind blocks/ directory containing blkNNNNN.dat
* "hashlist": text file containing list of block hashes, linearized-hashes.py
output.
-* "output_file": bootstrap.dat
- or
-* "output": output directory for linearized blocks/blkNNNNN.dat output
+* "output_file" for bootstrap.dat or "output" for output directory for linearized blocks/blkNNNNN.dat output
Optional config file setting for linearize-data:
-* "netmagic": network magic number
-* "max_out_sz": maximum output file size (default 1000*1000*1000)
+* "netmagic": network magic number (default is 'cee2caff', testnet)
+* "genesis": genesis block hash (default is '00000bafbc94add76cb75e2ec92894837288a481e5c005f6563d91623bf8bc2c', testnet)
+* "max_out_sz": maximum output file size (default 100 \* 1000 \* 1000)
* "split_timestamp": Split files when a new month is first seen, in addition to
reaching a maximum file size.
* "file_timestamp": Set each file's last-modified time to that of the
diff --git a/contrib/linearize/example-linearize-testnet.cfg b/contrib/linearize/example-linearize-testnet.cfg
new file mode 100644
index 000000000000..3cd7035d15be
--- /dev/null
+++ b/contrib/linearize/example-linearize-testnet.cfg
@@ -0,0 +1,20 @@
+
+# bitcoind RPC settings (linearize-hashes)
+rpcuser=someuser
+rpcpassword=somepassword
+host=127.0.0.1
+port=19998
+
+# bootstrap.dat hashlist settings (linearize-hashes)
+max_height=3130000
+
+# bootstrap.dat input/output settings (linearize-data)
+netmagic=cee2caff
+input=/home/example/.dash/testnet3/blocks
+output_file=/home/example/Downloads/bootstrap.dat
+hashlist=hashlist.txt
+split_year=1
+genesis=00000bafbc94add76cb75e2ec92894837288a481e5c005f6563d91623bf8bc2c
+
+# Maxmimum size in bytes of out-of-order blocks cache in memory
+out_of_order_cache_sz = 10000000
diff --git a/contrib/linearize/example-linearize.cfg b/contrib/linearize/example-linearize.cfg
index 9c0824ee1f26..e2fe77297793 100644
--- a/contrib/linearize/example-linearize.cfg
+++ b/contrib/linearize/example-linearize.cfg
@@ -6,14 +6,15 @@ host=127.0.0.1
port=9998
# bootstrap.dat hashlist settings (linearize-hashes)
-max_height=313000
+max_height=3130000
# bootstrap.dat input/output settings (linearize-data)
-netmagic=f9beb4d9
-input=/home/example/.bitcoin/blocks
+netmagic=bf0c6bbd
+input=/home/example/.dash/blocks
output_file=/home/example/Downloads/bootstrap.dat
hashlist=hashlist.txt
split_year=1
+genesis=00000ffd590b1485b3caadc19b22e6379c733355108f107a430458cdf3407ab6
# Maxmimum size in bytes of out-of-order blocks cache in memory
-out_of_order_cache_sz = 100000000
+out_of_order_cache_sz = 10000000
diff --git a/contrib/linearize/linearize-data.py b/contrib/linearize/linearize-data.py
index 2dac3a614b03..8fbe4798bfcc 100755
--- a/contrib/linearize/linearize-data.py
+++ b/contrib/linearize/linearize-data.py
@@ -16,6 +16,7 @@
import httplib
import sys
import hashlib
+import dash_hash
import datetime
import time
from collections import namedtuple
@@ -44,15 +45,17 @@ def wordreverse(in_buf):
return ''.join(out_words)
def calc_hdr_hash(blk_hdr):
- hash1 = hashlib.sha256()
- hash1.update(blk_hdr)
- hash1_o = hash1.digest()
+ #hash1 = hashlib.sha256()
+ #hash1.update(blk_hdr)
+ #hash1_o = hash1.digest()
- hash2 = hashlib.sha256()
- hash2.update(hash1_o)
- hash2_o = hash2.digest()
+ #hash2 = hashlib.sha256()
+ #hash2.update(hash1_o)
+ #hash2_o = hash2.digest()
- return hash2_o
+ #return hash2_o
+ pow_hash = dash_hash.getPoWHash(blk_hdr)
+ return pow_hash
def calc_hash_str(blk_hdr):
hash = calc_hdr_hash(blk_hdr)
@@ -264,7 +267,9 @@ def run(self):
f.close()
if 'netmagic' not in settings:
- settings['netmagic'] = 'f9beb4d9'
+ settings['netmagic'] = 'cee2caff'
+ if 'genesis' not in settings:
+ settings['genesis'] = '00000bafbc94add76cb75e2ec92894837288a481e5c005f6563d91623bf8bc2c'
if 'input' not in settings:
settings['input'] = 'input'
if 'hashlist' not in settings:
@@ -291,9 +296,8 @@ def run(self):
blkindex = get_block_hashes(settings)
blkmap = mkblockmap(blkindex)
- if not "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f" in blkmap:
- print("not found")
+ if not settings['genesis'] in blkmap:
+ print("genesis not found")
else:
BlockDataCopier(settings, blkindex, blkmap).run()
-
diff --git a/doc/guide-startmany.md b/doc/guide-startmany.md
index 322fec1dc78b..109405cdc595 100644
--- a/doc/guide-startmany.md
+++ b/doc/guide-startmany.md
@@ -4,15 +4,15 @@
There are many ways to setup a wallet to support start-many. This guide will walk through two of them.
1. [Importing an existing wallet (recommended if you are consolidating wallets).](#option1)
-2. [Sending 1,000 DASH to new wallet addresses.](#option2)
+2. [Sending 1000 DASH to new wallet addresses.](#option2)
## Option 1. Importing an existing wallet
This is the way to go if you are consolidating multiple wallets into one that supports start-many.
-### From your single-instance MasterNode Wallet
+### From your single-instance Masternode Wallet
-Open your QT Wallet and go to console (from the menu select Tools => Debug Console)
+Open your QT Wallet and go to console (from the menu select `Tools` => `Debug Console`)
Dump the private key from your MasterNode's pulic key.
@@ -23,9 +23,9 @@ dumpprivkey [mn_public_key]
Copy the resulting priviate key. You'll use it in the next step.
-### From your multi-instance MasterNode Wallet
+### From your multi-instance Masternode Wallet
-Open your QT Wallet and go to console (from the menu select Tools => Debug Console)
+Open your QT Wallet and go to console (from the menu select `Tools` => `Debug Console`)
Import the private key from the step above.
@@ -49,26 +49,26 @@ The wallet will re-scan and you will see your available balance increase by the
3. Fill in the form to request a payment.
* Label: mn01
* Amount: 1000 (optional)
- * Click *Request payment*
+ * Click *Request payment* button
5. Click the *Copy Address* button
-Create a new wallet address for each MasterNode.
+Create a new wallet address for each Masternode.
Close your QT Wallet.
-### Send 1,000 DASH to New Addresses
+### Send 1000 DASH to New Addresses
-Just like setting up a standard MN. Send exactly 1,000 DASH to each new address created above.
+Just like setting up a standard MN. Send exactly 1000 DASH to each new address created above.
### Create New Masternode Private Keys
-Open your QT Wallet and go to console (from the menu select Tools => Debug Console)
+Open your QT Wallet and go to console (from the menu select `Tools` => `Debug Console`)
Issue the following:
```masternode genkey```
-*Note: A masternode private key will need to be created for each MasterNode you run. You should not use the same masternode private key for multiple MasterNodes.*
+*Note: A masternode private key will need to be created for each Masternode you run. You should not use the same masternode private key for multiple Masternodes.*
Close your QT Wallet.
@@ -76,68 +76,66 @@ Close your QT Wallet.
Remember... this is local. Make sure your QT is not running.
-Create the masternode.conf file in the same directory as your wallet.dat.
+Create the `masternode.conf` file in the same directory as your `wallet.dat`.
-Copy the masternode private key and correspondig collateral output transaction that holds the 1K DASH.
+Copy the masternode private key and correspondig collateral output transaction that holds the 1000 DASH.
The masternode private key may be an existing key from [Option 1](#option1), or a newly generated key from [Option 2](#option2).
-*Please note, the masternode priviate key is not the same as a wallet private key. Never put your wallet private key in the masternode.conf file. That is equivalent to putting your 1,000 DASH on the remote server and defeats the purpose of a hot/cold setup.*
+*Note: The masternode priviate key is **not** the same as a wallet private key. **Never** put your wallet private key in the masternode.conf file. That is almost equivalent to putting your 1000 DASH on the remote server and defeats the purpose of a hot/cold setup.*
### Get the collateral output
-Open your QT Wallet and go to console (from the menu select Tools => Debug Console)
+Open your QT Wallet and go to console (from the menu select `Tools` => `Debug Console`)
Issue the following:
```masternode outputs```
-Make note of the hash (which is your collaterla_output) and index.
+Make note of the hash (which is your collateral_output) and index.
-### Enter your MasterNode details into your masternode.conf file
+### Enter your Masternode details into your masternode.conf file
[From the dash github repo](https://github.com/darkcoin/darkcoin/blob/master/doc/masternode_conf.md)
-The new masternode.conf format consists of a space seperated text file. Each line consisting of an alias, IP address followed by port, masternode private key, collateral output transaction id and collateral output index, donation address and donation percentage (the latter two are optional and should be in format "address:percentage").
+`masternode.conf` format is a space seperated text file. Each line consisting of an alias, IP address followed by port, masternode private key, collateral output transaction id and collateral output index.
```
-alias ipaddress:port masternode_private_key collateral_output collateral_output_index donationin_address:donation_percentage
+alias ipaddress:port masternode_private_key collateral_output collateral_output_index
```
-
-
Example:
```
mn01 127.0.0.1:9999 93HaYBVUCYjEMeeH1Y4sBGLALQZE1Yc1K64xiqgX37tGBDQL8Xg 2bcd3c84c84f87eaa86e4e56834c92927a07f9e18718810b92e0d0324456a67c 0
-mn02 127.0.0.2:9999 93WaAb3htPJEV8E9aQcN23Jt97bPex7YvWfgMDTUdWJvzmrMqey aa9f1034d973377a5e733272c3d0eced1de22555ad45d6b24abadff8087948d4 0 7gnwGHt17heGpG9Crfeh4KGpYNFugPhJdh:25
+mn02 127.0.0.2:9999 93WaAb3htPJEV8E9aQcN23Jt97bPex7YvWfgMDTUdWJvzmrMqey aa9f1034d973377a5e733272c3d0eced1de22555ad45d6b24abadff8087948d4 0
```
## What about the dash.conf file?
-If you are using a masternode.conf file you no longer need the dash.conf file. The exception is if you need custom settings (thanks oblox).
+If you are using a `masternode.conf` file you no longer need the `dash.conf` file. The exception is if you need custom settings (_thanks oblox_). In that case you **must** remove `masternode=1` from local `dash.conf` file. This option should be used only to start local Hot masternode now.
## Update dash.conf on server
-If you generated a new masternode private key, you will need to update the remote dash.conf files.
+If you generated a new masternode private key, you will need to update the remote `dash.conf` files.
Shut down the daemon and then edit the file.
-```sudo nano .dash/dash.conf```
+```nano .dash/dash.conf```
### Edit the masternodeprivkey
-If you generated a new masternode private key, you will need to update the masternodeprivkey value in your remote dash.conf file.
+If you generated a new masternode private key, you will need to update the `masternodeprivkey` value in your remote `dash.conf` file.
-## Start your MasterNodes
+## Start your Masternodes
### Remote
If your remote server is not running, start your remote daemon as you normally would.
-I usually confirm that remote is on the correct block by issuing:
+You can confirm that remote server is on the correct block by issuing
```dashd getinfo```
-And compare with the official explorer at http://explorer.dashpay.io/chain/Dash
+and comparing with the official explorer at http://explorer.dashpay.io/chain/Dash
### Local
@@ -145,13 +143,37 @@ Finally... time to start from local.
#### Open up your QT Wallet
-From the menu select Tools => Debug Console
+From the menu select `Tools` => `Debug Console`
-If you want to review your masternode.conf setting before starting the MasterNodes, issue the following in the Debug Console:
+If you want to review your `masternode.conf` setting before starting Masternodes, issue the following in the Debug Console:
```masternode list-conf```
-Give it the eye-ball test. If satisfied, you can start your nodes one of two ways.
+Give it the eye-ball test. If satisfied, you can start your Masternodes one of two ways.
+
+1. `masternode start-alias [alias_from_masternode.conf]`
+Example ```masternode start-alias mn01```
+2. `masternode start-many`
+
+## Verify that Masternodes actually started
+
+### Remote
+
+Issue command `masternode status`
+It should return you something like that:
+```
+dash-cli masternode status
+{
+ "vin" : "CTxIn(COutPoint(, ), scriptSig=)",
+ "service" : ":",
+ "pubkey" : "<1000 DASH address>",
+ "status" : "Masternode successfully started"
+}
+```
+Command output should have "_Masternode successfully started_" in its `status` field now. If it says "_not capable_" instead, you should check your config again.
+
+### Local
+
+Search your Masternodes on https://dashninja.pl/masternodes.html
-1. masternode start-alias [alias_from_masternode.conf]. Example ```masternode start-alias mn01```
-2. masternode start-many
+_Hint: Bookmark it, you definitely will be using this site a lot._
\ No newline at end of file
diff --git a/doc/masternode_conf.md b/doc/masternode_conf.md
index 0cb343e11b7c..b46323c1b5bc 100644
--- a/doc/masternode_conf.md
+++ b/doc/masternode_conf.md
@@ -1,32 +1,30 @@
Multi masternode config
=======================
-The multi masternode config allows to control multiple masternodes from a single wallet. The wallet needs to have a valid collaral output of 1000 coins for each masternode. To use this, place a file named masternode.conf in the data directory of your install:
+The multi masternode config allows to control multiple masternodes from a single wallet. The wallet needs to have a valid collaral output of 1000 coins for each masternode. To use this, place a file named `masternode.conf` in the data directory of your install:
* Windows: %APPDATA%\Dash\
* Mac OS: ~/Library/Application Support/Dash/
* Unix/Linux: ~/.dash/
-The new masternode.conf format consists of a space seperated text file. Each line consisting of an alias, IP address followed by port, masternode private key, collateral output transaction id, collateral output index, donation address and donation percentage (the latter two are optional and should be in format "address:percentage").
+`masternode.conf` format is a space seperated text file. Each line consisting of an alias, IP address followed by port, masternode private key, collateral output transaction id and collateral output index.
Example:
```
mn1 127.0.0.2:19999 93HaYBVUCYjEMeeH1Y4sBGLALQZE1Yc1K64xiqgX37tGBDQL8Xg 2bcd3c84c84f87eaa86e4e56834c92927a07f9e18718810b92e0d0324456a67c 0
-mn2 127.0.0.3:19999 93WaAb3htPJEV8E9aQcN23Jt97bPex7YvWfgMDTUdWJvzmrMqey aa9f1034d973377a5e733272c3d0eced1de22555ad45d6b24abadff8087948d4 0 7gnwGHt17heGpG9Crfeh4KGpYNFugPhJdh:33
-mn3 127.0.0.4:19999 92Da1aYg6sbenP6uwskJgEY2XWB5LwJ7bXRqc3UPeShtHWJDjDv db478e78e3aefaa8c12d12ddd0aeace48c3b451a8b41c570d0ee375e2a02dfd9 1 7gnwGHt17heGpG9Crfeh4KGpYNFugPhJdh
+mn2 127.0.0.3:19999 93WaAb3htPJEV8E9aQcN23Jt97bPex7YvWfgMDTUdWJvzmrMqey aa9f1034d973377a5e733272c3d0eced1de22555ad45d6b24abadff8087948d4 0
+mn3 127.0.0.4:19999 92Da1aYg6sbenP6uwskJgEY2XWB5LwJ7bXRqc3UPeShtHWJDjDv db478e78e3aefaa8c12d12ddd0aeace48c3b451a8b41c570d0ee375e2a02dfd9 1
```
In the example above:
-* the collateral for mn1 consists of transaction http://test.explorer.dash.fr/tx/2bcd3c84c84f87eaa86e4e56834c92927a07f9e18718810b92e0d0324456a67c, output index 0 has amount 1000
-* masternode 2 will donate 33% of its income
-* masternode 3 will donate 100% of its income
+* the collateral for `mn1` is output `0` of transaction http://test.explorer.dash.fr/tx/2bcd3c84c84f87eaa86e4e56834c92927a07f9e18718810b92e0d0324456a67c and it has amount of 1000 DASH
The following new RPC commands are supported:
* list-conf: shows the parsed masternode.conf
* start-alias \
-* stop-alias \
+* start-missing
+* start-disabled
* start-many
-* stop-many
* outputs: list available collateral output transaction ids and corresponding collateral output indexes
-When using the multi masternode setup, it is advised to run the wallet with 'masternode=0' as it is not needed anymore.
+When using remote masternode setup, you **must** remove `masternode=1` from local `dash.conf` file if you had it there in previous versions. This option should be used only to start local Hot masternode now.
diff --git a/doc/tor.md b/doc/tor.md
index a3864ea1dc9f..c2922f6807d2 100644
--- a/doc/tor.md
+++ b/doc/tor.md
@@ -97,10 +97,14 @@ for normal IPv4/IPv6 communication, use:
3. List of known dash Tor relays
------------------------------------
-* [dashie7ghp67.onion](http://dashie7ghp67.onion/)
+* [darkcoinie7ghp67.onion](http://darkcoinie7ghp67.onion/)
* [drktalkwaybgxnoq.onion](http://drktalkwaybgxnoq.onion/)
* [drkcoinooditvool.onion](http://drkcoinooditvool.onion/)
* [darkcoxbtzggpmcc.onion](http://darkcoxbtzggpmcc.onion/)
* [ssapp53tmftyjmjb.onion](http://ssapp53tmftyjmjb.onion/)
* [j2dfl3cwxyxpbc7s.onion](http://j2dfl3cwxyxpbc7s.onion/)
* [vf6d2mxpuhh2cbxt.onion](http://vf6d2mxpuhh2cbxt.onion/)
+* [rj24sicr6i4vsnkv.onion](http://rj24sicr6i4vsnkv.onion/)
+* [wrwx2dy7jyh32o53.onion](http://wrwx2dy7jyh32o53.onion/)
+* [f5ekot4ajkbe23gt.onion](http://f5ekot4ajkbe23gt.onion/)
+* [dshtord4mqvgzqev.onion](http://dshtord4mqvgzqev.onion/)
diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include
old mode 100755
new mode 100644
index 5325de196ef3..02d5a90a2c58
--- a/src/Makefile.qt.include
+++ b/src/Makefile.qt.include
@@ -158,63 +158,179 @@ BITCOIN_QT_H = \
qt/winshutdownmonitor.h
RES_ICONS = \
- qt/res/icons/add.png \
- qt/res/icons/address-book.png \
qt/res/icons/bitcoin.ico \
- qt/res/icons/bitcoin.png \
qt/res/icons/bitcoin_testnet.ico \
- qt/res/icons/bitcoin_testnet.png \
- qt/res/icons/browse.png \
- qt/res/icons/clock1.png \
- qt/res/icons/clock2.png \
- qt/res/icons/clock3.png \
- qt/res/icons/clock4.png \
- qt/res/icons/clock5.png \
- qt/res/icons/configure.png \
- qt/res/icons/connect0_16.png \
- qt/res/icons/connect1_16.png \
- qt/res/icons/connect2_16.png \
- qt/res/icons/connect3_16.png \
- qt/res/icons/connect4_16.png \
- qt/res/icons/debugwindow.png \
- qt/res/icons/drkblue_editpaste.png \
- qt/res/icons/drkblue_address-book.png \
- qt/res/icons/drkblue_editcopy.png \
- qt/res/icons/drkblue_remove.png \
- qt/res/icons/edit.png \
- qt/res/icons/editcopy.png \
- qt/res/icons/editpaste.png \
- qt/res/icons/export.png \
- qt/res/icons/eye.png \
- qt/res/icons/eye_minus.png \
- qt/res/icons/eye_plus.png \
- qt/res/icons/filesave.png \
- qt/res/icons/history.png \
- qt/res/icons/key.png \
- qt/res/icons/lock_closed.png \
- qt/res/icons/lock_open.png \
- qt/res/icons/overview.png \
- qt/res/icons/qrcode.png \
- qt/res/icons/quit.png \
- qt/res/icons/receive.png \
- qt/res/icons/remove.png \
- qt/res/icons/send.png \
- qt/res/icons/synced.png \
- qt/res/icons/transaction0.png \
- qt/res/icons/transaction2.png \
- qt/res/icons/transaction_conflicted.png \
- qt/res/icons/tx_inout.png \
- qt/res/icons/tx_input.png \
- qt/res/icons/tx_output.png \
- qt/res/icons/tx_mined.png \
- qt/res/icons/unit_dash.png \
- qt/res/icons/unit_mdash.png \
- qt/res/icons/unit_udash.png \
- qt/res/icons/unit_duffs.png \
- qt/res/icons/unit_tdash.png \
- qt/res/icons/unit_tmdash.png \
- qt/res/icons/unit_tudash.png \
- qt/res/icons/unit_tduffs.png
+qt/res/icons/light/add.png \
+qt/res/icons/light/address-book.png \
+qt/res/icons/light/bitcoin.ico \
+qt/res/icons/light/bitcoin.png \
+qt/res/icons/light/bitcoin_testnet.ico \
+qt/res/icons/light/bitcoin_testnet.png \
+qt/res/icons/light/browse.png \
+qt/res/icons/light/clock1.png \
+qt/res/icons/light/clock2.png \
+qt/res/icons/light/clock3.png \
+qt/res/icons/light/clock4.png \
+qt/res/icons/light/clock5.png \
+qt/res/icons/light/configure.png \
+qt/res/icons/light/connect0_16.png \
+qt/res/icons/light/connect1_16.png \
+qt/res/icons/light/connect2_16.png \
+qt/res/icons/light/connect3_16.png \
+qt/res/icons/light/connect4_16.png \
+qt/res/icons/light/debugwindow.png \
+qt/res/icons/light/drkblue_editpaste.png \
+qt/res/icons/light/drkblue_address-book.png \
+qt/res/icons/light/drkblue_editcopy.png \
+qt/res/icons/light/drkblue_remove.png \
+qt/res/icons/light/edit.png \
+qt/res/icons/light/editcopy.png \
+qt/res/icons/light/editpaste.png \
+qt/res/icons/light/export.png \
+qt/res/icons/light/eye.png \
+qt/res/icons/light/eye_minus.png \
+qt/res/icons/light/eye_plus.png \
+qt/res/icons/light/filesave.png \
+qt/res/icons/light/history.png \
+qt/res/icons/light/key.png \
+qt/res/icons/light/lock_closed.png \
+qt/res/icons/light/lock_open.png \
+qt/res/icons/light/overview.png \
+qt/res/icons/light/qrcode.png \
+qt/res/icons/light/quit.png \
+qt/res/icons/light/receive.png \
+qt/res/icons/light/remove.png \
+qt/res/icons/light/send.png \
+qt/res/icons/light/synced.png \
+qt/res/icons/light/transaction0.png \
+qt/res/icons/light/transaction2.png \
+qt/res/icons/light/transaction_conflicted.png \
+qt/res/icons/light/tx_inout.png \
+qt/res/icons/light/tx_input.png \
+qt/res/icons/light/tx_output.png \
+qt/res/icons/light/tx_mined.png \
+qt/res/icons/light/unit_dash.png \
+qt/res/icons/light/unit_mdash.png \
+qt/res/icons/light/unit_udash.png \
+qt/res/icons/light/unit_duffs.png \
+qt/res/icons/light/unit_tdash.png \
+qt/res/icons/light/unit_tmdash.png \
+qt/res/icons/light/unit_tudash.png \
+qt/res/icons/light/unit_tduffs.png \
+ qt/res/icons/drkblue/add.png \
+ qt/res/icons/drkblue/address-book.png \
+ qt/res/icons/drkblue/bitcoin.ico \
+ qt/res/icons/drkblue/bitcoin.png \
+ qt/res/icons/drkblue/bitcoin_testnet.ico \
+ qt/res/icons/drkblue/bitcoin_testnet.png \
+ qt/res/icons/drkblue/browse.png \
+ qt/res/icons/drkblue/clock1.png \
+ qt/res/icons/drkblue/clock2.png \
+ qt/res/icons/drkblue/clock3.png \
+ qt/res/icons/drkblue/clock4.png \
+ qt/res/icons/drkblue/clock5.png \
+ qt/res/icons/drkblue/configure.png \
+ qt/res/icons/drkblue/connect0_16.png \
+ qt/res/icons/drkblue/connect1_16.png \
+ qt/res/icons/drkblue/connect2_16.png \
+ qt/res/icons/drkblue/connect3_16.png \
+ qt/res/icons/drkblue/connect4_16.png \
+ qt/res/icons/drkblue/debugwindow.png \
+ qt/res/icons/drkblue/drkblue_editpaste.png \
+ qt/res/icons/drkblue/drkblue_address-book.png \
+ qt/res/icons/drkblue/drkblue_editcopy.png \
+ qt/res/icons/drkblue/drkblue_remove.png \
+ qt/res/icons/drkblue/edit.png \
+ qt/res/icons/drkblue/editcopy.png \
+ qt/res/icons/drkblue/editpaste.png \
+ qt/res/icons/drkblue/export.png \
+ qt/res/icons/drkblue/eye.png \
+ qt/res/icons/drkblue/eye_minus.png \
+ qt/res/icons/drkblue/eye_plus.png \
+ qt/res/icons/drkblue/filesave.png \
+ qt/res/icons/drkblue/history.png \
+ qt/res/icons/drkblue/key.png \
+ qt/res/icons/drkblue/lock_closed.png \
+ qt/res/icons/drkblue/lock_open.png \
+ qt/res/icons/drkblue/overview.png \
+ qt/res/icons/drkblue/qrcode.png \
+ qt/res/icons/drkblue/quit.png \
+ qt/res/icons/drkblue/receive.png \
+ qt/res/icons/drkblue/remove.png \
+ qt/res/icons/drkblue/send.png \
+ qt/res/icons/drkblue/synced.png \
+ qt/res/icons/drkblue/transaction0.png \
+ qt/res/icons/drkblue/transaction2.png \
+ qt/res/icons/drkblue/transaction_conflicted.png \
+ qt/res/icons/drkblue/tx_inout.png \
+ qt/res/icons/drkblue/tx_input.png \
+ qt/res/icons/drkblue/tx_output.png \
+ qt/res/icons/drkblue/tx_mined.png \
+ qt/res/icons/drkblue/unit_dash.png \
+ qt/res/icons/drkblue/unit_mdash.png \
+ qt/res/icons/drkblue/unit_udash.png \
+ qt/res/icons/drkblue/unit_duffs.png \
+ qt/res/icons/drkblue/unit_tdash.png \
+ qt/res/icons/drkblue/unit_tmdash.png \
+ qt/res/icons/drkblue/unit_tudash.png \
+ qt/res/icons/drkblue/unit_tduffs.png \
+ qt/res/icons/trad/add.png \
+ qt/res/icons/trad/address-book.png \
+ qt/res/icons/trad/bitcoin.ico \
+ qt/res/icons/trad/bitcoin.png \
+ qt/res/icons/trad/bitcoin_testnet.ico \
+ qt/res/icons/trad/bitcoin_testnet.png \
+ qt/res/icons/trad/browse.png \
+ qt/res/icons/trad/clock1.png \
+ qt/res/icons/trad/clock2.png \
+ qt/res/icons/trad/clock3.png \
+ qt/res/icons/trad/clock4.png \
+ qt/res/icons/trad/clock5.png \
+ qt/res/icons/trad/configure.png \
+ qt/res/icons/trad/connect0_16.png \
+ qt/res/icons/trad/connect1_16.png \
+ qt/res/icons/trad/connect2_16.png \
+ qt/res/icons/trad/connect3_16.png \
+ qt/res/icons/trad/connect4_16.png \
+ qt/res/icons/trad/debugwindow.png \
+ qt/res/icons/trad/drkblue_editpaste.png \
+ qt/res/icons/trad/drkblue_address-book.png \
+ qt/res/icons/trad/drkblue_editcopy.png \
+ qt/res/icons/trad/drkblue_remove.png \
+ qt/res/icons/trad/edit.png \
+ qt/res/icons/trad/editcopy.png \
+ qt/res/icons/trad/editpaste.png \
+ qt/res/icons/trad/export.png \
+ qt/res/icons/trad/eye.png \
+ qt/res/icons/trad/eye_minus.png \
+ qt/res/icons/trad/eye_plus.png \
+ qt/res/icons/trad/filesave.png \
+ qt/res/icons/trad/history.png \
+ qt/res/icons/trad/key.png \
+ qt/res/icons/trad/lock_closed.png \
+ qt/res/icons/trad/lock_open.png \
+ qt/res/icons/trad/overview.png \
+ qt/res/icons/trad/qrcode.png \
+ qt/res/icons/trad/quit.png \
+ qt/res/icons/trad/receive.png \
+ qt/res/icons/trad/remove.png \
+ qt/res/icons/trad/send.png \
+ qt/res/icons/trad/synced.png \
+ qt/res/icons/trad/transaction0.png \
+ qt/res/icons/trad/transaction2.png \
+ qt/res/icons/trad/transaction_conflicted.png \
+ qt/res/icons/trad/tx_inout.png \
+ qt/res/icons/trad/tx_input.png \
+ qt/res/icons/trad/tx_output.png \
+ qt/res/icons/trad/tx_mined.png \
+ qt/res/icons/trad/unit_dash.png \
+ qt/res/icons/trad/unit_mdash.png \
+ qt/res/icons/trad/unit_udash.png \
+ qt/res/icons/trad/unit_duffs.png \
+ qt/res/icons/trad/unit_tdash.png \
+ qt/res/icons/trad/unit_tmdash.png \
+ qt/res/icons/trad/unit_tudash.png \
+ qt/res/icons/trad/unit_tduffs.png
BITCOIN_QT_CPP = \
qt/bitcoinaddressvalidator.cpp \
@@ -270,21 +386,46 @@ BITCOIN_QT_CPP += \
endif
RES_IMAGES = \
- qt/res/images/about.png \
- qt/res/images/splash.png \
- qt/res/images/splash_testnet.png \
- qt/res/images/dash_logo_horizontal.png \
- qt/res/images/drkblue_downArrow.png \
- qt/res/images/drkblue_downArrow_small.png \
- qt/res/images/drkblue_upArrow_small.png \
- qt/res/images/drkblue_leftArrow_small.png \
- qt/res/images/drkblue_rightArrow_small.png \
- qt/res/images/drkblue_qtreeview_selected.png \
- qt/res/images/drkblue_walletFrame_bg.png \
- qt/res/images/drkblue_walletFrame.png
+qt/res/images/light/about.png \
+qt/res/images/light/splash.png \
+qt/res/images/light/splash_testnet.png \
+qt/res/images/light/dash_logo_horizontal.png \
+qt/res/images/light/drkblue_downArrow.png \
+qt/res/images/light/drkblue_downArrow_small.png \
+qt/res/images/light/drkblue_upArrow_small.png \
+qt/res/images/light/drkblue_leftArrow_small.png \
+qt/res/images/light/drkblue_rightArrow_small.png \
+qt/res/images/light/drkblue_qtreeview_selected.png \
+qt/res/images/light/drkblue_walletFrame_bg.png \
+qt/res/images/light/drkblue_walletFrame.png \
+ qt/res/images/drkblue/about.png \
+ qt/res/images/drkblue/splash.png \
+ qt/res/images/drkblue/splash_testnet.png \
+ qt/res/images/drkblue/dash_logo_horizontal.png \
+ qt/res/images/drkblue/drkblue_downArrow.png \
+ qt/res/images/drkblue/drkblue_downArrow_small.png \
+ qt/res/images/drkblue/drkblue_upArrow_small.png \
+ qt/res/images/drkblue/drkblue_leftArrow_small.png \
+ qt/res/images/drkblue/drkblue_rightArrow_small.png \
+ qt/res/images/drkblue/drkblue_qtreeview_selected.png \
+ qt/res/images/drkblue/drkblue_walletFrame_bg.png \
+ qt/res/images/drkblue/drkblue_walletFrame.png \
+ qt/res/images/trad/about.png \
+ qt/res/images/trad/splash.png \
+ qt/res/images/trad/splash_testnet.png \
+ qt/res/images/trad/dash_logo_horizontal.png \
+ qt/res/images/trad/drkblue_downArrow.png \
+ qt/res/images/trad/drkblue_downArrow_small.png \
+ qt/res/images/trad/drkblue_upArrow_small.png \
+ qt/res/images/trad/drkblue_leftArrow_small.png \
+ qt/res/images/trad/drkblue_rightArrow_small.png \
+ qt/res/images/trad/drkblue_qtreeview_selected.png \
+ qt/res/images/trad/drkblue_walletFrame_bg.png \
+ qt/res/images/trad/drkblue_walletFrame.png
RES_CSS = \
- qt/res/css/drkblue.css
+ qt/res/css/drkblue.css \
+ qt/res/css/light.css
RES_MOVIES = $(wildcard qt/res/movies/spinner-*.png)
diff --git a/src/activemasternode.cpp b/src/activemasternode.cpp
index e65725386ced..49e3b6917d16 100644
--- a/src/activemasternode.cpp
+++ b/src/activemasternode.cpp
@@ -32,7 +32,8 @@ void CActiveMasternode::ManageStatus()
pmn = mnodeman.Find(pubKeyMasternode);
if(pmn != NULL) {
pmn->Check();
- if(pmn->IsEnabled() && pmn->protocolVersion == PROTOCOL_VERSION) EnableHotColdMasterNode(pmn->vin, pmn->addr);
+ if((pmn->IsEnabled() || pmn->IsPreEnabled()) && pmn->protocolVersion == PROTOCOL_VERSION)
+ EnableHotColdMasterNode(pmn->vin, pmn->addr);
}
}
@@ -188,38 +189,6 @@ bool CActiveMasternode::SendMasternodePing(std::string& errorMessage) {
mnp.Relay();
- /*
- * IT'S SAFE TO REMOVE THIS IN FURTHER VERSIONS
- * AFTER MIGRATION TO V12 IS DONE
- */
-
- if(IsSporkActive(SPORK_10_MASTERNODE_PAY_UPDATED_NODES)) return true;
- // for migration purposes ping our node on old masternodes network too
- std::string retErrorMessage;
- std::vector vchMasterNodeSignature;
- int64_t masterNodeSignatureTime = GetAdjustedTime();
-
- std::string strMessage = service.ToString() + boost::lexical_cast(masterNodeSignatureTime) + boost::lexical_cast(false);
-
- if(!darkSendSigner.SignMessage(strMessage, retErrorMessage, vchMasterNodeSignature, keyMasternode)) {
- errorMessage = "dseep sign message failed: " + retErrorMessage;
- return false;
- }
-
- if(!darkSendSigner.VerifyMessage(pubKeyMasternode, vchMasterNodeSignature, strMessage, retErrorMessage)) {
- errorMessage = "dseep verify message failed: " + retErrorMessage;
- return false;
- }
-
- LogPrint("masternode", "dseep - relaying from active mn, %s \n", vin.ToString().c_str());
- LOCK(cs_vNodes);
- BOOST_FOREACH(CNode* pnode, vNodes)
- pnode->PushMessage("dseep", vin, vchMasterNodeSignature, masterNodeSignatureTime, false);
-
- /*
- * END OF "REMOVE"
- */
-
return true;
}
else
@@ -312,44 +281,6 @@ bool CActiveMasternode::Register(CTxIn vin, CService service, CKey keyCollateral
LogPrintf("CActiveMasternode::Register() - RelayElectionEntry vin = %s\n", vin.ToString());
mnb.Relay();
- /*
- * IT'S SAFE TO REMOVE THIS IN FURTHER VERSIONS
- * AFTER MIGRATION TO V12 IS DONE
- */
-
- if(IsSporkActive(SPORK_10_MASTERNODE_PAY_UPDATED_NODES)) return true;
- // for migration purposes inject our node in old masternodes' list too
- std::string retErrorMessage;
- std::vector vchMasterNodeSignature;
- int64_t masterNodeSignatureTime = GetAdjustedTime();
- std::string donationAddress = "";
- int donationPercantage = 0;
-
- std::string vchPubKey(pubKeyCollateralAddress.begin(), pubKeyCollateralAddress.end());
- std::string vchPubKey2(pubKeyMasternode.begin(), pubKeyMasternode.end());
-
- std::string strMessage = service.ToString() + boost::lexical_cast(masterNodeSignatureTime) + vchPubKey + vchPubKey2 + boost::lexical_cast(PROTOCOL_VERSION) + donationAddress + boost::lexical_cast(donationPercantage);
-
- if(!darkSendSigner.SignMessage(strMessage, retErrorMessage, vchMasterNodeSignature, keyCollateralAddress)) {
- errorMessage = "dsee sign message failed: " + retErrorMessage;
- LogPrintf("CActiveMasternode::Register() - Error: %s\n", errorMessage.c_str());
- return false;
- }
-
- if(!darkSendSigner.VerifyMessage(pubKeyCollateralAddress, vchMasterNodeSignature, strMessage, retErrorMessage)) {
- errorMessage = "dsee verify message failed: " + retErrorMessage;
- LogPrintf("CActiveMasternode::Register() - Error: %s\n", errorMessage.c_str());
- return false;
- }
-
- LOCK(cs_vNodes);
- BOOST_FOREACH(CNode* pnode, vNodes)
- pnode->PushMessage("dsee", vin, service, vchMasterNodeSignature, masterNodeSignatureTime, pubKeyCollateralAddress, pubKeyMasternode, -1, -1, masterNodeSignatureTime, PROTOCOL_VERSION, donationAddress, donationPercantage);
-
- /*
- * END OF "REMOVE"
- */
-
return true;
}
diff --git a/src/clientversion.h b/src/clientversion.h
index 9c51d8405cfe..7adae4d9a672 100644
--- a/src/clientversion.h
+++ b/src/clientversion.h
@@ -16,8 +16,8 @@
//! These need to be macros, as clientversion.cpp's and dash*-res.rc's voodoo requires it
#define CLIENT_VERSION_MAJOR 0
#define CLIENT_VERSION_MINOR 12
-#define CLIENT_VERSION_REVISION 0
-#define CLIENT_VERSION_BUILD 55
+#define CLIENT_VERSION_REVISION 1
+#define CLIENT_VERSION_BUILD 0
//! Set to true for release, false for prerelease or test build
#define CLIENT_VERSION_IS_RELEASE true
diff --git a/src/darksend.cpp b/src/darksend.cpp
index ef2d7c39a859..51e203880c6e 100644
--- a/src/darksend.cpp
+++ b/src/darksend.cpp
@@ -379,8 +379,6 @@ void CDarksendPool::ProcessMessageDarksend(CNode* pfrom, std::string& strCommand
}
-int randomizeList (int i) { return std::rand()%i;}
-
void CDarksendPool::Reset(){
cachedLastSuccess = 0;
lastNewBlock = 0;
@@ -533,9 +531,9 @@ void CDarksendPool::Check()
txNew.vin.push_back(s);
}
- // shuffle the outputs for improved anonymity
- std::random_shuffle ( txNew.vin.begin(), txNew.vin.end(), randomizeList);
- std::random_shuffle ( txNew.vout.begin(), txNew.vout.end(), randomizeList);
+ // BIP69 https://github.com/kristovatlas/bips/blob/master/bip-0069.mediawiki
+ sort(txNew.vin.begin(), txNew.vin.end());
+ sort(txNew.vout.begin(), txNew.vout.end());
LogPrint("darksend", "Transaction 1: %s\n", txNew.ToString());
@@ -946,7 +944,7 @@ bool CDarksendPool::IsCollateralValid(const CTransaction& txCollateral){
nValueOut += o.nValue;
if(!o.scriptPubKey.IsNormalPaymentScript()){
- LogPrintf ("CDarksendPool::IsCollateralValid - Invalid Script %s\n", txCollateral.ToString());
+ LogPrintf ("CDarksendPool::IsCollateralValid - Invalid Script %s", txCollateral.ToString());
return false;
}
}
@@ -964,17 +962,17 @@ bool CDarksendPool::IsCollateralValid(const CTransaction& txCollateral){
}
if(missingTx){
- LogPrint("darksend", "CDarksendPool::IsCollateralValid - Unknown inputs in collateral transaction - %s\n", txCollateral.ToString());
+ LogPrint("darksend", "CDarksendPool::IsCollateralValid - Unknown inputs in collateral transaction - %s", txCollateral.ToString());
return false;
}
//collateral transactions are required to pay out DARKSEND_COLLATERAL as a fee to the miners
if(nValueIn - nValueOut < DARKSEND_COLLATERAL) {
- LogPrint("darksend", "CDarksendPool::IsCollateralValid - did not include enough fees in transaction %d\n%s\n", nValueOut-nValueIn, txCollateral.ToString());
+ LogPrint("darksend", "CDarksendPool::IsCollateralValid - did not include enough fees in transaction %d\n%s", nValueOut-nValueIn, txCollateral.ToString());
return false;
}
- LogPrint("darksend", "CDarksendPool::IsCollateralValid %s\n", txCollateral.ToString());
+ LogPrint("darksend", "CDarksendPool::IsCollateralValid %s", txCollateral.ToString());
{
LOCK(cs_main);
@@ -1382,7 +1380,7 @@ bool CDarksendPool::DoAutomaticDenominating(bool fDryRun)
return false;
}
- if(chainActive.Tip()->nHeight - cachedLastSuccess < minBlockSpacing) {
+ if(!fDarksendMultiSession && chainActive.Tip()->nHeight - cachedLastSuccess < minBlockSpacing) {
LogPrintf("CDarksendPool::DoAutomaticDenominating - Last successful Darksend action was too recent\n");
strAutoDenomResult = _("Last successful Darksend action was too recent.");
return false;
@@ -1475,7 +1473,7 @@ bool CDarksendPool::DoAutomaticDenominating(bool fDryRun)
int nUseQueue = rand()%100;
UpdateState(POOL_STATUS_ACCEPTING_ENTRIES);
- if(pwalletMain->GetDenominatedBalance(true) > 0){ //get denominated unconfirmed inputs
+ if(!fDarksendMultiSession && pwalletMain->GetDenominatedBalance(true) > 0) { //get denominated unconfirmed inputs
LogPrintf("DoAutomaticDenominating -- Found unconfirmed denominated outputs, will wait till they confirm to continue.\n");
strAutoDenomResult = _("Found unconfirmed denominated outputs, will wait till they confirm to continue.");
return false;
diff --git a/src/init.cpp b/src/init.cpp
index db615b4088ef..34bc580f19e9 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -343,7 +343,7 @@ std::string HelpMessage(HelpMessageMode mode)
strUsage += " -keepasskey= " + _("KeePassHttp key for AES encrypted communication with KeePass") + "\n";
strUsage += " -keepassid= " + _("KeePassHttp id for the established association") + "\n";
strUsage += " -keepassname= " + _("Name to construct url for KeePass entry that stores the wallet passphrase") + "\n";
- strUsage += " -keypool= " + strprintf(_("Set key pool size to (default: %u)"), 100) + "\n";
+ strUsage += " -keypool= " + strprintf(_("Set key pool size to (default: %u). Run 'keypoolrefill' to apply this to already existing wallets"), DEFAULT_KEYPOOL_SIZE) + "\n";
if (GetBoolArg("-help-debug", false))
strUsage += " -mintxfee= " + strprintf(_("Fees (in DASH/Kb) smaller than this are considered zero fee for transaction creation (default: %s)"), FormatMoney(CWallet::minTxFee.GetFeePerK())) + "\n";
strUsage += " -paytxfee= " + strprintf(_("Fee (in DASH/kB) to add to transactions you send (default: %s)"), FormatMoney(payTxFee.GetFeePerK())) + "\n";
@@ -419,6 +419,7 @@ std::string HelpMessage(HelpMessageMode mode)
strUsage += "\n" + _("Darksend options:") + "\n";
strUsage += " -enabledarksend= " + strprintf(_("Enable use of automated darksend for funds stored in this wallet (0-1, default: %u)"), 0) + "\n";
+ strUsage += " -darksendmultisession= " + strprintf(_("Enable multiple darksend mixing sessions per block, experimental (0-1, default: %u)"), 0) + "\n";
strUsage += " -darksendrounds= " + strprintf(_("Use N separate masternodes to anonymize funds (2-8, default: %u)"), 2) + "\n";
strUsage += " -anonymizedashamount= " + strprintf(_("Keep N DASH anonymized (default: %u)"), 0) + "\n";
strUsage += " -liquidityprovider= " + strprintf(_("Provide liquidity to Darksend by infrequently mixing coins on a continual basis (0-100, default: %u, 1=very frequent, high fees, 100=very infrequent, low fees)"), 0) + "\n";
@@ -1521,6 +1522,7 @@ bool AppInit2(boost::thread_group& threadGroup)
}
fEnableDarksend = GetBoolArg("-enabledarksend", false);
+ fDarksendMultiSession = GetBoolArg("-darksendmultisession", false);
nDarksendRounds = GetArg("-darksendrounds", 2);
if(nDarksendRounds > 16) nDarksendRounds = 16;
@@ -1531,6 +1533,7 @@ bool AppInit2(boost::thread_group& threadGroup)
darkSendPool.SetMinBlockSpacing(std::min(nLiquidityProvider,100)*15);
fEnableDarksend = true;
nDarksendRounds = 99999;
+ fDarksendMultiSession = false;
}
nAnonymizeDarkcoinAmount = GetArg("-anonymizedashamount", 0);
diff --git a/src/masternode-budget.cpp b/src/masternode-budget.cpp
index 303413cd982e..70e9e7e5440a 100644
--- a/src/masternode-budget.cpp
+++ b/src/masternode-budget.cpp
@@ -1265,18 +1265,6 @@ CBudgetProposal::CBudgetProposal()
fValid = true;
}
-CBudgetProposal::CBudgetProposal(std::string strProposalNameIn, std::string strURLIn, int nBlockStartIn, int nBlockEndIn, CScript addressIn, CAmount nAmountIn, uint256 nFeeTXHashIn)
-{
- strProposalName = strProposalNameIn;
- strURL = strURLIn;
- nBlockStart = nBlockStartIn;
- nBlockEnd = nBlockEndIn;
- address = addressIn;
- nAmount = nAmountIn;
- nFeeTXHash = nFeeTXHashIn;
- fValid = true;
-}
-
CBudgetProposal::CBudgetProposal(const CBudgetProposal& other)
{
strProposalName = other.strProposalName;
@@ -1291,6 +1279,23 @@ CBudgetProposal::CBudgetProposal(const CBudgetProposal& other)
fValid = true;
}
+CBudgetProposal::CBudgetProposal(std::string strProposalNameIn, std::string strURLIn, int nPaymentCount, CScript addressIn, CAmount nAmountIn, int nBlockStartIn, uint256 nFeeTXHashIn)
+{
+ strProposalName = strProposalNameIn;
+ strURL = strURLIn;
+
+ nBlockStart = nBlockStartIn;
+
+ int nPaymentsStart = nBlockStart - nBlockStart % GetBudgetPaymentCycleBlocks();
+ //calculate the end of the cycle for this vote, add half a cycle (vote will be deleted after that block)
+ nBlockEnd = nPaymentsStart + GetBudgetPaymentCycleBlocks() * nPaymentCount + GetBudgetPaymentCycleBlocks()/2;
+
+ address = addressIn;
+ nAmount = nAmountIn;
+
+ nFeeTXHash = nFeeTXHashIn;
+}
+
bool CBudgetProposal::IsValid(std::string& strError, bool fCheckCollateral)
{
if(GetNays() - GetYeas() > mnodeman.CountEnabled(MIN_BUDGET_PEER_PROTO_VERSION)/10){
@@ -1303,18 +1308,52 @@ bool CBudgetProposal::IsValid(std::string& strError, bool fCheckCollateral)
return false;
}
+ CBlockIndex* pindexPrev = chainActive.Tip();
+ if(pindexPrev == NULL) {strError = "Tip is NULL"; return true;}
+
+ if(nBlockStart % GetBudgetPaymentCycleBlocks() != 0){
+ int nNext = pindexPrev->nHeight - pindexPrev->nHeight % GetBudgetPaymentCycleBlocks() + GetBudgetPaymentCycleBlocks();
+ strError = strprintf("Invalid block start - must be a budget cycle block. Next valid block: %d", nNext);
+ return false;
+ }
+
+ if(nBlockEnd % GetBudgetPaymentCycleBlocks() != GetBudgetPaymentCycleBlocks()/2){
+ strError = "Invalid block end";
+ return false;
+ }
+
if(nBlockEnd < nBlockStart) {
- strError = "Invalid nBlockEnd";
+ strError = "Invalid block end - must be greater then block start.";
return false;
}
if(nAmount < 1*COIN) {
- strError = "Invalid nAmount";
+ strError = "Invalid proposal amount";
+ return false;
+ }
+
+ if(strProposalName.size() > 20) {
+ strError = "Invalid proposal name, limit of 20 characters.";
+ return false;
+ }
+
+ if(strProposalName != SanitizeString(strProposalName)) {
+ strError = "Invalid proposal name, unsafe characters found.";
+ return false;
+ }
+
+ if(strURL.size() > 64) {
+ strError = "Invalid proposal url, limit of 64 characters.";
+ return false;
+ }
+
+ if(strURL != SanitizeString(strURL)) {
+ strError = "Invalid proposal url, unsafe characters found.";
return false;
}
if(address == CScript()) {
- strError = "Invalid Payment Address";
+ strError = "Invalid proposal Payment Address";
return false;
}
@@ -1349,9 +1388,6 @@ bool CBudgetProposal::IsValid(std::string& strError, bool fCheckCollateral)
return false;
}
- CBlockIndex* pindexPrev = chainActive.Tip();
- if(pindexPrev == NULL) {strError = "Tip is NULL"; return true;}
-
if(GetBlockEnd() < pindexPrev->nHeight - GetBudgetPaymentCycleBlocks()/2 ) return false;
@@ -1366,12 +1402,12 @@ bool CBudgetProposal::AddOrUpdateVote(CBudgetVote& vote, std::string& strError)
if(mapVotes.count(hash)){
if(mapVotes[hash].nTime > vote.nTime){
- strError = strprintf("new vote older than existing vote - %s\n", vote.GetHash().ToString());
+ strError = strprintf("new vote older than existing vote - %s", vote.GetHash().ToString());
LogPrint("mnbudget", "CBudgetProposal::AddOrUpdateVote - %s\n", strError);
return false;
}
if(vote.nTime - mapVotes[hash].nTime < BUDGET_VOTE_UPDATE_MIN){
- strError = strprintf("time between votes is too soon - %s - %lli\n", vote.GetHash().ToString(), vote.nTime - mapVotes[hash].nTime);
+ strError = strprintf("time between votes is too soon - %s - %lli", vote.GetHash().ToString(), vote.nTime - mapVotes[hash].nTime);
LogPrint("mnbudget", "CBudgetProposal::AddOrUpdateVote - %s\n", strError);
return false;
}
@@ -1492,23 +1528,6 @@ int CBudgetProposal::GetRemainingPaymentCount()
return std::min(nPayments, GetTotalPaymentCount());
}
-CBudgetProposalBroadcast::CBudgetProposalBroadcast(std::string strProposalNameIn, std::string strURLIn, int nPaymentCount, CScript addressIn, CAmount nAmountIn, int nBlockStartIn, uint256 nFeeTXHashIn)
-{
- strProposalName = strProposalNameIn;
- strURL = strURLIn;
-
- nBlockStart = nBlockStartIn;
-
- int nCycleStart = nBlockStart - nBlockStart % GetBudgetPaymentCycleBlocks();
- //calculate the end of the cycle for this vote, add half a cycle (vote will be deleted after that block)
- nBlockEnd = nCycleStart + GetBudgetPaymentCycleBlocks() * nPaymentCount + GetBudgetPaymentCycleBlocks()/2;
-
- address = addressIn;
- nAmount = nAmountIn;
-
- nFeeTXHash = nFeeTXHashIn;
-}
-
void CBudgetProposalBroadcast::Relay()
{
CInv inv(MSG_BUDGET_PROPOSAL, GetHash());
@@ -1617,19 +1636,19 @@ bool CFinalizedBudget::AddOrUpdateVote(CFinalizedBudgetVote& vote, std::string&
uint256 hash = vote.vin.prevout.GetHash();
if(mapVotes.count(hash)){
if(mapVotes[hash].nTime > vote.nTime){
- strError = strprintf("new vote older than existing vote - %s\n", vote.GetHash().ToString());
+ strError = strprintf("new vote older than existing vote - %s", vote.GetHash().ToString());
LogPrint("mnbudget", "CFinalizedBudget::AddOrUpdateVote - %s\n", strError);
return false;
}
if(vote.nTime - mapVotes[hash].nTime < BUDGET_VOTE_UPDATE_MIN){
- strError = strprintf("time between votes is too soon - %s - %lli\n", vote.GetHash().ToString(), vote.nTime - mapVotes[hash].nTime);
+ strError = strprintf("time between votes is too soon - %s - %lli", vote.GetHash().ToString(), vote.nTime - mapVotes[hash].nTime);
LogPrint("mnbudget", "CFinalizedBudget::AddOrUpdateVote - %s\n", strError);
return false;
}
}
if(vote.nTime > GetTime() + (60*60)){
- strError = strprintf("new vote is too far ahead of current time - %s - nTime %lli - Max Time %lli\n", vote.GetHash().ToString(), vote.nTime, GetTime() + (60*60));
+ strError = strprintf("new vote is too far ahead of current time - %s - nTime %lli - Max Time %lli", vote.GetHash().ToString(), vote.nTime, GetTime() + (60*60));
LogPrint("mnbudget", "CFinalizedBudget::AddOrUpdateVote - %s\n", strError);
return false;
}
diff --git a/src/masternode-budget.h b/src/masternode-budget.h
index e75d36b7440a..b89305d006b6 100644
--- a/src/masternode-budget.h
+++ b/src/masternode-budget.h
@@ -415,7 +415,7 @@ class CBudgetProposal
CBudgetProposal();
CBudgetProposal(const CBudgetProposal& other);
- CBudgetProposal(std::string strProposalNameIn, std::string strURLIn, int nBlockStartIn, int nBlockEndIn, CScript addressIn, CAmount nAmountIn, uint256 nFeeTXHashIn);
+ CBudgetProposal(std::string strProposalNameIn, std::string strURLIn, int nPaymentCount, CScript addressIn, CAmount nAmountIn, int nBlockStartIn, uint256 nFeeTXHashIn);
void Calculate();
bool AddOrUpdateVote(CBudgetVote& vote, std::string& strError);
@@ -492,7 +492,7 @@ class CBudgetProposalBroadcast : public CBudgetProposal
CBudgetProposalBroadcast() : CBudgetProposal(){}
CBudgetProposalBroadcast(const CBudgetProposal& other) : CBudgetProposal(other){}
CBudgetProposalBroadcast(const CBudgetProposalBroadcast& other) : CBudgetProposal(other){}
- CBudgetProposalBroadcast(std::string strProposalNameIn, std::string strURLIn, int nPaymentCount, CScript addressIn, CAmount nAmountIn, int nBlockStartIn, uint256 nFeeTXHashIn);
+ CBudgetProposalBroadcast(std::string strProposalNameIn, std::string strURLIn, int nPaymentCount, CScript addressIn, CAmount nAmountIn, int nBlockStartIn, uint256 nFeeTXHashIn) {}
void swap(CBudgetProposalBroadcast& first, CBudgetProposalBroadcast& second) // nothrow
{
diff --git a/src/masternode.cpp b/src/masternode.cpp
index f65f052c1d26..c7bd925ecd23 100644
--- a/src/masternode.cpp
+++ b/src/masternode.cpp
@@ -73,8 +73,6 @@ CMasternode::CMasternode()
nScanningErrorCount = 0;
nLastScanningErrorBlockHeight = 0;
lastTimeChecked = 0;
- nLastDsee = 0;// temporary, do not save. Remove after migration to v12
- nLastDseep = 0;// temporary, do not save. Remove after migration to v12
}
CMasternode::CMasternode(const CMasternode& other)
@@ -97,8 +95,6 @@ CMasternode::CMasternode(const CMasternode& other)
nScanningErrorCount = other.nScanningErrorCount;
nLastScanningErrorBlockHeight = other.nLastScanningErrorBlockHeight;
lastTimeChecked = 0;
- nLastDsee = other.nLastDsee;// temporary, do not save. Remove after migration to v12
- nLastDseep = other.nLastDseep;// temporary, do not save. Remove after migration to v12
}
CMasternode::CMasternode(const CMasternodeBroadcast& mnb)
@@ -121,8 +117,6 @@ CMasternode::CMasternode(const CMasternodeBroadcast& mnb)
nScanningErrorCount = 0;
nLastScanningErrorBlockHeight = 0;
lastTimeChecked = 0;
- nLastDsee = 0;// temporary, do not save. Remove after migration to v12
- nLastDseep = 0;// temporary, do not save. Remove after migration to v12
}
//
@@ -189,6 +183,10 @@ void CMasternode::Check(bool forceCheck)
//once spent, stop doing the checks
if(activeState == MASTERNODE_VIN_SPENT) return;
+ if(lastPing.sigTime - sigTime < MASTERNODE_MIN_MNP_SECONDS){
+ activeState = MASTERNODE_PRE_ENABLED;
+ return;
+ }
if(!IsPingedWithin(MASTERNODE_REMOVAL_SECONDS)){
activeState = MASTERNODE_REMOVE;
@@ -398,7 +396,7 @@ bool CMasternodeBroadcast::CheckAndUpdate(int& nDos)
//search existing Masternode list, this is where we update existing Masternodes with new mnb broadcasts
CMasternode* pmn = mnodeman.Find(vin);
- // no such masternode or it's not enabled already, nothing to update
+ // no such masternode or it's not enabled yet/already, nothing to update
if(pmn == NULL || (pmn != NULL && !pmn->IsEnabled())) return true;
// mn.pubkey = pubkey, IsVinAssociatedWithPubkey is validated once below,
@@ -427,8 +425,8 @@ bool CMasternodeBroadcast::CheckInputsAndAdd(int& nDoS)
CMasternode* pmn = mnodeman.Find(vin);
if(pmn != NULL) {
- // nothing to do here if we already know about this masternode and it's enabled
- if(pmn->IsEnabled()) return true;
+ // nothing to do here if we already know about this masternode and it's (pre)enabled
+ if(pmn->IsEnabled() || pmn->IsPreEnabled()) return true;
// if it's not enabled, remove old MN first and continue
else mnodeman.Remove(pmn->vin);
}
@@ -588,7 +586,7 @@ bool CMasternodePing::CheckAndUpdate(int& nDos, bool fRequireEnabled)
CMasternode* pmn = mnodeman.Find(vin);
if(pmn != NULL && pmn->protocolVersion >= masternodePayments.GetMinMasternodePaymentsProto())
{
- if (fRequireEnabled && !pmn->IsEnabled()) return false;
+ if (fRequireEnabled && !pmn->IsEnabled() && !pmn->IsPreEnabled()) return false;
// LogPrintf("mnping - Found corresponding mn for vin: %s\n", vin.ToString());
// update only if there is no known ping for this masternode or
diff --git a/src/masternode.h b/src/masternode.h
index 0bdf396691a4..281cb20608e7 100644
--- a/src/masternode.h
+++ b/src/masternode.h
@@ -111,11 +111,12 @@ class CMasternode
int64_t lastTimeChecked;
public:
enum state {
- MASTERNODE_ENABLED = 1,
- MASTERNODE_EXPIRED = 2,
- MASTERNODE_VIN_SPENT = 3,
- MASTERNODE_REMOVE = 4,
- MASTERNODE_POS_ERROR = 5
+ MASTERNODE_PRE_ENABLED,
+ MASTERNODE_ENABLED,
+ MASTERNODE_EXPIRED,
+ MASTERNODE_VIN_SPENT,
+ MASTERNODE_REMOVE,
+ MASTERNODE_POS_ERROR
};
CTxIn vin;
@@ -135,9 +136,6 @@ class CMasternode
int nLastScanningErrorBlockHeight;
CMasternodePing lastPing;
- int64_t nLastDsee;// temporary, do not save. Remove after migration to v12
- int64_t nLastDseep;// temporary, do not save. Remove after migration to v12
-
CMasternode();
CMasternode(const CMasternode& other);
CMasternode(const CMasternodeBroadcast& mnb);
@@ -246,6 +244,11 @@ class CMasternode
return activeState == MASTERNODE_ENABLED;
}
+ bool IsPreEnabled()
+ {
+ return activeState == MASTERNODE_PRE_ENABLED;
+ }
+
int GetMasternodeInputAge()
{
if(chainActive.Tip() == NULL) return 0;
@@ -259,13 +262,14 @@ class CMasternode
}
std::string Status() {
- std::string strStatus = "ACTIVE";
-
- if(activeState == CMasternode::MASTERNODE_ENABLED) strStatus = "ENABLED";
- if(activeState == CMasternode::MASTERNODE_EXPIRED) strStatus = "EXPIRED";
- if(activeState == CMasternode::MASTERNODE_VIN_SPENT) strStatus = "VIN_SPENT";
- if(activeState == CMasternode::MASTERNODE_REMOVE) strStatus = "REMOVE";
- if(activeState == CMasternode::MASTERNODE_POS_ERROR) strStatus = "POS_ERROR";
+ std::string strStatus = "unknown";
+
+ if(activeState == CMasternode::MASTERNODE_PRE_ENABLED) strStatus = "PRE_ENABLED";
+ if(activeState == CMasternode::MASTERNODE_ENABLED) strStatus = "ENABLED";
+ if(activeState == CMasternode::MASTERNODE_EXPIRED) strStatus = "EXPIRED";
+ if(activeState == CMasternode::MASTERNODE_VIN_SPENT) strStatus = "VIN_SPENT";
+ if(activeState == CMasternode::MASTERNODE_REMOVE) strStatus = "REMOVE";
+ if(activeState == CMasternode::MASTERNODE_POS_ERROR) strStatus = "POS_ERROR";
return strStatus;
}
diff --git a/src/masternodeman.cpp b/src/masternodeman.cpp
index 35eef991acff..70f23ac26a34 100644
--- a/src/masternodeman.cpp
+++ b/src/masternodeman.cpp
@@ -210,7 +210,7 @@ bool CMasternodeMan::Add(CMasternode &mn)
{
LOCK(cs);
- if (!mn.IsEnabled())
+ if (!mn.IsEnabled() && !mn.IsPreEnabled())
return false;
CMasternode *pmn = Find(mn.vin);
@@ -799,294 +799,6 @@ void CMasternodeMan::ProcessMessage(CNode* pfrom, std::string& strCommand, CData
LogPrintf("dseg - Sent %d Masternode entries to %s\n", nInvCount, pfrom->addr.ToString());
}
}
- /*
- * IT'S SAFE TO REMOVE THIS IN FURTHER VERSIONS
- * AFTER MIGRATION TO V12 IS DONE
- */
-
- // Light version for OLD MASSTERNODES - fake pings, no self-activation
- else if (strCommand == "dsee") { //DarkSend Election Entry
-
- if(IsSporkActive(SPORK_10_MASTERNODE_PAY_UPDATED_NODES)) return;
-
- CTxIn vin;
- CService addr;
- CPubKey pubkey;
- CPubKey pubkey2;
- vector vchSig;
- int64_t sigTime;
- int count;
- int current;
- int64_t lastUpdated;
- int protocolVersion;
- CScript donationAddress;
- int donationPercentage;
- std::string strMessage;
-
- vRecv >> vin >> addr >> vchSig >> sigTime >> pubkey >> pubkey2 >> count >> current >> lastUpdated >> protocolVersion >> donationAddress >> donationPercentage;
-
- // make sure signature isn't in the future (past is OK)
- if (sigTime > GetAdjustedTime() + 60 * 60) {
- LogPrintf("dsee - Signature rejected, too far into the future %s\n", vin.ToString().c_str());
- Misbehaving(pfrom->GetId(), 1);
- return;
- }
-
- std::string vchPubKey(pubkey.begin(), pubkey.end());
- std::string vchPubKey2(pubkey2.begin(), pubkey2.end());
-
- strMessage = addr.ToString() + boost::lexical_cast(sigTime) + vchPubKey + vchPubKey2 + boost::lexical_cast(protocolVersion) + donationAddress.ToString() + boost::lexical_cast(donationPercentage);
-
- if(protocolVersion < masternodePayments.GetMinMasternodePaymentsProto()) {
- LogPrintf("dsee - ignoring outdated Masternode %s protocol version %d < %d\n", vin.ToString().c_str(), protocolVersion, masternodePayments.GetMinMasternodePaymentsProto());
- Misbehaving(pfrom->GetId(), 1);
- return;
- }
-
- CScript pubkeyScript;
- pubkeyScript = GetScriptForDestination(pubkey.GetID());
-
- if(pubkeyScript.size() != 25) {
- LogPrintf("dsee - pubkey the wrong size\n");
- Misbehaving(pfrom->GetId(), 100);
- return;
- }
-
- CScript pubkeyScript2;
- pubkeyScript2 = GetScriptForDestination(pubkey2.GetID());
-
- if(pubkeyScript2.size() != 25) {
- LogPrintf("dsee - pubkey2 the wrong size\n");
- Misbehaving(pfrom->GetId(), 100);
- return;
- }
-
- if(!vin.scriptSig.empty()) {
- LogPrintf("dsee - Ignore Not Empty ScriptSig %s\n",vin.ToString());
- Misbehaving(pfrom->GetId(), 100);
- return;
- }
-
- std::string errorMessage = "";
- if(!darkSendSigner.VerifyMessage(pubkey, vchSig, strMessage, errorMessage)){
- LogPrintf("dsee - Got bad Masternode address signature\n");
- Misbehaving(pfrom->GetId(), 100);
- return;
- }
-
- if(Params().NetworkID() == CBaseChainParams::MAIN){
- if(addr.GetPort() != 9999) return;
- } else if(addr.GetPort() == 9999) return;
-
- //search existing Masternode list, this is where we update existing Masternodes with new dsee broadcasts
- CMasternode* pmn = this->Find(vin);
- if(pmn != NULL)
- {
- // count == -1 when it's a new entry
- // e.g. We don't want the entry relayed/time updated when we're syncing the list
- // mn.pubkey = pubkey, IsVinAssociatedWithPubkey is validated once below,
- // after that they just need to match
- if(count == -1 && pmn->pubkey == pubkey && (GetAdjustedTime() - pmn->nLastDsee > MASTERNODE_MIN_MNB_SECONDS)){
- if(pmn->protocolVersion > GETHEADERS_VERSION && sigTime - pmn->lastPing.sigTime < MASTERNODE_MIN_MNB_SECONDS) return;
- if(pmn->nLastDsee < sigTime){ //take the newest entry
- LogPrintf("dsee - Got updated entry for %s\n", addr.ToString().c_str());
- if(pmn->protocolVersion < GETHEADERS_VERSION) {
- pmn->pubkey2 = pubkey2;
- pmn->sigTime = sigTime;
- pmn->sig = vchSig;
- pmn->protocolVersion = protocolVersion;
- pmn->addr = addr;
- //fake ping
- pmn->lastPing = CMasternodePing(vin);
- }
- pmn->nLastDsee = sigTime;
- pmn->Check();
- if(pmn->IsEnabled()) {
- TRY_LOCK(cs_vNodes, lockNodes);
- if(!lockNodes) return;
- BOOST_FOREACH(CNode* pnode, vNodes)
- if(pnode->nVersion >= masternodePayments.GetMinMasternodePaymentsProto())
- pnode->PushMessage("dsee", vin, addr, vchSig, sigTime, pubkey, pubkey2, count, current, lastUpdated, protocolVersion, donationAddress, donationPercentage);
- }
- }
- }
-
- return;
- }
-
- static std::map mapSeenDsee;
- if(mapSeenDsee.count(vin.prevout) && mapSeenDsee[vin.prevout] == pubkey) {
- LogPrint("mastenrode", "dsee - already seen this vin %s\n", vin.prevout.ToString());
- return;
- }
- mapSeenDsee.insert(make_pair(vin.prevout, pubkey));
- // make sure the vout that was signed is related to the transaction that spawned the Masternode
- // - this is expensive, so it's only done once per Masternode
- if(!darkSendSigner.IsVinAssociatedWithPubkey(vin, pubkey)) {
- LogPrintf("dsee - Got mismatched pubkey and vin\n");
- Misbehaving(pfrom->GetId(), 100);
- return;
- }
-
-
- LogPrint("masternode", "dsee - Got NEW OLD Masternode entry %s\n", addr.ToString().c_str());
-
- // make sure it's still unspent
- // - this is checked later by .check() in many places and by ThreadCheckDarkSendPool()
-
- CValidationState state;
- CMutableTransaction tx = CMutableTransaction();
- CTxOut vout = CTxOut(999.99*COIN, darkSendPool.collateralPubKey);
- tx.vin.push_back(vin);
- tx.vout.push_back(vout);
-
- bool fAcceptable = false;
- {
- TRY_LOCK(cs_main, lockMain);
- if(!lockMain) return;
- fAcceptable = AcceptableInputs(mempool, state, CTransaction(tx), false, NULL);
- }
-
- if(fAcceptable){
- if(GetInputAge(vin) < MASTERNODE_MIN_CONFIRMATIONS){
- LogPrintf("dsee - Input must have least %d confirmations\n", MASTERNODE_MIN_CONFIRMATIONS);
- Misbehaving(pfrom->GetId(), 20);
- return;
- }
-
- // verify that sig time is legit in past
- // should be at least not earlier than block when 1000 DASH tx got MASTERNODE_MIN_CONFIRMATIONS
- uint256 hashBlock = 0;
- CTransaction tx2;
- GetTransaction(vin.prevout.hash, tx2, hashBlock, true);
- BlockMap::iterator mi = mapBlockIndex.find(hashBlock);
- if (mi != mapBlockIndex.end() && (*mi).second)
- {
- CBlockIndex* pMNIndex = (*mi).second; // block for 1000 DASH tx -> 1 confirmation
- CBlockIndex* pConfIndex = chainActive[pMNIndex->nHeight + MASTERNODE_MIN_CONFIRMATIONS - 1]; // block where tx got MASTERNODE_MIN_CONFIRMATIONS
- if(pConfIndex->GetBlockTime() > sigTime)
- {
- LogPrintf("mnb - Bad sigTime %d for Masternode %20s %105s (%i conf block is at %d)\n",
- sigTime, addr.ToString(), vin.ToString(), MASTERNODE_MIN_CONFIRMATIONS, pConfIndex->GetBlockTime());
- return;
- }
- }
-
- // use this as a peer
- addrman.Add(CAddress(addr), pfrom->addr, 2*60*60);
-
- // add Masternode
- CMasternode mn = CMasternode();
- mn.addr = addr;
- mn.vin = vin;
- mn.pubkey = pubkey;
- mn.sig = vchSig;
- mn.sigTime = sigTime;
- mn.pubkey2 = pubkey2;
- mn.protocolVersion = protocolVersion;
- // fake ping
- mn.lastPing = CMasternodePing(vin);
- mn.Check(true);
- // add v11 masternodes, v12 should be added by mnb only
- if(protocolVersion < GETHEADERS_VERSION) {
- LogPrint("masternode", "dsee - Accepted OLD Masternode entry %i %i\n", count, current);
- Add(mn);
- }
- if(mn.IsEnabled()) {
- TRY_LOCK(cs_vNodes, lockNodes);
- if(!lockNodes) return;
- BOOST_FOREACH(CNode* pnode, vNodes)
- if(pnode->nVersion >= masternodePayments.GetMinMasternodePaymentsProto())
- pnode->PushMessage("dsee", vin, addr, vchSig, sigTime, pubkey, pubkey2, count, current, lastUpdated, protocolVersion, donationAddress, donationPercentage);
- }
- } else {
- LogPrintf("dsee - Rejected Masternode entry %s\n", addr.ToString().c_str());
-
- int nDoS = 0;
- if (state.IsInvalid(nDoS))
- {
- LogPrintf("dsee - %s from %s %s was not accepted into the memory pool\n", tx.GetHash().ToString().c_str(),
- pfrom->addr.ToString().c_str(), pfrom->cleanSubVer.c_str());
- if (nDoS > 0)
- Misbehaving(pfrom->GetId(), nDoS);
- }
- }
- }
-
- else if (strCommand == "dseep") { //DarkSend Election Entry Ping
-
- if(IsSporkActive(SPORK_10_MASTERNODE_PAY_UPDATED_NODES)) return;
-
- CTxIn vin;
- vector vchSig;
- int64_t sigTime;
- bool stop;
- vRecv >> vin >> vchSig >> sigTime >> stop;
-
- //LogPrintf("dseep - Received: vin: %s sigTime: %lld stop: %s\n", vin.ToString().c_str(), sigTime, stop ? "true" : "false");
-
- if (sigTime > GetAdjustedTime() + 60 * 60) {
- LogPrintf("dseep - Signature rejected, too far into the future %s\n", vin.ToString().c_str());
- Misbehaving(pfrom->GetId(), 1);
- return;
- }
-
- if (sigTime <= GetAdjustedTime() - 60 * 60) {
- LogPrintf("dseep - Signature rejected, too far into the past %s - %d %d \n", vin.ToString().c_str(), sigTime, GetAdjustedTime());
- Misbehaving(pfrom->GetId(), 1);
- return;
- }
-
- std::map::iterator i = mWeAskedForMasternodeListEntry.find(vin.prevout);
- if (i != mWeAskedForMasternodeListEntry.end())
- {
- int64_t t = (*i).second;
- if (GetTime() < t) return; // we've asked recently
- }
-
- // see if we have this Masternode
- CMasternode* pmn = this->Find(vin);
- if(pmn != NULL && pmn->protocolVersion >= masternodePayments.GetMinMasternodePaymentsProto())
- {
- // LogPrintf("dseep - Found corresponding mn for vin: %s\n", vin.ToString().c_str());
- // take this only if it's newer
- if(sigTime - pmn->nLastDseep > MASTERNODE_MIN_MNP_SECONDS)
- {
- std::string strMessage = pmn->addr.ToString() + boost::lexical_cast(sigTime) + boost::lexical_cast(stop);
-
- std::string errorMessage = "";
- if(!darkSendSigner.VerifyMessage(pmn->pubkey2, vchSig, strMessage, errorMessage))
- {
- LogPrintf("dseep - Got bad Masternode address signature %s \n", vin.ToString().c_str());
- //Misbehaving(pfrom->GetId(), 100);
- return;
- }
-
- // fake ping for v11 masternodes, ignore for v12
- if(pmn->protocolVersion < GETHEADERS_VERSION) pmn->lastPing = CMasternodePing(vin);
- pmn->nLastDseep = sigTime;
- pmn->Check();
- if(pmn->IsEnabled()) {
- TRY_LOCK(cs_vNodes, lockNodes);
- if(!lockNodes) return;
- LogPrint("masternode", "dseep - relaying %s \n", vin.ToString().c_str());
- BOOST_FOREACH(CNode* pnode, vNodes)
- if(pnode->nVersion >= masternodePayments.GetMinMasternodePaymentsProto())
- pnode->PushMessage("dseep", vin, vchSig, sigTime, stop);
- }
- }
- return;
- }
-
- LogPrint("masternode", "dseep - Couldn't find Masternode entry %s %s\n", vin.ToString(), pfrom->addr.ToString());
-
- AskForMN(pfrom, vin);
- }
-
- /*
- * END OF "REMOVE"
- */
-
}
void CMasternodeMan::Remove(CTxIn vin)
diff --git a/src/primitives/transaction.h b/src/primitives/transaction.h
index af2c09738812..3c207785d93a 100644
--- a/src/primitives/transaction.h
+++ b/src/primitives/transaction.h
@@ -99,6 +99,11 @@ class CTxIn
return !(a == b);
}
+ friend bool operator<(const CTxIn& a, const CTxIn& b)
+ {
+ return a.prevoutsetupUi(this);
-
+ QString theme = GUIUtil::getThemeName();
+
#ifdef Q_OS_MAC // Icons on push buttons are very uncommon on Mac
ui->newAddress->setIcon(QIcon());
ui->copyAddress->setIcon(QIcon());
ui->deleteAddress->setIcon(QIcon());
ui->exportButton->setIcon(QIcon());
+#else
+ ui->newAddress->setIcon(QIcon(":/icons/" + theme + "/add"));
+ ui->copyAddress->setIcon(QIcon(":/icons/" + theme + "/editcopy"));
+ ui->deleteAddress->setIcon(QIcon(":/icons/" + theme + "/remove"));
+ ui->exportButton->setIcon(QIcon(":/icons/" + theme + "/export"));
#endif
switch(mode)
diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp
index 754a6604236a..489f9f52b522 100644
--- a/src/qt/bitcoingui.cpp
+++ b/src/qt/bitcoingui.cpp
@@ -222,6 +222,7 @@ BitcoinGUI::BitcoinGUI(const NetworkStyle *networkStyle, QWidget *parent) :
connect(openPeersAction, SIGNAL(triggered()), rpcConsole, SLOT(showPeers()));
connect(openRepairAction, SIGNAL(triggered()), rpcConsole, SLOT(showRepair()));
connect(openConfEditorAction, SIGNAL(triggered()), rpcConsole, SLOT(showConfEditor()));
+ connect(openMNConfEditorAction, SIGNAL(triggered()), rpcConsole, SLOT(showMNConfEditor()));
connect(showBackupsAction, SIGNAL(triggered()), rpcConsole, SLOT(showBackups()));
connect(labelConnectionsIcon, SIGNAL(clicked()), rpcConsole, SLOT(showPeers()));
@@ -259,7 +260,8 @@ void BitcoinGUI::createActions(const NetworkStyle *networkStyle)
{
QActionGroup *tabGroup = new QActionGroup(this);
- overviewAction = new QAction(QIcon(":/icons/overview"), tr("&Overview"), this);
+ QString theme = GUIUtil::getThemeName();
+ overviewAction = new QAction(QIcon(":/icons/" + theme + "/overview"), tr("&Overview"), this);
overviewAction->setStatusTip(tr("Show general overview of wallet"));
overviewAction->setToolTip(overviewAction->statusTip());
overviewAction->setCheckable(true);
@@ -270,7 +272,7 @@ void BitcoinGUI::createActions(const NetworkStyle *networkStyle)
#endif
tabGroup->addAction(overviewAction);
- sendCoinsAction = new QAction(QIcon(":/icons/send"), tr("&Send"), this);
+ sendCoinsAction = new QAction(QIcon(":/icons/" + theme + "/send"), tr("&Send"), this);
sendCoinsAction->setStatusTip(tr("Send coins to a Dash address"));
sendCoinsAction->setToolTip(sendCoinsAction->statusTip());
sendCoinsAction->setCheckable(true);
@@ -281,7 +283,7 @@ void BitcoinGUI::createActions(const NetworkStyle *networkStyle)
#endif
tabGroup->addAction(sendCoinsAction);
- receiveCoinsAction = new QAction(QIcon(":/icons/receiving_addresses"), tr("&Receive"), this);
+ receiveCoinsAction = new QAction(QIcon(":/icons/" + theme + "/receiving_addresses"), tr("&Receive"), this);
receiveCoinsAction->setStatusTip(tr("Request payments (generates QR codes and dash: URIs)"));
receiveCoinsAction->setToolTip(receiveCoinsAction->statusTip());
receiveCoinsAction->setCheckable(true);
@@ -292,7 +294,7 @@ void BitcoinGUI::createActions(const NetworkStyle *networkStyle)
#endif
tabGroup->addAction(receiveCoinsAction);
- historyAction = new QAction(QIcon(":/icons/history"), tr("&Transactions"), this);
+ historyAction = new QAction(QIcon(":/icons/" + theme + "/history"), tr("&Transactions"), this);
historyAction->setStatusTip(tr("Browse transaction history"));
historyAction->setToolTip(historyAction->statusTip());
historyAction->setCheckable(true);
@@ -316,7 +318,7 @@ void BitcoinGUI::createActions(const NetworkStyle *networkStyle)
connect(historyAction, SIGNAL(triggered()), this, SLOT(gotoHistoryPage()));
#endif // ENABLE_WALLET
- quitAction = new QAction(QIcon(":/icons/quit"), tr("E&xit"), this);
+ quitAction = new QAction(QIcon(":/icons/" + theme + "/quit"), tr("E&xit"), this);
quitAction->setStatusTip(tr("Quit application"));
quitAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Q));
quitAction->setMenuRole(QAction::QuitRole);
@@ -330,45 +332,47 @@ void BitcoinGUI::createActions(const NetworkStyle *networkStyle)
#endif
aboutQtAction->setStatusTip(tr("Show information about Qt"));
aboutQtAction->setMenuRole(QAction::AboutQtRole);
- optionsAction = new QAction(QIcon(":/icons/options"), tr("&Options..."), this);
+ optionsAction = new QAction(QIcon(":/icons/" + theme + "/options"), tr("&Options..."), this);
optionsAction->setStatusTip(tr("Modify configuration options for Dash"));
optionsAction->setMenuRole(QAction::PreferencesRole);
toggleHideAction = new QAction(networkStyle->getAppIcon(), tr("&Show / Hide"), this);
toggleHideAction->setStatusTip(tr("Show or hide the main Window"));
- encryptWalletAction = new QAction(QIcon(":/icons/lock_closed"), tr("&Encrypt Wallet..."), this);
+ encryptWalletAction = new QAction(QIcon(":/icons/" + theme + "/lock_closed"), tr("&Encrypt Wallet..."), this);
encryptWalletAction->setStatusTip(tr("Encrypt the private keys that belong to your wallet"));
encryptWalletAction->setCheckable(true);
- backupWalletAction = new QAction(QIcon(":/icons/filesave"), tr("&Backup Wallet..."), this);
+ backupWalletAction = new QAction(QIcon(":/icons/" + theme + "/filesave"), tr("&Backup Wallet..."), this);
backupWalletAction->setStatusTip(tr("Backup wallet to another location"));
- changePassphraseAction = new QAction(QIcon(":/icons/key"), tr("&Change Passphrase..."), this);
+ changePassphraseAction = new QAction(QIcon(":/icons/" + theme + "/key"), tr("&Change Passphrase..."), this);
changePassphraseAction->setStatusTip(tr("Change the passphrase used for wallet encryption"));
unlockWalletAction = new QAction(tr("&Unlock Wallet..."), this);
unlockWalletAction->setToolTip(tr("Unlock wallet"));
lockWalletAction = new QAction(tr("&Lock Wallet"), this);
- signMessageAction = new QAction(QIcon(":/icons/edit"), tr("Sign &message..."), this);
+ signMessageAction = new QAction(QIcon(":/icons/" + theme + "/edit"), tr("Sign &message..."), this);
signMessageAction->setStatusTip(tr("Sign messages with your Dash addresses to prove you own them"));
- verifyMessageAction = new QAction(QIcon(":/icons/transaction_0"), tr("&Verify message..."), this);
+ verifyMessageAction = new QAction(QIcon(":/icons/" + theme + "/transaction_0"), tr("&Verify message..."), this);
verifyMessageAction->setStatusTip(tr("Verify messages to ensure they were signed with specified Dash addresses"));
openInfoAction = new QAction(QApplication::style()->standardIcon(QStyle::SP_MessageBoxInformation), tr("&Information"), this);
openInfoAction->setStatusTip(tr("Show diagnostic information"));
- openRPCConsoleAction = new QAction(QIcon(":/icons/debugwindow"), tr("&Debug console"), this);
+ openRPCConsoleAction = new QAction(QIcon(":/icons/" + theme + "/debugwindow"), tr("&Debug console"), this);
openRPCConsoleAction->setStatusTip(tr("Open debugging console"));
- openNetworkAction = new QAction(QIcon(":/icons/connect_4"), tr("&Network Monitor"), this);
+ openNetworkAction = new QAction(QIcon(":/icons/" + theme + "/connect_4"), tr("&Network Monitor"), this);
openNetworkAction->setStatusTip(tr("Show network monitor"));
- openPeersAction = new QAction(QIcon(":/icons/connect_4"), tr("&Peers list"), this);
+ openPeersAction = new QAction(QIcon(":/icons/" + theme + "/connect_4"), tr("&Peers list"), this);
openPeersAction->setStatusTip(tr("Show peers info"));
- openRepairAction = new QAction(QIcon(":/icons/options"), tr("Wallet &Repair"), this);
+ openRepairAction = new QAction(QIcon(":/icons/" + theme + "/options"), tr("Wallet &Repair"), this);
openRepairAction->setStatusTip(tr("Show wallet repair options"));
- openConfEditorAction = new QAction(QIcon(":/icons/edit"), tr("Open &Configuration File"), this);
+ openConfEditorAction = new QAction(QIcon(":/icons/" + theme + "/edit"), tr("Open Wallet &Configuration File"), this);
openConfEditorAction->setStatusTip(tr("Open configuration file"));
- showBackupsAction = new QAction(QIcon(":/icons/browse"), tr("Show Automatic &Backups"), this);
+ openMNConfEditorAction = new QAction(QIcon(":/icons/" + theme + "/edit"), tr("Open &Masternode Configuration File"), this);
+ openMNConfEditorAction->setStatusTip(tr("Open Masternode configuration file"));
+ showBackupsAction = new QAction(QIcon(":/icons/" + theme + "/browse"), tr("Show Automatic &Backups"), this);
showBackupsAction->setStatusTip(tr("Show automatically created wallet backups"));
- usedSendingAddressesAction = new QAction(QIcon(":/icons/address-book"), tr("&Sending addresses..."), this);
+ usedSendingAddressesAction = new QAction(QIcon(":/icons/" + theme + "/address-book"), tr("&Sending addresses..."), this);
usedSendingAddressesAction->setStatusTip(tr("Show the list of used sending addresses and labels"));
- usedReceivingAddressesAction = new QAction(QIcon(":/icons/address-book"), tr("&Receiving addresses..."), this);
+ usedReceivingAddressesAction = new QAction(QIcon(":/icons/" + theme + "/address-book"), tr("&Receiving addresses..."), this);
usedReceivingAddressesAction->setStatusTip(tr("Show the list of used receiving addresses and labels"));
openAction = new QAction(QApplication::style()->standardIcon(QStyle::SP_FileIcon), tr("Open &URI..."), this);
@@ -447,6 +451,7 @@ void BitcoinGUI::createMenuBar()
tools->addAction(openRepairAction);
tools->addSeparator();
tools->addAction(openConfEditorAction);
+ tools->addAction(openMNConfEditorAction);
tools->addAction(showBackupsAction);
}
@@ -615,6 +620,7 @@ void BitcoinGUI::createTrayIconMenu()
trayIconMenu->addAction(openRepairAction);
trayIconMenu->addSeparator();
trayIconMenu->addAction(openConfEditorAction);
+ trayIconMenu->addAction(openMNConfEditorAction);
trayIconMenu->addAction(showBackupsAction);
#ifndef Q_OS_MAC // This is built-in on Mac
trayIconMenu->addSeparator();
@@ -707,13 +713,14 @@ void BitcoinGUI::gotoVerifyMessageTab(QString addr)
void BitcoinGUI::setNumConnections(int count)
{
QString icon;
+ QString theme = GUIUtil::getThemeName();
switch(count)
{
- case 0: icon = ":/icons/connect_0"; break;
- case 1: case 2: case 3: icon = ":/icons/connect_1"; break;
- case 4: case 5: case 6: icon = ":/icons/connect_2"; break;
- case 7: case 8: case 9: icon = ":/icons/connect_3"; break;
- default: icon = ":/icons/connect_4"; break;
+ case 0: icon = ":/icons/" + theme + "/connect_0"; break;
+ case 1: case 2: case 3: icon = ":/icons/" + theme + "/connect_1"; break;
+ case 4: case 5: case 6: icon = ":/icons/" + theme + "/connect_2"; break;
+ case 7: case 8: case 9: icon = ":/icons/" + theme + "/connect_3"; break;
+ default: icon = ":/icons/" + theme + "/connect_4"; break;
}
QIcon connectionItem = QIcon(icon).pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE);
labelConnectionsIcon->setIcon(connectionItem);
@@ -755,7 +762,8 @@ void BitcoinGUI::setNumBlocks(int count)
tooltip = tr("Processed %n blocks of transaction history.", "", count);
// Set icon state: spinning if catching up, tick otherwise
-// if(secs < 25*60) // 90*60 for bitcoin but we are 4x times faster
+ QString theme = GUIUtil::getThemeName();
+ // if(secs < 25*60) // 90*60 for bitcoin but we are 4x times faster
if(masternodeSync.IsBlockchainSynced())
{
QString strSyncStatus;
@@ -764,7 +772,7 @@ void BitcoinGUI::setNumBlocks(int count)
if(masternodeSync.IsSynced()) {
progressBarLabel->setVisible(false);
progressBar->setVisible(false);
- labelBlocksIcon->setPixmap(QIcon(":/icons/synced").pixmap(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE));
+ labelBlocksIcon->setPixmap(QIcon(":/icons/" + theme + "/synced").pixmap(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE));
} else {
int nAttempt;
@@ -1008,6 +1016,7 @@ bool BitcoinGUI::handlePaymentRequest(const SendCoinsRecipient& recipient)
void BitcoinGUI::setEncryptionStatus(int status)
{
+ QString theme = GUIUtil::getThemeName();
switch(status)
{
case WalletModel::Unencrypted:
@@ -1020,7 +1029,7 @@ void BitcoinGUI::setEncryptionStatus(int status)
break;
case WalletModel::Unlocked:
labelEncryptionIcon->show();
- labelEncryptionIcon->setPixmap(QIcon(":/icons/lock_open").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE));
+ labelEncryptionIcon->setPixmap(QIcon(":/icons/" + theme + "/lock_open").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE));
labelEncryptionIcon->setToolTip(tr("Wallet is encrypted and currently unlocked"));
encryptWalletAction->setChecked(true);
changePassphraseAction->setEnabled(true);
@@ -1030,7 +1039,7 @@ void BitcoinGUI::setEncryptionStatus(int status)
break;
case WalletModel::UnlockedForAnonymizationOnly:
labelEncryptionIcon->show();
- labelEncryptionIcon->setPixmap(QIcon(":/icons/lock_open").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE));
+ labelEncryptionIcon->setPixmap(QIcon(":/icons/" + theme + "/lock_open").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE));
labelEncryptionIcon->setToolTip(tr("Wallet is encrypted and currently unlocked for anonimization only"));
encryptWalletAction->setChecked(true);
changePassphraseAction->setEnabled(true);
@@ -1040,7 +1049,7 @@ void BitcoinGUI::setEncryptionStatus(int status)
break;
case WalletModel::Locked:
labelEncryptionIcon->show();
- labelEncryptionIcon->setPixmap(QIcon(":/icons/lock_closed").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE));
+ labelEncryptionIcon->setPixmap(QIcon(":/icons/" + theme + "/lock_closed").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE));
labelEncryptionIcon->setToolTip(tr("Wallet is encrypted and currently locked"));
encryptWalletAction->setChecked(true);
changePassphraseAction->setEnabled(true);
@@ -1196,11 +1205,12 @@ void UnitDisplayStatusBarControl::setOptionsModel(OptionsModel *optionsModel)
/** When Display Units are changed on OptionsModel it will refresh the display text of the control on the status bar */
void UnitDisplayStatusBarControl::updateDisplayUnit(int newUnits)
{
+ QString theme = GUIUtil::getThemeName();
if(Params().NetworkID() == CBaseChainParams::MAIN){
- setPixmap(QIcon(":/icons/unit_" + BitcoinUnits::id(newUnits)).pixmap(39,STATUSBAR_ICONSIZE));
+ setPixmap(QIcon(":/icons/" + theme + "/unit_" + BitcoinUnits::id(newUnits)).pixmap(39,STATUSBAR_ICONSIZE));
}
else{
- setPixmap(QIcon(":/icons/unit_t" + BitcoinUnits::id(newUnits)).pixmap(39,STATUSBAR_ICONSIZE));
+ setPixmap(QIcon(":/icons/" + theme + "/unit_t" + BitcoinUnits::id(newUnits)).pixmap(39,STATUSBAR_ICONSIZE));
}
}
diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h
index d58c87cf7763..5696fc5b54f4 100644
--- a/src/qt/bitcoingui.h
+++ b/src/qt/bitcoingui.h
@@ -111,6 +111,7 @@ class BitcoinGUI : public QMainWindow
QAction *openPeersAction;
QAction *openRepairAction;
QAction *openConfEditorAction;
+ QAction *openMNConfEditorAction;
QAction *showBackupsAction;
QAction *openAction;
QAction *showHelpMessageAction;
diff --git a/src/qt/coincontroldialog.cpp b/src/qt/coincontroldialog.cpp
index f21483759f21..992bb4a5a5bc 100644
--- a/src/qt/coincontroldialog.cpp
+++ b/src/qt/coincontroldialog.cpp
@@ -217,6 +217,7 @@ void CoinControlDialog::buttonSelectAllClicked()
void CoinControlDialog::buttonToggleLockClicked()
{
QTreeWidgetItem *item;
+ QString theme = GUIUtil::getThemeName();
// Works in list-mode only
if(ui->radioListMode->isChecked()){
ui->treeWidget->setEnabled(false);
@@ -231,7 +232,7 @@ void CoinControlDialog::buttonToggleLockClicked()
else{
model->lockCoin(outpt);
item->setDisabled(true);
- item->setIcon(COLUMN_CHECKBOX, QIcon(":/icons/lock_closed"));
+ item->setIcon(COLUMN_CHECKBOX, QIcon(":/icons/" + theme + "/lock_closed"));
}
updateLabelLocked();
}
@@ -315,13 +316,14 @@ void CoinControlDialog::copyTransactionHash()
// context menu action: lock coin
void CoinControlDialog::lockCoin()
{
+ QString theme = GUIUtil::getThemeName();
if (contextMenuItem->checkState(COLUMN_CHECKBOX) == Qt::Checked)
contextMenuItem->setCheckState(COLUMN_CHECKBOX, Qt::Unchecked);
COutPoint outpt(uint256(contextMenuItem->text(COLUMN_TXHASH).toStdString()), contextMenuItem->text(COLUMN_VOUT_INDEX).toUInt());
model->lockCoin(outpt);
contextMenuItem->setDisabled(true);
- contextMenuItem->setIcon(COLUMN_CHECKBOX, QIcon(":/icons/lock_closed"));
+ contextMenuItem->setIcon(COLUMN_CHECKBOX, QIcon(":/icons/" + theme + "/lock_closed"));
updateLabelLocked();
}
@@ -724,7 +726,8 @@ void CoinControlDialog::updateView()
return;
bool treeMode = ui->radioTreeMode->isChecked();
-
+ QString theme = GUIUtil::getThemeName();
+
ui->treeWidget->clear();
ui->treeWidget->setEnabled(false); // performance, otherwise updateLabels would be called for every checked checkbox
ui->treeWidget->setAlternatingRowColors(!treeMode);
@@ -855,7 +858,7 @@ void CoinControlDialog::updateView()
COutPoint outpt(txhash, out.i);
coinControl->UnSelect(outpt); // just to be sure
itemOutput->setDisabled(true);
- itemOutput->setIcon(COLUMN_CHECKBOX, QIcon(":/icons/lock_closed"));
+ itemOutput->setIcon(COLUMN_CHECKBOX, QIcon(":/icons/" + theme + "/lock_closed"));
}
// set checkbox
diff --git a/src/qt/dash.qrc b/src/qt/dash.qrc
index 9e4fa270f403..e83804c9fb73 100644
--- a/src/qt/dash.qrc
+++ b/src/qt/dash.qrc
@@ -1,77 +1,220 @@
-
- res/icons/bitcoin.png
- res/icons/address-book.png
- res/icons/quit.png
- res/icons/send.png
- res/icons/connect0_16.png
- res/icons/connect1_16.png
- res/icons/connect2_16.png
- res/icons/connect3_16.png
- res/icons/connect4_16.png
- res/icons/transaction0.png
- res/icons/transaction2.png
- res/icons/transaction_conflicted.png
- res/icons/clock1.png
- res/icons/clock2.png
- res/icons/clock3.png
- res/icons/clock4.png
- res/icons/clock5.png
- res/icons/eye.png
- res/icons/eye_minus.png
- res/icons/eye_plus.png
- res/icons/configure.png
- res/icons/receive.png
- res/icons/editpaste.png
- res/icons/editcopy.png
- res/icons/add.png
- res/icons/bitcoin_testnet.png
- res/icons/edit.png
- res/icons/history.png
- res/icons/overview.png
- res/icons/export.png
- res/icons/synced.png
- res/icons/remove.png
- res/icons/tx_mined.png
- res/icons/tx_input.png
- res/icons/tx_output.png
- res/icons/tx_inout.png
- res/icons/unit_dash.png
- res/icons/unit_mdash.png
- res/icons/unit_udash.png
- res/icons/unit_duffs.png
- res/icons/unit_tdash.png
- res/icons/unit_tmdash.png
- res/icons/unit_tudash.png
- res/icons/unit_tduffs.png
- res/icons/lock_closed.png
- res/icons/lock_open.png
- res/icons/key.png
- res/icons/filesave.png
- res/icons/qrcode.png
- res/icons/debugwindow.png
- res/icons/drkblue_editpaste.png
- res/icons/drkblue_address-book.png
- res/icons/drkblue_editcopy.png
- res/icons/drkblue_remove.png
- res/icons/browse.png
+
+ res/icons/light/bitcoin.png
+ res/icons/light/address-book.png
+ res/icons/light/quit.png
+ res/icons/light/send.png
+ res/icons/light/connect0_16.png
+ res/icons/light/connect1_16.png
+ res/icons/light/connect2_16.png
+ res/icons/light/connect3_16.png
+ res/icons/light/connect4_16.png
+ res/icons/light/transaction0.png
+ res/icons/light/transaction2.png
+ res/icons/light/transaction_conflicted.png
+ res/icons/light/clock1.png
+ res/icons/light/clock2.png
+ res/icons/light/clock3.png
+ res/icons/light/clock4.png
+ res/icons/light/clock5.png
+ res/icons/light/eye.png
+ res/icons/light/eye_minus.png
+ res/icons/light/eye_plus.png
+ res/icons/light/configure.png
+ res/icons/light/receive.png
+ res/icons/light/editpaste.png
+ res/icons/light/editcopy.png
+ res/icons/light/add.png
+ res/icons/light/bitcoin_testnet.png
+ res/icons/light/edit.png
+ res/icons/light/history.png
+ res/icons/light/overview.png
+ res/icons/light/export.png
+ res/icons/light/synced.png
+ res/icons/light/remove.png
+ res/icons/light/tx_mined.png
+ res/icons/light/tx_input.png
+ res/icons/light/tx_output.png
+ res/icons/light/tx_inout.png
+ res/icons/light/unit_dash.png
+ res/icons/light/unit_mdash.png
+ res/icons/light/unit_udash.png
+ res/icons/light/unit_duffs.png
+ res/icons/light/unit_tdash.png
+ res/icons/light/unit_tmdash.png
+ res/icons/light/unit_tudash.png
+ res/icons/light/unit_tduffs.png
+ res/icons/light/lock_closed.png
+ res/icons/light/lock_open.png
+ res/icons/light/key.png
+ res/icons/light/filesave.png
+ res/icons/light/qrcode.png
+ res/icons/light/debugwindow.png
+ res/icons/light/drkblue_editpaste.png
+ res/icons/light/drkblue_address-book.png
+ res/icons/light/drkblue_editcopy.png
+ res/icons/light/drkblue_remove.png
+ res/icons/light/browse.png
+
+
+ res/icons/drkblue/bitcoin.png
+ res/icons/drkblue/address-book.png
+ res/icons/drkblue/quit.png
+ res/icons/drkblue/send.png
+ res/icons/drkblue/connect0_16.png
+ res/icons/drkblue/connect1_16.png
+ res/icons/drkblue/connect2_16.png
+ res/icons/drkblue/connect3_16.png
+ res/icons/drkblue/connect4_16.png
+ res/icons/drkblue/transaction0.png
+ res/icons/drkblue/transaction2.png
+ res/icons/drkblue/transaction_conflicted.png
+ res/icons/drkblue/clock1.png
+ res/icons/drkblue/clock2.png
+ res/icons/drkblue/clock3.png
+ res/icons/drkblue/clock4.png
+ res/icons/drkblue/clock5.png
+ res/icons/drkblue/eye.png
+ res/icons/drkblue/eye_minus.png
+ res/icons/drkblue/eye_plus.png
+ res/icons/drkblue/configure.png
+ res/icons/drkblue/receive.png
+ res/icons/drkblue/editpaste.png
+ res/icons/drkblue/editcopy.png
+ res/icons/drkblue/add.png
+ res/icons/drkblue/bitcoin_testnet.png
+ res/icons/drkblue/edit.png
+ res/icons/drkblue/history.png
+ res/icons/drkblue/overview.png
+ res/icons/drkblue/export.png
+ res/icons/drkblue/synced.png
+ res/icons/drkblue/remove.png
+ res/icons/drkblue/tx_mined.png
+ res/icons/drkblue/tx_input.png
+ res/icons/drkblue/tx_output.png
+ res/icons/drkblue/tx_inout.png
+ res/icons/drkblue/unit_dash.png
+ res/icons/drkblue/unit_mdash.png
+ res/icons/drkblue/unit_udash.png
+ res/icons/drkblue/unit_duffs.png
+ res/icons/drkblue/unit_tdash.png
+ res/icons/drkblue/unit_tmdash.png
+ res/icons/drkblue/unit_tudash.png
+ res/icons/drkblue/unit_tduffs.png
+ res/icons/drkblue/lock_closed.png
+ res/icons/drkblue/lock_open.png
+ res/icons/drkblue/key.png
+ res/icons/drkblue/filesave.png
+ res/icons/drkblue/qrcode.png
+ res/icons/drkblue/debugwindow.png
+ res/icons/drkblue/drkblue_editpaste.png
+ res/icons/drkblue/drkblue_address-book.png
+ res/icons/drkblue/drkblue_editcopy.png
+ res/icons/drkblue/drkblue_remove.png
+ res/icons/drkblue/browse.png
+
+
+ res/icons/trad/bitcoin.png
+ res/icons/trad/address-book.png
+ res/icons/trad/quit.png
+ res/icons/trad/send.png
+ res/icons/trad/connect0_16.png
+ res/icons/trad/connect1_16.png
+ res/icons/trad/connect2_16.png
+ res/icons/trad/connect3_16.png
+ res/icons/trad/connect4_16.png
+ res/icons/trad/transaction0.png
+ res/icons/trad/transaction2.png
+ res/icons/trad/transaction_conflicted.png
+ res/icons/trad/clock1.png
+ res/icons/trad/clock2.png
+ res/icons/trad/clock3.png
+ res/icons/trad/clock4.png
+ res/icons/trad/clock5.png
+ res/icons/trad/eye.png
+ res/icons/trad/eye_minus.png
+ res/icons/trad/eye_plus.png
+ res/icons/trad/configure.png
+ res/icons/trad/receive.png
+ res/icons/trad/editpaste.png
+ res/icons/trad/editcopy.png
+ res/icons/trad/add.png
+ res/icons/trad/bitcoin_testnet.png
+ res/icons/trad/edit.png
+ res/icons/trad/history.png
+ res/icons/trad/overview.png
+ res/icons/trad/export.png
+ res/icons/trad/synced.png
+ res/icons/trad/remove.png
+ res/icons/trad/tx_mined.png
+ res/icons/trad/tx_input.png
+ res/icons/trad/tx_output.png
+ res/icons/trad/tx_inout.png
+ res/icons/trad/unit_dash.png
+ res/icons/trad/unit_mdash.png
+ res/icons/trad/unit_udash.png
+ res/icons/trad/unit_duffs.png
+ res/icons/trad/unit_tdash.png
+ res/icons/trad/unit_tmdash.png
+ res/icons/trad/unit_tudash.png
+ res/icons/trad/unit_tduffs.png
+ res/icons/trad/lock_closed.png
+ res/icons/trad/lock_open.png
+ res/icons/trad/key.png
+ res/icons/trad/filesave.png
+ res/icons/trad/qrcode.png
+ res/icons/trad/debugwindow.png
+ res/icons/trad/drkblue_editpaste.png
+ res/icons/trad/drkblue_address-book.png
+ res/icons/trad/drkblue_editcopy.png
+ res/icons/trad/drkblue_remove.png
+ res/icons/trad/browse.png
res/css/drkblue.css
-
-
- res/images/about.png
- res/images/dash_logo_horizontal.png
- res/images/drkblue_downArrow.png
- res/images/drkblue_downArrow_small.png
- res/images/drkblue_upArrow_small.png
- res/images/drkblue_leftArrow_small.png
- res/images/drkblue_rightArrow_small.png
- res/images/drkblue_qtreeview_selected.png
- res/images/drkblue_walletFrame_bg.png
- res/images/drkblue_walletFrame.png
- res/images/splash.png
- res/images/splash_testnet.png
+ res/css/light.css
+
+
+ res/images/light/about.png
+ res/images/light/dash_logo_horizontal.png
+ res/images/light/drkblue_downArrow.png
+ res/images/light/drkblue_downArrow_small.png
+ res/images/light/drkblue_upArrow_small.png
+ res/images/light/drkblue_leftArrow_small.png
+ res/images/light/drkblue_rightArrow_small.png
+ res/images/light/drkblue_qtreeview_selected.png
+ res/images/light/drkblue_walletFrame_bg.png
+ res/images/light/drkblue_walletFrame.png
+ res/images/light/splash.png
+ res/images/light/splash_testnet.png
+
+
+ res/images/drkblue/about.png
+ res/images/drkblue/dash_logo_horizontal.png
+ res/images/drkblue/drkblue_downArrow.png
+ res/images/drkblue/drkblue_downArrow_small.png
+ res/images/drkblue/drkblue_upArrow_small.png
+ res/images/drkblue/drkblue_leftArrow_small.png
+ res/images/drkblue/drkblue_rightArrow_small.png
+ res/images/drkblue/drkblue_qtreeview_selected.png
+ res/images/drkblue/drkblue_walletFrame_bg.png
+ res/images/drkblue/drkblue_walletFrame.png
+ res/images/drkblue/splash.png
+ res/images/drkblue/splash_testnet.png
+
+
+ res/images/trad/about.png
+ res/images/trad/dash_logo_horizontal.png
+ res/images/trad/drkblue_downArrow.png
+ res/images/trad/drkblue_downArrow_small.png
+ res/images/trad/drkblue_upArrow_small.png
+ res/images/trad/drkblue_leftArrow_small.png
+ res/images/trad/drkblue_rightArrow_small.png
+ res/images/trad/drkblue_qtreeview_selected.png
+ res/images/trad/drkblue_walletFrame_bg.png
+ res/images/trad/drkblue_walletFrame.png
+ res/images/trad/splash.png
+ res/images/trad/splash_testnet.png
res/movies/spinner-000.png
diff --git a/src/qt/forms/addressbookpage.ui b/src/qt/forms/addressbookpage.ui
index b45d0c10a12c..56aa5da9d0ba 100644
--- a/src/qt/forms/addressbookpage.ui
+++ b/src/qt/forms/addressbookpage.ui
@@ -59,10 +59,6 @@
&New
-
-
- :/icons/add:/icons/add
-
false
@@ -76,10 +72,6 @@
&Copy
-
-
- :/icons/editcopy:/icons/editcopy
-
false
@@ -93,10 +85,6 @@
&Delete
-
-
- :/icons/remove:/icons/remove
-
false
@@ -123,10 +111,6 @@
&Export
-
-
- :/icons/export:/icons/export
-
false
diff --git a/src/qt/forms/helpmessagedialog.ui b/src/qt/forms/helpmessagedialog.ui
index e1edf5891685..bf1a781c34fd 100644
--- a/src/qt/forms/helpmessagedialog.ui
+++ b/src/qt/forms/helpmessagedialog.ui
@@ -28,7 +28,7 @@
- :/images/about
+ :/images/drkblue/about
@@ -47,8 +47,8 @@
0
0
- 659
- 348
+ 658
+ 342
diff --git a/src/qt/forms/receivecoinsdialog.ui b/src/qt/forms/receivecoinsdialog.ui
index e0234fb368f0..1a4ac15adb81 100644
--- a/src/qt/forms/receivecoinsdialog.ui
+++ b/src/qt/forms/receivecoinsdialog.ui
@@ -140,10 +140,6 @@
&Request payment
-
-
- :/icons/receiving_addresses:/icons/receiving_addresses
-
-
@@ -160,10 +156,6 @@
Clear
-
-
- :/icons/remove:/icons/remove
-
false
@@ -263,10 +255,6 @@
Show
-
-
- :/icons/edit:/icons/edit
-
false
@@ -283,10 +271,6 @@
Remove
-
-
- :/icons/remove:/icons/remove
-
false
diff --git a/src/qt/forms/rpcconsole.ui b/src/qt/forms/rpcconsole.ui
index 089b9de898e9..4e1aa728d3ff 100644
--- a/src/qt/forms/rpcconsole.ui
+++ b/src/qt/forms/rpcconsole.ui
@@ -413,10 +413,6 @@
-
-
- :/icons/remove:/icons/remove
-
Ctrl+L
@@ -1072,7 +1068,7 @@
10
- 90
+ 100
301
23
@@ -1091,7 +1087,7 @@
10
- 140
+ 150
301
23
@@ -1110,7 +1106,7 @@
10
- 190
+ 200
301
23
@@ -1129,7 +1125,7 @@
10
- 240
+ 250
301
23
@@ -1148,7 +1144,7 @@
10
- 290
+ 300
301
23
@@ -1189,7 +1185,7 @@
330
- 80
+ 90
411
41
@@ -1205,7 +1201,7 @@
330
- 129
+ 140
411
41
@@ -1221,7 +1217,7 @@
330
- 179
+ 190
411
41
@@ -1237,7 +1233,7 @@
330
- 229
+ 240
411
41
@@ -1253,7 +1249,7 @@
330
- 279
+ 290
411
41
@@ -1292,7 +1288,7 @@
10
- 340
+ 350
301
23
@@ -1305,7 +1301,7 @@
330
- 330
+ 340
411
41
@@ -1317,6 +1313,19 @@
true
+
+
+
+ 10
+ 70
+ 731
+ 21
+
+
+
+ Wallet Path
+
+
diff --git a/src/qt/forms/sendcoinsdialog.ui b/src/qt/forms/sendcoinsdialog.ui
index e89957058d42..1f0fe3c88f89 100644
--- a/src/qt/forms/sendcoinsdialog.ui
+++ b/src/qt/forms/sendcoinsdialog.ui
@@ -616,8 +616,8 @@
0
0
- 830
- 68
+ 828
+ 67
@@ -1257,10 +1257,6 @@
S&end
-
-
- :/icons/send:/icons/send
-
false
@@ -1283,10 +1279,6 @@
Clear &All
-
-
- :/icons/remove:/icons/remove
-
false
@@ -1300,10 +1292,6 @@
Add &Recipient
-
-
- :/icons/add:/icons/add
-
false
diff --git a/src/qt/forms/sendcoinsentry.ui b/src/qt/forms/sendcoinsentry.ui
index a6d0a8cf242e..4ba1cb472c0d 100644
--- a/src/qt/forms/sendcoinsentry.ui
+++ b/src/qt/forms/sendcoinsentry.ui
@@ -63,10 +63,6 @@
-
-
- :/icons/address-book:/icons/address-book
-
Alt+A
@@ -80,10 +76,6 @@
-
-
- :/icons/editpaste:/icons/editpaste
-
Alt+P
@@ -97,10 +89,6 @@
-
-
- :/icons/remove:/icons/remove
-
@@ -621,10 +609,6 @@
-
-
- :/icons/remove:/icons/remove
-
@@ -1157,10 +1141,6 @@
-
-
- :/icons/remove:/icons/remove
-
diff --git a/src/qt/forms/signverifymessagedialog.ui b/src/qt/forms/signverifymessagedialog.ui
index 66d7c5b111df..068581a511bc 100644
--- a/src/qt/forms/signverifymessagedialog.ui
+++ b/src/qt/forms/signverifymessagedialog.ui
@@ -60,10 +60,6 @@
-
-
- :/icons/address-book:/icons/address-book
-
Alt+A
@@ -80,10 +76,6 @@
-
-
- :/icons/editpaste:/icons/editpaste
-
Alt+P
@@ -136,10 +128,6 @@
-
-
- :/icons/editcopy:/icons/editcopy
-
false
@@ -157,10 +145,6 @@
Sign &Message
-
-
- :/icons/edit:/icons/edit
-
false
@@ -174,10 +158,6 @@
Clear &All
-
-
- :/icons/remove:/icons/remove
-
false
@@ -270,10 +250,6 @@
-
-
- :/icons/address-book:/icons/address-book
-
Alt+A
@@ -300,10 +276,6 @@
Verify &Message
-
-
- :/icons/transaction_0:/icons/transaction_0
-
false
@@ -317,10 +289,6 @@
Clear &All
-
-
- :/icons/remove:/icons/remove
-
false
diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp
index 6f495230b65d..92a3d4f7ac3d 100644
--- a/src/qt/guiutil.cpp
+++ b/src/qt/guiutil.cpp
@@ -397,6 +397,15 @@ void openConfigfile()
QDesktopServices::openUrl(QUrl::fromLocalFile(boostPathToQString(pathConfig)));
}
+void openMNConfigfile()
+{
+ boost::filesystem::path pathConfig = GetMasternodeConfigFile();
+
+ /* Open masternode.conf with the associated application */
+ if (boost::filesystem::exists(pathConfig))
+ QDesktopServices::openUrl(QUrl::fromLocalFile(boostPathToQString(pathConfig)));
+}
+
void showBackups()
{
boost::filesystem::path pathBackups = GetDataDir() / "backups";
@@ -805,6 +814,18 @@ void restoreWindowGeometry(const QString& strSetting, const QSize& defaultSize,
parent->move(pos);
}
+// Return name of current UI-theme or default theme if no theme was found
+QString getThemeName()
+{
+ QSettings settings;
+ QString theme = settings.value("theme", "").toString();
+
+ if(!theme.isEmpty()){
+ return theme;
+ }
+ return QString("drkblue");
+}
+
// Open CSS when configured
QString loadStyleSheet()
{
diff --git a/src/qt/guiutil.h b/src/qt/guiutil.h
index 4dd6ca2f6c5a..66b60af6fd10 100644
--- a/src/qt/guiutil.h
+++ b/src/qt/guiutil.h
@@ -108,7 +108,10 @@ namespace GUIUtil
// Open dash.conf
void openConfigfile();
-
+
+ // Open masternode.conf
+ void openMNConfigfile();
+
// Browse backup folder
void showBackups();
@@ -182,6 +185,9 @@ namespace GUIUtil
/** Load global CSS theme */
QString loadStyleSheet();
+
+ /** Return name of current CSS theme */
+ QString getThemeName();
/* Convert QString to OS specific boost path through UTF-8 */
boost::filesystem::path qstringToBoostPath(const QString &path);
diff --git a/src/qt/networkstyle.cpp b/src/qt/networkstyle.cpp
index 62c44703f470..858cd2aa4b55 100644
--- a/src/qt/networkstyle.cpp
+++ b/src/qt/networkstyle.cpp
@@ -15,9 +15,9 @@ static const struct {
const char *titleAddText;
const char *splashImage;
} network_styles[] = {
- {"main", QAPP_APP_NAME_DEFAULT, ":/icons/bitcoin", "", ":/images/splash"},
- {"test", QAPP_APP_NAME_TESTNET, ":/icons/bitcoin_testnet", QT_TRANSLATE_NOOP("SplashScreen", "[testnet]"), ":/images/splash_testnet"},
- {"regtest", QAPP_APP_NAME_TESTNET, ":/icons/bitcoin_testnet", "[regtest]", ":/images/splash_testnet"}
+ {"main", QAPP_APP_NAME_DEFAULT, ":/icons/drkblue/bitcoin", "", ":/images/drkblue/splash"},
+ {"test", QAPP_APP_NAME_TESTNET, ":/icons/drkblue/bitcoin_testnet", QT_TRANSLATE_NOOP("SplashScreen", "[testnet]"), ":/images/drkblue/splash_testnet"},
+ {"regtest", QAPP_APP_NAME_TESTNET, ":/icons/drkblue/bitcoin_testnet", "[regtest]", ":/images/drkblue/splash_testnet"}
};
static const unsigned network_styles_count = sizeof(network_styles)/sizeof(*network_styles);
diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp
index d1b30399d2da..a9d866b10a56 100644
--- a/src/qt/optionsdialog.cpp
+++ b/src/qt/optionsdialog.cpp
@@ -82,6 +82,7 @@ OptionsDialog::OptionsDialog(QWidget *parent, bool enableWallet) :
}
/* Theme selector */
+ ui->theme->addItem(QString("DASH-light"), QVariant("light"));
ui->theme->addItem(QString("DASH-blue"), QVariant("drkblue"));
ui->theme->addItem(QString("DASH-traditional"), QVariant("trad"));
diff --git a/src/qt/receivecoinsdialog.cpp b/src/qt/receivecoinsdialog.cpp
index f2c76c83555b..3f05459a2145 100644
--- a/src/qt/receivecoinsdialog.cpp
+++ b/src/qt/receivecoinsdialog.cpp
@@ -27,12 +27,18 @@ ReceiveCoinsDialog::ReceiveCoinsDialog(QWidget *parent) :
model(0)
{
ui->setupUi(this);
-
+ QString theme = GUIUtil::getThemeName();
+
#ifdef Q_OS_MAC // Icons on push buttons are very uncommon on Mac
ui->clearButton->setIcon(QIcon());
ui->receiveButton->setIcon(QIcon());
ui->showRequestButton->setIcon(QIcon());
ui->removeRequestButton->setIcon(QIcon());
+#else
+ ui->clearButton->setIcon(QIcon(":/icons/" + theme + "/remove"));
+ ui->receiveButton->setIcon(QIcon(":/icons/" + theme + "/receiving_addresses"));
+ ui->showRequestButton->setIcon(QIcon(":/icons/" + theme + "/edit"));
+ ui->removeRequestButton->setIcon(QIcon(":/icons/" + theme + "/remove"));
#endif
// context menu actions
diff --git a/src/qt/res/css/drkblue.css b/src/qt/res/css/drkblue.css
index 965ef42a395c..a2a405688d75 100644
--- a/src/qt/res/css/drkblue.css
+++ b/src/qt/res/css/drkblue.css
@@ -1,5 +1,5 @@
WalletFrame {
-border-image: url(':/images/drkblue_walletFrame_bg') 0 0 0 0 stretch stretch;
+border-image: url(':/images/drkblue/drkblue_walletFrame_bg') 0 0 0 0 stretch stretch;
border-top:0px solid #000;
margin:0;
padding:0;
@@ -150,7 +150,7 @@ border:0px;
}
QComboBox::down-arrow {
-border-image: url(':/images/drkblue_downArrow') 0 0 0 0 stretch stretch;
+border-image: url(':/images/drkblue/drkblue_downArrow') 0 0 0 0 stretch stretch;
}
QComboBox QListView {
@@ -205,7 +205,7 @@ padding-top:2px;
}
QAbstractSpinBox::up-arrow {
-image:url(':/images/drkblue_upArrow_small');
+image:url(':/images/drkblue/drkblue_upArrow_small');
}
QAbstractSpinBox::down-button {
@@ -223,7 +223,7 @@ padding-bottom:2px;
}
QAbstractSpinBox::down-arrow {
-image:url(':/images/drkblue_downArrow_small');
+image:url(':/images/drkblue/drkblue_downArrow_small');
}
/*******************************************************/
@@ -342,19 +342,19 @@ height:10px;
}
QScrollBar:up-arrow {
-background-image: url(':/images/drkblue_upArrow_small');
+background-image: url(':/images/drkblue/drkblue_upArrow_small');
}
QScrollBar:down-arrow {
-background-image: url(':/images/drkblue_downArrow_small');
+background-image: url(':/images/drkblue/drkblue_downArrow_small');
}
QScrollBar:left-arrow {
-background-image: url(':/images/drkblue_leftArrow_small');
+background-image: url(':/images/drkblue/drkblue_leftArrow_small');
}
QScrollBar:right-arrow {
-background-image: url(':/images/drkblue_rightArrow_small');
+background-image: url(':/images/drkblue/drkblue_rightArrow_small');
}
@@ -464,7 +464,7 @@ background-color:#fff;
}
QDialog#SignVerifyMessageDialog QPushButton#pasteButton_SM { /* Paste Button */
-/* qproperty-icon: url(":/icons/drkblue_editpaste"); */
+/* qproperty-icon: url(":/icons/drkblue/drkblue_editpaste"); */
background-color:transparent;
padding-left:15px;
}
@@ -474,7 +474,7 @@ font-size:10px;
}
QDialog#SignVerifyMessageDialog QPushButton#copySignatureButton_SM { /* Copy Button */
-/* qproperty-icon: url(":/icons/drkblue_editcopy"); */
+/* qproperty-icon: url(":/icons/drkblue/drkblue_editcopy"); */
background-color:transparent;
padding-left:10px;
padding-right:10px;
@@ -1042,7 +1042,7 @@ min-width:410px;
margin-right:20px;
margin-left:0;
margin-top:0;
-background-image: url(':/images/dash_logo_horizontal');
+background-image: url(':/images/drkblue/dash_logo_horizontal');
background-repeat:none;
}
@@ -1371,7 +1371,7 @@ color:#333;
}
QDialog#CoinControlDialog .CoinControlTreeWidget#treeWidget::branch:selected { /* Coin Control Branch Icon */
-background-image: url(':/images/drkblue_qtreeview_selected');
+background-image: url(':/images/drkblue/drkblue_qtreeview_selected');
background-repeat:no-repeat;
background-position:center;
background-color:#f7f7f7;
@@ -1379,7 +1379,7 @@ color:#333;
}
QDialog#CoinControlDialog .CoinControlTreeWidget#treeWidget::branch:checked { /* Coin Control Branch Icon */
-background-image: url(':/images/drkblue_qtreeview_selected');
+background-image: url(':/images/drkblue/drkblue_qtreeview_selected');
background-repeat:no-repeat;
background-position:center;
background-color:#f7f7f7;
diff --git a/src/qt/res/css/light.css b/src/qt/res/css/light.css
new file mode 100644
index 000000000000..f1b477303e6d
--- /dev/null
+++ b/src/qt/res/css/light.css
@@ -0,0 +1,1528 @@
+WalletFrame {
+border-image: url(':/images/light/drkblue_walletFrame_bg') 0 0 0 0 stretch stretch;
+border-top:0px solid #000;
+margin:0;
+padding-top:20px;
+padding-bottom: 20px;
+}
+
+QStatusBar {
+background-color:#ffffff;
+}
+
+.QFrame {
+background-color:transparent;
+border:0px solid #fff;
+}
+
+QMenuBar {
+background-color:#fff;
+}
+
+QMenuBar::item {
+background-color:#fff;
+}
+
+QMenuBar::item:selected {
+background-color:#f8f6f6;
+}
+
+QMenu {
+background-color:#f8f6f6;
+}
+
+QMenu::item {
+color:#333;
+}
+
+QMenu::item:selected {
+background-color:#f2f0f0;
+color:#333;
+}
+
+QToolBar {
+background-color:#3398CC;
+border:0px solid #000;
+padding:0;
+margin:0;
+}
+
+QToolBar > QToolButton {
+background-color:#3398CC;
+border:0px solid #333;
+min-height:2.5em;
+padding: 0em 1em;
+font-weight:bold;
+color:#fff;
+}
+
+QToolBar > QToolButton:checked {
+background-color:#fff;
+color:#333;
+font-weight:bold;
+}
+
+QMessageBox {
+background-color:#F8F6F6;
+}
+
+/*******************************************************/
+
+QLabel { /* Base Text Size & Color */
+font-size:12px;
+color:#333333;
+}
+
+.QCheckBox { /* Checkbox Labels */
+color:#333333;
+background-color:transparent;
+}
+
+.QCheckBox:hover {
+background-color:transparent;
+}
+
+.QValidatedLineEdit, .QLineEdit { /* Text Entry Fields */
+border: 1px solid #82C3E6;
+font-size:11px;
+min-height:25px;
+outline:0;
+padding:3px;
+background-color:#fcfcfc;
+}
+
+.QLineEdit:!focus {
+font-size:12px;
+}
+
+.QValidatedLineEdit:disabled, .QLineEdit:disabled {
+background-color:#f2f2f2;
+}
+
+/*******************************************************/
+
+QPushButton { /* Global Button Style */
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #64ACD2, stop: .1 #3398CC, stop: .95 #3398CC, stop: 1 #1D80B5);
+border:0;
+border-radius:3px;
+color:#ffffff;
+font-size:12px;
+font-weight:bold;
+ height: 26px;
+padding-left:25px;
+padding-right:25px;
+padding-top:5px;
+padding-bottom:5px;
+ margin-right: 10px;
+}
+
+QPushButton:hover {
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #64ACD2, stop: .1 #46AADE, stop: .95 #46AADE, stop: 1 #1D80B5);
+}
+
+QPushButton:focus {
+border:none;
+outline:none;
+}
+
+QPushButton:pressed {
+border:1px solid #333;
+}
+
+QComboBox { /* Dropdown Menus */
+border:1px solid #82C3E6;
+padding: 3px 5px 3px 5px;
+background:#fcfcfc;
+min-height:25px;
+color:#818181;
+}
+
+QComboBox:checked {
+background:#f2f2f2;
+}
+
+QComboBox:editable {
+background: #3398CC;
+color:#616161;
+border:0px solid transparent;
+}
+
+QComboBox::drop-down {
+width:25px;
+border:0px;
+}
+
+QComboBox::down-arrow {
+border-image: url(':/images/light/drkblue_downArrow') 0 0 0 0 stretch stretch;
+}
+
+QComboBox QListView {
+background:#fff;
+border:1px solid #333;
+padding-right:1px;
+padding-left:1px;
+}
+
+QComboBox QAbstractItemView::item { margin:4px; }
+
+QComboBox::item {
+color:#818181;
+}
+
+QComboBox::item:alternate {
+background:#fff;
+}
+
+QComboBox::item:selected {
+border:0px solid transparent;
+background:#f2f2f2;
+}
+
+QComboBox::indicator {
+background-color:transparent;
+selection-background-color:transparent;
+color:transparent;
+selection-color:transparent;
+}
+
+QAbstractSpinBox {
+border:1px solid #82C3E6;
+padding: 3px 5px 3px 5px;
+background:#fcfcfc;
+min-height:25px;
+color:#818181;
+}
+
+QAbstractSpinBox::up-button {
+subcontrol-origin: border;
+subcontrol-position: top right;
+width:21px;
+background:#fcfcfc;
+border-left:0px;
+border-right:1px solid #82C3E6;
+border-top:1px solid #82C3E6;
+border-bottom:0px;
+padding-right:1px;
+padding-left:5px;
+padding-top:2px;
+}
+
+QAbstractSpinBox::up-arrow {
+image:url(':/images/light/drkblue_upArrow_small');
+}
+
+QAbstractSpinBox::down-button {
+subcontrol-origin: border;
+subcontrol-position: bottom right;
+width:21px;
+background:#fcfcfc;
+border-top:0px;
+border-left:0px;
+border-right:1px solid #82C3E6;
+border-bottom:1px solid #82C3E6;
+padding-right:1px;
+padding-left:5px;
+padding-bottom:2px;
+}
+
+QAbstractSpinBox::down-arrow {
+image:url(':/images/light/drkblue_downArrow_small');
+}
+
+/*******************************************************/
+
+QHeaderView { /* Table Header */
+background-color:transparent;
+}
+
+QHeaderView::section { /* Table Header Sections */
+qproperty-alignment:center;
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.25, stop: 0 #4c97bf, stop: 1 #56ABD8);
+color:#fff;
+min-height:25px;
+font-weight:bold;
+font-size:11px;
+outline:0;
+border:0px solid #fff;
+border-right:1px solid #fff;
+padding-left:5px;
+padding-right:5px;
+padding-top:2px;
+padding-bottom:2px;
+}
+
+QHeaderView::section:last {
+border-right: 0px solid #d7d7d7;
+}
+
+.QScrollArea {
+background:transparent;
+border:0px;
+}
+
+.QTableView { /* Table - has to be selected as a class otherwise it throws off QCalendarWidget */
+background:transparent;
+border:0px solid #fff;
+}
+
+QTableView::item { /* Table Item */
+background-color:#fcfcfc;
+font-size:12px;
+}
+
+QTableView::item:selected { /* Table Item Selected */
+background-color:#f0f0f0;
+color:#333;
+}
+
+QScrollBar { /* Scroll Bar */
+
+}
+
+QScrollBar:vertical { /* Vertical Scroll Bar Attributes */
+border:0;
+background:#ffffff;
+width:18px;
+margin: 18px 0px 18px 0px;
+}
+
+QScrollBar:horizontal { /* Horizontal Scroll Bar Attributes */
+border:0;
+background:#ffffff;
+height:18px;
+margin: 0px 18px 0px 18px;
+}
+
+
+QScrollBar::handle:vertical { /* Scroll Bar Slider - vertical */
+background:#e0e0e0;
+min-height:10px;
+}
+
+QScrollBar::handle:horizontal { /* Scroll Bar Slider - horizontal */
+background:#e0e0e0;
+min-width:10px;
+}
+
+QScrollBar::add-page, QScrollBar::sub-page { /* Scroll Bar Background */
+background:#F8F6F6;
+}
+
+QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical, QScrollBar::add-line:horizontal, QScrollBar::sub-line:horizontal { /* Define Arrow Button Dimensions */
+background-color:#F8F6F6;
+border: 1px solid #f2f0f0;
+width:16px;
+height:16px;
+}
+
+QScrollBar::add-line:vertical:pressed, QScrollBar::sub-line:vertical:pressed, QScrollBar::add-line:horizontal:pressed, QScrollBar::sub-line:horizontal:pressed {
+background-color:#e0e0e0;
+}
+
+QScrollBar::sub-line:vertical { /* Vertical - top button position */
+subcontrol-position:top;
+subcontrol-origin: margin;
+}
+
+QScrollBar::add-line:vertical { /* Vertical - bottom button position */
+subcontrol-position:bottom;
+subcontrol-origin: margin;
+}
+
+QScrollBar::sub-line:horizontal { /* Vertical - left button position */
+subcontrol-position:left;
+subcontrol-origin: margin;
+}
+
+QScrollBar::add-line:horizontal { /* Vertical - right button position */
+subcontrol-position:right;
+subcontrol-origin: margin;
+}
+
+QScrollBar:up-arrow, QScrollBar:down-arrow, QScrollBar:left-arrow, QScrollBar:right-arrow { /* Arrows Icon */
+width:10px;
+height:10px;
+}
+
+QScrollBar:up-arrow {
+background-image: url(':/images/light/drkblue_upArrow_small');
+}
+
+QScrollBar:down-arrow {
+background-image: url(':/images/light/drkblue_downArrow_small');
+}
+
+QScrollBar:left-arrow {
+background-image: url(':/images/light/drkblue_leftArrow_small');
+}
+
+QScrollBar:right-arrow {
+background-image: url(':/images/light/drkblue_rightArrow_small');
+}
+
+
+/*******************************************************/
+
+/* DIALOG BOXES */
+
+QDialog .QTabWidget {
+border-bottom:1px solid #333;
+}
+
+QDialog .QTabWidget::pane {
+border: 1px solid #d7d7d7;
+}
+
+QDialog .QTabWidget QTabBar::tab {
+background-color:#f2f0f0;
+color:#333;
+padding-left:10px;
+padding-right:10px;
+padding-top:5px;
+padding-bottom:5px;
+border-top: 1px solid #d7d7d7;
+}
+
+QDialog .QTabWidget QTabBar::tab:first {
+border-left: 1px solid #d7d7d7;
+}
+
+QDialog .QTabWidget QTabBar::tab:last {
+border-right: 1px solid #d7d7d7;
+}
+
+QDialog .QTabWidget QTabBar::tab:selected, QDialog .QTabWidget QTabBar::tab:hover {
+background-color:#ffffff;
+color:#333;
+}
+
+QDialog .QTabWidget .QWidget {
+background-color:#fff;
+color:#333;
+}
+
+QDialog .QTabWidget .QWidget QAbstractSpinBox {
+min-height:15px;
+}
+
+QDialog .QTabWidget .QWidget QAbstractSpinBox::down-button {
+width:15px;
+}
+
+QDialog .QTabWidget .QWidget QAbstractSpinBox::up-button {
+width:15px;
+}
+
+QDialog .QTabWidget .QWidget QComboBox {
+min-height:15px;
+}
+
+QDialog QWidget { /* Remove Annoying Focus Rectangle */
+outline: 0;
+}
+
+/*******************************************************/
+/* FILE MENU */
+
+/* Dialog: Open URI */
+QDialog#OpenURIDialog {
+background-color:#F8F6F6;
+}
+
+QDialog#OpenURIDialog QLabel#label { /* URI Label */
+font-weight:bold;
+}
+
+QDialog#OpenURIDialog QPushButton#selectFileButton { /* ... Button */
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb);
+border:1px solid #d2d2d2;
+color:#616161;
+padding-left:10px;
+padding-right:10px;
+}
+
+QDialog#OpenURIDialog QPushButton#selectFileButton:hover {
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb);
+color:#333;
+}
+
+QDialog#OpenURIDialog QPushButton#selectFileButton:pressed {
+border:1px solid #9e9e9e;
+}
+
+/* Dialog: Sign / Verify Message */
+QDialog#SignVerifyMessageDialog {
+background-color:#F8F6F6;
+}
+
+QDialog#SignVerifyMessageDialog QPushButton#addressBookButton_SM { /* Address Book Button */
+background-color:transparent;
+padding-left:10px;
+padding-right:10px;
+}
+
+QDialog#SignVerifyMessageDialog QPlainTextEdit { /* Message Signing Text */
+border:1px solid #82C3E6;
+background-color:#fff;
+}
+
+QDialog#SignVerifyMessageDialog QPushButton#pasteButton_SM { /* Paste Button */
+/* qproperty-icon: url(":/icons/light/drkblue_editpaste"); */
+background-color:transparent;
+padding-left:15px;
+}
+
+QDialog#SignVerifyMessageDialog QLineEdit:!focus { /* Font Hack */
+font-size:10px;
+}
+
+QDialog#SignVerifyMessageDialog QPushButton#copySignatureButton_SM { /* Copy Button */
+/* qproperty-icon: url(":/icons/light/drkblue_editcopy"); */
+background-color:transparent;
+padding-left:10px;
+padding-right:10px;
+}
+
+QDialog#SignVerifyMessageDialog QPushButton#clearButton_SM { /* Clear Button */
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb);
+border:1px solid #d2d2d2;
+color:#616161;
+padding-left:10px;
+padding-right:10px;
+}
+
+QDialog#SignVerifyMessageDialog QPushButton#clearButton_SM:hover {
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb);
+color:#333;
+}
+
+QDialog#SignVerifyMessageDialog QPushButton#clearButton_SM:pressed {
+border:1px solid #9e9e9e;
+}
+
+QDialog#SignVerifyMessageDialog QPushButton#addressBookButton_VM { /* Verify Message - Address Book Button */
+background-color:transparent;
+border:0;
+padding-left:10px;
+padding-right:10px;
+}
+
+QDialog#SignVerifyMessageDialog QPushButton#clearButton_VM { /* Verify Message - Clear Button */
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb);
+border:1px solid #d2d2d2;
+color:#616161;
+padding-left:10px;
+padding-right:10px;
+}
+
+QDialog#SignVerifyMessageDialog QPushButton#clearButton_VM:hover {
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb);
+color:#333;
+}
+
+QDialog#SignVerifyMessageDialog QPushButton#clearButton_VM:pressed {
+border:1px solid #9e9e9e;
+}
+
+/* Dialog: Send and Receive */
+QWidget#AddressBookPage {
+background-color:#F8F6F6;
+}
+
+QWidget#AddressBookPage QPushButton#newAddress { /* New Address Button */
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb);
+border:1px solid #d2d2d2;
+color:#616161;
+padding-left:10px;
+padding-right:10px;
+}
+
+QWidget#AddressBookPage QPushButton#newAddress:hover {
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb);
+color:#333;
+}
+
+QWidget#AddressBookPage QPushButton#newAddress:pressed {
+border:1px solid #9e9e9e;
+}
+
+QWidget#AddressBookPage QPushButton#copyAddress { /* Copy Address Button */
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb);
+border:1px solid #d2d2d2;
+color:#616161;
+padding-left:10px;
+padding-right:10px;
+}
+
+QWidget#AddressBookPage QPushButton#copyAddress:hover {
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb);
+color:#333;
+}
+
+QWidget#AddressBookPage QPushButton#copyAddress:pressed {
+border:1px solid #9e9e9e;
+}
+
+QWidget#AddressBookPage QPushButton#deleteAddress { /* Delete Address Button */
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb);
+border:1px solid #d2d2d2;
+color:#616161;
+padding-left:10px;
+padding-right:10px;
+}
+
+QWidget#AddressBookPage QPushButton#deleteAddress:hover {
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb);
+color:#333;
+}
+
+QWidget#AddressBookPage QPushButton#deleteAddress:pressed {
+border:1px solid #9e9e9e;
+}
+
+QWidget#AddressBookPage QTableView { /* Address Listing */
+font-size:12px;
+}
+
+QWidget#AddressBookPage QHeaderView::section { /* Min width for Windows fix */
+min-width:260px;
+}
+
+/* SETTINGS MENU */
+
+/* Encrypt Wallet and Change Passphrase Dialog */
+QDialog#AskPassphraseDialog {
+background-color:#F8F6F6;
+}
+
+QDialog#AskPassphraseDialog QLabel#passLabel1, QDialog#AskPassphraseDialog QLabel#passLabel2, QDialog#AskPassphraseDialog QLabel#passLabel3 {
+qproperty-alignment: 'AlignVCenter | AlignRight';
+min-width:170px;
+min-height:33px; /* base width of 25px for QLineEdit, plus padding and border */
+}
+
+/* Options Dialog */
+QDialog#OptionsDialog {
+background-color:#F8F6F6;
+}
+
+QDialog#OptionsDialog QValueComboBox, QDialog#OptionsDialog QSpinBox {
+margin-top:5px;
+margin-bottom:5px;
+}
+
+QDialog#OptionsDialog QValidatedLineEdit, QDialog#OptionsDialog QValidatedLineEdit:disabled, QDialog#OptionsDialog QLineEdit, QDialog#OptionsDialog QLineEdit:disabled {
+qproperty-alignment: 'AlignVCenter | AlignLeft';
+min-height:20px;
+margin-top:0px;
+margin-bottom:0px;
+padding-top:1px;
+padding-bottom:1px;
+}
+
+QDialog#OptionsDialog > QLabel {
+qproperty-alignment: 'AlignVCenter';
+min-height:20px;
+}
+
+QDialog#OptionsDialog QWidget#tabDisplay QValueComboBox {
+margin-top:0px;
+margin-bottom:0px;
+}
+
+QDialog#OptionsDialog QLabel#label_3 { /* Translations Missing? Label */
+qproperty-alignment: 'AlignVCenter | AlignCenter';
+color:#818181;
+padding-bottom:8px;
+}
+
+QDialog#OptionsDialog QCheckBox {
+qproperty-alignment: 'AlignVCenter';
+min-height:20px;
+}
+
+QDialog#OptionsDialog QCheckBox#displayAddresses {
+min-height:33px;
+
+}
+
+/* TOOLS MENU */
+
+QDialog#RPCConsole { /* RPC Console Dialog Box */
+background-color:#F8F6F6;
+}
+
+QDialog#RPCConsole QWidget#tab_info QLabel#label_11, QDialog#RPCConsole QWidget#tab_info QLabel#label_10 { /* Margin between Network and Block Chain headers */
+qproperty-alignment: 'AlignBottom';
+min-height:25px;
+min-width:180px;
+}
+
+QDialog#RPCConsole QWidget#tab_peers QLabel#peerHeading { /* Peers Info Header */
+color:#3398CC;
+}
+
+QDialog#RPCConsole QPushButton#openDebugLogfileButton {
+max-width:60px;
+}
+
+QDialog#RPCConsole QTextEdit#messagesWidget { /* Console Messages Window */
+border:0;
+}
+
+QDialog#RPCConsole QLineEdit#lineEdit { /* Console Input */
+margin-right:5px;
+}
+
+QDialog#RPCConsole QPushButton#clearButton { /* Console Clear Button */
+background-color:transparent;
+padding-left:10px;
+padding-right:10px;
+}
+
+QDialog#RPCConsole .QGroupBox #line { /* Network In Line */
+background-color:#00ff00;
+}
+
+QDialog#RPCConsole .QGroupBox #line_2 { /* Network Out Line */
+background:#ff0000;
+}
+
+/* HELP MENU */
+
+/* Command Line Options Dialog */
+QDialog#HelpMessageDialog {
+background-color:#F8F6F6;
+}
+
+QDialog#HelpMessageDialog QScrollArea * {
+background-color:#ffffff;
+}
+
+QDialog#HelpMessageDialog QScrollBar:vertical, QDialog#HelpMessageDialog QScrollBar:horizontal {
+border:0;
+}
+
+/* About Dash Dialog */
+QDialog#AboutDialog {
+background-color:#F8F6F6;
+}
+
+QDialog#AboutDialog QLabel#label, QDialog#AboutDialog QLabel#copyrightLabel, QDialog#AboutDialog QLabel#label_2 { /* About Dash Contents */
+margin-left:10px;
+}
+
+QDialog#AboutDialog QLabel#label_2 { /* Margin for About Dash text */
+margin-right:10px;
+}
+
+/* Edit Address Dialog */
+QDialog#EditAddressDialog {
+background-color:#F8F6F6;
+}
+
+QDialog#EditAddressDialog QLabel {
+qproperty-alignment: 'AlignVCenter | AlignRight';
+min-height:27px;
+font-weight:normal;
+padding-right:5px;
+}
+
+/* OVERVIEW SCREEN */
+
+QWidget .QFrame#frame { /* Wallet Balance */
+min-width:490px;
+}
+
+QWidget .QFrame#frame > .QLabel {
+min-width:190px;
+font-weight:normal;
+min-height:30px;
+}
+
+QWidget .QFrame#frame .QLabel#label_5 { /* Wallet Label */
+qproperty-alignment: 'AlignVCenter | AlignRight';
+min-width:160px;
+background-color:transparent;
+color:#f4f4f5;
+margin-right:5px;
+padding-right:5px;
+}
+
+QWidget .QFrame#frame .QLabel#labelWalletStatus { /* Wallet Sync Status */
+qproperty-alignment: 'AlignVCenter | AlignLeft';
+margin-left:3px;
+}
+
+QWidget .QFrame#frame .QLabel#labelSpendable { /* Spendable Header */
+qproperty-alignment: 'AlignVCenter | AlignLeft';
+font-size:12px;
+margin-left:18px;
+}
+
+QWidget .QFrame#frame .QLabel#labelWatchonly { /* Watch-only Header */
+qproperty-alignment: 'AlignVCenter | AlignLeft';
+font-size:12px;
+margin-left:16px;
+}
+
+QWidget .QFrame#frame .QLabel#labelBalanceText { /* Available Balance Label */
+qproperty-alignment: 'AlignVCenter | AlignRight';
+min-width:160px;
+background-color:#1E75BB;
+color:#ffffff;
+margin-right:5px;
+padding-right:5px;
+font-size:16px;
+min-height:35px;
+}
+
+QWidget .QFrame#frame .QLabel#labelBalance { /* Available Balance */
+qproperty-alignment: 'AlignVCenter | AlignLeft';
+font-size:16px;
+color:#1E75BB;
+margin-left:0px;
+ font-weight: bold;
+}
+
+QWidget .QFrame#frame .QLabel#labelWatchAvailable { /* Watch-only Balance */
+qproperty-alignment: 'AlignVCenter | AlignLeft';
+font-size:12px;
+margin-left:16px;
+}
+
+QWidget .QFrame#frame .QLabel#labelPendingText { /* Pending Balance Label */
+qproperty-alignment: 'AlignVCenter | AlignRight';
+min-width:160px;
+font-size:12px;
+background-color:#F8F6F6;
+margin-right:5px;
+padding-right:5px;
+}
+
+QWidget .QFrame#frame .QLabel#labelUnconfirmed { /* Pending Balance */
+qproperty-alignment: 'AlignVCenter | AlignLeft';
+font-size:12px;
+margin-left:0px;
+}
+
+QWidget .QFrame#frame .QLabel#labelWatchPending { /* Watch-only Pending Balance */
+qproperty-alignment: 'AlignVCenter | AlignLeft';
+font-size:12px;
+margin-left:16px;
+}
+
+QWidget .QFrame#frame .QLabel#labelImmatureText { /* Immature Balance Label */
+qproperty-alignment: 'AlignVCenter | AlignRight';
+min-width:160px;
+font-size:12px;
+background-color:#F8F6F6;
+margin-right:5px;
+padding-right:5px;
+}
+
+QWidget .QFrame#frame .QLabel#labelImmature { /* Immature Balance */
+qproperty-alignment: 'AlignVCenter | AlignLeft';
+font-size:12px;
+margin-left:0px;
+}
+
+QWidget .QFrame#frame .QLabel#labelWatchImmature { /* Watch-only Immature Balance */
+qproperty-alignment: 'AlignVCenter | AlignLeft';
+font-size:12px;
+margin-left:16px;
+}
+
+QWidget .QFrame#frame .QLabel#labelTotalText { /* Total Balance Label */
+qproperty-alignment: 'AlignVCenter | AlignRight';
+min-width:160px;
+font-size:12px;
+background-color:#F8F6F6;
+margin-right:5px;
+padding-right:5px;
+}
+
+QWidget .QFrame#frame .QLabel#labelTotal { /* Total Balance */
+qproperty-alignment: 'AlignVCenter | AlignLeft';
+font-size:12px;
+margin-left:0px;
+}
+
+QWidget .QFrame#frame .QLabel#labelWatchTotal { /* Watch-only Total Balance */
+qproperty-alignment: 'AlignVCenter | AlignLeft';
+font-size:12px;
+margin-left:16px;
+}
+
+/* DARKSEND WIDGET */
+
+QWidget .QFrame#frameDarksend { /* Darksend Widget */
+background-color:transparent;
+qproperty-minimumSize: 451px 343px;
+}
+
+QWidget .QFrame#frameDarksend QWidget {
+qproperty-geometry: rect(10 0 431 35);
+}
+
+QWidget .QFrame#frameDarksend .QLabel#label_2 { /* Darksend Header */
+qproperty-alignment: 'AlignVCenter | AlignCenter';
+min-width:451px;
+background-color:#56ABD8;
+color:#fff;
+margin-right:5px;
+padding-right:5px;
+font-weight:bold;
+font-size:14px;
+min-height:35px;
+}
+/******************************************************************/
+QWidget .QFrame#frameDarksend .QLabel#labelDarksendSyncStatus { /* Darksend Sync Status */
+qproperty-alignment: 'AlignVCenter | AlignLeft';
+margin-left:2px;
+}
+
+QWidget .QFrame#frameDarksend #formLayoutWidget {
+qproperty-geometry: rect(10 51 451 175);
+}
+
+QWidget .QFrame#frameDarksend #formLayoutWidget > .QLabel {
+min-width:175px;
+font-weight:normal;
+min-height:25px;
+}
+
+QWidget .QFrame#frameDarksend #formLayoutWidget .QLabel#label_6 { /* Darksend Status Label */
+qproperty-alignment: 'AlignVCenter | AlignRight';
+min-width:160px;
+background-color:#F8F6F6;
+margin-right:5px;
+padding-right:5px;
+}
+
+QWidget .QFrame#frameDarksend #formLayoutWidget .QLabel#darksendEnabled { /* Darksend Status */
+
+}
+
+QWidget .QFrame#frameDarksend #formLayoutWidget .QLabel#label_7 { /* Darksend Completion Label */
+qproperty-alignment: 'AlignVCenter | AlignRight';
+min-width:160px;
+background-color:#F8F6F6;
+margin-right:5px;
+padding-right:5px;
+
+}
+
+QWidget .QFrame#frameDarksend #formLayoutWidget .QProgressBar#darksendProgress { /* Darksend Completion */
+border: 1px solid #818181;
+border-radius: 1px;
+margin-right:43px;
+text-align: right;
+color:#818181;
+}
+
+QWidget .QFrame#frameDarksend #formLayoutWidget .QProgressBar#darksendProgress::chunk {
+background-color: #3398CC;
+width:1px;
+}
+
+QWidget .QFrame#frameDarksend #formLayoutWidget .QLabel#labelAnonymizedText { /* Darksend Balance Label */
+qproperty-alignment: 'AlignVCenter | AlignRight';
+min-width:160px;
+background-color:#F8F6F6;
+margin-right:5px;
+padding-right:5px;
+}
+
+QWidget .QFrame#frameDarksend #formLayoutWidget .QLabel#labelAnonymized { /* Darksend Balance */
+
+}
+
+QWidget .QFrame#frameDarksend #formLayoutWidget .QLabel#label_8 { /* Darksend Amount and Rounds Label */
+qproperty-alignment: 'AlignVCenter | AlignRight';
+min-width:160px;
+background-color:#F8F6F6;
+margin-right:5px;
+padding-right:5px;
+}
+
+QWidget .QFrame#frameDarksend #formLayoutWidget .QLabel#labelAmountRounds { /* Darksend Amount and Rounds */
+
+}
+
+QWidget .QFrame#frameDarksend #formLayoutWidget .QLabel#label_9 { /* Darksend Submitted Denom Label */
+qproperty-alignment: 'AlignVCenter | AlignRight';
+min-width:160px;
+background-color:#F8F6F6;
+margin-right:5px;
+padding-right:5px;
+}
+
+QWidget .QFrame#frameDarksend #formLayoutWidget .QLabel#labelSubmittedDenom { /* Darksend Submitted Denom */
+
+}
+
+QWidget .QFrame#frameDarksend .QLabel#darksendStatus { /* Darksend Status Notifications */
+qproperty-alignment: 'AlignVCenter | AlignCenter';
+qproperty-geometry: rect(70 226 395 34);
+font-size:11px;
+color:#818181;
+}
+
+/* DARKSEND BUTTONS */
+
+QWidget .QFrame#frameDarksend .QPushButton { /* Darksend Buttons - General Attributes */
+border:0px solid #ffffff;
+}
+
+QWidget .QFrame#frameDarksend QPushButton:focus {
+border:none;
+outline:none;
+}
+
+QWidget .QFrame#frameDarksend .QPushButton#runAutoDenom { /* No idea why this button is in the .UI file... */
+qproperty-geometry: rect(0 0 0 0);
+}
+
+QWidget .QFrame#frameDarksend .QPushButton#toggleDarksend { /* Start Darksend Mixing */
+ qproperty-geometry: rect(9 253 441 40);
+font-size:15px;
+font-weight:bold;
+color:#ffffff;
+padding-left:10px;
+padding-right:10px;
+padding-top:5px;
+padding-bottom:6px;
+}
+
+QWidget .QFrame#frameDarksend .QPushButton#toggleDarksend:hover {
+
+}
+
+QWidget .QFrame#frameDarksend .QPushButton#darksendAuto { /* Try Mix Button */
+ qproperty-geometry: rect(9 304 220 30);
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb);
+border:1px solid #d2d2d2;
+color:#616161;
+min-height:25px;
+font-size:9px;
+padding:0px;
+}
+
+QWidget .QFrame#frameDarksend .QPushButton#darksendAuto:hover {
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb);
+color:#333;
+}
+
+QWidget .QFrame#frameDarksend .QPushButton#darksendAuto:pressed {
+border:1px solid #9e9e9e;
+}
+
+QWidget .QFrame#frameDarksend .QPushButton#darksendReset { /* Reset Button */
+ qproperty-geometry: rect(232 304 220 30);
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb);
+border:1px solid #d2d2d2;
+color:#616161;
+min-height:25px;
+font-size:9px;
+padding:0px;
+}
+
+QWidget .QFrame#frameDarksend .QPushButton#darksendReset:hover {
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb);
+color:#333;
+}
+
+QWidget .QFrame#frameDarksend .QPushButton#darksendReset:pressed {
+border:1px solid #9e9e9e;
+}
+
+/* RECENT TRANSACTIONS */
+
+QWidget .QFrame#frame_2 { /* Transactions Widget */
+min-width:410px;
+margin-right:20px;
+margin-left:0;
+margin-top:15px;
+background-image: url(':/images/light/dash_logo_horizontal');
+background-repeat:none;
+}
+
+QWidget .QFrame#frame_2 .QLabel#label_4 { /* Recent Transactions Label */
+min-width:180px;
+color:#3398CC;
+margin-left:67px;
+margin-top:83px;
+margin-right:5px;
+padding-right:5px;
+font-weight:bold;
+font-size:15px;
+min-height:24px;
+}
+
+QWidget .QFrame#frame_2 .QLabel#labelTransactionsStatus { /* Recent Transactions Sync Status */
+qproperty-alignment: 'AlignBottom | AlignRight';
+min-width:93px;
+margin-top:83px;
+margin-left:16px;
+margin-right:5px;
+min-height:16px;
+}
+
+QWidget .QFrame#frame_2 QListView { /* Transaction List */
+font-weight:normal;
+font-size:12px;
+max-width:369px;
+margin-top:12px;
+margin-left:0px; /* CSS Voodoo - set to -66px to hide default transaction icons */
+}
+
+/* SEND DIALOG */
+
+QDialog#SendCoinsDialog .QFrame#frameCoinControl { /* Coin Control Section */
+
+}
+
+QDialog#SendCoinsDialog .QFrame#frameCoinControl > .QLabel { /* Default Font Color and Size */
+font-weight:normal;
+}
+
+QDialog#SendCoinsDialog .QFrame#frameCoinControl .QPushButton#pushButtonCoinControl { /* Coin Control Inputs Button */
+padding-left:10px;
+padding-right:10px;
+min-height:25px;
+}
+
+QDialog#SendCoinsDialog .QFrame#frameCoinControl .QLabel#labelCoinControlFeatures { /* Coin Control Header */
+color:#3398CC;
+font-weight:bold;
+font-size:14px;
+}
+
+QDialog#SendCoinsDialog .QFrame#frameCoinControl .QWidget#widgetCoinControl { /* Coin Control Inputs */
+}
+
+QDialog#SendCoinsDialog .QFrame#frameCoinControl .QWidget#widgetCoinControl > .QLabel { /* Coin Control Inputs Labels */
+padding:2px;
+}
+
+QDialog#SendCoinsDialog .QFrame#frameCoinControl .QCheckBox#checkBoxCoinControlChange { /* Custom Change Label */
+}
+
+QDialog#SendCoinsDialog .QFrame#frameCoinControl .QValidatedLineEdit#lineEditCoinControlChange { /* Custom Change Address */
+}
+
+QDialog#SendCoinsDialog .QFrame#frameCoinControl .QLabel#labelCoinControlChangeLabel { /* Custom Change Address Validation Label */
+font-weight:normal;
+qproperty-margin:-6;
+margin-right:112px;
+}
+
+QDialog#SendCoinsDialog .QScrollArea#scrollArea .QWidget#scrollAreaWidgetContents { /* Send To Widget */
+background:transparent;
+}
+
+QDialog#SendCoinsDialog .QPushButton#sendButton { /* Send Button */
+padding-left:10px;
+padding-right:10px;
+}
+
+QDialog#SendCoinsDialog .QPushButton#clearButton { /* Clear Button */
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb);
+border:1px solid #d2d2d2;
+color:#616161;
+padding-left:10px;
+padding-right:10px;
+}
+
+QDialog#SendCoinsDialog .QPushButton#clearButton:hover {
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb);
+color:#333;
+}
+
+QDialog#SendCoinsDialog .QPushButton#clearButton:pressed {
+border:1px solid #9e9e9e;
+}
+
+QDialog#SendCoinsDialog .QPushButton#addButton { /* Add Button */
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb);
+border:1px solid #d2d2d2;
+color:#616161;
+padding-left:10px;
+padding-right:10px;
+}
+
+QDialog#SendCoinsDialog .QPushButton#addButton:hover {
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb);
+color:#333;
+}
+
+QDialog#SendCoinsDialog .QPushButton#addButton:pressed {
+border:1px solid #9e9e9e;
+}
+
+QDialog#SendCoinsDialog .QCheckBox#checkUseDarksend { /* Darksend Checkbox */
+color:#616161;
+font-weight:bold;
+background: qradialgradient(cx:0.5, cy:0.5, radius: 0.5, fx:0.5, fy:0.5, stop:0 rgba(248, 246, 246, 128), stop: 1 rgba(0, 0, 0, 0));
+border-radius:5px;
+padding-top:20px;
+padding-bottom:18px;
+}
+
+QDialog#SendCoinsDialog .QCheckBox#checkInstantX { /* InstantX Checkbox */
+color:#616161;
+font-weight:bold;
+background: qradialgradient(cx:0.5, cy:0.5, radius: 0.5, fx:0.5, fy:0.5, stop:0 rgba(248, 246, 246, 128), stop: 1 rgba(0, 0, 0, 0));
+border-radius:5px;
+padding-top:20px;
+padding-bottom:18px;
+margin-left:10px;
+margin-right:20px;
+}
+
+/* This QLabel uses name = "label" which conflicts with Address Book -> New Address */
+/* To maximize backwards compatibility this formatting has been removed */
+
+QDialog#SendCoinsDialog QLabel#label {
+/*margin-left:20px;
+margin-right:-2px;
+padding-right:-2px;
+color:#616161;
+font-size:14px;
+font-weight:bold;
+border-radius:5px;
+padding-top:20px;
+padding-bottom:20px;*/
+min-height:27px;
+}
+
+QDialog#SendCoinsDialog QLabel#labelBalance {
+margin-left:0px;
+padding-left:0px;
+color:#333333;
+/* font-weight:bold;
+border-radius:5px;
+padding-top:20px;
+padding-bottom:20px; */
+min-height:27px;
+}
+
+
+/* SEND COINS ENTRY */
+
+QStackedWidget#SendCoinsEntry .QFrame#SendCoins > .QLabel { /* Send Coin Entry Labels */
+background-color:#56ABD8;
+min-width:102px;
+font-weight:bold;
+font-size:11px;
+color:#ffffff;
+min-height:25px;
+margin-right:5px;
+padding-right:5px;
+}
+
+QStackedWidget#SendCoinsEntry .QFrame#SendCoins .QLabel#amountLabel {
+background-color:#6a6a6a;
+}
+
+QStackedWidget#SendCoinsEntry .QValidatedLineEdit#payTo { /* Pay To Input Field */
+}
+
+QStackedWidget#SendCoinsEntry .QToolButton { /* General Settings for Pay To Icons */
+background-color:transparent;
+padding-left:5px;
+padding-right:5px;
+border: 0;
+outline: 0;
+}
+
+QStackedWidget#SendCoinsEntry .QToolButton#addressBookButton { /* Address Book Button */
+padding-left:10px;
+}
+
+QStackedWidget#SendCoinsEntry .QToolButton#addressBookButton {
+}
+
+QStackedWidget#SendCoinsEntry .QToolButton#pasteButton {
+}
+
+QStackedWidget#SendCoinsEntry .QToolButton#deleteButton {
+}
+
+QStackedWidget#SendCoinsEntry .QLineEdit#addAsLabel { /* Pay To Input Field */
+}
+
+/* COIN CONTROL POPUP */
+
+QDialog#CoinControlDialog { /* Coin Control Dialog Window */
+background-color:#F8F6F6;
+}
+
+QDialog#CoinControlDialog .QLabel#labelCoinControlQuantityText { /* Coin Control Quantity Label */
+min-height:30px;
+padding-left:15px;
+}
+
+QDialog#CoinControlDialog .QLabel#labelCoinControlQuantity { /* Coin Control Quantity */
+min-height:30px;
+}
+
+QDialog#CoinControlDialog .QLabel#labelCoinControlBytesText { /* Coin Control Bytes Label */
+padding-left:15px;
+}
+
+QDialog#CoinControlDialog .QLabel#labelCoinControlBytes { /* Coin Control Bytes */
+}
+
+QDialog#CoinControlDialog .QLabel#labelCoinControlAmountText { /* Coin Control Amount Label */
+min-height:30px;
+padding-left:15px;
+}
+
+QDialog#CoinControlDialog .QLabel#labelCoinControlAmount { /* Coin Control Amount */
+min-height:30px;
+}
+
+QDialog#CoinControlDialog .QLabel#labelCoinControlPriorityText { /* Coin Control Priority Label */
+padding-left:15px;
+}
+
+QDialog#CoinControlDialog .QLabel#labelCoinControlPriority { /* Coin Control Priority */
+}
+
+QDialog#CoinControlDialog .QLabel#labelCoinControlFeeText { /* Coin Control Fee Label */
+min-height:30px;
+padding-left:15px;
+}
+
+QDialog#CoinControlDialog .QLabel#labelCoinControlFee { /* Coin Control Fee */
+min-height:30px;
+}
+
+QDialog#CoinControlDialog .QLabel#labelCoinControlLowOutputText { /* Coin Control Low Output Label */
+padding-left:15px;
+}
+
+QDialog#CoinControlDialog .QLabel#labelCoinControlLowOutput { /* Coin Control Low Output */
+}
+
+QDialog#CoinControlDialog .QLabel#labelCoinControlAfterFeeText { /* Coin Control After Fee Label */
+min-height:30px;
+padding-left:15px;
+}
+
+QDialog#CoinControlDialog .QLabel#labelCoinControlAfterFee { /* Coin Control After Fee */
+min-height:30px;
+}
+
+QDialog#CoinControlDialog .QLabel#labelCoinControlChangeText { /* Coin Control Change Label */
+padding-left:15px;
+}
+
+QDialog#CoinControlDialog .QLabel#labelCoinControlChange { /* Coin Control Change */
+
+}
+
+QDialog#CoinControlDialog .QFrame#frame .QPushButton#pushButtonSelectAll { /* (un)select all button */
+padding-left:10px;
+padding-right:10px;
+min-height:25px;
+}
+
+QDialog#CoinControlDialog .QFrame#frame .QPushButton#pushButtonToggleLock { /* Toggle lock state button */
+padding-left:10px;
+padding-right:10px;
+min-height:25px;
+}
+
+QDialog#CoinControlDialog .QDialogButtonBox#buttonBox QPushButton { /* Coin Control 'OK' button */
+}
+
+QDialog#CoinControlDialog .QFrame#frame .QRadioButton#radioTreeMode { /* Coin Control Tree Mode Selector */
+color:#818181;
+background-color:transparent;
+}
+
+QDialog#CoinControlDialog .QFrame#frame .QRadioButton#radioListMode { /* Coin Control List Mode Selector */
+color:#818181;
+background-color:transparent;
+}
+
+QDialog#CoinControlDialog QHeaderView::section:first { /* Bug Fix: the number "1" displays in this table for some reason... */
+color:transparent;
+}
+
+QDialog#CoinControlDialog .CoinControlTreeWidget#treeWidget { /* Coin Control Widget Container */
+outline:0;
+background-color:#ffffff;
+border:0px solid #818181;
+}
+
+QDialog#CoinControlDialog .CoinControlTreeWidget#treeWidget::item {
+}
+
+QDialog#CoinControlDialog .CoinControlTreeWidget#treeWidget::item:selected { /* Coin Control Item (selected) */
+background-color:#f7f7f7;
+color:#333;
+}
+
+QDialog#CoinControlDialog .CoinControlTreeWidget#treeWidget::item:checked { /* Coin Control Item (checked) */
+background-color:#f7f7f7;
+color:#333;
+}
+
+QDialog#CoinControlDialog .CoinControlTreeWidget#treeWidget::branch:selected { /* Coin Control Branch Icon */
+background-image: url(':/images/light/drkblue_qtreeview_selected');
+background-repeat:no-repeat;
+background-position:center;
+background-color:#f7f7f7;
+color:#333;
+}
+
+QDialog#CoinControlDialog .CoinControlTreeWidget#treeWidget::branch:checked { /* Coin Control Branch Icon */
+background-image: url(':/images/light/drkblue_qtreeview_selected');
+background-repeat:no-repeat;
+background-position:center;
+background-color:#f7f7f7;
+color:#333;
+}
+
+QDialog#CoinControlDialog .CoinControlTreeWidget#treeWidget::seperator {
+
+}
+
+QDialog#CoinControlDialog .CoinControlTreeWidget#treeWidget::indicator { /* Coin Control Widget Checkbox */
+
+}
+
+/* RECEIVE COINS */
+
+QWidget#ReceiveCoinsDialog .QFrame#frame2 .QLabel#label_2 { /* Label Label */
+background-color:#56ABD8;
+min-width:102px;
+color:#ffffff;
+font-weight:bold;
+font-size:11px;
+padding-right:5px;
+}
+
+QWidget#ReceiveCoinsDialog .QFrame#frame2 .QLabel#label { /* Amount Label */
+background-color:#6a6a6a;
+min-width:102px;
+color:#ffffff;
+font-weight:bold;
+font-size:11px;
+padding-right:5px;
+}
+
+QWidget#ReceiveCoinsDialog .QFrame#frame2 .QLabel#label_3 { /* Message Label */
+background-color:#56ABD8;
+min-width:102px;
+color:#ffffff;
+font-weight:bold;
+font-size:11px;
+padding-right:5px;
+}
+
+QWidget#ReceiveCoinsDialog .QFrame#frame2 QPushButton#clearButton { /* Clear Button */
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb);
+border:1px solid #d2d2d2;
+color:#616161;
+padding-left:10px;
+padding-right:10px;
+}
+
+QWidget#ReceiveCoinsDialog .QFrame#frame2 QPushButton#clearButton:hover {
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb);
+color:#333;
+}
+
+QWidget#ReceiveCoinsDialog .QFrame#frame2 QPushButton#clearButton:pressed {
+border:1px solid #9e9e9e;
+}
+
+QWidget#ReceiveCoinsDialog .QFrame#frame QPushButton#showRequestButton { /* Show Button */
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb);
+border:1px solid #d2d2d2;
+color:#616161;
+padding-left:10px;
+padding-right:10px;
+}
+
+QWidget#ReceiveCoinsDialog .QFrame#frame QPushButton#showRequestButton:hover {
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb);
+color:#333;
+}
+
+QWidget#ReceiveCoinsDialog .QFrame#frame QPushButton#showRequestButton:pressed {
+border:1px solid #9e9e9e;
+}
+
+QWidget#ReceiveCoinsDialog .QFrame#frame QPushButton#removeRequestButton { /* Remove Button */
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(250, 250, 250, 128), stop: .95 rgba(250, 250, 250, 255), stop: 1 #ebebeb);
+border:1px solid #d2d2d2;
+color:#616161;
+padding-left:10px;
+padding-right:10px;
+}
+
+QWidget#ReceiveCoinsDialog .QFrame#frame QPushButton#removeRequestButton:hover {
+background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: .01 #f6f6f6, stop: .1 rgba(240, 240, 240, 255), stop: .95 rgba(240, 240, 240, 255), stop: 1 #ebebeb);
+color:#333;
+}
+
+QWidget#ReceiveCoinsDialog .QFrame#frame QPushButton#removeRequestButton:pressed {
+border:1px solid #9e9e9e;
+}
+
+QWidget#ReceiveCoinsDialog .QFrame#frame .QLabel#label_6 { /* Requested Payments History Label */
+color:#3398CC;
+font-weight:bold;
+font-size:14px;
+}
+
+/* RECEIVE COINS DIALOG */
+
+QDialog#ReceiveRequestDialog {
+background-color:#F8F6F6;
+}
+
+QDialog#ReceiveRequestDialog QTextEdit { /* Contents of Receive Coin Dialog */
+border:1px solid #d7d7d7;
+}
+
+/* TRANSACTIONS PAGE */
+
+TransactionView QLineEdit { /* Address Filter */
+margin-bottom:2px;
+margin-right:1px;
+min-width:111px;
+text-align:center;
+}
+
+TransactionView QComboBox {
+margin-bottom:1px;
+margin-right:1px;
+}
+
+QLabel#transactionSumLabel { /* Example of setObjectName for widgets without name */
+color:#333333;
+font-weight:bold;
+}
+
+QLabel#transactionSum { /* Example of setObjectName for widgets without name */
+color:#333333;
+}
+
+/* TRANSACTION DETAIL DIALOG */
+
+QDialog#TransactionDescDialog {
+background-color:#F8F6F6;
+}
+
+QDialog#TransactionDescDialog QTextEdit { /* Contents of Receive Coin Dialog */
+border:1px solid #d7d7d7;
+}
+
+
diff --git a/src/qt/res/icons/bitcoin.ico b/src/qt/res/icons/bitcoin.ico
old mode 100755
new mode 100644
diff --git a/src/qt/res/icons/bitcoin_testnet.ico b/src/qt/res/icons/bitcoin_testnet.ico
old mode 100755
new mode 100644
diff --git a/src/qt/res/icons/add.png b/src/qt/res/icons/drkblue/add.png
similarity index 100%
rename from src/qt/res/icons/add.png
rename to src/qt/res/icons/drkblue/add.png
diff --git a/src/qt/res/icons/address-book.png b/src/qt/res/icons/drkblue/address-book.png
similarity index 100%
rename from src/qt/res/icons/address-book.png
rename to src/qt/res/icons/drkblue/address-book.png
diff --git a/src/qt/res/icons/drkblue/bitcoin.icns b/src/qt/res/icons/drkblue/bitcoin.icns
new file mode 100644
index 000000000000..c17b56351de6
Binary files /dev/null and b/src/qt/res/icons/drkblue/bitcoin.icns differ
diff --git a/src/qt/res/icons/drkblue/bitcoin.ico b/src/qt/res/icons/drkblue/bitcoin.ico
new file mode 100644
index 000000000000..9ae1ba55b6d8
Binary files /dev/null and b/src/qt/res/icons/drkblue/bitcoin.ico differ
diff --git a/src/qt/res/icons/drkblue/bitcoin.png b/src/qt/res/icons/drkblue/bitcoin.png
new file mode 100644
index 000000000000..257ff1419a7b
Binary files /dev/null and b/src/qt/res/icons/drkblue/bitcoin.png differ
diff --git a/src/qt/res/icons/drkblue/bitcoin_testnet.ico b/src/qt/res/icons/drkblue/bitcoin_testnet.ico
new file mode 100644
index 000000000000..b86e2a703946
Binary files /dev/null and b/src/qt/res/icons/drkblue/bitcoin_testnet.ico differ
diff --git a/src/qt/res/icons/drkblue/bitcoin_testnet.png b/src/qt/res/icons/drkblue/bitcoin_testnet.png
new file mode 100644
index 000000000000..5e044d34083c
Binary files /dev/null and b/src/qt/res/icons/drkblue/bitcoin_testnet.png differ
diff --git a/src/qt/res/icons/browse.png b/src/qt/res/icons/drkblue/browse.png
similarity index 100%
rename from src/qt/res/icons/browse.png
rename to src/qt/res/icons/drkblue/browse.png
diff --git a/src/qt/res/icons/clock1.png b/src/qt/res/icons/drkblue/clock1.png
similarity index 100%
rename from src/qt/res/icons/clock1.png
rename to src/qt/res/icons/drkblue/clock1.png
diff --git a/src/qt/res/icons/clock2.png b/src/qt/res/icons/drkblue/clock2.png
similarity index 100%
rename from src/qt/res/icons/clock2.png
rename to src/qt/res/icons/drkblue/clock2.png
diff --git a/src/qt/res/icons/clock3.png b/src/qt/res/icons/drkblue/clock3.png
similarity index 100%
rename from src/qt/res/icons/clock3.png
rename to src/qt/res/icons/drkblue/clock3.png
diff --git a/src/qt/res/icons/clock4.png b/src/qt/res/icons/drkblue/clock4.png
similarity index 100%
rename from src/qt/res/icons/clock4.png
rename to src/qt/res/icons/drkblue/clock4.png
diff --git a/src/qt/res/icons/clock5.png b/src/qt/res/icons/drkblue/clock5.png
similarity index 100%
rename from src/qt/res/icons/clock5.png
rename to src/qt/res/icons/drkblue/clock5.png
diff --git a/src/qt/res/icons/configure.png b/src/qt/res/icons/drkblue/configure.png
similarity index 100%
rename from src/qt/res/icons/configure.png
rename to src/qt/res/icons/drkblue/configure.png
diff --git a/src/qt/res/icons/connect0_16.png b/src/qt/res/icons/drkblue/connect0_16.png
similarity index 100%
rename from src/qt/res/icons/connect0_16.png
rename to src/qt/res/icons/drkblue/connect0_16.png
diff --git a/src/qt/res/icons/connect1_16.png b/src/qt/res/icons/drkblue/connect1_16.png
similarity index 100%
rename from src/qt/res/icons/connect1_16.png
rename to src/qt/res/icons/drkblue/connect1_16.png
diff --git a/src/qt/res/icons/connect2_16.png b/src/qt/res/icons/drkblue/connect2_16.png
similarity index 100%
rename from src/qt/res/icons/connect2_16.png
rename to src/qt/res/icons/drkblue/connect2_16.png
diff --git a/src/qt/res/icons/connect3_16.png b/src/qt/res/icons/drkblue/connect3_16.png
similarity index 100%
rename from src/qt/res/icons/connect3_16.png
rename to src/qt/res/icons/drkblue/connect3_16.png
diff --git a/src/qt/res/icons/connect4_16.png b/src/qt/res/icons/drkblue/connect4_16.png
similarity index 100%
rename from src/qt/res/icons/connect4_16.png
rename to src/qt/res/icons/drkblue/connect4_16.png
diff --git a/src/qt/res/icons/debugwindow.png b/src/qt/res/icons/drkblue/debugwindow.png
similarity index 100%
rename from src/qt/res/icons/debugwindow.png
rename to src/qt/res/icons/drkblue/debugwindow.png
diff --git a/src/qt/res/icons/drkblue_address-book.png b/src/qt/res/icons/drkblue/drkblue_address-book.png
similarity index 100%
rename from src/qt/res/icons/drkblue_address-book.png
rename to src/qt/res/icons/drkblue/drkblue_address-book.png
diff --git a/src/qt/res/icons/drkblue_editcopy.png b/src/qt/res/icons/drkblue/drkblue_editcopy.png
similarity index 100%
rename from src/qt/res/icons/drkblue_editcopy.png
rename to src/qt/res/icons/drkblue/drkblue_editcopy.png
diff --git a/src/qt/res/icons/drkblue_editpaste.png b/src/qt/res/icons/drkblue/drkblue_editpaste.png
similarity index 100%
rename from src/qt/res/icons/drkblue_editpaste.png
rename to src/qt/res/icons/drkblue/drkblue_editpaste.png
diff --git a/src/qt/res/icons/drkblue_remove.png b/src/qt/res/icons/drkblue/drkblue_remove.png
similarity index 100%
rename from src/qt/res/icons/drkblue_remove.png
rename to src/qt/res/icons/drkblue/drkblue_remove.png
diff --git a/src/qt/res/icons/edit.png b/src/qt/res/icons/drkblue/edit.png
similarity index 100%
rename from src/qt/res/icons/edit.png
rename to src/qt/res/icons/drkblue/edit.png
diff --git a/src/qt/res/icons/editcopy.png b/src/qt/res/icons/drkblue/editcopy.png
similarity index 100%
rename from src/qt/res/icons/editcopy.png
rename to src/qt/res/icons/drkblue/editcopy.png
diff --git a/src/qt/res/icons/editpaste.png b/src/qt/res/icons/drkblue/editpaste.png
similarity index 100%
rename from src/qt/res/icons/editpaste.png
rename to src/qt/res/icons/drkblue/editpaste.png
diff --git a/src/qt/res/icons/export.png b/src/qt/res/icons/drkblue/export.png
similarity index 100%
rename from src/qt/res/icons/export.png
rename to src/qt/res/icons/drkblue/export.png
diff --git a/src/qt/res/icons/eye.png b/src/qt/res/icons/drkblue/eye.png
similarity index 100%
rename from src/qt/res/icons/eye.png
rename to src/qt/res/icons/drkblue/eye.png
diff --git a/src/qt/res/icons/eye_minus.png b/src/qt/res/icons/drkblue/eye_minus.png
similarity index 100%
rename from src/qt/res/icons/eye_minus.png
rename to src/qt/res/icons/drkblue/eye_minus.png
diff --git a/src/qt/res/icons/eye_plus.png b/src/qt/res/icons/drkblue/eye_plus.png
similarity index 100%
rename from src/qt/res/icons/eye_plus.png
rename to src/qt/res/icons/drkblue/eye_plus.png
diff --git a/src/qt/res/icons/filesave.png b/src/qt/res/icons/drkblue/filesave.png
similarity index 100%
rename from src/qt/res/icons/filesave.png
rename to src/qt/res/icons/drkblue/filesave.png
diff --git a/src/qt/res/icons/history.png b/src/qt/res/icons/drkblue/history.png
similarity index 100%
rename from src/qt/res/icons/history.png
rename to src/qt/res/icons/drkblue/history.png
diff --git a/src/qt/res/icons/key.png b/src/qt/res/icons/drkblue/key.png
similarity index 100%
rename from src/qt/res/icons/key.png
rename to src/qt/res/icons/drkblue/key.png
diff --git a/src/qt/res/icons/lock_closed.png b/src/qt/res/icons/drkblue/lock_closed.png
similarity index 100%
rename from src/qt/res/icons/lock_closed.png
rename to src/qt/res/icons/drkblue/lock_closed.png
diff --git a/src/qt/res/icons/lock_open.png b/src/qt/res/icons/drkblue/lock_open.png
similarity index 100%
rename from src/qt/res/icons/lock_open.png
rename to src/qt/res/icons/drkblue/lock_open.png
diff --git a/src/qt/res/icons/notsynced.png b/src/qt/res/icons/drkblue/notsynced.png
similarity index 100%
rename from src/qt/res/icons/notsynced.png
rename to src/qt/res/icons/drkblue/notsynced.png
diff --git a/src/qt/res/icons/overview.png b/src/qt/res/icons/drkblue/overview.png
similarity index 100%
rename from src/qt/res/icons/overview.png
rename to src/qt/res/icons/drkblue/overview.png
diff --git a/src/qt/res/icons/qrcode.png b/src/qt/res/icons/drkblue/qrcode.png
similarity index 100%
rename from src/qt/res/icons/qrcode.png
rename to src/qt/res/icons/drkblue/qrcode.png
diff --git a/src/qt/res/icons/quit.png b/src/qt/res/icons/drkblue/quit.png
similarity index 100%
rename from src/qt/res/icons/quit.png
rename to src/qt/res/icons/drkblue/quit.png
diff --git a/src/qt/res/icons/receive.png b/src/qt/res/icons/drkblue/receive.png
similarity index 100%
rename from src/qt/res/icons/receive.png
rename to src/qt/res/icons/drkblue/receive.png
diff --git a/src/qt/res/icons/remove.png b/src/qt/res/icons/drkblue/remove.png
similarity index 100%
rename from src/qt/res/icons/remove.png
rename to src/qt/res/icons/drkblue/remove.png
diff --git a/src/qt/res/icons/send.png b/src/qt/res/icons/drkblue/send.png
similarity index 100%
rename from src/qt/res/icons/send.png
rename to src/qt/res/icons/drkblue/send.png
diff --git a/src/qt/res/icons/synced.png b/src/qt/res/icons/drkblue/synced.png
similarity index 100%
rename from src/qt/res/icons/synced.png
rename to src/qt/res/icons/drkblue/synced.png
diff --git a/src/qt/res/icons/transaction0.png b/src/qt/res/icons/drkblue/transaction0.png
similarity index 100%
rename from src/qt/res/icons/transaction0.png
rename to src/qt/res/icons/drkblue/transaction0.png
diff --git a/src/qt/res/icons/transaction2.png b/src/qt/res/icons/drkblue/transaction2.png
similarity index 100%
rename from src/qt/res/icons/transaction2.png
rename to src/qt/res/icons/drkblue/transaction2.png
diff --git a/src/qt/res/icons/transaction_conflicted.png b/src/qt/res/icons/drkblue/transaction_conflicted.png
similarity index 100%
rename from src/qt/res/icons/transaction_conflicted.png
rename to src/qt/res/icons/drkblue/transaction_conflicted.png
diff --git a/src/qt/res/icons/tx_inout.png b/src/qt/res/icons/drkblue/tx_inout.png
similarity index 100%
rename from src/qt/res/icons/tx_inout.png
rename to src/qt/res/icons/drkblue/tx_inout.png
diff --git a/src/qt/res/icons/tx_input.png b/src/qt/res/icons/drkblue/tx_input.png
similarity index 100%
rename from src/qt/res/icons/tx_input.png
rename to src/qt/res/icons/drkblue/tx_input.png
diff --git a/src/qt/res/icons/tx_mined.png b/src/qt/res/icons/drkblue/tx_mined.png
similarity index 100%
rename from src/qt/res/icons/tx_mined.png
rename to src/qt/res/icons/drkblue/tx_mined.png
diff --git a/src/qt/res/icons/tx_output.png b/src/qt/res/icons/drkblue/tx_output.png
similarity index 100%
rename from src/qt/res/icons/tx_output.png
rename to src/qt/res/icons/drkblue/tx_output.png
diff --git a/src/qt/res/icons/unit_dash.png b/src/qt/res/icons/drkblue/unit_dash.png
similarity index 100%
rename from src/qt/res/icons/unit_dash.png
rename to src/qt/res/icons/drkblue/unit_dash.png
diff --git a/src/qt/res/icons/unit_duffs.png b/src/qt/res/icons/drkblue/unit_duffs.png
similarity index 100%
rename from src/qt/res/icons/unit_duffs.png
rename to src/qt/res/icons/drkblue/unit_duffs.png
diff --git a/src/qt/res/icons/unit_mdash.png b/src/qt/res/icons/drkblue/unit_mdash.png
similarity index 100%
rename from src/qt/res/icons/unit_mdash.png
rename to src/qt/res/icons/drkblue/unit_mdash.png
diff --git a/src/qt/res/icons/unit_tdash.png b/src/qt/res/icons/drkblue/unit_tdash.png
similarity index 100%
rename from src/qt/res/icons/unit_tdash.png
rename to src/qt/res/icons/drkblue/unit_tdash.png
diff --git a/src/qt/res/icons/unit_tduffs.png b/src/qt/res/icons/drkblue/unit_tduffs.png
similarity index 100%
rename from src/qt/res/icons/unit_tduffs.png
rename to src/qt/res/icons/drkblue/unit_tduffs.png
diff --git a/src/qt/res/icons/unit_tmdash.png b/src/qt/res/icons/drkblue/unit_tmdash.png
similarity index 100%
rename from src/qt/res/icons/unit_tmdash.png
rename to src/qt/res/icons/drkblue/unit_tmdash.png
diff --git a/src/qt/res/icons/unit_tudash.png b/src/qt/res/icons/drkblue/unit_tudash.png
similarity index 100%
rename from src/qt/res/icons/unit_tudash.png
rename to src/qt/res/icons/drkblue/unit_tudash.png
diff --git a/src/qt/res/icons/unit_udash.png b/src/qt/res/icons/drkblue/unit_udash.png
similarity index 100%
rename from src/qt/res/icons/unit_udash.png
rename to src/qt/res/icons/drkblue/unit_udash.png
diff --git a/src/qt/res/icons/light/_history.png b/src/qt/res/icons/light/_history.png
new file mode 100755
index 000000000000..0c202685943f
Binary files /dev/null and b/src/qt/res/icons/light/_history.png differ
diff --git a/src/qt/res/icons/light/add.png b/src/qt/res/icons/light/add.png
new file mode 100755
index 000000000000..0e2674b9c978
Binary files /dev/null and b/src/qt/res/icons/light/add.png differ
diff --git a/src/qt/res/icons/light/address-book.png b/src/qt/res/icons/light/address-book.png
new file mode 100644
index 000000000000..4496a0b16f19
Binary files /dev/null and b/src/qt/res/icons/light/address-book.png differ
diff --git a/src/qt/res/icons/light/bitcoin.icns b/src/qt/res/icons/light/bitcoin.icns
new file mode 100644
index 000000000000..b8ee4fbf8ad9
Binary files /dev/null and b/src/qt/res/icons/light/bitcoin.icns differ
diff --git a/src/qt/res/icons/light/bitcoin.ico b/src/qt/res/icons/light/bitcoin.ico
new file mode 100755
index 000000000000..037611c8aa73
Binary files /dev/null and b/src/qt/res/icons/light/bitcoin.ico differ
diff --git a/src/qt/res/icons/light/bitcoin.png b/src/qt/res/icons/light/bitcoin.png
new file mode 100755
index 000000000000..b5181822f429
Binary files /dev/null and b/src/qt/res/icons/light/bitcoin.png differ
diff --git a/src/qt/res/icons/light/bitcoin_testnet.ico b/src/qt/res/icons/light/bitcoin_testnet.ico
new file mode 100755
index 000000000000..f9f7a91b74cb
Binary files /dev/null and b/src/qt/res/icons/light/bitcoin_testnet.ico differ
diff --git a/src/qt/res/icons/light/bitcoin_testnet.png b/src/qt/res/icons/light/bitcoin_testnet.png
new file mode 100755
index 000000000000..1247f23f621a
Binary files /dev/null and b/src/qt/res/icons/light/bitcoin_testnet.png differ
diff --git a/src/qt/res/icons/light/browse.png b/src/qt/res/icons/light/browse.png
new file mode 100755
index 000000000000..ae13a151d5ad
Binary files /dev/null and b/src/qt/res/icons/light/browse.png differ
diff --git a/src/qt/res/icons/light/clock1.png b/src/qt/res/icons/light/clock1.png
new file mode 100755
index 000000000000..da04562f818c
Binary files /dev/null and b/src/qt/res/icons/light/clock1.png differ
diff --git a/src/qt/res/icons/light/clock2.png b/src/qt/res/icons/light/clock2.png
new file mode 100755
index 000000000000..cd6afb113ea0
Binary files /dev/null and b/src/qt/res/icons/light/clock2.png differ
diff --git a/src/qt/res/icons/light/clock3.png b/src/qt/res/icons/light/clock3.png
new file mode 100755
index 000000000000..5d013aec3377
Binary files /dev/null and b/src/qt/res/icons/light/clock3.png differ
diff --git a/src/qt/res/icons/light/clock4.png b/src/qt/res/icons/light/clock4.png
new file mode 100755
index 000000000000..26a1dd122792
Binary files /dev/null and b/src/qt/res/icons/light/clock4.png differ
diff --git a/src/qt/res/icons/light/clock5.png b/src/qt/res/icons/light/clock5.png
new file mode 100755
index 000000000000..16f9de275626
Binary files /dev/null and b/src/qt/res/icons/light/clock5.png differ
diff --git a/src/qt/res/icons/light/configure.png b/src/qt/res/icons/light/configure.png
new file mode 100755
index 000000000000..29ac0c3556e0
Binary files /dev/null and b/src/qt/res/icons/light/configure.png differ
diff --git a/src/qt/res/icons/light/connect0_16.png b/src/qt/res/icons/light/connect0_16.png
new file mode 100755
index 000000000000..66f3ae4f86a8
Binary files /dev/null and b/src/qt/res/icons/light/connect0_16.png differ
diff --git a/src/qt/res/icons/light/connect1_16.png b/src/qt/res/icons/light/connect1_16.png
new file mode 100755
index 000000000000..2d43d0864dfd
Binary files /dev/null and b/src/qt/res/icons/light/connect1_16.png differ
diff --git a/src/qt/res/icons/light/connect2_16.png b/src/qt/res/icons/light/connect2_16.png
new file mode 100755
index 000000000000..bcb003bae170
Binary files /dev/null and b/src/qt/res/icons/light/connect2_16.png differ
diff --git a/src/qt/res/icons/light/connect3_16.png b/src/qt/res/icons/light/connect3_16.png
new file mode 100755
index 000000000000..21ac978db7a6
Binary files /dev/null and b/src/qt/res/icons/light/connect3_16.png differ
diff --git a/src/qt/res/icons/light/connect4_16.png b/src/qt/res/icons/light/connect4_16.png
new file mode 100755
index 000000000000..663b9e500ab9
Binary files /dev/null and b/src/qt/res/icons/light/connect4_16.png differ
diff --git a/src/qt/res/icons/light/dash.icns b/src/qt/res/icons/light/dash.icns
new file mode 100755
index 000000000000..e154636d4ec8
Binary files /dev/null and b/src/qt/res/icons/light/dash.icns differ
diff --git a/src/qt/res/icons/light/debugwindow.png b/src/qt/res/icons/light/debugwindow.png
new file mode 100755
index 000000000000..fd47c1a913cb
Binary files /dev/null and b/src/qt/res/icons/light/debugwindow.png differ
diff --git a/src/qt/res/icons/light/drkblue_address-book.png b/src/qt/res/icons/light/drkblue_address-book.png
new file mode 100644
index 000000000000..878e4d55daaf
Binary files /dev/null and b/src/qt/res/icons/light/drkblue_address-book.png differ
diff --git a/src/qt/res/icons/light/drkblue_editcopy.png b/src/qt/res/icons/light/drkblue_editcopy.png
new file mode 100644
index 000000000000..df69301b6516
Binary files /dev/null and b/src/qt/res/icons/light/drkblue_editcopy.png differ
diff --git a/src/qt/res/icons/light/drkblue_editpaste.png b/src/qt/res/icons/light/drkblue_editpaste.png
new file mode 100644
index 000000000000..d52a61db90d0
Binary files /dev/null and b/src/qt/res/icons/light/drkblue_editpaste.png differ
diff --git a/src/qt/res/icons/light/drkblue_remove.png b/src/qt/res/icons/light/drkblue_remove.png
new file mode 100644
index 000000000000..a44b6d130b5a
Binary files /dev/null and b/src/qt/res/icons/light/drkblue_remove.png differ
diff --git a/src/qt/res/icons/light/edit.png b/src/qt/res/icons/light/edit.png
new file mode 100755
index 000000000000..57eb799cbfe5
Binary files /dev/null and b/src/qt/res/icons/light/edit.png differ
diff --git a/src/qt/res/icons/light/editcopy.png b/src/qt/res/icons/light/editcopy.png
new file mode 100755
index 000000000000..f882aa2ad8a3
Binary files /dev/null and b/src/qt/res/icons/light/editcopy.png differ
diff --git a/src/qt/res/icons/light/editpaste.png b/src/qt/res/icons/light/editpaste.png
new file mode 100755
index 000000000000..a2581863867d
Binary files /dev/null and b/src/qt/res/icons/light/editpaste.png differ
diff --git a/src/qt/res/icons/light/export.png b/src/qt/res/icons/light/export.png
new file mode 100755
index 000000000000..f6aa01c386aa
Binary files /dev/null and b/src/qt/res/icons/light/export.png differ
diff --git a/src/qt/res/icons/light/eye.png b/src/qt/res/icons/light/eye.png
new file mode 100644
index 000000000000..c4d182adbf4e
Binary files /dev/null and b/src/qt/res/icons/light/eye.png differ
diff --git a/src/qt/res/icons/light/eye_minus.png b/src/qt/res/icons/light/eye_minus.png
new file mode 100644
index 000000000000..08b048eae310
Binary files /dev/null and b/src/qt/res/icons/light/eye_minus.png differ
diff --git a/src/qt/res/icons/light/eye_plus.png b/src/qt/res/icons/light/eye_plus.png
new file mode 100644
index 000000000000..4ad653156f77
Binary files /dev/null and b/src/qt/res/icons/light/eye_plus.png differ
diff --git a/src/qt/res/icons/light/filesave.png b/src/qt/res/icons/light/filesave.png
new file mode 100755
index 000000000000..ae13a151d5ad
Binary files /dev/null and b/src/qt/res/icons/light/filesave.png differ
diff --git a/src/qt/res/icons/light/history.png b/src/qt/res/icons/light/history.png
new file mode 100644
index 000000000000..4496a0b16f19
Binary files /dev/null and b/src/qt/res/icons/light/history.png differ
diff --git a/src/qt/res/icons/light/key.png b/src/qt/res/icons/light/key.png
new file mode 100755
index 000000000000..c5bfcd044767
Binary files /dev/null and b/src/qt/res/icons/light/key.png differ
diff --git a/src/qt/res/icons/light/lock_closed.png b/src/qt/res/icons/light/lock_closed.png
new file mode 100755
index 000000000000..09b05e32f081
Binary files /dev/null and b/src/qt/res/icons/light/lock_closed.png differ
diff --git a/src/qt/res/icons/light/lock_open.png b/src/qt/res/icons/light/lock_open.png
new file mode 100755
index 000000000000..3967e9c14f1a
Binary files /dev/null and b/src/qt/res/icons/light/lock_open.png differ
diff --git a/src/qt/res/icons/light/notsynced.png b/src/qt/res/icons/light/notsynced.png
new file mode 100755
index 000000000000..09bd6c888673
Binary files /dev/null and b/src/qt/res/icons/light/notsynced.png differ
diff --git a/src/qt/res/icons/light/overview.png b/src/qt/res/icons/light/overview.png
new file mode 100644
index 000000000000..c2a1a9a81714
Binary files /dev/null and b/src/qt/res/icons/light/overview.png differ
diff --git a/src/qt/res/icons/light/qrcode.png b/src/qt/res/icons/light/qrcode.png
new file mode 100755
index 000000000000..a8d97174b391
Binary files /dev/null and b/src/qt/res/icons/light/qrcode.png differ
diff --git a/src/qt/res/icons/light/quit.png b/src/qt/res/icons/light/quit.png
new file mode 100755
index 000000000000..0dde6f395c07
Binary files /dev/null and b/src/qt/res/icons/light/quit.png differ
diff --git a/src/qt/res/icons/light/receive.png b/src/qt/res/icons/light/receive.png
new file mode 100644
index 000000000000..d7baa7580e84
Binary files /dev/null and b/src/qt/res/icons/light/receive.png differ
diff --git a/src/qt/res/icons/light/remove.png b/src/qt/res/icons/light/remove.png
new file mode 100755
index 000000000000..a44b6d130b5a
Binary files /dev/null and b/src/qt/res/icons/light/remove.png differ
diff --git a/src/qt/res/icons/light/send.png b/src/qt/res/icons/light/send.png
new file mode 100644
index 000000000000..d5216f212819
Binary files /dev/null and b/src/qt/res/icons/light/send.png differ
diff --git a/src/qt/res/icons/light/synced.png b/src/qt/res/icons/light/synced.png
new file mode 100755
index 000000000000..3fefc381b595
Binary files /dev/null and b/src/qt/res/icons/light/synced.png differ
diff --git a/src/qt/res/icons/light/toolbar.png b/src/qt/res/icons/light/toolbar.png
new file mode 100755
index 000000000000..7328a72a6449
Binary files /dev/null and b/src/qt/res/icons/light/toolbar.png differ
diff --git a/src/qt/res/icons/light/toolbar_testnet.png b/src/qt/res/icons/light/toolbar_testnet.png
new file mode 100755
index 000000000000..6578cfbda1bb
Binary files /dev/null and b/src/qt/res/icons/light/toolbar_testnet.png differ
diff --git a/src/qt/res/icons/light/transaction0.png b/src/qt/res/icons/light/transaction0.png
new file mode 100755
index 000000000000..4578666ee464
Binary files /dev/null and b/src/qt/res/icons/light/transaction0.png differ
diff --git a/src/qt/res/icons/light/transaction2.png b/src/qt/res/icons/light/transaction2.png
new file mode 100755
index 000000000000..db57f1ec2334
Binary files /dev/null and b/src/qt/res/icons/light/transaction2.png differ
diff --git a/src/qt/res/icons/light/transaction_conflicted.png b/src/qt/res/icons/light/transaction_conflicted.png
new file mode 100644
index 000000000000..51fff649abfa
Binary files /dev/null and b/src/qt/res/icons/light/transaction_conflicted.png differ
diff --git a/src/qt/res/icons/light/tx_inout.png b/src/qt/res/icons/light/tx_inout.png
new file mode 100644
index 000000000000..e733af293b73
Binary files /dev/null and b/src/qt/res/icons/light/tx_inout.png differ
diff --git a/src/qt/res/icons/light/tx_input.png b/src/qt/res/icons/light/tx_input.png
new file mode 100644
index 000000000000..9475f9666355
Binary files /dev/null and b/src/qt/res/icons/light/tx_input.png differ
diff --git a/src/qt/res/icons/light/tx_mined.png b/src/qt/res/icons/light/tx_mined.png
new file mode 100644
index 000000000000..33bfdf8ae842
Binary files /dev/null and b/src/qt/res/icons/light/tx_mined.png differ
diff --git a/src/qt/res/icons/light/tx_output.png b/src/qt/res/icons/light/tx_output.png
new file mode 100644
index 000000000000..ceedb1b71d7e
Binary files /dev/null and b/src/qt/res/icons/light/tx_output.png differ
diff --git a/src/qt/res/icons/light/unit_dash.png b/src/qt/res/icons/light/unit_dash.png
new file mode 100755
index 000000000000..8b29a6addcec
Binary files /dev/null and b/src/qt/res/icons/light/unit_dash.png differ
diff --git a/src/qt/res/icons/light/unit_duffs.png b/src/qt/res/icons/light/unit_duffs.png
new file mode 100755
index 000000000000..5bdbe653ec85
Binary files /dev/null and b/src/qt/res/icons/light/unit_duffs.png differ
diff --git a/src/qt/res/icons/light/unit_mdash.png b/src/qt/res/icons/light/unit_mdash.png
new file mode 100755
index 000000000000..0752dd3803fc
Binary files /dev/null and b/src/qt/res/icons/light/unit_mdash.png differ
diff --git a/src/qt/res/icons/light/unit_tdash.png b/src/qt/res/icons/light/unit_tdash.png
new file mode 100755
index 000000000000..07b60673cf44
Binary files /dev/null and b/src/qt/res/icons/light/unit_tdash.png differ
diff --git a/src/qt/res/icons/light/unit_tduffs.png b/src/qt/res/icons/light/unit_tduffs.png
new file mode 100755
index 000000000000..ef5a892b4fe3
Binary files /dev/null and b/src/qt/res/icons/light/unit_tduffs.png differ
diff --git a/src/qt/res/icons/light/unit_tmdash.png b/src/qt/res/icons/light/unit_tmdash.png
new file mode 100755
index 000000000000..65f5d889ed48
Binary files /dev/null and b/src/qt/res/icons/light/unit_tmdash.png differ
diff --git a/src/qt/res/icons/light/unit_tudash.png b/src/qt/res/icons/light/unit_tudash.png
new file mode 100755
index 000000000000..3c2209ae76e6
Binary files /dev/null and b/src/qt/res/icons/light/unit_tudash.png differ
diff --git a/src/qt/res/icons/light/unit_udash.png b/src/qt/res/icons/light/unit_udash.png
new file mode 100755
index 000000000000..c6a459804beb
Binary files /dev/null and b/src/qt/res/icons/light/unit_udash.png differ
diff --git a/src/qt/res/icons/trad/add.png b/src/qt/res/icons/trad/add.png
new file mode 100644
index 000000000000..809026c2024d
Binary files /dev/null and b/src/qt/res/icons/trad/add.png differ
diff --git a/src/qt/res/icons/trad/address-book.png b/src/qt/res/icons/trad/address-book.png
new file mode 100644
index 000000000000..f0b2f90bd0bf
Binary files /dev/null and b/src/qt/res/icons/trad/address-book.png differ
diff --git a/src/qt/res/icons/trad/bitcoin.icns b/src/qt/res/icons/trad/bitcoin.icns
new file mode 100644
index 000000000000..c17b56351de6
Binary files /dev/null and b/src/qt/res/icons/trad/bitcoin.icns differ
diff --git a/src/qt/res/icons/trad/bitcoin.ico b/src/qt/res/icons/trad/bitcoin.ico
new file mode 100644
index 000000000000..9ae1ba55b6d8
Binary files /dev/null and b/src/qt/res/icons/trad/bitcoin.ico differ
diff --git a/src/qt/res/icons/trad/bitcoin.png b/src/qt/res/icons/trad/bitcoin.png
new file mode 100644
index 000000000000..257ff1419a7b
Binary files /dev/null and b/src/qt/res/icons/trad/bitcoin.png differ
diff --git a/src/qt/res/icons/trad/bitcoin_testnet.ico b/src/qt/res/icons/trad/bitcoin_testnet.ico
new file mode 100644
index 000000000000..b86e2a703946
Binary files /dev/null and b/src/qt/res/icons/trad/bitcoin_testnet.ico differ
diff --git a/src/qt/res/icons/trad/bitcoin_testnet.png b/src/qt/res/icons/trad/bitcoin_testnet.png
new file mode 100644
index 000000000000..5e044d34083c
Binary files /dev/null and b/src/qt/res/icons/trad/bitcoin_testnet.png differ
diff --git a/src/qt/res/icons/trad/browse.png b/src/qt/res/icons/trad/browse.png
new file mode 100644
index 000000000000..c4d1ef0c4fb1
Binary files /dev/null and b/src/qt/res/icons/trad/browse.png differ
diff --git a/src/qt/res/icons/trad/clock1.png b/src/qt/res/icons/trad/clock1.png
new file mode 100644
index 000000000000..a7a499770e25
Binary files /dev/null and b/src/qt/res/icons/trad/clock1.png differ
diff --git a/src/qt/res/icons/trad/clock2.png b/src/qt/res/icons/trad/clock2.png
new file mode 100644
index 000000000000..9e25da3ce26c
Binary files /dev/null and b/src/qt/res/icons/trad/clock2.png differ
diff --git a/src/qt/res/icons/trad/clock3.png b/src/qt/res/icons/trad/clock3.png
new file mode 100644
index 000000000000..ea531d4d3376
Binary files /dev/null and b/src/qt/res/icons/trad/clock3.png differ
diff --git a/src/qt/res/icons/trad/clock4.png b/src/qt/res/icons/trad/clock4.png
new file mode 100644
index 000000000000..3f3a462737a2
Binary files /dev/null and b/src/qt/res/icons/trad/clock4.png differ
diff --git a/src/qt/res/icons/trad/clock5.png b/src/qt/res/icons/trad/clock5.png
new file mode 100644
index 000000000000..b2dccc2caf2f
Binary files /dev/null and b/src/qt/res/icons/trad/clock5.png differ
diff --git a/src/qt/res/icons/trad/configure.png b/src/qt/res/icons/trad/configure.png
new file mode 100644
index 000000000000..6bdbf757cbef
Binary files /dev/null and b/src/qt/res/icons/trad/configure.png differ
diff --git a/src/qt/res/icons/trad/connect0_16.png b/src/qt/res/icons/trad/connect0_16.png
new file mode 100644
index 000000000000..b8453165e71d
Binary files /dev/null and b/src/qt/res/icons/trad/connect0_16.png differ
diff --git a/src/qt/res/icons/trad/connect1_16.png b/src/qt/res/icons/trad/connect1_16.png
new file mode 100644
index 000000000000..c9bc2d80a945
Binary files /dev/null and b/src/qt/res/icons/trad/connect1_16.png differ
diff --git a/src/qt/res/icons/trad/connect2_16.png b/src/qt/res/icons/trad/connect2_16.png
new file mode 100644
index 000000000000..0caddf62b638
Binary files /dev/null and b/src/qt/res/icons/trad/connect2_16.png differ
diff --git a/src/qt/res/icons/trad/connect3_16.png b/src/qt/res/icons/trad/connect3_16.png
new file mode 100644
index 000000000000..036aebbd483e
Binary files /dev/null and b/src/qt/res/icons/trad/connect3_16.png differ
diff --git a/src/qt/res/icons/trad/connect4_16.png b/src/qt/res/icons/trad/connect4_16.png
new file mode 100644
index 000000000000..b96fba68d49b
Binary files /dev/null and b/src/qt/res/icons/trad/connect4_16.png differ
diff --git a/src/qt/res/icons/trad/debugwindow.png b/src/qt/res/icons/trad/debugwindow.png
new file mode 100644
index 000000000000..f3e22827bac5
Binary files /dev/null and b/src/qt/res/icons/trad/debugwindow.png differ
diff --git a/src/qt/res/icons/trad/drkblue_address-book.png b/src/qt/res/icons/trad/drkblue_address-book.png
new file mode 100644
index 000000000000..878e4d55daaf
Binary files /dev/null and b/src/qt/res/icons/trad/drkblue_address-book.png differ
diff --git a/src/qt/res/icons/trad/drkblue_editcopy.png b/src/qt/res/icons/trad/drkblue_editcopy.png
new file mode 100644
index 000000000000..f408472dfba5
Binary files /dev/null and b/src/qt/res/icons/trad/drkblue_editcopy.png differ
diff --git a/src/qt/res/icons/trad/drkblue_editpaste.png b/src/qt/res/icons/trad/drkblue_editpaste.png
new file mode 100644
index 000000000000..ceaacdf0fc56
Binary files /dev/null and b/src/qt/res/icons/trad/drkblue_editpaste.png differ
diff --git a/src/qt/res/icons/trad/drkblue_remove.png b/src/qt/res/icons/trad/drkblue_remove.png
new file mode 100644
index 000000000000..e0add0730bc4
Binary files /dev/null and b/src/qt/res/icons/trad/drkblue_remove.png differ
diff --git a/src/qt/res/icons/trad/edit.png b/src/qt/res/icons/trad/edit.png
new file mode 100644
index 000000000000..5fe1ccfe28e3
Binary files /dev/null and b/src/qt/res/icons/trad/edit.png differ
diff --git a/src/qt/res/icons/trad/editcopy.png b/src/qt/res/icons/trad/editcopy.png
new file mode 100644
index 000000000000..3f3fa511d997
Binary files /dev/null and b/src/qt/res/icons/trad/editcopy.png differ
diff --git a/src/qt/res/icons/trad/editpaste.png b/src/qt/res/icons/trad/editpaste.png
new file mode 100644
index 000000000000..506f5586c079
Binary files /dev/null and b/src/qt/res/icons/trad/editpaste.png differ
diff --git a/src/qt/res/icons/trad/export.png b/src/qt/res/icons/trad/export.png
new file mode 100644
index 000000000000..b8584ec5e3ae
Binary files /dev/null and b/src/qt/res/icons/trad/export.png differ
diff --git a/src/qt/res/icons/trad/eye.png b/src/qt/res/icons/trad/eye.png
new file mode 100644
index 000000000000..240e374d0ecb
Binary files /dev/null and b/src/qt/res/icons/trad/eye.png differ
diff --git a/src/qt/res/icons/trad/eye_minus.png b/src/qt/res/icons/trad/eye_minus.png
new file mode 100644
index 000000000000..d53526b6a8fa
Binary files /dev/null and b/src/qt/res/icons/trad/eye_minus.png differ
diff --git a/src/qt/res/icons/trad/eye_plus.png b/src/qt/res/icons/trad/eye_plus.png
new file mode 100644
index 000000000000..90ef0aaca5f8
Binary files /dev/null and b/src/qt/res/icons/trad/eye_plus.png differ
diff --git a/src/qt/res/icons/trad/filesave.png b/src/qt/res/icons/trad/filesave.png
new file mode 100644
index 000000000000..c602c33fd508
Binary files /dev/null and b/src/qt/res/icons/trad/filesave.png differ
diff --git a/src/qt/res/icons/trad/history.png b/src/qt/res/icons/trad/history.png
new file mode 100644
index 000000000000..07aeca1f96e8
Binary files /dev/null and b/src/qt/res/icons/trad/history.png differ
diff --git a/src/qt/res/icons/trad/key.png b/src/qt/res/icons/trad/key.png
new file mode 100644
index 000000000000..074d236430a1
Binary files /dev/null and b/src/qt/res/icons/trad/key.png differ
diff --git a/src/qt/res/icons/trad/lock_closed.png b/src/qt/res/icons/trad/lock_closed.png
new file mode 100644
index 000000000000..ab47a3a9ec66
Binary files /dev/null and b/src/qt/res/icons/trad/lock_closed.png differ
diff --git a/src/qt/res/icons/trad/lock_open.png b/src/qt/res/icons/trad/lock_open.png
new file mode 100644
index 000000000000..54ca6687f7d4
Binary files /dev/null and b/src/qt/res/icons/trad/lock_open.png differ
diff --git a/src/qt/res/icons/trad/notsynced.png b/src/qt/res/icons/trad/notsynced.png
new file mode 100644
index 000000000000..2fc46b834920
Binary files /dev/null and b/src/qt/res/icons/trad/notsynced.png differ
diff --git a/src/qt/res/icons/trad/overview.png b/src/qt/res/icons/trad/overview.png
new file mode 100644
index 000000000000..78a2575b236f
Binary files /dev/null and b/src/qt/res/icons/trad/overview.png differ
diff --git a/src/qt/res/icons/trad/qrcode.png b/src/qt/res/icons/trad/qrcode.png
new file mode 100644
index 000000000000..015078fbfa07
Binary files /dev/null and b/src/qt/res/icons/trad/qrcode.png differ
diff --git a/src/qt/res/icons/trad/quit.png b/src/qt/res/icons/trad/quit.png
new file mode 100644
index 000000000000..bf5938605f20
Binary files /dev/null and b/src/qt/res/icons/trad/quit.png differ
diff --git a/src/qt/res/icons/trad/receive.png b/src/qt/res/icons/trad/receive.png
new file mode 100644
index 000000000000..61f1408dd8bf
Binary files /dev/null and b/src/qt/res/icons/trad/receive.png differ
diff --git a/src/qt/res/icons/trad/remove.png b/src/qt/res/icons/trad/remove.png
new file mode 100644
index 000000000000..e0add0730bc4
Binary files /dev/null and b/src/qt/res/icons/trad/remove.png differ
diff --git a/src/qt/res/icons/trad/send.png b/src/qt/res/icons/trad/send.png
new file mode 100644
index 000000000000..11cc3d1bc0e8
Binary files /dev/null and b/src/qt/res/icons/trad/send.png differ
diff --git a/src/qt/res/icons/trad/synced.png b/src/qt/res/icons/trad/synced.png
new file mode 100644
index 000000000000..d8a735749cef
Binary files /dev/null and b/src/qt/res/icons/trad/synced.png differ
diff --git a/src/qt/res/icons/trad/transaction0.png b/src/qt/res/icons/trad/transaction0.png
new file mode 100644
index 000000000000..7f73aada94ce
Binary files /dev/null and b/src/qt/res/icons/trad/transaction0.png differ
diff --git a/src/qt/res/icons/trad/transaction2.png b/src/qt/res/icons/trad/transaction2.png
new file mode 100644
index 000000000000..4d03d8a2f74e
Binary files /dev/null and b/src/qt/res/icons/trad/transaction2.png differ
diff --git a/src/qt/res/icons/trad/transaction_conflicted.png b/src/qt/res/icons/trad/transaction_conflicted.png
new file mode 100644
index 000000000000..b995c587d707
Binary files /dev/null and b/src/qt/res/icons/trad/transaction_conflicted.png differ
diff --git a/src/qt/res/icons/trad/tx_inout.png b/src/qt/res/icons/trad/tx_inout.png
new file mode 100644
index 000000000000..f1a7f7bbc3ab
Binary files /dev/null and b/src/qt/res/icons/trad/tx_inout.png differ
diff --git a/src/qt/res/icons/trad/tx_input.png b/src/qt/res/icons/trad/tx_input.png
new file mode 100644
index 000000000000..a2d324ee34ac
Binary files /dev/null and b/src/qt/res/icons/trad/tx_input.png differ
diff --git a/src/qt/res/icons/trad/tx_mined.png b/src/qt/res/icons/trad/tx_mined.png
new file mode 100644
index 000000000000..a7acc6cf7bea
Binary files /dev/null and b/src/qt/res/icons/trad/tx_mined.png differ
diff --git a/src/qt/res/icons/trad/tx_output.png b/src/qt/res/icons/trad/tx_output.png
new file mode 100644
index 000000000000..a7c5ebf56b0e
Binary files /dev/null and b/src/qt/res/icons/trad/tx_output.png differ
diff --git a/src/qt/res/icons/trad/unit_dash.png b/src/qt/res/icons/trad/unit_dash.png
new file mode 100644
index 000000000000..1c3682960671
Binary files /dev/null and b/src/qt/res/icons/trad/unit_dash.png differ
diff --git a/src/qt/res/icons/trad/unit_duffs.png b/src/qt/res/icons/trad/unit_duffs.png
new file mode 100644
index 000000000000..3129e256650d
Binary files /dev/null and b/src/qt/res/icons/trad/unit_duffs.png differ
diff --git a/src/qt/res/icons/trad/unit_mdash.png b/src/qt/res/icons/trad/unit_mdash.png
new file mode 100644
index 000000000000..dd75be212982
Binary files /dev/null and b/src/qt/res/icons/trad/unit_mdash.png differ
diff --git a/src/qt/res/icons/trad/unit_tdash.png b/src/qt/res/icons/trad/unit_tdash.png
new file mode 100644
index 000000000000..46f83509c7f3
Binary files /dev/null and b/src/qt/res/icons/trad/unit_tdash.png differ
diff --git a/src/qt/res/icons/trad/unit_tduffs.png b/src/qt/res/icons/trad/unit_tduffs.png
new file mode 100644
index 000000000000..daf67b12a8d8
Binary files /dev/null and b/src/qt/res/icons/trad/unit_tduffs.png differ
diff --git a/src/qt/res/icons/trad/unit_tmdash.png b/src/qt/res/icons/trad/unit_tmdash.png
new file mode 100644
index 000000000000..c4091a5c83b5
Binary files /dev/null and b/src/qt/res/icons/trad/unit_tmdash.png differ
diff --git a/src/qt/res/icons/trad/unit_tudash.png b/src/qt/res/icons/trad/unit_tudash.png
new file mode 100644
index 000000000000..e74515e0eca9
Binary files /dev/null and b/src/qt/res/icons/trad/unit_tudash.png differ
diff --git a/src/qt/res/icons/trad/unit_udash.png b/src/qt/res/icons/trad/unit_udash.png
new file mode 100644
index 000000000000..b270724eb1b1
Binary files /dev/null and b/src/qt/res/icons/trad/unit_udash.png differ
diff --git a/src/qt/res/images/about.png b/src/qt/res/images/drkblue/about.png
old mode 100755
new mode 100644
similarity index 100%
rename from src/qt/res/images/about.png
rename to src/qt/res/images/drkblue/about.png
diff --git a/src/qt/res/images/dash_logo_horizontal.png b/src/qt/res/images/drkblue/dash_logo_horizontal.png
similarity index 100%
rename from src/qt/res/images/dash_logo_horizontal.png
rename to src/qt/res/images/drkblue/dash_logo_horizontal.png
diff --git a/src/qt/res/images/drkblue_downArrow.png b/src/qt/res/images/drkblue/drkblue_downArrow.png
similarity index 100%
rename from src/qt/res/images/drkblue_downArrow.png
rename to src/qt/res/images/drkblue/drkblue_downArrow.png
diff --git a/src/qt/res/images/drkblue_downArrow_small.png b/src/qt/res/images/drkblue/drkblue_downArrow_small.png
similarity index 100%
rename from src/qt/res/images/drkblue_downArrow_small.png
rename to src/qt/res/images/drkblue/drkblue_downArrow_small.png
diff --git a/src/qt/res/images/drkblue_leftArrow_small.png b/src/qt/res/images/drkblue/drkblue_leftArrow_small.png
similarity index 100%
rename from src/qt/res/images/drkblue_leftArrow_small.png
rename to src/qt/res/images/drkblue/drkblue_leftArrow_small.png
diff --git a/src/qt/res/images/drkblue_qtreeview_selected.png b/src/qt/res/images/drkblue/drkblue_qtreeview_selected.png
similarity index 100%
rename from src/qt/res/images/drkblue_qtreeview_selected.png
rename to src/qt/res/images/drkblue/drkblue_qtreeview_selected.png
diff --git a/src/qt/res/images/drkblue_rightArrow_small.png b/src/qt/res/images/drkblue/drkblue_rightArrow_small.png
similarity index 100%
rename from src/qt/res/images/drkblue_rightArrow_small.png
rename to src/qt/res/images/drkblue/drkblue_rightArrow_small.png
diff --git a/src/qt/res/images/drkblue_upArrow_small.png b/src/qt/res/images/drkblue/drkblue_upArrow_small.png
similarity index 100%
rename from src/qt/res/images/drkblue_upArrow_small.png
rename to src/qt/res/images/drkblue/drkblue_upArrow_small.png
diff --git a/src/qt/res/images/drkblue_walletFrame.png b/src/qt/res/images/drkblue/drkblue_walletFrame.png
similarity index 100%
rename from src/qt/res/images/drkblue_walletFrame.png
rename to src/qt/res/images/drkblue/drkblue_walletFrame.png
diff --git a/src/qt/res/images/drkblue_walletFrame_bg.png b/src/qt/res/images/drkblue/drkblue_walletFrame_bg.png
similarity index 100%
rename from src/qt/res/images/drkblue_walletFrame_bg.png
rename to src/qt/res/images/drkblue/drkblue_walletFrame_bg.png
diff --git a/src/qt/res/images/splash.png b/src/qt/res/images/drkblue/splash.png
similarity index 100%
rename from src/qt/res/images/splash.png
rename to src/qt/res/images/drkblue/splash.png
diff --git a/src/qt/res/images/splash_testnet.png b/src/qt/res/images/drkblue/splash_testnet.png
similarity index 100%
rename from src/qt/res/images/splash_testnet.png
rename to src/qt/res/images/drkblue/splash_testnet.png
diff --git a/src/qt/res/images/light/1x1w_90.png b/src/qt/res/images/light/1x1w_90.png
new file mode 100644
index 000000000000..0e087cf94a40
Binary files /dev/null and b/src/qt/res/images/light/1x1w_90.png differ
diff --git a/src/qt/res/images/light/about.png b/src/qt/res/images/light/about.png
new file mode 100755
index 000000000000..797e96df5009
Binary files /dev/null and b/src/qt/res/images/light/about.png differ
diff --git a/src/qt/res/images/light/blue_10x10_90.png b/src/qt/res/images/light/blue_10x10_90.png
new file mode 100644
index 000000000000..67495a6f6b0e
Binary files /dev/null and b/src/qt/res/images/light/blue_10x10_90.png differ
diff --git a/src/qt/res/images/light/dash_logo_horizontal copy.png b/src/qt/res/images/light/dash_logo_horizontal copy.png
new file mode 100644
index 000000000000..59d04cb35f08
Binary files /dev/null and b/src/qt/res/images/light/dash_logo_horizontal copy.png differ
diff --git a/src/qt/res/images/light/dash_logo_horizontal.png b/src/qt/res/images/light/dash_logo_horizontal.png
new file mode 100644
index 000000000000..63ee33e159d0
Binary files /dev/null and b/src/qt/res/images/light/dash_logo_horizontal.png differ
diff --git a/src/qt/res/images/light/dash_logo_horizontal_2.png b/src/qt/res/images/light/dash_logo_horizontal_2.png
new file mode 100644
index 000000000000..7162f7e064c2
Binary files /dev/null and b/src/qt/res/images/light/dash_logo_horizontal_2.png differ
diff --git a/src/qt/res/images/light/drkblue_downArrow.png b/src/qt/res/images/light/drkblue_downArrow.png
new file mode 100644
index 000000000000..9be402f473e5
Binary files /dev/null and b/src/qt/res/images/light/drkblue_downArrow.png differ
diff --git a/src/qt/res/images/light/drkblue_downArrow_small.png b/src/qt/res/images/light/drkblue_downArrow_small.png
new file mode 100644
index 000000000000..f598bbdfa031
Binary files /dev/null and b/src/qt/res/images/light/drkblue_downArrow_small.png differ
diff --git a/src/qt/res/images/light/drkblue_leftArrow_small.png b/src/qt/res/images/light/drkblue_leftArrow_small.png
new file mode 100644
index 000000000000..203c0e0d1463
Binary files /dev/null and b/src/qt/res/images/light/drkblue_leftArrow_small.png differ
diff --git a/src/qt/res/images/light/drkblue_qtreeview_selected.png b/src/qt/res/images/light/drkblue_qtreeview_selected.png
new file mode 100644
index 000000000000..6608fea26d1b
Binary files /dev/null and b/src/qt/res/images/light/drkblue_qtreeview_selected.png differ
diff --git a/src/qt/res/images/light/drkblue_rightArrow_small.png b/src/qt/res/images/light/drkblue_rightArrow_small.png
new file mode 100644
index 000000000000..90df701a4e3e
Binary files /dev/null and b/src/qt/res/images/light/drkblue_rightArrow_small.png differ
diff --git a/src/qt/res/images/light/drkblue_upArrow_small.png b/src/qt/res/images/light/drkblue_upArrow_small.png
new file mode 100644
index 000000000000..9f135db347f6
Binary files /dev/null and b/src/qt/res/images/light/drkblue_upArrow_small.png differ
diff --git a/src/qt/res/images/light/drkblue_walletFrame.png b/src/qt/res/images/light/drkblue_walletFrame.png
new file mode 100644
index 000000000000..a70ab9436b8e
Binary files /dev/null and b/src/qt/res/images/light/drkblue_walletFrame.png differ
diff --git a/src/qt/res/images/light/drkblue_walletFrame_bg.png b/src/qt/res/images/light/drkblue_walletFrame_bg.png
new file mode 100644
index 000000000000..b4d0ee3b2c55
Binary files /dev/null and b/src/qt/res/images/light/drkblue_walletFrame_bg.png differ
diff --git a/src/qt/res/images/light/splash.png b/src/qt/res/images/light/splash.png
new file mode 100644
index 000000000000..25fdde2855ec
Binary files /dev/null and b/src/qt/res/images/light/splash.png differ
diff --git a/src/qt/res/images/light/splash_testnet.png b/src/qt/res/images/light/splash_testnet.png
new file mode 100644
index 000000000000..0e9b8dad1693
Binary files /dev/null and b/src/qt/res/images/light/splash_testnet.png differ
diff --git a/src/qt/res/images/trad/about.png b/src/qt/res/images/trad/about.png
new file mode 100644
index 000000000000..68e11999b2b0
Binary files /dev/null and b/src/qt/res/images/trad/about.png differ
diff --git a/src/qt/res/images/trad/dash_logo_horizontal.png b/src/qt/res/images/trad/dash_logo_horizontal.png
new file mode 100644
index 000000000000..961a8ebfe6d5
Binary files /dev/null and b/src/qt/res/images/trad/dash_logo_horizontal.png differ
diff --git a/src/qt/res/images/trad/drkblue_downArrow.png b/src/qt/res/images/trad/drkblue_downArrow.png
new file mode 100644
index 000000000000..9be402f473e5
Binary files /dev/null and b/src/qt/res/images/trad/drkblue_downArrow.png differ
diff --git a/src/qt/res/images/trad/drkblue_downArrow_small.png b/src/qt/res/images/trad/drkblue_downArrow_small.png
new file mode 100644
index 000000000000..f598bbdfa031
Binary files /dev/null and b/src/qt/res/images/trad/drkblue_downArrow_small.png differ
diff --git a/src/qt/res/images/trad/drkblue_leftArrow_small.png b/src/qt/res/images/trad/drkblue_leftArrow_small.png
new file mode 100644
index 000000000000..203c0e0d1463
Binary files /dev/null and b/src/qt/res/images/trad/drkblue_leftArrow_small.png differ
diff --git a/src/qt/res/images/trad/drkblue_qtreeview_selected.png b/src/qt/res/images/trad/drkblue_qtreeview_selected.png
new file mode 100644
index 000000000000..6608fea26d1b
Binary files /dev/null and b/src/qt/res/images/trad/drkblue_qtreeview_selected.png differ
diff --git a/src/qt/res/images/trad/drkblue_rightArrow_small.png b/src/qt/res/images/trad/drkblue_rightArrow_small.png
new file mode 100644
index 000000000000..90df701a4e3e
Binary files /dev/null and b/src/qt/res/images/trad/drkblue_rightArrow_small.png differ
diff --git a/src/qt/res/images/trad/drkblue_upArrow_small.png b/src/qt/res/images/trad/drkblue_upArrow_small.png
new file mode 100644
index 000000000000..9f135db347f6
Binary files /dev/null and b/src/qt/res/images/trad/drkblue_upArrow_small.png differ
diff --git a/src/qt/res/images/trad/drkblue_walletFrame.png b/src/qt/res/images/trad/drkblue_walletFrame.png
new file mode 100644
index 000000000000..3d30cbbe05f2
Binary files /dev/null and b/src/qt/res/images/trad/drkblue_walletFrame.png differ
diff --git a/src/qt/res/images/trad/drkblue_walletFrame_bg.png b/src/qt/res/images/trad/drkblue_walletFrame_bg.png
new file mode 100644
index 000000000000..436a0005591c
Binary files /dev/null and b/src/qt/res/images/trad/drkblue_walletFrame_bg.png differ
diff --git a/src/qt/res/images/trad/splash.png b/src/qt/res/images/trad/splash.png
new file mode 100644
index 000000000000..c81fd7794ada
Binary files /dev/null and b/src/qt/res/images/trad/splash.png differ
diff --git a/src/qt/res/images/trad/splash_testnet.png b/src/qt/res/images/trad/splash_testnet.png
new file mode 100644
index 000000000000..963e7df3a689
Binary files /dev/null and b/src/qt/res/images/trad/splash_testnet.png differ
diff --git a/src/qt/rpcconsole.cpp b/src/qt/rpcconsole.cpp
index b3be32cc6504..0a16c2cb0f65 100644
--- a/src/qt/rpcconsole.cpp
+++ b/src/qt/rpcconsole.cpp
@@ -24,6 +24,7 @@
#include
#endif
+#include
#include
#include
#include
@@ -54,10 +55,10 @@ const struct {
const char *url;
const char *source;
} ICON_MAPPING[] = {
- {"cmd-request", ":/icons/tx_input"},
- {"cmd-reply", ":/icons/tx_output"},
- {"cmd-error", ":/icons/tx_output"},
- {"misc", ":/icons/tx_inout"},
+ {"cmd-request", "tx_input"},
+ {"cmd-reply", "tx_output"},
+ {"cmd-error", "tx_output"},
+ {"misc", "tx_inout"},
{NULL, NULL}
};
@@ -217,11 +218,14 @@ RPCConsole::RPCConsole(QWidget *parent) :
{
ui->setupUi(this);
GUIUtil::restoreWindowGeometry("nRPCConsoleWindow", this->size(), this);
-
+ QString theme = GUIUtil::getThemeName();
#ifndef Q_OS_MAC
- ui->openDebugLogfileButton->setIcon(QIcon(":/icons/export"));
+ ui->openDebugLogfileButton->setIcon(QIcon(":/icons/" + theme + "/export"));
#endif
+ // Needed on Mac also
+ ui->clearButton->setIcon(QIcon(":/icons/" + theme + "/remove"));
+
// Install event filter for up and down arrow
ui->lineEdit->installEventFilter(this);
ui->messagesWidget->installEventFilter(this);
@@ -241,6 +245,9 @@ RPCConsole::RPCConsole(QWidget *parent) :
ui->openSSLVersion->setText(SSLeay_version(SSLEAY_VERSION));
#ifdef ENABLE_WALLET
ui->berkeleyDBVersion->setText(DbEnv::version(0, 0, 0));
+ std::string walletPath = GetDataDir().string();
+ walletPath += QDir::separator().toLatin1() + GetArg("-wallet", "wallet.dat");
+ ui->wallet_path->setText(QString::fromStdString(walletPath));
#else
ui->label_berkeleyDBVersion->hide();
ui->berkeleyDBVersion->hide();
@@ -420,12 +427,16 @@ void RPCConsole::clear()
// Add smoothly scaled icon images.
// (when using width/height on an img, Qt uses nearest instead of linear interpolation)
+ QString iconPath = ":/icons/" + GUIUtil::getThemeName() + "/";
+ QString iconName = "";
+
for(int i=0; ICON_MAPPING[i].url; ++i)
{
+ iconName = ICON_MAPPING[i].source;
ui->messagesWidget->document()->addResource(
QTextDocument::ImageResource,
QUrl(ICON_MAPPING[i].url),
- QImage(ICON_MAPPING[i].source).scaled(ICON_SIZE, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
+ QImage(iconPath + iconName).scaled(ICON_SIZE, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
}
// Set default style sheet
@@ -634,6 +645,12 @@ void RPCConsole::showConfEditor()
{
GUIUtil::openConfigfile();
}
+
+void RPCConsole::showMNConfEditor()
+{
+ GUIUtil::openMNConfigfile();
+}
+
void RPCConsole::peerSelected(const QItemSelection &selected, const QItemSelection &deselected)
{
Q_UNUSED(deselected);
diff --git a/src/qt/rpcconsole.h b/src/qt/rpcconsole.h
index 07281c35a33b..26ee2c5ee387 100644
--- a/src/qt/rpcconsole.h
+++ b/src/qt/rpcconsole.h
@@ -91,7 +91,9 @@ public slots:
/** Switch to wallet-repair tab and show */
void showRepair();
/** Open external (default) editor with dash.conf */
- void showConfEditor();
+ void showConfEditor();
+ /** Open external (default) editor with masternode.conf */
+ void showMNConfEditor();
/** Handle selection of peer in peers list */
void peerSelected(const QItemSelection &selected, const QItemSelection &deselected);
/** Handle updated peer information */
diff --git a/src/qt/sendcoinsdialog.cpp b/src/qt/sendcoinsdialog.cpp
index 9f3fc57ebc93..f40871c2bcb7 100644
--- a/src/qt/sendcoinsdialog.cpp
+++ b/src/qt/sendcoinsdialog.cpp
@@ -34,11 +34,16 @@ SendCoinsDialog::SendCoinsDialog(QWidget *parent) :
fFeeMinimized(true)
{
ui->setupUi(this);
-
+ QString theme = GUIUtil::getThemeName();
+
#ifdef Q_OS_MAC // Icons on push buttons are very uncommon on Mac
ui->addButton->setIcon(QIcon());
ui->clearButton->setIcon(QIcon());
ui->sendButton->setIcon(QIcon());
+#else
+ ui->addButton->setIcon(QIcon(":/icons/" + theme + "/add"));
+ ui->clearButton->setIcon(QIcon(":/icons/" + theme + "/remove"));
+ ui->sendButton->setIcon(QIcon(":/icons/" + theme + "/send"));
#endif
GUIUtil::setupAddressWidget(ui->lineEditCoinControlChange, this);
diff --git a/src/qt/sendcoinsentry.cpp b/src/qt/sendcoinsentry.cpp
index 0a58998bd830..1a5c25c64b32 100644
--- a/src/qt/sendcoinsentry.cpp
+++ b/src/qt/sendcoinsentry.cpp
@@ -31,6 +31,15 @@ SendCoinsEntry::SendCoinsEntry(QWidget *parent) :
ui->addAsLabel->setPlaceholderText(tr("Enter a label for this address to add it to your address book"));
#endif
+ QString theme = GUIUtil::getThemeName();
+
+ // These icons are needed on Mac also!
+ ui->addressBookButton->setIcon(QIcon(":/icons/" + theme + "/address-book"));
+ ui->pasteButton->setIcon(QIcon(":/icons/" + theme + "/editpaste"));
+ ui->deleteButton->setIcon(QIcon(":/icons/" + theme + "/remove"));
+ ui->deleteButton_is->setIcon(QIcon(":/icons/" + theme + "/remove"));
+ ui->deleteButton_s->setIcon(QIcon(":/icons/" + theme + "/remove"));
+
// normal dash address field
GUIUtil::setupAddressWidget(ui->payTo, this);
// just a label for displaying dash address(es)
diff --git a/src/qt/signverifymessagedialog.cpp b/src/qt/signverifymessagedialog.cpp
index 67716aa5ddcf..024349084206 100644
--- a/src/qt/signverifymessagedialog.cpp
+++ b/src/qt/signverifymessagedialog.cpp
@@ -30,6 +30,27 @@ SignVerifyMessageDialog::SignVerifyMessageDialog(QWidget *parent) :
ui->signatureOut_SM->setPlaceholderText(tr("Click \"Sign Message\" to generate signature"));
#endif
+ QString theme = GUIUtil::getThemeName();
+
+#ifdef Q_OS_MAC // Icons on push buttons are very uncommon on Mac
+ ui->signMessageButton_SM->setIcon(QIcon());
+ ui->clearButton_SM->setIcon(QIcon());
+ ui->verifyMessageButton_VM->setIcon(QIcon());
+ ui->clearButton_VM->setIcon(QIcon());
+#else
+ ui->signMessageButton_SM->setIcon(QIcon(":/icons/" + theme + "/edit"));
+ ui->clearButton_SM->setIcon(QIcon(":/icons/" + theme + "/remove"));
+ ui->verifyMessageButton_VM->setIcon(QIcon(":/icons/" + theme + "/transaction_0"));
+ ui->clearButton_VM->setIcon(QIcon(":/icons/" + theme + "/remove"));
+#endif
+
+ // These icons are needed on Mac also
+ ui->addressBookButton_SM->setIcon(QIcon(":/icons/" + theme + "/address-book"));
+ ui->pasteButton_SM->setIcon(QIcon(":/icons/" + theme + "/editpaste"));
+ ui->copySignatureButton_SM->setIcon(QIcon(":/icons/" + theme + "/editcopy"));
+ ui->addressBookButton_VM->setIcon(QIcon(":/icons/" + theme + "/address-book"));
+
+
GUIUtil::setupAddressWidget(ui->addressIn_SM, this);
GUIUtil::setupAddressWidget(ui->addressIn_VM, this);
diff --git a/src/qt/splashscreen.cpp b/src/qt/splashscreen.cpp
index 3312bd134167..88dc5cc2585b 100644
--- a/src/qt/splashscreen.cpp
+++ b/src/qt/splashscreen.cpp
@@ -6,6 +6,7 @@
#include "splashscreen.h"
#include "clientversion.h"
+#include "guiutil.h"
#include "init.h"
#include "networkstyle.h"
#include "ui_interface.h"
@@ -20,6 +21,7 @@
#include
#include
#include
+#include
SplashScreen::SplashScreen(Qt::WindowFlags f, const NetworkStyle *networkStyle) :
QWidget(0, f), curAlignment(0)
@@ -41,8 +43,16 @@ SplashScreen::SplashScreen(Qt::WindowFlags f, const NetworkStyle *networkStyle)
QString font = QApplication::font().toString();
+ // networkstyle.cpp can't (yet) read themes, so we do it here to get the correct Splash-screen
+ QString splashScreenPath = ":/images/" + GUIUtil::getThemeName() + "/splash";
+ if(GetBoolArg("-regtest", false))
+ splashScreenPath = ":/images/" + GUIUtil::getThemeName() + "/splash_testnet";
+
+ if(GetBoolArg("-testnet", false))
+ splashScreenPath = ":/images/" + GUIUtil::getThemeName() + "/splash_testnet";
+
// load the bitmap for writing some text over it
- pixmap = networkStyle->getSplashImage();
+ pixmap = QPixmap(splashScreenPath);
QPainter pixPaint(&pixmap);
pixPaint.setPen(QColor(100,100,100));
diff --git a/src/qt/transactiontablemodel.cpp b/src/qt/transactiontablemodel.cpp
index bd5257015bfe..af4121a639d3 100644
--- a/src/qt/transactiontablemodel.cpp
+++ b/src/qt/transactiontablemodel.cpp
@@ -381,19 +381,20 @@ QString TransactionTableModel::formatTxType(const TransactionRecord *wtx) const
QVariant TransactionTableModel::txAddressDecoration(const TransactionRecord *wtx) const
{
+ QString theme = GUIUtil::getThemeName();
switch(wtx->type)
{
case TransactionRecord::Generated:
- return QIcon(":/icons/tx_mined");
+ return QIcon(":/icons/" + theme + "/tx_mined");
case TransactionRecord::RecvWithDarksend:
case TransactionRecord::RecvWithAddress:
case TransactionRecord::RecvFromOther:
- return QIcon(":/icons/tx_input");
+ return QIcon(":/icons/" + theme + "/tx_input");
case TransactionRecord::SendToAddress:
case TransactionRecord::SendToOther:
- return QIcon(":/icons/tx_output");
+ return QIcon(":/icons/" + theme + "/tx_output");
default:
- return QIcon(":/icons/tx_inout");
+ return QIcon(":/icons/" + theme + "/tx_inout");
}
}
@@ -459,6 +460,7 @@ QString TransactionTableModel::formatTxAmount(const TransactionRecord *wtx, bool
QVariant TransactionTableModel::txStatusDecoration(const TransactionRecord *wtx) const
{
+ QString theme = GUIUtil::getThemeName();
switch(wtx->status.status)
{
case TransactionStatus::OpenUntilBlock:
@@ -467,28 +469,28 @@ QVariant TransactionTableModel::txStatusDecoration(const TransactionRecord *wtx)
case TransactionStatus::Offline:
return COLOR_TX_STATUS_OFFLINE;
case TransactionStatus::Unconfirmed:
- return QIcon(":/icons/transaction_0");
+ return QIcon(":/icons/" + theme + "/transaction_0");
case TransactionStatus::Confirming:
switch(wtx->status.depth)
{
- case 1: return QIcon(":/icons/transaction_1");
- case 2: return QIcon(":/icons/transaction_2");
- case 3: return QIcon(":/icons/transaction_3");
- case 4: return QIcon(":/icons/transaction_4");
- default: return QIcon(":/icons/transaction_5");
+ case 1: return QIcon(":/icons/" + theme + "/transaction_1");
+ case 2: return QIcon(":/icons/" + theme + "/transaction_2");
+ case 3: return QIcon(":/icons/" + theme + "/transaction_3");
+ case 4: return QIcon(":/icons/" + theme + "/transaction_4");
+ default: return QIcon(":/icons/" + theme + "/transaction_5");
};
case TransactionStatus::Confirmed:
- return QIcon(":/icons/transaction_confirmed");
+ return QIcon(":/icons/" + theme + "/transaction_confirmed");
case TransactionStatus::Conflicted:
- return QIcon(":/icons/transaction_conflicted");
+ return QIcon(":/icons/" + theme + "/transaction_conflicted");
case TransactionStatus::Immature: {
int total = wtx->status.depth + wtx->status.matures_in;
int part = (wtx->status.depth * 4 / total) + 1;
- return QIcon(QString(":/icons/transaction_%1").arg(part));
+ return QIcon(QString(":/icons/" + theme + "/transaction_%1").arg(part));
}
case TransactionStatus::MaturesWarning:
case TransactionStatus::NotAccepted:
- return QIcon(":/icons/transaction_0");
+ return QIcon(":/icons/" + theme + "/transaction_0");
default:
return COLOR_BLACK;
}
@@ -496,8 +498,9 @@ QVariant TransactionTableModel::txStatusDecoration(const TransactionRecord *wtx)
QVariant TransactionTableModel::txWatchonlyDecoration(const TransactionRecord *wtx) const
{
+ QString theme = GUIUtil::getThemeName();
if (wtx->involvesWatchAddress)
- return QIcon(":/icons/eye");
+ return QIcon(":/icons/" + theme + "/eye");
else
return QVariant();
}
diff --git a/src/qt/transactionview.cpp b/src/qt/transactionview.cpp
index 1fc99c81afe7..8438a0d9f20c 100644
--- a/src/qt/transactionview.cpp
+++ b/src/qt/transactionview.cpp
@@ -53,11 +53,12 @@ TransactionView::TransactionView(QWidget *parent) :
hlayout->addSpacing(23);
#endif
+ QString theme = GUIUtil::getThemeName();
watchOnlyWidget = new QComboBox(this);
watchOnlyWidget->setFixedWidth(24);
watchOnlyWidget->addItem("", TransactionFilterProxy::WatchOnlyFilter_All);
- watchOnlyWidget->addItem(QIcon(":/icons/eye_plus"), "", TransactionFilterProxy::WatchOnlyFilter_Yes);
- watchOnlyWidget->addItem(QIcon(":/icons/eye_minus"), "", TransactionFilterProxy::WatchOnlyFilter_No);
+ watchOnlyWidget->addItem(QIcon(":/icons/" + theme + "/eye_plus"), "", TransactionFilterProxy::WatchOnlyFilter_Yes);
+ watchOnlyWidget->addItem(QIcon(":/icons/" + theme + "/eye_minus"), "", TransactionFilterProxy::WatchOnlyFilter_No);
hlayout->addWidget(watchOnlyWidget);
dateWidget = new QComboBox(this);
diff --git a/src/qt/utilitydialog.cpp b/src/qt/utilitydialog.cpp
index c0bfc47c41b1..cd568c1050ae 100644
--- a/src/qt/utilitydialog.cpp
+++ b/src/qt/utilitydialog.cpp
@@ -77,6 +77,10 @@ HelpMessageDialog::HelpMessageDialog(QWidget *parent, bool about) :
text = version + "\n" + header + "\n" + coreOptions + "\n" + uiOptions;
ui->helpMessageLabel->setText(text);
}
+ // Theme dependent Gfx in About popup
+ QString helpMessageGfx = ":/images/" + GUIUtil::getThemeName() + "/about";
+ QPixmap pixmap = QPixmap(helpMessageGfx);
+ ui->graphic->setPixmap(pixmap);
}
HelpMessageDialog::~HelpMessageDialog()
diff --git a/src/qt/walletview.cpp b/src/qt/walletview.cpp
index 652385958b37..75eb02244398 100644
--- a/src/qt/walletview.cpp
+++ b/src/qt/walletview.cpp
@@ -45,7 +45,8 @@ WalletView::WalletView(QWidget *parent):
QPushButton *exportButton = new QPushButton(tr("&Export"), this);
exportButton->setToolTip(tr("Export the data in the current tab to a file"));
#ifndef Q_OS_MAC // Icons on push buttons are very uncommon on Mac
- exportButton->setIcon(QIcon(":/icons/export"));
+ QString theme = GUIUtil::getThemeName();
+ exportButton->setIcon(QIcon(":/icons/" + theme + "/export"));
#endif
hbox_buttons->addStretch();
diff --git a/src/rpcmasternode-budget.cpp b/src/rpcmasternode-budget.cpp
index 3245349f847c..c5e1adf48f4a 100644
--- a/src/rpcmasternode-budget.cpp
+++ b/src/rpcmasternode-budget.cpp
@@ -24,22 +24,24 @@ Value mnbudget(const Array& params, bool fHelp)
strCommand = params[0].get_str();
if (fHelp ||
- (strCommand != "vote-many" && strCommand != "prepare" && strCommand != "submit" && strCommand != "vote" && strCommand != "getvotes" && strCommand != "getinfo" && strCommand != "show" && strCommand != "projection" && strCommand != "check" && strCommand != "nextblock"))
+ (strCommand != "vote-many" && strCommand != "prepare" && strCommand != "submit" &&
+ strCommand != "vote" && strCommand != "getvotes" && strCommand != "getproposal" && strCommand != "getproposalhash" &&
+ strCommand != "list" && strCommand != "projection" && strCommand != "check" && strCommand != "nextblock"))
throw runtime_error(
- "mnbudget \"command\"... ( \"passphrase\" )\n"
- "Vote or show current budgets\n"
+ "mnbudget \"command\"...\n"
+ "Manage proposals\n"
"\nAvailable commands:\n"
- " prepare - Prepare proposal for network by signing and creating tx\n"
- " submit - Submit proposal for network\n"
- " vote-many - Vote on a Dash initiative\n"
- " vote-alias - Vote on a Dash initiative\n"
- " vote - Vote on a Dash initiative/budget\n"
- " getvotes - Show current masternode budgets\n"
- " getinfo - Show current masternode budgets\n"
- " show - Show all budgets\n"
+ " check - Scan proposals and remove invalid from proposals list\n"
+ " prepare - Prepare proposal by signing and creating tx\n"
+ " submit - Submit proposal to network\n"
+ " getproposalhash - Get proposal hash(es) by proposal name\n"
+ " getproposal - Show proposal\n"
+ " getvotes - Show detailed votes list for proposal\n"
+ " list - List all proposals\n"
+ " nextblock - Get info about next superblock for budget system\n"
" projection - Show the projection of which proposals will be paid the next cycle\n"
- " check - Scan proposals and remove invalid\n"
- " nextblock - Get next superblock for budget system\n"
+ " vote - Vote on a proposal by single masternode (using dash.conf setup)\n"
+ " vote-many - Vote on a proposal by all masternodes (using masternode.conf setup)\n"
);
if(strCommand == "nextblock")
@@ -53,44 +55,26 @@ Value mnbudget(const Array& params, bool fHelp)
if(strCommand == "prepare")
{
+ if (params.size() != 7)
+ throw runtime_error("Correct usage is 'mnbudget prepare '");
+
int nBlockMin = 0;
CBlockIndex* pindexPrev = chainActive.Tip();
std::vector mnEntries;
mnEntries = masternodeConfig.getEntries();
- if (params.size() != 7)
- throw runtime_error("Correct usage is 'mnbudget prepare proposal-name url payment_count block_start dash_address monthly_payment_dash'");
-
- std::string strProposalName = params[1].get_str();
- if(strProposalName.size() > 20)
- return "Invalid proposal name, limit of 20 characters.";
-
- std::string strURL = params[2].get_str();
- if(strURL.size() > 64)
- return "Invalid url, limit of 64 characters.";
-
+ std::string strProposalName = SanitizeString(params[1].get_str());
+ std::string strURL = SanitizeString(params[2].get_str());
int nPaymentCount = params[3].get_int();
- if(nPaymentCount < 1)
- return "Invalid payment count, must be more than zero.";
-
- //set block min
- if(pindexPrev != NULL) nBlockMin = pindexPrev->nHeight - GetBudgetPaymentCycleBlocks() * (nPaymentCount + 1);
-
int nBlockStart = params[4].get_int();
- if(nBlockStart % GetBudgetPaymentCycleBlocks() != 0){
- int nNext = pindexPrev->nHeight - pindexPrev->nHeight % GetBudgetPaymentCycleBlocks() + GetBudgetPaymentCycleBlocks();
- return strprintf("Invalid block start - must be a budget cycle block. Next valid block: %d", nNext);
- }
- int nBlockEnd = nBlockStart + GetBudgetPaymentCycleBlocks() * nPaymentCount;
+ //set block min
+ if(pindexPrev != NULL) nBlockMin = pindexPrev->nHeight;
if(nBlockStart < nBlockMin)
return "Invalid block start, must be more than current height.";
- if(nBlockEnd < pindexPrev->nHeight)
- return "Invalid ending block, starting block + (payment_cycle*payments) must be more than current height.";
-
CBitcoinAddress address(params[5].get_str());
if (!address.IsValid())
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid Dash address");
@@ -130,47 +114,30 @@ Value mnbudget(const Array& params, bool fHelp)
if(strCommand == "submit")
{
+ if (params.size() != 8)
+ throw runtime_error("Correct usage is 'mnbudget submit '");
+
+ if(!masternodeSync.IsBlockchainSynced()){
+ return "Must wait for client to sync with masternode network. Try again in a minute or so.";
+ }
+
int nBlockMin = 0;
CBlockIndex* pindexPrev = chainActive.Tip();
std::vector mnEntries;
mnEntries = masternodeConfig.getEntries();
- if (params.size() != 8)
- throw runtime_error("Correct usage is 'mnbudget submit proposal-name url payment_count block_start dash_address monthly_payment_dash fee_tx'");
-
- // Check these inputs the same way we check the vote commands:
- // **********************************************************
-
- std::string strProposalName = params[1].get_str();
- if(strProposalName.size() > 20)
- return "Invalid proposal name, limit of 20 characters.";
-
- std::string strURL = params[2].get_str();
- if(strURL.size() > 64)
- return "Invalid url, limit of 64 characters.";
-
+ std::string strProposalName = SanitizeString(params[1].get_str());
+ std::string strURL = SanitizeString(params[2].get_str());
int nPaymentCount = params[3].get_int();
- if(nPaymentCount < 1)
- return "Invalid payment count, must be more than zero.";
-
- //set block min
- if(pindexPrev != NULL) nBlockMin = pindexPrev->nHeight - GetBudgetPaymentCycleBlocks() * (nPaymentCount + 1);
-
int nBlockStart = params[4].get_int();
- if(nBlockStart % GetBudgetPaymentCycleBlocks() != 0){
- int nNext = pindexPrev->nHeight - pindexPrev->nHeight % GetBudgetPaymentCycleBlocks() + GetBudgetPaymentCycleBlocks();
- return strprintf("Invalid block start - must be a budget cycle block. Next valid block: %d", nNext);
- }
- int nBlockEnd = nBlockStart + (GetBudgetPaymentCycleBlocks()*nPaymentCount);
+ //set block min
+ if(pindexPrev != NULL) nBlockMin = pindexPrev->nHeight;
if(nBlockStart < nBlockMin)
return "Invalid payment count, must be more than current height.";
- if(nBlockEnd < pindexPrev->nHeight)
- return "Invalid ending block, starting block + (payment_cycle*payments) must be more than current height.";
-
CBitcoinAddress address(params[5].get_str());
if (!address.IsValid())
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid Dash address");
@@ -178,25 +145,22 @@ Value mnbudget(const Array& params, bool fHelp)
// Parse Dash address
CScript scriptPubKey = GetScriptForDestination(address.Get());
CAmount nAmount = AmountFromValue(params[6]);
- uint256 hash = ParseHashV(params[7], "parameter 1");
+ uint256 hash = ParseHashV(params[7], "Proposal hash");
//create the proposal incase we're the first to make it
CBudgetProposalBroadcast budgetProposalBroadcast(strProposalName, strURL, nPaymentCount, scriptPubKey, nAmount, nBlockStart, hash);
std::string strError = "";
+
+ if(!budgetProposalBroadcast.IsValid(strError)){
+ return "Proposal is not valid - " + budgetProposalBroadcast.GetHash().ToString() + " - " + strError;
+ }
+
int nConf = 0;
if(!IsBudgetCollateralValid(hash, budgetProposalBroadcast.GetHash(), strError, budgetProposalBroadcast.nTime, nConf)){
return "Proposal FeeTX is not valid - " + hash.ToString() + " - " + strError;
}
- if(!masternodeSync.IsBlockchainSynced()){
- return "Must wait for client to sync with masternode network. Try again in a minute or so.";
- }
-
- // if(!budgetProposalBroadcast.IsValid(strError)){
- // return "Proposal is not valid - " + budgetProposalBroadcast.GetHash().ToString() + " - " + strError;
- // }
-
budget.mapSeenMasternodeBudgetProposals.insert(make_pair(budgetProposalBroadcast.GetHash(), budgetProposalBroadcast));
budgetProposalBroadcast.Relay();
budget.AddProposal(budgetProposalBroadcast);
@@ -207,14 +171,14 @@ Value mnbudget(const Array& params, bool fHelp)
if(strCommand == "vote-many")
{
- std::vector mnEntries;
- mnEntries = masternodeConfig.getEntries();
+ if(params.size() != 3)
+ throw runtime_error("Correct usage is 'mnbudget vote-many '");
- if (params.size() != 3)
- throw runtime_error("Correct usage is 'mnbudget vote-many proposal-hash yes|no'");
+ uint256 hash;
+ std::string strVote;
- uint256 hash = ParseHashV(params[1], "parameter 1");
- std::string strVote = params[2].get_str();
+ hash = ParseHashV(params[1], "Proposal hash");
+ strVote = params[2].get_str();
if(strVote != "yes" && strVote != "no") return "You can only vote 'yes' or 'no'";
int nVote = VOTE_ABSTAIN;
@@ -224,6 +188,9 @@ Value mnbudget(const Array& params, bool fHelp)
int success = 0;
int failed = 0;
+ std::vector mnEntries;
+ mnEntries = masternodeConfig.getEntries();
+
Object resultsObj;
BOOST_FOREACH(CMasternodeConfig::CMasternodeEntry mne, masternodeConfig.getEntries()) {
@@ -289,13 +256,10 @@ Value mnbudget(const Array& params, bool fHelp)
if(strCommand == "vote")
{
- std::vector mnEntries;
- mnEntries = masternodeConfig.getEntries();
-
if (params.size() != 3)
- throw runtime_error("Correct usage is 'mnbudget vote proposal-hash yes|no'");
+ throw runtime_error("Correct usage is 'mnbudget vote '");
- uint256 hash = ParseHashV(params[1], "parameter 1");
+ uint256 hash = ParseHashV(params[1], "Proposal hash");
std::string strVote = params[2].get_str();
if(strVote != "yes" && strVote != "no") return "You can only vote 'yes' or 'no'";
@@ -360,7 +324,6 @@ Value mnbudget(const Array& params, bool fHelp)
bObj.push_back(Pair("TotalPayment", ValueFromAmount(pbudgetProposal->GetAmount()*pbudgetProposal->GetTotalPaymentCount())));
bObj.push_back(Pair("MonthlyPayment", ValueFromAmount(pbudgetProposal->GetAmount())));
bObj.push_back(Pair("Alloted", ValueFromAmount(pbudgetProposal->GetAllotted())));
- bObj.push_back(Pair("TotalBudgetAlloted", ValueFromAmount(nTotalAllotted)));
std::string strError = "";
bObj.push_back(Pair("IsValid", pbudgetProposal->IsValid(strError)));
@@ -369,15 +332,18 @@ Value mnbudget(const Array& params, bool fHelp)
resultObj.push_back(Pair(pbudgetProposal->GetName(), bObj));
}
+ resultObj.push_back(Pair("TotalBudgetAlloted", ValueFromAmount(nTotalAllotted)));
return resultObj;
}
- if(strCommand == "show")
+ if(strCommand == "list")
{
+ if (params.size() > 2)
+ throw runtime_error("Correct usage is 'mnbudget list [valid]'");
+
std::string strShow = "valid";
- if (params.size() == 2)
- std::string strProposalName = params[1].get_str();
+ if (params.size() == 2) strShow = params[1].get_str();
Object resultObj;
int64_t nTotalAllotted = 0;
@@ -423,16 +389,62 @@ Value mnbudget(const Array& params, bool fHelp)
return resultObj;
}
- if(strCommand == "getinfo")
+ if(strCommand == "getproposalhash")
{
if (params.size() != 2)
- throw runtime_error("Correct usage is 'mnbudget getinfo profilename'");
+ throw runtime_error("Correct usage is 'mnbudget getproposalhash '");
- std::string strProposalName = params[1].get_str();
+ std::string strProposalName = SanitizeString(params[1].get_str());
CBudgetProposal* pbudgetProposal = budget.FindProposal(strProposalName);
- if(pbudgetProposal == NULL) return "Unknown proposal name";
+ if(pbudgetProposal == NULL) return "Unknown proposal";
+
+ Object resultObj;
+
+ std::vector winningProps = budget.GetAllProposals();
+ BOOST_FOREACH(CBudgetProposal* pbudgetProposal, winningProps)
+ {
+ if(pbudgetProposal->GetName() != strProposalName) continue;
+ if(!pbudgetProposal->fValid) continue;
+
+ CTxDestination address1;
+ ExtractDestination(pbudgetProposal->GetPayee(), address1);
+ CBitcoinAddress address2(address1);
+
+ Object bObj;
+ bObj.push_back(Pair("Hash", pbudgetProposal->GetHash().ToString()));
+ bObj.push_back(Pair("PaymentAddress", address2.ToString()));
+ bObj.push_back(Pair("Ratio", pbudgetProposal->GetRatio()));
+ bObj.push_back(Pair("Yeas", (int64_t)pbudgetProposal->GetYeas()));
+ bObj.push_back(Pair("Nays", (int64_t)pbudgetProposal->GetNays()));
+ bObj.push_back(Pair("Abstains", (int64_t)pbudgetProposal->GetAbstains()));
+
+ bObj.push_back(Pair("IsEstablished", pbudgetProposal->IsEstablished()));
+
+ std::string strError = "";
+ bObj.push_back(Pair("IsValid", pbudgetProposal->IsValid(strError)));
+ bObj.push_back(Pair("IsValidReason", strError.c_str()));
+ bObj.push_back(Pair("fValid", pbudgetProposal->fValid));
+
+ resultObj.push_back(Pair(pbudgetProposal->GetHash().ToString(), bObj));
+ }
+
+ if(resultObj.size() > 1) return resultObj;
+
+ return pbudgetProposal->GetHash().ToString();
+ }
+
+ if(strCommand == "getproposal")
+ {
+ if (params.size() != 2)
+ throw runtime_error("Correct usage is 'mnbudget getproposal '");
+
+ uint256 hash = ParseHashV(params[1], "Proposal hash");
+
+ CBudgetProposal* pbudgetProposal = budget.FindProposal(hash);
+
+ if(pbudgetProposal == NULL) return "Unknown proposal";
CTxDestination address1;
ExtractDestination(pbudgetProposal->GetPayee(), address1);
@@ -467,15 +479,15 @@ Value mnbudget(const Array& params, bool fHelp)
if(strCommand == "getvotes")
{
if (params.size() != 2)
- throw runtime_error("Correct usage is 'mnbudget getvotes profilename'");
+ throw runtime_error("Correct usage is 'mnbudget getvotes '");
- std::string strProposalName = params[1].get_str();
+ uint256 hash = ParseHashV(params[1], "Proposal hash");
Object obj;
- CBudgetProposal* pbudgetProposal = budget.FindProposal(strProposalName);
+ CBudgetProposal* pbudgetProposal = budget.FindProposal(hash);
- if(pbudgetProposal == NULL) return "Unknown proposal name";
+ if(pbudgetProposal == NULL) return "Unknown proposal";
std::map::iterator it = pbudgetProposal->mapVotes.begin();
while(it != pbudgetProposal->mapVotes.end()){
@@ -564,24 +576,21 @@ Value mnfinalbudget(const Array& params, bool fHelp)
strCommand = params[0].get_str();
if (fHelp ||
- (strCommand != "suggest" && strCommand != "vote-many" && strCommand != "vote" && strCommand != "show" && strCommand != "getvotes"))
+ (strCommand != "vote-many" && strCommand != "vote" && strCommand != "list" && strCommand != "getvotes"))
throw runtime_error(
- "mnfinalbudget \"command\"... ( \"passphrase\" )\n"
- "Vote or show current budgets\n"
+ "mnfinalbudget \"command\"...\n"
+ "Manage current budgets\n"
"\nAvailable commands:\n"
- " vote-many - Vote on a finalized budget\n"
- " vote - Vote on a finalized budget\n"
- " show - Show existing finalized budgets\n"
- " getvotes - Get vote information for each finalized budget\n"
+ " list - List existing finalized budgets\n"
+ " vote - Vote on a finalized budget by single masternode (using dash.conf setup)\n"
+ " vote-many - Vote on a finalized budget by all masternodes (using masternode.conf setup)\n"
+ " getvotes - Get vote information for each finalized budget\n"
);
if(strCommand == "vote-many")
{
- std::vector mnEntries;
- mnEntries = masternodeConfig.getEntries();
-
if (params.size() != 2)
- throw runtime_error("Correct usage is 'mnfinalbudget vote-many BUDGET_HASH'");
+ throw runtime_error("Correct usage is 'mnfinalbudget vote-many '");
std::string strHash = params[1].get_str();
uint256 hash(strHash);
@@ -589,6 +598,9 @@ Value mnfinalbudget(const Array& params, bool fHelp)
int success = 0;
int failed = 0;
+ std::vector mnEntries;
+ mnEntries = masternodeConfig.getEntries();
+
Object resultsObj;
BOOST_FOREACH(CMasternodeConfig::CMasternodeEntry mne, masternodeConfig.getEntries()) {
@@ -654,11 +666,8 @@ Value mnfinalbudget(const Array& params, bool fHelp)
if(strCommand == "vote")
{
- std::vector mnEntries;
- mnEntries = masternodeConfig.getEntries();
-
if (params.size() != 2)
- throw runtime_error("Correct usage is 'mnfinalbudget vote BUDGET_HASH'");
+ throw runtime_error("Correct usage is 'mnfinalbudget vote '");
std::string strHash = params[1].get_str();
uint256 hash(strHash);
@@ -692,7 +701,7 @@ Value mnfinalbudget(const Array& params, bool fHelp)
}
- if(strCommand == "show")
+ if(strCommand == "list")
{
Object resultObj;
@@ -722,7 +731,7 @@ Value mnfinalbudget(const Array& params, bool fHelp)
if(strCommand == "getvotes")
{
if (params.size() != 2)
- throw runtime_error("Correct usage is 'mnbudget getvotes budget-hash'");
+ throw runtime_error("Correct usage is 'mnbudget getvotes '");
std::string strHash = params[1].get_str();
uint256 hash(strHash);
diff --git a/src/rpcmasternode.cpp b/src/rpcmasternode.cpp
index d59abb77416d..e139c1fbdb7b 100644
--- a/src/rpcmasternode.cpp
+++ b/src/rpcmasternode.cpp
@@ -140,9 +140,9 @@ Value masternode(const Array& params, bool fHelp)
" genkey - Generate new masternodeprivkey\n"
" enforce - Enforce masternode payments\n"
" outputs - Print masternode compatible outputs\n"
- " start - Start masternode configured in dash.conf\n"
- " start-alias - Start single masternode by assigned alias configured in masternode.conf\n"
- " start- - Start masternodes configured in masternode.conf (: 'all', 'missing', 'disabled')\n"
+ " start - Start local Hot masternode configured in dash.conf\n"
+ " start-alias - Start single remote masternode by assigned alias configured in masternode.conf\n"
+ " start- - Start remote masternodes configured in masternode.conf (: 'all', 'missing', 'disabled')\n"
" status - Print masternode status information\n"
" list - Print list of all known masternodes (see masternodelist for more info)\n"
" list-conf - Print masternode.conf in JSON format\n"
diff --git a/src/rpcwallet.cpp b/src/rpcwallet.cpp
index c60c819a35c5..7f7408f6945a 100644
--- a/src/rpcwallet.cpp
+++ b/src/rpcwallet.cpp
@@ -1685,7 +1685,7 @@ Value keypoolrefill(const Array& params, bool fHelp)
"\nFills the keypool."
+ HelpRequiringPassphrase() + "\n"
"\nArguments\n"
- "1. newsize (numeric, optional, default=100) The new keypool size\n"
+ "1. newsize (numeric, optional, default=" + itostr(DEFAULT_KEYPOOL_SIZE) + ") The new keypool size\n"
"\nExamples:\n"
+ HelpExampleCli("keypoolrefill", "")
+ HelpExampleRpc("keypoolrefill", "")
diff --git a/src/util.cpp b/src/util.cpp
index 42c1571f9d85..2e76ec222da7 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -117,6 +117,7 @@ int nLiquidityProvider = 0;
int64_t enforceMasternodePaymentsTime = 4085657524;
bool fSucessfullyLoaded = false;
bool fEnableDarksend = false;
+bool fDarksendMultiSession = false;
/** All denominations used by darksend */
std::vector darkSendDenominations;
string strBudgetMode = "";
diff --git a/src/util.h b/src/util.h
index 6127b69da5c1..0ec4ceb679ec 100644
--- a/src/util.h
+++ b/src/util.h
@@ -38,6 +38,7 @@ extern int nDarksendRounds;
extern int nAnonymizeDarkcoinAmount;
extern int nLiquidityProvider;
extern bool fEnableDarksend;
+extern bool fDarksendMultiSession;
extern int64_t enforceMasternodePaymentsTime;
extern std::string strMasterNodeAddr;
extern int keysLoaded;
diff --git a/src/utilstrencodings.cpp b/src/utilstrencodings.cpp
index 9e2e21fb0132..fc2f8d089ace 100644
--- a/src/utilstrencodings.cpp
+++ b/src/utilstrencodings.cpp
@@ -26,7 +26,7 @@ string SanitizeString(const string& str)
* safeChars chosen to allow simple messages/URLs/email addresses, but avoid anything
* even possibly remotely dangerous like & or >
*/
- static string safeChars("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890 .,;_/:?@()");
+ static string safeChars("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890 .,;_-/:?@()");
string strResult;
for (std::string::size_type i = 0; i < str.size(); i++)
{
diff --git a/src/wallet.cpp b/src/wallet.cpp
index d57ddbdb885f..7a7376022529 100644
--- a/src/wallet.cpp
+++ b/src/wallet.cpp
@@ -2234,10 +2234,14 @@ bool CWallet::CreateTransaction(const vector >& vecSend,
BOOST_FOREACH(const PAIRTYPE(const CWalletTx*,unsigned int)& coin, setCoins)
txNew.vin.push_back(CTxIn(coin.first->GetHash(),coin.second));
+ // BIP69 https://github.com/kristovatlas/bips/blob/master/bip-0069.mediawiki
+ sort(txNew.vin.begin(), txNew.vin.end());
+ sort(txNew.vout.begin(), txNew.vout.end());
+
// Sign
int nIn = 0;
- BOOST_FOREACH(const PAIRTYPE(const CWalletTx*,unsigned int)& coin, setCoins)
- if (!SignSignature(*this, *coin.first, txNew, nIn++))
+ BOOST_FOREACH(const CTxIn& vin, txNew.vin)
+ if (!SignSignature(*this, mapWallet[vin.prevout.hash], txNew, nIn++))
{
strFailReason = _("Signing transaction failed");
return false;
@@ -2505,9 +2509,6 @@ string CWallet::PrepareDarksendDenominate(int minRounds, int maxRounds)
return "Error: can't make current denominated outputs";
}
- // randomize the output order
- std::random_shuffle (vOut.begin(), vOut.end());
-
// We also do not care about full amount as long as we have right denominations, just pass what we found
darkSendPool.SendDarksendDenominate(vCoinsResult, vOut, nValueIn - nValueLeft);
@@ -2638,7 +2639,7 @@ bool CWallet::NewKeyPool()
if (IsLocked())
return false;
- int64_t nKeys = max(GetArg("-keypool", 1000), (int64_t) 0);
+ int64_t nKeys = max(GetArg("-keypool", DEFAULT_KEYPOOL_SIZE), (int64_t) 0);
for (int i = 0; i < nKeys; i++)
{
int64_t nIndex = i+1;
@@ -2665,7 +2666,7 @@ bool CWallet::TopUpKeyPool(unsigned int kpSize)
if (kpSize > 0)
nTargetSize = kpSize;
else
- nTargetSize = max(GetArg("-keypool", 1000), (int64_t) 0);
+ nTargetSize = max(GetArg("-keypool", DEFAULT_KEYPOOL_SIZE), (int64_t) 0);
while (setKeyPool.size() < (nTargetSize + 1))
{
diff --git a/src/wallet.h b/src/wallet.h
index 069b50520e98..f65ed8b9832a 100644
--- a/src/wallet.h
+++ b/src/wallet.h
@@ -48,6 +48,8 @@ static const CAmount DEFAULT_TRANSACTION_MAXFEE = 0.1 * COIN;
static const CAmount nHighTransactionMaxFeeWarning = 100 * nHighTransactionFeeWarning;
//! Largest (in bytes) free transaction we're willing to create
static const unsigned int MAX_FREE_TRANSACTION_CREATE_SIZE = 1000;
+//! -keypool default
+static const unsigned int DEFAULT_KEYPOOL_SIZE = 1000;
class CAccountingEntry;
class CCoinControl;