Skip to content

Commit

Permalink
Merge #2107: [Backport] 5.0 backports Part 2
Browse files Browse the repository at this point in the history
41abf5a clear StakeableCoins before initializing (PeterL73)
3de9861 [Policy] Set DEFAULT_SHIELDEDTXFEE_K to 100 (from 1000) (random-zebra)
4a8e571 [BUG] Fix total budget on testnet (random-zebra)
4285bee scripted-diff: Fix "alloted" typo (random-zebra)
107529b Tests: check getbudgetinfo / getbudgetprojection updated output (random-zebra)
495c546 Tests: check invalid RPC inputs in rpc_budget test (random-zebra)
723a41b Consensus: enforce that proposal BlockStart must be a superblock (random-zebra)
5fb488a Consensus: enforce proposal max payments (6 main-net / 20 test-net) (random-zebra)
6377883 [BUG][Tests] Fix remote nodes switched ports in PivxTier2TestFramework (random-zebra)
73864a0 Startup: move masternode port validation inside `initMasternode`. (furszy)
18e83cf Only return the tx hex string in rawdelegatestake (Fuzzbawls)
85d83b1 Further RPC help output cleanups (Fuzzbawls)
2c315a3 Only Return the transaction hex string in `rawshieldsendmany` (Fuzzbawls)
a6b3f77 [BUG][GUI] Cache unconfirmed_balance only for transparent outs (random-zebra)
d95f0ca [BUG][GUI] Don't return StakingOnlyUnlocked from WalletModel::sendCoins (random-zebra)
f17aabc [Trivial][GUI] coin control: Fixed column size in list-mode (random-zebra)
f3662f8 [GUI] Finally, fix duplicate records. (furszy)
1d95c40 [DOC] main readme, added latest release version and release date badges (furszy)
afcba75 [DOC] main readme, re-written to current project state. (furszy)
7fd9e62 [DOC] Readme, migrated staled travis badge for github actions status badge. (furszy)
227161b [Trivial][RPC] Drop 'ed' suffix from Shielded in TxSaplingToJSON (random-zebra)
ed8999a [GUI] send screen, hide shield all coins btn for now. (furszy)

Pull request description:

  further backports for the 5.0 branch:

  #2094
  #2093
  #2095
  #2096
  #2098
  #2104
  #2102
  #2097
  #2103
  #2101
  #2108
  #2109

ACKs for top commit:
  furszy:
    utACK 41abf5a
  random-zebra:
    utACK 41abf5a and merging...

Tree-SHA512: 34619594f6e87362f8760a24c39ef25e8acf856de258d1e40f5a1264381fb9e6f6210bcca2b1bc765a0366c7a4467d43c95147bf75f7c2d64d16ee3b41a9efb9
  • Loading branch information
random-zebra committed Dec 28, 2020
2 parents 3b25b87 + 41abf5a commit 41c3b6f
Show file tree
Hide file tree
Showing 32 changed files with 282 additions and 252 deletions.
108 changes: 52 additions & 56 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,59 +1,55 @@
PIVX Core integration/staging repository
=====================================

