Skip to content

v4.0.0

Compare
Choose a tag to compare
@Fuzzbawls Fuzzbawls released this 18 Dec 20:45
· 6894 commits to master since this release
v4.0.0
b005d84

PIVX Core version v4.0.0 is now available from: https://github.com/pivx-project/pivx/releases

This is a new major version release, including various bug fixes and performance improvements, as well as updated translations.

Please report bugs using the issue tracker at github: https://github.com/pivx-project/pivx/issues

Mandatory Update

PIVX Core v4.0.0 is a mandatory update for all users. This release contains new consensus rules and improvements that are not backwards compatible with older versions. Users will need to update their clients before enforcement of this update goes into effect.

Update enforcement is currently scheduled to go into effect at the following time:

Mainnet: Sunday, January 5, 2020 12:00:00 AM GMT

Masternodes will need to be restarted once both the masternode daemon and the controller wallet have been upgraded.

How to Upgrade

If you are running an older version, shut it down. Wait until it has completely shut down (which might take a few minutes for older versions), then run the installer (on Windows) or just copy over /Applications/PIVX-Qt (on Mac) or pivxd/pivx-qt (on Linux).

Compatibility

PIVX Core is extensively tested on multiple operating systems using the Linux kernel, macOS 10.10+, and Windows 7 and later.

Microsoft ended support for Windows XP on April 8th, 2014, No attempt is made to prevent installing or running the software on Windows XP, you can still do so at your own risk but be aware that there are known instabilities and issues. Please do not report issues about Windows XP to the issue tracker.

Apple released it's last Mountain Lion update August 13, 2015, and officially ended support on December 14, 2015. PIVX Core software starting with v3.2.0 will no longer run on MacOS versions prior to Yosemite (10.10). Please do not report issues about MacOS versions prior to Yosemite to the issue tracker.

PIVX Core should also work on most other Unix-like systems but is not frequently tested on them.

Notable Changes

New Wallet UI

v4.0.0 introduces a completely new GUI for the wallet, designed and coded from the ground up by the Krubit team.

This new UI, aside from the overall design large implementation, includes user-focused improvements and features such as a brief introduction on first load, a FAQ section, one-click QRCode compatible receiving addresses, masternode creation wizard, dark and light themes, filterable staking charts, and much more.

