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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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