[![Build Status](https://travis-ci.org/PIVX-Project/PIVX.svg?branch=master)](https://travis-ci.org/PIVX-Project/PIVX) [![GitHub version](https://badge.fury.io/gh/PIVX-Project%2FPIVX.svg)](https://badge.fury.io/gh/PIVX-Project%2FPIVX)

PIVX is an open source cryptocurrency focused on fast, private transactions using the Zerocoin protocol, with low transaction fees & environmental footprint. It utilizes the first ever anonymous proof of stake protocol, called zPoS, combined with regular PoS and masternodes for securing its network. zPoS incentivizes using the privacy features available in PIVX by granting a higher block reward for zPoS over regular PoS and masternodes. In practice, PIVX has between 4 to 10 times higher use of its privacy features in comparison to other coins that combine public and private transactions. This is thanks to innovations like zPoS and integrating the Zerocoin protocol into light/mobile wallets, allowing for a complete and lightweight privacy protocol that can be used on the go. This also includes security improvements like [deterministic generation of zPIV for easy backups.](https://www.reddit.com/r/pivx/comments/8gbjf7/how_to_use_deterministic_zerocoin_generation/)
The goal of PIVX is to achieve a decentralized, sustainable cryptocurrency with near instant full-time private transactions, fair governance and community intelligence.
- Anonymized transactions & consensus using the [_Zerocoin Protocol_](http://www.pivx.org/zpiv) and [zPoS](https://pivx.org/zpos/).
- light/mobile wallet privacy using the [Zerocoin Light Node Protocol](https://pivx.org/wp-content/uploads/2018/11/Zerocoin_Light_Node_Protocol.pdf)
- Fast transactions featuring guaranteed zero confirmation transactions, we call it _SwiftX_.
- Decentralized blockchain voting utilizing Masternode technology to form a DAO. The blockchain will distribute monthly treasury funds based on successful proposals submitted by the community and voted on by the DAO.

More information at [pivx.org](http://www.pivx.org) Visit our ANN thread at [BitcoinTalk](http://www.bitcointalk.org/index.php?topic=1262920). Join the community at [PIVX Discord](https://discordapp.com/invite/jzqVsJd).

### Coin Specs
<table>
<tr><td>Algo</td><td>Quark</td></tr>
<tr><td>Block Time</td><td>60 Seconds</td></tr>
<tr><td>Difficulty Retargeting</td><td>Every Block</td></tr>
<tr><td>Max Coin Supply (PoW Phase)</td><td>43,199,500 PIV</td></tr>
<tr><td>Max Coin Supply (PoS Phase)</td><td>Infinite</td></tr>
<tr><td>Premine</td><td>60,000 PIV*</td></tr>
</table>

*60,000 PIV Premine was burned in block [279917](http://www.presstab.pw/phpexplorer/PIVX/block.php?blockhash=206d9cfe859798a0b0898ab00d7300be94de0f5469bb446cecb41c3e173a57e0)

### Reward Distribution

<table>
<th colspan=4>Genesis Block</th>
<tr><th>Block Height</th><th>Reward Amount</th><th>Notes</th></tr>
<tr><td>1</td><td>60,000 PIV</td><td>Initial Pre-mine, burnt in block <a href="http://www.presstab.pw/phpexplorer/PIVX/block.php?blockhash=206d9cfe859798a0b0898ab00d7300be94de0f5469bb446cecb41c3e173a57e0">279917</a></td></tr>
</table>

### PoW Rewards Breakdown

<table>
<th>Block Height</th><th>Masternodes</th><th>Miner</th><th>Budget</th>
<tr><td>2-43200</td><td>20% (50 PIV)</td><td>80% (200 PIV)</td><td>N/A</td></tr>
<tr><td>43201-151200</td><td>20% (50 PIV)</td><td>70% (200 PIV)</td><td>10% (25 PIV)</td></tr>
<tr><td>151201-259200</td><td>45% (22.5 PIV)</td><td>45% (22.5 PIV)</td><td>10% (5 PIV)</td></tr>
</table>

### PoS Rewards Breakdown

<table>
<th>Phase</th><th>Block Height</th><th>Reward</th><th>Masternodes & Stakers</th><th>Budget</th>
<tr><td>Phase 0</td><td>259201-302399</td><td>50 PIV</td><td>90% (45 PIV)</td><td>10% (5 PIV)</td></tr>
<tr><td>Phase 1</td><td>302400-345599</td><td>45 PIV</td><td>90% (40.5 PIV)</td><td>10% (4.5 PIV)</td></tr>
<tr><td>Phase 2</td><td>345600-388799</td><td>40 PIV</td><td>90% (36 PIV)</td><td>10% (4 PIV)</td></tr>
<tr><td>Phase 3</td><td>388800-431999</td><td>35 PIV</td><td>90% (31.5 PIV)</td><td>10% (3.5 PIV)</td></tr>
<tr><td>Phase 4</td><td>432000-475199</td><td>30 PIV</td><td>90% (27 PIV)</td><td>10% (3 PIV)</td></tr>
<tr><td>Phase 5</td><td>475200-518399</td><td>25 PIV</td><td>90% (22.5 PIV)</td><td>10% (2.5 PIV)</td></tr>
<tr><td>Phase 6</td><td>518400-561599</td><td>20 PIV</td><td>90% (18 PIV)</td><td>10% (2 PIV)</td></tr>
<tr><td>Phase 7</td><td>561600-604799</td><td>15 PIV</td><td>90% (13.5 PIV)</td><td>10% (1.5 PIV)</td></tr>
<tr><td>Phase 8</td><td>604800-647999</td><td>10 PIV</td><td>90% (9 PIV)</td><td>10% (1 PIV)</td></tr>
<tr><td>Phase 9</td><td>648000-1154203</td><td>5 PIV</td><td>90% (4.5 PIV)</td><td>10% (0.5 PIV)</td></tr>
<tr><td>Phase X</td><td>1154203-∞</td><td>6 PIV</td><td>84% (5 PIV/zPIV)</td><td>16% (1 PIV)</td></tr>
</table>
[![master Actions Status](https://github.com/PIVX-Project/PIVX/workflows/CI%20Actions%20for%20PIVX/badge.svg)](https://github.com/PIVX-Project/PIVX/actions)
[![GitHub release (latest by date)](https://img.shields.io/github/v/release/PIVX-Project/pivx?color=%235c4b7d&cacheSeconds=3600)](https://github.com/PIVX-Project/PIVX/releases)
[![GitHub Release Date](https://img.shields.io/github/release-date/PIVX-Project/pivx?color=%235c4b7d&cacheSeconds=3600)](https://github.com/PIVX-Project/PIVX/releases)

## What is PIVX?

PIVX is an open source community-driven cryptocurrency, focused on five main aspects:

(1) User Data Protection: Through the use of SHIELD, a zk-SNARKs based privacy protocol.

(2) Low environmental footprint and network participation equality: Through the use of a highly developed Proof of Stake protocol.

(3) Decentralized Governance System: A DAO built on top of the tier two Masternodes network, enabling a monthly community treasury, proposals submission and decentralized voting.

(4) Fast Transactions: Through the use of fast block times and the tier two network, PIVX is committed to continue researching new and better instant transactions mechanisms.

(5) Ease of Use: PIVX is determined to offer the best possible graphical interface for a core node/wallet. A full featured graphical product for new and advanced users.

A lot more information and specs at [PIVX.org](https://www.pivx.org/). Join the community at [PIVX Discord](https://discordapp.com/invite/jzqVsJd).

## License
PIVX Core is released under the terms of the MIT license. See [COPYING](https://github.com/PIVX-Project/PIVX/blob/master/COPYING) for more information or see https://opensource.org/licenses/MIT.

## Development Process

The master branch is regularly built (see doc/build-*.md for instructions) and tested, but it is not guaranteed to be completely stable. [Tags](https://github.com/PIVX-Project/PIVX/tags) are created regularly from release branches to indicate new official, stable release versions of PIVX Core.

The contribution workflow is described in [CONTRIBUTING.md](https://github.com/PIVX-Project/PIVX/blob/master/CONTRIBUTING.md) and useful hints for developers can be found in [doc/developer-notes.md](https://github.com/PIVX-Project/PIVX/blob/master/doc/developer-notes.md).

## Testing

Testing and code review is the bottleneck for development; we get more pull requests than we can review and test on short notice. Please be patient and help out by testing other people's pull requests, and remember this is a security-critical project where any mistake might cost people a lot of money.

## Automated Testing

Developers are strongly encouraged to write [unit tests](https://github.com/PIVX-Project/PIVX/blob/master/src/test/README.md) for new code, and to submit new unit tests for old code. Unit tests can be compiled and run (assuming they weren't disabled in configure) with: make check. Further details on running and extending unit tests can be found in [/src/test/README.md](https://github.com/PIVX-Project/PIVX/blob/master/src/test/README.md).

There are also regression and integration tests, written in Python. These tests can be run (if the test dependencies are installed) with: test/functional/test_runner.py`

The CI (Continuous Integration) systems make sure that every pull request is built for Windows, Linux, and macOS, and that unit/sanity tests are run automatically.

## Manual Quality Assurance (QA) Testing

Changes should be tested by somebody other than the developer who wrote the code. This is especially important for large or high-risk changes. It is useful to add a test plan to the pull request description if testing the changes is not straightforward.

## Translations

Changes to translations as well as new translations can be submitted to PIVX Core's Transifex page.

Translations are periodically pulled from Transifex and merged into the git repository. See the [translation process](https://github.com/PIVX-Project/PIVX/blob/master/doc/translation_process.md) for details on how this works.

Important: We do not accept translation changes as GitHub pull requests because the next pull from Transifex would automatically overwrite them again.
7 changes: 7 additions & 0 deletions src/activemasternode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,13 @@ OperationResult initMasternode(const std::string& _strMasterNodePrivKey, const s
return errorOut(strprintf(_("Invalid -masternodeaddr address: %s"), strMasterNodeAddr));
}

// Peer port needs to match the masternode public one for IPv4 and IPv6.
// Onion can run in other ports because those are behind a hidden service which has the public port fixed to the default port.
if (nPort != GetListenPort() && !addrTest.IsTor()) {
return errorOut(strprintf(_("Invalid -masternodeaddr port %d, isn't the same as the peer port %d"),
nPort, GetListenPort()));
}

CKey key;
CPubKey pubkey;
if (!CMessageSigner::GetKeysFromSecret(_strMasterNodePrivKey, key, pubkey)) {
Expand Down
44 changes: 4 additions & 40 deletions src/budget/budgetmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -749,47 +749,11 @@ std::string CBudgetManager::GetRequiredPaymentsString(int nBlockHeight)

CAmount CBudgetManager::GetTotalBudget(int nHeight)
{
if (Params().NetworkID() == CBaseChainParams::TESTNET) {
CAmount nSubsidy = 500 * COIN;
return ((nSubsidy / 100) * 10) * 146;
}

//get block value and calculate from that
CAmount nSubsidy = 0;
const Consensus::Params& consensus = Params().GetConsensus();
const bool isPoSActive = consensus.NetworkUpgradeActive(nHeight, Consensus::UPGRADE_POS);
if (nHeight >= 151200 && !isPoSActive) {
nSubsidy = 50 * COIN;
} else if (isPoSActive && nHeight <= 302399) {
nSubsidy = 50 * COIN;
} else if (nHeight <= 345599 && nHeight >= 302400) {
nSubsidy = 45 * COIN;
} else if (nHeight <= 388799 && nHeight >= 345600) {
nSubsidy = 40 * COIN;
} else if (nHeight <= 431999 && nHeight >= 388800) {
nSubsidy = 35 * COIN;
} else if (nHeight <= 475199 && nHeight >= 432000) {
nSubsidy = 30 * COIN;
} else if (nHeight <= 518399 && nHeight >= 475200) {
nSubsidy = 25 * COIN;
} else if (nHeight <= 561599 && nHeight >= 518400) {
nSubsidy = 20 * COIN;
} else if (nHeight <= 604799 && nHeight >= 561600) {
nSubsidy = 15 * COIN;
} else if (nHeight <= 647999 && nHeight >= 604800) {
nSubsidy = 10 * COIN;
} else if (consensus.NetworkUpgradeActive(nHeight, Consensus::UPGRADE_ZC_V2)) {
nSubsidy = 10 * COIN;
} else {
nSubsidy = 5 * COIN;
}
// 20% of the block value
CAmount nSubsidy = GetBlockValue(nHeight) / 5;

// Amount of blocks in a months period of time (using 1 minutes per) = (60*24*30)
if (nHeight <= 172800) {
return 648000 * COIN;
} else {
return ((nSubsidy / 100) * 10) * 1440 * 30;
}
// multiplied by the number of blocks in a cycle (144 on testnet, 30*1440 on mainnet)
return nSubsidy * Params().GetConsensus().nBudgetCycleBlocks;
}

void CBudgetManager::AddSeenProposalVote(const CBudgetVote& vote)
Expand Down
24 changes: 16 additions & 8 deletions src/budget/budgetproposal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "masternodeman.h"

CBudgetProposal::CBudgetProposal():
nAllotted(0),
fValid(true),
strInvalid(""),
strProposalName("unknown"),
Expand All @@ -27,6 +28,7 @@ CBudgetProposal::CBudgetProposal(const std::string& name,
const CAmount& amount,
int blockstart,
const uint256& nfeetxhash):
nAllotted(0),
fValid(true),
strInvalid(""),
strProposalName(name),
Expand All @@ -38,14 +40,10 @@ CBudgetProposal::CBudgetProposal(const std::string& name,
nTime(0)
{
const int nBlocksPerCycle = Params().GetConsensus().nBudgetCycleBlocks;
// !todo: remove this when v5 rules are enforced (nBlockStart is always = to nCycleStart)
int nCycleStart = nBlockStart - nBlockStart % nBlocksPerCycle;

// Right now single payment proposals have nBlockEnd have a cycle too early!
// switch back if it break something else
// 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;

// Calculate the end of the cycle for this vote, vote will be deleted after next cycle
// calculate the expiration block
nBlockEnd = nCycleStart + (nBlocksPerCycle + 1) * paycount;
}

Expand Down Expand Up @@ -90,8 +88,13 @@ bool CBudgetProposal::IsHeavilyDownvoted(bool fNewRules)

bool CBudgetProposal::CheckStartEnd()
{
if (nBlockStart < 0) {
strInvalid = "Invalid Proposal";
// !TODO: remove (and always use new rules) when all proposals submitted before v5 enforcement are expired.
bool fNewRules = Params().GetConsensus().NetworkUpgradeActive(nBlockStart, Consensus::UPGRADE_V5_0);

if (nBlockStart < 0 ||
// block start must be a superblock
(fNewRules && (nBlockStart % Params().GetConsensus().nBudgetCycleBlocks) != 0)) {
strInvalid = "Invalid nBlockStart";
return false;
}

Expand All @@ -100,6 +103,11 @@ bool CBudgetProposal::CheckStartEnd()
return false;
}

if (fNewRules && GetTotalPaymentCount() > Params().GetConsensus().nMaxProposalPayments) {
strInvalid = "Invalid payment count";
return false;
}

return true;
}

Expand Down
6 changes: 3 additions & 3 deletions src/budget/budgetproposal.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ static const int64_t BUDGET_VOTE_UPDATE_MIN = 60 * 60;
class CBudgetProposal
{
private:
CAmount nAlloted;
CAmount nAllotted;
bool fValid;
std::string strInvalid;

Expand Down Expand Up @@ -87,8 +87,8 @@ class CBudgetProposal
int GetNays() const { return GetVoteCount(CBudgetVote::VOTE_NO); }
int GetAbstains() const { return GetVoteCount(CBudgetVote::VOTE_ABSTAIN); };
CAmount GetAmount() const { return nAmount; }
void SetAllotted(CAmount nAllotedIn) { nAlloted = nAllotedIn; }
CAmount GetAllotted() const { return nAlloted; }
void SetAllotted(CAmount nAllottedIn) { nAllotted = nAllottedIn; }
CAmount GetAllotted() const { return nAllotted; }

void CleanAndRemove();

Expand Down
2 changes: 2 additions & 0 deletions src/chainparams.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ class CMainParams : public CChainParams
consensus.nTargetTimespanV2 = 30 * 60;
consensus.nTargetSpacing = 1 * 60;
consensus.nTimeSlotLength = 15;
consensus.nMaxProposalPayments = 6;

// spork keys
consensus.strSporkPubKey = "0410050aa740d280b134b40b40658781fc1116ba7700764e0ce27af3e1737586b3257d19232e0cb5084947f5107e44bcd577f126c9eb4a30ea2807b271d2145298";
Expand Down Expand Up @@ -281,6 +282,7 @@ class CTestNetParams : public CMainParams
consensus.nTargetTimespanV2 = 30 * 60;
consensus.nTargetSpacing = 1 * 60;
consensus.nTimeSlotLength = 15;
consensus.nMaxProposalPayments = 20;

// spork keys
consensus.strSporkPubKey = "04677c34726c491117265f4b1c83cef085684f36c8df5a97a3a42fc499316d0c4e63959c9eca0dba239d9aaaf72011afffeb3ef9f51b9017811dec686e412eb504";
Expand Down
1 change: 1 addition & 0 deletions src/consensus/params.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ struct Params {
int64_t nTargetTimespanV2;
int64_t nTargetSpacing;
int nTimeSlotLength;
int nMaxProposalPayments;

// spork keys
std::string strSporkPubKey;
Expand Down
5 changes: 0 additions & 5 deletions src/init.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1035,11 +1035,6 @@ bool AppInit2()
// Exit early if -masternode=1 and -listen=0
if (gArgs.GetBoolArg("-masternode", DEFAULT_MASTERNODE) && !gArgs.GetBoolArg("-listen", DEFAULT_LISTEN))
return UIError(_("Error: -listen must be true if -masternode is set."));
// Exit early if -masternode=1 and -port is not the default port
if (gArgs.GetBoolArg("-masternode", DEFAULT_MASTERNODE) && (GetListenPort() != Params().GetDefaultPort() && !Params().IsRegTestNet()))
return UIError(strprintf(_("Error: Invalid port %d for running a masternode."), GetListenPort()) + "\n\n" +
strprintf(_("Masternodes are required to run on port %d for %s-net"), Params().GetDefaultPort(), Params().NetworkIDString()));

if (gArgs.GetBoolArg("-benchmark", false))
UIWarning(_("Warning: Unsupported argument -benchmark ignored, use -debug=bench."));

Expand Down
4 changes: 2 additions & 2 deletions src/interface/wallet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace interfaces {
WalletBalances Wallet::getBalances() {
WalletBalances result;
result.balance = m_wallet.GetAvailableBalance();
result.unconfirmed_balance = m_wallet.GetUnconfirmedBalance();
result.unconfirmed_balance = m_wallet.GetUnconfirmedBalance(ISMINE_SPENDABLE_TRANSPARENT);
result.immature_balance = m_wallet.GetImmatureBalance();
result.have_watch_only = m_wallet.HaveWatchOnly();
if (result.have_watch_only) {
Expand All @@ -26,4 +26,4 @@ namespace interfaces {
return result;
}

} // namespace interfaces
} // namespace interfaces
2 changes: 1 addition & 1 deletion src/policy/policy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ bool IsDust(const CTxOut& txout, const CFeeRate& dustRelayFee)

CAmount GetShieldedDustThreshold(const CFeeRate& dustRelayFee)
{
unsigned int K = DEFAULT_SHIELDEDTXFEE_K; // Fixed (1000) for now
unsigned int K = DEFAULT_SHIELDEDTXFEE_K; // Fixed (100) for now
return 3 * K * dustRelayFee.GetFee(SPENDDESCRIPTION_SIZE +
CTXOUT_REGULAR_SIZE +
BINDINGSIG_SIZE);
Expand Down
2 changes: 1 addition & 1 deletion src/qt/coincontroldialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -801,7 +801,7 @@ void CoinControlDialog::updateView()
// save COLUMN_CHECKBOX width for tree-mode
colCheckBoxWidth_treeMode = std::max(110, ui->treeWidget->columnWidth(COLUMN_CHECKBOX));
// minimize COLUMN_CHECKBOX width in list-mode (need to display only the check box)
ui->treeWidget->resizeColumnToContents(COLUMN_CHECKBOX);
ui->treeWidget->setColumnWidth(COLUMN_CHECKBOX, 70);
}

// sort view
Expand Down
1 change: 1 addition & 0 deletions src/qt/pivx/send.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ SendWidget::SendWidget(PIVXGUI* parent) :
// Shield coins
ui->btnShieldCoins->setTitleClassAndText("btn-title-grey", tr("Shield Coins"));
ui->btnShieldCoins->setSubTitleClassAndText("text-subtitle", tr("Convert all transparent coins into shielded coins"));
ui->btnShieldCoins->setVisible(false);

connect(ui->pushButtonFee, &QPushButton::clicked, this, &SendWidget::onChangeCustomFeeClicked);
connect(ui->btnCoinControl, &OptionButton::clicked, this, &SendWidget::onCoinControlClicked);
Expand Down
Loading

0 comments on commit 41c3b6f

Please sign in to comment.