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;