You can read more details about this extensive work in (PR #954)

There are some legacy features that have not been included, however, notably the in-wallet block explorer and the governance page. The in-wallet block explorer was sorely outdated, and the governance page was a newer addition that will be seeing a return in a future version.

Cold Staking

A brand new feature is being introduced with the release of v4.0.0: Cold Staking (PR #955)! This feature allows a coin owner to keep coins in a "cold" (or locked) wallet whilst a "hot" wallet carries out the burden of staking those coins.

This brings added security to coin owners as they are no longer required to use an unlocked or partially unlocked wallet (with the ability to spend coins anywhere) in order to gain staking rewards. Users who have chosen to store their coins on hardware devices such as a Ledger or Trezor1 can also gain staking rewards with those coins.

A full technical writup is available on the PIVX Wiki, and an initial video showcase is available on YouTube.
A brief guide to setup cold staking with GUI and RPC is available here.

1 Spending cold stakes from HW wallets currently available only for Ledger devices via PET4L tool.

Multi-Split Stake Splitting

Stake splitting has received a makeover and now supports splitting to more than two (2) outputs. PR #968 introduced the change, which is controlled by the wallet's stakesplitthreshold setting.

The default split threshold remains at 2000 PIV, and can be adjusted in the GUI's Settings page, or via the RPC setstakesplitthreshold command.

For a real example, with a stake split threshold of 1500, and a UTXO of 4708.1557; the current stake split algorithm would break that into two outputs of approximately 2355.07785. With this new logic; it will be broken into 3 outputs instead of two; each sized 1570.0519 (4708.1557 input + 2 stake = 4710.1557 / 3 outputs = 1570.0519.

The maximum number of outputs is currently capped at 48. Also, in relation to the new Cold Staking feature described above; the stake split threshold is set by the staker wallet and NOT the owner wallet.

New Consensus Rules

The following consensus rule changes will be enforced on or shortly after block 2153200. Note that Upgrade Enforcement (mentioned above) will occur prior to this block height.

V1 zPIV Spending (Public Spends Version 4)

Since the discovery of a critical exploit within the libzerocoin library in early 2019, remaining legacy v1 zPIV have been un-spendable. We're happy to say that, once the new consensus rules are in effect, users will once again be able to spend their v1 zPIV with public spends version 4 (PR #936).

As with the previous version 3 public spends introduced in core wallet version 3.3.0 (enabling the spending of v2 zPIV), version 4 spends will also be public. A full technical writeup is available on the PIVX Wiki.

OP_CHECKCOLDSTAKEVERIFY and P2CS

Cold staking introduces a new opcode, OP_CHECKCOLDSTAKEVERIFY, in the scripting language, and a new standard transaction type using it, named P2CS (Pay-To-Cold-Staking). A P2CS script is defined as follows:

OP_DUP OP_HASH160 OP_ROT OP_IF OP_CHECKCOLDSTAKEVERIFY [HASH160(stakerPubKey]
OP_ELSE [HASH160(ownerPubKey)] OP_ENDIF OP_EQUALVERIFY OP_CHECKSIG

OP_CHECKCOLDSTAKEVERIFY is used to ensure that the staker can only spend the output in a valid coinstake transaction (using the same P2CS script in the new output).

Time Protocol v2

#PR1002 introduces a new time protocol for the Proof-Of-Stake consensus mechanism, to ensure better efficiency, fairness and security. The time is now divided in 15-seconds slots and valid blocktimes are at the beginning of each slot (i.e. the block timestamp's seconds can only be 00, or 15, or 30 or 45).

The maximum future time limit is lowered from 3 minutes to 14 seconds and the past limit is set to the previous blocktime (i.e. a block can no longer have a timestamp earlier than its previous block).

This means that, when looking for a valid kernel, each stakeable input can be hashed only once every 15 seconds (once per timeslot), and it is not possible to submit blocks with timestamp higher than the current time slot. This ultimately enables the removal of the "hashdrift" concept.

NOTE: Given the much stricter time constraints, a node's clock synchronization is required for P2P connections: the maximum time offset is 15 seconds and peers with a time drift higher than 30 seconds (in absolute value) will be outright disconnected.

For advanced users, we recommend the setup of NTP clients and own servers. This will provide to your node a higher level of time accuracy and the best, time wise, synchronization with the peers in the network.

Block Version 7

#PR1022 defines Version 7 blocks, which remove the (now-unused) accumulator checkpoint from the block header. This results in an overall data reduction of ~256 bits from each block as well as the in-memory indexes.

New Network Message Signatures

Layer 2 network messages (MN, Budget, Spork, etc) are now signed based on the hash of their binary content instead of their string representation (#PR1024).

New SPORKS

Two new SPORKS are introduced, SPORK_17 (#PR975) and SPORK_18 (#PR995).

SPORK_17 (off by default) is used to activate the Cold Staking protocol. When this spork is off, no cold-staked block is accepted by the network and new delegations are rejected, but coin-owners are still able to spend previously created pay-to-cold-stake delegations.

SPORK_18 (off by default) is used to switch between Version 3 and Version 4 Public Spends. When this spork is active, only version 4 spends are accepted by the network. When it's not, only version 3 spends are accepted.

RPC Changes

New options for existing wallet commands

A new (optional) argument, includeDelegated, has been added to the following commands that allows these commands to include delegated coins/information in their operation:

  • getbalance - Boolean (Default: True)
  • sendfrom - Boolean (Default: False)
  • sendmany - Boolean (Default: False)
  • listtransactions - Boolean (Default: True)

Additionally, a new (optional) argument, includeCold, has been added to the listtransactions command (Boolean - Default: True), which allows for filtering of cold-staker delegated transactions.

New return fields for existing commands

The validateaddress command now includes an additional response field, isstaking, to indicate wither or not the specified address is a cold staking address.

The getwalletinfo command now includes two additional response fields:

  • delegated_balance - PIV balance held in P2CS contracts (delegated amount total).
  • cold_staking_balance - PIV balance held in cold staking addresses.

Newly introduced commands

The following new commands have been added to the RPC interface:

  • getnewstakingaddress
  • delegatestake
  • rawdelegatestake
  • getcoldstakingbalance
  • delegatoradd
  • delegatorremove
  • listcoldutxos
  • liststakingaddresses
  • listdelegators

Details about each new command can be found below.

getnewstakingaddress generates a new cold staking address:

getnewstakingaddress ( "account" )

Returns a new PIVX cold staking address for receiving delegated cold stakes.

Arguments:
1. "account"        (string, optional) The account name for the address to be linked to. if not provided, the default account "" is used. It can also be set to the empty string "" to represent the default account. The account does not need to exist, it will be created if there is no account by the given name.

Result:
"pivxaddress"    (string) The new pivx address

delegatestake sends a cold staking delegation transaction:

delegatestake "stakingaddress" amount ( "owneraddress" fExternalOwner fUseDelegated fForceNotEnabled )

Delegate an amount to a given address for cold staking. The amount is a real and is rounded to the nearest 0.00000001

Requires wallet passphrase to be set with walletpassphrase call.

Arguments:
1. "stakingaddress"      (string, required) The pivx staking address to delegate.
2. "amount"              (numeric, required) The amount in PIV to delegate for staking. eg 100
3. "owneraddress"        (string, optional) The pivx address corresponding to the key that will be able to spend the stake.
                               If not provided, or empty string, a new wallet address is generated.
4. "fExternalOwner"      (boolean, optional, default = false) use the provided 'owneraddress' anyway, even if not present in this wallet.
                               WARNING: The owner of the keys to 'owneraddress' will be the only one allowed to spend these coins.
5. "fUseDelegated"       (boolean, optional, default = false) include already delegated inputs if needed.6. "fForceNotEnabled"    (boolean, optional, default = false) force the creation even if SPORK 17 is disabled (for tests).

Result:
{
   "owner_address": "xxx"   (string) The owner (delegator) owneraddress.
   "staker_address": "xxx"  (string) The cold staker (delegate) stakingaddress.
   "txid": "xxx"            (string) The stake delegation transaction id.
}

rawdelegatestake creates a raw cold staking delegation transaction without broadcasting it to the network:

rawdelegatestake "stakingaddress" amount ( "owneraddress" fExternalOwner fUseDelegated )

Delegate an amount to a given address for cold staking. The amount is a real and is rounded to the nearest 0.00000001

Delegate transaction is returned as json object.
Requires wallet passphrase to be set with walletpassphrase call.

Arguments:
1. "stakingaddress"      (string, required) The pivx staking address to delegate.
2. "amount"              (numeric, required) The amount in PIV to delegate for staking. eg 100
3. "owneraddress"        (string, optional) The pivx address corresponding to the key that will be able to spend the stake.
                               If not provided, or empty string, a new wallet address is generated.
4. "fExternalOwner"      (boolean, optional, default = false) use the provided 'owneraddress' anyway, even if not present in this wallet.
                               WARNING: The owner of the keys to 'owneraddress' will be the only one allowed to spend these coins.
5. "fUseDelegated         (boolean, optional, default = false) include already delegated inputs if needed.

Result:
{
  "txid" : "id",        (string) The transaction id (same as provided)
  "version" : n,          (numeric) The version
  "size" : n,             (numeric) The serialized transaction size
  "locktime" : ttt,       (numeric) The lock time
  "vin" : [               (array of json objects)
     {
       "txid": "id",    (string) The transaction id
       "vout": n,         (numeric)
       "scriptSig": {     (json object) The script
         "asm": "asm",  (string) asm
         "hex": "hex"   (string) hex
       },
       "sequence": n      (numeric) The script sequence number
     }
     ,...
  ],
  "vout" : [              (array of json objects)
     {
       "value" : x.xxx,            (numeric) The value in btc
       "n" : n,                    (numeric) index
       "scriptPubKey" : {          (json object)
         "asm" : "asm",          (string) the asm
         "hex" : "hex",          (string) the hex
         "reqSigs" : n,            (numeric) The required sigs
         "type" : "pubkeyhash",  (string) The type, eg 'pubkeyhash'
         "addresses" : [           (json array of string)
           "pivxaddress"        (string) pivx address
           ,...
         ]
       }
     }
     ,...
  ],
  "hex" : "data",       (string) The serialized, hex-encoded data for 'txid'
}

getcoldstakingbalance returns the cold balance of the wallet:

getcoldstakingbalance ( "account" )

If account is not specified, returns the server's total available cold balance.
If account is specified, returns the cold balance in the account.
Note that the account "" is not the same as leaving the parameter out.
The server total may be different to the balance in the default "" account.

Arguments:
1. "account"      (string, optional) The selected account, or "*" for entire wallet. It may be the default account using "".

Result:
amount              (numeric) The total amount in PIV received for this account in P2CS contracts.

delegatoradd whitelists a delegated owner address for cold staking:

delegatoradd "addr"

Add the provided address <addr> into the allowed delegators AddressBook.
This enables the staking of coins delegated to this wallet, owned by <addr>

Arguments:
1. "addr"        (string, required) The address to whitelist

Result:
true|false           (boolean) true if successful.

delegatorremove to remove previously whitelisted owner address:

delegatoradd "addr"

Add the provided address <addr> into the allowed delegators AddressBook.
This enables the staking of coins delegated to this wallet, owned by <addr>

Arguments:
1. "addr"        (string, required) The address to whitelist

Result:
true|false           (boolean) true if successful.

listcoldutxos lists all P2CS UTXOs belonging to the wallet (both delegator and cold staker):

listcoldutxos ( nonWhitelistedOnly )

List P2CS unspent outputs received by this wallet as cold-staker-

Arguments:
1. nonWhitelistedOnly   (boolean, optional, default=false) Whether to exclude P2CS from whitelisted delegators.

Result:
[
  {
    "txid" : "true",            (string) The transaction id of the P2CS utxo
    "txidn" : "accountname",    (string) The output number of the P2CS utxo
    "amount" : x.xxx,             (numeric) The amount of the P2CS utxo
    "confirmations" : n           (numeric) The number of confirmations of the P2CS utxo
    "cold-staker" : n             (string) The cold-staker address of the P2CS utxo
    "coin-owner" : n              (string) The coin-owner address of the P2CS utxo
    "whitelisted" : n             (string) "true"/"false" coin-owner in delegator whitelist
  }
  ,...
]

liststakingaddresses lists all cold staking addresses generated by the wallet:

liststakingaddresses "addr"

Shows the list of staking addresses for this wallet.

Result:
[
   {
   "label": "yyy",  (string) account label
   "address": "xxx",  (string) PIVX address string
   }
  ...
]

listdelegators lists the whitelisted owner addresses

listdelegators "addr"

Shows the list of allowed delegator addresses for cold staking.

Result:
[
   {
   "label": "yyy",  (string) account label
   "address": "xxx",  (string) PIVX address string
   }
  ...
]

Snapcraft Packages

For our linux users, in addition to the Ubuntu PPA repository, we are now offering a Snap package as quick way to install and update a PIVX wallet.

Release versions are available via the Stable branch, and (for testing-only purposes) nightly builds are available in the Beta branch.

Internal Miner/Staker Change

The wallet's internal miner/staker is no longer prevented from running prior to having synced all the additional layer 2 (MN/Budget) data. Instead, mining/staking uses better logic to allow block creation without fully synced layer 2 data when the full data set wouldn't be required.

In other words, try to stake a new block only if:

  • full layer 2 sync is complete
    OR
  • The spork list is synced and all three sporks (8,9 and 13) are not active.

Faster Shutdown During Initial Loading

Previously, if a user wanted to close/quit the wallet before it had finished its initial loading process, they would need to wait until that loading process actually completed before the wallet would fully close.

Now, the new behavior is to gracefully close the wallet once the current step is complete.

v4.0.0 Change log

Detailed release notes follow. For convenience in locating the code changes and accompanying discussion, both the pull request and git merge commit are mentioned.

Core

  • #643 469d974519 [Crypto] Use stronger rand for key generation (warrows)
  • #936 12a6b704b6 [zPIV] PublicCoinSpend v4 - Coin Randomness Schnorr Signature (random-zebra)
  • #955 008b7938db [Core][Script][Wallet][RPC][Tests] Cold Staking (random-zebra)
  • #989 6f645ce457 [DB] Db runtime error cleaning the variable that needs to be logged (furszy)
  • #1000 34e11dd5fa [Core] Spork code overhaul (random-zebra)
  • #1002 5666184cc5 [PoS] Time Protocol v2 (random-zebra)
  • #1022 b5bede0661 remove accumulators checkpoint (random-zebra)
  • #1025 988ee3fe37 [Startup] Stop loading the wallet if shutdown was requested. (furszy)
  • #1029 0df20ddbab [Startup][Refactor][Backport] Memory allocation fail handler + init step 1 refactored. (furszy)
  • #1040 01fe200d4a [Bug] Fix GetDepthInMainChain returning 0 when tx is not in mempool (random-zebra)
  • #1050 adc74f737c [Core] Prevent coinstakes from overpaying masternodes (random-zebra)
  • #1063 04834fff67 [Node] Remove a call to IsSuperMajority (warrows)
  • #1066 6a4bf7c42c [Cleanup][Refactor]Main.cpp code cleanup. (furszy)
  • #1067 c947e534ee [Node] Replace IsSuperMajority with height checks (warrows)
  • #1070 fbffae1b38 [Bug] Fix contextCheckBlock for the first block that it's a v1 block. (furszy)
  • #1129 a87bfc32a0 [Consensus] Define TestNet changeover block for PIVX v4.0 RC (random-zebra)
  • #1134 a4ded20de4 [Trivial] Remove a duplicate variable definition (warrows)
  • #1191 9a054eeba6 [Consensus] Define MainNet changeover block for PIVX v4.0 (random-zebra)
  • #1197 ad241150e9 [Trivial] Update copyright headers (Fuzzbawls)

GUI

  • #954 e815815fdc [GUI] [Model] New Wallet UI (furszy)
  • #997 4d50ff33da [Trivial][UI] MN screen (furszy)
  • #998 6380da7eb4 [Qt] Guard MN tab from possible missing TXs in masternode.conf (Fuzzbawls)
  • #999 c6567aec89 [UI] Send screen total amounts refresh after custom options cleaned (furszy)
  • #1003 a89f4e6603 [QT][Performance] Memory leak re creating the row object instead of re initialize it. (furszy)
  • #1006 ac523b24c2 [Trivial] Fix mnrow ifdef typo (Fuzzbawls)
  • #1007 39e8a03505 [Qt] Reintroduce networkstyle to title texts (Fuzzbawls)
  • #1008 91514a0326 [Qt] Don't set placeholder on QPlainTextEdit (Fuzzbawls)
  • #1009 e0178087c8 [QT] Dashboard chart left and right day range movement control buttons (furszy)
  • #1012 0d05b5381d [Performance][Wallet][QT][Model] TransactionTableModel multi-thread initialization + tx filter sort speed improved. (furszy)
  • #1014 49f42e9a59 [GUI] Refresh coin control upon reopening (CryptoDev-Project)
  • #1015 17ef4163dc [Qt] Update source strings (Fuzzbawls)
  • #1016 33182066ba [GUI] Tx detail dialog (furszy)
  • #1017 8b6819a9d8 [GUI][Trivial] Remove hardcoded address. (Matias Furszyfer)
  • #1018 e264c77e63 [GUI] Update amounts when entry is removed from SendMultiRow (random-zebra)
  • #1026 968000bb33 [Cleanup] Prev 4.0 wallet UI files cleanup. (furszy)
  • #1032 d3b2969fff [GUI] Dashboard chart map first segfault (furszy)
  • #1033 c04f442e4c [GUI][Model][Wallet] Cold staking UI. (furszy)
  • #1048 1cb55b4822 [Qt] Make CoinControlTreeWidget focusable (Fuzzbawls)
  • #1053 6aaa531ec1 [GUI] Segfault for a bad cast of the parent in the escape key press event (furszy)
  • #1054 7c2cd32d6e [UI] Guard a call to GetDepthInMainChain (warrows)
  • #1055 232cea5584 [Wallet] Create label for addresses generated via masternode wizard (CryptoDev-Project)
  • #1057 d4e6525410 [UI] Fix AA_EnableHighDpiScaling warning (Akshay)
  • #1071 297acac8d6 [UI] Settings options buttons hover css (furszy)
  • #1072 1e0cea53e8 [Qt] Update welcomecontentwidget.ui (Jeffrey)
  • #1073 64a90d717f [Model][Backport] Remove mapWallet not needed call + stop treating coinbase differently (furszy)
  • #1074 54ff8bd3da [UI] TransactionFilter do not invalidate filter if range is already set (furszy)
  • #1075 31e9f0fbde [Model][UI] Receive dialog (furszy)
  • #1076 decac23124 [GUI] Decreasing the tooltip padding for #1076 windows issue. (furszy)
  • #1083 fba6d3cdac [Qt] Hide option for 3rd party transaction URLs (Fuzzbawls)
  • #1084 7b3455acaa [Qt] Show display unit option as text (Fuzzbawls)
  • #1085 a4d141fd1c [Qt] Fixup topbar balance calculation (Fuzzbawls)
  • #1099 5d03160837 [GUI][Model][Performance] Dashboard (furszy)
  • #1104 97bea9cfc0 [Trivial][GUI] Fix typos in welcome widget (random-zebra)
  • #1105 e4e5df1018 [GUI] Fix bug in change wallet passphrase (random-zebra)
  • #1109 4771f6a7d7 [Trivial] [GUI] Customize Fee Dialog text change (NoobieDev12)
  • #1112 645854ad57 [Qt] Refresh coin control when re-opening from CS widget (Fuzzbawls)
  • #1113 b546151bc0 [Qt] Re-work settings restart and saving flow (Fuzzbawls)
  • #1115 12be3e2a8c [Trivial] [GUI] Request Dialog typo fix (JSKitty)
  • #1119 6ceff8f97f [GUI] Cold staking Warning for unconfirmed balance + stop multiple model updates (furszy)
  • #1120 0d04267c89 [GUI][BUG] Bad top padding on the dashboard nav icon in dark theme fix. (furszy)
  • #1121 0216fd3c8a [GUI] Cold staking alert user if the owner address is not from the wallet (furszy)
  • #1122 641b1d6bbe [GUI][Backport] Explicitly disable "Dark Mode" appearance on macOS (fanquake)
  • #1123 a4fb368d39 [GUI] Prevent worker constant creation and invalid removal (furszy)
  • #1124 bbb0125077 [GUI] Use QRegexValidator instead of the QDoubleValidator. (furszy)
  • #1125 c6e238ca4d [GUI] Inform if open pivx.conf and/or backups folder fail. (furszy)
  • #1126 c910490c53 [BUG] Fix send transaction detail destinations (furszy)
  • #1130 c582cabbd3 [UI] Copy correct data from mninfo dialog (Akshay)
  • #1131 8ca5db691b [Bug] URI read from file coded properly.. (furszy)
  • #1132 a34a7dfe1f [Bug][GUI] Tx list row amount color changing invalidly. (furszy)
  • #1133 d159cb1878 [Bug][GUI] Topbar sync progressbar not expanding fixed. (furszy)
  • #1139 03b51c411d [Qt] Fix segfault when running GUI client with --help or -? (Fuzzbawls)
  • #1141 01c517085b [GUI][Model] isTestNetwork regtest correction. (furszy)
  • #1142 17ad5a2a61 [Bug] Fix segfault on GUI initialization for cold staker wallet (random-zebra)
  • #1151 da3bea5971 Rewording text under Change Wallet Passphrase (NoobieDev12)
  • #1158 7deae859f1 [BUG] Masternodes wizard (furszy)
  • #1159 1ae53d0a2a [GUI][Trivial] Rewording of Error message when wallet is unlocked for staking only (NoobieDev12)
  • #1160 88ddd1a947 [GUI][Model] Do not re request passphrase when the wallet is unlocked. (furszy)
  • #1161 e4bfe3e9af [GUI][Trivial] Custom change address (furszy)
  • #1162 1c23ea6a59 [Qt] Periodic make translate (Fuzzbawls)
  • #1163 474e2bc6b2 [GUI] Validate wallet password on enter key press (warrows)
  • #1165 c54dad3b9f [GUI][Bug] Cold staking screen (furszy)
  • #1166 4cc04b0ba6 [Qt] properly copy IPv6 externalip MN info (Fuzzbawls)
  • #1173 8e42e03192 [GUI][Trivial] Remove every pushButton focus decoration property. (furszy)
  • #1174 b352e2d096 [GUI] Min cold staking amount in ColdStaking widget (random-zebra)
  • #1178 d7a929c6a8 [GUI][Bug] Cold staking screen (furszy)
  • #1179 7a33fe10d2 [Qt] Fix for dead link to wrong PIVX website (NoobieDev12)
  • #1183 60053d6786 [GUI][Trivial] Allow immediate typing in dialogs / tools widget (random-zebra)
  • #1185 682d54cd12 [GUI][Trivial] Make amount optional in staking address gen dialog (random-zebra)
  • #1186 0cc2976bbc [GUI][Trivial] move caps lock warning in askpassphrase dialog (random-zebra)
  • #1187 0a2baa686d [GUI][Trivial] Fix tx detail dialog expanding policy (random-zebra)
  • #1188 d5ed83896c [GUI] Workaround to the OSX border-image pink stripes. (furszy)
  • #1190 129c4744ea [GUI] Feature/Bug CoinControl Update on Open (Liquid369)
  • #1192 e52043b260 [GUI][Bug] Accept P2CS locked coins in coincontrol (random-zebra)
  • #1193 f49b0309a0 [GUI][Wallet] Allow spending of P2CS without coincontrol selection (random-zebra)
  • #1194 8854eace66 fix "total staking" amount (random-zebra)
  • #1195 ce5bc08988 [Qt] Update translations from transifex (Fuzzbawls)

P2P and Network Code

  • #975 9765a772b8 [Consensus] Define SPORK_17 (random-zebra)
  • #995 8f2217d2bd [Consensus] Define SPORK_18 (random-zebra)
  • #1001 59f55d6a54 [Consensus] Remove Old message format in CMasternodeBroadcast (random-zebra)
  • #1024 98aa3fa438 [Consensus] New signatures for network messages (random-zebra)
  • #1110 f89f672847 [Masterndoes] Masternodes sync try locking cs_main when it looks for the tip (furszy)
  • #1118 3219d9b48c [Sporks] Guard chainActive.Tip() and chainActive.Height() methods call. (furszy)
  • #1128 d6573e70c7 [Consensus] nTimeOffset warning for time protocol V2 (random-zebra)
  • #1137 4241574857 [Net] Protocol update enforcement for 70918 (random-zebra)
  • #1138 e0c49356ae [Consensus] nTimeOffset warning addition (random-zebra)
  • #1167 fc4ffcf4af [Trivial] Remove time offset warning when it gets back within range (random-zebra)
  • #1177 421cc1017b [Network] Add SPORK 17 & 18 to the fMissingSporks flag + code reorg. (furszy)

Wallet

  • #968 47ccf45adb [Staking][Wallet] Add Multi-Split functionality to stake output splitting (Cave Spectre)
  • #970 0f1764a3db [Wallet] Various transaction handling improvements (warrows)
  • #1030 ed83481494 [Wallet][Startup][DB][Backport] Remove vchDefaultKey from wallet.h (furszy)
  • #1031 52aed66930 [Wallet] fix CreateZerocoinSpendTransaction with empty addressesTo (random-zebra)
  • #1039 41d19c106f Fix OOM when deserializing UTXO entries with invalid length (random-zebra)
  • #1043 d1d0cb691a [Wallet][Tests] Fix bug re-adding orphan coinstake's inputs to the wallet (random-zebra)
  • #1056 3ba3b0e244 [Wallet][Refactor] Updating ancient getbalanceXXX methods to a lambda call. (furszy)
  • #1058 18e23a49e7 [Wallet] Transaction IsEquivalentTo method backported + code cleanup. (furszy)
  • #1064 bfbbb6b30c [Wallet][RPC] Diagnose unsuitable outputs in lockunspent() (random-zebra)
  • #1065 d605e528db [Wallet] Unlock spent outputs (random-zebra)
  • #1068 59b45e6d33 [Wallet] Do not cache the credit amount if fUnspent is enabled. (random-zebra)
  • #1069 d6f9eff763 [Wallet] Enable miner with mnsync incomplete (random-zebra)
  • #1116 e4d7addbb7 [Wallet] Do not use p2cs outputs in the autocombine flow. (furszy)
  • #1117 8d425bdf0d [Wallet][GUI][Model] Cold staking addresses contacts flow. (furszy)

Build System(s)

  • #977 ee9f6ca9da [Build] CMake Improvements (Fuzzbawls)
  • #979 8ffc045f7d [Compilation] Pass caught exceptions by reference (warrows)
  • #990 e7e31442e8 [Build] Fix wrong argument when verifying MacOS signatures (Mrs-X)
  • #991 4f3dd5ef66 [Build] Remove OpenSSL 1.0 check (warrows)
  • #1010 6ff12f70de [Build] Fixup moc includes and generation (Fuzzbawls)
  • #1013 75b8ad2ae5 [Build] Clean up GUI dependency checking (Fuzzbawls)
  • #1021 899b4bd6a9 [Build] Use in-tree intermediary endian header (Fuzzbawls)
  • #1023 509d63526b [Travis] Lower timeout for the full test suite (warrows)
  • #1027 569ac5e5e0 [Cleanup] Get rid of compiler warnings (random-zebra)
  • #1036 adfcb46149 [Build] Add SnapCraft Builds (Fuzzbawls)
  • #1042 8efd696b3f [TravisCI] Run CMake tests earlier (Fuzzbawls)
  • #1045 a761323178 [travis] Update .travis.yml (Warrows)
  • #1052 dd62f3f66a [CMake] Fix macOS Boost detection (Fuzzbawls)
  • #1127 c7bc2e1288 [Deployment] Windows taskbar icon pixelated fix. (furszy)
  • #1136 0f92bf8e17 [Build] Include full version in release file names (fanquake)
  • #1157 04480012aa [Travis] Increase functional tests reserved time (Warrows)
  • #1180 4f4da456de [Build] Add random-zebra gitian GPG public key fingerprint (random-zebra)

RPC Interface

  • #1111 fcb0db8321 [Trivial] Fix help text for delegatorremove (Akshay)

Testing System(s)

  • #981 92de4b81b3 [Tests] Add RPC budget regression tests (Fuzzbawls)

Documentation

  • #1051 9ea7519026 [Doxygen] Generate Todo list (Fuzzbawls)
  • #1176 eb1eb4d2c6 [Docs][Utils] Overhaul gitian build docs/script (Fuzzbawls)
  • #1181 78034c937b [Docs] 4.0.0 release notes (Fuzzbawls)

Credits

Thanks to everyone who directly contributed to this release:

  • Akshay
  • Alex Morcos
  • Andrew Chow
  • Ben Woosley
  • Cave Spectre
  • Cory Fields
  • CryptoDev-Project
  • Dag Robole
  • Fuzzbawls
  • Gregory Solarte
  • JSKitty
  • James Hilliard
  • Jeffrey
  • Jonas Schnelli
  • Liquid369
  • MarcoFalke
  • Matias Furszyfer
  • Matt Corallo
  • Mrs-X
  • NoobieDev12
  • Pieter Wuille
  • Warrows
  • Wladimir J. van der Laan
  • cevap
  • dexX7
  • fanquake
  • furszy
  • practicalswift
  • presstab
  • random-zebra

As well as everyone that helped translating on Transifex, the QA team during Testing and the Node hosts supporting our Testnet.