From a8197c76c2e4079e645b8cbec2d6c2cfa0559772 Mon Sep 17 00:00:00 2001 From: Andrew LaChasse Date: Tue, 21 May 2019 16:27:03 -0700 Subject: [PATCH 01/10] Karmanodefy Budget System --- doc/Doxyfile | 2 +- doc/karmanode-budget.md | 24 +- doc/release-notes/release-notes-2.3.0.md | 6 +- doc/release-notes/release-notes-2.3.1.md | 34 +-- src/init.cpp | 2 +- src/karmanode-budget.cpp | 272 +++++++++++------------ src/karmanode-sync.cpp | 12 +- src/rpcclient.cpp | 8 +- src/rpckarmanode-budget.cpp | 34 +-- src/rpcmisc.cpp | 10 +- src/rpcserver.cpp | 10 +- src/rpcserver.h | 10 +- src/util.cpp | 2 +- 13 files changed, 213 insertions(+), 213 deletions(-) mode change 100755 => 100644 doc/Doxyfile diff --git a/doc/Doxyfile b/doc/Doxyfile old mode 100755 new mode 100644 index 5253d62..e871f7d --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -38,7 +38,7 @@ PROJECT_NAME = "Ohmcoin Core" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.3.3 +PROJECT_NUMBER = 1.6.1 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/doc/karmanode-budget.md b/doc/karmanode-budget.md index aea096e..34f9920 100644 --- a/doc/karmanode-budget.md +++ b/doc/karmanode-budget.md @@ -16,11 +16,11 @@ Budgets go through a series of stages before being paid: Prepare collateral transaction ------------------------ -mnbudget prepare \ \ \ \ \ \ [use_ix(true|false)] +knbudget prepare \ \ \ \ \ \ [use_ix(true|false)] Example: ``` -mnbudget prepare cool-project http://www.cool-project/one.json 12 100000 y6R9oN12KnB9zydzTLc3LikD9cCjjQzYG7 1200 true +knbudget prepare cool-project http://www.cool-project/one.json 12 100000 y6R9oN12KnB9zydzTLc3LikD9cCjjQzYG7 1200 true ``` Output: `464a0eb70ea91c94295214df48c47baa72b3876cfb658744aaf863c7b5bf1ff0` - This is the collateral hash, copy this output for the next step @@ -32,11 +32,11 @@ In this transaction we prepare collateral for "_cool-project_". This proposal wi Submit proposal to network ------------------------ -mnbudget submit \ \ \ \ \ \ \ +knbudget submit \ \ \ \ \ \ \ Example: ``` -mnbudget submit cool-project http://www.cool-project/one.json 12 100000 y6R9oN12KnB9zydzTLc3LikD9cCjjQzYG7 1200 464a0eb70ea91c94295214df48c47baa72b3876cfb658744aaf863c7b5bf1ff0 +knbudget submit cool-project http://www.cool-project/one.json 12 100000 y6R9oN12KnB9zydzTLc3LikD9cCjjQzYG7 1200 464a0eb70ea91c94295214df48c47baa72b3876cfb658744aaf863c7b5bf1ff0 ``` Output: `a2b29778ae82e45a973a94309ffa6aa2e2388b8f95b39ab3739f0078835f0491` - This is your proposal hash, which other nodes will use to vote on it @@ -46,11 +46,11 @@ Lobby for votes Double check your information: -mnbudget getinfo \ +knbudget getinfo \ Example: ``` -mnbudget getinfo cool-project +knbudget getinfo cool-project ``` Output: ``` @@ -77,11 +77,11 @@ Output: If everything looks correct, you can ask for votes from other karmanodes. To vote on a proposal, load a wallet with _karmanode.conf_ file. You do not need to access your cold wallet to vote for proposals. -mnbudget vote \ [yes|no] +knbudget vote \ [yes|no] Example: ``` -mnbudget vote a2b29778ae82e45a973a94309ffa6aa2e2388b8f95b39ab3739f0078835f0491 yes +knbudget vote a2b29778ae82e45a973a94309ffa6aa2e2388b8f95b39ab3739f0078835f0491 yes ``` Output: `Voted successfully` - Your vote has been submitted and accepted. @@ -89,11 +89,11 @@ Output: `Voted successfully` - Your vote has been submitted and accepted. Make it into the budget ------------------------ -After you get enough votes, execute `mnbudget projection` to see if you made it into the budget. If you the budget was finalized at this moment which proposals would be in it. Note: Proposals must be active at least 1 day on the network and receive 10% of the karmanode network in yes votes in order to qualify (E.g. if there is 2500 karmanodes, you will need 250 yes votes.) +After you get enough votes, execute `knbudget projection` to see if you made it into the budget. If you the budget was finalized at this moment which proposals would be in it. Note: Proposals must be active at least 1 day on the network and receive 10% of the karmanode network in yes votes in order to qualify (E.g. if there is 2500 karmanodes, you will need 250 yes votes.) Example: ``` -mnbudget projection +knbudget projection ``` Output: @@ -145,7 +145,7 @@ RPC Commands ------------------------ The following new RPC commands are supported: -- mnbudget "command"... ( "passphrase" ) +- knbudget "command"... ( "passphrase" ) * prepare - Prepare proposal for network by signing and creating tx * submit - Submit proposal for network * vote-many - Vote on a Ohmcoin initiative @@ -157,7 +157,7 @@ The following new RPC commands are supported: * projection - Show the projection of which proposals will be paid the next cycle * check - Scan proposals and remove invalid -- mnfinalbudget "command"... ( "passphrase" ) +- knfinalbudget "command"... ( "passphrase" ) * vote-many - Vote on a finalized budget * vote - Vote on a finalized budget * show - Show existing finalized budgets diff --git a/doc/release-notes/release-notes-2.3.0.md b/doc/release-notes/release-notes-2.3.0.md index 194263f..cd09fb7 100644 --- a/doc/release-notes/release-notes-2.3.0.md +++ b/doc/release-notes/release-notes-2.3.0.md @@ -101,11 +101,11 @@ For the `list` (aka `karmanodelist`) parameter, the various "modes" have been re ] ``` -#### mnbudget command +#### knbudget command -An additional parameter has been added to `mnbudget` to allow a controller wallet to issue per-MN votes. The new parameter is `vote-alias` and it's use format is as follows: +An additional parameter has been added to `knbudget` to allow a controller wallet to issue per-MN votes. The new parameter is `vote-alias` and it's use format is as follows: -`mnbudget vote-alias ` +`knbudget vote-alias ` All fields are required to successfully vote. diff --git a/doc/release-notes/release-notes-2.3.1.md b/doc/release-notes/release-notes-2.3.1.md index 59eae3e..fd31a15 100644 --- a/doc/release-notes/release-notes-2.3.1.md +++ b/doc/release-notes/release-notes-2.3.1.md @@ -56,17 +56,17 @@ RPC changes | `karmanode create` | | removed - not implemented | | `karmanode calcscore` | `listkarmanodescores` | | | --- | --- | --- | -| `mnbudget prepare` | `preparebudget` | see notes below | -| `mnbudget submit` | `submitbudget` | see notes below | -| `mnbudget vote-many` | `mnbudgetvote` | see notes below | -| `mnbudget vote-alias` | `mnbudgetvote` | see notes below | -| `mnbudget vote` | `mnbudgetvote` | see notes below | -| `mnbudget getvotes` | `getbudgetvotes` | | -| `mnbudget getinfo` | `getbudgetinfo` | see notes below | -| `mnbudget show` | `getbudgetinfo` | see notes below | -| `mnbudget projection` | `getbudgetprojection` | | -| `mnbudget check` | `checkbudgets` | | -| `mnbudget nextblock` | `getnextsuperblock` | | +| `knbudget prepare` | `preparebudget` | see notes below | +| `knbudget submit` | `submitbudget` | see notes below | +| `knbudget vote-many` | `knbudgetvote` | see notes below | +| `knbudget vote-alias` | `knbudgetvote` | see notes below | +| `knbudget vote` | `knbudgetvote` | see notes below | +| `knbudget getvotes` | `getbudgetvotes` | | +| `knbudget getinfo` | `getbudgetinfo` | see notes below | +| `knbudget show` | `getbudgetinfo` | see notes below | +| `knbudget projection` | `getbudgetprojection` | | +| `knbudget check` | `checkbudgets` | | +| `knbudget nextblock` | `getnextsuperblock` | | ##### `startkarmanode` Command ##### This command now handles all cases for starting a karmanode instead of having multiple commands based on the context. Command arguments have changed slightly to allow the user to decide wither or not to re-lock the wallet after the command is run. Below is the help documentation: @@ -105,11 +105,11 @@ Examples: ##### `preparebudget` & `submitbudget` Commands ##### Due to the requirement of maintaining backwards compatibility with the legacy command, these two new commands are created to handle the preparation/submission of budget proposals. Future intention is to roll these two commands back into a single command to reduce code-duplication. Paramater arguments currently remain unchanged from the legacy command equivilent. -##### `mnbudgetvote` Command ##### -This command now handles all cases for submitting MN votes on a budget proposal. Backwards compatibility with the legacy command(s) has been retained, with the exception of the `vote-alias` case due to a conflict in paramater type casting. A user running `mnbudget vote-alias` will be instructed to instead use the new `mnvote` command. Below is the full help documentation for this new command: +##### `knbudgetvote` Command ##### +This command now handles all cases for submitting MN votes on a budget proposal. Backwards compatibility with the legacy command(s) has been retained, with the exception of the `vote-alias` case due to a conflict in paramater type casting. A user running `knbudget vote-alias` will be instructed to instead use the new `mnvote` command. Below is the full help documentation for this new command: ``` -mnbudgetvote "local|many|alias" "votehash" "yes|no" ( "alias" ) +knbudgetvote "local|many|alias" "votehash" "yes|no" ( "alias" ) Vote on a budget proposal @@ -133,12 +133,12 @@ Result: } Examples: -> pivx-cli mnbudgetvote "local" "ed2f83cedee59a91406f5f47ec4d60bf5a7f9ee6293913c82976bd2d3a658041" "yes" -> curl --user myusername --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "mnbudgetvote", "params": ["local" "ed2f83cedee59a91406f5f47ec4d60bf5a7f9ee6293913c82976bd2d3a658041" "yes"] }' -H 'content-type: text/plain;' http://127.0.0.1:51473/ +> pivx-cli knbudgetvote "local" "ed2f83cedee59a91406f5f47ec4d60bf5a7f9ee6293913c82976bd2d3a658041" "yes" +> curl --user myusername --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "knbudgetvote", "params": ["local" "ed2f83cedee59a91406f5f47ec4d60bf5a7f9ee6293913c82976bd2d3a658041" "yes"] }' -H 'content-type: text/plain;' http://127.0.0.1:51473/ ``` ##### `getbudgetinfo` Command ##### -This command now combines the old `mnbudget show` and `mnbudget getinfo` commands to reduce code duplication while still maintaining backwards compatibility with the legacy commands. Given no parameters, it returns the full list of budget proposals (`mnbudget show`). A single optional parameter allows to return information on just that proposal (`mnbudget getinfo`). Below is the full help documentation: +This command now combines the old `knbudget show` and `knbudget getinfo` commands to reduce code duplication while still maintaining backwards compatibility with the legacy commands. Given no parameters, it returns the full list of budget proposals (`knbudget show`). A single optional parameter allows to return information on just that proposal (`knbudget getinfo`). Below is the full help documentation: ``` getbudgetinfo ( "proposal" ) diff --git a/src/init.cpp b/src/init.cpp index 52a7c68..1967de0 100755 --- a/src/init.cpp +++ b/src/init.cpp @@ -481,7 +481,7 @@ std::string HelpMessage(HelpMessageMode mode) strUsage += HelpMessageOpt("-stopafterblockimport", strprintf(_("Stop running after importing blocks from disk (default: %u)"), 0)); strUsage += HelpMessageOpt("-sporkkey=", _("Enable spork administration functionality with the appropriate private key.")); } - string debugCategories = "addrman, alert, bench, coindb, db, lock, rand, rpc, selectcoins, tor, mempool, net, proxy, http, libevent, ohmcoin, (obfuscation, swiftx, karmanode, mnpayments, mnbudget, zero)"; // Don't translate these and qt below + string debugCategories = "addrman, alert, bench, coindb, db, lock, rand, rpc, selectcoins, tor, mempool, net, proxy, http, libevent, ohmcoin, (obfuscation, swiftx, karmanode, mnpayments, knbudget, zero)"; // Don't translate these and qt below if (mode == HMM_BITCOIN_QT) debugCategories += ", qt"; strUsage += HelpMessageOpt("-debug=", strprintf(_("Output debugging information (default: %u, supplying is optional)"), 0) + ". " + diff --git a/src/karmanode-budget.cpp b/src/karmanode-budget.cpp index 36c4f77..2b1a3f7 100755 --- a/src/karmanode-budget.cpp +++ b/src/karmanode-budget.cpp @@ -49,7 +49,7 @@ bool IsBudgetCollateralValid(uint256 nTxCollateralHash, uint256 nExpectedHash, s uint256 nBlockHash; if (!GetTransaction(nTxCollateralHash, txCollateral, nBlockHash, true)) { strError = strprintf("Can't find collateral tx %s", txCollateral.ToString()); - LogPrint("mnbudget","CBudgetProposalBroadcast::IsBudgetCollateralValid - %s\n", strError); + LogPrint("knbudget","CBudgetProposalBroadcast::IsBudgetCollateralValid - %s\n", strError); return false; } @@ -63,16 +63,16 @@ bool IsBudgetCollateralValid(uint256 nTxCollateralHash, uint256 nExpectedHash, s BOOST_FOREACH (const CTxOut o, txCollateral.vout) { if (!o.scriptPubKey.IsNormalPaymentScript() && !o.scriptPubKey.IsUnspendable()) { strError = strprintf("Invalid Script %s", txCollateral.ToString()); - LogPrint("mnbudget","CBudgetProposalBroadcast::IsBudgetCollateralValid - %s\n", strError); + LogPrint("knbudget","CBudgetProposalBroadcast::IsBudgetCollateralValid - %s\n", strError); return false; } if (fBudgetFinalization) { // Collateral for budget finalization // Note: there are still old valid budgets out there, but the check for the new 25 OHMC finalization collateral // will also cover the old 50 OHMC finalization collateral. - LogPrint("mnbudget", "Final Budget: o.scriptPubKey(%s) == findScript(%s) ?\n", o.scriptPubKey.ToString(), findScript.ToString()); + LogPrint("knbudget", "Final Budget: o.scriptPubKey(%s) == findScript(%s) ?\n", o.scriptPubKey.ToString(), findScript.ToString()); if (o.scriptPubKey == findScript) { - LogPrint("mnbudget", "Final Budget: o.nValue(%ld) >= BUDGET_FEE_TX(%ld) ?\n", o.nValue, GetBudgetSystemCollateralAmount(chainActive.Height())); + LogPrint("knbudget", "Final Budget: o.nValue(%ld) >= BUDGET_FEE_TX(%ld) ?\n", o.nValue, GetBudgetSystemCollateralAmount(chainActive.Height())); if(o.nValue >= GetBudgetSystemCollateralAmount(chainActive.Height())) { foundOpReturn = true; } @@ -80,9 +80,9 @@ bool IsBudgetCollateralValid(uint256 nTxCollateralHash, uint256 nExpectedHash, s } else { // Collateral for normal budget proposal - LogPrint("mnbudget", "Normal Budget: o.scriptPubKey(%s) == findScript(%s) ?\n", o.scriptPubKey.ToString(), findScript.ToString()); + LogPrint("knbudget", "Normal Budget: o.scriptPubKey(%s) == findScript(%s) ?\n", o.scriptPubKey.ToString(), findScript.ToString()); if (o.scriptPubKey == findScript) { - LogPrint("mnbudget", "Normal Budget: o.nValue(%ld) >= PROPOSAL_FEE_TX(%ld) ?\n", o.nValue, GetBudgetSystemCollateralAmount(chainActive.Height())); + LogPrint("knbudget", "Normal Budget: o.nValue(%ld) >= PROPOSAL_FEE_TX(%ld) ?\n", o.nValue, GetBudgetSystemCollateralAmount(chainActive.Height())); if(o.nValue >= GetBudgetSystemCollateralAmount(chainActive.Height())) { foundOpReturn = true; } @@ -91,7 +91,7 @@ bool IsBudgetCollateralValid(uint256 nTxCollateralHash, uint256 nExpectedHash, s } if (!foundOpReturn) { strError = strprintf("Couldn't find opReturn %s in %s", nExpectedHash.ToString(), txCollateral.ToString()); - LogPrint("mnbudget","CBudgetProposalBroadcast::IsBudgetCollateralValid - %s\n", strError); + LogPrint("knbudget","CBudgetProposalBroadcast::IsBudgetCollateralValid - %s\n", strError); return false; } @@ -120,7 +120,7 @@ bool IsBudgetCollateralValid(uint256 nTxCollateralHash, uint256 nExpectedHash, s return true; } else { strError = strprintf("Collateral requires at least %d confirmations - %d confirmations", Params().BudgetFeeConfirmations(), conf); - LogPrint("mnbudget","CBudgetProposalBroadcast::IsBudgetCollateralValid - %s - %d confirmations\n", strError, conf); + LogPrint("knbudget","CBudgetProposalBroadcast::IsBudgetCollateralValid - %s - %d confirmations\n", strError, conf); return false; } } @@ -134,7 +134,7 @@ void CBudgetManager::CheckOrphanVotes() std::map::iterator it1 = mapOrphanKarmanodeBudgetVotes.begin(); while (it1 != mapOrphanKarmanodeBudgetVotes.end()) { if (budget.UpdateProposal(((*it1).second), NULL, strError)) { - LogPrint("mnbudget","CBudgetManager::CheckOrphanVotes - Proposal/Budget is known, activating and removing orphan vote\n"); + LogPrint("knbudget","CBudgetManager::CheckOrphanVotes - Proposal/Budget is known, activating and removing orphan vote\n"); mapOrphanKarmanodeBudgetVotes.erase(it1++); } else { ++it1; @@ -143,13 +143,13 @@ void CBudgetManager::CheckOrphanVotes() std::map::iterator it2 = mapOrphanFinalizedBudgetVotes.begin(); while (it2 != mapOrphanFinalizedBudgetVotes.end()) { if (budget.UpdateFinalizedBudget(((*it2).second), NULL, strError)) { - LogPrint("mnbudget","CBudgetManager::CheckOrphanVotes - Proposal/Budget is known, activating and removing orphan vote\n"); + LogPrint("knbudget","CBudgetManager::CheckOrphanVotes - Proposal/Budget is known, activating and removing orphan vote\n"); mapOrphanFinalizedBudgetVotes.erase(it2++); } else { ++it2; } } - LogPrint("mnbudget","CBudgetManager::CheckOrphanVotes - Done\n"); + LogPrint("knbudget","CBudgetManager::CheckOrphanVotes - Done\n"); } void CBudgetManager::SubmitFinalBudget() @@ -166,7 +166,7 @@ void CBudgetManager::SubmitFinalBudget() int nBlockStart = nCurrentHeight - nCurrentHeight % GetBudgetPaymentCycleBlocks() + GetBudgetPaymentCycleBlocks(); if (nSubmittedHeight >= nBlockStart){ - LogPrint("mnbudget","CBudgetManager::SubmitFinalBudget - nSubmittedHeight(=%ld) < nBlockStart(=%ld) condition not fulfilled.\n", nSubmittedHeight, nBlockStart); + LogPrint("knbudget","CBudgetManager::SubmitFinalBudget - nSubmittedHeight(=%ld) < nBlockStart(=%ld) condition not fulfilled.\n", nSubmittedHeight, nBlockStart); return; } @@ -184,8 +184,8 @@ void CBudgetManager::SubmitFinalBudget() int nOffsetToStart = nFinalizationStart - nCurrentHeight; if (nBlockStart - nCurrentHeight > finalizationWindow){ - LogPrint("mnbudget","CBudgetManager::SubmitFinalBudget - Too early for finalization. Current block is %ld, next Superblock is %ld.\n", nCurrentHeight, nBlockStart); - LogPrint("mnbudget","CBudgetManager::SubmitFinalBudget - First possible block for finalization: %ld. Last possible block for finalization: %ld. You have to wait for %ld block(s) until Budget finalization will be possible\n", nFinalizationStart, nBlockStart, nOffsetToStart); + LogPrint("knbudget","CBudgetManager::SubmitFinalBudget - Too early for finalization. Current block is %ld, next Superblock is %ld.\n", nCurrentHeight, nBlockStart); + LogPrint("knbudget","CBudgetManager::SubmitFinalBudget - First possible block for finalization: %ld. Last possible block for finalization: %ld. You have to wait for %ld block(s) until Budget finalization will be possible\n", nFinalizationStart, nBlockStart, nOffsetToStart); return; } @@ -203,13 +203,13 @@ void CBudgetManager::SubmitFinalBudget() } if (vecTxBudgetPayments.size() < 1) { - LogPrint("mnbudget","CBudgetManager::SubmitFinalBudget - Found No Proposals For Period\n"); + LogPrint("knbudget","CBudgetManager::SubmitFinalBudget - Found No Proposals For Period\n"); return; } CFinalizedBudgetBroadcast tempBudget(strBudgetName, nBlockStart, vecTxBudgetPayments, 0); if (mapSeenFinalizedBudgets.count(tempBudget.GetHash())) { - LogPrint("mnbudget","CBudgetManager::SubmitFinalBudget - Budget already exists - %s\n", tempBudget.GetHash().ToString()); + LogPrint("knbudget","CBudgetManager::SubmitFinalBudget - Budget already exists - %s\n", tempBudget.GetHash().ToString()); nSubmittedHeight = nCurrentHeight; return; //already exists } @@ -221,7 +221,7 @@ void CBudgetManager::SubmitFinalBudget() if (!mapCollateralTxids.count(tempBudget.GetHash())) { CWalletTx wtx; if (!pwalletMain->GetBudgetSystemCollateralTX(wtx, tempBudget.GetHash(), false)) { - LogPrint("mnbudget","CBudgetManager::SubmitFinalBudget - Can't make collateral transaction\n"); + LogPrint("knbudget","CBudgetManager::SubmitFinalBudget - Can't make collateral transaction\n"); return; } @@ -241,7 +241,7 @@ void CBudgetManager::SubmitFinalBudget() uint256 nBlockHash; if (!GetTransaction(txidCollateral, txCollateral, nBlockHash, true)) { - LogPrint("mnbudget","CBudgetManager::SubmitFinalBudget - Can't find collateral tx %s", txidCollateral.ToString()); + LogPrint("knbudget","CBudgetManager::SubmitFinalBudget - Can't find collateral tx %s", txidCollateral.ToString()); return; } @@ -260,7 +260,7 @@ void CBudgetManager::SubmitFinalBudget() -- This function is tied to NewBlock, so we will propagate this budget while the block is also propagating */ if (conf < Params().BudgetFeeConfirmations() + 1) { - LogPrint("mnbudget","CBudgetManager::SubmitFinalBudget - Collateral requires at least %d confirmations - %s - %d confirmations\n", Params().BudgetFeeConfirmations() + 1, txidCollateral.ToString(), conf); + LogPrint("knbudget","CBudgetManager::SubmitFinalBudget - Collateral requires at least %d confirmations - %s - %d confirmations\n", Params().BudgetFeeConfirmations() + 1, txidCollateral.ToString(), conf); return; } @@ -269,7 +269,7 @@ void CBudgetManager::SubmitFinalBudget() std::string strError = ""; if (!finalizedBudgetBroadcast.IsValid(strError)) { - LogPrint("mnbudget","CBudgetManager::SubmitFinalBudget - Invalid finalized budget - %s \n", strError); + LogPrint("knbudget","CBudgetManager::SubmitFinalBudget - Invalid finalized budget - %s \n", strError); return; } @@ -278,7 +278,7 @@ void CBudgetManager::SubmitFinalBudget() finalizedBudgetBroadcast.Relay(); budget.AddFinalizedBudget(finalizedBudgetBroadcast); nSubmittedHeight = nCurrentHeight; - LogPrint("mnbudget","CBudgetManager::SubmitFinalBudget - Done! %s\n", finalizedBudgetBroadcast.GetHash().ToString()); + LogPrint("knbudget","CBudgetManager::SubmitFinalBudget - Done! %s\n", finalizedBudgetBroadcast.GetHash().ToString()); } // @@ -319,7 +319,7 @@ bool CBudgetDB::Write(const CBudgetManager& objToSave) } fileout.fclose(); - LogPrint("mnbudget","Written info to budget.dat %dms\n", GetTimeMillis() - nStart); + LogPrint("knbudget","Written info to budget.dat %dms\n", GetTimeMillis() - nStart); return true; } @@ -397,13 +397,13 @@ CBudgetDB::ReadResult CBudgetDB::Read(CBudgetManager& objToLoad, bool fDryRun) return IncorrectFormat; } - LogPrint("mnbudget","Loaded info from budget.dat %dms\n", GetTimeMillis() - nStart); - LogPrint("mnbudget"," %s\n", objToLoad.ToString()); + LogPrint("knbudget","Loaded info from budget.dat %dms\n", GetTimeMillis() - nStart); + LogPrint("knbudget"," %s\n", objToLoad.ToString()); if (!fDryRun) { - LogPrint("mnbudget","Budget manager - cleaning....\n"); + LogPrint("knbudget","Budget manager - cleaning....\n"); objToLoad.CheckAndRemove(); - LogPrint("mnbudget","Budget manager - result:\n"); - LogPrint("mnbudget"," %s\n", objToLoad.ToString()); + LogPrint("knbudget","Budget manager - result:\n"); + LogPrint("knbudget"," %s\n", objToLoad.ToString()); } return Ok; @@ -416,24 +416,24 @@ void DumpBudgets() CBudgetDB budgetdb; CBudgetManager tempBudget; - LogPrint("mnbudget","Verifying budget.dat format...\n"); + LogPrint("knbudget","Verifying budget.dat format...\n"); CBudgetDB::ReadResult readResult = budgetdb.Read(tempBudget, true); // there was an error and it was not an error on file opening => do not proceed if (readResult == CBudgetDB::FileError) - LogPrint("mnbudget","Missing budgets file - budget.dat, will try to recreate\n"); + LogPrint("knbudget","Missing budgets file - budget.dat, will try to recreate\n"); else if (readResult != CBudgetDB::Ok) { - LogPrint("mnbudget","Error reading budget.dat: "); + LogPrint("knbudget","Error reading budget.dat: "); if (readResult == CBudgetDB::IncorrectFormat) - LogPrint("mnbudget","magic is ok but data has invalid format, will try to recreate\n"); + LogPrint("knbudget","magic is ok but data has invalid format, will try to recreate\n"); else { - LogPrint("mnbudget","file format is unknown or invalid, please fix it manually\n"); + LogPrint("knbudget","file format is unknown or invalid, please fix it manually\n"); return; } } - LogPrint("mnbudget","Writting info to budget.dat...\n"); + LogPrint("knbudget","Writting info to budget.dat...\n"); budgetdb.Write(budget); - LogPrint("mnbudget","Budget dump finished %dms\n", GetTimeMillis() - nStart); + LogPrint("knbudget","Budget dump finished %dms\n", GetTimeMillis() - nStart); } bool CBudgetManager::AddFinalizedBudget(CFinalizedBudget& finalizedBudget) @@ -454,7 +454,7 @@ bool CBudgetManager::AddProposal(CBudgetProposal& budgetProposal) LOCK(cs); std::string strError = ""; if (!budgetProposal.IsValid(strError)) { - LogPrint("mnbudget","CBudgetManager::AddProposal - invalid budget proposal - %s\n", strError); + LogPrint("knbudget","CBudgetManager::AddProposal - invalid budget proposal - %s\n", strError); return false; } @@ -463,7 +463,7 @@ bool CBudgetManager::AddProposal(CBudgetProposal& budgetProposal) } mapProposals.insert(make_pair(budgetProposal.GetHash(), budgetProposal)); - LogPrint("mnbudget","CBudgetManager::AddProposal - proposal %s added\n", budgetProposal.GetName ().c_str ()); + LogPrint("knbudget","CBudgetManager::AddProposal - proposal %s added\n", budgetProposal.GetName ().c_str ()); return true; } @@ -482,24 +482,24 @@ void CBudgetManager::CheckAndRemove() } } - LogPrint("mnbudget", "CBudgetManager::CheckAndRemove at Height=%d\n", nHeight); + LogPrint("knbudget", "CBudgetManager::CheckAndRemove at Height=%d\n", nHeight); map tmpMapFinalizedBudgets; map tmpMapProposals; std::string strError = ""; - LogPrint("mnbudget", "CBudgetManager::CheckAndRemove - mapFinalizedBudgets cleanup - size before: %d\n", mapFinalizedBudgets.size()); + LogPrint("knbudget", "CBudgetManager::CheckAndRemove - mapFinalizedBudgets cleanup - size before: %d\n", mapFinalizedBudgets.size()); std::map::iterator it = mapFinalizedBudgets.begin(); while (it != mapFinalizedBudgets.end()) { CFinalizedBudget* pfinalizedBudget = &((*it).second); pfinalizedBudget->fValid = pfinalizedBudget->IsValid(strError); if (!strError.empty ()) { - LogPrint("mnbudget","CBudgetManager::CheckAndRemove - Invalid finalized budget: %s\n", strError); + LogPrint("knbudget","CBudgetManager::CheckAndRemove - Invalid finalized budget: %s\n", strError); } else { - LogPrint("mnbudget","CBudgetManager::CheckAndRemove - Found valid finalized budget: %s %s\n", + LogPrint("knbudget","CBudgetManager::CheckAndRemove - Found valid finalized budget: %s %s\n", pfinalizedBudget->strBudgetName.c_str(), pfinalizedBudget->nFeeTXHash.ToString().c_str()); } @@ -511,17 +511,17 @@ void CBudgetManager::CheckAndRemove() ++it; } - LogPrint("mnbudget", "CBudgetManager::CheckAndRemove - mapProposals cleanup - size before: %d\n", mapProposals.size()); + LogPrint("knbudget", "CBudgetManager::CheckAndRemove - mapProposals cleanup - size before: %d\n", mapProposals.size()); std::map::iterator it2 = mapProposals.begin(); while (it2 != mapProposals.end()) { CBudgetProposal* pbudgetProposal = &((*it2).second); pbudgetProposal->fValid = pbudgetProposal->IsValid(strError); if (!strError.empty ()) { - LogPrint("mnbudget","CBudgetManager::CheckAndRemove - Invalid budget proposal - %s\n", strError); + LogPrint("knbudget","CBudgetManager::CheckAndRemove - Invalid budget proposal - %s\n", strError); strError = ""; } else { - LogPrint("mnbudget","CBudgetManager::CheckAndRemove - Found valid budget proposal: %s %s\n", + LogPrint("knbudget","CBudgetManager::CheckAndRemove - Found valid budget proposal: %s %s\n", pbudgetProposal->strProposalName.c_str(), pbudgetProposal->nFeeTXHash.ToString().c_str()); } if (pbudgetProposal->fValid) { @@ -534,9 +534,9 @@ void CBudgetManager::CheckAndRemove() mapFinalizedBudgets.swap(tmpMapFinalizedBudgets); mapProposals.swap(tmpMapProposals); - LogPrint("mnbudget", "CBudgetManager::CheckAndRemove - mapFinalizedBudgets cleanup - size after: %d\n", mapFinalizedBudgets.size()); - LogPrint("mnbudget", "CBudgetManager::CheckAndRemove - mapProposals cleanup - size after: %d\n", mapProposals.size()); - LogPrint("mnbudget","CBudgetManager::CheckAndRemove - PASSED\n"); + LogPrint("knbudget", "CBudgetManager::CheckAndRemove - mapFinalizedBudgets cleanup - size after: %d\n", mapFinalizedBudgets.size()); + LogPrint("knbudget", "CBudgetManager::CheckAndRemove - mapProposals cleanup - size after: %d\n", mapProposals.size()); + LogPrint("knbudget","CBudgetManager::CheckAndRemove - PASSED\n"); } @@ -577,10 +577,10 @@ void CBudgetManager::FillBlockPayee(CMutableTransaction& txNew, CAmount nFees, b CTxDestination address1; ExtractDestination(payee, address1); - LogPrint("mnbudget","CBudgetManager::FillBlockPayee - Budget payment to %s for %lld, nHighestCount = %d\n", EncodeDestination(address1), nAmount, nHighestCount); + LogPrint("knbudget","CBudgetManager::FillBlockPayee - Budget payment to %s for %lld, nHighestCount = %d\n", EncodeDestination(address1), nAmount, nHighestCount); } else { - LogPrint("mnbudget","CBudgetManager::FillBlockPayee - No Budget payment, nHighestCount = %d\n", nHighestCount); + LogPrint("knbudget","CBudgetManager::FillBlockPayee - No Budget payment, nHighestCount = %d\n", nHighestCount); } } else { //miners get the full amount on these blocks @@ -596,7 +596,7 @@ void CBudgetManager::FillBlockPayee(CMutableTransaction& txNew, CAmount nFees, b CTxDestination address1; ExtractDestination(payee, address1); - LogPrint("mnbudget","CBudgetManager::FillBlockPayee - Budget payment to %s for %lld\n", EncodeDestination(address1), nAmount); + LogPrint("knbudget","CBudgetManager::FillBlockPayee - Budget payment to %s for %lld\n", EncodeDestination(address1), nAmount); } } } @@ -657,7 +657,7 @@ bool CBudgetManager::IsBudgetPaymentBlock(int nBlockHeight) ++it; } - LogPrint("mnbudget","CBudgetManager::IsBudgetPaymentBlock() - nHighestCount: %lli, 5%% of Karmanodes: %lli. Number of budgets: %lli\n", + LogPrint("knbudget","CBudgetManager::IsBudgetPaymentBlock() - nHighestCount: %lli, 5%% of Karmanodes: %lli. Number of budgets: %lli\n", nHighestCount, nFivePercent, mapFinalizedBudgets.size()); // If budget doesn't have 5% of the network votes, then we should pay a karmanode instead @@ -691,7 +691,7 @@ TrxValidationStatus CBudgetManager::IsTransactionValid(const CTransaction& txNew ++it; } - LogPrint("mnbudget","CBudgetManager::IsTransactionValid() - nHighestCount: %lli, 5%% of Karmanodes: %lli mapFinalizedBudgets.size(): %ld\n", + LogPrint("knbudget","CBudgetManager::IsTransactionValid() - nHighestCount: %lli, 5%% of Karmanodes: %lli mapFinalizedBudgets.size(): %ld\n", nHighestCount, nFivePercent, mapFinalizedBudgets.size()); /* If budget doesn't have 5% of the network votes, then we should pay a karmanode instead @@ -708,23 +708,23 @@ TrxValidationStatus CBudgetManager::IsTransactionValid(const CTransaction& txNew CFinalizedBudget* pfinalizedBudget = &((*it).second); strProposals = pfinalizedBudget->GetProposals(); - LogPrint("mnbudget","CBudgetManager::IsTransactionValid - checking budget (%s) with blockstart %lli, blockend %lli, nBlockHeight %lli, votes %lli, nCountThreshold %lli\n", + LogPrint("knbudget","CBudgetManager::IsTransactionValid - checking budget (%s) with blockstart %lli, blockend %lli, nBlockHeight %lli, votes %lli, nCountThreshold %lli\n", strProposals.c_str(), pfinalizedBudget->GetBlockStart(), pfinalizedBudget->GetBlockEnd(), nBlockHeight, pfinalizedBudget->GetVoteCount(), nCountThreshold); if (pfinalizedBudget->GetVoteCount() > nCountThreshold) { fThreshold = true; if (nBlockHeight >= pfinalizedBudget->GetBlockStart() && nBlockHeight <= pfinalizedBudget->GetBlockEnd()) { - LogPrint("mnbudget","CBudgetManager::IsTransactionValid - GetBlockStart() passed\n"); + LogPrint("knbudget","CBudgetManager::IsTransactionValid - GetBlockStart() passed\n"); transactionStatus = pfinalizedBudget->IsTransactionValid(txNew, nBlockHeight); if (transactionStatus == TrxValidationStatus::Valid) { - LogPrint("mnbudget","CBudgetManager::IsTransactionValid - pfinalizedBudget->IsTransactionValid() passed\n"); + LogPrint("knbudget","CBudgetManager::IsTransactionValid - pfinalizedBudget->IsTransactionValid() passed\n"); return TrxValidationStatus::Valid; } else { - LogPrint("mnbudget","CBudgetManager::IsTransactionValid - pfinalizedBudget->IsTransactionValid() error\n"); + LogPrint("knbudget","CBudgetManager::IsTransactionValid - pfinalizedBudget->IsTransactionValid() error\n"); } } else { - LogPrint("mnbudget","CBudgetManager::IsTransactionValid - GetBlockStart() failed, budget is outside current payment cycle and will be ignored.\n"); + LogPrint("knbudget","CBudgetManager::IsTransactionValid - GetBlockStart() failed, budget is outside current payment cycle and will be ignored.\n"); } } ++it; @@ -805,14 +805,14 @@ std::vector CBudgetManager::GetBudget() while (it2 != vBudgetPorposalsSort.end()) { CBudgetProposal* pbudgetProposal = (*it2).first; - LogPrint("mnbudget","CBudgetManager::GetBudget() - Processing Budget %s\n", pbudgetProposal->strProposalName.c_str()); + LogPrint("knbudget","CBudgetManager::GetBudget() - Processing Budget %s\n", pbudgetProposal->strProposalName.c_str()); //prop start/end should be inside this period if (pbudgetProposal->fValid && pbudgetProposal->nBlockStart <= nBlockStart && pbudgetProposal->nBlockEnd >= nBlockEnd && pbudgetProposal->GetYeas() - pbudgetProposal->GetNays() > mnodeman.CountEnabled(ActiveProtocol()) / 10 && pbudgetProposal->IsEstablished()) { - LogPrint("mnbudget","CBudgetManager::GetBudget() - Check 1 passed: valid=%d | %ld <= %ld | %ld >= %ld | Yeas=%d Nays=%d Count=%d | established=%d\n", + LogPrint("knbudget","CBudgetManager::GetBudget() - Check 1 passed: valid=%d | %ld <= %ld | %ld >= %ld | Yeas=%d Nays=%d Count=%d | established=%d\n", pbudgetProposal->fValid, pbudgetProposal->nBlockStart, nBlockStart, pbudgetProposal->nBlockEnd, nBlockEnd, pbudgetProposal->GetYeas(), pbudgetProposal->GetNays(), mnodeman.CountEnabled(ActiveProtocol()) / 10, pbudgetProposal->IsEstablished()); @@ -821,14 +821,14 @@ std::vector CBudgetManager::GetBudget() pbudgetProposal->SetAllotted(pbudgetProposal->GetAmount()); nBudgetAllocated += pbudgetProposal->GetAmount(); vBudgetProposalsRet.push_back(pbudgetProposal); - LogPrint("mnbudget","CBudgetManager::GetBudget() - Check 2 passed: Budget added\n"); + LogPrint("knbudget","CBudgetManager::GetBudget() - Check 2 passed: Budget added\n"); } else { pbudgetProposal->SetAllotted(0); - LogPrint("mnbudget","CBudgetManager::GetBudget() - Check 2 failed: no amount allotted\n"); + LogPrint("knbudget","CBudgetManager::GetBudget() - Check 2 failed: no amount allotted\n"); } } else { - LogPrint("mnbudget","CBudgetManager::GetBudget() - Check 1 failed: valid=%d | %ld <= %ld | %ld >= %ld | Yeas=%d Nays=%d Count=%d | established=%d\n", + LogPrint("knbudget","CBudgetManager::GetBudget() - Check 1 failed: valid=%d | %ld <= %ld | %ld >= %ld | Yeas=%d Nays=%d Count=%d | established=%d\n", pbudgetProposal->fValid, pbudgetProposal->nBlockStart, nBlockStart, pbudgetProposal->nBlockEnd, nBlockEnd, pbudgetProposal->GetYeas(), pbudgetProposal->GetNays(), mnodeman.CountEnabled(ActiveProtocol()) / 10, pbudgetProposal->IsEstablished()); @@ -895,7 +895,7 @@ std::string CBudgetManager::GetRequiredPaymentsString(int nBlockHeight) ret += payment.nProposalHash.ToString(); } } else { - LogPrint("mnbudget","CBudgetManager::GetRequiredPaymentsString - Couldn't find budget payment for block %d\n", nBlockHeight); + LogPrint("knbudget","CBudgetManager::GetRequiredPaymentsString - Couldn't find budget payment for block %d\n", nBlockHeight); } } @@ -964,7 +964,7 @@ void CBudgetManager::NewBlock() // incremental sync with our peers if (karmanodeSync.IsSynced()) { - LogPrint("mnbudget","CBudgetManager::NewBlock - incremental sync started\n"); + LogPrint("knbudget","CBudgetManager::NewBlock - incremental sync started\n"); if (chainActive.Height() % 1440 == rand() % 1440) { ClearSeen(); ResetSync(); @@ -983,7 +983,7 @@ void CBudgetManager::NewBlock() //remove invalid votes once in a while (we have to check the signatures and validity of every vote, somewhat CPU intensive) - LogPrint("mnbudget","CBudgetManager::NewBlock - askedForSourceProposalOrBudget cleanup - size: %d\n", askedForSourceProposalOrBudget.size()); + LogPrint("knbudget","CBudgetManager::NewBlock - askedForSourceProposalOrBudget cleanup - size: %d\n", askedForSourceProposalOrBudget.size()); std::map::iterator it = askedForSourceProposalOrBudget.begin(); while (it != askedForSourceProposalOrBudget.end()) { if ((*it).second > GetTime() - (60 * 60 * 24)) { @@ -993,21 +993,21 @@ void CBudgetManager::NewBlock() } } - LogPrint("mnbudget","CBudgetManager::NewBlock - mapProposals cleanup - size: %d\n", mapProposals.size()); + LogPrint("knbudget","CBudgetManager::NewBlock - mapProposals cleanup - size: %d\n", mapProposals.size()); std::map::iterator it2 = mapProposals.begin(); while (it2 != mapProposals.end()) { (*it2).second.CleanAndRemove(false); ++it2; } - LogPrint("mnbudget","CBudgetManager::NewBlock - mapFinalizedBudgets cleanup - size: %d\n", mapFinalizedBudgets.size()); + LogPrint("knbudget","CBudgetManager::NewBlock - mapFinalizedBudgets cleanup - size: %d\n", mapFinalizedBudgets.size()); std::map::iterator it3 = mapFinalizedBudgets.begin(); while (it3 != mapFinalizedBudgets.end()) { (*it3).second.CleanAndRemove(false); ++it3; } - LogPrint("mnbudget","CBudgetManager::NewBlock - vecImmatureBudgetProposals cleanup - size: %d\n", vecImmatureBudgetProposals.size()); + LogPrint("knbudget","CBudgetManager::NewBlock - vecImmatureBudgetProposals cleanup - size: %d\n", vecImmatureBudgetProposals.size()); std::vector::iterator it4 = vecImmatureBudgetProposals.begin(); while (it4 != vecImmatureBudgetProposals.end()) { std::string strError = ""; @@ -1018,7 +1018,7 @@ void CBudgetManager::NewBlock() } if (!(*it4).IsValid(strError)) { - LogPrint("mnbudget","mprop (immature) - invalid budget proposal - %s\n", strError); + LogPrint("knbudget","mprop (immature) - invalid budget proposal - %s\n", strError); it4 = vecImmatureBudgetProposals.erase(it4); continue; } @@ -1028,11 +1028,11 @@ void CBudgetManager::NewBlock() (*it4).Relay(); } - LogPrint("mnbudget","mprop (immature) - new budget - %s\n", (*it4).GetHash().ToString()); + LogPrint("knbudget","mprop (immature) - new budget - %s\n", (*it4).GetHash().ToString()); it4 = vecImmatureBudgetProposals.erase(it4); } - LogPrint("mnbudget","CBudgetManager::NewBlock - vecImmatureFinalizedBudgets cleanup - size: %d\n", vecImmatureFinalizedBudgets.size()); + LogPrint("knbudget","CBudgetManager::NewBlock - vecImmatureFinalizedBudgets cleanup - size: %d\n", vecImmatureFinalizedBudgets.size()); std::vector::iterator it5 = vecImmatureFinalizedBudgets.begin(); while (it5 != vecImmatureFinalizedBudgets.end()) { std::string strError = ""; @@ -1043,12 +1043,12 @@ void CBudgetManager::NewBlock() } if (!(*it5).IsValid(strError)) { - LogPrint("mnbudget","fbs (immature) - invalid finalized budget - %s\n", strError); + LogPrint("knbudget","fbs (immature) - invalid finalized budget - %s\n", strError); it5 = vecImmatureFinalizedBudgets.erase(it5); continue; } - LogPrint("mnbudget","fbs (immature) - new finalized budget - %s\n", (*it5).GetHash().ToString()); + LogPrint("knbudget","fbs (immature) - new finalized budget - %s\n", (*it5).GetHash().ToString()); CFinalizedBudget finalizedBudget((*it5)); if (AddFinalizedBudget(finalizedBudget)) { @@ -1057,7 +1057,7 @@ void CBudgetManager::NewBlock() it5 = vecImmatureFinalizedBudgets.erase(it5); } - LogPrint("mnbudget","CBudgetManager::NewBlock - PASSED\n"); + LogPrint("knbudget","CBudgetManager::NewBlock - PASSED\n"); } void CBudgetManager::ProcessMessage(CNode* pfrom, std::string& strCommand, CDataStream& vRecv) @@ -1075,7 +1075,7 @@ void CBudgetManager::ProcessMessage(CNode* pfrom, std::string& strCommand, CData if (Params().NetworkID() == CBaseChainParams::MAIN) { if (nProp == 0) { if (pfrom->HasFulfilledRequest(NetMsgType::MNVS)) { - LogPrint("mnbudget","mnvs - peer already asked me for the list\n"); + LogPrint("knbudget","mnvs - peer already asked me for the list\n"); Misbehaving(pfrom->GetId(), 20); return; } @@ -1084,7 +1084,7 @@ void CBudgetManager::ProcessMessage(CNode* pfrom, std::string& strCommand, CData } Sync(pfrom, nProp); - LogPrint("mnbudget", "mnvs - Sent Karmanode votes to peer %i\n", pfrom->GetId()); + LogPrint("knbudget", "mnvs - Sent Karmanode votes to peer %i\n", pfrom->GetId()); } if (strCommand == NetMsgType::MPROP) { //Karmanode Proposal @@ -1099,7 +1099,7 @@ void CBudgetManager::ProcessMessage(CNode* pfrom, std::string& strCommand, CData std::string strError = ""; int nConf = 0; if (!IsBudgetCollateralValid(budgetProposalBroadcast.nFeeTXHash, budgetProposalBroadcast.GetHash(), strError, budgetProposalBroadcast.nTime, nConf)) { - LogPrint("mnbudget","Proposal FeeTX is not valid - %s - %s\n", budgetProposalBroadcast.nFeeTXHash.ToString(), strError); + LogPrint("knbudget","Proposal FeeTX is not valid - %s - %s\n", budgetProposalBroadcast.nFeeTXHash.ToString(), strError); if (nConf >= 1) vecImmatureBudgetProposals.push_back(budgetProposalBroadcast); return; } @@ -1107,7 +1107,7 @@ void CBudgetManager::ProcessMessage(CNode* pfrom, std::string& strCommand, CData mapSeenKarmanodeBudgetProposals.insert(make_pair(budgetProposalBroadcast.GetHash(), budgetProposalBroadcast)); if (!budgetProposalBroadcast.IsValid(strError)) { - LogPrint("mnbudget","mprop - invalid budget proposal - %s\n", strError); + LogPrint("knbudget","mprop - invalid budget proposal - %s\n", strError); return; } @@ -1117,7 +1117,7 @@ void CBudgetManager::ProcessMessage(CNode* pfrom, std::string& strCommand, CData } karmanodeSync.AddedBudgetItem(budgetProposalBroadcast.GetHash()); - LogPrint("mnbudget","mprop - new budget - %s\n", budgetProposalBroadcast.GetHash().ToString()); + LogPrint("knbudget","mprop - new budget - %s\n", budgetProposalBroadcast.GetHash().ToString()); //We might have active votes for this proposal that are valid now CheckOrphanVotes(); @@ -1135,7 +1135,7 @@ void CBudgetManager::ProcessMessage(CNode* pfrom, std::string& strCommand, CData CKarmanode* pmn = mnodeman.Find(vote.vin); if (pmn == NULL) { - LogPrint("mnbudget","mvote - unknown karmanode - vin: %s\n", vote.vin.prevout.hash.ToString()); + LogPrint("knbudget","mvote - unknown karmanode - vin: %s\n", vote.vin.prevout.hash.ToString()); mnodeman.AskForMN(pfrom, vote.vin); return; } @@ -1158,7 +1158,7 @@ void CBudgetManager::ProcessMessage(CNode* pfrom, std::string& strCommand, CData karmanodeSync.AddedBudgetItem(vote.GetHash()); } - LogPrint("mnbudget","mvote - new budget vote for budget %s - %s\n", vote.nProposalHash.ToString(), vote.GetHash().ToString()); + LogPrint("knbudget","mvote - new budget vote for budget %s - %s\n", vote.nProposalHash.ToString(), vote.GetHash().ToString()); } if (strCommand == NetMsgType::FBS) { //Finalized Budget Suggestion @@ -1173,7 +1173,7 @@ void CBudgetManager::ProcessMessage(CNode* pfrom, std::string& strCommand, CData std::string strError = ""; int nConf = 0; if (!IsBudgetCollateralValid(finalizedBudgetBroadcast.nFeeTXHash, finalizedBudgetBroadcast.GetHash(), strError, finalizedBudgetBroadcast.nTime, nConf, true)) { - LogPrint("mnbudget","fbs - Finalized Budget FeeTX is not valid - %s - %s\n", finalizedBudgetBroadcast.nFeeTXHash.ToString(), strError); + LogPrint("knbudget","fbs - Finalized Budget FeeTX is not valid - %s - %s\n", finalizedBudgetBroadcast.nFeeTXHash.ToString(), strError); if (nConf >= 1) vecImmatureFinalizedBudgets.push_back(finalizedBudgetBroadcast); return; @@ -1182,11 +1182,11 @@ void CBudgetManager::ProcessMessage(CNode* pfrom, std::string& strCommand, CData mapSeenFinalizedBudgets.insert(make_pair(finalizedBudgetBroadcast.GetHash(), finalizedBudgetBroadcast)); if (!finalizedBudgetBroadcast.IsValid(strError)) { - LogPrint("mnbudget","fbs - invalid finalized budget - %s\n", strError); + LogPrint("knbudget","fbs - invalid finalized budget - %s\n", strError); return; } - LogPrint("mnbudget","fbs - new finalized budget - %s\n", finalizedBudgetBroadcast.GetHash().ToString()); + LogPrint("knbudget","fbs - new finalized budget - %s\n", finalizedBudgetBroadcast.GetHash().ToString()); CFinalizedBudget finalizedBudget(finalizedBudgetBroadcast); if (AddFinalizedBudget(finalizedBudget)) { @@ -1210,7 +1210,7 @@ void CBudgetManager::ProcessMessage(CNode* pfrom, std::string& strCommand, CData CKarmanode* pmn = mnodeman.Find(vote.vin); if (pmn == NULL) { - LogPrint("mnbudget", "fbvote - unknown karmanode - vin: %s\n", vote.vin.prevout.hash.ToString()); + LogPrint("knbudget", "fbvote - unknown karmanode - vin: %s\n", vote.vin.prevout.hash.ToString()); mnodeman.AskForMN(pfrom, vote.vin); return; } @@ -1231,9 +1231,9 @@ void CBudgetManager::ProcessMessage(CNode* pfrom, std::string& strCommand, CData vote.Relay(); karmanodeSync.AddedBudgetItem(vote.GetHash()); - LogPrint("mnbudget","fbvote - new finalized budget vote - %s from karmanode %s\n", vote.GetHash().ToString(), HexStr(pmn->pubKeyKarmanode)); + LogPrint("knbudget","fbvote - new finalized budget vote - %s from karmanode %s\n", vote.GetHash().ToString(), HexStr(pmn->pubKeyKarmanode)); } else { - LogPrint("mnbudget","fbvote - rejected finalized budget vote - %s from karmanode %s - %s\n", vote.GetHash().ToString(), HexStr(pmn->pubKeyKarmanode), strError); + LogPrint("knbudget","fbvote - rejected finalized budget vote - %s from karmanode %s - %s\n", vote.GetHash().ToString(), HexStr(pmn->pubKeyKarmanode), strError); } } } @@ -1359,7 +1359,7 @@ void CBudgetManager::Sync(CNode* pfrom, uint256 nProp, bool fPartial) pfrom->PushMessage(NetMsgType::SSC, KARMANODE_SYNC_BUDGET_PROP, nInvCount); - LogPrint("mnbudget", "CBudgetManager::Sync - sent %d items\n", nInvCount); + LogPrint("knbudget", "CBudgetManager::Sync - sent %d items\n", nInvCount); nInvCount = 0; @@ -1386,7 +1386,7 @@ void CBudgetManager::Sync(CNode* pfrom, uint256 nProp, bool fPartial) } pfrom->PushMessage(NetMsgType::SSC, KARMANODE_SYNC_BUDGET_FIN, nInvCount); - LogPrint("mnbudget", "CBudgetManager::Sync - sent %d items\n", nInvCount); + LogPrint("knbudget", "CBudgetManager::Sync - sent %d items\n", nInvCount); } bool CBudgetManager::UpdateProposal(CBudgetVote& vote, CNode* pfrom, std::string& strError) @@ -1399,7 +1399,7 @@ bool CBudgetManager::UpdateProposal(CBudgetVote& vote, CNode* pfrom, std::string // otherwise we'll think a full sync succeeded when they return a result if (!karmanodeSync.IsSynced()) return false; - LogPrint("mnbudget","CBudgetManager::UpdateProposal - Unknown proposal %d, asking for source proposal\n", vote.nProposalHash.ToString()); + LogPrint("knbudget","CBudgetManager::UpdateProposal - Unknown proposal %d, asking for source proposal\n", vote.nProposalHash.ToString()); mapOrphanKarmanodeBudgetVotes[vote.nProposalHash] = vote; if (!askedForSourceProposalOrBudget.count(vote.nProposalHash)) { @@ -1426,7 +1426,7 @@ bool CBudgetManager::UpdateFinalizedBudget(CFinalizedBudgetVote& vote, CNode* pf // otherwise we'll think a full sync succeeded when they return a result if (!karmanodeSync.IsSynced()) return false; - LogPrint("mnbudget","CBudgetManager::UpdateFinalizedBudget - Unknown Finalized Proposal %s, asking for source budget\n", vote.nBudgetHash.ToString()); + LogPrint("knbudget","CBudgetManager::UpdateFinalizedBudget - Unknown Finalized Proposal %s, asking for source budget\n", vote.nBudgetHash.ToString()); mapOrphanFinalizedBudgetVotes[vote.nBudgetHash] = vote; if (!askedForSourceProposalOrBudget.count(vote.nBudgetHash)) { @@ -1438,7 +1438,7 @@ bool CBudgetManager::UpdateFinalizedBudget(CFinalizedBudgetVote& vote, CNode* pf strError = "Finalized Budget " + vote.nBudgetHash.ToString() + " not found!"; return false; } - LogPrint("mnbudget","CBudgetManager::UpdateFinalizedBudget - Finalized Proposal %s added\n", vote.nBudgetHash.ToString()); + LogPrint("knbudget","CBudgetManager::UpdateFinalizedBudget - Finalized Proposal %s added\n", vote.nBudgetHash.ToString()); return mapFinalizedBudgets[vote.nBudgetHash].AddOrUpdateVote(vote, strError); } @@ -1565,12 +1565,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()); - LogPrint("mnbudget", "CBudgetProposal::AddOrUpdateVote - %s\n", strError); + LogPrint("knbudget", "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 sec < %lli sec\n", vote.GetHash().ToString(), vote.nTime - mapVotes[hash].nTime,BUDGET_VOTE_UPDATE_MIN); - LogPrint("mnbudget", "CBudgetProposal::AddOrUpdateVote - %s\n", strError); + LogPrint("knbudget", "CBudgetProposal::AddOrUpdateVote - %s\n", strError); return false; } strAction = "Existing vote updated:"; @@ -1578,12 +1578,12 @@ bool CBudgetProposal::AddOrUpdateVote(CBudgetVote& vote, std::string& strError) 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)); - LogPrint("mnbudget", "CBudgetProposal::AddOrUpdateVote - %s\n", strError); + LogPrint("knbudget", "CBudgetProposal::AddOrUpdateVote - %s\n", strError); return false; } mapVotes[hash] = vote; - LogPrint("mnbudget", "CBudgetProposal::AddOrUpdateVote - %s %s\n", strAction.c_str(), vote.GetHash().ToString().c_str()); + LogPrint("knbudget", "CBudgetProposal::AddOrUpdateVote - %s %s\n", strAction.c_str(), vote.GetHash().ToString().c_str()); return true; } @@ -1763,12 +1763,12 @@ bool CBudgetVote::Sign(CKey& keyKarmanode, CPubKey& pubKeyKarmanode) std::string strMessage = vin.prevout.ToStringShort() + nProposalHash.ToString() + std::to_string(nVote) + std::to_string(nTime); if (!obfuScationSigner.SignMessage(strMessage, errorMessage, vchSig, keyKarmanode)) { - LogPrint("mnbudget","CBudgetVote::Sign - Error upon calling SignMessage"); + LogPrint("knbudget","CBudgetVote::Sign - Error upon calling SignMessage"); return false; } if (!obfuScationSigner.VerifyMessage(pubKeyKarmanode, vchSig, strMessage, errorMessage)) { - LogPrint("mnbudget","CBudgetVote::Sign - Error upon calling VerifyMessage"); + LogPrint("knbudget","CBudgetVote::Sign - Error upon calling VerifyMessage"); return false; } @@ -1784,7 +1784,7 @@ bool CBudgetVote::SignatureValid(bool fSignatureCheck) if (pmn == NULL) { if (fDebug){ - LogPrint("mnbudget","CBudgetVote::SignatureValid() - Unknown Karmanode - %s\n", vin.prevout.hash.ToString()); + LogPrint("knbudget","CBudgetVote::SignatureValid() - Unknown Karmanode - %s\n", vin.prevout.hash.ToString()); } return false; } @@ -1792,7 +1792,7 @@ bool CBudgetVote::SignatureValid(bool fSignatureCheck) if (!fSignatureCheck) return true; if (!obfuScationSigner.VerifyMessage(pmn->pubKeyKarmanode, vchSig, strMessage, errorMessage)) { - LogPrint("mnbudget","CBudgetVote::SignatureValid() - Verify message failed\n"); + LogPrint("knbudget","CBudgetVote::SignatureValid() - Verify message failed\n"); return false; } @@ -1833,12 +1833,12 @@ bool CFinalizedBudget::AddOrUpdateVote(CFinalizedBudgetVote& vote, std::string& if (mapVotes.count(hash)) { if (mapVotes[hash].nTime > vote.nTime) { strError = strprintf("new vote older than existing vote - %s\n", vote.GetHash().ToString()); - LogPrint("mnbudget", "CFinalizedBudget::AddOrUpdateVote - %s\n", strError); + LogPrint("knbudget", "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 sec < %lli sec\n", vote.GetHash().ToString(), vote.nTime - mapVotes[hash].nTime,BUDGET_VOTE_UPDATE_MIN); - LogPrint("mnbudget", "CFinalizedBudget::AddOrUpdateVote - %s\n", strError); + LogPrint("knbudget", "CFinalizedBudget::AddOrUpdateVote - %s\n", strError); return false; } strAction = "Existing vote updated:"; @@ -1846,12 +1846,12 @@ bool CFinalizedBudget::AddOrUpdateVote(CFinalizedBudgetVote& vote, std::string& 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)); - LogPrint("mnbudget", "CFinalizedBudget::AddOrUpdateVote - %s\n", strError); + LogPrint("knbudget", "CFinalizedBudget::AddOrUpdateVote - %s\n", strError); return false; } mapVotes[hash] = vote; - LogPrint("mnbudget", "CFinalizedBudget::AddOrUpdateVote - %s %s\n", strAction.c_str(), vote.GetHash().ToString().c_str()); + LogPrint("knbudget", "CFinalizedBudget::AddOrUpdateVote - %s %s\n", strAction.c_str(), vote.GetHash().ToString().c_str()); return true; } @@ -1879,17 +1879,17 @@ void CFinalizedBudget::CheckAndVote() CBlockIndex* pindexPrev = chainActive.Tip(); if (!pindexPrev) return; - LogPrint("mnbudget","CFinalizedBudget::AutoCheck - %lli - %d\n", pindexPrev->nHeight, fAutoChecked); + LogPrint("knbudget","CFinalizedBudget::AutoCheck - %lli - %d\n", pindexPrev->nHeight, fAutoChecked); if (!fMasterNode || fAutoChecked) { - LogPrint("mnbudget","CFinalizedBudget::AutoCheck fMasterNode=%d fAutoChecked=%d\n", fMasterNode, fAutoChecked); + LogPrint("knbudget","CFinalizedBudget::AutoCheck fMasterNode=%d fAutoChecked=%d\n", fMasterNode, fAutoChecked); return; } // Do this 1 in 4 blocks -- spread out the voting activity on mainnet // -- this function is only called every fourteenth block, so this is really 1 in 56 blocks if (rand() % 4 != 0) { - LogPrint("mnbudget","CFinalizedBudget::AutoCheck - waiting\n"); + LogPrint("knbudget","CFinalizedBudget::AutoCheck - waiting\n"); return; } @@ -1912,52 +1912,52 @@ void CFinalizedBudget::CheckAndVote() std::sort(vecBudgetPaymentsSortedByHash.begin(), vecBudgetPaymentsSortedByHash.end(), sortPaymentsByHash()); for (unsigned int i = 0; i < vecBudgetPaymentsSortedByHash.size(); i++) { - LogPrint("mnbudget","CFinalizedBudget::AutoCheck Budget-Payments - nProp %d %s\n", i, vecBudgetPaymentsSortedByHash[i].nProposalHash.ToString()); - LogPrint("mnbudget","CFinalizedBudget::AutoCheck Budget-Payments - Payee %d %s\n", i, vecBudgetPaymentsSortedByHash[i].payee.ToString()); - LogPrint("mnbudget","CFinalizedBudget::AutoCheck Budget-Payments - nAmount %d %lli\n", i, vecBudgetPaymentsSortedByHash[i].nAmount); + LogPrint("knbudget","CFinalizedBudget::AutoCheck Budget-Payments - nProp %d %s\n", i, vecBudgetPaymentsSortedByHash[i].nProposalHash.ToString()); + LogPrint("knbudget","CFinalizedBudget::AutoCheck Budget-Payments - Payee %d %s\n", i, vecBudgetPaymentsSortedByHash[i].payee.ToString()); + LogPrint("knbudget","CFinalizedBudget::AutoCheck Budget-Payments - nAmount %d %lli\n", i, vecBudgetPaymentsSortedByHash[i].nAmount); } for (unsigned int i = 0; i < vBudgetProposalsSortedByHash.size(); i++) { - LogPrint("mnbudget","CFinalizedBudget::AutoCheck Budget-Proposals - nProp %d %s\n", i, vBudgetProposalsSortedByHash[i]->GetHash().ToString()); - LogPrint("mnbudget","CFinalizedBudget::AutoCheck Budget-Proposals - Payee %d %s\n", i, vBudgetProposalsSortedByHash[i]->GetPayee().ToString()); - LogPrint("mnbudget","CFinalizedBudget::AutoCheck Budget-Proposals - nAmount %d %lli\n", i, vBudgetProposalsSortedByHash[i]->GetAmount()); + LogPrint("knbudget","CFinalizedBudget::AutoCheck Budget-Proposals - nProp %d %s\n", i, vBudgetProposalsSortedByHash[i]->GetHash().ToString()); + LogPrint("knbudget","CFinalizedBudget::AutoCheck Budget-Proposals - Payee %d %s\n", i, vBudgetProposalsSortedByHash[i]->GetPayee().ToString()); + LogPrint("knbudget","CFinalizedBudget::AutoCheck Budget-Proposals - nAmount %d %lli\n", i, vBudgetProposalsSortedByHash[i]->GetAmount()); } if (vBudgetProposalsSortedByHash.size() == 0) { - LogPrint("mnbudget","CFinalizedBudget::AutoCheck - No Budget-Proposals found, aborting\n"); + LogPrint("knbudget","CFinalizedBudget::AutoCheck - No Budget-Proposals found, aborting\n"); return; } if (vBudgetProposalsSortedByHash.size() != vecBudgetPaymentsSortedByHash.size()) { - LogPrint("mnbudget","CFinalizedBudget::AutoCheck - Budget-Proposal length (%ld) doesn't match Budget-Payment length (%ld).\n", + LogPrint("knbudget","CFinalizedBudget::AutoCheck - Budget-Proposal length (%ld) doesn't match Budget-Payment length (%ld).\n", vBudgetProposalsSortedByHash.size(), vecBudgetPaymentsSortedByHash.size()); return; } for (unsigned int i = 0; i < vecBudgetPaymentsSortedByHash.size(); i++) { if (i > vBudgetProposalsSortedByHash.size() - 1) { - LogPrint("mnbudget","CFinalizedBudget::AutoCheck - Proposal size mismatch, i=%d > (vBudgetProposals.size() - 1)=%d\n", i, vBudgetProposalsSortedByHash.size() - 1); + LogPrint("knbudget","CFinalizedBudget::AutoCheck - Proposal size mismatch, i=%d > (vBudgetProposals.size() - 1)=%d\n", i, vBudgetProposalsSortedByHash.size() - 1); return; } if (vecBudgetPaymentsSortedByHash[i].nProposalHash != vBudgetProposalsSortedByHash[i]->GetHash()) { - LogPrint("mnbudget","CFinalizedBudget::AutoCheck - item #%d doesn't match %s %s\n", i, vecBudgetPaymentsSortedByHash[i].nProposalHash.ToString(), vBudgetProposalsSortedByHash[i]->GetHash().ToString()); + LogPrint("knbudget","CFinalizedBudget::AutoCheck - item #%d doesn't match %s %s\n", i, vecBudgetPaymentsSortedByHash[i].nProposalHash.ToString(), vBudgetProposalsSortedByHash[i]->GetHash().ToString()); return; } // if(vecBudgetPayments[i].payee != vBudgetProposals[i]->GetPayee()){ -- triggered with false positive if (vecBudgetPaymentsSortedByHash[i].payee.ToString() != vBudgetProposalsSortedByHash[i]->GetPayee().ToString()) { - LogPrint("mnbudget","CFinalizedBudget::AutoCheck - item #%d payee doesn't match %s %s\n", i, vecBudgetPaymentsSortedByHash[i].payee.ToString(), vBudgetProposalsSortedByHash[i]->GetPayee().ToString()); + LogPrint("knbudget","CFinalizedBudget::AutoCheck - item #%d payee doesn't match %s %s\n", i, vecBudgetPaymentsSortedByHash[i].payee.ToString(), vBudgetProposalsSortedByHash[i]->GetPayee().ToString()); return; } if (vecBudgetPaymentsSortedByHash[i].nAmount != vBudgetProposalsSortedByHash[i]->GetAmount()) { - LogPrint("mnbudget","CFinalizedBudget::AutoCheck - item #%d payee doesn't match %lli %lli\n", i, vecBudgetPaymentsSortedByHash[i].nAmount, vBudgetProposalsSortedByHash[i]->GetAmount()); + LogPrint("knbudget","CFinalizedBudget::AutoCheck - item #%d payee doesn't match %lli %lli\n", i, vecBudgetPaymentsSortedByHash[i].nAmount, vBudgetProposalsSortedByHash[i]->GetAmount()); return; } } - LogPrint("mnbudget","CFinalizedBudget::AutoCheck - Finalized Budget Matches! Submitting Vote.\n"); + LogPrint("knbudget","CFinalizedBudget::AutoCheck - Finalized Budget Matches! Submitting Vote.\n"); SubmitVote(); } } @@ -2012,7 +2012,7 @@ std::string CFinalizedBudget::GetStatus() for (int nBlockHeight = GetBlockStart(); nBlockHeight <= GetBlockEnd(); nBlockHeight++) { CTxBudgetPayment budgetPayment; if (!GetBudgetPaymentByBlock(nBlockHeight, budgetPayment)) { - LogPrint("mnbudget","CFinalizedBudget::GetStatus - Couldn't find budget payment for block %lld\n", nBlockHeight); + LogPrint("knbudget","CFinalizedBudget::GetStatus - Couldn't find budget payment for block %lld\n", nBlockHeight); continue; } @@ -2120,7 +2120,7 @@ bool CFinalizedBudget::IsPaidAlready(uint256 nProposalHash, int nBlockHeight) nPaidBlockHeight = (*it).second; if((nPaidBlockHeight < GetBlockStart()) || (nPaidBlockHeight > GetBlockEnd())) { nOldProposalHash = (*it).first; - LogPrint("mnbudget", "CFinalizedBudget::IsPaidAlready - Budget Proposal %s, Block %d from old cycle deleted\n", + LogPrint("knbudget", "CFinalizedBudget::IsPaidAlready - Budget Proposal %s, Block %d from old cycle deleted\n", nOldProposalHash.ToString().c_str(), nPaidBlockHeight); mapPayment_History.erase(it++); } @@ -2133,7 +2133,7 @@ bool CFinalizedBudget::IsPaidAlready(uint256 nProposalHash, int nBlockHeight) if(mapPayment_History.count(nProposalHash) == 0) { // New proposal payment, insert into map for checks with later blocks from this cycle mapPayment_History.insert(std::pair(nProposalHash, nBlockHeight)); - LogPrint("mnbudget", "CFinalizedBudget::IsPaidAlready - Budget Proposal %s, Block %d added to payment history\n", + LogPrint("knbudget", "CFinalizedBudget::IsPaidAlready - Budget Proposal %s, Block %d added to payment history\n", nProposalHash.ToString().c_str(), nBlockHeight); return false; } @@ -2146,18 +2146,18 @@ TrxValidationStatus CFinalizedBudget::IsTransactionValid(const CTransaction& txN TrxValidationStatus transactionStatus = TrxValidationStatus::Invalid; int nCurrentBudgetPayment = nBlockHeight - GetBlockStart(); if (nCurrentBudgetPayment < 0) { - LogPrint("mnbudget","CFinalizedBudget::IsTransactionValid - Invalid block - height: %d start: %d\n", nBlockHeight, GetBlockStart()); + LogPrint("knbudget","CFinalizedBudget::IsTransactionValid - Invalid block - height: %d start: %d\n", nBlockHeight, GetBlockStart()); return TrxValidationStatus::Invalid; } if (nCurrentBudgetPayment > (int)vecBudgetPayments.size() - 1) { - LogPrint("mnbudget","CFinalizedBudget::IsTransactionValid - Invalid block - current budget payment: %d of %d\n", nCurrentBudgetPayment + 1, (int)vecBudgetPayments.size()); + LogPrint("knbudget","CFinalizedBudget::IsTransactionValid - Invalid block - current budget payment: %d of %d\n", nCurrentBudgetPayment + 1, (int)vecBudgetPayments.size()); return TrxValidationStatus::Invalid; } bool paid = false; BOOST_FOREACH (CTxOut out, txNew.vout) { - LogPrint("mnbudget","CFinalizedBudget::IsTransactionValid - nCurrentBudgetPayment=%d, payee=%s == out.scriptPubKey=%s, amount=%ld == out.nValue=%ld\n", + LogPrint("knbudget","CFinalizedBudget::IsTransactionValid - nCurrentBudgetPayment=%d, payee=%s == out.scriptPubKey=%s, amount=%ld == out.nValue=%ld\n", nCurrentBudgetPayment, vecBudgetPayments[nCurrentBudgetPayment].payee.ToString().c_str(), out.scriptPubKey.ToString().c_str(), vecBudgetPayments[nCurrentBudgetPayment].nAmount, out.nValue); @@ -2165,7 +2165,7 @@ TrxValidationStatus CFinalizedBudget::IsTransactionValid(const CTransaction& txN // Check if this proposal was paid already. If so, pay a karmanode instead paid = IsPaidAlready(vecBudgetPayments[nCurrentBudgetPayment].nProposalHash, nBlockHeight); if(paid) { - LogPrint("mnbudget","CFinalizedBudget::IsTransactionValid - Double Budget Payment of %d for proposal %d detected. Paying a karmanode instead.\n", + LogPrint("knbudget","CFinalizedBudget::IsTransactionValid - Double Budget Payment of %d for proposal %d detected. Paying a karmanode instead.\n", vecBudgetPayments[nCurrentBudgetPayment].nAmount, vecBudgetPayments[nCurrentBudgetPayment].nProposalHash.Get32()); // No matter what we've found before, stop all checks here. In future releases there might be more than one budget payment // per block, so even if the first one was not paid yet this one disables all budget payments for this block. @@ -2174,7 +2174,7 @@ TrxValidationStatus CFinalizedBudget::IsTransactionValid(const CTransaction& txN } else { transactionStatus = TrxValidationStatus::Valid; - LogPrint("mnbudget","CFinalizedBudget::IsTransactionValid - Found valid Budget Payment of %d for proposal %d\n", + LogPrint("knbudget","CFinalizedBudget::IsTransactionValid - Found valid Budget Payment of %d for proposal %d\n", vecBudgetPayments[nCurrentBudgetPayment].nAmount, vecBudgetPayments[nCurrentBudgetPayment].nProposalHash.Get32()); } } @@ -2184,7 +2184,7 @@ TrxValidationStatus CFinalizedBudget::IsTransactionValid(const CTransaction& txN CTxDestination address1; ExtractDestination(vecBudgetPayments[nCurrentBudgetPayment].payee, address1); - LogPrint("mnbudget","CFinalizedBudget::IsTransactionValid - Missing required payment - %s: %d c: %d\n", + LogPrint("knbudget","CFinalizedBudget::IsTransactionValid - Missing required payment - %s: %d c: %d\n", EncodeDestination(address1), vecBudgetPayments[nCurrentBudgetPayment].nAmount, nCurrentBudgetPayment); } @@ -2198,24 +2198,24 @@ void CFinalizedBudget::SubmitVote() std::string errorMessage; if (!obfuScationSigner.SetKey(strMasterNodePrivKey, errorMessage, keyKarmanode, pubKeyKarmanode)) { - LogPrint("mnbudget","CFinalizedBudget::SubmitVote - Error upon calling SetKey\n"); + LogPrint("knbudget","CFinalizedBudget::SubmitVote - Error upon calling SetKey\n"); return; } CFinalizedBudgetVote vote(activeKarmanode.vin, GetHash()); if (!vote.Sign(keyKarmanode, pubKeyKarmanode)) { - LogPrint("mnbudget","CFinalizedBudget::SubmitVote - Failure to sign."); + LogPrint("knbudget","CFinalizedBudget::SubmitVote - Failure to sign."); return; } std::string strError = ""; if (budget.UpdateFinalizedBudget(vote, NULL, strError)) { - LogPrint("mnbudget","CFinalizedBudget::SubmitVote - new finalized budget vote - %s\n", vote.GetHash().ToString()); + LogPrint("knbudget","CFinalizedBudget::SubmitVote - new finalized budget vote - %s\n", vote.GetHash().ToString()); budget.mapSeenFinalizedBudgetVotes.insert(make_pair(vote.GetHash(), vote)); vote.Relay(); } else { - LogPrint("mnbudget","CFinalizedBudget::SubmitVote : Error submitting vote - %s\n", strError); + LogPrint("knbudget","CFinalizedBudget::SubmitVote : Error submitting vote - %s\n", strError); } } @@ -2291,12 +2291,12 @@ bool CFinalizedBudgetVote::Sign(CKey& keyKarmanode, CPubKey& pubKeyKarmanode) std::string strMessage = vin.prevout.ToStringShort() + nBudgetHash.ToString() + std::to_string(nTime); if (!obfuScationSigner.SignMessage(strMessage, errorMessage, vchSig, keyKarmanode)) { - LogPrint("mnbudget","CFinalizedBudgetVote::Sign - Error upon calling SignMessage"); + LogPrint("knbudget","CFinalizedBudgetVote::Sign - Error upon calling SignMessage"); return false; } if (!obfuScationSigner.VerifyMessage(pubKeyKarmanode, vchSig, strMessage, errorMessage)) { - LogPrint("mnbudget","CFinalizedBudgetVote::Sign - Error upon calling VerifyMessage"); + LogPrint("knbudget","CFinalizedBudgetVote::Sign - Error upon calling VerifyMessage"); return false; } @@ -2312,14 +2312,14 @@ bool CFinalizedBudgetVote::SignatureValid(bool fSignatureCheck) CKarmanode* pmn = mnodeman.Find(vin); if (pmn == NULL) { - LogPrint("mnbudget","CFinalizedBudgetVote::SignatureValid() - Unknown Karmanode %s\n", strMessage); + LogPrint("knbudget","CFinalizedBudgetVote::SignatureValid() - Unknown Karmanode %s\n", strMessage); return false; } if (!fSignatureCheck) return true; if (!obfuScationSigner.VerifyMessage(pmn->pubKeyKarmanode, vchSig, strMessage, errorMessage)) { - LogPrint("mnbudget","CFinalizedBudgetVote::SignatureValid() - Verify message failed %s %s\n", strMessage, errorMessage); + LogPrint("knbudget","CFinalizedBudgetVote::SignatureValid() - Verify message failed %s %s\n", strMessage, errorMessage); return false; } diff --git a/src/karmanode-sync.cpp b/src/karmanode-sync.cpp index f92e5e5..6718bb2 100755 --- a/src/karmanode-sync.cpp +++ b/src/karmanode-sync.cpp @@ -224,8 +224,8 @@ void CKarmanodeSync::ClearFulfilledRequest() BOOST_FOREACH (CNode* pnode, vNodes) { pnode->ClearFulfilledRequest(NetMsgType::GETSPORK); - pnode->ClearFulfilledRequest("mnsync"); - pnode->ClearFulfilledRequest("mnwsync"); + pnode->ClearFulfilledRequest("knsync"); + pnode->ClearFulfilledRequest("knwsync"); pnode->ClearFulfilledRequest("busync"); } } @@ -303,8 +303,8 @@ void CKarmanodeSync::Process() return; } - if (pnode->HasFulfilledRequest("mnsync")) continue; - pnode->FulfilledRequest("mnsync"); + if (pnode->HasFulfilledRequest("knsync")) continue; + pnode->FulfilledRequest("knsync"); // timeout if (lastKarmanodeList == 0 && @@ -334,8 +334,8 @@ void CKarmanodeSync::Process() return; } - if (pnode->HasFulfilledRequest("mnwsync")) continue; - pnode->FulfilledRequest("mnwsync"); + if (pnode->HasFulfilledRequest("knwsync")) continue; + pnode->FulfilledRequest("knwsync"); // timeout if (lastKarmanodeWinner == 0 && diff --git a/src/rpcclient.cpp b/src/rpcclient.cpp index 5f41165..ce420bb 100755 --- a/src/rpcclient.cpp +++ b/src/rpcclient.cpp @@ -104,10 +104,10 @@ static const CRPCConvertParam vRPCConvertParams[] = {"setban", 2}, {"setban", 3}, {"spork", 1}, - {"mnbudget", 3}, - {"mnbudget", 4}, - {"mnbudget", 6}, - {"mnbudget", 8}, + {"knbudget", 3}, + {"knbudget", 4}, + {"knbudget", 6}, + {"knbudget", 8}, {"preparebudget", 2}, {"preparebudget", 3}, {"preparebudget", 5}, diff --git a/src/rpckarmanode-budget.cpp b/src/rpckarmanode-budget.cpp index 3d549f9..a8a52bb 100755 --- a/src/rpckarmanode-budget.cpp +++ b/src/rpckarmanode-budget.cpp @@ -47,7 +47,7 @@ void budgetToJSON(CBudgetProposal* pbudgetProposal, UniValue& bObj) // This command is retained for backwards compatibility, but is deprecated. // Future removal of this command is planned to keep things clean. -UniValue mnbudget(const UniValue& params, bool fHelp) +UniValue knbudget(const UniValue& params, bool fHelp) { string strCommand; if (params.size() >= 1) @@ -56,7 +56,7 @@ UniValue mnbudget(const UniValue& params, bool fHelp) if (fHelp || (strCommand != "vote-alias" && strCommand != "vote-many" && strCommand != "prepare" && strCommand != "submit" && strCommand != "vote" && strCommand != "getvotes" && strCommand != "getinfo" && strCommand != "show" && strCommand != "projection" && strCommand != "check" && strCommand != "nextblock")) throw runtime_error( - "mnbudget \"command\"... ( \"passphrase\" )\n" + "knbudget \"command\"... ( \"passphrase\" )\n" "\nVote or show current budgets\n" "This command is deprecated, please see individual command documentation for future reference\n\n" @@ -104,9 +104,9 @@ UniValue mnbudget(const UniValue& params, bool fHelp) if (strCommand == "vote-alias") throw runtime_error( "vote-alias is not supported with this command\n" - "Please use mnbudgetvote instead.\n" + "Please use knbudgetvote instead.\n" ); - return mnbudgetvote(params, fHelp); + return knbudgetvote(params, fHelp); } if (strCommand == "projection") { @@ -337,13 +337,13 @@ UniValue submitbudget(const UniValue& params, bool fHelp) throw runtime_error("Invalid proposal, see debug.log for details."); } -UniValue mnbudgetvote(const UniValue& params, bool fHelp) +UniValue knbudgetvote(const UniValue& params, bool fHelp) { std::string strCommand; if (params.size() >= 1) { strCommand = params[0].get_str(); - // Backwards compatibility with legacy `mnbudget` command + // Backwards compatibility with legacy `knbudget` command if (strCommand == "vote") strCommand = "local"; if (strCommand == "vote-many") strCommand = "many"; if (strCommand == "vote-alias") strCommand = "alias"; @@ -352,7 +352,7 @@ UniValue mnbudgetvote(const UniValue& params, bool fHelp) if (fHelp || (params.size() == 3 && (strCommand != "local" && strCommand != "many")) || (params.size() == 4 && strCommand != "alias") || params.size() > 4 || params.size() < 3) throw runtime_error( - "mnbudgetvote \"local|many|alias\" \"votehash\" \"yes|no\" ( \"alias\" )\n" + "knbudgetvote \"local|many|alias\" \"votehash\" \"yes|no\" ( \"alias\" )\n" "\nVote on a budget proposal\n" "\nArguments:\n" @@ -375,8 +375,8 @@ UniValue mnbudgetvote(const UniValue& params, bool fHelp) "}\n" "\nExamples:\n" + - HelpExampleCli("mnbudgetvote", "\"local\" \"ed2f83cedee59a91406f5f47ec4d60bf5a7f9ee6293913c82976bd2d3a658041\" \"yes\"") + - HelpExampleRpc("mnbudgetvote", "\"local\" \"ed2f83cedee59a91406f5f47ec4d60bf5a7f9ee6293913c82976bd2d3a658041\" \"yes\"")); + HelpExampleCli("knbudgetvote", "\"local\" \"ed2f83cedee59a91406f5f47ec4d60bf5a7f9ee6293913c82976bd2d3a658041\" \"yes\"") + + HelpExampleRpc("knbudgetvote", "\"local\" \"ed2f83cedee59a91406f5f47ec4d60bf5a7f9ee6293913c82976bd2d3a658041\" \"yes\"")); uint256 hash = ParseHashV(params[1], "parameter 1"); std::string strVote = params[2].get_str(); @@ -786,11 +786,11 @@ UniValue getbudgetinfo(const UniValue& params, bool fHelp) return ret; } -UniValue mnbudgetrawvote(const UniValue& params, bool fHelp) +UniValue knbudgetrawvote(const UniValue& params, bool fHelp) { if (fHelp || params.size() != 6) throw runtime_error( - "mnbudgetrawvote \"karmanode-tx-hash\" karmanode-tx-index \"proposal-hash\" yes|no time \"vote-sig\"\n" + "knbudgetrawvote \"karmanode-tx-hash\" karmanode-tx-index \"proposal-hash\" yes|no time \"vote-sig\"\n" "\nCompile and relay a proposal vote with provided external signature instead of signing vote internally\n" "\nArguments:\n" @@ -804,7 +804,7 @@ UniValue mnbudgetrawvote(const UniValue& params, bool fHelp) "\nResult:\n" "\"status\" (string) Vote status or error message\n" "\nExamples:\n" + - HelpExampleCli("mnbudgetrawvote", "") + HelpExampleRpc("mnbudgetrawvote", "")); + HelpExampleCli("knbudgetrawvote", "") + HelpExampleRpc("knbudgetrawvote", "")); uint256 hashMnTx = ParseHashV(params[0], "mn tx hash"); int nMnTxIndex = params[1].get_int(); @@ -849,7 +849,7 @@ UniValue mnbudgetrawvote(const UniValue& params, bool fHelp) } } -UniValue mnfinalbudget(const UniValue& params, bool fHelp) +UniValue knfinalbudget(const UniValue& params, bool fHelp) { string strCommand; if (params.size() >= 1) @@ -858,7 +858,7 @@ UniValue mnfinalbudget(const UniValue& params, bool fHelp) if (fHelp || (strCommand != "suggest" && strCommand != "vote-many" && strCommand != "vote" && strCommand != "show" && strCommand != "getvotes")) throw runtime_error( - "mnfinalbudget \"command\"... ( \"passphrase\" )\n" + "knfinalbudget \"command\"... ( \"passphrase\" )\n" "Vote or show current budgets\n" "\nAvailable commands:\n" " vote-many - Vote on a finalized budget\n" @@ -868,7 +868,7 @@ UniValue mnfinalbudget(const UniValue& params, bool fHelp) if (strCommand == "vote-many") { if (params.size() != 2) - throw runtime_error("Correct usage is 'mnfinalbudget vote-many BUDGET_HASH'"); + throw runtime_error("Correct usage is 'knfinalbudget vote-many BUDGET_HASH'"); std::string strHash = params[1].get_str(); uint256 hash(strHash); @@ -940,7 +940,7 @@ UniValue mnfinalbudget(const UniValue& params, bool fHelp) if (strCommand == "vote") { if (params.size() != 2) - throw runtime_error("Correct usage is 'mnfinalbudget vote BUDGET_HASH'"); + throw runtime_error("Correct usage is 'knfinalbudget vote BUDGET_HASH'"); std::string strHash = params[1].get_str(); uint256 hash(strHash); @@ -1003,7 +1003,7 @@ UniValue mnfinalbudget(const UniValue& 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 'knbudget getvotes budget-hash'"); std::string strHash = params[1].get_str(); uint256 hash(strHash); diff --git a/src/rpcmisc.cpp b/src/rpcmisc.cpp index 8dfa362..7dbfb40 100755 --- a/src/rpcmisc.cpp +++ b/src/rpcmisc.cpp @@ -148,7 +148,7 @@ UniValue getinfo(const UniValue& params, bool fHelp) return obj; } -UniValue mnsync(const UniValue& params, bool fHelp) +UniValue knsync(const UniValue& params, bool fHelp) { std::string strMode; if (params.size() == 1) @@ -156,7 +156,7 @@ UniValue mnsync(const UniValue& params, bool fHelp) if (fHelp || params.size() != 1 || (strMode != "status" && strMode != "reset")) { throw runtime_error( - "mnsync \"status|reset\"\n" + "knsync \"status|reset\"\n" "\nReturns the sync status or resets sync.\n" "\nArguments:\n" @@ -185,7 +185,7 @@ UniValue mnsync(const UniValue& params, bool fHelp) "\nResult ('reset' mode):\n" "\"status\" (string) 'success'\n" "\nExamples:\n" + - HelpExampleCli("mnsync", "\"status\"") + HelpExampleRpc("mnsync", "\"status\"")); + HelpExampleCli("knsync", "\"status\"") + HelpExampleRpc("knsync", "\"status\"")); } if (strMode == "status") { @@ -635,7 +635,7 @@ UniValue getstakingstatus(const UniValue& params, bool fHelp) " \"walletunlocked\": true|false, (boolean) if the wallet is unlocked\n" " \"mintablecoins\": true|false, (boolean) if the wallet has mintable coins\n" " \"enoughcoins\": true|false, (boolean) if available coins are greater than reserve balance\n" - " \"mnsync\": true|false, (boolean) if karmanode data is synced\n" + " \"knsync\": true|false, (boolean) if karmanode data is synced\n" " \"staking status\": true|false, (boolean) if the wallet is staking or not\n" "}\n" "\nExamples:\n" + @@ -655,7 +655,7 @@ UniValue getstakingstatus(const UniValue& params, bool fHelp) obj.push_back(Pair("mintablecoins", pwalletMain->MintableCoins())); obj.push_back(Pair("enoughcoins", nReserveBalance <= pwalletMain->GetBalance())); } - obj.push_back(Pair("mnsync", karmanodeSync.IsSynced())); + obj.push_back(Pair("knsync", karmanodeSync.IsSynced())); bool nStaking = false; if (mapHashedBlocks.count(chainActive.Tip()->nHeight)) diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index 9880343..b8127e1 100755 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -369,18 +369,18 @@ static const CRPCCommand vRPCCommands[] = {"ohmcoin", "getkarmanodestatus", &getkarmanodestatus, true, true, false}, {"ohmcoin", "getkarmanodewinners", &getkarmanodewinners, true, true, false}, {"ohmcoin", "getkarmanodescores", &getkarmanodescores, true, true, false}, - {"ohmcoin", "mnbudget", &mnbudget, true, true, false}, + {"ohmcoin", "knbudget", &knbudget, true, true, false}, {"ohmcoin", "preparebudget", &preparebudget, true, true, false}, {"ohmcoin", "submitbudget", &submitbudget, true, true, false}, - {"ohmcoin", "mnbudgetvote", &mnbudgetvote, true, true, false}, + {"ohmcoin", "knbudgetvote", &knbudgetvote, true, true, false}, {"ohmcoin", "getbudgetvotes", &getbudgetvotes, true, true, false}, {"ohmcoin", "getnextsuperblock", &getnextsuperblock, true, true, false}, {"ohmcoin", "getbudgetprojection", &getbudgetprojection, true, true, false}, {"ohmcoin", "getbudgetinfo", &getbudgetinfo, true, true, false}, - {"ohmcoin", "mnbudgetrawvote", &mnbudgetrawvote, true, true, false}, - {"ohmcoin", "mnfinalbudget", &mnfinalbudget, true, true, false}, + {"ohmcoin", "knbudgetrawvote", &knbudgetrawvote, true, true, false}, + {"ohmcoin", "knfinalbudget", &knfinalbudget, true, true, false}, {"ohmcoin", "checkbudgets", &checkbudgets, true, true, false}, - {"ohmcoin", "mnsync", &mnsync, true, true, false}, + {"ohmcoin", "knsync", &knsync, true, true, false}, {"ohmcoin", "spork", &spork, true, true, false}, {"ohmcoin", "getpoolinfo", &getpoolinfo, true, true, false}, {"ohmcoin", "makekeypair", &makekeypair, true, true, false}, diff --git a/src/rpcserver.h b/src/rpcserver.h index 3175330..d82a81a 100755 --- a/src/rpcserver.h +++ b/src/rpcserver.h @@ -314,20 +314,20 @@ extern UniValue getkarmanodestatus(const UniValue& params, bool fHelp); extern UniValue getkarmanodewinners(const UniValue& params, bool fHelp); extern UniValue getkarmanodescores(const UniValue& params, bool fHelp); -extern UniValue mnbudget(const UniValue& params, bool fHelp); // in rpckarmanode-budget.cpp +extern UniValue knbudget(const UniValue& params, bool fHelp); // in rpckarmanode-budget.cpp extern UniValue preparebudget(const UniValue& params, bool fHelp); extern UniValue submitbudget(const UniValue& params, bool fHelp); -extern UniValue mnbudgetvote(const UniValue& params, bool fHelp); +extern UniValue knbudgetvote(const UniValue& params, bool fHelp); extern UniValue getbudgetvotes(const UniValue& params, bool fHelp); extern UniValue getnextsuperblock(const UniValue& params, bool fHelp); extern UniValue getbudgetprojection(const UniValue& params, bool fHelp); extern UniValue getbudgetinfo(const UniValue& params, bool fHelp); -extern UniValue mnbudgetrawvote(const UniValue& params, bool fHelp); -extern UniValue mnfinalbudget(const UniValue& params, bool fHelp); +extern UniValue knbudgetrawvote(const UniValue& params, bool fHelp); +extern UniValue knfinalbudget(const UniValue& params, bool fHelp); extern UniValue checkbudgets(const UniValue& params, bool fHelp); extern UniValue getinfo(const UniValue& params, bool fHelp); // in rpcmisc.cpp -extern UniValue mnsync(const UniValue& params, bool fHelp); +extern UniValue knsync(const UniValue& params, bool fHelp); extern UniValue spork(const UniValue& params, bool fHelp); extern UniValue validateaddress(const UniValue& params, bool fHelp); extern UniValue createmultisig(const UniValue& params, bool fHelp); diff --git a/src/util.cpp b/src/util.cpp index 44d9288..1b944cb 100755 --- a/src/util.cpp +++ b/src/util.cpp @@ -244,7 +244,7 @@ bool LogAcceptCategory(const char* category) ptrCategory->insert(string("karmanode")); ptrCategory->insert(string("mnpayments")); ptrCategory->insert(string("zero")); - ptrCategory->insert(string("mnbudget")); + ptrCategory->insert(string("knbudget")); } } const set& setCategories = *ptrCategory.get(); From c0a305beb2e1946cc6166d399a7a0e62e1b0d212 Mon Sep 17 00:00:00 2001 From: Andrew LaChasse Date: Tue, 28 May 2019 17:33:56 -0700 Subject: [PATCH 02/10] Porotocol and Version Bump --- configure.ac | 6 +++--- src/version.h | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/configure.ac b/configure.ac index d7e0c4a..9d38faa 100755 --- a/configure.ac +++ b/configure.ac @@ -1,8 +1,8 @@ dnl require autoconf 2.60 (AS_ECHO/AS_ECHO_N) AC_PREREQ([2.60]) -define(_CLIENT_VERSION_MAJOR, 1) -define(_CLIENT_VERSION_MINOR, 6) -define(_CLIENT_VERSION_REVISION, 1) +define(_CLIENT_VERSION_MAJOR, 3) +define(_CLIENT_VERSION_MINOR, 0) +define(_CLIENT_VERSION_REVISION, 0) define(_CLIENT_VERSION_BUILD, 0) define(_CLIENT_VERSION_IS_RELEASE, true) define(_COPYRIGHT_YEAR, 2019) diff --git a/src/version.h b/src/version.h index 87449a2..60a7837 100755 --- a/src/version.h +++ b/src/version.h @@ -21,8 +21,8 @@ static const int INIT_PROTO_VERSION = 209; static const int GETHEADERS_VERSION = 70077; //! disconnect from peers older than this proto version -static const int MIN_PEER_PROTO_VERSION_BEFORE_ENFORCEMENT = 70910; -static const int MIN_PEER_PROTO_VERSION_AFTER_ENFORCEMENT = 71010; +static const int MIN_PEER_PROTO_VERSION_BEFORE_ENFORCEMENT = 71010; +static const int MIN_PEER_PROTO_VERSION_AFTER_ENFORCEMENT = 71011; static const int MIN_PEER_VERSION_FIXED_SIGTIME = 70004; From 2fe0b4439ccca18912ba90a037bda7a116f23d78 Mon Sep 17 00:00:00 2001 From: Andrew LaChasse Date: Mon, 24 Jun 2019 13:18:05 -0700 Subject: [PATCH 03/10] Protocol Enforcement --- .gitignore | 1 + src/main.cpp | 51 +++++++++++++++++++----------- src/miner.cpp | 4 +-- src/qt/privacydialog.cpp | 20 ++++++------ src/qt/privacydialog.h | 6 ++-- src/qt/res/icons/overview_off.png | Bin 5065 -> 5065 bytes src/rpcwallet.cpp | 6 ++-- src/spork.cpp | 23 ++++++++------ src/spork.h | 26 ++++++++------- src/wallet.cpp | 2 +- src/walletdb.cpp | 4 +-- test/segwit.py | 2 +- 12 files changed, 83 insertions(+), 62 deletions(-) diff --git a/.gitignore b/.gitignore index 343cc25..b2cb8c8 100644 --- a/.gitignore +++ b/.gitignore @@ -172,3 +172,4 @@ doc/Doxyfile src/ohmcoin-cli src/ohmcoin-tx src/ohmcoind +doc/Doxyfile diff --git a/src/main.cpp b/src/main.cpp index db47929..8e3ae13 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -1515,10 +1515,10 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState& state, const CTransa *pfMissingInputs = false; //Temporarily disable zerocoin for maintenance - if (GetAdjustedTime() > GetSporkValue(SPORK_20_ZEROCOIN_MAINTENANCE_MODE) && tx.ContainsZerocoins()) + if (GetAdjustedTime() > GetSporkValue(SPORK_21_ZEROCOIN_MAINTENANCE_MODE) && tx.ContainsZerocoins()) return state.DoS(10, error("AcceptToMemoryPool : Zerocoin transactions are temporarily disabled for maintenance"), REJECT_INVALID, "bad-tx"); - if (!CheckTransaction(tx, chainActive.Height() >= Params().Zerocoin_StartHeight(), true, state, GetSporkValue(SPORK_19_SEGWIT_ACTIVATION) < chainActive.Tip()->nTime)) { + if (!CheckTransaction(tx, chainActive.Height() >= Params().Zerocoin_StartHeight(), true, state, GetSporkValue(SPORK_20_SEGWIT_ACTIVATION) < chainActive.Tip()->nTime)) { return state.DoS(100, error("AcceptToMemoryPool: : CheckTransaction failed"), REJECT_INVALID, "bad-tx"); } @@ -1564,7 +1564,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState& state, const CTransa } // Don't accept witness transactions before the final threshold passes - if (!GetBoolArg("-prematurewitness", false) && !tx.wit.IsNull() && !IsSporkActive(SPORK_19_SEGWIT_ACTIVATION)) { + if (!GetBoolArg("-prematurewitness", false) && !tx.wit.IsNull() && !IsSporkActive(SPORK_20_SEGWIT_ACTIVATION)) { return state.DoS(0, false, REJECT_NONSTANDARD, "no-witness-yet", true); } @@ -1820,7 +1820,7 @@ bool AcceptableInputs(CTxMemPool& pool, CValidationState& state, const CTransact if (pfMissingInputs) *pfMissingInputs = false; - if (!CheckTransaction(tx, chainActive.Height() >= Params().Zerocoin_StartHeight(), true, state, GetSporkValue(SPORK_19_SEGWIT_ACTIVATION) < chainActive.Tip()->nTime)) + if (!CheckTransaction(tx, chainActive.Height() >= Params().Zerocoin_StartHeight(), true, state, GetSporkValue(SPORK_20_SEGWIT_ACTIVATION) < chainActive.Tip()->nTime)) return error("AcceptableInputs: : CheckTransaction failed"); // Coinbase is only valid in a block, not as a loose transaction @@ -3253,7 +3253,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin vector vSpendsInBlock; uint256 hashBlock = block.GetHash(); - if (GetSporkValue(SPORK_19_SEGWIT_ACTIVATION) < block.nTime) { + if (GetSporkValue(SPORK_20_SEGWIT_ACTIVATION) < block.nTime) { flags |= SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY | SCRIPT_VERIFY_CHECKSEQUENCEVERIFY; } @@ -3263,7 +3263,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin nInputs += tx.vin.size(); //Temporarily disable zerocoin transactions for maintenance - if (block.nTime > GetSporkValue(SPORK_20_ZEROCOIN_MAINTENANCE_MODE) && !IsInitialBlockDownload() && tx.ContainsZerocoins()) { + if (block.nTime > GetSporkValue(SPORK_21_ZEROCOIN_MAINTENANCE_MODE) && !IsInitialBlockDownload() && tx.ContainsZerocoins()) { return state.DoS(100, error("ConnectBlock() : zerocoin transactions are currently in maintenance mode")); } if (tx.IsZerocoinSpend()) { @@ -4393,7 +4393,7 @@ bool CheckBlock(const CBlock& block, CValidationState& state, bool fCheckPOW, bo if (block.IsProofOfStake()) { int commitpos = GetWitnessCommitmentIndex(block); if (commitpos >= 0) { - if (IsSporkActive(SPORK_21_SEGWIT_ON_COINBASE)) { + if (IsSporkActive(SPORK_22_SEGWIT_ON_COINBASE)) { if (block.vtx[0].vout.size() != 2) return state.DoS(100, error("CheckBlock() : coinbase output has wrong size for proof-of-stake block")); if (!block.vtx[0].vout[1].scriptPubKey.IsUnspendable()) @@ -4591,7 +4591,7 @@ void UpdateUncommittedBlockStructures(CBlock& block, const CBlockIndex* pindexPr { int commitpos = GetWitnessCommitmentIndex(block); static const std::vector nonce(32, 0x00); - if (commitpos != -1 && GetSporkValue(SPORK_19_SEGWIT_ACTIVATION) < pindexPrev->nTime && block.vtx[0].wit.IsEmpty()) { + if (commitpos != -1 && GetSporkValue(SPORK_20_SEGWIT_ACTIVATION) < pindexPrev->nTime && block.vtx[0].wit.IsEmpty()) { block.vtx[0].wit.vtxinwit.resize(1); block.vtx[0].wit.vtxinwit[0].scriptWitness.stack.resize(1); block.vtx[0].wit.vtxinwit[0].scriptWitness.stack[0] = nonce; @@ -4610,7 +4610,7 @@ std::vector GenerateCoinbaseCommitment(CBlock& block, const CBloc } } std::vector ret(32, 0x00); - if (fHaveWitness && GetSporkValue(SPORK_19_SEGWIT_ACTIVATION) < pindexPrev->nTime) { + if (fHaveWitness && GetSporkValue(SPORK_20_SEGWIT_ACTIVATION) < pindexPrev->nTime) { if (commitpos == -1) { uint256 witnessroot = BlockWitnessMerkleRoot(block, NULL); CHash256().Write(witnessroot.begin(), 32).Write(&ret[0], 32).Finalize(witnessroot.begin()); @@ -4669,7 +4669,7 @@ bool ContextualCheckBlock(const CBlock& block, CValidationState& state, CBlockIn vector vBlockSerials; for (const CTransaction& tx : block.vtx) { - if (!CheckTransaction(tx, true, chainActive.Height() + 1 >= Params().Zerocoin_StartHeight(), state, GetSporkValue(SPORK_19_SEGWIT_ACTIVATION) < block.nTime)) + if (!CheckTransaction(tx, true, chainActive.Height() + 1 >= Params().Zerocoin_StartHeight(), state, GetSporkValue(SPORK_20_SEGWIT_ACTIVATION) < block.nTime)) return error("CheckBlock() : CheckTransaction failed"); // double check that there are no double spent zOHMC spends in this block @@ -4717,10 +4717,10 @@ bool ContextualCheckBlock(const CBlock& block, CValidationState& state, CBlockIn // {0xaa, 0x21, 0xa9, 0xed}, and the following 32 bytes are SHA256(witness root, witness nonce). In case there are // multiple, the last one is used. bool fHaveWitness = false; - if (GetSporkValue(SPORK_19_SEGWIT_ACTIVATION) < pindexPrev->nTime) { + if (GetSporkValue(SPORK_20_SEGWIT_ACTIVATION) < pindexPrev->nTime) { int commitpos = GetWitnessCommitmentIndex(block); if (commitpos != -1) { - if (!IsSporkActive(SPORK_21_SEGWIT_ON_COINBASE)) { + if (!IsSporkActive(SPORK_22_SEGWIT_ON_COINBASE)) { if (fDebug) { LogPrintf("CheckBlock() : staking-on-segwit is not enabled.\n"); } @@ -5407,7 +5407,7 @@ bool RewindBlockIndex(const CChainParams& params) int nHeight = 1; while (nHeight <= chainActive.Height()) { - if (GetSporkValue(SPORK_19_SEGWIT_ACTIVATION) < chainActive[nHeight - 1]->nTime && !(chainActive[nHeight]->nStatus & BLOCK_OPT_WITNESS)) { + if (GetSporkValue(SPORK_20_SEGWIT_ACTIVATION) < chainActive[nHeight - 1]->nTime && !(chainActive[nHeight]->nStatus & BLOCK_OPT_WITNESS)) { break; } nHeight++; @@ -5430,7 +5430,7 @@ bool RewindBlockIndex(const CChainParams& params) // to disk before writing the chainstate, resulting in a failure to continue if interrupted. for (BlockMap::iterator it = mapBlockIndex.begin(); it != mapBlockIndex.end(); it++) { CBlockIndex* pindexIter = it->second; - if (GetSporkValue(SPORK_19_SEGWIT_ACTIVATION) < pindexIter->nTime && !(pindexIter->nStatus & BLOCK_OPT_WITNESS)) { + if (GetSporkValue(SPORK_20_SEGWIT_ACTIVATION) < pindexIter->nTime && !(pindexIter->nStatus & BLOCK_OPT_WITNESS)) { // Reduce validity pindexIter->nStatus = std::min(pindexIter->nStatus & BLOCK_VALID_MASK, BLOCK_VALID_TREE) | (pindexIter->nStatus & ~BLOCK_VALID_MASK); // Remove have-data flags. @@ -6212,7 +6212,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, // Ohmcoin: We use certain sporks during IBD, so check to see if they are // available. If not, ask the first peer connected for them. - bool fMissingSporks = !pSporkDB->SporkExists(SPORK_20_ZEROCOIN_MAINTENANCE_MODE); + bool fMissingSporks = !pSporkDB->SporkExists(SPORK_21_ZEROCOIN_MAINTENANCE_MODE); if (fMissingSporks || !fRequestedSporksIDB){ LogPrintf("asking peer for sporks\n"); @@ -6398,7 +6398,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, // doing this will result in the received block being rejected as an orphan in case it is // not a direct successor. if (State(pfrom->GetId())->fHaveWitness && - (GetSporkValue(SPORK_19_SEGWIT_ACTIVATION) > chainActive.Tip()->nTime || State(pfrom->GetId())->fHaveWitness)) { + (GetSporkValue(SPORK_20_SEGWIT_ACTIVATION) > chainActive.Tip()->nTime || State(pfrom->GetId())->fHaveWitness)) { inv.type = MSG_WITNESS_BLOCK; } vToFetch.push_back(inv); @@ -7024,8 +7024,23 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, // Those old clients won't react to the changes of the other (new) SPORK because at the time of their implementation // it was the one which was commented out int ActiveProtocol() + +// SPORK_17 was used for 71010. Leave it 'ON' so they don't see < 70711 nodes. They won't react to SPORK_15 + // messages because it's not in their code +/* + if (IsSporkActive(SPORK_16_NEW_PROTOCOL_ENFORCEMENT_3)) { + if (chainActive.Tip()->nHeight >= Params().ModifierUpgradeBlock()) + return MIN_PEER_PROTO_VERSION_AFTER_ENFORCEMENT; + } + return MIN_PEER_PROTO_VERSION_BEFORE_ENFORCEMENT; +*/ + + + // SPORK_17 is used for 71011. Nodes < 71010 won't see it and still get their protocol version via SPORK_17 and their + // own ModifierUpgradeBlock() + { - if (IsSporkActive(SPORK_16_NEW_PROTOCOL_ENFORCEMENT_3)) + if (IsSporkActive(SPORK_18_NEW_PROTOCOL_ENFORCEMENT_5)) return MIN_PEER_PROTO_VERSION_AFTER_ENFORCEMENT; return MIN_PEER_PROTO_VERSION_BEFORE_ENFORCEMENT; } @@ -7331,7 +7346,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle) NodeId staller = -1; FindNextBlocksToDownload(pto->GetId(), MAX_BLOCKS_IN_TRANSIT_PER_PEER - state.nBlocksInFlight, vToDownload, staller); BOOST_FOREACH(CBlockIndex *pindex, vToDownload) { - if (State(pto->GetId())->fHaveWitness || GetSporkValue(SPORK_19_SEGWIT_ACTIVATION) > pindex->pprev->nTime) { + if (State(pto->GetId())->fHaveWitness || GetSporkValue(SPORK_20_SEGWIT_ACTIVATION) > pindex->pprev->nTime) { vGetData.push_back(CInv(State(staller)->fHaveWitness ? MSG_WITNESS_BLOCK : MSG_BLOCK, pindex->GetBlockHash())); MarkBlockAsInFlight(pto->GetId(), pindex->GetBlockHash(), pindex); LogPrint("net", "Requesting block %s (%d) peer=%d\n", pindex->GetBlockHash().ToString(), diff --git a/src/miner.cpp b/src/miner.cpp index 3a9982f..0f7f528 100755 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -118,7 +118,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn, CWallet* pwallet, // -promiscuousmempoolflags is used. // TODO: replace this with a call to main to assess validity of a mempool // transaction (which in most cases can be a no-op). - bool fIncludeWitness = IsSporkActive(SPORK_19_SEGWIT_ACTIVATION); + bool fIncludeWitness = IsSporkActive(SPORK_20_SEGWIT_ACTIVATION); // Make sure to create the correct block version after zerocoin is enabled bool fZerocoinActive = chainActive.Height() >= Params().Zerocoin_StartHeight(); @@ -225,7 +225,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn, CWallet* pwallet, if (tx.IsCoinBase() || tx.IsCoinStake() || !IsFinalTx(tx, nHeight)){ continue; } - if(GetAdjustedTime() > GetSporkValue(SPORK_20_ZEROCOIN_MAINTENANCE_MODE) && tx.ContainsZerocoins()){ + if(GetAdjustedTime() > GetSporkValue(SPORK_21_ZEROCOIN_MAINTENANCE_MODE) && tx.ContainsZerocoins()){ continue; } diff --git a/src/qt/privacydialog.cpp b/src/qt/privacydialog.cpp index f7e4f4c..4c68c56 100755 --- a/src/qt/privacydialog.cpp +++ b/src/qt/privacydialog.cpp @@ -36,7 +36,7 @@ PrivacyDialog::PrivacyDialog(QWidget* parent) : QDialog(parent), ui->payTo->setAttribute(Qt::WA_MacShowFocusRect, 0); ui->addAsLabel->setAttribute(Qt::WA_MacShowFocusRect, 0); ui->zOHMCpayAmount->setAttribute(Qt::WA_MacShowFocusRect, 0); - + // "Spending 999999 zOHMC ought to be enough for anybody." - Bill Gates, 2017 ui->zOHMCpayAmount->setValidator( new QDoubleValidator(0.0, 21000000.0, 20, this) ); @@ -113,8 +113,8 @@ PrivacyDialog::PrivacyDialog(QWidget* parent) : QDialog(parent), ui->WarningLabel->hide(); // Explanatory text visible in QT-Creator ui->dummyHideWidget->hide(); // Dummy widget with elements to hide - // Set labels/buttons depending on SPORK_16 status - updateSPORK16Status(); + // Set labels/buttons depending on SPORK_18 status + updateSPORK18Status(); } PrivacyDialog::~PrivacyDialog() @@ -162,7 +162,7 @@ void PrivacyDialog::on_pushButtonMintzOHMC_clicked() if (!walletModel || !walletModel->getOptionsModel()) return; - if(GetAdjustedTime() > GetSporkValue(SPORK_20_ZEROCOIN_MAINTENANCE_MODE)) { + if(GetAdjustedTime() > GetSporkValue(SPORK_21_ZEROCOIN_MAINTENANCE_MODE)) { QMessageBox::information(this, tr("Mint Zerocoin"), tr("zOHMC is currently undergoing maintenance."), QMessageBox::Ok, QMessageBox::Ok); @@ -272,7 +272,7 @@ void PrivacyDialog::on_pushButtonSpendzOHMC_clicked() if (!walletModel || !walletModel->getOptionsModel() || !pwalletMain) return; - if(GetAdjustedTime() > GetSporkValue(SPORK_20_ZEROCOIN_MAINTENANCE_MODE)) { + if(GetAdjustedTime() > GetSporkValue(SPORK_21_ZEROCOIN_MAINTENANCE_MODE)) { QMessageBox::information(this, tr("Mint Zerocoin"), tr("zOHMC is currently undergoing maintenance."), QMessageBox::Ok, QMessageBox::Ok); return; @@ -644,8 +644,8 @@ void PrivacyDialog::setBalance(const CAmount& balance, const CAmount& unconfirme int64_t nImmature = 0; QString strDenomStats, strUnconfirmed = ""; - // Update/enable labels and buttons depending on the current SPORK_16 status - updateSPORK16Status(); + // Update/enable labels and buttons depending on the current SPORK_18 status + updateSPORK18Status(); for (const auto& denom : libzerocoin::zerocoinDenomList) { nCoins = libzerocoin::ZerocoinDenominationToInt(denom); @@ -735,11 +735,11 @@ void PrivacyDialog::keyPressEvent(QKeyEvent* event) } } -void PrivacyDialog::updateSPORK16Status() +void PrivacyDialog::updateSPORK18Status() { - // Update/enable labels, buttons and tooltips depending on the current SPORK_16 status + // Update/enable labels, buttons and tooltips depending on the current SPORK_18 status bool fButtonsEnabled = ui->pushButtonMintzOHMC->isEnabled(); - bool fMaintenanceMode = GetAdjustedTime() > GetSporkValue(SPORK_20_ZEROCOIN_MAINTENANCE_MODE); + bool fMaintenanceMode = GetAdjustedTime() > GetSporkValue(SPORK_21_ZEROCOIN_MAINTENANCE_MODE); if (fMaintenanceMode && fButtonsEnabled) { // Mint zOHMC ui->pushButtonMintzOHMC->setEnabled(false); diff --git a/src/qt/privacydialog.h b/src/qt/privacydialog.h index 14280cc..0faebb0 100644 --- a/src/qt/privacydialog.h +++ b/src/qt/privacydialog.h @@ -49,7 +49,7 @@ class PrivacyDialog : public QDialog void setZOhmcControlLabels(int64_t nAmount, int nQuantity); public slots: - void setBalance(const CAmount& balance, const CAmount& unconfirmedBalance, const CAmount& immatureBalance, + void setBalance(const CAmount& balance, const CAmount& unconfirmedBalance, const CAmount& immatureBalance, const CAmount& zerocoinBalance, const CAmount& unconfirmedZerocoinBalance, const CAmount& immatureZerocoinBalance, const CAmount& watchOnlyBalance, const CAmount& watchUnconfBalance, const CAmount& watchImmatureBalance); protected: @@ -70,7 +70,7 @@ public slots: CAmount currentWatchOnlyBalance; CAmount currentWatchUnconfBalance; CAmount currentWatchImmatureBalance; - + int nSecurityLevel = 0; bool fMinimizeChange = false; @@ -103,7 +103,7 @@ private slots: void on_pushButtonZOhmcControl_clicked(); void on_pasteButton_clicked(); void updateDisplayUnit(); - void updateSPORK16Status(); + void updateSPORK18Status(); }; #endif // BITCOIN_QT_PRIVACYDIALOG_H diff --git a/src/qt/res/icons/overview_off.png b/src/qt/res/icons/overview_off.png index 215589c8415a67e9499f020b18eb25b2b28f1e51..316d38a344ab8557542e52f5b6a80f3584336bd0 100644 GIT binary patch delta 787 zcmX@9eo}pcX8r&F|8vUf1`O2?pxq#=>j%#3V4v3ySja;Hex!##J23p;9+|gtvljDw F0RR>1YHk1k delta 787 mcmX@9eo}pcWHZN!+#({fE{T0v-#H2o3)td3jhFYP6-77 diff --git a/src/rpcwallet.cpp b/src/rpcwallet.cpp index f76cbf3..8f1f8ea 100755 --- a/src/rpcwallet.cpp +++ b/src/rpcwallet.cpp @@ -1079,7 +1079,7 @@ UniValue addwitnessaddress(const UniValue& params, bool fHelp) throw runtime_error(msg); } - if (!IsSporkActive(SPORK_19_SEGWIT_ACTIVATION) && !GetBoolArg("-walletprematurewitness", false)) { + if (!IsSporkActive(SPORK_20_SEGWIT_ACTIVATION) && !GetBoolArg("-walletprematurewitness", false)) { throw JSONRPCError(RPC_WALLET_ERROR, "Segregated witness not enabled on network"); } @@ -2712,7 +2712,7 @@ UniValue mintzerocoin(const UniValue& params, bool fHelp) } int64_t nTime = GetTimeMillis(); - if(GetAdjustedTime() > GetSporkValue(SPORK_20_ZEROCOIN_MAINTENANCE_MODE)) + if(GetAdjustedTime() > GetSporkValue(SPORK_21_ZEROCOIN_MAINTENANCE_MODE)) throw JSONRPCError(RPC_WALLET_ERROR, "zOHMC is currently disabled due to maintenance."); EnsureWalletIsUnlocked(true); @@ -2820,7 +2820,7 @@ UniValue spendzerocoin(const UniValue& params, bool fHelp) LOCK2(cs_main, pwalletMain->cs_wallet); - if(GetAdjustedTime() > GetSporkValue(SPORK_20_ZEROCOIN_MAINTENANCE_MODE)) + if(GetAdjustedTime() > GetSporkValue(SPORK_21_ZEROCOIN_MAINTENANCE_MODE)) throw JSONRPCError(RPC_WALLET_ERROR, "zOHMC is currently disabled due to maintenance."); int64_t nTimeStart = GetTimeMillis(); diff --git a/src/spork.cpp b/src/spork.cpp index a258a52..08fff7e 100755 --- a/src/spork.cpp +++ b/src/spork.cpp @@ -131,10 +131,11 @@ int64_t GetSporkValue(int nSporkID) if (nSporkID == SPORK_15_NEW_PROTOCOL_ENFORCEMENT_2) r = SPORK_15_NEW_PROTOCOL_ENFORCEMENT_2_DEFAULT; if (nSporkID == SPORK_16_NEW_PROTOCOL_ENFORCEMENT_3) r = SPORK_16_NEW_PROTOCOL_ENFORCEMENT_3_DEFAULT; if (nSporkID == SPORK_17_NEW_PROTOCOL_ENFORCEMENT_4) r = SPORK_17_NEW_PROTOCOL_ENFORCEMENT_4_DEFAULT; - if (nSporkID == SPORK_18_MN_WINNER_MINIMUM_AGE) r = SPORK_18_MN_WINNER_MINIMUM_AGE_DEFAULT; - if (nSporkID == SPORK_19_SEGWIT_ACTIVATION) r = SPORK_19_SEGWIT_ACTIVATION_DEFAULT; - if (nSporkID == SPORK_20_ZEROCOIN_MAINTENANCE_MODE) r = SPORK_20_ZEROCOIN_MAINTENANCE_MODE_DEFAULT; - if (nSporkID == SPORK_21_SEGWIT_ON_COINBASE) r = SPORK_21_SEGWIT_ON_COINBASE_DEFAULT; + if (nSporkID == SPORK_18_NEW_PROTOCOL_ENFORCEMENT_5) r = SPORK_18_NEW_PROTOCOL_ENFORCEMENT_5_DEFAULT; + if (nSporkID == SPORK_19_MN_WINNER_MINIMUM_AGE) r = SPORK_19_MN_WINNER_MINIMUM_AGE_DEFAULT; + if (nSporkID == SPORK_20_SEGWIT_ACTIVATION) r = SPORK_20_SEGWIT_ACTIVATION_DEFAULT; + if (nSporkID == SPORK_21_ZEROCOIN_MAINTENANCE_MODE) r = SPORK_21_ZEROCOIN_MAINTENANCE_MODE_DEFAULT; + if (nSporkID == SPORK_22_SEGWIT_ON_COINBASE) r = SPORK_22_SEGWIT_ON_COINBASE_DEFAULT; if (r == -1) LogPrintf("GetSpork::Unknown Spork %d\n", nSporkID); @@ -276,9 +277,10 @@ int CSporkManager::GetSporkIDByName(std::string strName) if (strName == "SPORK_15_NEW_PROTOCOL_ENFORCEMENT_2") return SPORK_15_NEW_PROTOCOL_ENFORCEMENT_2; if (strName == "SPORK_16_NEW_PROTOCOL_ENFORCEMENT_3") return SPORK_16_NEW_PROTOCOL_ENFORCEMENT_3; if (strName == "SPORK_17_NEW_PROTOCOL_ENFORCEMENT_4") return SPORK_17_NEW_PROTOCOL_ENFORCEMENT_4; - if (strName == "SPORK_18_MN_WINNER_MINIMUM_AGE") return SPORK_18_MN_WINNER_MINIMUM_AGE; - if (strName == "SPORK_19_SEGWIT_ACTIVATION") return SPORK_19_SEGWIT_ACTIVATION; - if (strName == "SPORK_20_ZEROCOIN_MAINTENANCE_MODE") return SPORK_19_SEGWIT_ACTIVATION; + if (strName == "SPORK_18_NEW_PROTOCOL_ENFORCEMENT_5") return SPORK_18_NEW_PROTOCOL_ENFORCEMENT_5; + if (strName == "SPORK_19_MN_WINNER_MINIMUM_AGE") return SPORK_19_MN_WINNER_MINIMUM_AGE; + if (strName == "SPORK_20_SEGWIT_ACTIVATION") return SPORK_20_SEGWIT_ACTIVATION; + if (strName == "SPORK_21_ZEROCOIN_MAINTENANCE_MODE") return SPORK_21_ZEROCOIN_MAINTENANCE_MODE; return -1; } @@ -297,9 +299,10 @@ std::string CSporkManager::GetSporkNameByID(int id) if (id == SPORK_15_NEW_PROTOCOL_ENFORCEMENT_2) return "SPORK_15_NEW_PROTOCOL_ENFORCEMENT_2"; if (id == SPORK_16_NEW_PROTOCOL_ENFORCEMENT_3) return "SPORK_16_NEW_PROTOCOL_ENFORCEMENT_3"; if (id == SPORK_17_NEW_PROTOCOL_ENFORCEMENT_4) return "SPORK_17_NEW_PROTOCOL_ENFORCEMENT_4"; - if (id == SPORK_18_MN_WINNER_MINIMUM_AGE) return "SPORK_18_MN_WINNER_MINIMUM_AGE"; - if (id == SPORK_19_SEGWIT_ACTIVATION) return "SPORK_19_SEGWIT_ACTIVATION"; - if (id == SPORK_20_ZEROCOIN_MAINTENANCE_MODE) return "SPORK_20_ZEROCOIN_MAINTENANCE_MODE"; + if (id == SPORK_18_NEW_PROTOCOL_ENFORCEMENT_5) return "SPORK_18_NEW_PROTOCOL_ENFORCEMENT_5"; + if (id == SPORK_19_MN_WINNER_MINIMUM_AGE) return "SPORK_19_MN_WINNER_MINIMUM_AGE"; + if (id == SPORK_20_SEGWIT_ACTIVATION) return "SPORK_20_SEGWIT_ACTIVATION"; + if (id == SPORK_21_ZEROCOIN_MAINTENANCE_MODE) return "SPORK_21_ZEROCOIN_MAINTENANCE_MODE"; return "Unknown"; } diff --git a/src/spork.h b/src/spork.h index 2d39212..10b4cb0 100755 --- a/src/spork.h +++ b/src/spork.h @@ -43,10 +43,11 @@ using namespace boost; #define SPORK_15_NEW_PROTOCOL_ENFORCEMENT_2 10014 #define SPORK_16_NEW_PROTOCOL_ENFORCEMENT_3 10015 #define SPORK_17_NEW_PROTOCOL_ENFORCEMENT_4 10016 -#define SPORK_18_MN_WINNER_MINIMUM_AGE 10017 -#define SPORK_19_SEGWIT_ACTIVATION 10018 -#define SPORK_20_ZEROCOIN_MAINTENANCE_MODE 10019 -#define SPORK_21_SEGWIT_ON_COINBASE 10020 +#define SPORK_18_NEW_PROTOCOL_ENFORCEMENT_5 10017 +#define SPORK_19_MN_WINNER_MINIMUM_AGE 10018 +#define SPORK_20_SEGWIT_ACTIVATION 10019 +#define SPORK_21_ZEROCOIN_MAINTENANCE_MODE 10020 +#define SPORK_22_SEGWIT_ON_COINBASE 10021 #define SPORK_2_SWIFTTX_DEFAULT 978307200 //2001-1-1 #define SPORK_3_SWIFTTX_BLOCK_FILTERING_DEFAULT 1424217600 //2015-2-18 @@ -57,16 +58,17 @@ using namespace boost; #define SPORK_10_KARMANODE_PAY_UPDATED_NODES_DEFAULT 4070908800 //OFF //#define SPORK_11_LOCK_INVALID_UTXO_DEFAULT 4070908800 //OFF - NOTE: this is block height not time! #define SPORK_13_ENABLE_SUPERBLOCKS_DEFAULT 4070908800 //OFF -#define SPORK_14_NEW_PROTOCOL_ENFORCEMENT_DEFAULT 4070908800 //OFF -#define SPORK_15_NEW_PROTOCOL_ENFORCEMENT_2_DEFAULT 4070908800 //OFF -#define SPORK_16_NEW_PROTOCOL_ENFORCEMENT_3_DEFAULT 4070908800 //OFF -#define SPORK_17_NEW_PROTOCOL_ENFORCEMENT_4_DEFAULT 4070908800 //OFF -#define SPORK_18_MN_WINNER_MINIMUM_AGE_DEFAULT 8000 // Age in seconds. This should be > KARMANODE_REMOVAL_SECONDS to avoid +#define SPORK_14_NEW_PROTOCOL_ENFORCEMENT_DEFAULT 4070908800 //ON +#define SPORK_15_NEW_PROTOCOL_ENFORCEMENT_2_DEFAULT 4070908800 //ON +#define SPORK_16_NEW_PROTOCOL_ENFORCEMENT_3_DEFAULT 4070908800 //ON +#define SPORK_17_NEW_PROTOCOL_ENFORCEMENT_4_DEFAULT 4070908800 //ON +#define SPORK_18_NEW_PROTOCOL_ENFORCEMENT_5_DEFAULT 4070908800 //OFF +#define SPORK_19_MN_WINNER_MINIMUM_AGE_DEFAULT 8000 // Age in seconds. This should be > KARMANODE_REMOVAL_SECONDS to avoid // misconfigured new nodes in the list. // Set this to zero to emulate classic behaviour -#define SPORK_19_SEGWIT_ACTIVATION_DEFAULT 4070908800 //OFF -#define SPORK_20_ZEROCOIN_MAINTENANCE_MODE_DEFAULT 4070908800 //OFF -#define SPORK_21_SEGWIT_ON_COINBASE_DEFAULT 4070908800 //OFF +#define SPORK_20_SEGWIT_ACTIVATION_DEFAULT 4070908800 //OFF +#define SPORK_21_ZEROCOIN_MAINTENANCE_MODE_DEFAULT 4070908800 //OFF +#define SPORK_22_SEGWIT_ON_COINBASE_DEFAULT 4070908800 //OFF class CSporkMessage; class CSporkManager; diff --git a/src/wallet.cpp b/src/wallet.cpp index 696a565..57ff578 100755 --- a/src/wallet.cpp +++ b/src/wallet.cpp @@ -3965,7 +3965,7 @@ bool CWallet::GetDestData(const CTxDestination& dest, const std::string& key, st void CWallet::AutoZeromint() { // Don't bother Autominting if Zerocoin Protocol isn't active - if (GetAdjustedTime() > GetSporkValue(SPORK_20_ZEROCOIN_MAINTENANCE_MODE)) return; + if (GetAdjustedTime() > GetSporkValue(SPORK_21_ZEROCOIN_MAINTENANCE_MODE)) return; // Wait until blockchain + karmanodes are fully synced and wallet is unlocked. if (!karmanodeSync.IsSynced() || IsLocked()){ diff --git a/src/walletdb.cpp b/src/walletdb.cpp index 456ab96..11e9408 100755 --- a/src/walletdb.cpp +++ b/src/walletdb.cpp @@ -442,7 +442,7 @@ bool ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue, CW ssValue >> wtx; CValidationState state; // false because there is no reason to go through the zerocoin checks for our own wallet - if (!(CheckTransaction(wtx, false, false, state, IsSporkActive(SPORK_19_SEGWIT_ACTIVATION)) && (wtx.GetHash() == hash) && state.IsValid())) + if (!(CheckTransaction(wtx, false, false, state, IsSporkActive(SPORK_20_SEGWIT_ACTIVATION)) && (wtx.GetHash() == hash) && state.IsValid())) return false; // Undo serialize changes in 31600 @@ -1514,7 +1514,7 @@ std::list CWalletDB::ListSpentCoinsSerial() { std::list listPubCoin; std::list listCoins = ListSpentCoins(); - + for ( auto& coin : listCoins) { listPubCoin.push_back(coin.GetSerial()); } diff --git a/test/segwit.py b/test/segwit.py index 74642ad..fad6956 100644 --- a/test/segwit.py +++ b/test/segwit.py @@ -197,7 +197,7 @@ def run_test(self): # enable segwit through spork system for node in self.nodes: - node.spork("SPORK_19_SEGWIT_ACTIVATION", int(time.time() - 100)) + node.spork("SPORK_20_SEGWIT_ACTIVATION", int(time.time() - 100)) print("Verify previous witness txs skipped for mining can now be mined") assert_equal(len(self.nodes[2].getrawmempool()), 4) From 387dcb19d2264807cb999a4e4a36b06831e2a3bf Mon Sep 17 00:00:00 2001 From: Andrew LaChasse Date: Mon, 24 Jun 2019 15:03:40 -0700 Subject: [PATCH 04/10] Fix typo --- test/test_framework/util.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_framework/util.py b/test/test_framework/util.py index 04ea455..d2da6fd 100644 --- a/test/test_framework/util.py +++ b/test/test_framework/util.py @@ -51,7 +51,7 @@ class PortSeed: def enable_mocktime(): #For backwared compatibility of the python scripts - #with previous versions of the cache, set MOCKTIME + #with previous versions of the cache, set MOCKTIME #to Jan 1, 2014 + (201 * 10 * 60) global MOCKTIME MOCKTIME = 1388534400 + (201 * 10 * 60) @@ -317,7 +317,7 @@ def start_node(i, dirname, extra_args=None, rpchost=None, timewait=None, binary= if extra_args is not None: args.extend(extra_args) ohmcoind_processes[i] = subprocess.Popen(args) if os.getenv("PYTHON_DEBUG", ""): - print("start_node: ohmcoed started, waiting for RPC to come up") + print("start_node: ohmcoind started, waiting for RPC to come up") url = rpc_url(i, rpchost) wait_for_ohmcoind_start(ohmcoind_processes[i], url, i) if os.getenv("PYTHON_DEBUG", ""): From 12b751423526b96814e9db95b45960796be52de9 Mon Sep 17 00:00:00 2001 From: Ra's Al Ghul Date: Mon, 24 Jun 2019 16:19:36 -0700 Subject: [PATCH 05/10] Update Segwit and Zerocoin (#47) * Added all of the code for the update * Fix URL Path * Fixed default directory path * Change masternode declarations to karmanode * change to ohmcoin * Create .gitignore * Update .gitignore * Update .gitignore * karmanodefy * Update proposallist.cpp * Missing class * Docs Masternode to karmanode * Change mn(masternode) to kn(karmanode) * Update doc and comment collateral * More doc updates * Fixed Karmanode references in proposal related files. * Ckarmanode -> CKarmanode * Karmanodefy Budget System * Porotocol and Version Bump * Protocol Enforcement * Fix typo * Spork fixes --- .github/ISSUE_TEMPLATE.md | 6 +- .gitignore | 12 +- .travis.yml | 44 +- .travis/github_deploy_key.enc | Bin 3248 -> 0 bytes CONTRIBUTING.md | 20 +- COPYING | 4 +- Dockerfile | 23 + INSTALL | 6 +- LICENSE | 21 + Makefile.am | 72 +- README.md | 75 +- autogen.sh | 6 + build-aux/m4/ax_boost_base.m4 | 18 +- build-aux/m4/ax_boost_program_options.m4 | 7 +- build-aux/m4/ax_boost_system.m4 | 5 +- build-aux/m4/ax_check_compile_flag.m4 | 12 +- build-aux/m4/ax_check_link_flag.m4 | 13 +- build-aux/m4/ax_check_preproc_flag.m4 | 12 +- build-aux/m4/ax_cxx_compile_stdcxx.m4 | 7 +- build-aux/m4/ax_gcc_func_attribute.m4 | 8 +- build-aux/m4/ax_pthread.m4 | 385 +- build-aux/m4/bitcoin_find_bdb48.m4 | 124 +- build-aux/m4/bitcoin_qt.m4 | 231 +- build-aux/m4/bitcoin_subdir_to_include.m4 | 4 + build-aux/m4/l_atomic.m4 | 46 + changelog.md | 6 - configure.ac | 480 +- contrib/bitrpc/bitrpc.py | 4 +- contrib/debian/README.md | 16 +- contrib/debian/changelog | 4 +- contrib/debian/control | 26 +- .../debian/examples/{ohmc.conf => phore.conf} | 24 +- .../debian/manpages/{ohmc-qt.1 => phore-qt.1} | 39 +- .../manpages/{ohmc.conf.5 => phore.conf.5} | 23 +- contrib/debian/manpages/{ohmcd.1 => phored.1} | 63 +- contrib/debian/ohmcd.bash-completion | 1 - contrib/debian/ohmcd.examples | 1 - contrib/debian/ohmcd.install | 2 - contrib/debian/ohmcd.manpages | 2 - .../{ohmc-qt.desktop => phore-qt.desktop} | 6 +- .../{ohmc-qt.install => phore-qt.install} | 6 +- ...n-overrides => phore-qt.lintian-overrides} | 2 +- .../{ohmc-qt.protocol => phore-qt.protocol} | 4 +- contrib/debian/phored.bash-completion | 1 + contrib/debian/phored.examples | 1 + contrib/debian/phored.install | 2 + ...ian-overrides => phored.lintian-overrides} | 2 +- contrib/debian/phored.manpages | 2 + contrib/debian/rules | 6 +- contrib/devtools/README.md | 33 +- contrib/devtools/check-doc.py | 4 +- contrib/devtools/logprint-scanner.py | 98 + contrib/devtools/split-debug.sh | 10 - contrib/devtools/update-translations.py | 2 +- contrib/gitian-build.sh | 117 +- contrib/gitian-descriptors/README.md | 4 +- contrib/gitian-descriptors/gitian-aarch64.yml | 171 + contrib/gitian-descriptors/gitian-linux.yml | 16 +- .../gitian-descriptors/gitian-osx-signer.yml | 12 +- contrib/gitian-descriptors/gitian-osx.yml | 14 +- contrib/gitian-descriptors/gitian-rpi2.yml | 12 +- .../gitian-descriptors/gitian-win-signer.yml | 8 +- contrib/gitian-descriptors/gitian-win.yml | 27 +- contrib/gitian-downloader/aschildbach-key.pgp | Bin 0 -> 1993 bytes contrib/gitian-downloader/bluematt-key.pgp | Bin 0 -> 4113 bytes contrib/gitian-downloader/cfields-key.pgp | 52 + contrib/gitian-downloader/devrandom-key.pgp | Bin 0 -> 2213 bytes .../gitian-downloader/gavinandresen-key.pgp | Bin 0 -> 1176 bytes contrib/gitian-downloader/laanwj-key.pgp | 28 + .../gitian-downloader/linux-download-config | 42 + contrib/gitian-downloader/luke-jr-key.pgp | Bin 0 -> 7325 bytes contrib/gitian-downloader/michagogo-key.pgp | 59 + contrib/gitian-downloader/sipa-key.pgp | Bin 0 -> 109480 bytes contrib/gitian-downloader/tcatm-key.pgp | Bin 0 -> 1554 bytes .../gitian-downloader/win32-download-config | 42 + contrib/gitian-downloader/wtogami-key.pgp | 131 + contrib/gitian-keys/blondfrogs-key.gpg | 52 + contrib/gitian-keys/fuzzbawls-key.gpg | 388 - contrib/gitian-keys/jonspock-key.gpg | 51 - contrib/gitian-keys/meyer9-key.gpg | 29 + contrib/gitian-keys/mrs-x-key.gpg | 52 - contrib/gitian-keys/presstab-key.gpg | 30 - contrib/gitian-keys/s3v3nh4cks-key.gpg | 52 - contrib/init/README.md | 10 +- contrib/init/ohmcd.openrcconf | 26 - contrib/init/ohmcd.service | 26 - contrib/init/{ohmcd.conf => phored.conf} | 22 +- contrib/init/{ohmcd.init => phored.init} | 24 +- contrib/init/{ohmcd.openrc => phored.openrc} | 28 +- contrib/init/phored.openrcconf | 26 + contrib/init/phored.service | 26 + contrib/linearize/example-linearize.cfg | 2 +- contrib/linearize/linearize-hashes.py | 2 +- contrib/macdeploy/README.md | 2 +- contrib/macdeploy/custom_dsstore.py | 2 +- contrib/macdeploy/detached-sig-apply.sh | 2 +- contrib/macdeploy/detached-sig-create.sh | 2 +- contrib/macdeploy/extract-osx-sdk.sh | 34 + contrib/macdeploy/fancy.plist | 2 +- contrib/macdeploy/libboost_system-mt.dylib | Bin 24972 -> 0 bytes contrib/macdeploy/macdeployqtplus | 18 +- contrib/{ohmc-qt.pro => ohmcoin-qt.pro} | 84 +- ...sh-completion => ohmcoind.bash-completion} | 44 +- contrib/qos/README.md | 2 +- contrib/seeds/README.md | 2 +- contrib/seeds/generate-seeds.py | 2 +- contrib/seeds/makeseeds.py | 2 +- contrib/seeds/nodes_main.txt | 2 + contrib/seeds/nodes_test.txt | 20 + contrib/spendfrom/README.md | 4 +- contrib/spendfrom/spendfrom.py | 72 +- contrib/testgen/gen_base58_test_vectors.py | 12 +- depends/.gitignore | 2 + depends/Makefile | 1 + depends/packages/native_comparisontool.mk | 21 + depends/packages/native_protobuf.mk | 7 +- depends/packages/qt46.mk | 66 + .../patches/native_mac_alias/python3.patch | 34 - ...d3957725acd34aa8b8d011585812f3369411.patch | 22 - ...45c12e0b100cd38acecc16ce7db02905e27c.patch | 22 - doc/.gitignore | 1 + doc/Doxyfile | 2468 +++--- doc/Doxyfile.in | 2458 ++++++ doc/README.md | 29 +- doc/README_osx.md | 2 +- doc/README_windows.txt | 10 +- doc/REST-interface.md | 85 +- doc/bitcoin_logo_doxygen.png | Bin 75272 -> 17454 bytes doc/build-osx.md | 234 +- doc/build-unix.md | 38 +- doc/developer-notes.md | 12 +- doc/dnsseed-policy.md | 14 +- doc/files.md | 6 +- doc/gitian-building.md | 426 +- .../create_vm_file_location_size.png | Bin 65921 -> 0 bytes doc/gitian-building/create_vm_hard_drive.png | Bin 74803 -> 0 bytes .../create_vm_hard_drive_file_type.png | Bin 76612 -> 0 bytes doc/gitian-building/create_vm_memsize.png | Bin 49982 -> 0 bytes doc/gitian-building/create_vm_page1.png | Bin 124161 -> 0 bytes .../create_vm_storage_physical_hard_drive.png | Bin 84005 -> 0 bytes .../debian_install_10_configure_clock.png | Bin 3206 -> 0 bytes .../debian_install_11_partition_disks.png | Bin 4005 -> 0 bytes .../debian_install_12_choose_disk.png | Bin 2582 -> 0 bytes .../debian_install_13_partition_scheme.png | Bin 3370 -> 0 bytes .../debian_install_14_finish.png | Bin 4594 -> 0 bytes .../debian_install_15_write_changes.png | Bin 3420 -> 0 bytes .../debian_install_16_choose_a_mirror.png | Bin 4869 -> 0 bytes .../debian_install_17_choose_a_mirror2.png | Bin 4098 -> 0 bytes .../debian_install_18_proxy_settings.png | Bin 3027 -> 0 bytes .../debian_install_19_software_selection.png | Bin 3709 -> 0 bytes .../debian_install_1_boot_menu.png | Bin 58591 -> 0 bytes .../debian_install_20_install_grub.png | Bin 4080 -> 0 bytes .../debian_install_21_finish_installation.png | Bin 2702 -> 0 bytes .../debian_install_2_select_a_language.png | Bin 7008 -> 0 bytes .../debian_install_3_select_location.png | Bin 4692 -> 0 bytes .../debian_install_4_configure_keyboard.png | Bin 4195 -> 0 bytes ...debian_install_5_configure_the_network.png | Bin 3072 -> 0 bytes .../debian_install_6_domain_name.png | Bin 2961 -> 0 bytes ...debian_install_6a_set_up_root_password.png | Bin 5390 -> 0 bytes .../debian_install_7_set_up_user_fullname.png | Bin 3700 -> 0 bytes .../debian_install_8_set_up_username.png | Bin 2938 -> 0 bytes .../debian_install_9_user_password.png | Bin 2419 -> 0 bytes .../figs/all_files_in_one_partition.png | Bin 0 -> 3350 bytes .../figs/create_new_vm_debian.png | Bin 0 -> 76061 bytes .../figs/create_new_vm_fedora.png | Bin 0 -> 59706 bytes .../figs/create_vm_file_location_size.png | Bin 0 -> 111942 bytes .../figs/create_vm_hard_disk.png | Bin 0 -> 75544 bytes .../figs/create_vm_hard_disk_file_type.png | Bin 0 -> 112042 bytes .../figs/create_vm_memsize.png | Bin 0 -> 22158 bytes .../create_vm_storage_physical_hard_disk.png | Bin 0 -> 118766 bytes .../debian_install_10_configure_clock.png | Bin 0 -> 7080 bytes .../debian_install_11_partition_disks.png | Bin 0 -> 8507 bytes .../figs/debian_install_12_choose_disk.png | Bin 0 -> 5816 bytes .../figs/debian_install_14_finish.png | Bin 0 -> 9876 bytes .../figs/debian_install_15_write_changes.png | Bin 0 -> 7884 bytes .../debian_install_16_choose_a_mirror.png | Bin 0 -> 9703 bytes .../figs/debian_install_18_proxy_settings.png | Bin 0 -> 6671 bytes .../debian_install_19_software_selection.png | Bin 0 -> 7940 bytes .../figs/debian_install_1_boot_menu.png | Bin 0 -> 80475 bytes .../figs/debian_install_20_install_grub.png | Bin 0 -> 8641 bytes ...ian_install_21_install_grub_bootloader.png | Bin 0 -> 7876 bytes .../debian_install_22_finish_installation.png | Bin 0 -> 6123 bytes .../debian_install_2_select_a_language.png | Bin 0 -> 11356 bytes .../figs/debian_install_3_select_location.png | Bin 0 -> 9524 bytes .../debian_install_4_configure_keyboard.png | Bin 0 -> 9492 bytes ...debian_install_5_configure_the_network.png | Bin 0 -> 6694 bytes .../figs/debian_install_6_domain_name.png | Bin 0 -> 6444 bytes ...debian_install_6a_set_up_root_password.png | Bin 0 -> 10532 bytes .../debian_install_7_set_up_user_fullname.png | Bin 0 -> 7535 bytes .../figs/debian_install_8_set_up_username.png | Bin 0 -> 6305 bytes .../figs/debian_install_9_user_password.png | Bin 0 -> 5490 bytes .../figs/fedora_install_1_boot_menu.png | Bin 0 -> 3137 bytes .../figs/fedora_install_2_summary.png | Bin 0 -> 43667 bytes .../figs/fedora_install_3_users.png | Bin 0 -> 26448 bytes .../figs/fedora_root_login.png | Bin 0 -> 1228 bytes doc/gitian-building/figs/network_settings.png | Bin 0 -> 44012 bytes .../figs/port_forwarding_rules.png | Bin 0 -> 22710 bytes .../figs/select_startup_disk_debian.png | Bin 0 -> 72785 bytes .../figs/select_startup_disk_fedora.png | Bin 0 -> 75503 bytes doc/gitian-building/figs/system_settings.png | Bin 0 -> 76448 bytes .../gitian-building-create-vm-debian.md | 222 + .../gitian-building-create-vm-fedora.md | 132 + .../gitian-building-setup-gitian-debian.md | 96 + .../gitian-building-setup-gitian-fedora.md | 106 + doc/gitian-building/network_settings.png | Bin 51611 -> 0 bytes doc/gitian-building/port_forwarding_rules.png | Bin 12676 -> 0 bytes doc/gitian-building/select_startup_disk.png | Bin 80638 -> 0 bytes doc/guide-startmany.md | 58 +- doc/img/bootstrap1.png | Bin 31995 -> 56149 bytes doc/img/bootstrap2.png | Bin 23726 -> 35412 bytes doc/img/bootstrap4.png | Bin 78606 -> 105723 bytes doc/img/bootstrap5.png | Bin 12951 -> 20558 bytes doc/init.md | 60 +- doc/karmanode-budget.md | 36 +- doc/{karmanode_conf.md => karmanode-conf.md} | 14 +- doc/keepass.md | 57 + doc/multiwallet-qt.md | 8 +- doc/release-notes.md | 221 +- .../bitcoin/release-notes-0.10.0.md | 762 ++ .../bitcoin/release-notes-0.3.12.md | 13 + .../bitcoin/release-notes-0.3.13.md | 26 + .../bitcoin/release-notes-0.3.14.md | 11 + .../bitcoin/release-notes-0.3.15.md | 6 + .../bitcoin/release-notes-0.3.16.md | 1 + .../bitcoin/release-notes-0.3.17.md | 12 + .../bitcoin/release-notes-0.3.18.md | 11 + .../bitcoin/release-notes-0.3.19.md | 9 + .../bitcoin/release-notes-0.3.20.1.md | 1 + .../bitcoin/release-notes-0.3.20.2.md | 17 + .../bitcoin/release-notes-0.3.20.md | 22 + .../bitcoin/release-notes-0.3.21.md | 20 + .../bitcoin/release-notes-0.3.22.md | 16 + .../bitcoin/release-notes-0.3.23.md | 10 + .../bitcoin/release-notes-0.3.24.md | 20 + .../bitcoin/release-notes-0.4.0.md | 70 + .../bitcoin/release-notes-0.4.1.md | 38 + .../bitcoin/release-notes-0.4.2.md | 1 + .../bitcoin/release-notes-0.4.3.md | 21 + .../bitcoin/release-notes-0.4.4.md | 30 + .../bitcoin/release-notes-0.4.5.md | 1 + .../bitcoin/release-notes-0.4.6.md | 37 + .../bitcoin/release-notes-0.5.0.md | 70 + .../bitcoin/release-notes-0.5.1.md | 43 + .../bitcoin/release-notes-0.5.2.md | 22 + .../bitcoin/release-notes-0.5.3.md | 42 + .../bitcoin/release-notes-0.5.4.md | 39 + .../bitcoin/release-notes-0.5.5.md | 37 + .../bitcoin/release-notes-0.6.0.md | 138 + .../bitcoin/release-notes-0.6.1.md | 2 + .../bitcoin/release-notes-0.6.2.md | 50 + .../bitcoin/release-notes-0.6.3.md | 29 + .../bitcoin/release-notes-0.7.0.md | 169 + .../bitcoin/release-notes-0.7.1.md | 110 + .../bitcoin/release-notes-0.7.2.md | 68 + .../bitcoin/release-notes-0.8.0.md | 139 + .../bitcoin/release-notes-0.8.1.md | 22 + .../bitcoin/release-notes-0.8.2.md | 137 + .../bitcoin/release-notes-0.8.3.md | 18 + .../bitcoin/release-notes-0.8.4.md | 83 + .../bitcoin/release-notes-0.8.5.md | 44 + .../bitcoin/release-notes-0.8.6.md | 66 + .../bitcoin/release-notes-0.9.1.md | 53 + .../bitcoin/release-notes-0.9.2.1.md | 207 + .../bitcoin/release-notes-0.9.2.md | 207 + .../bitcoin/release-notes-0.9.3.md | 101 + .../bitcoin/release-notes-0.9.4.md | 95 + .../dash/release-notes-0.10.0.md | 718 ++ .../dash/release-notes-0.11.0.md | 291 + .../dash/release-notes-0.11.1.md | 49 + .../dash/release-notes-0.11.2.md | 110 + .../dash/release-notes-0.12.0.md | 103 + doc/release-notes/dash/release-notes-0.9.0.md | 538 ++ .../phore/release-notes-1.2.1.md | 60 + .../phore/release-notes-1.2.2.md | 40 + .../phore/release-notes-1.3.0.md | 56 + .../phore/release-notes-1.3.1.md | 33 + doc/release-notes/release-notes-2.1.5.md | 13 - doc/release-notes/release-notes-2.1.6.md | 3 - doc/release-notes/release-notes-2.1.7.md | 8 - doc/release-notes/release-notes-2.2.0.md | 6 - doc/release-notes/release-notes-2.2.1.md | 121 - doc/release-notes/release-notes-2.3.0.md | 198 + doc/release-notes/release-notes-2.3.1.md | 213 + doc/release-notes/release-notes-3.0.0.md | 135 + doc/release-notes/release-notes-3.0.2.md | 128 + doc/release-process.md | 122 +- doc/swifttx.md | 32 +- doc/tor.md | 28 +- doc/translation_process.md | 34 +- doc/unit-tests.md | 8 +- doc/zmq.md | 20 +- qa/pull-tester/rpc-tests.sh | 17 +- qa/pull-tester/run-bitcoind-for-test.sh.in | 4 +- qa/pull-tester/tests-config.sh.in | 4 +- qa/rpc-tests/README.md | 43 - qa/rpc-tests/bipdersig.py | 90 - qa/rpc-tests/conflictedbalance.sh | 147 - qa/rpc-tests/forknotify.py | 64 - qa/rpc-tests/getblocktemplate_longpoll.py | 92 - qa/rpc-tests/getblocktemplate_proposals.py | 182 - qa/rpc-tests/getchaintips.py | 59 - qa/rpc-tests/httpbasics.py | 102 - qa/rpc-tests/invalidateblock.py | 76 - qa/rpc-tests/keypool.py | 132 - qa/rpc-tests/mempool_coinbase_spends.py | 94 - qa/rpc-tests/mempool_resurrect_test.py | 88 - qa/rpc-tests/mempool_spendcoinbase.py | 69 - qa/rpc-tests/python-bitcoinrpc/setup.py | 15 - qa/rpc-tests/receivedby.py | 167 - qa/rpc-tests/reindex.py | 34 - qa/rpc-tests/rest.py | 89 - qa/rpc-tests/rpcbind_test.py | 154 - qa/rpc-tests/send.sh | 31 - qa/rpc-tests/smartfees.py | 92 - qa/rpc-tests/test_framework.py | 142 - qa/rpc-tests/txn_doublespend.py | 120 - qa/rpc-tests/util.py | 345 - qa/rpc-tests/util.sh | 105 - qa/rpc-tests/walletbackup.py | 200 - qa/rpc-tests/zapwallettxes.sh | 165 - qa/rpc-tests/zmq_test.py | 90 - share/certs/BitcoinFoundation_Comodo_Cert.pem | 2 +- share/genbuild.sh | 12 +- share/qt/Info.plist.in | 26 +- share/qt/extract_strings_qt.py | 6 +- share/qt/img/reload.png | Bin 7571 -> 10085 bytes share/setup.nsi.in | 43 +- src/Makefile.am | 307 +- src/Makefile.qt.include | 251 +- src/Makefile.qttest.include | 37 +- src/Makefile.test.include | 59 +- src/accumulatorcheckpoints.cpp | 87 + src/accumulatorcheckpoints.h | 21 + src/accumulatorcheckpoints.json.h | 313 + src/accumulatormap.cpp | 104 + src/accumulatormap.h | 28 + src/accumulators.cpp | 524 ++ src/accumulators.h | 32 + src/activekarmanode.cpp | 99 +- src/activekarmanode.h | 16 +- src/addrman.cpp | 15 + src/addrman.h | 14 + src/alert.cpp | 3 +- src/allocators.h | 37 - src/base58.cpp | 237 +- src/base58.h | 81 +- src/bech32.cpp | 191 + src/bech32.h | 25 + src/bignum.h | 214 - src/bip38.cpp | 25 +- src/bip38.h | 8 +- src/chain.h | 47 +- src/chainparams.cpp | 466 +- src/chainparams.h | 56 +- src/chainparamsbase.h | 4 +- src/chainparamsseeds.h | 24 +- src/checkpoints.cpp | 7 +- src/checkpoints.h | 2 +- src/clientversion.cpp | 5 +- src/clientversion.h | 33 +- src/coincontrol.h | 17 +- src/coins.cpp | 21 +- src/coins.h | 6 +- src/compat.h | 7 +- src/compat/glibc_compat.cpp | 2 +- src/compat/glibc_sanity.cpp | 2 +- src/compat/strnlen.cpp | 9 +- src/consensus/merkle.cpp | 187 + src/consensus/merkle.h | 38 + src/consensus/validation.h | 97 + src/core_io.h | 4 +- src/core_read.cpp | 21 +- src/core_write.cpp | 11 +- src/crypter.cpp | 173 +- src/crypter.h | 3 + src/db.cpp | 2 +- src/db.h | 15 +- src/denomination_functions.cpp | 443 ++ src/denomination_functions.h | 33 + src/ecwrapper.cpp | 31 +- src/hash.h | 66 +- src/httprpc.cpp | 193 + src/httprpc.h | 37 + src/httpserver.cpp | 668 ++ src/httpserver.h | 150 + src/init.cpp | 592 +- src/init.h | 11 +- src/json/LICENSE.txt | 24 - src/json/json_spirit.h | 18 - src/json/json_spirit_error_position.h | 54 - src/json/json_spirit_reader.cpp | 137 - src/json/json_spirit_reader.h | 62 - src/json/json_spirit_reader_template.h | 612 -- src/json/json_spirit_stream_reader.h | 70 - src/json/json_spirit_utils.h | 61 - src/json/json_spirit_value.cpp | 8 - src/json/json_spirit_value.h | 534 -- src/json/json_spirit_writer.cpp | 95 - src/json/json_spirit_writer.h | 50 - src/json/json_spirit_writer_template.h | 249 - src/karmanode-budget.cpp | 607 +- src/karmanode-budget.h | 31 +- src/karmanode-payments.cpp | 171 +- src/karmanode-payments.h | 13 +- src/karmanode-sync.cpp | 53 +- src/karmanode-sync.h | 3 +- src/karmanode.cpp | 236 +- src/karmanode.h | 12 +- src/karmanodeconfig.cpp | 49 +- src/karmanodeconfig.h | 4 +- src/karmanodeman.cpp | 162 +- src/karmanodeman.h | 9 +- src/kernel.cpp | 26 +- src/kernel.h | 1 + src/key.cpp | 2 +- src/key.h | 1 + src/keystore.cpp | 112 +- src/keystore.h | 48 +- src/leveldb/db/memtable.cc | 2 +- src/leveldb/port/port_win.cc | 2 +- src/leveldb/util/bloom.cc | 2 +- src/leveldb/util/logging.cc | 2 +- src/leveldbwrapper.cpp | 4 +- src/leveldbwrapper.h | 14 +- src/libzerocoin/Accumulator.cpp | 149 + src/libzerocoin/Accumulator.h | 160 + .../AccumulatorProofOfKnowledge.cpp | 146 + src/libzerocoin/AccumulatorProofOfKnowledge.h | 95 + src/libzerocoin/Coin.cpp | 289 + src/libzerocoin/Coin.h | 173 + src/libzerocoin/CoinSpend.cpp | 155 + src/libzerocoin/CoinSpend.h | 168 + src/libzerocoin/Commitment.cpp | 174 + src/libzerocoin/Commitment.h | 107 + src/libzerocoin/Denominations.cpp | 122 + src/libzerocoin/Denominations.h | 46 + src/libzerocoin/LICENSE | 19 + src/libzerocoin/ParamGeneration.cpp | 657 ++ src/libzerocoin/ParamGeneration.h | 56 + src/libzerocoin/Params.cpp | 47 + src/libzerocoin/Params.h | 219 + .../SerialNumberSignatureOfKnowledge.cpp | 155 + .../SerialNumberSignatureOfKnowledge.h | 75 + src/libzerocoin/SpendType.h | 19 + src/libzerocoin/ZerocoinDefines.h | 41 + src/libzerocoin/bignum.h | 788 ++ src/libzerocoin/documentation/Doxyfile | 1870 +++++ .../documentation/manual/intro.tex | 3 + .../documentation/manual/manual.pdf | Bin 0 -> 73684 bytes .../documentation/manual/manual.tex | 19 + .../documentation/manual/using.tex | 14 + src/libzerocoin/paramgen.cpp | 130 + src/libzerocoin/zerocoin.pc.in | 11 + src/main.cpp | 3429 ++++++--- src/main.h | 284 +- src/merkleblock.cpp | 1 + src/miner.cpp | 264 +- src/miner.h | 5 +- src/mintpool.cpp | 106 + src/mintpool.h | 54 + src/net.cpp | 404 +- src/net.h | 139 +- src/netbase.cpp | 773 +- src/netbase.h | 297 +- src/noui.cpp | 4 +- ...tesend-relay.cpp => obfuscation-relay.cpp} | 9 +- ...rivatesend-relay.h => obfuscation-relay.h} | 6 +- src/{privatesend.cpp => obfuscation.cpp} | 530 +- src/{privatesend.h => obfuscation.h} | 124 +- src/{ohmcd-res.rc => ohmcoin-cli-res.rc} | 10 +- src/{ohmc-cli.cpp => ohmcoin-cli.cpp} | 196 +- src/ohmcoin-tx-res.rc | 35 + src/{ohmc-tx.cpp => ohmcoin-tx.cpp} | 58 +- src/{ohmc-cli-res.rc => ohmcoind-res.rc} | 10 +- src/{ohmcd.cpp => ohmcoind.cpp} | 56 +- src/pow.cpp | 9 +- src/primitives/block.cpp | 57 +- src/primitives/block.h | 13 +- src/primitives/deterministicmint.cpp | 45 + src/primitives/deterministicmint.h | 67 + src/primitives/transaction.cpp | 89 +- src/primitives/transaction.h | 241 +- src/primitives/zerocoin.cpp | 78 + src/primitives/zerocoin.h | 250 + src/protocol.cpp | 127 +- src/protocol.h | 259 +- src/pubkey.h | 4 + src/qt/addressbookpage.cpp | 8 +- src/qt/addresstablemodel.cpp | 83 +- src/qt/addresstablemodel.h | 6 +- src/qt/askpassphrasedialog.cpp | 9 +- src/qt/bantablemodel.cpp | 186 + src/qt/bantablemodel.h | 73 + src/qt/bip38tooldialog.cpp | 39 +- src/qt/bip38tooldialog.h | 1 + src/qt/bitcoinaddressvalidator.cpp | 16 +- src/qt/bitcoinamountfield.cpp | 15 +- src/qt/bitcoingui.cpp | 273 +- src/qt/bitcoingui.h | 23 +- src/qt/bitcoinunits.cpp | 39 +- src/qt/bitcoinunits.h | 9 +- src/qt/blockexplorer.cpp | 82 +- src/qt/clientmodel.cpp | 28 +- src/qt/clientmodel.h | 9 +- src/qt/coincontroldialog.cpp | 143 +- src/qt/coincontroldialog.h | 7 +- src/qt/columnalignedlayout.cpp | 38 + src/qt/columnalignedlayout.h | 21 + src/qt/configurekarmanodepage.cpp | 191 + src/qt/configurekarmanodepage.h | 97 + src/qt/editaddressdialog.cpp | 9 +- src/qt/forms/addressbookpage.ui | 13 +- src/qt/forms/askpassphrasedialog.ui | 2 +- src/qt/forms/bip38tooldialog.ui | 127 +- src/qt/forms/blockexplorer.ui | 20 +- src/qt/forms/coincontroldialog.ui | 2 +- src/qt/forms/configurekarmanodepage.ui | 176 + src/qt/forms/helpmessagedialog.ui | 12 +- src/qt/forms/intro.ui | 6 +- src/qt/forms/karmanodelist.ui | 503 +- src/qt/forms/multisenddialog.ui | 585 +- src/qt/forms/multisigdialog.ui | 817 ++ ...vatesendconfig.ui => obfuscationconfig.ui} | 6 +- src/qt/forms/optionsdialog.ui | 148 +- src/qt/forms/overviewpage.ui | 2315 +++--- src/qt/forms/privacydialog.ui | 2326 ++++++ src/qt/forms/proposaldialog.ui | 224 + src/qt/forms/receivecoinsdialog.ui | 805 +- src/qt/forms/receiverequestdialog.ui | 8 +- src/qt/forms/rpcconsole.ui | 401 +- src/qt/forms/sendcoinsdialog.ui | 2789 +++---- src/qt/forms/sendcoinsentry.ui | 40 +- src/qt/forms/signverifymessagedialog.ui | 71 +- src/qt/forms/tradingdialog.ui | 16 +- src/qt/forms/zohmccontroldialog.ui | 235 + src/qt/guiconstants.h | 25 +- src/qt/guiutil.cpp | 126 +- src/qt/guiutil.h | 24 +- src/qt/intro.cpp | 9 +- src/qt/karmanodelist.cpp | 179 +- src/qt/karmanodelist.h | 17 + src/qt/locale/ohmc_bg.ts | 485 -- src/qt/locale/ohmc_ca.ts | 1237 --- src/qt/locale/ohmc_de.ts | 2640 ------- src/qt/locale/ohmc_ja.ts | 265 - src/qt/locale/ohmc_nl.ts | 1677 ---- src/qt/locale/ohmc_zh_CN.ts | 169 - src/qt/locale/ohmcoin_bg.ts | 4523 +++++++++++ src/qt/locale/ohmcoin_ca.ts | 2093 +++++ src/qt/locale/{ohmc_cs.ts => ohmcoin_cs.ts} | 282 +- src/qt/locale/{ohmc_da.ts => ohmcoin_da.ts} | 659 +- src/qt/locale/ohmcoin_de.ts | 5474 +++++++++++++ src/qt/locale/{ohmc_en.ts => ohmcoin_en.ts} | 2243 ++++-- .../{ohmc_en_US.ts => ohmcoin_en_US.ts} | 448 +- src/qt/locale/{ohmc_es.ts => ohmcoin_es.ts} | 1359 ++-- src/qt/locale/{ohmc_fi.ts => ohmcoin_fi.ts} | 924 ++- .../{ohmc_fr_FR.ts => ohmcoin_fr_FR.ts} | 192 +- src/qt/locale/ohmcoin_hr.ts | 811 ++ src/qt/locale/{ohmc_it.ts => ohmcoin_it.ts} | 169 +- src/qt/locale/ohmcoin_ja.ts | 6485 ++++++++++++++++ .../{ohmc_ko_KR.ts => ohmcoin_ko_KR.ts} | 1346 +++- src/qt/locale/ohmcoin_nl.ts | 6790 +++++++++++++++++ src/qt/locale/{ohmc_pl.ts => ohmcoin_pl.ts} | 214 +- src/qt/locale/{ohmc_pt.ts => ohmcoin_pt.ts} | 104 +- .../{ohmc_pt_BR.ts => ohmcoin_pt_BR.ts} | 490 +- .../{ohmc_ro_RO.ts => ohmcoin_ro_RO.ts} | 10 +- src/qt/locale/{ohmc_ru.ts => ohmcoin_ru.ts} | 632 +- src/qt/locale/{ohmc_sk.ts => ohmcoin_sk.ts} | 166 +- src/qt/locale/{ohmc_sv.ts => ohmcoin_sv.ts} | 184 +- src/qt/locale/ohmcoin_tr.ts | 1711 +++++ src/qt/locale/{ohmc_uk.ts => ohmcoin_uk.ts} | 24 +- src/qt/locale/ohmcoin_zh_CN.ts | 1636 ++++ .../{ohmc_zh_TW.ts => ohmcoin_zh_TW.ts} | 134 +- src/qt/macnotificationhandler.h | 2 +- src/qt/macnotificationhandler.mm | 18 +- src/qt/multisenddialog.cpp | 50 +- src/qt/multisigdialog.cpp | 1102 +++ src/qt/multisigdialog.h | 71 + src/qt/networkstyle.cpp | 6 +- src/qt/notificator.cpp | 68 - src/qt/notificator.h | 5 +- ...tesendconfig.cpp => obfuscationconfig.cpp} | 40 +- ...rivatesendconfig.h => obfuscationconfig.h} | 16 +- src/qt/ohmc.qrc | 102 - src/qt/ohmc_locale.qrc | 28 - src/qt/{ohmc.cpp => ohmcoin.cpp} | 60 +- src/qt/ohmcoin.qrc | 136 + src/qt/ohmcoin_locale.qrc | 30 + src/qt/ohmcstrings.cpp | 456 -- src/qt/openuridialog.cpp | 7 +- src/qt/optionsdialog.cpp | 89 +- src/qt/optionsdialog.h | 5 +- src/qt/optionsmodel.cpp | 125 +- src/qt/optionsmodel.h | 18 +- src/qt/overviewpage.cpp | 467 +- src/qt/overviewpage.h | 14 +- src/qt/paymentrequestplus.cpp | 20 +- src/qt/paymentrequestplus.h | 3 + src/qt/paymentserver.cpp | 76 +- src/qt/paymentserver.h | 2 +- src/qt/peertablemodel.cpp | 5 +- src/qt/phorestrings.cpp | 494 ++ src/qt/privacydialog.cpp | 760 ++ src/qt/privacydialog.h | 109 + src/qt/proposaldialog.cpp | 298 + src/qt/proposaldialog.h | 64 + src/qt/proposalfilterproxy.cpp | 124 + src/qt/proposalfilterproxy.h | 57 + src/qt/proposallist.cpp | 537 ++ src/qt/proposallist.h | 135 + src/qt/proposalrecord.cpp | 6 + src/qt/proposalrecord.h | 65 + src/qt/proposaltablemodel.cpp | 324 + src/qt/proposaltablemodel.h | 90 + src/qt/receivecoinsdialog.cpp | 22 +- src/qt/receiverequestdialog.cpp | 14 +- src/qt/recentrequeststablemodel.h | 2 +- src/qt/res/css/default.css | 2346 +++--- src/qt/res/fonts/Hind-Bold.ttf | Bin 0 -> 286604 bytes src/qt/res/fonts/Hind-Light.ttf | Bin 0 -> 287484 bytes src/qt/res/fonts/Hind-Medium.ttf | Bin 0 -> 277300 bytes src/qt/res/fonts/Hind-Regular.ttf | Bin 0 -> 299532 bytes src/qt/res/fonts/Hind-SemiBold.ttf | Bin 0 -> 281940 bytes src/qt/res/fonts/Montserrat-Bold.ttf | Bin 0 -> 29560 bytes src/qt/res/icons/history_off.png | Bin 0 -> 1791 bytes src/qt/res/icons/karmanodes_off.png | Bin 0 -> 2946 bytes src/qt/res/icons/overview_off.png | Bin 0 -> 5065 bytes src/qt/res/icons/privacy.png | Bin 0 -> 3742 bytes src/qt/res/icons/privacy_off.png | Bin 0 -> 4747 bytes src/qt/res/icons/proposal.png | Bin 0 -> 2217 bytes src/qt/res/icons/proposal_off.png | Bin 0 -> 2331 bytes src/qt/res/icons/receive_dark.png | Bin 0 -> 2614 bytes src/qt/res/icons/receive_off.png | Bin 0 -> 1851 bytes src/qt/res/icons/send_dark.png | Bin 0 -> 2678 bytes src/qt/res/icons/send_off.png | Bin 0 -> 5010 bytes .../icons/{tx_karma.png => tx_karmanode.png} | Bin src/qt/res/icons/tx_staked.png | Bin 0 -> 7036 bytes .../{unit_mohmc.png => unit_mohmcoin.png} | Bin .../icons/{unit_ohmc.png => unit_ohmcoin.png} | Bin .../{unit_tmohmc.png => unit_tmohmcoin.png} | Bin .../{unit_tohmc.png => unit_tohmcoin.png} | Bin .../{unit_tuohmc.png => unit_tuohmcoin.png} | Bin .../{unit_uohmc.png => unit_uohmcoin.png} | Bin src/qt/res/images/downArrow_dark.png | Bin 0 -> 1013 bytes src/qt/res/images/downArrow_small_dark.png | Bin 0 -> 1013 bytes src/qt/res/images/leftArrow_small_dark.png | Bin 0 -> 1012 bytes ...zontal.png => ohmcoin_logo_horizontal.png} | Bin src/qt/res/images/rightArrow_small_dark.png | Bin 0 -> 1005 bytes src/qt/res/images/splash@2x.png | Bin 0 -> 70739 bytes src/qt/res/images/splash_testnet@2x.png | Bin 0 -> 12258 bytes src/qt/res/images/upArrow.png | Bin 0 -> 1434 bytes src/qt/res/images/upArrow_small_dark.png | Bin 0 -> 1010 bytes src/qt/res/images/walletFrame.png | Bin 1733 -> 14197 bytes src/qt/res/images/walletFrame_bg.png | Bin 789 -> 7383 bytes .../res/{ohmc-qt-res.rc => ohmcoin-qt-res.rc} | 0 src/qt/rpcconsole.cpp | 307 +- src/qt/rpcconsole.h | 26 +- src/qt/sendcoinsdialog.cpp | 90 +- src/qt/sendcoinsdialog.h | 4 +- src/qt/sendcoinsentry.cpp | 9 +- src/qt/signverifymessagedialog.cpp | 37 +- src/qt/splashscreen.cpp | 58 +- src/qt/test/paymentservertests.cpp | 10 +- src/qt/test/test_main.cpp | 10 +- src/qt/test/uritests.cpp | 22 +- src/qt/transactiondesc.cpp | 29 +- src/qt/transactionfilterproxy.h | 4 +- src/qt/transactionrecord.cpp | 102 +- src/qt/transactionrecord.h | 15 +- src/qt/transactiontablemodel.cpp | 54 +- src/qt/transactionview.cpp | 83 +- src/qt/transactionview.h | 2 +- src/qt/utilitydialog.cpp | 9 +- src/qt/walletframe.cpp | 28 + src/qt/walletframe.h | 13 +- src/qt/walletmodel.cpp | 232 +- src/qt/walletmodel.h | 45 +- src/qt/walletmodeltransaction.cpp | 2 +- src/qt/walletview.cpp | 112 +- src/qt/walletview.h | 30 +- src/qt/zohmccontroldialog.cpp | 202 + src/qt/zohmccontroldialog.h | 56 + src/random.cpp | 48 +- src/random.h | 11 +- src/rest.cpp | 551 +- src/reverse_iterate.h | 37 + src/reverselock.h | 34 + src/rpcblockchain.cpp | 433 +- src/rpcclient.cpp | 74 +- src/rpcclient.h | 10 +- src/rpcdump.cpp | 344 +- src/rpckarmanode-budget.cpp | 266 +- src/rpckarmanode.cpp | 548 +- src/rpcmining.cpp | 196 +- src/rpcmisc.cpp | 348 +- src/rpcnet.cpp | 219 +- src/rpcprotocol.cpp | 329 +- src/rpcprotocol.h | 184 +- src/rpcrawtransaction.cpp | 513 +- src/rpcserver.cpp | 1005 +-- src/rpcserver.h | 418 +- src/rpcwallet.cpp | 2843 +++++-- src/scheduler.cpp | 132 + src/scheduler.h | 83 + src/script/bitcoinconsensus.cpp | 3 +- src/script/bitcoinconsensus.h | 4 +- src/script/interpreter.cpp | 334 +- src/script/interpreter.h | 67 +- src/script/script.cpp | 67 +- src/script/script.h | 33 +- src/script/script_error.cpp | 18 + src/script/script_error.h | 11 + src/script/sigcache.h | 2 +- src/script/sign.cpp | 376 +- src/script/sign.h | 81 +- src/script/standard.cpp | 164 +- src/script/standard.h | 93 +- src/serialize.h | 45 + src/spork.cpp | 139 +- src/spork.h | 41 +- src/sporkdb.cpp | 25 + src/sporkdb.h | 28 + src/streams.h | 43 +- src/support/allocators/zeroafterfree.h | 48 + src/support/cleanse.cpp | 39 + src/support/cleanse.h | 14 + src/swifttx.cpp | 86 +- src/swifttx.h | 8 +- src/sync.cpp | 103 +- src/sync.h | 86 +- src/test/Checkpoints_tests.cpp | 18 +- src/test/DoS_tests.cpp | 4 +- src/test/README.md | 4 +- src/test/accounting_tests.cpp | 8 +- src/test/base58_tests.cpp | 228 +- src/test/benchmark_zerocoin.cpp | 414 + src/test/budget_tests.cpp | 31 + src/test/checkblock_tests.cpp | 1 + src/test/data/base58_keys_invalid.json | 129 +- src/test/data/base58_keys_valid.json | 272 +- src/test/data/bitcoin-util-test.json | 26 +- src/test/data/script_invalid.json | 216 +- src/test/data/script_valid.json | 319 +- src/test/data/sighash.json | 2 +- src/test/data/tx_invalid.json | 234 +- src/test/data/tx_valid.json | 321 +- src/test/data/txcreate1.hex | 2 +- src/test/data/txcreatesign.hex | 2 +- src/test/key_tests.cpp | 38 +- src/test/libzerocoin_tests.cpp | 492 ++ src/test/main_tests.cpp | 37 +- src/test/miner_tests.cpp | 5 +- src/test/multisig_tests.cpp | 21 +- src/test/netbase_tests.cpp | 90 +- src/test/policyestimator_tests.cpp | 211 + src/test/reverselock_tests.cpp | 63 + src/test/rpc_tests.cpp | 179 +- src/test/rpc_wallet_tests.cpp | 183 - src/test/scheduler_tests.cpp | 122 + src/test/script_P2SH_tests.cpp | 32 +- src/test/script_standard_tests.cpp | 736 ++ src/test/script_tests.cpp | 508 +- src/test/scriptnum_tests.cpp | 40 +- src/test/sighash_tests.cpp | 26 +- src/test/sigopcount_tests.cpp | 178 + src/test/{test_ohmc.cpp => test_phore.cpp} | 4 +- src/test/torcontrol_tests.cpp | 198 + src/test/transaction_tests.cpp | 453 +- src/test/tutorial_zerocoin.cpp | 283 + src/test/txvalidationcache_tests.cpp | 86 + src/test/univalue_tests.cpp | 64 +- src/test/zerocoin_denomination_tests.cpp | 522 ++ src/test/zerocoin_implementation_tests.cpp | 529 ++ src/test/zerocoin_transactions_tests.cpp | 57 + src/timedata.cpp | 6 +- src/tinyformat.h | 13 + src/torcontrol.cpp | 783 ++ src/torcontrol.h | 24 + src/txdb.cpp | 201 + src/txdb.h | 32 + src/txmempool.cpp | 44 +- src/txmempool.h | 28 +- src/ui_interface.h | 9 + src/uint256.h | 4 +- src/uint512.h | 5 + src/univalue/.gitignore | 32 + src/univalue/.travis.yml | 52 + src/univalue/COPYING | 19 + src/univalue/Makefile.am | 115 + src/univalue/README.md | 32 + src/univalue/TODO | 10 + src/univalue/autogen.sh | 9 + src/univalue/build-aux/m4/.gitignore | 1 + src/univalue/configure.ac | 69 + src/univalue/{ => gen}/gen.cpp | 18 +- src/univalue/include/univalue.h | 296 + src/univalue/lib/.gitignore | 2 + src/univalue/lib/univalue.cpp | 359 + src/univalue/{ => lib}/univalue_escapes.h | 58 +- src/univalue/{ => lib}/univalue_read.cpp | 216 +- src/univalue/lib/univalue_utffilter.h | 119 + src/univalue/{ => lib}/univalue_write.cpp | 20 +- src/univalue/pc/libunivalue-uninstalled.pc.in | 9 + src/univalue/pc/libunivalue.pc.in | 10 + src/univalue/test/.gitignore | 8 + src/univalue/test/fail1.json | 1 + src/univalue/test/fail10.json | 1 + src/univalue/test/fail11.json | 1 + src/univalue/test/fail12.json | 1 + src/univalue/test/fail13.json | 1 + src/univalue/test/fail14.json | 1 + src/univalue/test/fail15.json | 1 + src/univalue/test/fail16.json | 1 + src/univalue/test/fail17.json | 1 + src/univalue/test/fail18.json | 1 + src/univalue/test/fail19.json | 1 + src/univalue/test/fail2.json | 1 + src/univalue/test/fail20.json | 1 + src/univalue/test/fail21.json | 1 + src/univalue/test/fail22.json | 1 + src/univalue/test/fail23.json | 1 + src/univalue/test/fail24.json | 1 + src/univalue/test/fail25.json | 1 + src/univalue/test/fail26.json | 1 + src/univalue/test/fail27.json | 2 + src/univalue/test/fail28.json | 2 + src/univalue/test/fail29.json | 1 + src/univalue/test/fail3.json | 1 + src/univalue/test/fail30.json | 1 + src/univalue/test/fail31.json | 1 + src/univalue/test/fail32.json | 1 + src/univalue/test/fail33.json | 1 + src/univalue/test/fail34.json | 1 + src/univalue/test/fail35.json | 1 + src/univalue/test/fail36.json | 1 + src/univalue/test/fail37.json | 1 + src/univalue/test/fail38.json | 1 + src/univalue/test/fail39.json | 1 + src/univalue/test/fail4.json | 1 + src/univalue/test/fail40.json | 1 + src/univalue/test/fail41.json | 1 + src/univalue/test/fail42.json | Bin 0 -> 37 bytes src/univalue/test/fail44.json | 1 + src/univalue/test/fail5.json | 1 + src/univalue/test/fail6.json | 1 + src/univalue/test/fail7.json | 1 + src/univalue/test/fail8.json | 1 + src/univalue/test/fail9.json | 1 + src/univalue/test/no_nul.cpp | 8 + src/univalue/test/object.cpp | 365 + src/univalue/test/pass1.json | 58 + src/univalue/test/pass2.json | 1 + src/univalue/test/pass3.json | 6 + src/univalue/test/round1.json | 1 + src/univalue/test/round2.json | 1 + src/univalue/test/round3.json | 1 + src/univalue/test/round4.json | 1 + src/univalue/test/round5.json | 1 + src/univalue/test/round6.json | 1 + src/univalue/test/round7.json | 1 + src/univalue/test/test_json.cpp | 24 + src/univalue/test/unitester.cpp | 170 + src/univalue/univalue.cpp | 211 - src/univalue/univalue.h | 155 - src/util.cpp | 186 +- src/util.h | 60 +- src/utilstrencodings.cpp | 4 +- src/utilstrencodings.h | 33 +- src/utiltime.cpp | 2 +- src/utiltime.h | 2 + src/validationinterface.cpp | 9 +- src/validationinterface.h | 12 +- src/version.h | 17 +- src/wallet.cpp | 2472 +++++- src/wallet.h | 529 +- src/wallet_ismine.cpp | 113 +- src/wallet_ismine.h | 19 +- src/walletdb.cpp | 666 +- src/walletdb.h | 58 +- src/zmq/zmqconfig.h | 2 +- src/zmq/zmqpublishnotifier.cpp | 2 - src/zohmctracker.cpp | 498 ++ src/zohmctracker.h | 52 + src/zohmcwallet.cpp | 480 ++ src/zohmcwallet.h | 49 + test/decodetx.py | 121 + {qa/rpc-tests => test}/listtransactions.py | 82 +- test/segwit.py | 589 ++ test/test_case_base.py | 23 + .../test_framework}/__init__.py | 0 test/test_framework/address.py | 74 + .../test_framework}/authproxy.py | 87 +- test/test_framework/bignum.py | 101 + test/test_framework/blockstore.py | 164 + test/test_framework/blocktools.py | 105 + test/test_framework/comptool.py | 401 + test/test_framework/coverage.py | 106 + test/test_framework/key.py | 236 + test/test_framework/messages.py | 1319 ++++ test/test_framework/mininode.py | 1779 +++++ .../test_framework}/netutil.py | 34 +- test/test_framework/script.py | 947 +++ test/test_framework/segwit_addr.py | 107 + test/test_framework/siphash.py | 64 + test/test_framework/socks5.py | 161 + test/test_framework/test_framework.py | 208 + test/test_framework/test_node.py | 344 + test/test_framework/util.py | 655 ++ {qa/rpc-tests => test}/wallet.py | 75 +- test/zerocoin.py | 61 + 910 files changed, 113335 insertions(+), 34357 deletions(-) delete mode 100644 .travis/github_deploy_key.enc create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 build-aux/m4/l_atomic.m4 delete mode 100755 changelog.md rename contrib/debian/examples/{ohmc.conf => phore.conf} (85%) mode change 100755 => 100644 rename contrib/debian/manpages/{ohmc-qt.1 => phore-qt.1} (84%) mode change 100755 => 100644 rename contrib/debian/manpages/{ohmc.conf.5 => phore.conf.5} (79%) mode change 100755 => 100644 rename contrib/debian/manpages/{ohmcd.1 => phored.1} (68%) mode change 100755 => 100644 delete mode 100755 contrib/debian/ohmcd.bash-completion delete mode 100755 contrib/debian/ohmcd.examples delete mode 100755 contrib/debian/ohmcd.install delete mode 100755 contrib/debian/ohmcd.manpages rename contrib/debian/{ohmc-qt.desktop => phore-qt.desktop} (79%) mode change 100755 => 100644 rename contrib/debian/{ohmc-qt.install => phore-qt.install} (50%) mode change 100755 => 100644 rename contrib/debian/{ohmcd.lintian-overrides => phore-qt.lintian-overrides} (53%) mode change 100755 => 100644 rename contrib/debian/{ohmc-qt.protocol => phore-qt.protocol} (74%) mode change 100755 => 100644 create mode 100644 contrib/debian/phored.bash-completion create mode 100644 contrib/debian/phored.examples create mode 100644 contrib/debian/phored.install rename contrib/debian/{ohmc-qt.lintian-overrides => phored.lintian-overrides} (54%) mode change 100755 => 100644 create mode 100644 contrib/debian/phored.manpages create mode 100644 contrib/devtools/logprint-scanner.py delete mode 100755 contrib/devtools/split-debug.sh create mode 100644 contrib/gitian-descriptors/gitian-aarch64.yml create mode 100644 contrib/gitian-downloader/aschildbach-key.pgp create mode 100644 contrib/gitian-downloader/bluematt-key.pgp create mode 100644 contrib/gitian-downloader/cfields-key.pgp create mode 100644 contrib/gitian-downloader/devrandom-key.pgp create mode 100644 contrib/gitian-downloader/gavinandresen-key.pgp create mode 100644 contrib/gitian-downloader/laanwj-key.pgp create mode 100644 contrib/gitian-downloader/linux-download-config create mode 100644 contrib/gitian-downloader/luke-jr-key.pgp create mode 100644 contrib/gitian-downloader/michagogo-key.pgp create mode 100644 contrib/gitian-downloader/sipa-key.pgp create mode 100644 contrib/gitian-downloader/tcatm-key.pgp create mode 100644 contrib/gitian-downloader/win32-download-config create mode 100644 contrib/gitian-downloader/wtogami-key.pgp create mode 100644 contrib/gitian-keys/blondfrogs-key.gpg delete mode 100755 contrib/gitian-keys/fuzzbawls-key.gpg delete mode 100755 contrib/gitian-keys/jonspock-key.gpg create mode 100644 contrib/gitian-keys/meyer9-key.gpg delete mode 100755 contrib/gitian-keys/mrs-x-key.gpg delete mode 100755 contrib/gitian-keys/presstab-key.gpg delete mode 100755 contrib/gitian-keys/s3v3nh4cks-key.gpg delete mode 100755 contrib/init/ohmcd.openrcconf delete mode 100755 contrib/init/ohmcd.service rename contrib/init/{ohmcd.conf => phored.conf} (78%) mode change 100755 => 100644 rename contrib/init/{ohmcd.init => phored.init} (62%) mode change 100755 => 100644 rename contrib/init/{ohmcd.openrc => phored.openrc} (70%) mode change 100755 => 100644 create mode 100644 contrib/init/phored.openrcconf create mode 100644 contrib/init/phored.service create mode 100644 contrib/macdeploy/extract-osx-sdk.sh delete mode 100755 contrib/macdeploy/libboost_system-mt.dylib rename contrib/{ohmc-qt.pro => ohmcoin-qt.pro} (92%) mode change 100755 => 100644 rename contrib/{ohmcd.bash-completion => ohmcoind.bash-completion} (77%) mode change 100755 => 100644 create mode 100644 contrib/seeds/nodes_main.txt create mode 100644 contrib/seeds/nodes_test.txt create mode 100644 depends/packages/native_comparisontool.mk create mode 100644 depends/packages/qt46.mk delete mode 100644 depends/patches/zeromq/9114d3957725acd34aa8b8d011585812f3369411.patch delete mode 100644 depends/patches/zeromq/9e6745c12e0b100cd38acecc16ce7db02905e27c.patch create mode 100644 doc/.gitignore mode change 100755 => 100644 doc/Doxyfile create mode 100644 doc/Doxyfile.in delete mode 100755 doc/gitian-building/create_vm_file_location_size.png delete mode 100755 doc/gitian-building/create_vm_hard_drive.png delete mode 100755 doc/gitian-building/create_vm_hard_drive_file_type.png delete mode 100755 doc/gitian-building/create_vm_memsize.png delete mode 100755 doc/gitian-building/create_vm_page1.png delete mode 100755 doc/gitian-building/create_vm_storage_physical_hard_drive.png delete mode 100755 doc/gitian-building/debian_install_10_configure_clock.png delete mode 100755 doc/gitian-building/debian_install_11_partition_disks.png delete mode 100755 doc/gitian-building/debian_install_12_choose_disk.png delete mode 100755 doc/gitian-building/debian_install_13_partition_scheme.png delete mode 100755 doc/gitian-building/debian_install_14_finish.png delete mode 100755 doc/gitian-building/debian_install_15_write_changes.png delete mode 100755 doc/gitian-building/debian_install_16_choose_a_mirror.png delete mode 100755 doc/gitian-building/debian_install_17_choose_a_mirror2.png delete mode 100755 doc/gitian-building/debian_install_18_proxy_settings.png delete mode 100755 doc/gitian-building/debian_install_19_software_selection.png delete mode 100755 doc/gitian-building/debian_install_1_boot_menu.png delete mode 100755 doc/gitian-building/debian_install_20_install_grub.png delete mode 100755 doc/gitian-building/debian_install_21_finish_installation.png delete mode 100755 doc/gitian-building/debian_install_2_select_a_language.png delete mode 100755 doc/gitian-building/debian_install_3_select_location.png delete mode 100755 doc/gitian-building/debian_install_4_configure_keyboard.png delete mode 100755 doc/gitian-building/debian_install_5_configure_the_network.png delete mode 100755 doc/gitian-building/debian_install_6_domain_name.png delete mode 100755 doc/gitian-building/debian_install_6a_set_up_root_password.png delete mode 100755 doc/gitian-building/debian_install_7_set_up_user_fullname.png delete mode 100755 doc/gitian-building/debian_install_8_set_up_username.png delete mode 100755 doc/gitian-building/debian_install_9_user_password.png create mode 100644 doc/gitian-building/figs/all_files_in_one_partition.png create mode 100644 doc/gitian-building/figs/create_new_vm_debian.png create mode 100644 doc/gitian-building/figs/create_new_vm_fedora.png create mode 100644 doc/gitian-building/figs/create_vm_file_location_size.png create mode 100644 doc/gitian-building/figs/create_vm_hard_disk.png create mode 100644 doc/gitian-building/figs/create_vm_hard_disk_file_type.png create mode 100644 doc/gitian-building/figs/create_vm_memsize.png create mode 100644 doc/gitian-building/figs/create_vm_storage_physical_hard_disk.png create mode 100644 doc/gitian-building/figs/debian_install_10_configure_clock.png create mode 100644 doc/gitian-building/figs/debian_install_11_partition_disks.png create mode 100644 doc/gitian-building/figs/debian_install_12_choose_disk.png create mode 100644 doc/gitian-building/figs/debian_install_14_finish.png create mode 100644 doc/gitian-building/figs/debian_install_15_write_changes.png create mode 100644 doc/gitian-building/figs/debian_install_16_choose_a_mirror.png create mode 100644 doc/gitian-building/figs/debian_install_18_proxy_settings.png create mode 100644 doc/gitian-building/figs/debian_install_19_software_selection.png create mode 100644 doc/gitian-building/figs/debian_install_1_boot_menu.png create mode 100644 doc/gitian-building/figs/debian_install_20_install_grub.png create mode 100644 doc/gitian-building/figs/debian_install_21_install_grub_bootloader.png create mode 100644 doc/gitian-building/figs/debian_install_22_finish_installation.png create mode 100644 doc/gitian-building/figs/debian_install_2_select_a_language.png create mode 100644 doc/gitian-building/figs/debian_install_3_select_location.png create mode 100644 doc/gitian-building/figs/debian_install_4_configure_keyboard.png create mode 100644 doc/gitian-building/figs/debian_install_5_configure_the_network.png create mode 100644 doc/gitian-building/figs/debian_install_6_domain_name.png create mode 100644 doc/gitian-building/figs/debian_install_6a_set_up_root_password.png create mode 100644 doc/gitian-building/figs/debian_install_7_set_up_user_fullname.png create mode 100644 doc/gitian-building/figs/debian_install_8_set_up_username.png create mode 100644 doc/gitian-building/figs/debian_install_9_user_password.png create mode 100644 doc/gitian-building/figs/fedora_install_1_boot_menu.png create mode 100644 doc/gitian-building/figs/fedora_install_2_summary.png create mode 100644 doc/gitian-building/figs/fedora_install_3_users.png create mode 100644 doc/gitian-building/figs/fedora_root_login.png create mode 100644 doc/gitian-building/figs/network_settings.png create mode 100644 doc/gitian-building/figs/port_forwarding_rules.png create mode 100644 doc/gitian-building/figs/select_startup_disk_debian.png create mode 100644 doc/gitian-building/figs/select_startup_disk_fedora.png create mode 100644 doc/gitian-building/figs/system_settings.png create mode 100644 doc/gitian-building/gitian-building-create-vm-debian.md create mode 100644 doc/gitian-building/gitian-building-create-vm-fedora.md create mode 100644 doc/gitian-building/gitian-building-setup-gitian-debian.md create mode 100644 doc/gitian-building/gitian-building-setup-gitian-fedora.md delete mode 100755 doc/gitian-building/network_settings.png delete mode 100755 doc/gitian-building/port_forwarding_rules.png delete mode 100755 doc/gitian-building/select_startup_disk.png mode change 100755 => 100644 doc/karmanode-budget.md rename doc/{karmanode_conf.md => karmanode-conf.md} (74%) mode change 100755 => 100644 create mode 100644 doc/keepass.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.10.0.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.3.12.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.3.13.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.3.14.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.3.15.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.3.16.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.3.17.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.3.18.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.3.19.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.3.20.1.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.3.20.2.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.3.20.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.3.21.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.3.22.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.3.23.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.3.24.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.4.0.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.4.1.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.4.2.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.4.3.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.4.4.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.4.5.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.4.6.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.5.0.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.5.1.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.5.2.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.5.3.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.5.4.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.5.5.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.6.0.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.6.1.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.6.2.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.6.3.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.7.0.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.7.1.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.7.2.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.8.0.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.8.1.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.8.2.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.8.3.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.8.4.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.8.5.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.8.6.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.9.1.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.9.2.1.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.9.2.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.9.3.md create mode 100644 doc/release-notes/bitcoin/release-notes-0.9.4.md create mode 100644 doc/release-notes/dash/release-notes-0.10.0.md create mode 100644 doc/release-notes/dash/release-notes-0.11.0.md create mode 100644 doc/release-notes/dash/release-notes-0.11.1.md create mode 100644 doc/release-notes/dash/release-notes-0.11.2.md create mode 100644 doc/release-notes/dash/release-notes-0.12.0.md create mode 100644 doc/release-notes/dash/release-notes-0.9.0.md create mode 100644 doc/release-notes/phore/release-notes-1.2.1.md create mode 100644 doc/release-notes/phore/release-notes-1.2.2.md create mode 100644 doc/release-notes/phore/release-notes-1.3.0.md create mode 100644 doc/release-notes/phore/release-notes-1.3.1.md delete mode 100755 doc/release-notes/release-notes-2.1.5.md delete mode 100755 doc/release-notes/release-notes-2.1.6.md delete mode 100755 doc/release-notes/release-notes-2.1.7.md delete mode 100755 doc/release-notes/release-notes-2.2.0.md delete mode 100755 doc/release-notes/release-notes-2.2.1.md create mode 100644 doc/release-notes/release-notes-2.3.0.md create mode 100644 doc/release-notes/release-notes-2.3.1.md create mode 100644 doc/release-notes/release-notes-3.0.0.md create mode 100644 doc/release-notes/release-notes-3.0.2.md delete mode 100755 qa/rpc-tests/README.md delete mode 100755 qa/rpc-tests/bipdersig.py delete mode 100755 qa/rpc-tests/conflictedbalance.sh delete mode 100755 qa/rpc-tests/forknotify.py delete mode 100755 qa/rpc-tests/getblocktemplate_longpoll.py delete mode 100755 qa/rpc-tests/getblocktemplate_proposals.py delete mode 100755 qa/rpc-tests/getchaintips.py delete mode 100755 qa/rpc-tests/httpbasics.py delete mode 100755 qa/rpc-tests/invalidateblock.py delete mode 100755 qa/rpc-tests/keypool.py delete mode 100755 qa/rpc-tests/mempool_coinbase_spends.py delete mode 100755 qa/rpc-tests/mempool_resurrect_test.py delete mode 100755 qa/rpc-tests/mempool_spendcoinbase.py delete mode 100755 qa/rpc-tests/python-bitcoinrpc/setup.py delete mode 100755 qa/rpc-tests/receivedby.py delete mode 100755 qa/rpc-tests/reindex.py delete mode 100755 qa/rpc-tests/rest.py delete mode 100755 qa/rpc-tests/rpcbind_test.py delete mode 100755 qa/rpc-tests/send.sh delete mode 100755 qa/rpc-tests/smartfees.py delete mode 100755 qa/rpc-tests/test_framework.py delete mode 100755 qa/rpc-tests/txn_doublespend.py delete mode 100755 qa/rpc-tests/util.py delete mode 100755 qa/rpc-tests/util.sh delete mode 100755 qa/rpc-tests/walletbackup.py delete mode 100755 qa/rpc-tests/zapwallettxes.sh delete mode 100755 qa/rpc-tests/zmq_test.py create mode 100644 src/accumulatorcheckpoints.cpp create mode 100644 src/accumulatorcheckpoints.h create mode 100644 src/accumulatorcheckpoints.json.h create mode 100644 src/accumulatormap.cpp create mode 100644 src/accumulatormap.h create mode 100644 src/accumulators.cpp create mode 100644 src/accumulators.h create mode 100644 src/bech32.cpp create mode 100644 src/bech32.h delete mode 100755 src/bignum.h create mode 100644 src/consensus/merkle.cpp create mode 100644 src/consensus/merkle.h create mode 100644 src/consensus/validation.h create mode 100644 src/denomination_functions.cpp create mode 100644 src/denomination_functions.h create mode 100644 src/httprpc.cpp create mode 100644 src/httprpc.h create mode 100644 src/httpserver.cpp create mode 100644 src/httpserver.h delete mode 100755 src/json/LICENSE.txt delete mode 100755 src/json/json_spirit.h delete mode 100755 src/json/json_spirit_error_position.h delete mode 100755 src/json/json_spirit_reader.cpp delete mode 100755 src/json/json_spirit_reader.h delete mode 100755 src/json/json_spirit_reader_template.h delete mode 100755 src/json/json_spirit_stream_reader.h delete mode 100755 src/json/json_spirit_utils.h delete mode 100755 src/json/json_spirit_value.cpp delete mode 100755 src/json/json_spirit_value.h delete mode 100755 src/json/json_spirit_writer.cpp delete mode 100755 src/json/json_spirit_writer.h delete mode 100755 src/json/json_spirit_writer_template.h create mode 100644 src/libzerocoin/Accumulator.cpp create mode 100644 src/libzerocoin/Accumulator.h create mode 100644 src/libzerocoin/AccumulatorProofOfKnowledge.cpp create mode 100644 src/libzerocoin/AccumulatorProofOfKnowledge.h create mode 100644 src/libzerocoin/Coin.cpp create mode 100644 src/libzerocoin/Coin.h create mode 100644 src/libzerocoin/CoinSpend.cpp create mode 100644 src/libzerocoin/CoinSpend.h create mode 100644 src/libzerocoin/Commitment.cpp create mode 100644 src/libzerocoin/Commitment.h create mode 100644 src/libzerocoin/Denominations.cpp create mode 100644 src/libzerocoin/Denominations.h create mode 100644 src/libzerocoin/LICENSE create mode 100644 src/libzerocoin/ParamGeneration.cpp create mode 100644 src/libzerocoin/ParamGeneration.h create mode 100644 src/libzerocoin/Params.cpp create mode 100644 src/libzerocoin/Params.h create mode 100644 src/libzerocoin/SerialNumberSignatureOfKnowledge.cpp create mode 100644 src/libzerocoin/SerialNumberSignatureOfKnowledge.h create mode 100644 src/libzerocoin/SpendType.h create mode 100644 src/libzerocoin/ZerocoinDefines.h create mode 100644 src/libzerocoin/bignum.h create mode 100644 src/libzerocoin/documentation/Doxyfile create mode 100644 src/libzerocoin/documentation/manual/intro.tex create mode 100644 src/libzerocoin/documentation/manual/manual.pdf create mode 100644 src/libzerocoin/documentation/manual/manual.tex create mode 100644 src/libzerocoin/documentation/manual/using.tex create mode 100644 src/libzerocoin/paramgen.cpp create mode 100644 src/libzerocoin/zerocoin.pc.in create mode 100644 src/mintpool.cpp create mode 100644 src/mintpool.h rename src/{privatesend-relay.cpp => obfuscation-relay.cpp} (90%) mode change 100755 => 100644 rename src/{privatesend-relay.h => obfuscation-relay.h} (92%) mode change 100755 => 100644 rename src/{privatesend.cpp => obfuscation.cpp} (79%) mode change 100755 => 100644 rename src/{privatesend.h => obfuscation.h} (80%) mode change 100755 => 100644 rename src/{ohmcd-res.rc => ohmcoin-cli-res.rc} (81%) mode change 100755 => 100644 rename src/{ohmc-cli.cpp => ohmcoin-cli.cpp} (52%) mode change 100755 => 100644 create mode 100644 src/ohmcoin-tx-res.rc rename src/{ohmc-tx.cpp => ohmcoin-tx.cpp} (89%) mode change 100755 => 100644 rename src/{ohmc-cli-res.rc => ohmcoind-res.rc} (81%) mode change 100755 => 100644 rename src/{ohmcd.cpp => ohmcoind.cpp} (75%) mode change 100755 => 100644 create mode 100644 src/primitives/deterministicmint.cpp create mode 100644 src/primitives/deterministicmint.h create mode 100644 src/primitives/zerocoin.cpp create mode 100644 src/primitives/zerocoin.h create mode 100644 src/qt/bantablemodel.cpp create mode 100644 src/qt/bantablemodel.h create mode 100644 src/qt/columnalignedlayout.cpp create mode 100644 src/qt/columnalignedlayout.h create mode 100644 src/qt/configurekarmanodepage.cpp create mode 100644 src/qt/configurekarmanodepage.h create mode 100644 src/qt/forms/configurekarmanodepage.ui create mode 100644 src/qt/forms/multisigdialog.ui rename src/qt/forms/{privatesendconfig.ui => obfuscationconfig.ui} (97%) mode change 100755 => 100644 create mode 100644 src/qt/forms/privacydialog.ui create mode 100644 src/qt/forms/proposaldialog.ui create mode 100644 src/qt/forms/zohmccontroldialog.ui delete mode 100755 src/qt/locale/ohmc_bg.ts delete mode 100755 src/qt/locale/ohmc_ca.ts delete mode 100755 src/qt/locale/ohmc_de.ts delete mode 100755 src/qt/locale/ohmc_ja.ts delete mode 100755 src/qt/locale/ohmc_nl.ts delete mode 100755 src/qt/locale/ohmc_zh_CN.ts create mode 100644 src/qt/locale/ohmcoin_bg.ts create mode 100644 src/qt/locale/ohmcoin_ca.ts rename src/qt/locale/{ohmc_cs.ts => ohmcoin_cs.ts} (91%) mode change 100755 => 100644 rename src/qt/locale/{ohmc_da.ts => ohmcoin_da.ts} (89%) mode change 100755 => 100644 create mode 100644 src/qt/locale/ohmcoin_de.ts rename src/qt/locale/{ohmc_en.ts => ohmcoin_en.ts} (79%) mode change 100755 => 100644 rename src/qt/locale/{ohmc_en_US.ts => ohmcoin_en_US.ts} (91%) mode change 100755 => 100644 rename src/qt/locale/{ohmc_es.ts => ohmcoin_es.ts} (80%) mode change 100755 => 100644 rename src/qt/locale/{ohmc_fi.ts => ohmcoin_fi.ts} (63%) mode change 100755 => 100644 rename src/qt/locale/{ohmc_fr_FR.ts => ohmcoin_fr_FR.ts} (89%) mode change 100755 => 100644 create mode 100644 src/qt/locale/ohmcoin_hr.ts rename src/qt/locale/{ohmc_it.ts => ohmcoin_it.ts} (87%) mode change 100755 => 100644 create mode 100644 src/qt/locale/ohmcoin_ja.ts rename src/qt/locale/{ohmc_ko_KR.ts => ohmcoin_ko_KR.ts} (80%) mode change 100755 => 100644 create mode 100644 src/qt/locale/ohmcoin_nl.ts rename src/qt/locale/{ohmc_pl.ts => ohmcoin_pl.ts} (93%) mode change 100755 => 100644 rename src/qt/locale/{ohmc_pt.ts => ohmcoin_pt.ts} (91%) mode change 100755 => 100644 rename src/qt/locale/{ohmc_pt_BR.ts => ohmcoin_pt_BR.ts} (90%) mode change 100755 => 100644 rename src/qt/locale/{ohmc_ro_RO.ts => ohmcoin_ro_RO.ts} (96%) mode change 100755 => 100644 rename src/qt/locale/{ohmc_ru.ts => ohmcoin_ru.ts} (87%) mode change 100755 => 100644 rename src/qt/locale/{ohmc_sk.ts => ohmcoin_sk.ts} (87%) mode change 100755 => 100644 rename src/qt/locale/{ohmc_sv.ts => ohmcoin_sv.ts} (88%) mode change 100755 => 100644 create mode 100644 src/qt/locale/ohmcoin_tr.ts rename src/qt/locale/{ohmc_uk.ts => ohmcoin_uk.ts} (87%) mode change 100755 => 100644 create mode 100644 src/qt/locale/ohmcoin_zh_CN.ts rename src/qt/locale/{ohmc_zh_TW.ts => ohmcoin_zh_TW.ts} (84%) mode change 100755 => 100644 create mode 100644 src/qt/multisigdialog.cpp create mode 100644 src/qt/multisigdialog.h rename src/qt/{privatesendconfig.cpp => obfuscationconfig.cpp} (52%) mode change 100755 => 100644 rename src/qt/{privatesendconfig.h => obfuscationconfig.h} (62%) mode change 100755 => 100644 delete mode 100755 src/qt/ohmc.qrc delete mode 100755 src/qt/ohmc_locale.qrc rename src/qt/{ohmc.cpp => ohmcoin.cpp} (93%) mode change 100755 => 100644 create mode 100644 src/qt/ohmcoin.qrc create mode 100644 src/qt/ohmcoin_locale.qrc delete mode 100755 src/qt/ohmcstrings.cpp create mode 100644 src/qt/phorestrings.cpp create mode 100755 src/qt/privacydialog.cpp create mode 100644 src/qt/privacydialog.h create mode 100644 src/qt/proposaldialog.cpp create mode 100644 src/qt/proposaldialog.h create mode 100644 src/qt/proposalfilterproxy.cpp create mode 100644 src/qt/proposalfilterproxy.h create mode 100644 src/qt/proposallist.cpp create mode 100644 src/qt/proposallist.h create mode 100644 src/qt/proposalrecord.cpp create mode 100644 src/qt/proposalrecord.h create mode 100644 src/qt/proposaltablemodel.cpp create mode 100644 src/qt/proposaltablemodel.h create mode 100644 src/qt/res/fonts/Hind-Bold.ttf create mode 100644 src/qt/res/fonts/Hind-Light.ttf create mode 100644 src/qt/res/fonts/Hind-Medium.ttf create mode 100644 src/qt/res/fonts/Hind-Regular.ttf create mode 100644 src/qt/res/fonts/Hind-SemiBold.ttf create mode 100644 src/qt/res/fonts/Montserrat-Bold.ttf create mode 100644 src/qt/res/icons/history_off.png create mode 100644 src/qt/res/icons/karmanodes_off.png create mode 100644 src/qt/res/icons/overview_off.png create mode 100644 src/qt/res/icons/privacy.png create mode 100644 src/qt/res/icons/privacy_off.png create mode 100644 src/qt/res/icons/proposal.png create mode 100644 src/qt/res/icons/proposal_off.png create mode 100644 src/qt/res/icons/receive_dark.png create mode 100644 src/qt/res/icons/receive_off.png create mode 100644 src/qt/res/icons/send_dark.png create mode 100644 src/qt/res/icons/send_off.png rename src/qt/res/icons/{tx_karma.png => tx_karmanode.png} (100%) mode change 100755 => 100644 create mode 100644 src/qt/res/icons/tx_staked.png rename src/qt/res/icons/{unit_mohmc.png => unit_mohmcoin.png} (100%) mode change 100755 => 100644 rename src/qt/res/icons/{unit_ohmc.png => unit_ohmcoin.png} (100%) mode change 100755 => 100644 rename src/qt/res/icons/{unit_tmohmc.png => unit_tmohmcoin.png} (100%) mode change 100755 => 100644 rename src/qt/res/icons/{unit_tohmc.png => unit_tohmcoin.png} (100%) mode change 100755 => 100644 rename src/qt/res/icons/{unit_tuohmc.png => unit_tuohmcoin.png} (100%) mode change 100755 => 100644 rename src/qt/res/icons/{unit_uohmc.png => unit_uohmcoin.png} (100%) mode change 100755 => 100644 create mode 100644 src/qt/res/images/downArrow_dark.png create mode 100644 src/qt/res/images/downArrow_small_dark.png create mode 100644 src/qt/res/images/leftArrow_small_dark.png rename src/qt/res/images/{ohmc_logo_horizontal.png => ohmcoin_logo_horizontal.png} (100%) mode change 100755 => 100644 create mode 100644 src/qt/res/images/rightArrow_small_dark.png create mode 100644 src/qt/res/images/splash@2x.png create mode 100644 src/qt/res/images/splash_testnet@2x.png create mode 100644 src/qt/res/images/upArrow.png create mode 100644 src/qt/res/images/upArrow_small_dark.png rename src/qt/res/{ohmc-qt-res.rc => ohmcoin-qt-res.rc} (100%) mode change 100755 => 100644 create mode 100644 src/qt/zohmccontroldialog.cpp create mode 100644 src/qt/zohmccontroldialog.h create mode 100644 src/reverse_iterate.h create mode 100644 src/reverselock.h create mode 100644 src/scheduler.cpp create mode 100644 src/scheduler.h create mode 100644 src/sporkdb.cpp create mode 100644 src/sporkdb.h create mode 100644 src/support/allocators/zeroafterfree.h create mode 100644 src/support/cleanse.cpp create mode 100644 src/support/cleanse.h create mode 100644 src/test/benchmark_zerocoin.cpp create mode 100644 src/test/budget_tests.cpp create mode 100644 src/test/libzerocoin_tests.cpp create mode 100644 src/test/policyestimator_tests.cpp create mode 100644 src/test/reverselock_tests.cpp delete mode 100755 src/test/rpc_wallet_tests.cpp create mode 100644 src/test/scheduler_tests.cpp create mode 100644 src/test/script_standard_tests.cpp rename src/test/{test_ohmc.cpp => test_phore.cpp} (93%) mode change 100755 => 100644 create mode 100644 src/test/torcontrol_tests.cpp create mode 100644 src/test/tutorial_zerocoin.cpp create mode 100644 src/test/txvalidationcache_tests.cpp create mode 100644 src/test/zerocoin_denomination_tests.cpp create mode 100644 src/test/zerocoin_implementation_tests.cpp create mode 100644 src/test/zerocoin_transactions_tests.cpp create mode 100644 src/torcontrol.cpp create mode 100644 src/torcontrol.h create mode 100644 src/univalue/.gitignore create mode 100644 src/univalue/.travis.yml create mode 100644 src/univalue/COPYING create mode 100644 src/univalue/Makefile.am create mode 100644 src/univalue/README.md create mode 100644 src/univalue/TODO create mode 100644 src/univalue/autogen.sh create mode 100644 src/univalue/build-aux/m4/.gitignore create mode 100644 src/univalue/configure.ac rename src/univalue/{ => gen}/gen.cpp (73%) mode change 100755 => 100644 create mode 100644 src/univalue/include/univalue.h create mode 100644 src/univalue/lib/.gitignore create mode 100644 src/univalue/lib/univalue.cpp rename src/univalue/{ => lib}/univalue_escapes.h (84%) mode change 100755 => 100644 rename src/univalue/{ => lib}/univalue_read.cpp (60%) mode change 100755 => 100644 create mode 100644 src/univalue/lib/univalue_utffilter.h rename src/univalue/{ => lib}/univalue_write.cpp (86%) mode change 100755 => 100644 create mode 100644 src/univalue/pc/libunivalue-uninstalled.pc.in create mode 100644 src/univalue/pc/libunivalue.pc.in create mode 100644 src/univalue/test/.gitignore create mode 100644 src/univalue/test/fail1.json create mode 100644 src/univalue/test/fail10.json create mode 100644 src/univalue/test/fail11.json create mode 100644 src/univalue/test/fail12.json create mode 100644 src/univalue/test/fail13.json create mode 100644 src/univalue/test/fail14.json create mode 100644 src/univalue/test/fail15.json create mode 100644 src/univalue/test/fail16.json create mode 100644 src/univalue/test/fail17.json create mode 100644 src/univalue/test/fail18.json create mode 100644 src/univalue/test/fail19.json create mode 100644 src/univalue/test/fail2.json create mode 100644 src/univalue/test/fail20.json create mode 100644 src/univalue/test/fail21.json create mode 100644 src/univalue/test/fail22.json create mode 100644 src/univalue/test/fail23.json create mode 100644 src/univalue/test/fail24.json create mode 100644 src/univalue/test/fail25.json create mode 100644 src/univalue/test/fail26.json create mode 100644 src/univalue/test/fail27.json create mode 100644 src/univalue/test/fail28.json create mode 100644 src/univalue/test/fail29.json create mode 100644 src/univalue/test/fail3.json create mode 100644 src/univalue/test/fail30.json create mode 100644 src/univalue/test/fail31.json create mode 100644 src/univalue/test/fail32.json create mode 100644 src/univalue/test/fail33.json create mode 100644 src/univalue/test/fail34.json create mode 100644 src/univalue/test/fail35.json create mode 100644 src/univalue/test/fail36.json create mode 100644 src/univalue/test/fail37.json create mode 100644 src/univalue/test/fail38.json create mode 100644 src/univalue/test/fail39.json create mode 100644 src/univalue/test/fail4.json create mode 100644 src/univalue/test/fail40.json create mode 100644 src/univalue/test/fail41.json create mode 100644 src/univalue/test/fail42.json create mode 100644 src/univalue/test/fail44.json create mode 100644 src/univalue/test/fail5.json create mode 100644 src/univalue/test/fail6.json create mode 100644 src/univalue/test/fail7.json create mode 100644 src/univalue/test/fail8.json create mode 100644 src/univalue/test/fail9.json create mode 100644 src/univalue/test/no_nul.cpp create mode 100644 src/univalue/test/object.cpp create mode 100644 src/univalue/test/pass1.json create mode 100644 src/univalue/test/pass2.json create mode 100644 src/univalue/test/pass3.json create mode 100644 src/univalue/test/round1.json create mode 100644 src/univalue/test/round2.json create mode 100644 src/univalue/test/round3.json create mode 100644 src/univalue/test/round4.json create mode 100644 src/univalue/test/round5.json create mode 100644 src/univalue/test/round6.json create mode 100644 src/univalue/test/round7.json create mode 100644 src/univalue/test/test_json.cpp create mode 100644 src/univalue/test/unitester.cpp delete mode 100755 src/univalue/univalue.cpp delete mode 100755 src/univalue/univalue.h create mode 100644 src/zohmctracker.cpp create mode 100644 src/zohmctracker.h create mode 100644 src/zohmcwallet.cpp create mode 100644 src/zohmcwallet.h create mode 100644 test/decodetx.py rename {qa/rpc-tests => test}/listtransactions.py (55%) mode change 100755 => 100644 create mode 100644 test/segwit.py create mode 100644 test/test_case_base.py rename {qa/rpc-tests/python-bitcoinrpc/bitcoinrpc => test/test_framework}/__init__.py (100%) mode change 100755 => 100644 create mode 100644 test/test_framework/address.py rename {qa/rpc-tests/python-bitcoinrpc/bitcoinrpc => test/test_framework}/authproxy.py (60%) mode change 100755 => 100644 create mode 100644 test/test_framework/bignum.py create mode 100644 test/test_framework/blockstore.py create mode 100644 test/test_framework/blocktools.py create mode 100644 test/test_framework/comptool.py create mode 100644 test/test_framework/coverage.py create mode 100644 test/test_framework/key.py create mode 100644 test/test_framework/messages.py create mode 100644 test/test_framework/mininode.py rename {qa/rpc-tests => test/test_framework}/netutil.py (83%) mode change 100755 => 100644 create mode 100644 test/test_framework/script.py create mode 100644 test/test_framework/segwit_addr.py create mode 100644 test/test_framework/siphash.py create mode 100644 test/test_framework/socks5.py create mode 100644 test/test_framework/test_framework.py create mode 100644 test/test_framework/test_node.py create mode 100644 test/test_framework/util.py rename {qa/rpc-tests => test}/wallet.py (59%) mode change 100755 => 100644 create mode 100644 test/zerocoin.py diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index d41287a..94f799a 100755 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,7 +1,7 @@ -This issue tracker is only for technical issues related to OHMC Core. -General OHMC questions and/or support requests and are best directed to the [OHMC Slack](http://ohmc.slack.com). +This issue tracker is only for technical issues related to Ohmcoin Core. +General Ohmcoin questions and/or support requests and are best directed to the [Ohmcoin Discord](https://discord.gg/sbgdcdv). ### Describe the issue @@ -20,7 +20,7 @@ Tell us what happens instead ### Screenshots. If the issue is related to the GUI, screenshots can be added to this issue via drag & drop. -### What version of OHMC Core are you using? +### What version of Ohmcoin Core are you using? List the version number/commit ID, and if it is an official binary, self compiled or a distribution package. ### Machine specs: diff --git a/.gitignore b/.gitignore index 542a6dd..b2cb8c8 100644 --- a/.gitignore +++ b/.gitignore @@ -121,8 +121,8 @@ src/qt/test/moc*.cpp # Compilation and Qt preprocessor part *.qm Makefile -ohmc-qt -OHMC-Qt.app +ohmcoin-qt +OHMCOIN-Qt.app # Unit-tests Makefile.test @@ -165,3 +165,11 @@ qa/pull-tester/test.*/* .idea CMakeLists.txt cmake-build-debug +src/config/ohmcoin-config.h +src/config/ohmcoin-config.h.in +*.tmp +doc/Doxyfile +src/ohmcoin-cli +src/ohmcoin-tx +src/ohmcoind +doc/Doxyfile diff --git a/.travis.yml b/.travis.yml index 9447881..02a9e5a 100755 --- a/.travis.yml +++ b/.travis.yml @@ -7,13 +7,12 @@ cache: - depends/built - depends/sdk-sources - $HOME/.ccache -stages: - - lint - - test env: global: - MAKEJOBS=-j3 - - RUN_TESTS=false + - RUN_TESTS=true + - CHECK_DOC=1 + - CHECK_LOGPRINT=1 - BOOST_TEST_RANDOM=1$TRAVIS_BUILD_ID - CCACHE_SIZE=100M - CCACHE_TEMPDIR=/tmp/.ccache-temp @@ -23,14 +22,14 @@ env: - WINEDEBUG=fixme-all matrix: # ARM - - HOST=arm-linux-gnueabihf PACKAGES="g++-arm-linux-gnueabihf" GOAL="install" BITCOIN_CONFIG="--enable-glibc-back-compat --enable-reduce-exports" + - HOST=arm-linux-gnueabihf PACKAGES="g++-arm-linux-gnueabihf" CHECK_DOC=1 CHECK_LOGPRINT=1 GOAL="install" BITCOIN_CONFIG="--enable-glibc-back-compat --enable-reduce-exports" # Win32 - HOST=i686-w64-mingw32 DPKG_ADD_ARCH="i386" DEP_OPTS="NO_QT=1" PACKAGES="python3 nsis g++-mingw-w64-i686 wine1.6 bc" RUN_TESTS=true GOAL="install" BITCOIN_CONFIG="--enable-reduce-exports" # 32-bit + dash - HOST=i686-pc-linux-gnu PACKAGES="g++-multilib bc python3-zmq" DEP_OPTS="NO_QT=1" RUN_TESTS=true GOAL="install" BITCOIN_CONFIG="--enable-zmq --enable-glibc-back-compat --enable-reduce-exports LDFLAGS=-static-libstdc++" USE_SHELL="/bin/dash" PYZMQ=true # Win64 - HOST=x86_64-w64-mingw32 DPKG_ADD_ARCH="i386" DEP_OPTS="NO_QT=1" PACKAGES="python3 nsis g++-mingw-w64-x86-64 wine1.6 bc" RUN_TESTS=true GOAL="install" BITCOIN_CONFIG="--enable-reduce-exports" -# ohmcd +# ohmcoind - HOST=x86_64-unknown-linux-gnu PACKAGES="bc python3-zmq" DEP_OPTS="NO_QT=1 NO_UPNP=1 DEBUG=1" RUN_TESTS=true GOAL="install" BITCOIN_CONFIG="--enable-zmq --enable-glibc-back-compat --enable-reduce-exports CPPFLAGS=-DDEBUG_LOCKORDER" PYZMQ=true # No wallet # - HOST=x86_64-unknown-linux-gnu PACKAGES="python3" DEP_OPTS="NO_WALLET=1" RUN_TESTS=true GOAL="install" BITCOIN_CONFIG="--enable-glibc-back-compat --enable-reduce-exports" @@ -45,6 +44,8 @@ install: - if [ -n "$PACKAGES" ]; then travis_retry sudo apt-get update; fi - if [ -n "$PACKAGES" ]; then travis_retry sudo apt-get install --no-install-recommends --no-upgrade -qq $PACKAGES; fi before_script: + - if [ "$CHECK_DOC" = 1 ]; then contrib/devtools/check-doc.py; fi + - if [ "$CHECK_LOGPRINT" = 1 ]; then contrib/devtools/logprint-scanner.py; fi - unset CC; unset CXX - mkdir -p depends/SDKs depends/sdk-sources - if [ -n "$OSX_SDK" -a ! -f depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz ]; then curl --location --fail $SDK_URL/MacOSX${OSX_SDK}.sdk.tar.gz -o depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz; fi @@ -58,36 +59,15 @@ script: - depends/$HOST/native/bin/ccache --max-size=$CCACHE_SIZE - test -n "$USE_SHELL" && eval '"$USE_SHELL" -c "./autogen.sh"' || ./autogen.sh - ./configure --cache-file=config.cache $BITCOIN_CONFIG_ALL $BITCOIN_CONFIG || ( cat config.log && false) - - make distdir PACKAGE=bitcoin VERSION=$HOST - - cd bitcoin-$HOST + - make distdir PACKAGE=ohmcoin VERSION=$HOST + - cd ohmcoin-$HOST - ./configure --cache-file=../config.cache $BITCOIN_CONFIG_ALL $BITCOIN_CONFIG || ( cat config.log && false) - make $MAKEJOBS $GOAL || ( echo "Build failure. Verbose build follows." && make $GOAL V=1 ; false ) - export LD_LIBRARY_PATH=$TRAVIS_BUILD_DIR/depends/$HOST/lib - if [ "$RUN_TESTS" = "true" ]; then travis_wait 30 make $MAKEJOBS check VERBOSE=1; fi - #- if [ "$RUN_TESTS" = "true" ]; then qa/pull-tester/rpc-tests.py --coverage; fi after_script: - echo $TRAVIS_COMMIT_RANGE - echo $TRAVIS_COMMIT_LOG - -jobs: - include: - - stage: lint - sudo: false - cache: false - addons: - apt: - packages: - - python3-pip - - shellcheck - install: - - travis_retry pip3 install flake8 --user - before_script: - - git fetch --unshallow - script: - - contrib/devtools/git-subtree-check.sh src/univalue - # Remove this comment and the `#` from the following two lines when we merge proper subtree implementations for secp256k1 and leveldb - #- contrib/devtools/git-subtree-check.sh src/secp256k1 - #- contrib/devtools/git-subtree-check.sh src/leveldb - - contrib/devtools/check-doc.py - - contrib/devtools/logprint-scanner.py - - if [ "$TRAVIS_EVENT_TYPE" = "pull_request" ]; then contrib/devtools/lint-whitespace.sh; fi \ No newline at end of file +notifications: + slack: + secure: w22XjHoG/3xplxWzddS9Ma7i99Q/hq4FA3Q56xS+RtO2vlFgDT+eDzCppstdx96mn2/4e+/V1aiQ4E6GVEvJMeldqSUhPv9OBnKR0KJVAOwu4haNXt+0ZeQFt8lIndKB5cMVyOJkoq6peGoHNXslClM0lGuBn7g7VC2QPQYNWrJNrrGL7IiVb6fNOIKHWcC4URkzSvXAhO/WIqSSlmKxAAx0B2oEsM8LhdAbcjbp7Sm7zH87TIVGBZ7iTVuMc6B9+SfClbE8bBuRtvjTX57Q4UUZzn0zDtKdPdCte0oXdaQF4RdVim9mDodBGIpDo+avW4WL7EE+AK33fs94pwH5bu0LEandR/aeEvVpbSpQ2XsEKSe+6woizgl5i4GXFVZduJF62y/o1f+S/zC3qW9lIEEpiZc4PpX7pDy30X3p6S5nMrW7T/zNh+SjLhS1VP6XKdQtpD3WRCY4GKZYammZhk5RbOy3jTXAahIXuttWdhl/Q3Rb5VqfFJWlrG/qQXt73qOk2/DgJnABxXE6gnWO4MpHAq+kdomNR+nod4HeXI3DOk1wRuQRVoW1rSjiqQd6Db+TP56RKYgt4M4csOD0DG9G+W0AOtZkuKHTeoEtmQfkKFPZLYAQumv41cDN2UE9gKIECmvJSevj4sMCDTWtozKWqay/W4n2+cmhbzmGflY= diff --git a/.travis/github_deploy_key.enc b/.travis/github_deploy_key.enc deleted file mode 100644 index c1e009c36b92616f569754fcdd49628c12806396..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3248 zcmV;h3{Uf^h3w@t1`I#=$JP+uJzr)wWXD4+X3IcDJ>XA3XR>+a!8S8CiE@=CiP0cQ z818vD&nyc6jgAb3A*cc!H~1NttWJ`1GyB0iM=Er=x36hLh!3WY@N6&O#H&RDotTv> zU^Hn;5UBKMRAA5=@Tp^$R({7-Dij)Jnp!T+{vsw%lw<^^YiBxG4`~LP8;U)=s+X`d zX0e7LDY3TT@j~;LyIgyr+$7DrGU^#7)Eavu4%Eh3^=DFLeK0>!q-_RdbgWi(yM6#Y z7cBak0gKrV6Lz*d`3AP&QujZac%&1+%w zz%YbY1TdlLOikZxrsEU13KMCv{7m0CZ&_EE=w);#Mu2%+AWoC9QGwS7sPqu}w{< z79b2g$;zJ*M&P*OGw<=wq|-{|%ds;5RZ+Bhe=Fsj`c<6*hT-14KsWl8w6OYuM*8s- z5HK3TVsA`d8~_6FWv=kOAFE%Myy-EA%6%~f(xZaTEFRerZ2k}0%+`mZzbtm?zX?#n z@M~sH7M0-(;YDlXl3Q3Fvz%PD$32j>>D%XvroXbHkRJtQp!b$G$mJcT8zPM(&HXlR z1E4NDxmE`yUAearv(PRHS${C9?5Q8-Ey@ykUzG%LFFzLfrr}E73(g*3VL>9=UbUju zl4YLg5h3a<7y4$t6_7E7=OC?oGQ3L8fJsE^I-5mihoXeqAu2-*bm$a$+8!d_tH`xb z$!(aZ??s_%*PxQ>6w!xuM>!tw0Kwhqf3E+onuvt-%2D%*v-?9M?KP4z@Ww37f--B} zOJA`X>|zA|-R2ysWEeEyS`haR^Kn)vh=li5w=r})8V`YvQXh6J#k)*vdvNPu;)O}z zfXgE$^nc-n`l%pENYkRs_0jru`dZh@?xdU$-TL>zFixx;1WmIxz@ft4YTh>6Y;4hN z!RBzw_89;g3N>p|ChA&kr9e;=j+R@mQc?LR+2Js*n-|< zjbD&A-O-ks*s2NnQp%ggX60oHRf|K!W|NhS)lvneuk2a!@SiZcG>;HS%>Qz+%qwm) z&%dXC(GQ}*H5D@K9YZ51lLr8p%JwM8R8iF%8yw&XSMVuXk4Yye=&;36c~!x{W*s!p z{#^S6F9N1FAXdY#Dx_yk=gO^Hg>#b=FyPFmO9a?RHV@U+jvfCxcOtyzB=C;$YVUlE zuXIC11-%)b&zTajqmOq3&sRIE1|z)_7Jsh`snwFI_|B$P*P@XatMW-|Amvaw?C5ep zTAu-Gg=+AJ{g}W#*r9<~1GaV3Lsaww7MS>$H|2`keWXayDFnBDi%08HM7u~T2Vd(P zB~-1A)?+DIcKpsCg1hmoFXC4D*)4cM0%Dbwa?mb%g&J5)q0*S$`Ig^5(b!ZdIw`^C zKcFvIP#3!5Tpj&S1$#N%x)t1>o8(JCFX`>(HEjxb(%j01quRAm-3KDD2INb}ab*B; z(l|-nI_SSFcyr zCr&I-p(*CFRV4%mJqd0cXlc_{X4bNd6XAfsPeCNfF>_LgA z88gDOX|S{%ThqA^Q^hYBo_YDrSk5X1RIr(2qXfGddFaP&z-q?rJ^TjeMswH*<;3=6 zG#NG$wZJt1I+$ra$t+^6C!*;P1sGC6>Y+AKq+ob(JE#%7A0(xsx1q2+#b*-f)l0d5 z8M_6she?{y&mPTSX5>d%4jy&i_U1~@*jDsv^{STq;Z;$r39(Mcy%p4q-`$(^|5;JW zJ^5rm0gjMJGyq0Qe(mDuV@fFFs`(nn_O+b9Gn~ecvVKPUnn;xrcZE+1PZrTCydCMLbSu|rW;6mOo z(Oz!|XWqg2f zYQrUgM0k6-1YO1H(PRyWxDc;;;P6spu52;WubHqeRe$s#NbXHs^>LQw-2hGD_ryde zEf;R;&9){sh~+B(5f1bsE43nXUHERWr0nTb9*cx*iOj`uT(zMvEN8>;OKI}|B$9xi zg2h~SP?C=MJ;r8v@gG(59l${tKr9@{xSW@NH5cW|=qsr^(A`j?vnl}bzWJ72u!g$N zyUD5*F9?g@UVeTbB$+FBra}JZp*mQUp&%`@+#4egS~nw0KKC5{7CY#4I%(~MCo&e) z_jsHMzUwOBCv%RZ3AVJ_rbaQ1;P&zu$!-)X|Jd3Z09SBqycVFD-d4#6MuW6w!FP=DHDjmq*gtTsr zp_xJl-fiV87KACM8p{X1Aa~U9GYSeNG$p$$Byiexou}slR|%ubvc{d=J0BidG|(kW zZt{{wT$mmufa{2_&BHTzYGnf#<0bELpfgF{BMT>4`h}~J^!Yc4wV@LNW$_kTXes0X zGP%gzO-Xq!jvd7gXYb9*%d!(f!D}}EQms{g9$w&sj*Gv|z}%}VbOsK*ky{d%Su$ZI zEF;w|f3YWRh*ij`+udeoN~FK%kKuUZccQil_CUHBQp@5ZB6?5&(9>}IbZp4F`qlV z>c)Z9y;2YNQT^5s+MA+L5Zo)-owFPsq-!()6$79e%n2Jl^jkDSgxe))KGneM%<~9F zcWe~3;mO~=PIz3dX5Ci3{)uvavGfk*F7V#`ZKq4&xGvtMkj9YuQ=n(twaO3l#O%C> zLcVWr0=_QWlee*bY#ZU|c^{gbNE4&hU|f!*o|MdvLm3~D&MrM=FRABG8$Fi6wg}#| z>Ln-vEc16_j(;I)uZUP>CJHIV7vjm+5^R|m2^zEd;0?{!q&UvO>AjfWGTQ}N5FlNF+#h4hCDLs!2k3@4c$cYpb@ zy+Yih)JC|?96qOrV4HJe-i+PYBMB5Nq@dAUVncAp-fVJ1jB5#wRzr6BOkHvTiQ;`&HZcoF=VRHg@p60em0?MhI;2l|CXx!X^ zHO4ktOQeX9{j#KB+#-@q+E))TTUEm3vYNY?k*^Q=r=s<0b=4Gx>Owj;2?v!V1EWB@ z0G!Tg(DG0U#+~D_a~dw3j%1 zsKq-*&N8N?{Oal6F~;_84tlSOx40CQK127azybsskki+l0zHOx&O$qi3H=Lz6(J9a zGiK<+rd3T|uv}2s+li5*QA=e`i2jhhy8d6&Sdu!Tk)0iDzW;{iWxDpsG~xGdYywP# iAktmN%`x1_oMx}x_d`>Hx%H)`8^4e{+v~unnRZ=XN=i`x diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 62fc382..6dd5acb 100755 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,7 +1,7 @@ -Contributing to OHMC Core +Contributing to Ohmcoin Core ============================ -The OHMC Core project operates an open contributor model where anyone is +The Ohmcoin Core project operates an open contributor model where anyone is welcome to contribute towards development in the form of peer review, testing and patches. This document explains the practical process and guidelines for contributing. @@ -57,12 +57,12 @@ the pull request affects. Valid areas as: - *Consensus* for changes to consensus critical code - *Docs* for changes to the documentation - - *Qt* for changes to ohmc-qt + - *Qt* for changes to ohmcoin-qt - *Minting* for changes to the minting code - *Net* or *P2P* for changes to the peer-to-peer network code - *RPC/REST* for changes to the RPC or REST APIs - *Scripts and tools* for changes to the scripts and tools - - *Tests* for changes to the ohmc unit tests or QA tests + - *Tests* for changes to the ohmcoin unit tests or QA tests - *Trivial* should **only** be used for PRs that do not change generated executable code. Notably, refactors (change of function arguments and code reorganization) and changes in behavior should **not** be marked as trivial. @@ -157,10 +157,10 @@ where possible keep them short, un-complex and easy to verify. "Decision Making" Process ------------------------- -The following applies to code changes to the OHMC Core project, and is not to be -confused with overall OHMC Network Protocol consensus changes. +The following applies to code changes to the Ohmcoin Core project, and is not to be +confused with overall Ohmcoin Network Protocol consensus changes. -Whether a pull request is merged into OHMC Core rests with the project merge +Whether a pull request is merged into Ohmcoin Core rests with the project merge maintainers and ultimately the project lead. Maintainers will take into consideration if a patch is in line with the general @@ -174,7 +174,7 @@ In general, all pull requests must: - be well peer reviewed; - follow code style guidelines; -Patches that change OHMC consensus rules are considerably more involved than +Patches that change Ohmcoin consensus rules are considerably more involved than normal because they affect the entire ecosystem and so must be preceded by extensive discussions and clear detailing. While each case will be different, one should be prepared to expend more time and effort than for other kinds of @@ -214,7 +214,7 @@ higher in terms of discussion and peer review requirements, keeping in mind that mistakes could be very costly to the wider community. This includes refactoring of consensus critical code. -Where a patch set proposes to change the OHMC consensus, it must have been +Where a patch set proposes to change the Ohmcoin consensus, it must have been discussed extensively on the forums and Slack, be accompanied by a widely discussed Proposal and have a generally widely perceived technical consensus of being a worthwhile change based on the judgement of the maintainers. @@ -254,7 +254,7 @@ about: Release Policy -------------- -The project leader is the release manager for each OHMC Core release. +The project leader is the release manager for each Ohmcoin Core release. Copyright --------- diff --git a/COPYING b/COPYING index e21420c..f8919bb 100755 --- a/COPYING +++ b/COPYING @@ -1,6 +1,8 @@ Copyright (c) 2009-2015 Bitcoin Developers Copyright (c) 2014-2015 Dash Developers -Copyright (c) 2015-2017 PIVX Developers +Copyright (c) 2015-2017 The PIVX Developers +Copyright (c) 2017-2019 The Ohmcoin Developers + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..248c5df --- /dev/null +++ b/Dockerfile @@ -0,0 +1,23 @@ +FROM ubuntu:16.04 + +RUN apt-get update +RUN apt-get install -y wget pwgen + +ARG RPC_USER +ARG RPC_PASSWORD +ENV RPC_USER ${RPC_USER:-ohmcoin} +# Create a random password if the user doesn't set one +ENV RANDOM_PASS `pwgen -Bs1 12` +ENV RPC_PASSWORD ${RPC_PASSWORD:-$RANDOM_PASS} + +# Build the project +RUN wget https://github.com/theohmproject/Ohmcoin/releases/download/v1.2.0.0/ohmcoin-1.1.0-x86_64-linux-gnu.tar.gz -O ohmcoin-1.1.0.tar.gz +RUN tar -xvf ohmcoin-1.1.0.tar.gz +RUN mkdir -p /root/.ohmcoin/ +RUN echo "rpcuser=$RPC_USER\nrpcpassword=$RPC_PASSWORD" > /root/.ohmcoin/ohmcoin.conf + +EXPOSE 8332 8333 18332 18333 + +WORKDIR /ohmcoin-1.1.0/bin +CMD ["/ohmcoin-1.1.0/bin/ohmcoind"] + diff --git a/INSTALL b/INSTALL index 3f40319..84f529c 100755 --- a/INSTALL +++ b/INSTALL @@ -1,4 +1,4 @@ -Building OHMC +Building Ohmcoin Use the autogen script to prepare the build environment. @@ -8,6 +8,6 @@ Use the autogen script to prepare the build environment. Always verify the signatures and checksums. -See doc/build-*.md for instructions on building ohmcd, +See doc/build-*.md for instructions on building ohmcoind, the intended-for-services, no-graphical-interface, reference -implementation of OHMC. +implementation of Ohmcoin. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..3190549 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 The Ohmcoin Developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/Makefile.am b/Makefile.am index 6f0a7be..1800903 100755 --- a/Makefile.am +++ b/Makefile.am @@ -1,19 +1,27 @@ +# Copyright (c) 2013-2016 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + ACLOCAL_AMFLAGS = -I build-aux/m4 SUBDIRS = src .PHONY: deploy FORCE -GZIP_ENV="-9n" export PYTHONPATH -BITCOIND_BIN=$(top_builddir)/src/ohmcd$(EXEEXT) -BITCOIN_QT_BIN=$(top_builddir)/src/qt/ohmc-qt$(EXEEXT) -BITCOIN_CLI_BIN=$(top_builddir)/src/ohmc-cli$(EXEEXT) +if BUILD_BITCOIN_LIBS +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libbitcoinconsensus.pc +endif + +BITCOIND_BIN=$(top_builddir)/src/$(BITCOIN_DAEMON_NAME)$(EXEEXT) +BITCOIN_QT_BIN=$(top_builddir)/src/qt/$(BITCOIN_GUI_NAME)$(EXEEXT) +BITCOIN_CLI_BIN=$(top_builddir)/src/$(BITCOIN_CLI_NAME)$(EXEEXT) BITCOIN_WIN_INSTALLER=$(PACKAGE)-$(PACKAGE_VERSION)-win$(WINDOWS_BITS)-setup$(EXEEXT) empty := space := $(empty) $(empty) -OSX_APP=OHMC-Qt.app +OSX_APP=Ohmcoin-Qt.app OSX_VOLNAME = $(subst $(space),-,$(PACKAGE_NAME)) OSX_DMG = $(OSX_VOLNAME).dmg OSX_BACKGROUND_SVG=background.svg @@ -23,7 +31,7 @@ OSX_DSSTORE_GEN=$(top_srcdir)/contrib/macdeploy/custom_dsstore.py OSX_DEPLOY_SCRIPT=$(top_srcdir)/contrib/macdeploy/macdeployqtplus OSX_FANCY_PLIST=$(top_srcdir)/contrib/macdeploy/fancy.plist OSX_INSTALLER_ICONS=$(top_srcdir)/src/qt/res/icons/bitcoin.icns -OSX_PLIST=$(top_srcdir)/share/qt/Info.plist #not installed +OSX_PLIST=$(top_builddir)/share/qt/Info.plist #not installed OSX_QT_TRANSLATIONS = da,de,es,hu,ru,uk,zh_CN,zh_TW DIST_DOCS = $(wildcard doc/*.md) $(wildcard doc/release-notes/*.md) @@ -40,9 +48,9 @@ OSX_PACKAGING = $(OSX_DEPLOY_SCRIPT) $(OSX_FANCY_PLIST) $(OSX_INSTALLER_ICONS) \ $(top_srcdir)/contrib/macdeploy/detached-sig-create.sh COVERAGE_INFO = baseline_filtered_combined.info baseline.info block_test.info \ - leveldb_baseline.info test_ohmc_filtered.info total_coverage.info \ + leveldb_baseline.info test_ohmcoin_filtered.info total_coverage.info \ baseline_filtered.info block_test_filtered.info \ - leveldb_baseline_filtered.info test_ohmc_coverage.info test_ohmc.info + leveldb_baseline_filtered.info test_ohmcoin_coverage.info test_ohmcoin.info dist-hook: -$(MAKE) -C $(top_distdir)/src/leveldb clean @@ -62,11 +70,9 @@ $(BITCOIN_WIN_INSTALLER): all-recursive STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(BITCOIND_BIN) $(top_builddir)/release STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(BITCOIN_QT_BIN) $(top_builddir)/release STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(BITCOIN_CLI_BIN) $(top_builddir)/release - @test -f $(MAKENSIS) && $(MAKENSIS) $(top_builddir)/share/setup.nsi || \ + @test -f $(MAKENSIS) && $(MAKENSIS) -V2 $(top_builddir)/share/setup.nsi || \ echo error: could not build $@ - -$(if $(findstring src/,$(MAKECMDGOALS)),$(MAKECMDGOALS), none): FORCE - $(MAKE) -C src $(patsubst src/%,%,$@) + @echo built $@ $(OSX_APP)/Contents/PkgInfo: $(MKDIR_P) $(@D) @@ -84,7 +90,7 @@ $(OSX_APP)/Contents/Resources/bitcoin.icns: $(OSX_INSTALLER_ICONS) $(MKDIR_P) $(@D) $(INSTALL_DATA) $< $@ -$(OSX_APP)/Contents/MacOS/OHMC-Qt: $(BITCOIN_QT_BIN) +$(OSX_APP)/Contents/MacOS/Ohmcoin-Qt: $(BITCOIN_QT_BIN) $(MKDIR_P) $(@D) STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $< $@ @@ -94,14 +100,14 @@ $(OSX_APP)/Contents/Resources/Base.lproj/InfoPlist.strings: OSX_APP_BUILT=$(OSX_APP)/Contents/PkgInfo $(OSX_APP)/Contents/Resources/empty.lproj \ $(OSX_APP)/Contents/Resources/bitcoin.icns $(OSX_APP)/Contents/Info.plist \ - $(OSX_APP)/Contents/MacOS/OHMC-Qt $(OSX_APP)/Contents/Resources/Base.lproj/InfoPlist.strings + $(OSX_APP)/Contents/MacOS/Ohmcoin-Qt $(OSX_APP)/Contents/Resources/Base.lproj/InfoPlist.strings osx_volname: echo $(OSX_VOLNAME) >$@ if BUILD_DARWIN $(OSX_DMG): $(OSX_APP_BUILT) $(OSX_PACKAGING) $(OSX_BACKGROUND_IMAGE) - $(PYTHON) $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -add-qt-tr $(OSX_QT_TRANSLATIONS) -translations-dir=$(QT_TRANSLATION_DIR) -dmg -fancy $(OSX_FANCY_PLIST) -verbose 2 -add-resources contrib/macdeploy/libboost_system-mt.dylib -volname $(OSX_VOLNAME) + $(PYTHON) $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -add-qt-tr $(OSX_QT_TRANSLATIONS) -translations-dir=$(QT_TRANSLATION_DIR) -dmg -fancy $(OSX_FANCY_PLIST) -verbose 2 -volname $(OSX_VOLNAME) $(OSX_BACKGROUND_IMAGE).png: contrib/macdeploy/$(OSX_BACKGROUND_SVG) sed 's/PACKAGE_NAME/$(PACKAGE_NAME)/' < "$<" | $(RSVG_CONVERT) -f png -d 36 -p 36 -o $@ @@ -119,7 +125,7 @@ $(APP_DIST_DIR)/Applications: @rm -f $@ @cd $(@D); $(LN_S) /Applications $(@F) -$(APP_DIST_EXTRAS): $(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/OHMC-Qt +$(APP_DIST_EXTRAS): $(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/Ohmcoin-Qt $(OSX_DMG): $(APP_DIST_EXTRAS) $(GENISOIMAGE) -no-cache-inodes -D -l -probe -V "$(OSX_VOLNAME)" -no-pad -r -dir-mode 0755 -apple -o $@ dist @@ -134,7 +140,7 @@ $(APP_DIST_DIR)/.background/$(OSX_BACKGROUND_IMAGE): $(OSX_BACKGROUND_IMAGE_DPIF $(APP_DIST_DIR)/.DS_Store: $(OSX_DSSTORE_GEN) $(PYTHON) $< "$@" "$(OSX_VOLNAME)" -$(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/OHMC-Qt: $(OSX_APP_BUILT) $(OSX_PACKAGING) +$(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/Ohmcoin-Qt: $(OSX_APP_BUILT) $(OSX_PACKAGING) INSTALLNAMETOOL=$(INSTALLNAMETOOL) OTOOL=$(OTOOL) STRIP=$(STRIP) $(PYTHON) $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -translations-dir=$(QT_TRANSLATION_DIR) -add-qt-tr $(OSX_QT_TRANSLATIONS) -verbose 2 deploydir: $(APP_DIST_EXTRAS) @@ -174,16 +180,16 @@ leveldb_baseline_filtered.info: leveldb_baseline.info baseline_filtered_combined.info: leveldb_baseline_filtered.info baseline_filtered.info $(LCOV) -a leveldb_baseline_filtered.info -a baseline_filtered.info -o $@ -test_ohmc.info: baseline_filtered_combined.info +test_ohmcoin.info: baseline_filtered_combined.info $(MAKE) -C src/ check - $(LCOV) -c -d $(abs_builddir)/src -t test_ohmc -o $@ + $(LCOV) -c -d $(abs_builddir)/src -t test_ohmcoin -o $@ $(LCOV) -z -d $(abs_builddir)/src $(LCOV) -z -d $(abs_builddir)/src/leveldb -test_ohmc_filtered.info: test_ohmc.info +test_ohmcoin_filtered.info: test_ohmcoin.info $(LCOV) -r $< "/usr/include/*" -o $@ -block_test.info: test_ohmc_filtered.info +block_test.info: test_ohmcoin_filtered.info $(MKDIR_P) qa/tmp -@TIMEOUT=15 qa/pull-tester/run-bitcoind-for-test.sh $(JAVA) -jar $(JAVA_COMPARISON_TOOL) qa/tmp/compTool 0 $(LCOV) -c -d $(abs_builddir)/src --t BitcoinJBlockTest -o $@ @@ -193,13 +199,13 @@ block_test.info: test_ohmc_filtered.info block_test_filtered.info: block_test.info $(LCOV) -r $< "/usr/include/*" -o $@ -test_ohmc_coverage.info: baseline_filtered_combined.info test_ohmc_filtered.info - $(LCOV) -a baseline_filtered.info -a leveldb_baseline_filtered.info -a test_ohmc_filtered.info -o $@ +test_ohmcoin_coverage.info: baseline_filtered_combined.info test_ohmcoin_filtered.info + $(LCOV) -a baseline_filtered.info -a leveldb_baseline_filtered.info -a test_ohmcoin_filtered.info -o $@ -total_coverage.info: baseline_filtered_combined.info test_ohmc_filtered.info block_test_filtered.info - $(LCOV) -a baseline_filtered.info -a leveldb_baseline_filtered.info -a test_ohmc_filtered.info -a block_test_filtered.info -o $@ | $(GREP) "\%" | $(AWK) '{ print substr($$3,2,50) "/" $$5 }' > coverage_percent.txt +total_coverage.info: baseline_filtered_combined.info test_ohmcoin_filtered.info block_test_filtered.info + $(LCOV) -a baseline_filtered.info -a leveldb_baseline_filtered.info -a test_ohmcoin_filtered.info -a block_test_filtered.info -o $@ | $(GREP) "\%" | $(AWK) '{ print substr($$3,2,50) "/" $$5 }' > coverage_percent.txt -test_ohmc.coverage/.dirstamp: test_ohmc_coverage.info +test_ohmcoin.coverage/.dirstamp: test_ohmcoin_coverage.info $(GENHTML) -s $< -o $(@D) @touch $@ @@ -207,23 +213,17 @@ total.coverage/.dirstamp: total_coverage.info $(GENHTML) -s $< -o $(@D) @touch $@ -cov: test_ohmc.coverage/.dirstamp total.coverage/.dirstamp +cov: test_ohmcoin.coverage/.dirstamp total.coverage/.dirstamp endif -# OHMC: disable the outdated comparison tool test -# Ref https://github.com/bitcoin/bitcoin/issues/4545 -if USE_COMPARISON_TOOL -check-local: - ## $(MKDIR_P) qa/tmp - ## @qa/pull-tester/run-bitcoind-for-test.sh $(JAVA) -jar $(JAVA_COMPARISON_TOOL) qa/tmp/compTool $(COMPARISON_TOOL_REORG_TESTS) 2>&1 -endif +dist_noinst_SCRIPTS = autogen.sh -EXTRA_DIST = $(top_srcdir)/share/genbuild.sh qa/pull-tester/rpc-tests.sh qa/pull-tester/run-bitcoin-cli qa/rpc-tests $(DIST_DOCS) $(WINDOWS_PACKAGING) $(OSX_PACKAGING) +EXTRA_DIST = $(top_srcdir)/share/genbuild.sh qa/pull-tester/rpc-tests.sh qa/pull-tester/run-bitcoin-cli test $(DIST_DOCS) $(WINDOWS_PACKAGING) $(OSX_PACKAGING) CLEANFILES = $(OSX_DMG) $(BITCOIN_WIN_INSTALLER) .INTERMEDIATE: $(COVERAGE_INFO) clean-local: - rm -rf test_ohmc.coverage/ total.coverage/ $(OSX_APP) + rm -rf test_ohmcoin.coverage/ total.coverage/ $(OSX_APP) diff --git a/README.md b/README.md index 886999c..3fd90a1 100755 --- a/README.md +++ b/README.md @@ -1,68 +1,41 @@ -OHMCoin Core integration/staging repository +Ohmcoin Core integration/staging repository ===================================== -[![GitHub version](https://badge.fury.io/gh/theohmproject%2Fohmcoin.svg)](https://badge.fury.io/gh/theohmproject%2Fohmcoin) +[![Build Status](https://travis-ci.org/theohmproject/Ohmcoin.svg?branch=master)](https://travis-ci.org/theohmproject/Ohmcoin) Ohmcoin is a cutting edge cryptocurrency, with many features not available in most other cryptocurrencies. -- Anonymized transactions using coin mixing technology, we call it _Coin Mixing_. -- Fast transactions featuring guaranteed zero confirmation transactions, we call it _FastSend_. -- Decentralized blockchain voting providing for consensus based advancement of the current Karmanode - technology used to secure the network and provide the above features, each Karmanode is secured - with collateral of 3000 OHMC +- Anonymized transactions using zerocoin technology +- 100% Proof of Stake 3.0 Consensus protocol, allowing very low transaction fees and energy expenditure, and staking rewards to all participants in the network +- Karmanode technology used to secure the network and provide the above features, each Karmanode is secured + with collateral of 10K OHMC +- Decentralized blockchain voting utilizing Karmanode 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 [ohmcoin.org](http://www.ohmcoin.org) +17.6M ohmcoin was produced for swapping. 500k were mined 1-200 blocks to bring that amount to 18.1M OHMC, the amount needed for the swap. -### Coin Specs - - - - - - - - -
Ticker SymbolOHMC
AlgorithmQuark
TypePoW - PoS Hybrid*
Block Time30 Seconds
Difficulty RetargetingEvery Block
Premine/Initial Supply30Mil OHMC*
OHMC Created Per block1 OHMC*
+Since then, the Ohmcoin repository has been rebaselined to show the fork relationship properly. -*First 1000 Blocks PoW. 1001 - Infinite Blocks PoS only. +## BCT Thread ## -**30Mil OHMC initial coins Premined to Swap over prior OHMC Block Chain. +https://bitcointalk.org/index.php?topic=2307909.0 -### PoS/PoW Block Details - - - -
Proof Of Work Phase1-1000 Blocks.
Proof of Stake Phase1001-100 Million
+Rebrand from KryptKoin [KTK] to Ohmcoin [OHMC] -### Reward Methods +## Coin Specs ## - - -
KarmanodesYes - 3000 OHMC Required
Wallet StakingYes - 1 to infinite OHMC
- -### Staking Reward Details - - - - - - + + + +
OHMC Produced1 OHMC Per Block
Amount Designated for Rewards100% of OHMC produced goes to Staking Rewards
Rewards AlgorithmSeeSaw Based Targeting System
Amount of Rewards Per Block2 Rewards, 1 for Karmanodes, 1 for Wallet Staking
Coin Maturity to Stake150 Blocks
AlgoQuark
Block Time60 Seconds
Difficulty RetargetingEvery Block
Max Coin Supply (PoS Phase)Infinite
-### Rewards Breakdown +## PoS Rewards Breakdown ## - - - - - - - - - - - + + + + +
PhaseBlock HeightRewards Created Per BlockRewards Created Per Day
Phase 11000-9043201 OHMC2880 OHMC
Phase 2904321-1336320.5 OHMC1440 OHMC
Phase 31336321-1941121.25 OHMC720 OHMC
Phase 41941122-23731220.125 OHMC360 OHMC
Phase 52373123-29779230.0625 OHMC180 OHMC
Phase 62977924-40291240.03125 OHMC90 OHMC
Phase 74029125-5615990.015625 OHMC45 OHMC
Phase 86131525-82339260.0078125 OHMC22.5 OHMC
Phase 98233927-103363270.00390625 OHMC11.25 OHMC
Phase X10336328-Infinite0.001953125 OHMC5.625 OHMC
Block HeightRewardKarmanodesStakers
<= 755,6007.7 OHMC4.2 OHMC2.8 OHMC
755,601-1,043,9995 OHMC2.7 OHMC1.8 OHMC
1,044,000-1,562,3984 OHMC2.16 OHMC1.44 OHMC
> 1,562,3993 OHMC1.62 OHMC1.08 OHMC
- - +The Ohmcoin development budget is up to a maximum of 1 OHMC per block, paid out based on approved proposals as voted on by the Ohmcoin karmanode owners through the community governance process. diff --git a/autogen.sh b/autogen.sh index 3e26a18..27417da 100755 --- a/autogen.sh +++ b/autogen.sh @@ -1,4 +1,8 @@ #!/bin/sh +# Copyright (c) 2013-2016 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + set -e srcdir="$(dirname $0)" cd "$srcdir" @@ -6,4 +10,6 @@ if [ -z ${LIBTOOLIZE} ] && GLIBTOOLIZE="`which glibtoolize 2>/dev/null`"; then LIBTOOLIZE="${GLIBTOOLIZE}" export LIBTOOLIZE fi +which autoreconf >/dev/null || \ + (echo "configuration failed, please install autoconf first" && exit 1) autoreconf --install --force --warnings=all diff --git a/build-aux/m4/ax_boost_base.m4 b/build-aux/m4/ax_boost_base.m4 index 3f24d5d..650c94f 100755 --- a/build-aux/m4/ax_boost_base.m4 +++ b/build-aux/m4/ax_boost_base.m4 @@ -33,7 +33,7 @@ # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 23 +#serial 27 AC_DEFUN([AX_BOOST_BASE], [ @@ -95,7 +95,7 @@ if test "x$want_boost" = "xyes"; then x86_64) libsubdirs="lib64 libx32 lib lib64" ;; - ppc64|s390x|sparc64|aarch64) + ppc64|s390x|sparc64|aarch64|ppc64le) libsubdirs="lib64 lib lib64" ;; esac @@ -170,7 +170,7 @@ if test "x$want_boost" = "xyes"; then AC_MSG_RESULT(yes) succeeded=yes found_system=yes - ],[: + ],[ ]) AC_LANG_POP([C++]) @@ -179,6 +179,10 @@ if test "x$want_boost" = "xyes"; then dnl if we found no boost with system layout we search for boost libraries dnl built and installed without the --layout=system option or for a staged(not installed) version if test "x$succeeded" != "xyes"; then + CPPFLAGS="$CPPFLAGS_SAVED" + LDFLAGS="$LDFLAGS_SAVED" + BOOST_CPPFLAGS= + BOOST_LDFLAGS= _version=0 if test "$ac_boost_path" != ""; then if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then @@ -191,6 +195,12 @@ if test "x$want_boost" = "xyes"; then VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE" done + dnl if nothing found search for layout used in Windows distributions + if test -z "$BOOST_CPPFLAGS"; then + if test -d "$ac_boost_path/boost" && test -r "$ac_boost_path/boost"; then + BOOST_CPPFLAGS="-I$ac_boost_path" + fi + fi fi else if test "$cross_compiling" != yes; then @@ -253,7 +263,7 @@ if test "x$want_boost" = "xyes"; then AC_MSG_RESULT(yes) succeeded=yes found_system=yes - ],[: + ],[ ]) AC_LANG_POP([C++]) fi diff --git a/build-aux/m4/ax_boost_program_options.m4 b/build-aux/m4/ax_boost_program_options.m4 index f591441..2bdb593 100755 --- a/build-aux/m4/ax_boost_program_options.m4 +++ b/build-aux/m4/ax_boost_program_options.m4 @@ -29,7 +29,7 @@ # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 22 +#serial 24 AC_DEFUN([AX_BOOST_PROGRAM_OPTIONS], [ @@ -63,9 +63,9 @@ AC_DEFUN([AX_BOOST_PROGRAM_OPTIONS], AC_CACHE_CHECK([whether the Boost::Program_Options library is available], ax_cv_boost_program_options, [AC_LANG_PUSH(C++) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], - [[boost::program_options::options_description generic("Generic options"); + [[boost::program_options::error err("Error message"); return 0;]])], ax_cv_boost_program_options=yes, ax_cv_boost_program_options=no) AC_LANG_POP([C++]) @@ -74,7 +74,6 @@ AC_DEFUN([AX_BOOST_PROGRAM_OPTIONS], AC_DEFINE(HAVE_BOOST_PROGRAM_OPTIONS,,[define if the Boost::PROGRAM_OPTIONS library is available]) BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` if test "x$ax_boost_user_program_options_lib" = "x"; then - ax_lib= for libextension in `ls $BOOSTLIBDIR/libboost_program_options*.so* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_program_options.*\)\.so.*$;\1;'` `ls $BOOSTLIBDIR/libboost_program_options*.dylib* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_program_options.*\)\.dylib.*$;\1;'` `ls $BOOSTLIBDIR/libboost_program_options*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_program_options.*\)\.a.*$;\1;'` ; do ax_lib=${libextension} AC_CHECK_LIB($ax_lib, exit, diff --git a/build-aux/m4/ax_boost_system.m4 b/build-aux/m4/ax_boost_system.m4 index 9c78280..1c05450 100755 --- a/build-aux/m4/ax_boost_system.m4 +++ b/build-aux/m4/ax_boost_system.m4 @@ -31,7 +31,7 @@ # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 17 +#serial 18 AC_DEFUN([AX_BOOST_SYSTEM], [ @@ -68,9 +68,10 @@ AC_DEFUN([AX_BOOST_SYSTEM], ax_cv_boost_system, [AC_LANG_PUSH([C++]) CXXFLAGS_SAVE=$CXXFLAGS + CXXFLAGS= AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], - [[boost::system::system_category]])], + [[boost::system::error_category *a = 0;]])], ax_cv_boost_system=yes, ax_cv_boost_system=no) CXXFLAGS=$CXXFLAGS_SAVE AC_LANG_POP([C++]) diff --git a/build-aux/m4/ax_check_compile_flag.m4 b/build-aux/m4/ax_check_compile_flag.m4 index c3a8d69..ca36397 100755 --- a/build-aux/m4/ax_check_compile_flag.m4 +++ b/build-aux/m4/ax_check_compile_flag.m4 @@ -4,7 +4,7 @@ # # SYNOPSIS # -# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS]) +# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) # # DESCRIPTION # @@ -19,6 +19,8 @@ # the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to # force the compiler to issue an error when a bad flag is given. # +# INPUT gives an alternative input source to AC_COMPILE_IFELSE. +# # NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this # macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. # @@ -53,19 +55,19 @@ # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. -#serial 2 +#serial 4 AC_DEFUN([AX_CHECK_COMPILE_FLAG], -[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX +[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" - AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], + AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], [AS_VAR_SET(CACHEVAR,[yes])], [AS_VAR_SET(CACHEVAR,[no])]) _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) -AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], +AS_VAR_IF(CACHEVAR,yes, [m4_default([$2], :)], [m4_default([$3], :)]) AS_VAR_POPDEF([CACHEVAR])dnl diff --git a/build-aux/m4/ax_check_link_flag.m4 b/build-aux/m4/ax_check_link_flag.m4 index e2d0d36..eb01a6c 100755 --- a/build-aux/m4/ax_check_link_flag.m4 +++ b/build-aux/m4/ax_check_link_flag.m4 @@ -4,7 +4,7 @@ # # SYNOPSIS # -# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS]) +# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) # # DESCRIPTION # @@ -19,6 +19,8 @@ # EXTRA-FLAGS FLAG". This can for example be used to force the linker to # issue an error when a bad flag is given. # +# INPUT gives an alternative input source to AC_LINK_IFELSE. +# # NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this # macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG. # @@ -53,18 +55,19 @@ # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. -#serial 2 +#serial 4 AC_DEFUN([AX_CHECK_LINK_FLAG], -[AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl +[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF +AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [ ax_check_save_flags=$LDFLAGS LDFLAGS="$LDFLAGS $4 $1" - AC_LINK_IFELSE([AC_LANG_PROGRAM()], + AC_LINK_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], [AS_VAR_SET(CACHEVAR,[yes])], [AS_VAR_SET(CACHEVAR,[no])]) LDFLAGS=$ax_check_save_flags]) -AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], +AS_VAR_IF(CACHEVAR,yes, [m4_default([$2], :)], [m4_default([$3], :)]) AS_VAR_POPDEF([CACHEVAR])dnl diff --git a/build-aux/m4/ax_check_preproc_flag.m4 b/build-aux/m4/ax_check_preproc_flag.m4 index b1cfef6..ca1d5ee 100755 --- a/build-aux/m4/ax_check_preproc_flag.m4 +++ b/build-aux/m4/ax_check_preproc_flag.m4 @@ -4,7 +4,7 @@ # # SYNOPSIS # -# AX_CHECK_PREPROC_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS]) +# AX_CHECK_PREPROC_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) # # DESCRIPTION # @@ -19,6 +19,8 @@ # "CPPFLAGS EXTRA-FLAGS FLAG". This can for example be used to force the # preprocessor to issue an error when a bad flag is given. # +# INPUT gives an alternative input source to AC_PREPROC_IFELSE. +# # NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this # macro in sync with AX_CHECK_{COMPILE,LINK}_FLAG. # @@ -53,19 +55,19 @@ # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. -#serial 2 +#serial 4 AC_DEFUN([AX_CHECK_PREPROC_FLAG], -[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX +[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]cppflags_$4_$1])dnl AC_CACHE_CHECK([whether _AC_LANG preprocessor accepts $1], CACHEVAR, [ ax_check_save_flags=$CPPFLAGS CPPFLAGS="$CPPFLAGS $4 $1" - AC_PREPROC_IFELSE([AC_LANG_PROGRAM()], + AC_PREPROC_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], [AS_VAR_SET(CACHEVAR,[yes])], [AS_VAR_SET(CACHEVAR,[no])]) CPPFLAGS=$ax_check_save_flags]) -AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], +AS_VAR_IF(CACHEVAR,yes, [m4_default([$2], :)], [m4_default([$3], :)]) AS_VAR_POPDEF([CACHEVAR])dnl diff --git a/build-aux/m4/ax_cxx_compile_stdcxx.m4 b/build-aux/m4/ax_cxx_compile_stdcxx.m4 index 2c18e49..3d45bae 100755 --- a/build-aux/m4/ax_cxx_compile_stdcxx.m4 +++ b/build-aux/m4/ax_cxx_compile_stdcxx.m4 @@ -57,8 +57,13 @@ AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true], [$3], [optional], [ax_cxx_compile_cxx$1_required=false], [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])]) + m4_if([$4], [], [ax_cxx_compile_cxx$1_try_default=true], + [$4], [default], [ax_cxx_compile_cxx$1_try_default=true], + [$4], [nodefault], [ax_cxx_compile_cxx$1_try_default=false], + [m4_fatal([invalid fourth argument `$4' to AX_CXX_COMPILE_STDCXX])]) AC_LANG_PUSH([C++])dnl ac_success=no + m4_if([$4], [nodefault], [], [dnl AC_CACHE_CHECK(whether $CXX supports C++$1 features by default, ax_cv_cxx_compile_cxx$1, [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], @@ -66,7 +71,7 @@ AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl [ax_cv_cxx_compile_cxx$1=no])]) if test x$ax_cv_cxx_compile_cxx$1 = xyes; then ac_success=yes - fi + fi]) m4_if([$2], [noext], [], [dnl if test x$ac_success = xno; then diff --git a/build-aux/m4/ax_gcc_func_attribute.m4 b/build-aux/m4/ax_gcc_func_attribute.m4 index 275ca63..c788ca9 100755 --- a/build-aux/m4/ax_gcc_func_attribute.m4 +++ b/build-aux/m4/ax_gcc_func_attribute.m4 @@ -31,6 +31,7 @@ # cold # const # constructor +# constructor_priority for constructor attribute with priority # deprecated # destructor # dllexport @@ -73,7 +74,7 @@ # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 2 +#serial 3 AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [ AS_VAR_PUSHDEF([ac_var], [ax_cv_have_func_attribute_$1]) @@ -103,6 +104,9 @@ AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [ [const], [ int foo( void ) __attribute__(($1)); ], + [constructor_priority], [ + int foo( void ) __attribute__((__constructor__(65535/2))); + ], [constructor], [ int foo( void ) __attribute__(($1)); ], @@ -180,6 +184,8 @@ AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [ [visibility], [ int foo_def( void ) __attribute__(($1("default"))); int foo_hid( void ) __attribute__(($1("hidden"))); + int foo_int( void ) __attribute__(($1("internal"))); + int foo_pro( void ) __attribute__(($1("protected"))); ], [warning], [ int foo( void ) __attribute__(($1(""))); diff --git a/build-aux/m4/ax_pthread.m4 b/build-aux/m4/ax_pthread.m4 index d383ad5..4c4051e 100755 --- a/build-aux/m4/ax_pthread.m4 +++ b/build-aux/m4/ax_pthread.m4 @@ -19,10 +19,10 @@ # is necessary on AIX to use the special cc_r compiler alias.) # # NOTE: You are assumed to not only compile your program with these flags, -# but also link it with them as well. e.g. you should link with +# but also to link with them as well. For example, you might link with # $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS # -# If you are only building threads programs, you may wish to use these +# If you are only building threaded programs, you may wish to use these # variables in your default LIBS, CFLAGS, and CC: # # LIBS="$PTHREAD_LIBS $LIBS" @@ -30,8 +30,8 @@ # CC="$PTHREAD_CC" # # In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant -# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name -# (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to +# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). # # Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the # PTHREAD_PRIO_INHERIT symbol is defined when compiling with @@ -82,35 +82,40 @@ # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. -#serial 21 +#serial 23 AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) AC_DEFUN([AX_PTHREAD], [ AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_CC]) +AC_REQUIRE([AC_PROG_SED]) AC_LANG_PUSH([C]) ax_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h -# requires special compiler flags (e.g. on True64 or Sequent). +# requires special compiler flags (e.g. on Tru64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: -if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then - save_CFLAGS="$CFLAGS" +if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then + ax_pthread_save_CC="$CC" + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"]) CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" - AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) - AC_TRY_LINK_FUNC([pthread_join], [ax_pthread_ok=yes]) + AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS]) + AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes]) AC_MSG_RESULT([$ax_pthread_ok]) - if test x"$ax_pthread_ok" = xno; then + if test "x$ax_pthread_ok" = "xno"; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" + CC="$ax_pthread_save_CC" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" fi # We must check for the threads library under a number of different @@ -123,7 +128,7 @@ fi # which indicates that we try without any flags at all, and "pthread-config" # which is a program returning the flags for the Pth emulation library. -ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" +ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: @@ -132,82 +137,225 @@ ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mt # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) -# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) -# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) -# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) -# -pthreads: Solaris/gcc -# -mthreads: Mingw32/gcc, Lynx/gcc +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 +# (Note: HP C rejects this with "bad form for `-t' option") +# -pthreads: Solaris/gcc (Note: HP C also rejects) # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it -# doesn't hurt to check since this sometimes defines pthreads too; -# also defines -D_REENTRANT) -# ... -mt is also the pthreads flag for HP/aCC +# doesn't hurt to check since this sometimes defines pthreads and +# -D_REENTRANT too), HP C (must be checked before -lpthread, which +# is present but should not be used directly; and before -mthreads, +# because the compiler interprets this as "-mt" + "-hreads") +# -mthreads: Mingw32/gcc, Lynx/gcc # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) -case ${host_os} in +case $host_os in + + freebsd*) + + # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) + # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) + + ax_pthread_flags="-kthread lthread $ax_pthread_flags" + ;; + + hpux*) + + # From the cc(1) man page: "[-mt] Sets various -D flags to enable + # multi-threading and also sets -lpthread." + + ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" + ;; + + openedition*) + + # IBM z/OS requires a feature-test macro to be defined in order to + # enable POSIX threads at all, so give the user a hint if this is + # not set. (We don't define these ourselves, as they can affect + # other portions of the system API in unpredictable ways.) + + AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING], + [ +# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) + AX_PTHREAD_ZOS_MISSING +# endif + ], + [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])]) + ;; + solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based - # tests will erroneously succeed. (We need to link with -pthreads/-mt/ - # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather - # a function called by this macro, so we could check for that, but - # who knows whether they'll stub that too in a future libc.) So, - # we'll just look for -pthreads and -lpthread first: + # tests will erroneously succeed. (N.B.: The stubs are missing + # pthread_cleanup_push, or rather a function called by this macro, + # so we could check for that, but who knows whether they'll stub + # that too in a future libc.) So we'll check first for the + # standard Solaris way of linking pthreads (-mt -lpthread). + + ax_pthread_flags="-mt,pthread pthread $ax_pthread_flags" + ;; +esac + +# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) - ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags" +AS_IF([test "x$GCC" = "xyes"], + [ax_pthread_flags="-pthread -pthreads $ax_pthread_flags"]) + +# The presence of a feature test macro requesting re-entrant function +# definitions is, on some systems, a strong hint that pthreads support is +# correctly enabled + +case $host_os in + darwin* | hpux* | linux* | osf* | solaris*) + ax_pthread_check_macro="_REENTRANT" ;; - darwin*) - ax_pthread_flags="-pthread $ax_pthread_flags" + aix*) + ax_pthread_check_macro="_THREAD_SAFE" + ;; + + *) + ax_pthread_check_macro="--" ;; esac +AS_IF([test "x$ax_pthread_check_macro" = "x--"], + [ax_pthread_check_cond=0], + [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"]) + +# Are we compiling with Clang? + +AC_CACHE_CHECK([whether $CC is Clang], + [ax_cv_PTHREAD_CLANG], + [ax_cv_PTHREAD_CLANG=no + # Note that Autoconf sets GCC=yes for Clang as well as GCC + if test "x$GCC" = "xyes"; then + AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG], + [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ +# if defined(__clang__) && defined(__llvm__) + AX_PTHREAD_CC_IS_CLANG +# endif + ], + [ax_cv_PTHREAD_CLANG=yes]) + fi + ]) +ax_pthread_clang="$ax_cv_PTHREAD_CLANG" + +ax_pthread_clang_warning=no + +# Clang needs special handling, because older versions handle the -pthread +# option in a rather... idiosyncratic way + +if test "x$ax_pthread_clang" = "xyes"; then + + # Clang takes -pthread; it has never supported any other flag + + # (Note 1: This will need to be revisited if a system that Clang + # supports has POSIX threads in a separate library. This tends not + # to be the way of modern systems, but it's conceivable.) + + # (Note 2: On some systems, notably Darwin, -pthread is not needed + # to get POSIX threads support; the API is always present and + # active. We could reasonably leave PTHREAD_CFLAGS empty. But + # -pthread does define _REENTRANT, and while the Darwin headers + # ignore this macro, third-party headers might not.) + + PTHREAD_CFLAGS="-pthread" + PTHREAD_LIBS= + + ax_pthread_ok=yes + + # However, older versions of Clang make a point of warning the user + # that, in an invocation where only linking and no compilation is + # taking place, the -pthread option has no effect ("argument unused + # during compilation"). They expect -pthread to be passed in only + # when source code is being compiled. + # + # Problem is, this is at odds with the way Automake and most other + # C build frameworks function, which is that the same flags used in + # compilation (CFLAGS) are also used in linking. Many systems + # supported by AX_PTHREAD require exactly this for POSIX threads + # support, and in fact it is often not straightforward to specify a + # flag that is used only in the compilation phase and not in + # linking. Such a scenario is extremely rare in practice. + # + # Even though use of the -pthread flag in linking would only print + # a warning, this can be a nuisance for well-run software projects + # that build with -Werror. So if the active version of Clang has + # this misfeature, we search for an option to squash it. + + AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread], + [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG], + [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown + # Create an alternate version of $ac_link that compiles and + # links in two steps (.c -> .o, .o -> exe) instead of one + # (.c -> exe), because the warning occurs only in the second + # step + ax_pthread_save_ac_link="$ac_link" + ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' + ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"` + ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" + ax_pthread_save_CFLAGS="$CFLAGS" + for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do + AS_IF([test "x$ax_pthread_try" = "xunknown"], [break]) + CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" + ac_link="$ax_pthread_save_ac_link" + AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], + [ac_link="$ax_pthread_2step_ac_link" + AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], + [break]) + ]) + done + ac_link="$ax_pthread_save_ac_link" + CFLAGS="$ax_pthread_save_CFLAGS" + AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no]) + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" + ]) -# Clang doesn't consider unrecognized options an error unless we specify -# -Werror. We throw in some extra Clang-specific options to ensure that -# this doesn't happen for GCC, which also accepts -Werror. + case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in + no | unknown) ;; + *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; + esac -AC_MSG_CHECKING([if compiler needs -Werror to reject unknown flags]) -save_CFLAGS="$CFLAGS" -ax_pthread_extra_flags="-Werror" -CFLAGS="$CFLAGS $ax_pthread_extra_flags -Wunknown-warning-option -Wsizeof-array-argument" -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([int foo(void);],[foo()])], - [AC_MSG_RESULT([yes])], - [ax_pthread_extra_flags= - AC_MSG_RESULT([no])]) -CFLAGS="$save_CFLAGS" +fi # $ax_pthread_clang = yes -if test x"$ax_pthread_ok" = xno; then -for flag in $ax_pthread_flags; do +if test "x$ax_pthread_ok" = "xno"; then +for ax_pthread_try_flag in $ax_pthread_flags; do - case $flag in + case $ax_pthread_try_flag in none) AC_MSG_CHECKING([whether pthreads work without any flags]) ;; + -mt,pthread) + AC_MSG_CHECKING([whether pthreads work with -mt -lpthread]) + PTHREAD_CFLAGS="-mt" + PTHREAD_LIBS="-lpthread" + ;; + -*) - AC_MSG_CHECKING([whether pthreads work with $flag]) - PTHREAD_CFLAGS="$flag" + AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag]) + PTHREAD_CFLAGS="$ax_pthread_try_flag" ;; pthread-config) AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no]) - if test x"$ax_pthread_config" = xno; then continue; fi + AS_IF([test "x$ax_pthread_config" = "xno"], [continue]) PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) - AC_MSG_CHECKING([for the pthreads library -l$flag]) - PTHREAD_LIBS="-l$flag" + AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag]) + PTHREAD_LIBS="-l$ax_pthread_try_flag" ;; esac - save_LIBS="$LIBS" - save_CFLAGS="$CFLAGS" + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS $ax_pthread_extra_flags" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we @@ -218,7 +366,11 @@ for flag in $ax_pthread_flags; do # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include +# if $ax_pthread_check_cond +# error "$ax_pthread_check_macro must be defined" +# endif static void routine(void *a) { a = 0; } static void *start_routine(void *a) { return a; }], [pthread_t th; pthread_attr_t attr; @@ -227,16 +379,14 @@ for flag in $ax_pthread_flags; do pthread_attr_init(&attr); pthread_cleanup_push(routine, 0); pthread_cleanup_pop(0) /* ; */])], - [ax_pthread_ok=yes], - []) + [ax_pthread_ok=yes], + []) - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" AC_MSG_RESULT([$ax_pthread_ok]) - if test "x$ax_pthread_ok" = xyes; then - break; - fi + AS_IF([test "x$ax_pthread_ok" = "xyes"], [break]) PTHREAD_LIBS="" PTHREAD_CFLAGS="" @@ -244,71 +394,74 @@ done fi # Various other checks: -if test "x$ax_pthread_ok" = xyes; then - save_LIBS="$LIBS" - LIBS="$PTHREAD_LIBS $LIBS" - save_CFLAGS="$CFLAGS" +if test "x$ax_pthread_ok" = "xyes"; then + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. - AC_MSG_CHECKING([for joinable pthread attribute]) - attr_name=unknown - for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do - AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], - [int attr = $attr; return attr /* ; */])], - [attr_name=$attr; break], - []) - done - AC_MSG_RESULT([$attr_name]) - if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then - AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], [$attr_name], - [Define to necessary symbol if this constant - uses a non-standard name on your system.]) - fi - - AC_MSG_CHECKING([if more special flags are required for pthreads]) - flag=no - case ${host_os} in - aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";; - osf* | hpux*) flag="-D_REENTRANT";; - solaris*) - if test "$GCC" = "yes"; then - flag="-D_REENTRANT" - else - # TODO: What about Clang on Solaris? - flag="-mt -D_REENTRANT" - fi - ;; - esac - AC_MSG_RESULT([$flag]) - if test "x$flag" != xno; then - PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" - fi + AC_CACHE_CHECK([for joinable pthread attribute], + [ax_cv_PTHREAD_JOINABLE_ATTR], + [ax_cv_PTHREAD_JOINABLE_ATTR=unknown + for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], + [int attr = $ax_pthread_attr; return attr /* ; */])], + [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break], + []) + done + ]) + AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ + test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ + test "x$ax_pthread_joinable_attr_defined" != "xyes"], + [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], + [$ax_cv_PTHREAD_JOINABLE_ATTR], + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + ax_pthread_joinable_attr_defined=yes + ]) + + AC_CACHE_CHECK([whether more special flags are required for pthreads], + [ax_cv_PTHREAD_SPECIAL_FLAGS], + [ax_cv_PTHREAD_SPECIAL_FLAGS=no + case $host_os in + solaris*) + ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" + ;; + esac + ]) + AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ + test "x$ax_pthread_special_flags_added" != "xyes"], + [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" + ax_pthread_special_flags_added=yes]) AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], - [ax_cv_PTHREAD_PRIO_INHERIT], [ - AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], - [[int i = PTHREAD_PRIO_INHERIT;]])], - [ax_cv_PTHREAD_PRIO_INHERIT=yes], - [ax_cv_PTHREAD_PRIO_INHERIT=no]) + [ax_cv_PTHREAD_PRIO_INHERIT], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[int i = PTHREAD_PRIO_INHERIT;]])], + [ax_cv_PTHREAD_PRIO_INHERIT=yes], + [ax_cv_PTHREAD_PRIO_INHERIT=no]) ]) - AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"], - [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])]) + AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ + test "x$ax_pthread_prio_inherit_defined" != "xyes"], + [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.]) + ax_pthread_prio_inherit_defined=yes + ]) - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" # More AIX lossage: compile with *_r variant - if test "x$GCC" != xyes; then + if test "x$GCC" != "xyes"; then case $host_os in aix*) AS_CASE(["x/$CC"], - [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6], - [#handle absolute path differently from PATH based program lookup - AS_CASE(["x$CC"], - [x/*], - [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])], - [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])]) + [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6], + [#handle absolute path differently from PATH based program lookup + AS_CASE(["x$CC"], + [x/*], + [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])], + [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])]) ;; esac fi @@ -321,7 +474,7 @@ AC_SUBST([PTHREAD_CFLAGS]) AC_SUBST([PTHREAD_CC]) # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: -if test x"$ax_pthread_ok" = xyes; then +if test "x$ax_pthread_ok" = "xyes"; then ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1]) : else diff --git a/build-aux/m4/bitcoin_find_bdb48.m4 b/build-aux/m4/bitcoin_find_bdb48.m4 index f3b1446..ea9c795 100755 --- a/build-aux/m4/bitcoin_find_bdb48.m4 +++ b/build-aux/m4/bitcoin_find_bdb48.m4 @@ -1,66 +1,78 @@ +dnl Copyright (c) 2013-2015 The Bitcoin Core developers +dnl Distributed under the MIT software license, see the accompanying +dnl file COPYING or http://www.opensource.org/licenses/mit-license.php. + AC_DEFUN([BITCOIN_FIND_BDB48],[ - AC_MSG_CHECKING([for Berkeley DB C++ headers]) - BDB_CPPFLAGS= - BDB_LIBS= - bdbpath=X - bdb48path=X - bdbdirlist= - for _vn in 4.8 48 4 5 ''; do - for _pfx in b lib ''; do - bdbdirlist="$bdbdirlist ${_pfx}db${_vn}" + AC_ARG_VAR(BDB_CFLAGS, [C compiler flags for BerkeleyDB, bypasses autodetection]) + AC_ARG_VAR(BDB_LIBS, [Linker flags for BerkeleyDB, bypasses autodetection]) + + if test "x$BDB_CFLAGS" = "x"; then + AC_MSG_CHECKING([for Berkeley DB C++ headers]) + BDB_CPPFLAGS= + bdbpath=X + bdb48path=X + bdbdirlist= + for _vn in 4.8 48 4 5 5.3 ''; do + for _pfx in b lib ''; do + bdbdirlist="$bdbdirlist ${_pfx}db${_vn}" + done done - done - for searchpath in $bdbdirlist ''; do - test -n "${searchpath}" && searchpath="${searchpath}/" - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include <${searchpath}db_cxx.h> - ]],[[ - #if !((DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 8) || DB_VERSION_MAJOR > 4) - #error "failed to find bdb 4.8+" - #endif - ]])],[ - if test "x$bdbpath" = "xX"; then - bdbpath="${searchpath}" - fi - ],[ - continue - ]) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include <${searchpath}db_cxx.h> - ]],[[ - #if !(DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR == 8) - #error "failed to find bdb 4.8" - #endif - ]])],[ - bdb48path="${searchpath}" - break - ],[]) - done - if test "x$bdbpath" = "xX"; then - AC_MSG_RESULT([no]) - AC_MSG_ERROR(libdb_cxx headers missing) - elif test "x$bdb48path" = "xX"; then - BITCOIN_SUBDIR_TO_INCLUDE(BDB_CPPFLAGS,[${bdbpath}],db_cxx) - AC_ARG_WITH([incompatible-bdb],[AS_HELP_STRING([--with-incompatible-bdb], [allow using a bdb version other than 4.8])],[ - AC_MSG_WARN([Found Berkeley DB other than 4.8; wallets opened by this build will not be portable!]) - ],[ - AC_MSG_ERROR([Found Berkeley DB other than 4.8, required for portable wallets (--with-incompatible-bdb to ignore or --disable-wallet to disable wallet functionality)]) - ]) + for searchpath in $bdbdirlist ''; do + test -n "${searchpath}" && searchpath="${searchpath}/" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include <${searchpath}db_cxx.h> + ]],[[ + #if !((DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 8) || DB_VERSION_MAJOR > 4) + #error "failed to find bdb 4.8+" + #endif + ]])],[ + if test "x$bdbpath" = "xX"; then + bdbpath="${searchpath}" + fi + ],[ + continue + ]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include <${searchpath}db_cxx.h> + ]],[[ + #if !(DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR == 8) + #error "failed to find bdb 4.8" + #endif + ]])],[ + bdb48path="${searchpath}" + break + ],[]) + done + if test "x$bdbpath" = "xX"; then + AC_MSG_RESULT([no]) + AC_MSG_ERROR([libdb_cxx headers missing, ]AC_PACKAGE_NAME[ requires this library for wallet functionality (--disable-wallet to disable wallet functionality)]) + elif test "x$bdb48path" = "xX"; then + BITCOIN_SUBDIR_TO_INCLUDE(BDB_CPPFLAGS,[${bdbpath}],db_cxx) + AC_ARG_WITH([incompatible-bdb],[AS_HELP_STRING([--with-incompatible-bdb], [allow using a bdb version other than 4.8])],[ + AC_MSG_WARN([Found Berkeley DB other than 4.8; wallets opened by this build will not be portable!]) + ],[ + AC_MSG_ERROR([Found Berkeley DB other than 4.8, required for portable wallets (--with-incompatible-bdb to ignore or --disable-wallet to disable wallet functionality)]) + ]) + else + BITCOIN_SUBDIR_TO_INCLUDE(BDB_CPPFLAGS,[${bdb48path}],db_cxx) + bdbpath="${bdb48path}" + fi else - BITCOIN_SUBDIR_TO_INCLUDE(BDB_CPPFLAGS,[${bdb48path}],db_cxx) - bdbpath="${bdb48path}" + BDB_CPPFLAGS=${BDB_CFLAGS} fi AC_SUBST(BDB_CPPFLAGS) - # TODO: Ideally this could find the library version and make sure it matches the headers being used - for searchlib in db_cxx-4.8 db_cxx; do - AC_CHECK_LIB([$searchlib],[main],[ - BDB_LIBS="-l${searchlib}" - break - ]) - done if test "x$BDB_LIBS" = "x"; then - AC_MSG_ERROR([libdb_cxx missing, Bitcoin Core requires this library for wallet functionality (--disable-wallet to disable wallet functionality)]) + # TODO: Ideally this could find the library version and make sure it matches the headers being used + for searchlib in db_cxx-4.8 db_cxx db4_cxx; do + AC_CHECK_LIB([$searchlib],[main],[ + BDB_LIBS="-l${searchlib}" + break + ]) + done + if test "x$BDB_LIBS" = "x"; then + AC_MSG_ERROR([libdb_cxx missing, ]AC_PACKAGE_NAME[ requires this library for wallet functionality (--disable-wallet to disable wallet functionality)]) + fi fi AC_SUBST(BDB_LIBS) ]) diff --git a/build-aux/m4/bitcoin_qt.m4 b/build-aux/m4/bitcoin_qt.m4 index 1893235..d4689e8 100755 --- a/build-aux/m4/bitcoin_qt.m4 +++ b/build-aux/m4/bitcoin_qt.m4 @@ -1,9 +1,13 @@ +dnl Copyright (c) 2013-2016 The Bitcoin Core developers +dnl Distributed under the MIT software license, see the accompanying +dnl file COPYING or http://www.opensource.org/licenses/mit-license.php. + dnl Helper for cases where a qt dependency is not met. dnl Output: If qt version is auto, set bitcoin_enable_qt to false. Else, exit. AC_DEFUN([BITCOIN_QT_FAIL],[ - if test "x$bitcoin_qt_want_version" = "xauto" && test x$bitcoin_qt_force != xyes; then - if test x$bitcoin_enable_qt != xno; then - AC_MSG_WARN([$1; ohmc-qt frontend will not be built]) + if test "x$bitcoin_qt_want_version" = xauto && test "x$bitcoin_qt_force" != xyes; then + if test "x$bitcoin_enable_qt" != xno; then + AC_MSG_WARN([$1; ohmcoin-qt frontend will not be built]) fi bitcoin_enable_qt=no bitcoin_enable_qt_test=no @@ -13,7 +17,7 @@ AC_DEFUN([BITCOIN_QT_FAIL],[ ]) AC_DEFUN([BITCOIN_QT_CHECK],[ - if test "x$bitcoin_enable_qt" != "xno" && test x$bitcoin_qt_want_version != xno; then + if test "x$bitcoin_enable_qt" != xno && test "x$bitcoin_qt_want_version" != xno; then true $1 else @@ -31,12 +35,12 @@ dnl Inputs: $4: If "yes", don't fail if $2 is not found. dnl Output: $1 is set to the path of $2 if found. $2 are searched in order. AC_DEFUN([BITCOIN_QT_PATH_PROGS],[ BITCOIN_QT_CHECK([ - if test "x$3" != "x"; then + if test "x$3" != x; then AC_PATH_PROGS($1,$2,,$3) else AC_PATH_PROGS($1,$2) fi - if test "x$$1" = "x" && test "x$4" != "xyes"; then + if test "x$$1" = x && test "x$4" != xyes; then BITCOIN_QT_FAIL([$1 not found]) fi ]) @@ -50,10 +54,10 @@ AC_DEFUN([BITCOIN_QT_INIT],[ dnl enable qt support AC_ARG_WITH([gui], [AS_HELP_STRING([--with-gui@<:@=no|qt4|qt5|auto@:>@], - [build ohmc-qt GUI (default=auto, qt5 tried first)])], + [build ohmcoin-qt GUI (default=auto, qt5 tried first)])], [ bitcoin_qt_want_version=$withval - if test x$bitcoin_qt_want_version = xyes; then + if test "x$bitcoin_qt_want_version" = xyes; then bitcoin_qt_force=yes bitcoin_qt_want_version=auto fi @@ -85,11 +89,11 @@ dnl Outputs: bitcoin_enable_qt, bitcoin_enable_qt_dbus, bitcoin_enable_qt_test AC_DEFUN([BITCOIN_QT_CONFIGURE],[ use_pkgconfig=$1 - if test x$use_pkgconfig = x; then + if test "x$use_pkgconfig" = x; then use_pkgconfig=yes fi - if test x$use_pkgconfig = xyes; then + if test "x$use_pkgconfig" = xyes; then BITCOIN_QT_CHECK([_BITCOIN_QT_FIND_LIBS_WITH_PKGCONFIG([$2])]) else BITCOIN_QT_CHECK([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG]) @@ -109,38 +113,46 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[ TEMP_CXXFLAGS=$CXXFLAGS CPPFLAGS="$QT_INCLUDES $CPPFLAGS" CXXFLAGS="$PIC_FLAGS $CXXFLAGS" - if test x$bitcoin_qt_got_major_vers = x5; then + if test "x$bitcoin_qt_got_major_vers" = x5; then TEMP_CPPFLAGS="$TEMP_CPPFLAGS -DHAVE_QT5" _BITCOIN_QT_IS_STATIC - if test x$bitcoin_cv_static_qt = xyes; then + if test "x$bitcoin_cv_static_qt" = xyes; then _BITCOIN_QT_FIND_STATIC_PLUGINS AC_DEFINE(QT_STATICPLUGIN, 1, [Define this symbol if qt plugins are static]) - AC_CACHE_CHECK(for Qt < 5.4, bitcoin_cv_need_acc_widget,[AC_COMPILE_IFELSE([AC_LANG_PROGRAM( - [[#include ]],[[ - #if QT_VERSION >= 0x050400 - choke; - #endif + AC_CACHE_CHECK(for Qt < 5.4, bitcoin_cv_need_acc_widget,[ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #ifndef QT_VERSION + # include + #endif + ]], + [[ + #if QT_VERSION >= 0x050400 + choke + #endif ]])], [bitcoin_cv_need_acc_widget=yes], [bitcoin_cv_need_acc_widget=no]) ]) - if test "x$bitcoin_cv_need_acc_widget" = "xyes"; then + if test "x$bitcoin_cv_need_acc_widget" = xyes; then _BITCOIN_QT_CHECK_STATIC_PLUGINS([Q_IMPORT_PLUGIN(AccessibleFactory)], [-lqtaccessiblewidgets]) fi - if test x$TARGET_OS = xwindows; then + _BITCOIN_QT_CHECK_STATIC_PLUGINS([Q_IMPORT_PLUGIN(QMinimalIntegrationPlugin)],[-lqminimal]) + AC_DEFINE(QT_QPA_PLATFORM_MINIMAL, 1, [Define this symbol if the minimal qt platform exists]) + if test "x$TARGET_OS" = xwindows; then _BITCOIN_QT_CHECK_STATIC_PLUGINS([Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)],[-lqwindows]) AC_DEFINE(QT_QPA_PLATFORM_WINDOWS, 1, [Define this symbol if the qt platform is windows]) - elif test x$TARGET_OS = xlinux; then + elif test "x$TARGET_OS" = xlinux; then _BITCOIN_QT_CHECK_STATIC_PLUGINS([Q_IMPORT_PLUGIN(QXcbIntegrationPlugin)],[-lqxcb -lxcb-static]) AC_DEFINE(QT_QPA_PLATFORM_XCB, 1, [Define this symbol if the qt platform is xcb]) - elif test x$TARGET_OS = xdarwin; then + elif test "x$TARGET_OS" = xdarwin; then AX_CHECK_LINK_FLAG([[-framework IOKit]],[QT_LIBS="$QT_LIBS -framework IOKit"],[AC_MSG_ERROR(could not iokit framework)]) _BITCOIN_QT_CHECK_STATIC_PLUGINS([Q_IMPORT_PLUGIN(QCocoaIntegrationPlugin)],[-lqcocoa]) AC_DEFINE(QT_QPA_PLATFORM_COCOA, 1, [Define this symbol if the qt platform is cocoa]) fi fi else - if test x$TARGET_OS = xwindows; then + if test "x$TARGET_OS" = xwindows; then AC_DEFINE(QT_STATICPLUGIN, 1, [Define this symbol if qt plugins are static]) _BITCOIN_QT_CHECK_STATIC_PLUGINS([ Q_IMPORT_PLUGIN(qcncodecs) @@ -155,27 +167,32 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[ CXXFLAGS=$TEMP_CXXFLAGS ]) - if test x$use_pkgconfig$qt_bin_path = xyes; then - if test x$bitcoin_qt_got_major_vers = x5; then + if test "x$use_pkgconfig$qt_bin_path" = xyes; then + if test "x$bitcoin_qt_got_major_vers" = x5; then qt_bin_path="`$PKG_CONFIG --variable=host_bins Qt5Core 2>/dev/null`" fi fi - if test x$use_hardening != xno; then + if test "x$use_hardening" != xno; then BITCOIN_QT_CHECK([ - AC_MSG_CHECKING(whether -fOHMC can be used with this Qt config) + AC_MSG_CHECKING(whether -fPIE can be used with this Qt config) TEMP_CPPFLAGS=$CPPFLAGS TEMP_CXXFLAGS=$CXXFLAGS CPPFLAGS="$QT_INCLUDES $CPPFLAGS" - CXXFLAGS="$OHMC_FLAGS $CXXFLAGS" - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + CXXFLAGS="$PIE_FLAGS $CXXFLAGS" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #ifndef QT_VERSION + # include + #endif + ]], [[ - #if defined(QT_REDUCE_RELOCATIONS) - choke; - #endif + #if defined(QT_REDUCE_RELOCATIONS) + choke + #endif ]])], - [ AC_MSG_RESULT(yes); QT_OHMC_FLAGS=$OHMC_FLAGS ], - [ AC_MSG_RESULT(no); QT_OHMC_FLAGS=$PIC_FLAGS] + [ AC_MSG_RESULT(yes); QT_PIE_FLAGS=$PIE_FLAGS ], + [ AC_MSG_RESULT(no); QT_PIE_FLAGS=$PIC_FLAGS] ) CPPFLAGS=$TEMP_CPPFLAGS CXXFLAGS=$TEMP_CXXFLAGS @@ -185,14 +202,19 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[ AC_MSG_CHECKING(whether -fPIC is needed with this Qt config) TEMP_CPPFLAGS=$CPPFLAGS CPPFLAGS="$QT_INCLUDES $CPPFLAGS" - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #ifndef QT_VERSION + # include + #endif + ]], [[ - #if defined(QT_REDUCE_RELOCATIONS) - choke; - #endif + #if defined(QT_REDUCE_RELOCATIONS) + choke + #endif ]])], [ AC_MSG_RESULT(no)], - [ AC_MSG_RESULT(yes); QT_OHMC_FLAGS=$PIC_FLAGS] + [ AC_MSG_RESULT(yes); QT_PIE_FLAGS=$PIC_FLAGS] ) CPPFLAGS=$TEMP_CPPFLAGS ]) @@ -225,25 +247,25 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[ BITCOIN_QT_CHECK([ bitcoin_enable_qt=yes bitcoin_enable_qt_test=yes - if test x$have_qt_test = xno; then + if test "x$have_qt_test" = xno; then bitcoin_enable_qt_test=no fi bitcoin_enable_qt_dbus=no - if test x$use_dbus != xno && test x$have_qt_dbus = xyes; then + if test "x$use_dbus" != xno && test "x$have_qt_dbus" = xyes; then bitcoin_enable_qt_dbus=yes fi - if test x$use_dbus = xyes && test x$have_qt_dbus = xno; then - AC_MSG_ERROR("libQtDBus not found. Install libQtDBus or remove --with-qtdbus.") + if test "x$use_dbus" = xyes && test "x$have_qt_dbus" = xno; then + AC_MSG_ERROR([libQtDBus not found. Install libQtDBus or remove --with-qtdbus.]) fi - if test x$LUPDATE = x; then - AC_MSG_WARN("lupdate is required to update qt translations") + if test "x$LUPDATE" = x; then + AC_MSG_WARN([lupdate is required to update qt translations]) fi ],[ bitcoin_enable_qt=no ]) AC_MSG_RESULT([$bitcoin_enable_qt (Qt${bitcoin_qt_got_major_vers})]) - AC_SUBST(QT_OHMC_FLAGS) + AC_SUBST(QT_PIE_FLAGS) AC_SUBST(QT_INCLUDES) AC_SUBST(QT_LIBS) AC_SUBST(QT_LDFLAGS) @@ -264,13 +286,15 @@ dnl Requires: INCLUDES must be populated as necessary. dnl Output: bitcoin_cv_qt5=yes|no AC_DEFUN([_BITCOIN_QT_CHECK_QT5],[ AC_CACHE_CHECK(for Qt 5, bitcoin_cv_qt5,[ - AC_COMPILE_IFELSE([AC_LANG_PROGRAM( - [[#include ]], + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #ifndef QT_VERSION + # include + #endif + ]], [[ #if QT_VERSION < 0x050000 - choke me - #else - return 0; + choke #endif ]])], [bitcoin_cv_qt5=yes], @@ -284,19 +308,21 @@ dnl Output: bitcoin_cv_static_qt=yes|no dnl Output: Defines QT_STATICPLUGIN if plugins are static. AC_DEFUN([_BITCOIN_QT_IS_STATIC],[ AC_CACHE_CHECK(for static Qt, bitcoin_cv_static_qt,[ - AC_COMPILE_IFELSE([AC_LANG_PROGRAM( - [[#include ]], + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #ifndef QT_VERSION + # include + #endif + ]], [[ - #if defined(QT_STATIC) - return 0; - #else - choke me + #if !defined(QT_STATIC) + choke #endif ]])], [bitcoin_cv_static_qt=yes], [bitcoin_cv_static_qt=no]) ]) - if test xbitcoin_cv_static_qt = xyes; then + if test "x$bitcoin_cv_static_qt" = xyes; then AC_DEFINE(QT_STATICPLUGIN, 1, [Define this symbol for static Qt plugins]) fi ]) @@ -325,30 +351,50 @@ dnl Inputs: bitcoin_qt_got_major_vers. 4 or 5. dnl Inputs: qt_plugin_path. optional. dnl Outputs: QT_LIBS is appended AC_DEFUN([_BITCOIN_QT_FIND_STATIC_PLUGINS],[ - if test x$bitcoin_qt_got_major_vers = x5; then - if test x$qt_plugin_path != x; then + if test "x$bitcoin_qt_got_major_vers" = x5; then + if test "x$qt_plugin_path" != x; then QT_LIBS="$QT_LIBS -L$qt_plugin_path/platforms" if test -d "$qt_plugin_path/accessible"; then QT_LIBS="$QT_LIBS -L$qt_plugin_path/accessible" fi fi + if test "x$use_pkgconfig" = xyes; then + : dnl m4_ifdef([PKG_CHECK_MODULES],[ - if test x$use_pkgconfig = xyes; then PKG_CHECK_MODULES([QTPLATFORM], [Qt5PlatformSupport], [QT_LIBS="$QTPLATFORM_LIBS $QT_LIBS"]) - if test x$TARGET_OS = xlinux; then + if test "x$TARGET_OS" = xlinux; then PKG_CHECK_MODULES([X11XCB], [x11-xcb], [QT_LIBS="$X11XCB_LIBS $QT_LIBS"]) if ${PKG_CONFIG} --exists "Qt5Core >= 5.5" 2>/dev/null; then PKG_CHECK_MODULES([QTXCBQPA], [Qt5XcbQpa], [QT_LIBS="$QTXCBQPA_LIBS $QT_LIBS"]) fi - elif test x$TARGET_OS = xdarwin; then + elif test "x$TARGET_OS" = xdarwin; then PKG_CHECK_MODULES([QTPRINT], [Qt5PrintSupport], [QT_LIBS="$QTPRINT_LIBS $QT_LIBS"]) fi - else - QT_LIBS="-lQt5PlatformSupport $QT_LIBS" - fi ]) + else + if test "x$TARGET_OS" = xwindows; then + AC_CACHE_CHECK(for Qt >= 5.6, bitcoin_cv_need_platformsupport,[ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #ifndef QT_VERSION + # include + #endif + ]], + [[ + #if QT_VERSION < 0x050600 + choke + #endif + ]])], + [bitcoin_cv_need_platformsupport=yes], + [bitcoin_cv_need_platformsupport=no]) + ]) + if test "x$bitcoin_cv_need_platformsupport" = xyes; then + BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}PlatformSupport],[main],,BITCOIN_QT_FAIL(lib${QT_LIB_PREFIX}PlatformSupport not found))) + fi + fi + fi else - if test x$qt_plugin_path != x; then + if test "x$qt_plugin_path" != x; then QT_LIBS="$QT_LIBS -L$qt_plugin_path/accessible" QT_LIBS="$QT_LIBS -L$qt_plugin_path/codecs" fi @@ -366,10 +412,10 @@ dnl Outputs: have_qt_test and have_qt_dbus are set (if applicable) to yes|no. AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITH_PKGCONFIG],[ m4_ifdef([PKG_CHECK_MODULES],[ auto_priority_version=$1 - if test x$auto_priority_version = x; then + if test "x$auto_priority_version" = x; then auto_priority_version=qt5 fi - if test x$bitcoin_qt_want_version = xqt5 || ( test x$bitcoin_qt_want_version = xauto && test x$auto_priority_version = xqt5 ); then + if test "x$bitcoin_qt_want_version" = xqt5 || ( test "x$bitcoin_qt_want_version" = xauto && test "x$auto_priority_version" = xqt5 ); then QT_LIB_PREFIX=Qt5 bitcoin_qt_got_major_vers=5 else @@ -379,28 +425,28 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITH_PKGCONFIG],[ qt5_modules="Qt5Core Qt5Gui Qt5Network Qt5Widgets" qt4_modules="QtCore QtGui QtNetwork" BITCOIN_QT_CHECK([ - if test x$bitcoin_qt_want_version = xqt5 || ( test x$bitcoin_qt_want_version = xauto && test x$auto_priority_version = xqt5 ); then - PKG_CHECK_MODULES([QT], [$qt5_modules], [QT_INCLUDES="$QT_CFLAGS"; have_qt=yes],[have_qt=no]) - elif test x$bitcoin_qt_want_version = xqt4 || ( test x$bitcoin_qt_want_version = xauto && test x$auto_priority_version = xqt4 ); then - PKG_CHECK_MODULES([QT], [$qt4_modules], [QT_INCLUDES="$QT_CFLAGS"; have_qt=yes], [have_qt=no]) + if test "x$bitcoin_qt_want_version" = xqt5 || ( test "x$bitcoin_qt_want_version" = xauto && test "x$auto_priority_version" = xqt5 ); then + PKG_CHECK_MODULES([QT5], [$qt5_modules], [QT_INCLUDES="$QT5_CFLAGS"; QT_LIBS="$QT5_LIBS" have_qt=yes],[have_qt=no]) + elif test "x$bitcoin_qt_want_version" = xqt4 || ( test "x$bitcoin_qt_want_version" = xauto && test "x$auto_priority_version" = xqt4 ); then + PKG_CHECK_MODULES([QT4], [$qt4_modules], [QT_INCLUDES="$QT4_CFLAGS"; QT_LIBS="$QT4_LIBS" ; have_qt=yes], [have_qt=no]) fi dnl qt version is set to 'auto' and the preferred version wasn't found. Now try the other. - if test x$have_qt = xno && test x$bitcoin_qt_want_version = xauto; then - if test x$auto_priority_version = xqt5; then - PKG_CHECK_MODULES([QT], [$qt4_modules], [QT_INCLUDES="$QT_CFLAGS"; have_qt=yes; QT_LIB_PREFIX=Qt; bitcoin_qt_got_major_vers=4], [have_qt=no]) + if test "x$have_qt" = xno && test "x$bitcoin_qt_want_version" = xauto; then + if test "x$auto_priority_version" = xqt5; then + PKG_CHECK_MODULES([QT4], [$qt4_modules], [QT_INCLUDES="$QT4_CFLAGS"; QT_LIBS="$QT4_LIBS" ; have_qt=yes; QT_LIB_PREFIX=Qt; bitcoin_qt_got_major_vers=4], [have_qt=no]) else - PKG_CHECK_MODULES([QT], [$qt5_modules], [QT_INCLUDES="$QT_CFLAGS"; have_qt=yes; QT_LIB_PREFIX=Qt5; bitcoin_qt_got_major_vers=5], [have_qt=no]) + PKG_CHECK_MODULES([QT5], [$qt5_modules], [QT_INCLUDES="$QT5_CFLAGS"; QT_LIBS="$QT5_LIBS" ; have_qt=yes; QT_LIB_PREFIX=Qt5; bitcoin_qt_got_major_vers=5], [have_qt=no]) fi fi - if test x$have_qt != xyes; then + if test "x$have_qt" != xyes; then have_qt=no BITCOIN_QT_FAIL([Qt dependencies not found]) fi ]) BITCOIN_QT_CHECK([ PKG_CHECK_MODULES([QT_TEST], [${QT_LIB_PREFIX}Test], [QT_TEST_INCLUDES="$QT_TEST_CFLAGS"; have_qt_test=yes], [have_qt_test=no]) - if test x$use_dbus != xno; then + if test "x$use_dbus" != xno; then PKG_CHECK_MODULES([QT_DBUS], [${QT_LIB_PREFIX}DBus], [QT_DBUS_INCLUDES="$QT_DBUS_CFLAGS"; have_qt_dbus=yes], [have_qt_dbus=no]) fi ]) @@ -421,7 +467,7 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG],[ CXXFLAGS="$PIC_FLAGS $CXXFLAGS" TEMP_LIBS="$LIBS" BITCOIN_QT_CHECK([ - if test x$qt_include_path != x; then + if test "x$qt_include_path" != x; then QT_INCLUDES="-I$qt_include_path -I$qt_include_path/QtCore -I$qt_include_path/QtGui -I$qt_include_path/QtWidgets -I$qt_include_path/QtNetwork -I$qt_include_path/QtTest -I$qt_include_path/QtDBus" CPPFLAGS="$QT_INCLUDES $CPPFLAGS" fi @@ -432,10 +478,10 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG],[ BITCOIN_QT_CHECK([AC_CHECK_HEADER([QLocalSocket],, BITCOIN_QT_FAIL(QtNetwork headers missing))]) BITCOIN_QT_CHECK([ - if test x$bitcoin_qt_want_version = xauto; then + if test "x$bitcoin_qt_want_version" = xauto; then _BITCOIN_QT_CHECK_QT5 fi - if test x$bitcoin_cv_qt5 = xyes || test x$bitcoin_qt_want_version = xqt5; then + if test "x$bitcoin_cv_qt5" = xyes || test "x$bitcoin_qt_want_version" = xqt5; then QT_LIB_PREFIX=Qt5 bitcoin_qt_got_major_vers=5 else @@ -446,11 +492,11 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG],[ BITCOIN_QT_CHECK([ LIBS= - if test x$qt_lib_path != x; then + if test "x$qt_lib_path" != x; then LIBS="$LIBS -L$qt_lib_path" fi - if test x$TARGET_OS = xwindows; then + if test "x$TARGET_OS" = xwindows; then AC_CHECK_LIB([imm32], [main],, BITCOIN_QT_FAIL(libimm32 not found)) fi ]) @@ -460,26 +506,26 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG],[ BITCOIN_QT_CHECK(AC_SEARCH_LIBS([jpeg_create_decompress] ,[qtjpeg jpeg],,AC_MSG_WARN([libjpeg not found. Assuming qt has it built-in]))) BITCOIN_QT_CHECK(AC_SEARCH_LIBS([pcre16_exec], [qtpcre pcre16],,AC_MSG_WARN([libpcre16 not found. Assuming qt has it built-in]))) BITCOIN_QT_CHECK(AC_SEARCH_LIBS([hb_ot_tags_from_script] ,[qtharfbuzzng harfbuzz],,AC_MSG_WARN([libharfbuzz not found. Assuming qt has it built-in or support is disabled]))) - BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Core] ,[main],,BITCOIN_QT_FAIL(lib$QT_LIB_PREFIXCore not found))) - BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Gui] ,[main],,BITCOIN_QT_FAIL(lib$QT_LIB_PREFIXGui not found))) - BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Network],[main],,BITCOIN_QT_FAIL(lib$QT_LIB_PREFIXNetwork not found))) - if test x$bitcoin_qt_got_major_vers = x5; then - BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Widgets],[main],,BITCOIN_QT_FAIL(lib$QT_LIB_PREFIXWidgets not found))) + BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Core] ,[main],,BITCOIN_QT_FAIL(lib${QT_LIB_PREFIX}Core not found))) + BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Gui] ,[main],,BITCOIN_QT_FAIL(lib${QT_LIB_PREFIX}Gui not found))) + BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Network],[main],,BITCOIN_QT_FAIL(lib${QT_LIB_PREFIX}Network not found))) + if test "x$bitcoin_qt_got_major_vers" = x5; then + BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Widgets],[main],,BITCOIN_QT_FAIL(lib${QT_LIB_PREFIX}Widgets not found))) fi QT_LIBS="$LIBS" LIBS="$TEMP_LIBS" BITCOIN_QT_CHECK([ LIBS= - if test x$qt_lib_path != x; then + if test "x$qt_lib_path" != x; then LIBS="-L$qt_lib_path" fi AC_CHECK_LIB([${QT_LIB_PREFIX}Test], [main],, have_qt_test=no) AC_CHECK_HEADER([QTest],, have_qt_test=no) QT_TEST_LIBS="$LIBS" - if test x$use_dbus != xno; then + if test "x$use_dbus" != xno; then LIBS= - if test x$qt_lib_path != x; then + if test "x$qt_lib_path" != x; then LIBS="-L$qt_lib_path" fi AC_CHECK_LIB([${QT_LIB_PREFIX}DBus], [main],, have_qt_dbus=no) @@ -490,4 +536,5 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG],[ CPPFLAGS="$TEMP_CPPFLAGS" CXXFLAGS="$TEMP_CXXFLAGS" LIBS="$TEMP_LIBS" -]) \ No newline at end of file +]) + diff --git a/build-aux/m4/bitcoin_subdir_to_include.m4 b/build-aux/m4/bitcoin_subdir_to_include.m4 index 66f106c..7841042 100755 --- a/build-aux/m4/bitcoin_subdir_to_include.m4 +++ b/build-aux/m4/bitcoin_subdir_to_include.m4 @@ -1,3 +1,7 @@ +dnl Copyright (c) 2013-2014 The Bitcoin Core developers +dnl Distributed under the MIT software license, see the accompanying +dnl file COPYING or http://www.opensource.org/licenses/mit-license.php. + dnl BITCOIN_SUBDIR_TO_INCLUDE([CPPFLAGS-VARIABLE-NAME],[SUBDIRECTORY-NAME],[HEADER-FILE]) dnl SUBDIRECTORY-NAME must end with a path separator AC_DEFUN([BITCOIN_SUBDIR_TO_INCLUDE],[ diff --git a/build-aux/m4/l_atomic.m4 b/build-aux/m4/l_atomic.m4 new file mode 100644 index 0000000..75c43f9 --- /dev/null +++ b/build-aux/m4/l_atomic.m4 @@ -0,0 +1,46 @@ +dnl Copyright (c) 2015 Tim Kosse +dnl Copying and distribution of this file, with or without modification, are +dnl permitted in any medium without royalty provided the copyright notice +dnl and this notice are preserved. This file is offered as-is, without any +dnl warranty. + +# Some versions of gcc/libstdc++ require linking with -latomic if +# using the C++ atomic library. +# +# Sourced from http://bugs.debian.org/797228 + +m4_define([_CHECK_ATOMIC_testbody], [[ + #include + #include + + int main() { + std::atomic a{}; + + int64_t v = 5; + int64_t r = a.fetch_add(v); + return static_cast(r); + } +]]) + +AC_DEFUN([CHECK_ATOMIC], [ + + AC_LANG_PUSH(C++) + + AC_MSG_CHECKING([whether std::atomic can be used without link library]) + + AC_LINK_IFELSE([AC_LANG_SOURCE([_CHECK_ATOMIC_testbody])],[ + AC_MSG_RESULT([yes]) + ],[ + AC_MSG_RESULT([no]) + LIBS="$LIBS -latomic" + AC_MSG_CHECKING([whether std::atomic needs -latomic]) + AC_LINK_IFELSE([AC_LANG_SOURCE([_CHECK_ATOMIC_testbody])],[ + AC_MSG_RESULT([yes]) + ],[ + AC_MSG_RESULT([no]) + AC_MSG_FAILURE([cannot figure out how to use std::atomic]) + ]) + ]) + + AC_LANG_POP +]) diff --git a/changelog.md b/changelog.md deleted file mode 100755 index 6935b57..0000000 --- a/changelog.md +++ /dev/null @@ -1,6 +0,0 @@ -Updated DNS Seeds 4/1/2018
-Updated Frontend graphics 4/1/2018 boostdmg01
-Fixed "make deploy" bombing issue for macOS 3/7/2018 RasAlGhul
-Added new DNS Seeder IP Addresses for testnet and mainnet 3/7/2018 RasAlGhul
-Fixed testnet icon issue 3/7/2018 RasAlGhul
-Updated mac os x compile instructions 3/6/2018 RasAlGhul
diff --git a/configure.ac b/configure.ac index cc7d46a..9d38faa 100755 --- a/configure.ac +++ b/configure.ac @@ -1,17 +1,28 @@ dnl require autoconf 2.60 (AS_ECHO/AS_ECHO_N) AC_PREREQ([2.60]) -define(_CLIENT_VERSION_MAJOR, 2) -define(_CLIENT_VERSION_MINOR, 4) +define(_CLIENT_VERSION_MAJOR, 3) +define(_CLIENT_VERSION_MINOR, 0) define(_CLIENT_VERSION_REVISION, 0) define(_CLIENT_VERSION_BUILD, 0) define(_CLIENT_VERSION_IS_RELEASE, true) define(_COPYRIGHT_YEAR, 2019) -AC_INIT([Ohm Core],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[www.ohmcoin.org],[ohmc]) +AC_INIT([Ohmcoin Core],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[www.ohmcoin.io],[ohmcoin]) AC_CONFIG_SRCDIR([src/main.cpp]) -AC_CONFIG_HEADERS([src/config/ohmc-config.h]) +AC_CONFIG_HEADERS([src/config/ohmcoin-config.h]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_MACRO_DIR([build-aux/m4]) +BITCOIN_DAEMON_NAME=ohmcoind +BITCOIN_GUI_NAME=ohmcoin-qt +BITCOIN_CLI_NAME=ohmcoin-cli +BITCOIN_TX_NAME=ohmcoin-tx + +dnl Unless the user specified ARFLAGS, force it to be cr +AC_ARG_VAR(ARFLAGS, [Flags for the archiver, defaults to if not set]) +if test "x${ARFLAGS+set}" != "xset"; then + ARFLAGS="cr" +fi + AC_CANONICAL_HOST AH_TOP([#ifndef OHMC_CONFIG_H]) @@ -38,7 +49,6 @@ else CXXFLAGS_overridden=no fi AC_PROG_CXX -dnl ifdef([AC_PROG_OBJCXX],[AC_PROG_OBJCXX]) dnl By default, libtool for mingw refuses to link static libs into a dll for dnl fear of mixing pic/non-pic objects, and import/export complications. Since @@ -49,7 +59,9 @@ case $host in ;; esac dnl Require C++11 compiler (no GNU extensions) -AX_CXX_COMPILE_STDCXX([11], [noext], [mandatory]) +AX_CXX_COMPILE_STDCXX([11], [noext], [mandatory], [nodefault]) +dnl Check if -latomic is required for +CHECK_ATOMIC dnl Unless the user specified OBJCXX, force it to be the same as CXX. This ensures dnl that we get the same -std flags for both. @@ -59,6 +71,7 @@ if test "x${OBJCXX+set}" = "x"; then fi AC_PROG_OBJCXX ]) + dnl Libtool init checks. LT_INIT([pic-only]) @@ -68,8 +81,8 @@ AC_PATH_TOOL(RANLIB, ranlib) AC_PATH_TOOL(STRIP, strip) AC_PATH_TOOL(GCOV, gcov) AC_PATH_PROG(LCOV, lcov) -AC_PATH_PROG(JAVA, java) -AC_PATH_PROGS([PYTHON], [python3 python2.7 python2 python]) +dnl Python 3.x is supported from 3.4 on (see https://github.com/bitcoin/bitcoin/issues/7893) +AC_PATH_PROGS([PYTHON], [python3.6 python3.5 python3.4 python3 python2.7 python2 python]) AC_PATH_PROG(GENHTML, genhtml) AC_PATH_PROG([GIT], [git]) AC_PATH_PROG(CCACHE,ccache) @@ -81,20 +94,10 @@ AC_PATH_TOOL(OBJCOPY, objcopy) AC_ARG_VAR(PYTHONPATH, Augments the default search path for python module files) -# This m4 will only be used if a system copy cannot be found. This is helpful -# on systems where autotools are installed but the pkg-config macros are not in -# a default location. It is currently used for building on OSX where autotools -# are preinstalled but pkg-config comes from macports or homebrew. It should -# probably be removed when building on <= 10.6 is no longer supported. -m4_include([pkg.m4]) - -dnl pkg-config check. -PKG_PROG_PKG_CONFIG - # Enable wallet AC_ARG_ENABLE([wallet], - [AS_HELP_STRING([--enable-wallet], - [enable wallet (default is yes)])], + [AS_HELP_STRING([--disable-wallet], + [disable wallet (enabled by default)])], [enable_wallet=$enableval], [enable_wallet=yes]) @@ -111,9 +114,9 @@ AC_ARG_ENABLE([upnp-default], [use_upnp_default=no]) AC_ARG_ENABLE(tests, - AS_HELP_STRING([--enable-tests],[compile tests (default is yes)]), + AS_HELP_STRING([--enable-tests],[compile tests (default is no)]), [use_tests=$enableval], - [use_tests=yes]) + [use_tests=no]) AC_ARG_WITH([comparison-tool], AS_HELP_STRING([--with-comparison-tool],[path to java comparison tool (requires --enable-tests)]), @@ -132,32 +135,32 @@ AC_ARG_WITH([qrencode], [use_qr=auto]) AC_ARG_ENABLE([hardening], - [AS_HELP_STRING([--enable-hardening], - [attempt to harden the resulting executables (default is yes)])], + [AS_HELP_STRING([--disable-hardening], + [do not attempt to harden the resulting executables (default is to harden)])], [use_hardening=$enableval], [use_hardening=yes]) AC_ARG_ENABLE([reduce-exports], [AS_HELP_STRING([--enable-reduce-exports], - [attempt to reduce exported symbols in the resulting executables (default is yes)])], + [attempt to reduce exported symbols in the resulting executables (default is no)])], [use_reduce_exports=$enableval], - [use_reduce_exports=auto]) + [use_reduce_exports=no]) AC_ARG_ENABLE([ccache], - [AS_HELP_STRING([--enable-ccache], - [use ccache for building (default is yes if ccache is found)])], + [AS_HELP_STRING([--disable-ccache], + [do not use ccache for building (default is to use if found)])], [use_ccache=$enableval], [use_ccache=auto]) AC_ARG_ENABLE([lcov], [AS_HELP_STRING([--enable-lcov], [enable lcov testing (default is no)])], - [use_lcov=yes], + [use_lcov=$enableval], [use_lcov=no]) AC_ARG_ENABLE([glibc-back-compat], [AS_HELP_STRING([--enable-glibc-back-compat], - [enable backwards compatibility with glibc and libstdc++])], + [enable backwards compatibility with glibc])], [use_glibc_compat=$enableval], [use_glibc_compat=no]) @@ -167,6 +170,13 @@ AC_ARG_ENABLE([zmq], [use_zmq=$enableval], [use_zmq=yes]) +AC_ARG_WITH([system-univalue], + [AS_HELP_STRING([--with-system-univalue], + [Build with system UniValue (default is no)])], + [system_univalue=$withval], + [system_univalue=no] +) + AC_ARG_WITH([protoc-bindir],[AS_HELP_STRING([--with-protoc-bindir=BIN_DIR],[specify protoc bin path])], [protoc_bin_path=$withval], []) # Enable debug @@ -176,27 +186,58 @@ AC_ARG_ENABLE([debug], [enable_debug=$enableval], [enable_debug=no]) +# Turn warnings into errors +AC_ARG_ENABLE([werror], + [AS_HELP_STRING([--enable-werror], + [Treat certain compiler warnings as errors (default is no)])], + [enable_werror=$enableval], + [enable_werror=no]) + +AC_LANG_PUSH([C++]) +AX_CHECK_COMPILE_FLAG([-Werror],[CXXFLAG_WERROR="-Werror"],[CXXFLAG_WERROR=""]) + if test "x$enable_debug" = xyes; then + CPPFLAGS="$CPPFLAGS -DDEBUG -DDEBUG_LOCKORDER" if test "x$GCC" = xyes; then - CFLAGS="-g3 -O0 -DDEBUG" + CFLAGS="$CFLAGS -g3 -O0" fi if test "x$GXX" = xyes; then - CXXFLAGS="-g3 -O0 -DDEBUG" + CXXFLAGS="$CXXFLAGS -g3 -O0" fi fi -## TODO: Remove these hard-coded paths and flags. They are here for the sake of -## compatibility with the legacy buildsystem. -## +ERROR_CXXFLAGS= +if test "x$enable_werror" = "xyes"; then + if test "x$CXXFLAG_WERROR" = "x"; then + AC_MSG_ERROR("enable-werror set but -Werror is not usable") + fi + AX_CHECK_COMPILE_FLAG([-Werror=vla],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=vla"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Werror=thread-safety-analysis],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=thread-safety-analysis"],,[[$CXXFLAG_WERROR]]) +fi + if test "x$CXXFLAGS_overridden" = "xno"; then - CXXFLAGS="$CXXFLAGS -Wall -Wextra -Wformat -Wformat-security -Wno-unused-parameter" + AX_CHECK_COMPILE_FLAG([-Wall],[CXXFLAGS="$CXXFLAGS -Wall"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wextra],[CXXFLAGS="$CXXFLAGS -Wextra"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wformat],[CXXFLAGS="$CXXFLAGS -Wformat"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wvla],[CXXFLAGS="$CXXFLAGS -Wvla"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wformat-security],[CXXFLAGS="$CXXFLAGS -Wformat-security"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wthread-safety-analysis],[CXXFLAGS="$CXXFLAGS -Wthread-safety-analysis"],,[[$CXXFLAG_WERROR]]) + + ## Some compilers (gcc) ignore unknown -Wno-* options, but warn about all + ## unknown options if any other warning is produced. Test the -Wfoo case, and + ## set the -Wno-foo case if it works. + AX_CHECK_COMPILE_FLAG([-Wunused-parameter],[CXXFLAGS="$CXXFLAGS -Wno-unused-parameter"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wself-assign],[CXXFLAGS="$CXXFLAGS -Wno-self-assign"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wunused-local-typedef],[CXXFLAGS="$CXXFLAGS -Wno-unused-local-typedef"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wdeprecated-register],[CXXFLAGS="$CXXFLAGS -Wno-deprecated-register"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wimplicit-fallthrough],[CXXFLAGS="$CXXFLAGS -Wno-implicit-fallthrough"],,[[$CXXFLAG_WERROR]]) fi -CPPFLAGS="$CPPFLAGS -DBOOST_SPIRIT_THREADSAFE -DHAVE_BUILD_INFO -D__STDC_FORMAT_MACROS" +CPPFLAGS="$CPPFLAGS -DHAVE_BUILD_INFO -D__STDC_FORMAT_MACROS" AC_ARG_WITH([utils], [AS_HELP_STRING([--with-utils], - [build ohmc-cli ohmc-tx (default=yes)])], + [build ohmcoin-cli ohmcoin-tx (default=yes)])], [build_bitcoin_utils=$withval], [build_bitcoin_utils=yes]) @@ -204,16 +245,14 @@ AC_ARG_WITH([libs], [AS_HELP_STRING([--with-libs], [build libraries (default=yes)])], [build_bitcoin_libs=$withval], - [build_bitcoin_libs=yes]) + [build_bitcoin_libs=no]) AC_ARG_WITH([daemon], [AS_HELP_STRING([--with-daemon], - [build ohmcd daemon (default=yes)])], + [build ohmcoind daemon (default=yes)])], [build_bitcoind=$withval], [build_bitcoind=yes]) -AC_LANG_PUSH([C++]) - use_pkgconfig=yes case $host in *mingw*) @@ -342,6 +381,7 @@ case $host in AX_CHECK_LINK_FLAG([[-Wl,-headerpad_max_install_names]], [LDFLAGS="$LDFLAGS -Wl,-headerpad_max_install_names"]) CPPFLAGS="$CPPFLAGS -DMAC_OSX" + OBJCXXFLAGS="$CXXFLAGS" ;; *linux*) TARGET_OS=linux @@ -350,6 +390,16 @@ case $host in ;; esac +if test x$use_pkgconfig = xyes; then + m4_ifndef([PKG_PROG_PKG_CONFIG], [AC_MSG_ERROR(PKG_PROG_PKG_CONFIG macro not found. Please install pkg-config and re-run autogen.sh.)]) + m4_ifdef([PKG_PROG_PKG_CONFIG], [ + PKG_PROG_PKG_CONFIG + if test x"$PKG_CONFIG" = "x"; then + AC_MSG_ERROR(pkg-config not found.) + fi + ]) +fi + if test x$use_comparison_tool != xno; then AC_SUBST(JAVA_COMPARISON_TOOL, $use_comparison_tool) fi @@ -370,18 +420,19 @@ if test x$use_lcov = xyes; then if test x$GCOV = x; then AC_MSG_ERROR("lcov testing requested but gcov not found") fi - if test x$JAVA = x; then - AC_MSG_ERROR("lcov testing requested but java not found") + if test x$PYTHON = x; then + AC_MSG_ERROR("lcov testing requested but python not found") fi if test x$GENHTML = x; then AC_MSG_ERROR("lcov testing requested but genhtml not found") fi - if test x$use_comparison_tool = x; then - AC_MSG_ERROR("lcov testing requested but comparison tool was not specified") - fi LCOV="$LCOV --gcov-tool=$GCOV" + AX_CHECK_LINK_FLAG([[--coverage]], [LDFLAGS="$LDFLAGS --coverage"], + [AC_MSG_ERROR("lcov testing requested but --coverage linker flag does not work")]) AX_CHECK_COMPILE_FLAG([--coverage],[CXXFLAGS="$CXXFLAGS --coverage"], [AC_MSG_ERROR("lcov testing requested but --coverage flag does not work")]) + AC_DEFINE(USE_COVERAGE, 1, [Define this symbol if coverage is enabled]) + CXXFLAGS="$CXXFLAGS -Og" fi dnl Require little endian @@ -390,7 +441,7 @@ AC_C_BIGENDIAN([AC_MSG_ERROR("Big Endian not supported")]) dnl Check for pthread compile/link requirements AX_PTHREAD -# The following macro will add the necessary defines to ohmc-config.h, but +# The following macro will add the necessary defines to ohmcoin-config.h, but # they also need to be passed down to any subprojects. Pull the results out of # the cache and add them to CPPFLAGS. AC_SYS_LARGEFILE @@ -417,6 +468,10 @@ AX_GCC_FUNC_ATTRIBUTE([dllimport]) if test x$use_glibc_compat != xno; then + #glibc absorbed clock_gettime in 2.17. librt (its previous location) is safe to link + #in anyway for back-compat. + AC_CHECK_LIB([rt],[clock_gettime],, AC_MSG_ERROR(lib missing)) + #__fdelt_chk's params and return type have changed from long unsigned int to long int. # See which one is present here. AC_MSG_CHECKING(__fdelt_chk type) @@ -430,7 +485,13 @@ if test x$use_glibc_compat != xno; then [ fdelt_type="long int"]) AC_MSG_RESULT($fdelt_type) AC_DEFINE_UNQUOTED(FDELT_TYPE, $fdelt_type,[parameter and return value type for __fdelt_chk]) +else + AC_SEARCH_LIBS([clock_gettime],[rt]) +fi +if test x$TARGET_OS != xwindows; then + # All windows code is PIC, forcing it on just adds useless compile warnings + AX_CHECK_COMPILE_FLAG([-fPIC],[PIC_FLAGS="-fPIC"]) fi if test x$use_hardening != xno; then @@ -446,12 +507,12 @@ if test x$use_hardening != xno; then AX_CHECK_LINK_FLAG([[-Wl,--dynamicbase]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--dynamicbase"]) AX_CHECK_LINK_FLAG([[-Wl,--nxcompat]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--nxcompat"]) + AX_CHECK_LINK_FLAG([[-Wl,--high-entropy-va]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--high-entropy-va"]) AX_CHECK_LINK_FLAG([[-Wl,-z,relro]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,relro"]) AX_CHECK_LINK_FLAG([[-Wl,-z,now]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,now"]) if test x$TARGET_OS != xwindows; then - # All windows code is PIC, forcing it on just adds useless compile warnings - AX_CHECK_COMPILE_FLAG([-fPIC],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fPIC"]) + AX_CHECK_COMPILE_FLAG([-fPIC],[PIE_FLAGS="-fPIC"]) AX_CHECK_LINK_FLAG([[-pic]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -pic"]) fi @@ -460,11 +521,6 @@ if test x$use_hardening != xno; then AC_CHECK_LIB([ssp], [main],, AC_MSG_ERROR(lib missing)) ;; esac - - CXXFLAGS="$CXXFLAGS $HARDENED_CXXFLAGS" - CPPFLAGS="$CPPFLAGS $HARDENED_CPPFLAGS" - LDFLAGS="$LDFLAGS $HARDENED_LDFLAGS" - OBJCXXFLAGS="$CXXFLAGS" fi dnl this flag screws up non-darwin gcc even when the check fails. special-case it. @@ -478,6 +534,9 @@ AC_SEARCH_LIBS([inet_pton], [nsl resolv], [AC_DEFINE(HAVE_INET_PTON, 1, [Define AC_CHECK_DECLS([strnlen]) +# Check for daemon(3), unrelated to --with-daemon (although used by it) +AC_CHECK_DECLS([daemon]) + AC_CHECK_DECLS([le32toh, le64toh, htole32, htole64, be32toh, be64toh, htobe32, htobe64],,, [#if HAVE_ENDIAN_H #include @@ -491,7 +550,29 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [ AC_MSG_RESULT(no)] ) -AC_SEARCH_LIBS([clock_gettime],[rt]) +dnl Check for MSG_DONTWAIT +AC_MSG_CHECKING(for MSG_DONTWAIT) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[ int f = MSG_DONTWAIT; ]])], + [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_MSG_DONTWAIT, 1,[Define this symbol if you have MSG_DONTWAIT]) ], + [ AC_MSG_RESULT(no)] +) + +dnl Check for malloc_info (for memory statistics information in getmemoryinfo) +AC_MSG_CHECKING(for getmemoryinfo) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[ int f = malloc_info(0, NULL); ]])], + [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_MALLOC_INFO, 1,[Define this symbol if you have malloc_info]) ], + [ AC_MSG_RESULT(no)] +) + +dnl Check for mallopt(M_ARENA_MAX) (to set glibc arenas) +AC_MSG_CHECKING(for mallopt M_ARENA_MAX) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[ mallopt(M_ARENA_MAX, 1); ]])], + [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_MALLOPT_ARENA_MAX, 1,[Define this symbol if you have mallopt with M_ARENA_MAX]) ], + [ AC_MSG_RESULT(no)] +) AC_MSG_CHECKING([for visibility attribute]) AC_LINK_IFELSE([AC_LANG_SOURCE([ @@ -505,22 +586,37 @@ AC_LINK_IFELSE([AC_LANG_SOURCE([ [ AC_MSG_RESULT(no) if test x$use_reduce_exports = xyes; then - AC_MSG_ERROR([Cannot find a working visibility attribute. Use --disable-reduced-exports.]) + AC_MSG_ERROR([Cannot find a working visibility attribute. Use --disable-reduce-exports.]) fi - AC_MSG_WARN([Cannot find a working visibility attribute. Disabling reduced exports.]) - use_reduce_exports=no ] ) -if test x$use_reduce_exports != xno; then - AX_CHECK_COMPILE_FLAG([-fvisibility=hidden],[RE_CXXFLAGS="-fvisibility=hidden"], +TEMP_LDFLAGS="$LDFLAGS" +LDFLAGS="$TEMP_LDFLAGS $PTHREAD_CFLAGS" +AC_MSG_CHECKING([for thread_local support]) +AC_LINK_IFELSE([AC_LANG_SOURCE([ + #include + static thread_local int foo = 0; + static void run_thread() { foo++;} + int main(){ + for(int i = 0; i < 10; i++) { std::thread(run_thread).detach();} + return foo; + } + ])], [ - if test x$use_reduce_exports = xyes; then - AC_MSG_ERROR([Cannot set default symbol visibility. Use --disable-reduced-exports.]) - fi - AC_MSG_WARN([Cannot set default symbol visibility. Disabling reduced exports.]) - use_reduce_exports=no - ]) + AC_DEFINE(HAVE_THREAD_LOCAL,1,[Define if thread_local is supported.]) + AC_MSG_RESULT(yes) + ], + [ + AC_MSG_RESULT(no) + ] +) +LDFLAGS="$TEMP_LDFLAGS" + +# Check for reduced exports +if test x$use_reduce_exports = xyes; then + AX_CHECK_COMPILE_FLAG([-fvisibility=hidden],[RE_CXXFLAGS="-fvisibility=hidden"], + [AC_MSG_ERROR([Cannot set default symbol visibility. Use --disable-reduce-exports.])]) fi LEVELDB_CPPFLAGS= @@ -556,30 +652,25 @@ else use_boost=yes fi -if test x$bitcoin_enable_qt = xyes; then -dnl enable tradingdialog - AC_MSG_CHECKING([if the trading dialog should be enabled]) - if test x$bitcoin_qt_got_major_vers = x5; then - AC_MSG_RESULT(yes) - AC_DEFINE_UNQUOTED([HAVE_QT5],[1],[Define to 1 to enable trading dialog]) - - else - AC_MSG_RESULT(no) - fi -fi - if test x$use_boost = xyes; then +dnl Minimum required Boost version +define(MINIMUM_REQUIRED_BOOST, 1.47.0) + dnl Check for boost libs -AX_BOOST_BASE +AX_BOOST_BASE([MINIMUM_REQUIRED_BOOST]) AX_BOOST_SYSTEM AX_BOOST_FILESYSTEM AX_BOOST_PROGRAM_OPTIONS AX_BOOST_THREAD AX_BOOST_CHRONO +dnl Boost 1.56 through 1.62 allow using std::atomic instead of its own atomic +dnl counter implementations. In 1.63 and later the std::atomic approach is default. +m4_pattern_allow(DBOOST_AC_USE_STD_ATOMIC) dnl otherwise it's treated like a macro +BOOST_CPPFLAGS="-DBOOST_SP_USE_STD_ATOMIC -DBOOST_AC_USE_STD_ATOMIC $BOOST_CPPFLAGS" -if test x$use_reduce_exports != xno; then +if test x$use_reduce_exports = xyes; then AC_MSG_CHECKING([for working boost reduced exports]) TEMP_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$BOOST_CPPFLAGS $CPPFLAGS" @@ -593,25 +684,14 @@ if test x$use_reduce_exports != xno; then #endif ]])],[ AC_MSG_RESULT(yes) - ],[: - if test x$use_reduce_exports = xauto; then - use_reduce_exports=no - else - if test x$use_reduce_exports = xyes; then - AC_MSG_ERROR([boost versions < 1.49 are known to be broken with reduced exports. Use --disable-reduced-exports.]) - fi - fi - AC_MSG_RESULT(no) - AC_MSG_WARN([boost versions < 1.49 are known to have symbol visibility issues. Disabling reduced exports.]) + ],[ + AC_MSG_ERROR([boost versions < 1.49 are known to be broken with reduced exports. Use --disable-reduce-exports.]) ]) CPPFLAGS="$TEMP_CPPFLAGS" fi - -elif test x$use_reduce_exports = xauto; then - use_reduce_exports=yes fi -if test x$use_reduce_exports != xno; then +if test x$use_reduce_exports = xyes; then CXXFLAGS="$CXXFLAGS $RE_CXXFLAGS" AX_CHECK_LINK_FLAG([[-Wl,--exclude-libs,ALL]], [RELDFLAGS="-Wl,--exclude-libs,ALL"]) fi @@ -650,17 +730,51 @@ fi if test x$use_boost = xyes; then -BOOST_LIBS="$BOOST_LDFLAGS $BOOST_SYSTEM_LIB $BOOST_FILESYSTEM_LIB $BOOST_PROGRAM_OPTIONS_LIB $BOOST_THREAD_LIB" +BOOST_LIBS="$BOOST_LDFLAGS $BOOST_SYSTEM_LIB $BOOST_FILESYSTEM_LIB $BOOST_PROGRAM_OPTIONS_LIB $BOOST_THREAD_LIB $BOOST_CHRONO_LIB" + + +dnl If boost (prior to 1.57) was built without c++11, it emulated scoped enums +dnl using c++98 constructs. Unfortunately, this implementation detail leaked into +dnl the abi. This was fixed in 1.57. + +dnl When building against that installed version using c++11, the headers pick up +dnl on the native c++11 scoped enum support and enable it, however it will fail to +dnl link. This can be worked around by disabling c++11 scoped enums if linking will +dnl fail. +dnl BOOST_NO_SCOPED_ENUMS was changed to BOOST_NO_CXX11_SCOPED_ENUMS in 1.51. + +TEMP_LIBS="$LIBS" +LIBS="$BOOST_LIBS $LIBS" +TEMP_CPPFLAGS="$CPPFLAGS" +CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" +AC_MSG_CHECKING([for mismatched boost c++11 scoped enums]) +AC_LINK_IFELSE([AC_LANG_PROGRAM([[ + #include + #include + #if !defined(BOOST_NO_SCOPED_ENUMS) && !defined(BOOST_NO_CXX11_SCOPED_ENUMS) && BOOST_VERSION < 105700 + #define BOOST_NO_SCOPED_ENUMS + #define BOOST_NO_CXX11_SCOPED_ENUMS + #define CHECK + #endif + #include + ]],[[ + #if defined(CHECK) + boost::filesystem::copy_file("foo", "bar"); + #else + choke; + #endif + ]])], + [AC_MSG_RESULT(mismatched); BOOST_CPPFLAGS="$BOOST_CPPFLAGS -DBOOST_NO_SCOPED_ENUMS -DBOOST_NO_CXX11_SCOPED_ENUMS"], [AC_MSG_RESULT(ok)]) +LIBS="$TEMP_LIBS" +CPPFLAGS="$TEMP_CPPFLAGS" dnl Boost >= 1.50 uses sleep_for rather than the now-deprecated sleep, however dnl it was broken from 1.50 to 1.52 when backed by nanosleep. Use sleep_for if dnl a working version is available, else fall back to sleep. sleep was removed dnl after 1.56. dnl If neither is available, abort. -dnl If sleep_for is used, boost_chrono becomes a requirement. -if test x$ax_cv_boost_chrono = xyes; then TEMP_LIBS="$LIBS" -LIBS="$BOOST_LIBS $BOOST_CHRONO_LIB $LIBS" +LIBS="$BOOST_LIBS $LIBS" TEMP_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" AC_LINK_IFELSE([AC_LANG_PROGRAM([[ @@ -673,12 +787,11 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([[ choke me #endif ]])], - [boost_sleep=yes; BOOST_LIBS="$BOOST_LIBS $BOOST_CHRONO_LIB"; + [boost_sleep=yes; AC_DEFINE(HAVE_WORKING_BOOST_SLEEP_FOR, 1, [Define this symbol if boost sleep_for works])], [boost_sleep=no]) LIBS="$TEMP_LIBS" CPPFLAGS="$TEMP_CPPFLAGS" -fi if test x$boost_sleep != xyes; then TEMP_LIBS="$LIBS" @@ -709,12 +822,7 @@ fi fi if test x$use_pkgconfig = xyes; then - - if test x"$PKG_CONFIG" = "x"; then - AC_MSG_ERROR(pkg-config not found.) - fi - - : #NOP + : dnl m4_ifdef( [PKG_CHECK_MODULES], [ @@ -724,6 +832,12 @@ if test x$use_pkgconfig = xyes; then if test x$use_qr != xno; then BITCOIN_QT_CHECK([PKG_CHECK_MODULES([QR], [libqrencode], [have_qrencode=yes], [have_qrencode=no])]) fi + if test x$build_bitcoin_utils$build_bitcoind$bitcoin_enable_qt$use_tests != xnononono; then + PKG_CHECK_MODULES([EVENT], [libevent],, [AC_MSG_ERROR(libevent not found.)]) + if test x$TARGET_OS != xwindows; then + PKG_CHECK_MODULES([EVENT_PTHREADS], [libevent_pthreads],, [AC_MSG_ERROR(libevent_pthreads not found.)]) + fi + fi if test "x$use_zmq" = "xyes"; then PKG_CHECK_MODULES([ZMQ],[libzmq >= 4], @@ -734,7 +848,6 @@ if test x$use_pkgconfig = xyes; then else AC_DEFINE_UNQUOTED([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions]) fi - ] ) else @@ -744,20 +857,37 @@ else AC_CHECK_HEADER([openssl/ssl.h],, AC_MSG_ERROR(libssl headers missing),) AC_CHECK_LIB([ssl], [main],SSL_LIBS=-lssl, AC_MSG_ERROR(libssl missing)) + if test x$build_bitcoin_utils$build_bitcoind$bitcoin_enable_qt$use_tests != xnononono; then + AC_CHECK_HEADER([event2/event.h],, AC_MSG_ERROR(libevent headers missing),) + AC_CHECK_LIB([event],[main],EVENT_LIBS=-levent,AC_MSG_ERROR(libevent missing)) + if test x$TARGET_OS != xwindows; then + AC_CHECK_LIB([event_pthreads],[main],EVENT_PTHREADS_LIBS=-levent_pthreads,AC_MSG_ERROR(libevent_pthreads missing)) + fi + fi + if test "x$use_zmq" = "xyes"; then - AC_CHECK_HEADER([zmq.h], - [AC_DEFINE([ENABLE_ZMQ],[1],[Define to 1 to enable ZMQ functions])], - [AC_MSG_WARN([zmq.h not found, disabling zmq support]) - use_zmq=no - AC_DEFINE([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions])]) - AC_CHECK_LIB([zmq],[zmq_ctx_shutdown],ZMQ_LIBS=-lzmq, - [AC_MSG_WARN([libzmq >= 4.0 not found, disabling zmq support]) - use_zmq=no - AC_DEFINE([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions])]) + AC_CHECK_HEADER([zmq.h], + [AC_DEFINE([ENABLE_ZMQ],[1],[Define to 1 to enable ZMQ functions])], + [AC_MSG_WARN([zmq.h not found, disabling zmq support]) + use_zmq=no + AC_DEFINE([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions])]) + AC_CHECK_LIB([zmq],[zmq_ctx_shutdown],ZMQ_LIBS=-lzmq, + [AC_MSG_WARN([libzmq >= 4.0 not found, disabling zmq support]) + use_zmq=no + AC_DEFINE([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions])]) else AC_DEFINE_UNQUOTED([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions]) fi + if test "x$use_zmq" = "xyes"; then + dnl Assume libzmq was built for static linking + case $host in + *mingw*) + ZMQ_CFLAGS="$ZMQ_CFLAGS -DZMQ_STATIC" + ;; + esac + fi + BITCOIN_QT_CHECK(AC_CHECK_LIB([protobuf] ,[main],[PROTOBUF_LIBS=-lprotobuf], BITCOIN_QT_FAIL(libprotobuf not found))) if test x$use_qr != xno; then BITCOIN_QT_CHECK([AC_CHECK_LIB([qrencode], [main],[QR_LIBS=-lqrencode], [have_qrencode=no])]) @@ -766,13 +896,51 @@ else fi AC_CHECK_LIB([crypto],[RAND_egd],[],[ - AC_ARG_WITH([libressl], - [AS_HELP_STRING([--with-libressl],[Build with system LibreSSL (default is no; DANGEROUS; NOT SUPPORTED)])], - [AC_MSG_WARN([Detected LibreSSL: This is NOT supported, and may break consensus compatibility!])], - [AC_MSG_ERROR([Detected LibreSSL: This is NOT supported, and may break consensus compatibility!])] + AC_ARG_WITH([unsupported-ssl], + [AS_HELP_STRING([--with-unsupported-ssl],[Build with system SSL (default is no; DANGEROUS; NOT SUPPORTED; You should use OpenSSL 1.0)])], + [AC_MSG_WARN([Detected unsupported SSL version: This is NOT supported, and may break consensus compatibility!])], + [AC_MSG_ERROR([Detected unsupported SSL version: This is NOT supported, and may break consensus compatibility!])] ) ]) +dnl univalue check + +if test x$system_univalue != xno ; then + found_univalue=no + if test x$use_pkgconfig = xyes; then + : #NOP + m4_ifdef( + [PKG_CHECK_MODULES], + [ + PKG_CHECK_MODULES([UNIVALUE],[libunivalue],[found_univalue=yes],[true]) + ] + ) + else + AC_CHECK_HEADER([univalue.h],[ + AC_CHECK_LIB([univalue], [main],[ + UNIVALUE_LIBS=-lunivalue + found_univalue=yes + ],[true]) + ],[true]) + fi + + if test x$found_univalue = xyes ; then + system_univalue=yes + elif test x$system_univalue = xyes ; then + AC_MSG_ERROR([univalue not found]) + else + system_univalue=no + fi +fi + +if test x$system_univalue = xno ; then + UNIVALUE_CFLAGS='-I$(srcdir)/univalue/include' + UNIVALUE_LIBS='univalue/libunivalue.la' +fi +AM_CONDITIONAL([EMBEDDED_UNIVALUE],[test x$system_univalue = xno]) +AC_SUBST(UNIVALUE_CFLAGS) +AC_SUBST(UNIVALUE_LIBS) + CFLAGS_TEMP="$CFLAGS" LIBS_TEMP="$LIBS" CFLAGS="$CFLAGS $SSL_CFLAGS $CRYPTO_CFLAGS" @@ -783,11 +951,11 @@ LIBS="$LIBS_TEMP" BITCOIN_QT_PATH_PROGS([PROTOC], [protoc],$protoc_bin_path) -AC_MSG_CHECKING([whether to build ohmcd]) +AC_MSG_CHECKING([whether to build ohmcoind]) AM_CONDITIONAL([BUILD_BITCOIND], [test x$build_bitcoind = xyes]) AC_MSG_RESULT($build_bitcoind) -AC_MSG_CHECKING([whether to build utils (ohmc-cli ohmc-tx)]) +AC_MSG_CHECKING([whether to build utils (ohmcoin-cli ohmcoin-tx)]) AM_CONDITIONAL([BUILD_BITCOIN_UTILS], [test x$build_bitcoin_utils = xyes]) AC_MSG_RESULT($build_bitcoin_utils) @@ -887,7 +1055,7 @@ if test x$bitcoin_enable_qt != xno; then AC_MSG_WARN("xgettext is required to update qt translations") fi - AC_MSG_CHECKING([whether to build test_ohmc-qt]) + AC_MSG_CHECKING([whether to build test_ohmcoin-qt]) if test x$use_tests$bitcoin_enable_qt_test = xyesyes; then AC_MSG_RESULT([yes]) BUILD_TEST_QT="test" @@ -898,7 +1066,7 @@ fi AM_CONDITIONAL([ENABLE_ZMQ], [test "x$use_zmq" = "xyes"]) -AC_MSG_CHECKING([whether to build test_ohmc]) +AC_MSG_CHECKING([whether to build test_ohmcoin]) if test x$use_tests = xyes; then AC_MSG_RESULT([yes]) BUILD_TEST="test" @@ -907,7 +1075,7 @@ else fi AC_MSG_CHECKING([whether to reduce exports]) -if test x$use_reduce_exports != xno; then +if test x$use_reduce_exports = xyes; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) @@ -927,9 +1095,8 @@ AM_CONDITIONAL([HAVE_QT5], [test x$bitcoin_qt_got_major_vers = x5]) AM_CONDITIONAL([ENABLE_QT_TESTS],[test x$use_tests$bitcoin_enable_qt_test = xyesyes]) AM_CONDITIONAL([USE_QRCODE], [test x$use_qr = xyes]) AM_CONDITIONAL([USE_LCOV],[test x$use_lcov = xyes]) -AM_CONDITIONAL([USE_COMPARISON_TOOL],[test x$use_comparison_tool != xno]) -AM_CONDITIONAL([USE_COMPARISON_TOOL_REORG_TESTS],[test x$use_comparison_tool_reorg_test != xno]) AM_CONDITIONAL([GLIBC_BACK_COMPAT],[test x$use_glibc_compat = xyes]) +AM_CONDITIONAL([HARDEN],[test x$use_hardening = xyes]) AM_CONDITIONAL([USE_LIBSECP256K1],[test x$use_libsecp256k1 = xyes]) AC_DEFINE(CLIENT_VERSION_MAJOR, _CLIENT_VERSION_MAJOR, [Major version]) @@ -944,8 +1111,18 @@ AC_SUBST(CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION) AC_SUBST(CLIENT_VERSION_BUILD, _CLIENT_VERSION_BUILD) AC_SUBST(CLIENT_VERSION_IS_RELEASE, _CLIENT_VERSION_IS_RELEASE) AC_SUBST(COPYRIGHT_YEAR, _COPYRIGHT_YEAR) +AC_SUBST(BITCOIN_DAEMON_NAME) +AC_SUBST(BITCOIN_GUI_NAME) +AC_SUBST(BITCOIN_CLI_NAME) +AC_SUBST(BITCOIN_TX_NAME) AC_SUBST(RELDFLAGS) +AC_SUBST(ERROR_CXXFLAGS) +AC_SUBST(HARDENED_CXXFLAGS) +AC_SUBST(HARDENED_CPPFLAGS) +AC_SUBST(HARDENED_LDFLAGS) +AC_SUBST(PIC_FLAGS) +AC_SUBST(PIE_FLAGS) AC_SUBST(LIBTOOL_APP_LDFLAGS) AC_SUBST(USE_UPNP) AC_SUBST(USE_QRCODE) @@ -957,10 +1134,18 @@ AC_SUBST(BUILD_QT) AC_SUBST(BUILD_TEST_QT) AC_SUBST(MINIUPNPC_CPPFLAGS) AC_SUBST(MINIUPNPC_LIBS) +AC_SUBST(CRYPTO_LIBS) +AC_SUBST(SSL_LIBS) +AC_SUBST(EVENT_LIBS) +AC_SUBST(EVENT_PTHREADS_LIBS) +AC_SUBST(ZMQ_LIBS) +AC_SUBST(PROTOBUF_LIBS) +AC_SUBST(QR_LIBS) AC_CONFIG_FILES([Makefile src/Makefile share/setup.nsi share/qt/Info.plist src/test/buildenv.py]) AC_CONFIG_FILES([qa/pull-tester/run-bitcoind-for-test.sh],[chmod +x qa/pull-tester/run-bitcoind-for-test.sh]) AC_CONFIG_FILES([qa/pull-tester/tests-config.sh],[chmod +x qa/pull-tester/tests-config.sh]) AC_CONFIG_FILES([contrib/devtools/split-debug.sh],[chmod +x contrib/devtools/split-debug.sh]) +AC_CONFIG_FILES([doc/Doxyfile]) dnl boost's m4 checks do something really nasty: they export these vars. As a dnl result, they leak into secp256k1's configure and crazy things happen. @@ -985,6 +1170,10 @@ PKGCONFIG_LIBDIR_TEMP="$PKG_CONFIG_LIBDIR" unset PKG_CONFIG_LIBDIR PKG_CONFIG_LIBDIR="$PKGCONFIG_LIBDIR_TEMP" +if test x$system_univalue = xno; then + AC_CONFIG_SUBDIRS([src/univalue]) +fi + ac_configure_args="${ac_configure_args} --disable-shared --with-pic" AC_CONFIG_SUBDIRS([src/secp256k1]) @@ -1000,3 +1189,38 @@ case $host in chmod 755 libtool ;; esac + +dnl Replace the BUILDDIR path with the correct Windows path if compiling on Native Windows +case ${OS} in + *Windows*) + sed 's/BUILDDIR="\/\([[a-z]]\)/BUILDDIR="\1:/' test/config.ini > test/config-2.ini + mv test/config-2.ini test/config.ini + ;; +esac + +echo +echo "Options used to compile and link:" +echo " with wallet = $enable_wallet" +echo " with gui / qt = $bitcoin_enable_qt" +if test x$bitcoin_enable_qt != xno; then + echo " qt version = $bitcoin_qt_got_major_vers" + echo " with qr = $use_qr" +fi +echo " with zmq = $use_zmq" +echo " with test = $use_tests" +dnl echo " with bench = $use_bench" +echo " with upnp = $use_upnp" +echo " debug enabled = $enable_debug" +echo " werror = $enable_werror" +echo +echo " target os = $TARGET_OS" +echo " build os = $BUILD_OS" +echo +echo " CC = $CC" +echo " CFLAGS = $CFLAGS" +echo " CPPFLAGS = $CPPFLAGS" +echo " CXX = $CXX" +echo " CXXFLAGS = $CXXFLAGS" +echo " LDFLAGS = $LDFLAGS" +echo " ARFLAGS = $ARFLAGS" +echo diff --git a/contrib/bitrpc/bitrpc.py b/contrib/bitrpc/bitrpc.py index 7abd4e6..5a8f0d2 100755 --- a/contrib/bitrpc/bitrpc.py +++ b/contrib/bitrpc/bitrpc.py @@ -11,9 +11,9 @@ if rpcpass == "": - access = ServiceProxy("http://127.0.0.1:52021") + access = ServiceProxy("http://127.0.0.1:11772") else: - access = ServiceProxy("http://"+rpcuser+":"+rpcpass+"@127.0.0.1:52021") + access = ServiceProxy("http://"+rpcuser+":"+rpcpass+"@127.0.0.1:11772") cmd = sys.argv[1].lower() if cmd == "backupwallet": diff --git a/contrib/debian/README.md b/contrib/debian/README.md index e263a73..810acdd 100755 --- a/contrib/debian/README.md +++ b/contrib/debian/README.md @@ -1,21 +1,21 @@ Debian ==================== -This directory contains files used to package ohmcd/ohmc-qt -for Debian-based Linux systems. If you compile ohmcd/ohmc-qt yourself, there are some useful files here. +This directory contains files used to package ohmcoind/ohmcoin-qt +for Debian-based Linux systems. If you compile ohmcoind/ohmcoin-qt yourself, there are some useful files here. -## ohmc: URI support ## +## ohmcoin: URI support ## -ohmc-qt.desktop (Gnome / Open Desktop) +ohmcoin-qt.desktop (Gnome / Open Desktop) To install: - sudo desktop-file-install ohmc-qt.desktop + sudo desktop-file-install ohmcoin-qt.desktop sudo update-desktop-database If you build yourself, you will either need to modify the paths in -the .desktop file or copy or symlink your ohmcqt binary to `/usr/bin` -and the `../../share/pixmaps/ohmc128.png` to `/usr/share/pixmaps` +the .desktop file or copy or symlink your ohmcoinqt binary to `/usr/bin` +and the `../../share/pixmaps/ohmcoin128.png` to `/usr/share/pixmaps` -ohmc-qt.protocol (KDE) +ohmcoin-qt.protocol (KDE) diff --git a/contrib/debian/changelog b/contrib/debian/changelog index bda5a7a..66790ae 100755 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -365,8 +365,8 @@ bitcoin (0.3.19~dfsg-5) unstable; urgency=low bitcoin (0.3.19~dfsg-4) unstable; urgency=low [ Micah Anderson ] - * Provide example pivx.conf. - * Add bitcoind(1) and pivx.conf(5) man pages. + * Provide example ohmcoin.conf. + * Add bitcoind(1) and ohmcoin.conf(5) man pages. [ Jonas Smedegaard ] * Ease backporting: diff --git a/contrib/debian/control b/contrib/debian/control index effb60b..d4a1159 100755 --- a/contrib/debian/control +++ b/contrib/debian/control @@ -1,8 +1,8 @@ Source: ohmcoin Section: utils Priority: optional -Maintainer: Jonas Smedegaard ***TODO*** -Uploaders: Micah Anderson ***TODO*** +Maintainer: Julian Meyer +Uploaders: Julian Meyer Build-Depends: debhelper, devscripts, automake, @@ -17,20 +17,20 @@ Build-Depends: debhelper, libboost-program-options-dev (>> 1.35) | libboost-program-options1.35-dev, libboost-thread-dev (>> 1.35) | libboost-thread1.35-dev, libboost-test-dev (>> 1.35) | libboost-test1.35-dev, - qt5-qmake, - libqt5-dev, + qt4-qmake, + libqt4-dev, libqrencode-dev, libprotobuf-dev, protobuf-compiler Standards-Version: 3.9.2 Homepage: http://www.ohmcoin.org -Vcs-Git: git://github.com/theohmproject/ohmcoin.git -Vcs-Browser: http://github.com/theohmproject/ohmcoin +Vcs-Git: git://github.com/theohmproject/Ohmcoin.git +Vcs-Browser: http://github.com/theohmproject/Ohmcoin -Package: ohmcd +Package: ohmcoind Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: peer-to-peer network based digital currency - daemon - Pivx is a free open source peer-to-peer electronic cash system that + Ohmcoin is a free open source peer-to-peer electronic cash system that is completely decentralized, without the need for a central server or trusted parties. Users hold the crypto keys to their own money and transact directly with each other, with the help of a P2P network to @@ -39,14 +39,14 @@ Description: peer-to-peer network based digital currency - daemon Full transaction history is stored locally at each client. This requires 1+ GB of space, slowly growing. . - This package provides the daemon, pivxd, and the CLI tool - pivx-cli to interact with the daemon. + This package provides the daemon, ohmcoind, and the CLI tool + ohmcoin-cli to interact with the daemon. -Package: OHMC-Qt +Package: ohmcoin-qt Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: peer-to-peer network based digital currency - Qt GUI - Pivx is a free open source peer-to-peer electronic cash system that + Ohmcoin is a free open source peer-to-peer electronic cash system that is completely decentralized, without the need for a central server or trusted parties. Users hold the crypto keys to their own money and transact directly with each other, with the help of a P2P network to @@ -55,4 +55,4 @@ Description: peer-to-peer network based digital currency - Qt GUI Full transaction history is stored locally at each client. This requires 1+ GB of space, slowly growing. . - This package provides OHMC-Qt, a GUI for Pivx based on Qt. + This package provides Ohmcoin-Qt, a GUI for Ohmcoin based on Qt. diff --git a/contrib/debian/examples/ohmc.conf b/contrib/debian/examples/phore.conf old mode 100755 new mode 100644 similarity index 85% rename from contrib/debian/examples/ohmc.conf rename to contrib/debian/examples/phore.conf index e4351e1..93039fd --- a/contrib/debian/examples/ohmc.conf +++ b/contrib/debian/examples/phore.conf @@ -1,10 +1,10 @@ ## -## ohmc.conf configuration file. Lines beginning with # are comments. +## ohmcoin.conf configuration file. Lines beginning with # are comments. ## - + # Network-related settings: -# Run on the test network instead of the real ohmc network. +# Run on the test network instead of the real ohmcoin network. #testnet=0 # Run a regression test network @@ -51,17 +51,17 @@ #maxconnections= # -# JSON-RPC options (for controlling a running Ohm/ohmcd process) +# JSON-RPC options (for controlling a running Ohmcoin/ohmcoind process) # -# server=1 tells Ohm-QT and ohmcd to accept JSON-RPC commands +# server=1 tells Ohmcoin-QT and ohmcoind to accept JSON-RPC commands #server=0 # You must set rpcuser and rpcpassword to secure the JSON-RPC api #rpcuser=Ulysseys #rpcpassword=YourSuperGreatPasswordNumber_DO_NOT_USE_THIS_OR_YOU_WILL_GET_ROBBED_385593 -# How many seconds ohmc will wait for a complete RPC HTTP request. +# How many seconds ohmcoin will wait for a complete RPC HTTP request. # after the HTTP connection is established. #rpctimeout=30 @@ -72,21 +72,21 @@ # NOTE: opening up the RPC port to hosts outside your local trusted network is NOT RECOMMENDED, # because the rpcpassword is transmitted over the network unencrypted. -# server=1 tells Ohm-QT to accept JSON-RPC commands. -# it is also read by ohmcd to determine if RPC should be enabled +# server=1 tells Ohmcoin-Qt to accept JSON-RPC commands. +# it is also read by ohmcoind to determine if RPC should be enabled #rpcallowip=10.1.1.34/255.255.255.0 #rpcallowip=1.2.3.4/24 #rpcallowip=2001:db8:85a3:0:0:8a2e:370:7334/96 # Listen for RPC connections on this TCP port: -#rpcport=52021 +#rpcport=11772 -# You can use Ohm or ohmcd to send commands to Ohm/ohmcd +# You can use Ohmcoin or ohmcoind to send commands to Ohmcoin/ohmcoind # running on another host using this option: #rpcconnect=127.0.0.1 # Use Secure Sockets Layer (also known as TLS or HTTPS) to communicate -# with Ohm -server or ohmcd +# with Ohmcoin -server or ohmcoind #rpcssl=1 # OpenSSL settings used when rpcssl=1 @@ -108,7 +108,7 @@ # User interface options -# Start Ohm minimized +# Start Ohmcoin minimized #min=1 # Minimize to the system tray diff --git a/contrib/debian/manpages/ohmc-qt.1 b/contrib/debian/manpages/phore-qt.1 old mode 100755 new mode 100644 similarity index 84% rename from contrib/debian/manpages/ohmc-qt.1 rename to contrib/debian/manpages/phore-qt.1 index a6c3131..882fdf6 --- a/contrib/debian/manpages/ohmc-qt.1 +++ b/contrib/debian/manpages/phore-qt.1 @@ -1,20 +1,20 @@ -.TH OHMC-QT "1" "February 2017" "ohmc-qt 1" +.TH OHMC-QT "1" "February 2017" "ohmcoin-qt 1" .SH NAME -ohmc-qt \- peer-to-peer network based digital currency +ohmcoin-qt \- peer-to-peer network based digital currency .SH DESCRIPTION .SS "Usage:" .IP -ohmc\-qt [command\-line options] +ohmcoin\-qt [command\-line options] .SH OPTIONS .TP \-? This help message .TP \fB\-conf=\fR -Specify configuration file (default: ohmc.conf) +Specify configuration file (default: ohmcoin.conf) .TP \fB\-pid=\fR -Specify pid file (default: ohmcd.pid) +Specify pid file (default: ohmcoind.pid) .TP \fB\-gen\fR Generate coins @@ -41,7 +41,7 @@ Use proxy to reach tor hidden services (default: same as \fB\-proxy\fR) Allow DNS lookups for \fB\-addnode\fR, \fB\-seednode\fR and \fB\-connect\fR .TP \fB\-port=\fR -Listen for connections on (default: 52020 or testnet: 51474) +Listen for connections on (default: 52020 or testnet: 11773) .TP \fB\-maxconnections=\fR Maintain at most connections to peers (default: 125) @@ -122,17 +122,24 @@ Username for JSON\-RPC connections Password for JSON\-RPC connections .TP \fB\-rpcport=\fR -Listen for JSON\-RPC connections on (default: 52021 or testnet: 51475) +Listen for JSON\-RPC connections on (default: 11772 or testnet: 11774) .TP \fB\-rpcallowip=\fR Allow JSON\-RPC connections from specified IP address .TP +\fB\-rpcserialversion=\fR +Sets the serialization of raw transaction or block hex returned in +non\-verbose mode, non\-segwit(0) or segwit(1) (default: 1) +.TP \fB\-rpcthreads=\fR Set the number of threads to service RPC calls (default: 4) .TP \fB\-blocknotify=\fR Execute command when the best block changes (%s in cmd is replaced by block hash) .TP +\fB\-mempoolnotify=\fR +Execute command when a new transaction is accepted to the mempool (%s in cmd is replaced by transaction hash) +.TP \fB\-walletnotify=\fR Execute command when a wallet transaction changes (%s in cmd is replaced by TxID) .TP @@ -174,23 +181,13 @@ Set the number of script verification threads (1\-16, 0=auto, default: 0) Set minimum block size in bytes (default: 0) .TP \fB\-blockmaxsize=\fR -Set maximum block size in bytes (default: 250000) +Set maximum block size in bytes (default: 750000) +.HP +\fB\-blockmaxcost=\fR +Set maximum block cost (default: 3000000) .HP \fB\-blockprioritysize=\fR Set maximum size of high\-priority/low\-fee transactions in bytes (default: 27000) .PP -SSL options: (see the Bitcoin Wiki for SSL setup instructions) -.TP -\fB\-rpcssl\fR -Use OpenSSL (https) for JSON\-RPC connections -.TP -\fB\-rpcsslcertificatechainfile=\fR -Server certificate file (default: server.cert) -.TP -\fB\-rpcsslprivatekeyfile=\fR -Server private key (default: server.pem) -.TP -\fB\-rpcsslciphers=\fR -Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH) .SS "UI options:" .TP \fB\-lang=\fR diff --git a/contrib/debian/manpages/ohmc.conf.5 b/contrib/debian/manpages/phore.conf.5 old mode 100755 new mode 100644 similarity index 79% rename from contrib/debian/manpages/ohmc.conf.5 rename to contrib/debian/manpages/phore.conf.5 index 135ceba..5e36689 --- a/contrib/debian/manpages/ohmc.conf.5 +++ b/contrib/debian/manpages/phore.conf.5 @@ -1,19 +1,19 @@ -.TH OHMC.CONF "5" "January 2011" "ohmc.conf 3.19" +.TH OHMC.CONF "5" "January 2011" "ohmcoin.conf 3.19" .SH NAME -ohmc.conf \- ohmc configuration file +ohmcoin.conf \- ohmcoin configuration file .SH SYNOPSIS All command-line options (except for '\-conf') may be specified in a configuration file, and all configuration file options may also be specified on the command line. Command-line options override values set in the configuration file. .TP The configuration file is a list of 'setting=value' pairs, one per line, with optional comments starting with the '#' character. .TP -The configuration file is not automatically created; you can create it using your favorite plain-text editor. By default, ohmcd(1) will look for a file named ohmc.conf(5) in the ohmc data directory, but both the data directory and the configuration file path may be changed using the '\-datadir' and '\-conf' command-line arguments. +The configuration file is not automatically created; you can create it using your favorite plain-text editor. By default, ohmcoind(1) will look for a file named ohmcoin.conf(5) in the ohmcoin data directory, but both the data directory and the configuration file path may be changed using the '\-datadir' and '\-conf' command-line arguments. .SH LOCATION -ohmc.conf should be located in $HOME/.ohmc +ohmcoin.conf should be located in $HOME/.ohmcoin .SH NETWORK-RELATED SETTINGS .TP .TP \fBtestnet=\fR[\fI'1'\fR|\fI'0'\fR] -Enable or disable run on the test network instead of the real *ohmc* network. +Enable or disable run on the test network instead of the real *ohmcoin* network. .TP \fBproxy=\fR\fI'127.0.0.1:9050'\fR Connect via a socks4 proxy. @@ -29,7 +29,7 @@ Maximum number of inbound+outbound connections. .SH JSON-RPC OPTIONS .TP \fBserver=\fR[\fI'1'\fR|\fI'0'\fR] -Tells *ohmc* to accept or not accept JSON-RPC commands. +Tells *ohmcoin* to accept or not accept JSON-RPC commands. .TP \fBrpcuser=\fR\fI'username'\fR You must set *rpcuser* to secure the JSON-RPC api. @@ -40,14 +40,14 @@ You must set *rpcpassword* to secure the JSON-RPC api. \fBrpcallowip=\fR\fI'192.168.1.*'\fR By default, only RPC connections from localhost are allowed. Specify as many *rpcallowip=* settings as you like to allow connections from other hosts (and you may use * as a wildcard character). .TP -\fBrpcport=\fR\fI'52021'\fR +\fBrpcport=\fR\fI'11772'\fR Listen for RPC connections on this TCP port. .TP \fBrpcconnect=\fR\fI'127.0.0.1'\fR -You can use *ohmc* or *ohmcd(1)* to send commands to *ohmc*/*ohmcd(1)* running on another host using this option. +You can use *ohmcoin* or *ohmcoind(1)* to send commands to *ohmcoin*/*ohmcoind(1)* running on another host using this option. .TP \fBrpcssl=\fR\fI'1'\fR -Use Secure Sockets Layer (also known as TLS or HTTPS) to communicate with *ohmc* '\-server' or *ohmcd(1)*. Example of OpenSSL settings used when *rpcssl*='1': +Use Secure Sockets Layer (also known as TLS or HTTPS) to communicate with *ohmcoin* '\-server' or *ohmcoind(1)*. Example of OpenSSL settings used when *rpcssl*='1': .TP \fB\-rpcsslciphers=\fR Acceptable ciphers (default: TLSv1+HIGH:\:!SSLv2:\:!aNULL:\:!eNULL:\:!AH:\:!3DES:\:@STRENGTH) @@ -76,14 +76,13 @@ Allow direct connections for the 'pay via IP address' feature. .SH USER INTERFACE OPTIONS .TP \fBmin=\fR[\fI'0'\fR|\fI'1'\fR] -Enable or disable start ohmcd minimized. +Enable or disable start ohmcoind minimized. .TP \fBminimizetotray=\fR[\fI'0'\fR|\fI'1'\fR] Enable or disable minimize to the system tray. .SH "SEE ALSO" -ohmcd(1) +ohmcoind(1) .SH AUTHOR This manual page was written by Micah Anderson for the Debian system (but may be used by others). Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 3 or any later version published by the Free Software Foundation. On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL. - diff --git a/contrib/debian/manpages/ohmcd.1 b/contrib/debian/manpages/phored.1 old mode 100755 new mode 100644 similarity index 68% rename from contrib/debian/manpages/ohmcd.1 rename to contrib/debian/manpages/phored.1 index 53d2d6d..56c3ce5 --- a/contrib/debian/manpages/ohmcd.1 +++ b/contrib/debian/manpages/phored.1 @@ -1,19 +1,19 @@ -.TH OHMCD "1" "February 2017" "ohmcd 2.1.4.1" +.TH OHMCD "1" "February 2017" "ohmcoind 2.1.4.1" .SH NAME -Ohm \- peer-to-peer network based digital currency +Ohmcoin \- peer-to-peer network based digital currency .SH SYNOPSIS -ohmcd [options] [params] +ohmcoind [options] [params] .TP -ohmcd [options] help \- Get help for a command +ohmcoind [options] help \- Get help for a command .SH DESCRIPTION -This manual page documents the ohmcd program. Ohm is a peer-to-peer digital currency. Peer-to-peer (P2P) means that there is no central authority to issue new money or keep track of transactions. Instead, these tasks are managed collectively by the nodes of the network. Advantages: +This manual page documents the ohmcoind program. Ohmcoin is a peer-to-peer digital currency. Peer-to-peer (P2P) means that there is no central authority to issue new money or keep track of transactions. Instead, these tasks are managed collectively by the nodes of the network. Advantages: -Ohm can be sent easily through the Internet, without having to trust middlemen. Transactions are designed to be irreversible. Be safe from instability caused by fractional reserve banking and central banks. The limited inflation of the Ohm system’s money supply is distributed evenly (by CPU power) throughout the network, not monopolized by banks. +Ohmcoin can be sent easily through the Internet, without having to trust middlemen. Transactions are designed to be irreversible. Be safe from instability caused by fractional reserve banking and central banks. The limited inflation of the Ohmcoin system’s money supply is distributed evenly (by CPU power) throughout the network, not monopolized by banks. .SH OPTIONS .TP \fB\-conf=\fR -Specify configuration file (default: ohmc.conf) +Specify configuration file (default: ohmcoin.conf) .TP \fB\-gen\fR Generate coins @@ -62,20 +62,6 @@ Allow JSON\-RPC connections from specified IP address .TP \fB\-rpcconnect=\fR Send commands to node running on -.PP -SSL options: (see the Bitcoin Wiki for SSL setup instructions) -.TP -\fB\-rpcssl\fR=\fI1\fR -Use OpenSSL (https) for JSON\-RPC connections -.TP -\fB\-rpcsslcertificatchainfile=\fR -Server certificate file (default: server.cert) -.TP -\fB\-rpcsslprivatekeyfile=\fR -Server private key (default: server.pem) -.TP -\fB\-rpcsslciphers=\fR -Acceptable ciphers (default: TLSv1+HIGH:\:!SSLv2:\:!aNULL:\:!eNULL:\:!AH:\:!3DES:\:@STRENGTH) .TP \-? This help message @@ -84,14 +70,14 @@ This help message \fBbackupwallet 'destination'\fR Safely copies *wallet.dat* to 'destination', which can be a directory or a path with filename. .TP -\fBgetaccount 'ohmcaddress'\fR +\fBgetaccount 'ohmcoinaddress'\fR Returns the account associated with the given address. .TP -\fBsetaccount 'ohmcaddress' ['account']\fR +\fBsetaccount 'ohmcoinaddress' ['account']\fR Sets the ['account'] associated with the given address. ['account'] may be omitted to remove an address from ['account']. .TP \fBgetaccountaddress 'account'\fR -Returns a new ohmc address for 'account'. +Returns a new ohmcoin address for 'account'. .TP \fBgetaddressesbyaccount 'account'\fR Returns the list of addresses associated with the given 'account'. @@ -124,13 +110,13 @@ Returns a recent hashes per second performance measurement while generating. Returns an object containing server information. .TP \fBgetnewaddress 'account'\fR -Returns a new ohmc address for receiving payments. If 'account' is specified (recommended), it is added to the address book so payments received with the address will be credited to 'account'. +Returns a new ohmcoin address for receiving payments. If 'account' is specified (recommended), it is added to the address book so payments received with the address will be credited to 'account'. .TP \fBgetreceivedbyaccount 'account' ['minconf=1']\fR Returns the total amount received by addresses associated with 'account' in transactions with at least ['minconf'] confirmations. .TP -\fBgetreceivedbyaddress 'ohmcaddress' ['minconf=1']\fR -Returns the total amount received by 'ohmcaddress' in transactions with at least ['minconf'] confirmations. +\fBgetreceivedbyaddress 'ohmcoinaddress' ['minconf=1']\fR +Returns the total amount received by 'ohmcoinaddress' in transactions with at least ['minconf'] confirmations. .TP \fBgettransaction 'txid'\fR Returns information about a specific transaction, given hexadecimal transaction ID. @@ -148,7 +134,7 @@ List commands, or get help for a command. .TP \fBlistaccounts ['minconf=1']\fR List accounts and their current balances. - *note: requires ohmc 1.0.2.1 or later. + *note: requires ohmcoin 1.0.2.1 or later. .TP \fBlistreceivedbyaccount ['minconf=1'] ['includeempty=false']\fR ['minconf'] is the minimum number of confirmations before payments are included. ['includeempty'] whether to include addresses that haven't received any payments. Returns an array of objects containing: @@ -177,33 +163,32 @@ Returns a list of the last ['count'] transactions for 'account' \- for all accou "message" : message associated with transaction (only for send). "to" : message-to associated with transaction (only for send). - *note: requires ohmc 1.0.2.1 or later. + *note: requires ohmcoin 1.0.2.1 or later. .TP \fBmove <'fromaccount'> <'toaccount'> <'amount'> ['minconf=1'] ['comment']\fR Moves funds between accounts. .TP -\fBsendfrom* <'account'> <'ohmcaddress'> <'amount'> ['minconf=1'] ['comment'] ['comment-to']\fR -Sends amount from account's balance to 'ohmcaddress'. This method will fail if there is less than amount OHMC with ['minconf'] confirmations in the account's balance (unless account is the empty-string-named default account; it behaves like the *sendtoaddress* method). Returns transaction ID on success. +\fBsendfrom* <'account'> <'ohmcoinaddress'> <'amount'> ['minconf=1'] ['comment'] ['comment-to']\fR +Sends amount from account's balance to 'ohmcoinaddress'. This method will fail if there is less than amount OHMC with ['minconf'] confirmations in the account's balance (unless account is the empty-string-named default account; it behaves like the *sendtoaddress* method). Returns transaction ID on success. .TP -\fBsendtoaddress 'ohmcaddress' 'amount' ['comment'] ['comment-to']\fR -Sends amount from the server's available balance to 'ohmcaddress'. amount is a real and is rounded to the nearest 0.01. Returns transaction id on success. +\fBsendtoaddress 'ohmcoinaddress' 'amount' ['comment'] ['comment-to']\fR +Sends amount from the server's available balance to 'ohmcoinaddress'. amount is a real and is rounded to the nearest 0.01. Returns transaction id on success. .TP \fBstop\fR -Stops the ohmc server. +Stops the ohmcoin server. .TP -\fBvalidateaddress 'ohmcaddress'\fR -Checks that 'ohmcaddress' looks like a proper Ohm address. Returns an object containing: +\fBvalidateaddress 'ohmcoinaddress'\fR +Checks that 'ohmcoinaddress' looks like a proper Ohmcoin address. Returns an object containing: "isvalid" : true or false. "ismine" : true if the address is in the server's wallet. - "address" : ohmcaddress. + "address" : ohmcoinaddress. *note: ismine and address are only returned if the address is valid. .SH "SEE ALSO" -ohmc.conf(5) +ohmcoin.conf(5) .SH AUTHOR This manual page was written by Micah Anderson for the Debian system (but may be used by others). Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 3 or any later version published by the Free Software Foundation. On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL. - diff --git a/contrib/debian/ohmcd.bash-completion b/contrib/debian/ohmcd.bash-completion deleted file mode 100755 index 8f9cd09..0000000 --- a/contrib/debian/ohmcd.bash-completion +++ /dev/null @@ -1 +0,0 @@ -contrib/ohmcd.bash-completion ohmcd diff --git a/contrib/debian/ohmcd.examples b/contrib/debian/ohmcd.examples deleted file mode 100755 index 1ef1482..0000000 --- a/contrib/debian/ohmcd.examples +++ /dev/null @@ -1 +0,0 @@ -debian/examples/ohmc.conf diff --git a/contrib/debian/ohmcd.install b/contrib/debian/ohmcd.install deleted file mode 100755 index 5e33667..0000000 --- a/contrib/debian/ohmcd.install +++ /dev/null @@ -1,2 +0,0 @@ -usr/local/bin/ohmcd usr/bin -usr/local/bin/ohmc-cli usr/bin diff --git a/contrib/debian/ohmcd.manpages b/contrib/debian/ohmcd.manpages deleted file mode 100755 index fe7a7c6..0000000 --- a/contrib/debian/ohmcd.manpages +++ /dev/null @@ -1,2 +0,0 @@ -debian/manpages/ohmcd.1 -debian/manpages/ohmc.conf.5 diff --git a/contrib/debian/ohmc-qt.desktop b/contrib/debian/phore-qt.desktop old mode 100755 new mode 100644 similarity index 79% rename from contrib/debian/ohmc-qt.desktop rename to contrib/debian/phore-qt.desktop index 092db71..abccefc --- a/contrib/debian/ohmc-qt.desktop +++ b/contrib/debian/phore-qt.desktop @@ -4,9 +4,9 @@ Name=Ohmcoin Comment=Ohmcoin P2P Cryptocurrency Comment[fr]=Ohmcoin, monnaie virtuelle cryptographique pair à pair Comment[tr]=Ohmcoin, eşten eşe kriptografik sanal para birimi -Exec=ohmc-qt %u +Exec=ohmcoin-qt %u Terminal=false Type=Application -Icon=ohmc128 -MimeType=x-scheme-handler/ohmc; +Icon=ohmcoin128 +MimeType=x-scheme-handler/ohmcoin; Categories=Office;Finance; diff --git a/contrib/debian/ohmc-qt.install b/contrib/debian/phore-qt.install old mode 100755 new mode 100644 similarity index 50% rename from contrib/debian/ohmc-qt.install rename to contrib/debian/phore-qt.install index 290d448..ef2eae0 --- a/contrib/debian/ohmc-qt.install +++ b/contrib/debian/phore-qt.install @@ -1,6 +1,6 @@ -usr/local/bin/ohmc-qt usr/bin +usr/local/bin/ohmcoin-qt usr/bin share/pixmaps/bitcoin32.xpm usr/share/pixmaps share/pixmaps/bitcoin16.xpm usr/share/pixmaps share/pixmaps/bitcoin128.png usr/share/pixmaps -debian/ohmc-qt.desktop usr/share/applications -debian/ohmc-qt.protocol usr/share/kde4/services/ +debian/ohmcoin-qt.desktop usr/share/applications +debian/ohmcoin-qt.protocol usr/share/kde4/services/ diff --git a/contrib/debian/ohmcd.lintian-overrides b/contrib/debian/phore-qt.lintian-overrides old mode 100755 new mode 100644 similarity index 53% rename from contrib/debian/ohmcd.lintian-overrides rename to contrib/debian/phore-qt.lintian-overrides index b8962af..483562a --- a/contrib/debian/ohmcd.lintian-overrides +++ b/contrib/debian/phore-qt.lintian-overrides @@ -1,2 +1,2 @@ # Linked code is Expat - only Debian packaging is GPL-2+ -ohmcd: possible-gpl-code-linked-with-openssl +ohmcoin-qt: possible-gpl-code-linked-with-openssl diff --git a/contrib/debian/ohmc-qt.protocol b/contrib/debian/phore-qt.protocol old mode 100755 new mode 100644 similarity index 74% rename from contrib/debian/ohmc-qt.protocol rename to contrib/debian/phore-qt.protocol index a47cf12..9fd4cb6 --- a/contrib/debian/ohmc-qt.protocol +++ b/contrib/debian/phore-qt.protocol @@ -1,6 +1,6 @@ [Protocol] -exec=ohmc-qt '%u' -protocol=ohmc +exec=ohmcoin-qt '%u' +protocol=ohmcoin input=none output=none helper=true diff --git a/contrib/debian/phored.bash-completion b/contrib/debian/phored.bash-completion new file mode 100644 index 0000000..3c7202f --- /dev/null +++ b/contrib/debian/phored.bash-completion @@ -0,0 +1 @@ +contrib/ohmcoind.bash-completion ohmcoind diff --git a/contrib/debian/phored.examples b/contrib/debian/phored.examples new file mode 100644 index 0000000..261c8b7 --- /dev/null +++ b/contrib/debian/phored.examples @@ -0,0 +1 @@ +debian/examples/ohmcoin.conf diff --git a/contrib/debian/phored.install b/contrib/debian/phored.install new file mode 100644 index 0000000..ff87daf --- /dev/null +++ b/contrib/debian/phored.install @@ -0,0 +1,2 @@ +usr/local/bin/ohmcoind usr/bin +usr/local/bin/ohmcoin-cli usr/bin diff --git a/contrib/debian/ohmc-qt.lintian-overrides b/contrib/debian/phored.lintian-overrides old mode 100755 new mode 100644 similarity index 54% rename from contrib/debian/ohmc-qt.lintian-overrides rename to contrib/debian/phored.lintian-overrides index e292169..abfa3d2 --- a/contrib/debian/ohmc-qt.lintian-overrides +++ b/contrib/debian/phored.lintian-overrides @@ -1,2 +1,2 @@ # Linked code is Expat - only Debian packaging is GPL-2+ -ohmc-qt: possible-gpl-code-linked-with-openssl +ohmcoind: possible-gpl-code-linked-with-openssl diff --git a/contrib/debian/phored.manpages b/contrib/debian/phored.manpages new file mode 100644 index 0000000..1a9ad91 --- /dev/null +++ b/contrib/debian/phored.manpages @@ -0,0 +1,2 @@ +debian/manpages/ohmcoind.1 +debian/manpages/ohmcoin.conf.5 diff --git a/contrib/debian/rules b/contrib/debian/rules index 4819fc3..25db606 100755 --- a/contrib/debian/rules +++ b/contrib/debian/rules @@ -1,9 +1,9 @@ #!/usr/bin/make -f # -*- mode: makefile; coding: utf-8 -*- -#DEB_MAKE_CHECK_TARGET = test_pivx +#DEB_MAKE_CHECK_TARGET = test_ohmcoin #build/bitcoind:: -# $(if $(filter nocheck,$(DEB_BUILD_OPTIONS)),,src/test_pivx) +# $(if $(filter nocheck,$(DEB_BUILD_OPTIONS)),,src/test_ohmcoin) DEB_INSTALL_EXAMPLES_bitcoind += debian/examples/* DEB_INSTALL_MANPAGES_bitcoind += debian/manpages/* @@ -13,7 +13,7 @@ DEB_INSTALL_MANPAGES_bitcoind += debian/manpages/* override_dh_auto_clean: if [ -f Makefile ]; then $(MAKE) distclean; fi - rm -rf Makefile.in aclocal.m4 configure src/Makefile.in src/pivx-config.h.in src/build-aux src/qt/Makefile.in src/qt/test/Makefile.in src/test/Makefile.in + rm -rf Makefile.in aclocal.m4 configure src/Makefile.in src/ohmcoin-config.h.in src/build-aux src/qt/Makefile.in src/qt/test/Makefile.in src/test/Makefile.in # Yea, autogen should be run on the source archive, but I like doing git archive override_dh_auto_configure: diff --git a/contrib/devtools/README.md b/contrib/devtools/README.md index 6327752..7577ea3 100755 --- a/contrib/devtools/README.md +++ b/contrib/devtools/README.md @@ -18,7 +18,7 @@ For example: ./github-merge.py 3077 (in any git repository) will help you merge pull request #3077 for the -OHMC-Project/OHMC repository. +Ohmcoin-Project/Ohmcoin repository. What it does: * Fetch master and the pull request. @@ -36,16 +36,16 @@ couldn't mess with the sources. Setup --------- -Configuring the github-merge tool for the OHMC repository is done in the following way: +Configuring the github-merge tool for the Ohmcoin repository is done in the following way: - git config githubmerge.repository OHMC-Project/OHMC + git config githubmerge.repository Ohmcoin-Project/Ohmcoin git config githubmerge.testcmd "make -j4 check" (adapt to whatever you want to use for testing) git config --global user.signingkey mykeyid (if you want to GPG sign) optimize-pngs.py ================ -A script to optimize png files in the OHMC +A script to optimize png files in the Ohmcoin repository (requires pngcrush). fix-copyright-headers.py @@ -61,6 +61,23 @@ For example a file changed in 2014 (with 2014 being the current year): would be changed to: ```// Copyright (c) 2009-2014 The Bitcoin developers``` +logprint-scanner.py +=================== +LogPrint and LogPrintf are known to throw exceptions when the number of arguments supplied to the +LogPrint(f) function is not the same as the number of format specifiers. + +Ideally, the presentation of this mismatch would be at compile-time, but instead it is at run-time. + +This script scans the src/ directory recursively and looks in each .cpp/.h file and identifies all +errorneous LogPrint(f) calls where the number of arguments do not match. + +The filename and line number of the errorneous occurence is given. + +The script returns with the number of erroneous occurences as an error code to help facilitate +integration with a continuous integration system. + +The script can be ran from any working directory inside the git repository. + symbol-check.py =============== @@ -76,10 +93,10 @@ If only supported symbols are used the return value will be 0 and the output wil If there are 'unsupported' symbols, the return value will be 1 a list like this will be printed: - .../64/test_ohmc: symbol memcpy from unsupported version GLIBC_2.14 - .../64/test_ohmc: symbol __fdelt_chk from unsupported version GLIBC_2.15 - .../64/test_ohmc: symbol std::out_of_range::~out_of_range() from unsupported version GLIBCXX_3.4.15 - .../64/test_ohmc: symbol _ZNSt8__detail15_List_nod from unsupported version GLIBCXX_3.4.15 + .../64/test_ohmcoin: symbol memcpy from unsupported version GLIBC_2.14 + .../64/test_ohmcoin: symbol __fdelt_chk from unsupported version GLIBC_2.15 + .../64/test_ohmcoin: symbol std::out_of_range::~out_of_range() from unsupported version GLIBCXX_3.4.15 + .../64/test_ohmcoin: symbol _ZNSt8__detail15_List_nod from unsupported version GLIBCXX_3.4.15 update-translations.py ====================== diff --git a/contrib/devtools/check-doc.py b/contrib/devtools/check-doc.py index 3a38dfa..a26b73c 100755 --- a/contrib/devtools/check-doc.py +++ b/contrib/devtools/check-doc.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python2 # Copyright (c) 2015-2016 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. @@ -20,7 +20,7 @@ REGEX_ARG = re.compile(r'(?:map(?:Multi)?Args(?:\.count\(|\[)|Get(?:Bool)?Arg\()\"(\-[^\"]+?)\"') REGEX_DOC = re.compile(r'HelpMessageOpt\(\"(\-[^\"=]+?)(?:=|\")') # list unsupported, deprecated and duplicate args as they need no documentation -SET_DOC_OPTIONAL = set(['-rpcssl', '-benchmark', '-h', '-help', '-socks', '-tor', '-debugnet', '-whitelistalwaysrelay', '-prematurewitness', '-walletprematurewitness', '-promiscuousmempoolflags', '-blockminsize', '-sendfreetransactions']) +SET_DOC_OPTIONAL = set(['-rpcssl', '-benchmark', '-h', '-help', '-socks', '-tor', '-debugnet', '-whitelistalwaysrelay', '-prematurewitness', '-walletprematurewitness', '-promiscuousmempoolflags', '-blockminsize', '-sendfreetransactions', '-checklevel', '-liquidityprovider', '-anonymizeohmcoinamount']) def main(): used = check_output(CMD_GREP_ARGS, shell=True) diff --git a/contrib/devtools/logprint-scanner.py b/contrib/devtools/logprint-scanner.py new file mode 100644 index 0000000..74c36e7 --- /dev/null +++ b/contrib/devtools/logprint-scanner.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python2 +import os, sys +from subprocess import check_output + +def countRelevantCommas(line): + openParensPosStack = [] + openParensPos = 0 + charCounter = 0 + numRelevantCommas = 0 + firstOpenParensIndex = line.find("(") + + for char in line: + if char == '(': + openParensPosStack.append(charCounter) + + if char == ')': + openParensPosStack.pop() + + if char == "," and openParensPosStack[-1] == firstOpenParensIndex: + numRelevantCommas += 1 + charCounter += 1 + + return numRelevantCommas + +if __name__ == "__main__": + out = check_output(["git", "rev-parse", "--show-toplevel"]) + srcDir = out.rstrip() + "/src/" + + filelist = [os.path.join(dp, f) for dp, dn, filenames in os.walk(srcDir) for f in filenames if os.path.splitext(f)[1] == '.cpp' or os.path.splitext(f)[1] == '.h' ] + incorrectInstanceCounter = 0 + + for file in filelist: + f = open(file,"r") + data = f.read() + rows = data.split("\n") + count = 0 + full_data = [] + lineCounter = 1 + + tempLine = "" + tempCount = 0 + + for row in rows: + # Collapse multiple lines into one + tempLine += row + + # Line contains LogPrint or LogPrintf + if tempLine.find("LogPrint") != -1: + if tempLine.count("(") == tempLine.count(")"): + havePercents = tempLine.count('%') > 0 + + if havePercents: + # This line of code has a format specifier that requires checking number of associated arguments + # Determine the number of arguments provided, see if that matches the number of format specifiers + # Count the number of commas after the format specifier string. Check to see if it matches the number of format specifiers. + # Assumes quotes are not escaped in the specifier string and there are no percent signs when specifying the debug level. + + # First, determine the position of the comma after the format specifier section, named commaAfterEndSpecifierStringIndex + firstSpecifierIndex = tempLine.find('%') + startSpecifierStringIndex = tempLine.rfind('"',firstSpecifierIndex) + endSpecifierStringIndex = tempLine.find('"',firstSpecifierIndex) + commaAfterEndSpecifierStringIndex = tempLine.find(',',endSpecifierStringIndex) + + # Count the number of commas after the specifier string + line = "(" + tempLine[commaAfterEndSpecifierStringIndex:-1] + numCommas = countRelevantCommas(line) + + # Determine number of extra percents after specifier string + numExtraPercents = tempLine.count('%', commaAfterEndSpecifierStringIndex) + + # Subtract extra from total count. This is the number of expected specifiers + # ignore %% + numPercents = tempLine.count('%') - numExtraPercents - 2*tempLine.count('%%') + + if numPercents != numCommas: + print "Incorrect number of arguments for LogPrint(f) statement found." + print(str(file) + ":" + str(lineCounter - tempCount)) + print "Line = " + tempLine + print("numRelevantCommas = " + str(numCommas) + ", numRelevantPercents = " + str(numPercents)) + print "" + + incorrectInstanceCounter += 1 + + # Done with this multiline, clear tempLine + tempLine = "" + tempCount = 0 + else: + tempCount += 1 + else: + # No LogPrint, clear tempLine + tempLine = "" + tempCount = 0 + + lineCounter += 1 + + print("# of incorrect instances: " + str(incorrectInstanceCounter)) + + sys.exit(incorrectInstanceCounter) diff --git a/contrib/devtools/split-debug.sh b/contrib/devtools/split-debug.sh deleted file mode 100755 index 06c6bf7..0000000 --- a/contrib/devtools/split-debug.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -if [ $# -ne 3 ]; - then echo "usage: $0 " -fi - -/usr/bin/i686-w64-mingw32-objcopy --enable-deterministic-archives -p --only-keep-debug $1 $3 -/usr/bin/i686-w64-mingw32-objcopy --enable-deterministic-archives -p --strip-debug $1 $2 -/usr/bin/i686-w64-mingw32-strip --enable-deterministic-archives -p -s $2 -/usr/bin/i686-w64-mingw32-objcopy --enable-deterministic-archives -p --add-gnu-debuglink=$3 $2 diff --git a/contrib/devtools/update-translations.py b/contrib/devtools/update-translations.py index 211fac6..5d28f5c 100755 --- a/contrib/devtools/update-translations.py +++ b/contrib/devtools/update-translations.py @@ -26,7 +26,7 @@ # Name of transifex tool TX = 'tx' # Name of source language file -SOURCE_LANG = 'ohmc_en.ts' +SOURCE_LANG = 'ohmcoin_en.ts' # Directory with locale files LOCALE_DIR = 'src/qt/locale' # Minimum number of messages for translation to be considered at all diff --git a/contrib/gitian-build.sh b/contrib/gitian-build.sh index e07a970..13e6fde 100755 --- a/contrib/gitian-build.sh +++ b/contrib/gitian-build.sh @@ -1,3 +1,4 @@ +#!/bin/bash # Copyright (c) 2016 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. @@ -6,7 +7,6 @@ sign=false verify=false build=false -setupenv=false # Systems to build linux=true @@ -28,10 +28,10 @@ signProg="gpg --detach-sign" commitFiles=true # Help Message -read -d '' usage <<- EOF +read -r -d '' usage <<- EOF Usage: $scriptName [-c|u|v|b|s|B|o|h|j|m|] signer version -Run this script from the directory containing the ohmc, gitian-builder, gitian.sigs, and ohmc-detached-sigs. +Run this script from the directory containing the ohmcoin, gitian-builder, gitian.sigs, and ohmcoin-detached-sigs. Arguments: signer GPG signer to sign each build assert file @@ -44,7 +44,7 @@ Options: -b|--build Do a gitian build -s|--sign Make signed binaries for Windows and Mac OSX -B|--buildsign Build both signed and unsigned binaries --o|--os Specify which Operating Systems the build is for. Default is lwx. l for linux, w for windows, x for osx +-o|--os Specify which Operating Systems the build is for. Default is lwx. l for linux, w for windows, x for osx, a for aarch64 -j Number of processes to use. Default 2 -m Memory to allocate in MiB. Default 2000 --kvm Use KVM instead of LXC @@ -92,6 +92,7 @@ while :; do linux=false windows=false osx=false + aarch64=false if [[ "$2" = *"l"* ]] then linux=true @@ -104,9 +105,13 @@ while :; do then osx=true fi + if [[ "$2" = *"a"* ]] + then + aarch64=true + fi shift else - echo 'Error: "--os" requires an argument containing an l (for linux), w (for windows), or x (for Mac OSX)\n' + printf 'Error: "--os" requires an argument containing an l (for linux), w (for windows), x (for Mac OSX), or a (for aarch64)\n' exit 1 fi ;; @@ -191,7 +196,7 @@ then fi # Get signer -if [[ -n"$1" ]] +if [[ -n "$1" ]] then SIGNER=$1 shift @@ -226,16 +231,16 @@ if [[ $commit = false ]] then COMMIT="v${VERSION}" fi -echo ${COMMIT} +echo "${COMMIT}" # Setup build environment if [[ $setup = true ]] then sudo apt-get install ruby apache2 git apt-cacher-ng python-vm-builder qemu-kvm qemu-utils git clone https://github.com/theohmproject/gitian.sigs.git - git clone https://github.com/theohmproject/ohmc-detached-sigs.git + git clone https://github.com/theohmproject/ohmcoin-detached-sigs.git git clone https://github.com/devrandom/gitian-builder.git - pushd ./gitian-builder + pushd ./gitian-builder || exit if [[ -n "$USE_LXC" ]] then sudo apt-get install lxc @@ -243,30 +248,30 @@ then else bin/make-base-vm --suite trusty --arch amd64 fi - popd + popd || exit fi # Set up build -pushd ./ohmc +pushd ./ohmcoin || exit git fetch -git checkout ${COMMIT} -popd +git checkout "${COMMIT}" +popd || exit # Build if [[ $build = true ]] then # Make output folder - mkdir -p ./ohmc-binaries/${VERSION} + mkdir -p "./ohmcoin-binaries/${VERSION}" # Build Dependencies echo "" echo "Building Dependencies" echo "" - pushd ./gitian-builder + pushd ./gitian-builder || exit mkdir -p inputs wget -N -P inputs $osslPatchUrl wget -N -P inputs $osslTarUrl - make -C ../ohmc/depends download SOURCES_PATH=`pwd`/cache/common + make -C ../ohmcoin/depends download SOURCES_PATH="$(pwd)/cache/common" # Linux if [[ $linux = true ]] @@ -274,9 +279,9 @@ then echo "" echo "Compiling ${VERSION} Linux" echo "" - ./bin/gbuild -j ${proc} -m ${mem} --commit ohmc=${COMMIT} --url ohmc=${url} ../ohmc/contrib/gitian-descriptors/gitian-linux.yml - ./bin/gsign -p $signProg --signer $SIGNER --release ${VERSION}-linux --destination ../gitian.sigs/ ../ohmc/contrib/gitian-descriptors/gitian-linux.yml - mv build/out/ohmc-*.tar.gz build/out/src/ohmc-*.tar.gz ../ohmc-binaries/${VERSION} + ./bin/gbuild -j ${proc} -m ${mem} --commit ohmcoin=${COMMIT} --url ohmcoin=${url} ../ohmcoin/contrib/gitian-descriptors/gitian-linux.yml + ./bin/gsign --signer $SIGNER --release ${VERSION}-linux --destination ../gitian.sigs/ ../ohmcoin/contrib/gitian-descriptors/gitian-linux.yml + mv build/out/ohmcoin-*.tar.gz build/out/src/ohmcoin-*.tar.gz ../ohmcoin-binaries/${VERSION} fi # Windows if [[ $windows = true ]] @@ -284,10 +289,10 @@ then echo "" echo "Compiling ${VERSION} Windows" echo "" - ./bin/gbuild -j ${proc} -m ${mem} --commit ohmc=${COMMIT} --url ohmc=${url} ../ohmc/contrib/gitian-descriptors/gitian-win.yml - ./bin/gsign -p $signProg --signer $SIGNER --release ${VERSION}-win-unsigned --destination ../gitian.sigs/ ../ohmc/contrib/gitian-descriptors/gitian-win.yml - mv build/out/ohmc-*-win-unsigned.tar.gz inputs/ohmc-win-unsigned.tar.gz - mv build/out/ohmc-*.zip build/out/ohmc-*.exe ../ohmc-binaries/${VERSION} + ./bin/gbuild -j ${proc} -m ${mem} --commit ohmcoin=${COMMIT} --url ohmcoin=${url} ../ohmcoin/contrib/gitian-descriptors/gitian-win.yml + ./bin/gsign --signer $SIGNER --release ${VERSION}-win-unsigned --destination ../gitian.sigs/ ../ohmcoin/contrib/gitian-descriptors/gitian-win.yml + mv build/out/ohmcoin-*-win-unsigned.tar.gz inputs/ohmcoin-win-unsigned.tar.gz + mv build/out/ohmcoin-*.zip build/out/ohmcoin-*.exe ../ohmcoin-binaries/${VERSION} fi # Mac OSX if [[ $osx = true ]] @@ -295,12 +300,22 @@ then echo "" echo "Compiling ${VERSION} Mac OSX" echo "" - ./bin/gbuild -j ${proc} -m ${mem} --commit ohmc=${COMMIT} --url ohmc=${url} ../ohmc/contrib/gitian-descriptors/gitian-osx.yml - ./bin/gsign -p $signProg --signer $SIGNER --release ${VERSION}-osx-unsigned --destination ../gitian.sigs/ ../ohmc/contrib/gitian-descriptors/gitian-osx.yml - mv build/out/ohmc-*-osx-unsigned.tar.gz inputs/ohmc-osx-unsigned.tar.gz - mv build/out/ohmc-*.tar.gz build/out/ohmc-*.dmg ../ohmc-binaries/${VERSION} + ./bin/gbuild -j ${proc} -m ${mem} --commit ohmcoin=${COMMIT} --url ohmcoin=${url} ../ohmcoin/contrib/gitian-descriptors/gitian-osx.yml + ./bin/gsign --signer $SIGNER --release ${VERSION}-osx-unsigned --destination ../gitian.sigs/ ../ohmcoin/contrib/gitian-descriptors/gitian-osx.yml + mv build/out/ohmcoin-*-osx-unsigned.tar.gz inputs/ohmcoin-osx-unsigned.tar.gz + mv build/out/ohmcoin-*.tar.gz build/out/ohmcoin-*.dmg ../ohmcoin-binaries/${VERSION} fi - popd + # AArch64 + if [[ $aarch64 = true ]] + then + echo "" + echo "Compiling ${VERSION} AArch64" + echo "" + ./bin/gbuild -j ${proc} -m ${mem} --commit ohmcoin=${COMMIT} --url ohmcoin=${url} ../ohmcoin/contrib/gitian-descriptors/gitian-aarch64.yml + ./bin/gsign --signer $SIGNER --release ${VERSION}-aarch64 --destination ../gitian.sigs/ ../ohmcoin/contrib/gitian-descriptors/gitian-aarch64.yml + mv build/out/ohmcoin-*.tar.gz build/out/src/ohmcoin-*.tar.gz ../ohmcoin-binaries/${VERSION} + fi + popd || exit if [[ $commitFiles = true ]] then @@ -308,12 +323,13 @@ then echo "" echo "Committing ${VERSION} Unsigned Sigs" echo "" - pushd gitian.sigs + pushd gitian.sigs || exit git add ${VERSION}-linux/${SIGNER} + git add ${VERSION}-aarch64/${SIGNER} git add ${VERSION}-win-unsigned/${SIGNER} git add ${VERSION}-osx-unsigned/${SIGNER} git commit -a -m "Add ${VERSION} unsigned sigs for ${SIGNER}" - popd + popd || exit fi fi @@ -321,49 +337,54 @@ fi if [[ $verify = true ]] then # Linux - pushd ./gitian-builder + pushd ./gitian-builder || exit echo "" echo "Verifying v${VERSION} Linux" echo "" - ./bin/gverify -v -d ../gitian.sigs/ -r ${VERSION}-linux ../ohmc/contrib/gitian-descriptors/gitian-linux.yml + ./bin/gverify -v -d ../gitian.sigs/ -r ${VERSION}-linux ../ohmcoin/contrib/gitian-descriptors/gitian-linux.yml # Windows echo "" echo "Verifying v${VERSION} Windows" echo "" - ./bin/gverify -v -d ../gitian.sigs/ -r ${VERSION}-win-unsigned ../ohmc/contrib/gitian-descriptors/gitian-win.yml + ./bin/gverify -v -d ../gitian.sigs/ -r ${VERSION}-win-unsigned ../ohmcoin/contrib/gitian-descriptors/gitian-win.yml # Mac OSX echo "" echo "Verifying v${VERSION} Mac OSX" echo "" - ./bin/gverify -v -d ../gitian.sigs/ -r ${VERSION}-osx-unsigned ../ohmc/contrib/gitian-descriptors/gitian-osx.yml + ./bin/gverify -v -d ../gitian.sigs/ -r ${VERSION}-osx-unsigned ../ohmcoin/contrib/gitian-descriptors/gitian-osx.yml + # AArch64 + echo "" + echo "Verifying v${VERSION} AArch64" + echo "" + ./bin/gverify -v -d ../gitian.sigs/ -r ${VERSION}-aarch64 ../ohmcoin/contrib/gitian-descriptors/gitian-aarch64.yml # Signed Windows echo "" echo "Verifying v${VERSION} Signed Windows" echo "" - ./bin/gverify -v -d ../gitian.sigs/ -r ${VERSION}-osx-signed ../ohmc/contrib/gitian-descriptors/gitian-osx-signer.yml + ./bin/gverify -v -d ../gitian.sigs/ -r ${VERSION}-osx-signed ../ohmcoin/contrib/gitian-descriptors/gitian-osx-signer.yml # Signed Mac OSX echo "" echo "Verifying v${VERSION} Signed Mac OSX" echo "" - ./bin/gverify -v -d ../gitian.sigs/ -r ${VERSION}-osx-signed ../ohmc/contrib/gitian-descriptors/gitian-osx-signer.yml - popd + ./bin/gverify -v -d ../gitian.sigs/ -r ${VERSION}-osx-signed ../ohmcoin/contrib/gitian-descriptors/gitian-osx-signer.yml + popd || exit fi # Sign binaries if [[ $sign = true ]] then - pushd ./gitian-builder + pushd ./gitian-builder || exit # Sign Windows if [[ $windows = true ]] then echo "" echo "Signing ${VERSION} Windows" echo "" - ./bin/gbuild -i --commit signature=${COMMIT} ../ohmc/contrib/gitian-descriptors/gitian-win-signer.yml - ./bin/gsign -p $signProg --signer $SIGNER --release ${VERSION}-win-signed --destination ../gitian.sigs/ ../ohmc/contrib/gitian-descriptors/gitian-win-signer.yml - mv build/out/ohmc-*win64-setup.exe ../ohmc-binaries/${VERSION} - mv build/out/ohmc-*win32-setup.exe ../ohmc-binaries/${VERSION} + ./bin/gbuild -i --commit signature=${COMMIT} ../ohmcoin/contrib/gitian-descriptors/gitian-win-signer.yml + ./bin/gsign --signer $SIGNER --release ${VERSION}-win-signed --destination ../gitian.sigs/ ../ohmcoin/contrib/gitian-descriptors/gitian-win-signer.yml + mv build/out/ohmcoin-*win64-setup.exe ../ohmcoin-binaries/${VERSION} + mv build/out/ohmcoin-*win32-setup.exe ../ohmcoin-binaries/${VERSION} fi # Sign Mac OSX if [[ $osx = true ]] @@ -371,22 +392,22 @@ then echo "" echo "Signing ${VERSION} Mac OSX" echo "" - ./bin/gbuild -i --commit signature=${COMMIT} ../ohmc/contrib/gitian-descriptors/gitian-osx-signer.yml - ./bin/gsign -p $signProg --signer $SIGNER --release ${VERSION}-osx-signed --destination ../gitian.sigs/ ../ohmc/contrib/gitian-descriptors/gitian-osx-signer.yml - mv build/out/ohmc-osx-signed.dmg ../ohmc-binaries/${VERSION}/ohmc-${VERSION}-osx.dmg + ./bin/gbuild -i --commit signature=${COMMIT} ../ohmcoin/contrib/gitian-descriptors/gitian-osx-signer.yml + ./bin/gsign --signer $SIGNER --release ${VERSION}-osx-signed --destination ../gitian.sigs/ ../ohmcoin/contrib/gitian-descriptors/gitian-osx-signer.yml + mv build/out/ohmcoin-osx-signed.dmg ../ohmcoin-binaries/${VERSION}/ohmcoin-${VERSION}-osx.dmg fi - popd + popd || exit if [[ $commitFiles = true ]] then # Commit Sigs - pushd gitian.sigs + pushd gitian.sigs || exit echo "" echo "Committing ${VERSION} Signed Sigs" echo "" git add ${VERSION}-win-signed/${SIGNER} git add ${VERSION}-osx-signed/${SIGNER} git commit -a -m "Add ${VERSION} signed binary sigs for ${SIGNER}" - popd + popd || exit fi fi diff --git a/contrib/gitian-descriptors/README.md b/contrib/gitian-descriptors/README.md index fa615e8..c6cfe3b 100755 --- a/contrib/gitian-descriptors/README.md +++ b/contrib/gitian-descriptors/README.md @@ -20,7 +20,7 @@ Sanity checks: Once you've got the right hardware and software: - git clone git://https://github.com/theohmproject/ohmcoin.git + git clone git://github.com/theohmproject/ohmcoin.git git clone git://github.com/devrandom/gitian-builder.git mkdir gitian-builder/inputs cd gitian-builder/inputs @@ -62,5 +62,5 @@ Here's a description of Gavin's setup on OSX 10.6: 5. Still inside Ubuntu, tell gitian-builder to use LXC, then follow the "Once you've got the right hardware and software" instructions above: export USE_LXC=1 - git clone git://https://github.com/theohmproject/ohmcoin.git + git clone git://github.com/theohmproject/ohmcoin.git ... etc diff --git a/contrib/gitian-descriptors/gitian-aarch64.yml b/contrib/gitian-descriptors/gitian-aarch64.yml new file mode 100644 index 0000000..88b6c09 --- /dev/null +++ b/contrib/gitian-descriptors/gitian-aarch64.yml @@ -0,0 +1,171 @@ +--- +name: "ohmcoin-aarch64-1.6" +enable_cache: true +suites: +- "xenial" +architectures: +- "amd64" +packages: +- "curl" +- "g++-aarch64-linux-gnu" +- "g++-4.9-aarch64-linux-gnu" +- "gcc-4.9-aarch64-linux-gnu" +- "binutils-aarch64-linux-gnu" +- "g++-4.9-multilib" +- "gcc-4.9-multilib" +- "binutils-gold" +- "git-core" +- "pkg-config" +- "autoconf" +- "libtool" +- "automake" +- "faketime" +- "bsdmainutils" +- "ca-certificates" +- "python" +reference_datetime: "2015-06-01 00:00:00" +remotes: +- "url": "https://github.com/theohmproject/ohmcoin.git" + "dir": "ohmcoin" +files: [] +script: | + + WRAP_DIR=$HOME/wrapped + HOSTS="aarch64-linux-gnu" + CONFIGFLAGS="--enable-glibc-back-compat --enable-reduce-exports --disable-bench --disable-gui-tests" + FAKETIME_HOST_PROGS="" + FAKETIME_PROGS="date ar ranlib nm" + HOST_CFLAGS="-O2 -g" + HOST_CXXFLAGS="-O2 -g -Wno-deprecated-declarations" + HOST_LDFLAGS=-static-libstdc++ + + export QT_RCC_TEST=1 + export GZIP="-9n" + export TAR_OPTIONS="--mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME"" + export TZ="UTC" + export BUILD_DIR=`pwd` + mkdir -p ${WRAP_DIR} + if test -n "$GBUILD_CACHE_ENABLED"; then + export SOURCES_PATH=${GBUILD_COMMON_CACHE} + export BASE_CACHE=${GBUILD_PACKAGE_CACHE} + mkdir -p ${BASE_CACHE} ${SOURCES_PATH} + fi + + function create_global_faketime_wrappers { + for prog in ${FAKETIME_PROGS}; do + echo '#!/bin/bash' > ${WRAP_DIR}/${prog} + echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog} + echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog} + echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${prog} + echo "\$REAL \$@" >> $WRAP_DIR/${prog} + chmod +x ${WRAP_DIR}/${prog} + done + } + + function create_per-host_faketime_wrappers { + for i in $HOSTS; do + for prog in ${FAKETIME_HOST_PROGS}; do + echo '#!/bin/bash' > ${WRAP_DIR}/${i}-${prog} + echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog} + echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog} + echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${i}-${prog} + echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog} + chmod +x ${WRAP_DIR}/${i}-${prog} + done + done + } + + # Faketime for depends so intermediate results are comparable + export PATH_orig=${PATH} + create_global_faketime_wrappers "2000-01-01 12:00:00" + create_per-host_faketime_wrappers "2000-01-01 12:00:00" + export PATH=${WRAP_DIR}:${PATH} + + EXTRA_INCLUDES_BASE=$WRAP_DIR/extra_includes + mkdir -p $EXTRA_INCLUDES_BASE + + # x86 needs /usr/include/i386-linux-gnu/asm pointed to /usr/include/x86_64-linux-gnu/asm, + # but we can't write there. Instead, create a link here and force it to be included in the + # search paths by wrapping gcc/g++. + + mkdir -p $EXTRA_INCLUDES_BASE/i686-pc-linux-gnu + rm -f $WRAP_DIR/extra_includes/i686-pc-linux-gnu/asm + ln -s /usr/include/x86_64-linux-gnu/asm $EXTRA_INCLUDES_BASE/i686-pc-linux-gnu/asm + + for prog in gcc g++; do + rm -f ${WRAP_DIR}/${prog} + cat << EOF > ${WRAP_DIR}/${prog} + #!/bin/bash + REAL="`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1`" + for var in "\$@" + do + if [ "\$var" = "-m32" ]; then + export C_INCLUDE_PATH="$EXTRA_INCLUDES_BASE/i686-pc-linux-gnu" + export CPLUS_INCLUDE_PATH="$EXTRA_INCLUDES_BASE/i686-pc-linux-gnu" + break + fi + done + \$REAL \$@ + EOF + chmod +x ${WRAP_DIR}/${prog} + done + + cd ohmcoin + BASEPREFIX=`pwd`/depends + # Build dependencies for each host + for i in $HOSTS; do + EXTRA_INCLUDES="$EXTRA_INCLUDES_BASE/$i" + if [ -d "$EXTRA_INCLUDES" ]; then + export HOST_ID_SALT="$EXTRA_INCLUDES" + fi + make ${MAKEOPTS} -C ${BASEPREFIX} HOST="${i}" + unset HOST_ID_SALT + done + + # Faketime for binaries + export PATH=${PATH_orig} + create_global_faketime_wrappers "${REFERENCE_DATETIME}" + create_per-host_faketime_wrappers "${REFERENCE_DATETIME}" + export PATH=${WRAP_DIR}:${PATH} + + # Create the release tarball using (arbitrarily) the first host + ./autogen.sh + CONFIG_SITE=${BASEPREFIX}/`echo "${HOSTS}" | awk '{print $1;}'`/share/config.site ./configure --prefix=/ + make dist + SOURCEDIST=`echo ohmcoin-*.tar.gz` + DISTNAME=`echo ${SOURCEDIST} | sed 's/.tar.*//'` + # Correct tar file order + mkdir -p temp + pushd temp + tar xf ../$SOURCEDIST + find ohmcoin-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST + popd + + ORIGPATH="$PATH" + # Extract the release tarball into a dir for each host and build + for i in ${HOSTS}; do + export PATH=${BASEPREFIX}/${i}/native/bin:${ORIGPATH} + mkdir -p distsrc-${i} + cd distsrc-${i} + INSTALLPATH=`pwd`/installed/${DISTNAME} + mkdir -p ${INSTALLPATH} + tar --strip-components=1 -xf ../$SOURCEDIST + + CONFIG_SITE=${BASEPREFIX}/${i}/share/config.site ./configure --prefix=/ --disable-ccache --disable-maintainer-mode --disable-dependency-tracking ${CONFIGFLAGS} CFLAGS="${HOST_CFLAGS}" CXXFLAGS="${HOST_CXXFLAGS}" LDFLAGS="${HOST_LDFLAGS}" + make ${MAKEOPTS} + + make install DESTDIR=${INSTALLPATH} + cd installed + find . -name "lib*.la" -delete + find . -name "lib*.a" -delete + rm -rf ${DISTNAME}/lib/pkgconfig + find ${DISTNAME}/bin -type f -executable -exec ../contrib/devtools/split-debug.sh {} {} {}.dbg \; + #find ${DISTNAME}/lib -type f -exec ../contrib/devtools/split-debug.sh {} {} {}.dbg \; + find ${DISTNAME} -not -name "*.dbg" | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}.tar.gz + find ${DISTNAME} -name "*.dbg" | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}-debug.tar.gz + cd ../../ + rm -rf distsrc-${i} + done + mkdir -p $OUTDIR/src + mkdir -p $OUTDIR/src + mv $SOURCEDIST $OUTDIR/src diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index 3a1720d..fc57a55 100755 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -1,11 +1,11 @@ --- -name: "ohmc-linux-2.3.1" +name: "ohmcoin-linux-1.6" enable_cache: true suites: - "trusty" architectures: - "amd64" -packages: +packages: - "curl" - "g++-aarch64-linux-gnu" - "g++-4.8-aarch64-linux-gnu" @@ -30,12 +30,12 @@ packages: reference_datetime: "2015-06-01 00:00:00" remotes: - "url": "https://github.com/theohmproject/ohmcoin.git" - "dir": "ohmc" + "dir": "ohmcoin" files: [] script: | WRAP_DIR=$HOME/wrapped - HOSTS="i686-pc-linux-gnu x86_64-linux-gnu arm-linux-gnueabihf aarch64-linux-gnu" + HOSTS="i686-pc-linux-gnu x86_64-linux-gnu arm-linux-gnueabihf" CONFIGFLAGS="--enable-glibc-back-compat --enable-reduce-exports --disable-bench --disable-gui-tests" FAKETIME_HOST_PROGS="" FAKETIME_PROGS="date ar ranlib nm" @@ -114,7 +114,7 @@ script: | chmod +x ${WRAP_DIR}/${prog} done - cd ohmc + cd ohmcoin BASEPREFIX=`pwd`/depends # Build dependencies for each host for i in $HOSTS; do @@ -136,13 +136,13 @@ script: | ./autogen.sh CONFIG_SITE=${BASEPREFIX}/`echo "${HOSTS}" | awk '{print $1;}'`/share/config.site ./configure --prefix=/ make dist - SOURCEDIST=`echo ohmc-*.tar.gz` + SOURCEDIST=`echo ohmcoin-*.tar.gz` DISTNAME=`echo ${SOURCEDIST} | sed 's/.tar.*//'` # Correct tar file order mkdir -p temp pushd temp tar xf ../$SOURCEDIST - find ohmc-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST + find ohmcoin-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST popd ORIGPATH="$PATH" @@ -164,7 +164,7 @@ script: | find . -name "lib*.a" -delete rm -rf ${DISTNAME}/lib/pkgconfig find ${DISTNAME}/bin -type f -executable -exec ../contrib/devtools/split-debug.sh {} {} {}.dbg \; - find ${DISTNAME}/lib -type f -exec ../contrib/devtools/split-debug.sh {} {} {}.dbg \; + # find ${DISTNAME}/lib -type f -exec ../contrib/devtools/split-debug.sh {} {} {}.dbg \; find ${DISTNAME} -not -name "*.dbg" | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}.tar.gz find ${DISTNAME} -name "*.dbg" | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}-debug.tar.gz cd ../../ diff --git a/contrib/gitian-descriptors/gitian-osx-signer.yml b/contrib/gitian-descriptors/gitian-osx-signer.yml index 0b481e0..da57ed3 100755 --- a/contrib/gitian-descriptors/gitian-osx-signer.yml +++ b/contrib/gitian-descriptors/gitian-osx-signer.yml @@ -1,5 +1,5 @@ --- -name: "ohmc-dmg-signer" +name: "ohmcoin-dmg-signer" suites: - "trusty" architectures: @@ -7,10 +7,10 @@ architectures: packages: - "faketime" remotes: -- "url": "https://github.com/theohmproject/ohmc-detached-sigs.git" +- "url": "https://github.com/theohmproject/ohmcoin-detached-sigs.git" "dir": "signature" files: -- "ohmc-osx-unsigned.tar.gz" +- "ohmcoin-osx-unsigned.tar.gz" script: | WRAP_DIR=$HOME/wrapped mkdir -p ${WRAP_DIR} @@ -27,11 +27,11 @@ script: | chmod +x ${WRAP_DIR}/${prog} done - UNSIGNED=ohmc-osx-unsigned.tar.gz - SIGNED=ohmc-osx-signed.dmg + UNSIGNED=ohmcoin-osx-unsigned.tar.gz + SIGNED=ohmcoin-osx-signed.dmg tar -xf ${UNSIGNED} OSX_VOLNAME="$(cat osx_volname)" ./detached-sig-apply.sh ${UNSIGNED} signature/osx - ${WRAP_DIR}/genisoimage -no-cache-inodes -D -l -probe -V "OHMC-Qt" -no-pad -r -dir-mode 0755 -apple -o uncompressed.dmg signed-app + ${WRAP_DIR}/genisoimage -no-cache-inodes -D -l -probe -V "Ohmcoin-Qt" -no-pad -r -dir-mode 0755 -apple -o uncompressed.dmg signed-app ${WRAP_DIR}/dmg dmg uncompressed.dmg ${OUTDIR}/${SIGNED} diff --git a/contrib/gitian-descriptors/gitian-osx.yml b/contrib/gitian-descriptors/gitian-osx.yml index 96d6835..d50faed 100755 --- a/contrib/gitian-descriptors/gitian-osx.yml +++ b/contrib/gitian-descriptors/gitian-osx.yml @@ -1,11 +1,11 @@ --- -name: "ohmc-osx-2.3.1" +name: "ohmcoin-osx-1.6" enable_cache: true suites: - "trusty" architectures: - "amd64" -packages: +packages: - "ca-certificates" - "curl" - "g++" @@ -28,8 +28,8 @@ packages: - "python-setuptools" - "fonts-tuffy" remotes: -- "url": "https://github.com/theohmcproject/ohmcoin.git" - "dir": "ohmc" +- "url": "https://github.com/theohmproject/ohmcoin.git" + "dir": "ohmcoin" files: - "MacOSX10.11.sdk.tar.gz" script: | @@ -83,7 +83,7 @@ script: | create_per-host_faketime_wrappers "2000-01-01 12:00:00" export PATH=${WRAP_DIR}:${PATH} - cd ohmc + cd ohmcoin BASEPREFIX=`pwd`/depends mkdir -p ${BASEPREFIX}/SDKs @@ -104,14 +104,14 @@ script: | ./autogen.sh CONFIG_SITE=${BASEPREFIX}/`echo "${HOSTS}" | awk '{print $1;}'`/share/config.site ./configure --prefix=/ make dist - SOURCEDIST=`echo ohmc-*.tar.gz` + SOURCEDIST=`echo ohmcoin-*.tar.gz` DISTNAME=`echo ${SOURCEDIST} | sed 's/.tar.*//'` # Correct tar file order mkdir -p temp pushd temp tar xf ../$SOURCEDIST - find ohmc-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST + find ohmcoin-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST popd ORIGPATH="$PATH" diff --git a/contrib/gitian-descriptors/gitian-rpi2.yml b/contrib/gitian-descriptors/gitian-rpi2.yml index 9650fb9..e32e791 100755 --- a/contrib/gitian-descriptors/gitian-rpi2.yml +++ b/contrib/gitian-descriptors/gitian-rpi2.yml @@ -1,5 +1,5 @@ --- -name: "ohmc-rpi2-2.3.1" +name: "ohmcoin-rpi2-1.6" enable_cache: true suites: - "trusty" @@ -21,7 +21,7 @@ packages: reference_datetime: "2015-06-01 00:00:00" remotes: - "url": "https://github.com/theohmproject/ohmcoin.git" - "dir": "ohmc" + "dir": "ohmcoin" files: - "raspberrypi-tools.tar.gz" script: | @@ -30,7 +30,7 @@ script: | CONFIGFLAGS="--enable-upnp-default --enable-glibc-back-compat" FAKETIME_HOST_PROGS="" FAKETIME_PROGS="date ar ranlib nm strip" - + tar --warning=no-timestamp -xzf raspberrypi-tools.tar.gz export TOOLCHAIN_BIN=$(pwd)/raspberrypi-tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin export PATH=$PATH:$TOOLCHAIN_BIN @@ -70,7 +70,7 @@ script: | done export PATH=${WRAP_DIR}:${PATH} - cd ohmc + cd ohmcoin BASEPREFIX=`pwd`/depends # Build dependencies for each host for i in $HOSTS; do @@ -81,13 +81,13 @@ script: | ./autogen.sh ./configure --prefix=${BASEPREFIX}/`echo "${HOSTS}" | awk '{print $1;}'` make NO_QT=1 dist - SOURCEDIST=`echo ohmc-*.tar.gz` + SOURCEDIST=`echo ohmcoin-*.tar.gz` DISTNAME=`echo ${SOURCEDIST} | sed 's/.tar.*//'` # Correct tar file order mkdir -p temp pushd temp tar xf ../$SOURCEDIST - find ohmc-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST + find ohmcoin-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST popd ORIGPATH="$PATH" diff --git a/contrib/gitian-descriptors/gitian-win-signer.yml b/contrib/gitian-descriptors/gitian-win-signer.yml index 868bdab..701bb74 100755 --- a/contrib/gitian-descriptors/gitian-win-signer.yml +++ b/contrib/gitian-descriptors/gitian-win-signer.yml @@ -1,5 +1,5 @@ --- -name: "ohmc-win-signer" +name: "ohmcoin-win-signer" suites: - "trusty" architectures: @@ -8,12 +8,12 @@ packages: - "libssl-dev" - "autoconf" remotes: -- "url": "https://github.com/ohmc-project/ohmc-detached-sigs.git" +- "url": "https://github.com/theohmproject/ohmcoin-detached-sigs.git" "dir": "signature" files: - "osslsigncode-1.7.1.tar.gz" - "osslsigncode-Backports-to-1.7.1.patch" -- "ohmc-win-unsigned.tar.gz" +- "ohmcoin-win-unsigned.tar.gz" script: | BUILD_DIR=`pwd` SIGDIR=${BUILD_DIR}/signature/win @@ -23,7 +23,7 @@ script: | echo "a8c4e9cafba922f89de0df1f2152e7be286aba73f78505169bc351a7938dd911 osslsigncode-Backports-to-1.7.1.patch" | sha256sum -c mkdir -p ${UNSIGNED_DIR} - tar -C ${UNSIGNED_DIR} -xf ohmc-win-unsigned.tar.gz + tar -C ${UNSIGNED_DIR} -xf ohmcoin-win-unsigned.tar.gz tar xf osslsigncode-1.7.1.tar.gz cd osslsigncode-1.7.1 diff --git a/contrib/gitian-descriptors/gitian-win.yml b/contrib/gitian-descriptors/gitian-win.yml index 3b78051..e6c74e6 100755 --- a/contrib/gitian-descriptors/gitian-win.yml +++ b/contrib/gitian-descriptors/gitian-win.yml @@ -1,11 +1,11 @@ --- -name: "ohmc-win-2.3.1" +name: "ohmcoin-win-1.6" enable_cache: true suites: - "trusty" architectures: - "amd64" -packages: +packages: - "curl" - "g++" - "git-core" @@ -22,12 +22,12 @@ packages: - "ca-certificates" - "python" remotes: -- "url": "https://github.com/theohmcproject/ohmcoin.git" - "dir": "ohmc" +- "url": "https://github.com/theohmproject/ohmcoin.git" + "dir": "ohmcoin" files: [] script: | WRAP_DIR=$HOME/wrapped - HOSTS="x86_64-w64-mingw32 i686-w64-mingw32" + HOSTS="i686-w64-mingw32 x86_64-w64-mingw32" CONFIGFLAGS="--enable-reduce-exports --disable-bench --disable-gui-tests" FAKETIME_HOST_PROGS="g++ ar ranlib nm windres strip objcopy" FAKETIME_PROGS="date makensis zip" @@ -101,7 +101,7 @@ script: | create_per-host_linker_wrapper "2000-01-01 12:00:00" export PATH=${WRAP_DIR}:${PATH} - cd ohmc + cd ohmcoin BASEPREFIX=`pwd`/depends # Build dependencies for each host for i in $HOSTS; do @@ -119,14 +119,14 @@ script: | ./autogen.sh CONFIG_SITE=${BASEPREFIX}/`echo "${HOSTS}" | awk '{print $1;}'`/share/config.site ./configure --prefix=/ make dist - SOURCEDIST=`echo ohmc-*.tar.gz` + SOURCEDIST=`echo ohmcoin-*.tar.gz` DISTNAME=`echo ${SOURCEDIST} | sed 's/.tar.*//'` # Correct tar file order mkdir -p temp pushd temp tar xf ../$SOURCEDIST - find ohmc-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST + find ohmcoin-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST mkdir -p $OUTDIR/src cp ../$SOURCEDIST $OUTDIR/src popd @@ -145,17 +145,18 @@ script: | make ${MAKEOPTS} make deploy make install DESTDIR=${INSTALLPATH} - cp -f ohmc-*setup*.exe $OUTDIR/ + cp -f ohmcoin-*setup*.exe $OUTDIR/ cd installed - mv ${DISTNAME}/bin/*.dll ${DISTNAME}/lib/ - find . -name "lib*.la" -delete - find . -name "lib*.a" -delete + # mv ${DISTNAME}/bin/*.dll ${DISTNAME}/lib/ # temporarily disabled for Zerocoin + # find . -name "lib*.la" -delete # temporarily disabled for Zerocoin + # find . -name "lib*.a" -delete # temporarily disabled for Zerocoin rm -rf ${DISTNAME}/lib/pkgconfig find ${DISTNAME}/bin -type f -executable -exec ${i}-objcopy --only-keep-debug {} {}.dbg \; -exec ${i}-strip -s {} \; -exec ${i}-objcopy --add-gnu-debuglink={}.dbg {} \; - find ${DISTNAME}/lib -type f -exec ${i}-objcopy --only-keep-debug {} {}.dbg \; -exec ${i}-strip -s {} \; -exec ${i}-objcopy --add-gnu-debuglink={}.dbg {} \; + # find ${DISTNAME}/lib -type f -exec ${i}-objcopy --only-keep-debug {} {}.dbg \; -exec ${i}-strip -s {} \; -exec ${i}-objcopy --add-gnu-debuglink={}.dbg {} \; find ${DISTNAME} -not -name "*.dbg" -type f | sort | zip -X@ ${OUTDIR}/${DISTNAME}-${i}.zip find ${DISTNAME} -name "*.dbg" -type f | sort | zip -X@ ${OUTDIR}/${DISTNAME}-${i}-debug.zip cd ../../ + rm -rf distsrc-${i} done cd $OUTDIR rename 's/-setup\.exe$/-setup-unsigned.exe/' *-setup.exe diff --git a/contrib/gitian-downloader/aschildbach-key.pgp b/contrib/gitian-downloader/aschildbach-key.pgp new file mode 100644 index 0000000000000000000000000000000000000000..df06e19fa4b109286dbbb7596c86d31fe0f1052f GIT binary patch literal 1993 zcmbW%c|6mP9|!P{ZOo9Cp&a#Hj+h~m$T7F%D5emFVVEO+2vLrZIm;+aI~)yBmYO18 zM^Wx?Ie!|``qoy?2Z`m_FW=w!_wV2LAJ518db~=7Dj;UV-*xsu0D79G@N`E;@EF_j zZAyT=A6}Me4xPW&Zp@62nvj3y3W>K35PKZFfZuDmXq|S(ah3M;LE0BBZ_%unppxvE z-2O!dq)NG|QA``9kbCfqjX?){@c(@m5Pi`fQaaj3sn`;&V zH>t|DcOj<+8xrBh0DXw{<^xj|wD5hNC~0`1XF_|+KNBp7@MSR!c9sz7ShLc|Gl$|P zf-`KjZaloRozrKUMb*S*npiVtdxtM5_KY4kXlz^|o_0vIwO54ZckOAaXmWSvk-OC- zZjE!KoM37(gDdKmLQ9BqUdGC`f21afPMI`Abvw@3ltID^>pcg`lytE6?2(PL|iOYGZha+T6oFD=EmP47Oc zN{?Sla}(95`+d>k4vU|uH@xk*WqCLnMePprX7IC5WOLYeIVeFFlhIzAO*09I7}1@27zTjV6ZGm2y{pYv_Az9gTea( z(I0a%6MQ$01N0W~)Z8Qv7OBoq9-Iif$!%Js@c~-MeH*O&C%PIs$mN-Gx;<%1KMDGO z`BY2-7MLt}|8vq!kjnbh5L%;WNCBuC@;tH_EH^F>Oni`H8!4j_-Nz!@Lg2sp7ZC>8 z#91uv_Nn;{1yc9-nLeZn&|F^Jy;nM)>Y;Eyh?b~2EcRM= zVX36PXxoGTb?n-fUhFzsd%yL^O>OsZJ^?gyVSH(^Dd~j1j?qCQ$M^G&Jb^ku-!P}d zU;lukJM62bY19RJobOqu|ButYkiF}ySEirR0a=V134k()_^|R^MUZxZrJvnpbQ8BH zx=I9~9uDzXd#zGm+6XCMJW)SwI#$wB_{-V7%dfc{8@yJcW>`jIG5)&9pIcO&R{RR*Y2kKFW7ZXL1d8C7-X(qY_&B7?2zOptv~SYUWk z`{+o@{>>S=@w%tiTR-K`CgmzT>J~?{%=*DI+^Q7||K71;ZUe}q^h+SUSgJK}Nf#eE zlB8O+rmCr%gg5sYdqY$q@n>jQp*CGt5z`ETh;}G0*;J;mU-S>U!y5XA^dlq@h|Y!DG!^|uW(6C*RRUV!zEK@_uaxvlXRU1u1%Q>YD?PRa3J!oSxlHr$o)~YQ(&8r3(_S>uje8k>(j=DJ! zAC8U1=EQr=t4*~Jw-~^;^=)KMw@SJM54rul%c~=lWYfi5KD6;oz00Vo{OwI~@6>5` zmj6fbWB@D-6qP#5^rhmz#`8-N0jrP<(5ZU!j+H=P!F%cTpWH`n49o^A+ zGEuRA>2`AC?-wP=WnzdtnMwaVuv=mfLMDbhXgA+`_ZgSdkO1c_bV&bPE+L~O7*+$H zJY0CO8hO=L)isjminxmFFrL+Psx^W+3Y~sixVJ&!bC@2)+(~Qdn1o-SZl~^G<&9zq zsrbl1D&~hVvpiN#pts$YR5XgIAqX6PyK}K%>&8m-N_zDWp|h4VIkp(&RFQgwgj9s9 zd=Aa;M!cll?VfCWIUTp%dDG2HL~BXa-?D*s*KOD>R@ey2!nb0?HR!un_qG1b$6dwU)^ WIAcG~ygp)$8X5B=5Q?y`6#oH_l8)K{ literal 0 HcmV?d00001 diff --git a/contrib/gitian-downloader/bluematt-key.pgp b/contrib/gitian-downloader/bluematt-key.pgp new file mode 100644 index 0000000000000000000000000000000000000000..fb6d9eb28423d2c8ece89179f8e67ae06fa6dc13 GIT binary patch literal 4113 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 literal 0 HcmV?d00001 diff --git a/contrib/gitian-downloader/gavinandresen-key.pgp b/contrib/gitian-downloader/gavinandresen-key.pgp new file mode 100644 index 0000000000000000000000000000000000000000..f81f44e874707837c13446858db2fed14ad5c501 GIT binary patch literal 1176 zcmV;J1ZVr10ipyd+BPOXG1ZrDpv%iXyY*~=|+SlmVRJ2@d|5G=3lw%C&g;j0KvRW zG0RVD!3nRuh%R)pia&~L1FEOGx;eXR*K` zu*WO05N?XC!C+-X<8ovFvIpC&fxEyfX(2{j!G#JZ7?CU%mrw)$TSGNqq(L>S_EMhm z>C$tB193UkB)z)vhMWgbGCTvPxP}Kfdx0GIl8t06ZPII(&3kQCzEXv7#M)%vPj{EY zcen(gIU`UxU-nd2`Gon+|B_0Ff*@;+F`bIwREZv?xbmc4=-PL2hJnWpib2AUtPbc4=;5Ze((0b7gKoXKi6=Y%XJO zZ9a%*1QQVg044HzfCdW*2nPcK1Qh}Z0|XWV0|5da0Rk6*0162Z zb%-P{zBtpUe6IkY$jlON2g&-~!PtabhH%KRx;RqM0G%3)n>ot_(%$#C+gXU@atMHu zy_C5E4FpWQvb7Kh0Lyf?4-i~4^f3$`ga{Ay5*wreKf>2lV6ywp8d}7ENW=D%ux6^* zfe_#szOQ3V{y*tz7?DrDyfq@LWFCHCr%@-(h(6PCP!Kw9x74URPC$@TblGE?^C!T- zq8)?0%b0~_Ytjnul$QnT9RS<*D5dmu1n$x{uRAV*zh*N+8p9}Ho%Pe)*0 zMnEdZ`oH?%L4~7A1F_aQ|8Rcjri-TI9EL4W#QMcIXrNTVrH)rvOHg%{!T`G$1?>8K zRy|m)M}%VOrUsN$>#AQvZnPq$teX`yY;D;>tsyDHK5Qtj#S?asN{)W{exHw@bhzOU z9^1V{J3(+Kj{pM&2mgPBEamX!SrHwdYa^4uCaz(-f7?+0M)V2mw#6{WkHkn8b1R-^ zYDL+eN?p#i&&iBy&Go@UU6MyD*c7YSQ3wLLX`?CdU~}FpEb`VEVP6+=?&FSbCm=k@ z&d1&vM(f=F5d18_%WVyD>j@@JhkmOlWQELtPqF$CFI z6&Wk2#X|#%!_kOO1Q-zl01pKMOuVwS0vikk2`>HzfB*^!5Os(oFTOa_s4)oupKEmm q7ky6Gg$kN{t|V0xiYY!|8vvlVg5(~9gx$G(luB9`Z;BnEL2B3d)*1@{ literal 0 HcmV?d00001 diff --git a/contrib/gitian-downloader/laanwj-key.pgp b/contrib/gitian-downloader/laanwj-key.pgp new file mode 100644 index 0000000..5592951 --- /dev/null +++ b/contrib/gitian-downloader/laanwj-key.pgp @@ -0,0 +1,28 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: SKS 1.1.0 + +mQENBE5UtMEBCADOUz2i9l/D8xYINCmfUDnxi+DXvX5LmZ39ZdvsoE+ugO0SRRGdIHEFO2is +0xezX50wXu9aneb+tEqM0BuiLo6VxaXpxrkxHpr6c4jf37SkE/H0qsi/txEUp7337y3+4HMG +lUjiuh802I72p1qusjsKBnmnnR0rwNouTcoDmGUDh7jpKCtzFv+2TR2dRthJn7vmmjq3+bG6 +PYfqoFY1yHrAGT1lrDBULZsQ/NBLI2+J4oo2LYv3GCq8GNnzrovqvTvui50VSROhLrOe58o2 +shE+sjQShAy5wYkPt1R1fQnpfx+5vf+TPnkxVwRb3h5GhCp0YL8XC/BXsd5vM4KlVH2rABEB +AAG0K1dsYWRpbWlyIEouIHZhbiBkZXIgTGFhbiA8bGFhbndqQGdtYWlsLmNvbT6JATgEEwEC +ACIFAk5UtMECGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEHSBCwEjRsmmy6YIAK09 +buNXyYQrJBsX16sXxEhx5QPKyF3uHJDFJv66SdnpvIkNoznsaPiRJkbTANop93FZmaGa6wVn +zGDiz7jPA8Dpxx5aAYPhIT+zPJAdXWM3wJ/Gio9besRNzniai8Lwi5MZ9R/5yFGBobm6/AcN +4sUoqA3NSV2U3I29R0Vwlzo8GVtmyi9ENSi6Oo7AcXNTRt69cxW4nAHkB+amwwDJlcAb31ex +bogYXPhScwqQZixRr+JBkKxBjkTXXnQypT4KI5SegYwQVYfyiZmDP7UHKe/u6pSKKbVphLg8 +xLB5spcXse8/a2+onrbNlw6y8TXiJ++Z54PE7zztWTXf2huakeG5AQ0ETlS0wQEIAMNO3OkP +xoPRKWzBLcI7JRITAW+HNaLTq3uN2+4WxA57DEjbL9EDoAv+7wTkDAL40f0T+xiu6GJcLFjw +GJZu/tYu7+mErHjrdo+K4suCQt7w5EXCBvOLjhW4tyYMzNx8hP+oqzOW9iEC+6VV91+DYeqt +EkJuyVXOI4vzBlTw8uGow8aMMsCq8XVvKUZFTPsjGl197Q5B3A+ZOFCR8xqiqdPjuz6MglVV +oFdDNu3EZn8zkGsQlovXoE9ndVeVzx/XMNmsxFaMYsReUs253RIf1FEfgExID0fg2OnyLCjS +2iFW1RgajS+/saIkKl+N1iuMzJA7wMAM0plhRueOG0MtZSsAEQEAAYkBHwQYAQIACQUCTlS0 +wQIbDAAKCRB0gQsBI0bJpmsDB/4waenn2CvSHXyomykfpwf5lMte1V5LvH3z5R2LY+1NopRv +LSz3iC39x69XWiTbhywDfgafnGPW4pWBOff2/bu5/A6z1Hnan1vyrRRD/hx1uMJ7S6q+bIvZ +iVIg1p0jH6tdIIhwX3cydhdRZHo7e9oSMgOUWsr6Ar59NRo9CENwGPE4U61HXfOnxWdrFWoA +XdwZczBeLxmUy6Vo6sKqv+gE4bqrtAM0sY/MsQ9cU95x+52ox/sq44lQMwd3ZBYUP7B1qbHI +hZSZuch6MLi5scLPeau0ZvCaljiaMeivP5+x0gWPRs0kI+9sZxInbqvrsJ6oOBJM3xYGhtn1 +zZ7qmZR7 +=si/k +-----END PGP PUBLIC KEY BLOCK----- diff --git a/contrib/gitian-downloader/linux-download-config b/contrib/gitian-downloader/linux-download-config new file mode 100644 index 0000000..4c03779 --- /dev/null +++ b/contrib/gitian-downloader/linux-download-config @@ -0,0 +1,42 @@ +--- +name: bitcoin +urls: +- http://bitcoin.org/bitcoin-latest-linux-gitian.zip +rss: +- url: + xpath: //item/link/text() + pattern: bitcoin-\d+.\d+.\d+-linux-gitian.zip +signers: + 0A82509767C7D4A5D14DA2301AE1D35043E08E54: + name: BlueMatt + key: bluematt + BF6273FAEF7CC0BA1F562E50989F6B3048A116B5: + name: Devrandom + key: devrandom + E463A93F5F3117EEDE6C7316BD02942421F4889F: + name: Luke-Jr + key: luke-jr + D762373D24904A3E42F33B08B9A408E71DAAC974: + name: "Pieter Wuille" + key: sipa + 77E72E69DA7EE0A148C06B21B34821D4944DE5F7: + name: tcatm + key: tcatm + 01CDF4627A3B88AAE4A571C87588242FBE38D3A8: + name: "Gavin Andresen" + key: gavinandresen + 71A3B16735405025D447E8F274810B012346C9A6: + name: "Wladimir J. van der Laan" + key: laanwj + AEC1884398647C47413C1C3FB1179EB7347DC10D: + name: "Warren Togami" + key: wtogami + 9692B91BBF0E8D34DFD33B1882C5C009628ECF0C: + name: michagogo + key: michagogo + E944AE667CF960B1004BC32FCA662BE18B877A60: + name: "Andreas Schildbach" + key: aschildbach + C060A6635913D98A3587D7DB1C2491FFEB0EF770: + name: "Cory Fields" + key: "cfields" diff --git a/contrib/gitian-downloader/luke-jr-key.pgp b/contrib/gitian-downloader/luke-jr-key.pgp new file mode 100644 index 0000000000000000000000000000000000000000..3e7095045f0fa4b4cc42d2eb5ba43eee9b44f9b1 GIT binary patch literal 7325 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 literal 0 HcmV?d00001 diff --git a/contrib/gitian-downloader/michagogo-key.pgp b/contrib/gitian-downloader/michagogo-key.pgp new file mode 100644 index 0000000..47bc404 --- /dev/null +++ b/contrib/gitian-downloader/michagogo-key.pgp @@ -0,0 +1,59 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.4.12 (GNU/Linux) + +mQENBFGeqJ4BCADb7SI3/+q93gIvN0AGRg9Mtz73OLIOzCHeeoyn+tp7JcYNzxkQ +9lfeXiEfn72Sh8gHkLtLIqr7HlIMo8DxSS8JPRVjlJGkNyAW4SeEwN2wNa5OV8k0 +N4jBa9a1csFyCyrEkPKvkUpBkQDvNXjNxyEhHwyZqPanKxy6NXIHOJji8ObOMQXI +T9HwJrpjRth3u4uKG968JBTEyAXAmkt0Zidl1Ykgzcedk4mJSE9uZCW8DjSv2wML +XcQz8+dYsoskT3KRdkowLHxAfj1BNyNc1+rKLghliM5vSQWi+Lbhi1Bxh4sY1UwA +lKnAGqrnAGyIvCtkwTq5QI6ufF2ZY44bvVgpABEBAAG0IU1pY2hhZ29nbyA8bWlj +aGFnb2dvQHNlcnZlci5mYWtlPokBOAQTAQIAIgUCUZ6ongIbAwYLCQgHAwIGFQgC +CQoLBBYCAwECHgECF4AACgkQgsXACWKOzwzMUAgAuqUmK10xE5C3lUym2f72z0t6 +a2NM5Wfjr9//Y1/okC36C5XAMEtN2UwckPzzJ5p5D5y5yzwfZq5Jd8Py29VQIMsV +7FbC1a0H3D+bCyX+JJ6FAmUbnWOQ/+mydYc74RvD8iwjePNT6kziZNv6dMGctJTl +0alwjtQYgyGkeYKnIxbcyjHX/IawLUrunb/6mSKun87T8+NM/omfFCTc3l8TakpM +0wyNYRiUkIfUBvB8sDUU3A80qKN/hqRKvlFu3+/kMiAc9ZYQrbmsB+sYWdmM+4zw +8NBw3yuYzWyPuoa4PR5ZmS9F11WLMR5vTRCdLudAqYsWu3LtV6vAIvlOUa2LMLRg +TWljaGFnb2dvIChSZWdpc3RlcmVkIG5pY2sgbWljaGFnb2dvIG9uIGZyZWVub2Rl +IGFzIG9mIE9jdG9iZXIgMTIsIDIwMTMpIDxtaWNoYWdvZ29Ac2VydmVyLmZha2U+ +iQE4BBMBAgAiBQJSWarzAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRCC +xcAJYo7PDA7nB/91wAiaMlU5nHLUu0anhNQbGvUdFgKK1zO90S5KzUdJcY438jcS +UJW1az8l9U9JBRIfPRYVhz/Z1TAJ+dCzD7D8BXHFeGEr0zNOh87ly9aB5du7dpN2 +oSBD6wLcJpqxt4h+XjSS2CX98/2ZIJxXENE2KySaTXP39Xl3eNwvJTUBA4XlcMey +J8KMp/IERli4H0O7vRyLgu3yYpUArTqAonzG1g2lfB35PQJfeInrRSniQ336otnZ +A8qwJ63kfUtWVDRz0g1fnvtiLGPivDJaI5hyIaUeJPaXU1+sg7YNroDu60o2NGZh +F+0IjHlvRfzzA+F9Vw38rpSqR3BmCdjf6Sv3iQEcBBABAgAGBQJSWa9/AAoJEH+r +EUJn5PoE/hgH/1T2dAthVucA/hzY0nl4SMjbg+dzNlYBq00Qwx8DRKVjk5et8+kY +oPI3DGILcr+ELnxNekeMv9WQBBtJanUh1K5ohZ6ohoR7lG18LXf5HCdspflB5Me6 +LMA6iMryEP6gIs9GFuoGe2YQavm58YrkqhcPu34dGN7kdurfEXLvDfVlh5ZbKCsP +Gyd7Pbz04SpqykgK1udiTsLVjc70Xhv+jAMqeaCugDX6TLEwjVmZH/xsyKk2Uh3V +Oib5FXADAtKH+vSqqhFpXrw7R/NaBzvCbas8l61DFHiUg1/bo8vsV8MtGcyZmzXJ +C5Gm0njtGOil/g7JF9siUrpxs9Yyt/h+T2W0W01pY2hhZ29nbyAoVXNlciBhY2Nv +dW50IG1pY2hhZ29nbyBvbiBHaXRodWIgYXMgb2YgT2N0b2JlciAxMiwgMjAxMykg +PG1pY2hhZ29nb0BzZXJ2ZXIuZmFrZT6JATcEEwECACIFAlJZqxkCGwMGCwkIBwMC +BhUIAgkKCwQWAgMBAh4BAheAAAoJEILFwAlijs8M+1AH+IU78ARblqTnJeSl0iWH +mEsg4IBK30Q6/exDAcqOEm1Yc171uw2WnGmIvPYOQqxrRTvj3LoQ816dU6jrj6vY +s+XX0R2hxy7ILh17D/3UKnHcddu7rmc7pNEqZeBXaMughqQaPOWkAIe52+qK5tsl +sWllzTYE4jo29uZ3dAtDcKEJjBo/pIXnu1GOslE1+V4X1H9WDlwrS/JXHzyDQAjt +maPR+3gNesDanhrRmrnT3ZXW2ZVd3vGBibhia8PWUhU1uwOH23ySWXncgsHH0Zad +UMjd4w3YliZP/mLn2ghAxHB70IO7lgAgN3HYZeFoufP3pcK440A+CezfQiRcjHl/ +oIkBHAQQAQIABgUCUlmvfwAKCRB/qxFCZ+T6BOq9CACItsrUZPKGeWSTkMHknMrV +K5vxIXJVCBb+Tppc0Q/J5p4EkW/RFhTwIP2zw8NLDKMh5oO9md4LXhvfIZkqQJFo +6ZtLa3Vf+Kj7uyxezBo4QHA+G7tDsRGaMKVrEMiyLCwS1+hg9VaNzsf7zmQW7mYE +vTLMHp3cVaSU7Mh2Dl8rnAaM/DpTUZQwZ+32Qrb/Z4HSa4f278iqoFpjEbBE2KCr +vT5yEVvpCZ4lwSgA2a+uTlRTvVV6NA/kpsxU64tmhuEOjy+ToDqJ8wv4mqvWZxMv +C6OhfVaXBy3U9gG8aQV0ffXGs+TbCtv8ApHd6E1/AVk0oyZGJaBVrEl688bBIWd/ +uQENBFGeqJ4BCADFmgR7oEGkFFB5qXnuNYFq1nUGDAh0dLNtAD3J6EMxUZEXdmp+ +DQHJw6/eDRQaG9EbjNZheycbVUoI8K2Y/Z268HQueGuIEIJv6cZYXoXdWCbDD4fn +HMNUX2wNlpDqWxb7PNUEtfU9hI3gmHGlr5OiEh3iV06uiZg4n2rbWPbj45m5LJzv +wpCrUA+pLcl9Xjw2cajaSTjdXHk9gvXTCo6s2ZS3/3Q4l+xuzZp1MGNzPQHASMKs +wecSJKkYg6W8I5WsVlPd9a8oQCc/Nfz7BPw31MRVR/SF5FAMqaXx5uLwghVdHB2i +cLURsOtJlCfP8W06gB7yS+MH45Jq/oxBRiJBABEBAAGJAR8EGAECAAkFAlGeqJ4C +GwwACgkQgsXACWKOzwwT4wgAy6ICcnBZ9l2jSu+ldy57F6jf5kpKZgB9NV8V2mMA +NeY1wMQ4VTVpU4t3s4E2LYtGNJNkPQVHbt1Pf4dGPasvMPaHMamgwgyqgYixqs0x +D5PdKzVrfnjwTTr/ZAFdccSPmvy5/hbY0geQ/+mzdbL07+xaT58JIoG5nySDKhmC +VeOvhDZtXMVAhEWBDPEgh/H9sEuBgMgZrzfE1j3q802qiXeQs6WtadWlQ1RN9Iq1 +ZzIi6u9/BifEIRI0pO/WwKOZdXLTemFUoakoe7uT3A74N96t0G9LZVihYbEoO+Pc +5IaHPBV5VLeR3TB1LnnjHVf/Fwi8cnGy50kNWjcbMyEDag== +=jyQ4 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/contrib/gitian-downloader/sipa-key.pgp b/contrib/gitian-downloader/sipa-key.pgp new file mode 100644 index 0000000000000000000000000000000000000000..e56d31d4e7b45d8e8c56f581318ee264eab1e3e1 GIT binary patch literal 109480 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'pMIr=Y0zm9x*Gy{hu97sznPEpu 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

o%8aNss*YVrQKX!>=V!z%8YQ+C2;5;9r1u7 zG9UYyEEA%Up2o%6_*B*^_q!habM|2kl!vk0J~KLRBJ?fJoZ)-^uWxK+_}PL8C-6u6 z#x|`T(f5>2b&au>j&AO;b^5AaZw zS_2#|)T*hrzK+H*LHsz!|6K?Ku&VUx#NdeA@N5NXFT>aIOjxF zy4whds0=Oq(@2 zz5C0o8+C^w{_b)@?4r`gwi%FXMnpT2F%#BQYsG;hiPIg))5Y|!x1ZJex)A$MiNNX( zq6&=I<&6kZI1wW|8o{H$=I*P|T^9^$R+XKtQ`SnvhEOJ;uhQjn2CWkmj_^7`Aa3c- z8Zs}@d#(_b{reL%xnIYqQg<&4Shq?0ZMJt4#E_eu1;rw?zks%bLEvhXHQt|~VCQuq z&A-#OrVqAfk)-lg}vy7 zYs{BAGW}t+Bct766}J4~uIL-c)@4fnX~wI?{tt{!6ZM`1wc=GKOA;;?`>n3icWB0G zn*||8j}j?7(5Ob(-PQ-uJThqd2@S1uW*w1X-|9A4-%6Qux^GMLljXjQ)sN@kpv?VO z)UkLWhmj->gnz;q!4owp@2yD~e{+z0Gz?Wg#-nKk+Qh}dVfq|kPnBUdp-;hvz)x2t zD?{SnDzor5MGJ>X13OouOQ(XXjf?e%bQ%eENi%61!fX|rVS*-fUgk}jZXdQS*=pu7 zn*l%)vEtxtnsfe78h_1@2}w%6!25|yQBmC1DEcXumbL82v@a7>)Mz3#h|4L`WPlN(+95yvu#{C!>gm(Nv!S*Yv%^(qS9*ha8g`_+-5KMB1k7w}O?nKX_$dgx0zKT> zsK@?(;%%efAn>h*Z*5Z>_ERN@VpIEg)VY;7&-da56_Nt)d)n(s{^moqKbzg#(kvLW z_g3p9;|WwT=QceTow#FuTvuyb#6|7txyOiS%w#V=}?{wnLKuU3K z)LKWy{tfcIT~3<;zL)*5y45%&9BU728+bn0YHD;;MHsu8*-lKYQs(yGsc3#7XH3FF z)6ZNg<)%-4Jo9KihD(yQ2p@45F;h{7b%utDjKt-eDI`%@T2fxC!k6(j540(SjvdEY z&4sPj$l9*nt{0{Ksm2XXNloeRVl7wfZyz{W@(szDaGi^F^8SE`Mg86EWbj@=+3$sw z5CVQYJU~ud2m(0|CjFY5huQFyjG2;4Ye>`;Or>jAW`VBfSSCzgV_T@{G&oZG zMZ&q+CGm;Gb?Vy`__|_oh6ILLkb2J~@O-;TLScpzuRgCrq~`N8>#L#y{$+GFo~DN* zIi%T&4(?=Dgd6kV_SqzM&HYCc@^&t@&q)T@niB6VT*F0pG7n11dnBi@v SyHEabV7`Cld{4j"$filename" + fi +done +echo "Building ${SDKNAME}.tar.gz ..." +MTIME="$(istat "${HFSFILENAME}" "${SDKDIRINODE}" | perl -nle 'm/Content Modified:\s+(.*?)\s\(/ && print $1')" +find "${SDKNAME}" | sort | tar --no-recursion --mtime="${MTIME}" --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > "${SDKNAME}.tar.gz" +echo 'All done!' + diff --git a/contrib/macdeploy/fancy.plist b/contrib/macdeploy/fancy.plist index cc9fd3e..dfc36ec 100755 --- a/contrib/macdeploy/fancy.plist +++ b/contrib/macdeploy/fancy.plist @@ -22,7 +22,7 @@ 370 156 - OHMC-Qt.app + Ohmcoin-Qt.app 128 156 diff --git a/contrib/macdeploy/libboost_system-mt.dylib b/contrib/macdeploy/libboost_system-mt.dylib deleted file mode 100755 index f3492dd62c012c9edb5043e701c10df93861194d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24972 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 3: print("Copied Contents:", fromContentsDir) print(" to:", toContentsDir) @@ -340,7 +339,7 @@ def deployFrameworks(frameworks, bundlePath, binaryPath, strip, verbose, deploym # install_name_tool the new id into the binary changeInstallName(framework.installName, framework.deployedInstallName, binaryPath, verbose) - # Copy farmework to app bundle. + # Copy framework to app bundle. deployedBinaryPath = copyFramework(framework, bundlePath, verbose) # Skip the rest if already was deployed. if deployedBinaryPath is None: @@ -352,7 +351,7 @@ def deployFrameworks(frameworks, bundlePath, binaryPath, strip, verbose, deploym # install_name_tool it a new id. changeIdentification(framework.deployedInstallName, deployedBinaryPath, verbose) # Check for framework dependencies - dependencies = getFrameworks(deployedBinaryPath, verbose) + dependencies = getFrameworks(framework.sourceFilePath, verbose) for dependency in dependencies: changeInstallName(dependency.installName, dependency.deployedInstallName, deployedBinaryPath, verbose) @@ -492,7 +491,7 @@ ap.add_argument("-no-strip", dest="strip", action="store_false", default=True, h ap.add_argument("-sign", dest="sign", action="store_true", default=False, help="sign .app bundle with codesign tool") ap.add_argument("-dmg", nargs="?", const="", metavar="basename", help="create a .dmg disk image; if basename is not specified, a camel-cased version of the app name is used") ap.add_argument("-fancy", nargs=1, metavar="plist", default=[], help="make a fancy looking disk image using the given plist file with instructions; requires -dmg to work") -ap.add_argument("-add-qt-tr", nargs=1, metavar="languages", default=[], help="add Qt translation files to the bundle's ressources; the language list must be separated with commas, not with whitespace") +ap.add_argument("-add-qt-tr", nargs=1, metavar="languages", default=[], help="add Qt translation files to the bundle's resources; the language list must be separated with commas, not with whitespace") ap.add_argument("-translations-dir", nargs=1, metavar="path", default=None, help="Path to Qt's translation files") ap.add_argument("-add-resources", nargs="+", metavar="path", default=[], help="list of additional files or folders to be copied into the bundle's resources; must be the last argument") ap.add_argument("-volname", nargs=1, metavar="volname", default=[], help="custom volume name for dmg") @@ -604,7 +603,7 @@ else: # ------------------------------------------------ -target = os.path.join("dist", "OHMC-Qt.app") +target = os.path.join("dist", "Ohmcoin-Qt.app") if verbose >= 2: print("+ Copying source bundle +") @@ -675,9 +674,8 @@ else: if verbose >= 2: print("+ Installing qt.conf +") -f = open(os.path.join(applicationBundle.resourcesPath, "qt.conf"), "wb") -f.write(qt_conf.encode()) -f.close() +with open(os.path.join(applicationBundle.resourcesPath, "qt.conf"), "wb") as f: + f.write(qt_conf.encode()) # ------------------------------------------------ @@ -695,7 +693,7 @@ if len(config.add_resources) > 0 and verbose >= 2: print("+ Adding additional resources +") for p in config.add_resources: - t = os.path.join(applicationBundle.path, "Contents", "Frameworks") + t = os.path.join(applicationBundle.resourcesPath, os.path.basename(p)) if verbose >= 3: print(p, "->", t) if os.path.isdir(p): diff --git a/contrib/ohmc-qt.pro b/contrib/ohmcoin-qt.pro old mode 100755 new mode 100644 similarity index 92% rename from contrib/ohmc-qt.pro rename to contrib/ohmcoin-qt.pro index 9bfa4ab..dc3e675 --- a/contrib/ohmc-qt.pro +++ b/contrib/ohmcoin-qt.pro @@ -10,6 +10,7 @@ DEPENDPATH += . \ src \ src/compat \ src/config \ + src/consensus \ src/crypto \ src/json \ src/obj \ @@ -28,6 +29,8 @@ DEPENDPATH += . \ src/qt/test \ src/secp256k1/include \ src/secp256k1/src \ + src/support \ + src/support/allocators \ src/test/data \ src/leveldb/doc/bench \ src/leveldb/helpers/memenv \ @@ -47,8 +50,11 @@ INCLUDEPATH += . \ src/qt \ src/qt/forms \ src/compat \ + src/consensus \ src/secp256k1/include \ src/leveldb/helpers/memenv \ + src/support \ + src/support/allocators \ src/test/data \ src/test \ src/qt/test \ @@ -62,6 +68,7 @@ HEADERS += src/activekarmanode.h \ src/allocators.h \ src/amount.h \ src/base58.h \ + src/bech32.h \ src/bloom.h \ src/chain.h \ src/chainparams.h \ @@ -76,9 +83,9 @@ HEADERS += src/activekarmanode.h \ src/compressor.h \ src/core_io.h \ src/crypter.h \ - src/privatesend-relay.h \ - src/privatesend.h \ - src/ohmc-config.h \ + src/obfuscation-relay.h \ + src/obfuscation.h \ + src/ohmcoin-config.h \ src/db.h \ src/eccryptoverify.h \ src/ecwrapper.h \ @@ -113,6 +120,8 @@ HEADERS += src/activekarmanode.h \ src/serialize.h \ src/spork.h \ src/streams.h \ + src/support/allocators/zeroafterfree.h \ + src/support/cleanse.h \ src/sync.h \ src/threadsafety.h \ src/timedata.h \ @@ -130,8 +139,11 @@ HEADERS += src/activekarmanode.h \ src/wallet.h \ src/wallet_ismine.h \ src/walletdb.h \ + src/validationinterface.h \ src/compat/sanity.h \ - src/config/ohmc-config.h \ + src/consensus/merkle.h \ + src/consensus/validation.h \ + src/config/ohmcoin-config.h \ src/crypto/common.h \ src/crypto/hmac_sha256.h \ src/crypto/hmac_sha512.h \ @@ -175,7 +187,7 @@ HEADERS += src/activekarmanode.h \ src/qt/coincontroldialog.h \ src/qt/coincontroltreewidget.h \ src/qt/csvmodelwriter.h \ - src/qt/privatesendconfig.h \ + src/qt/obfuscationconfig.h \ src/qt/editaddressdialog.h \ src/qt/guiconstants.h \ src/qt/guiutil.h \ @@ -333,7 +345,7 @@ HEADERS += src/activekarmanode.h \ src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h \ src/crypto/aes_helper.c \ src/qt/bitcoinamountfield.moc \ - src/qt/ohmc.moc \ + src/qt/ohmcoin.moc \ src/qt/intro.moc \ src/qt/overviewpage.moc \ src/qt/rpcconsole.moc \ @@ -341,7 +353,7 @@ HEADERS += src/activekarmanode.h \ FORMS += src/qt/forms/addressbookpage.ui \ src/qt/forms/askpassphrasedialog.ui \ src/qt/forms/coincontroldialog.ui \ - src/qt/forms/privatesendconfig.ui \ + src/qt/forms/obfuscationconfig.ui \ src/qt/forms/editaddressdialog.ui \ src/qt/forms/helpmessagedialog.ui \ src/qt/forms/intro.ui \ @@ -361,6 +373,7 @@ SOURCES += src/activekarmanode.cpp \ src/allocators.cpp \ src/amount.cpp \ src/base58.cpp \ + src/bech32.cpp \ src/bloom.cpp \ src/chain.cpp \ src/chainparams.cpp \ @@ -372,11 +385,11 @@ SOURCES += src/activekarmanode.cpp \ src/core_read.cpp \ src/core_write.cpp \ src/crypter.cpp \ - src/privatesend-relay.cpp \ - src/privatesend.cpp \ - src/ohmc-cli.cpp \ - src/ohmc-tx.cpp \ - src/ohmc.cpp \ + src/obfuscation-relay.cpp \ + src/obfuscation.cpp \ + src/ohmcoin-cli.cpp \ + src/ohmcoin-tx.cpp \ + src/ohmcoin.cpp \ src/db.cpp \ src/eccryptoverify.cpp \ src/ecwrapper.cpp \ @@ -418,6 +431,7 @@ SOURCES += src/activekarmanode.cpp \ src/rpcserver.cpp \ src/rpcwallet.cpp \ src/spork.cpp \ + src/support/cleanse.cpp \ src/sync.cpp \ src/timedata.cpp \ src/txdb.cpp \ @@ -430,6 +444,8 @@ SOURCES += src/activekarmanode.cpp \ src/wallet.cpp \ src/wallet_ismine.cpp \ src/walletdb.cpp \ + src/validationinterface.cpp \ + src/consensus/merkle.cpp \ src/compat/glibc_compat.cpp \ src/compat/glibc_sanity.cpp \ src/compat/glibcxx_compat.cpp \ @@ -470,9 +486,9 @@ SOURCES += src/activekarmanode.cpp \ src/qt/coincontroldialog.cpp \ src/qt/coincontroltreewidget.cpp \ src/qt/csvmodelwriter.cpp \ - src/qt/privatesendconfig.cpp \ - src/qt/ohmc.cpp \ - src/qt/ohmcstrings.cpp \ + src/qt/obfuscationconfig.cpp \ + src/qt/ohmcoin.cpp \ + src/qt/ohmcoinstrings.cpp \ src/qt/editaddressdialog.cpp \ src/qt/guiutil.cpp \ src/qt/intro.cpp \ @@ -541,16 +557,16 @@ SOURCES += src/activekarmanode.cpp \ src/test/netbase_tests.cpp \ src/test/pmt_tests.cpp \ src/test/rpc_tests.cpp \ - src/test/rpc_wallet_tests.cpp \ src/test/sanity_tests.cpp \ src/test/script_P2SH_tests.cpp \ src/test/script_tests.cpp \ + src/test/script_standard_tests.cpp \ src/test/scriptnum_tests.cpp \ src/test/serialize_tests.cpp \ src/test/sighash_tests.cpp \ src/test/sigopcount_tests.cpp \ src/test/skiplist_tests.cpp \ - src/test/test_ohmc.cpp \ + src/test/test_ohmcoin.cpp \ src/test/timedata_tests.cpp \ src/test/transaction_tests.cpp \ src/test/uint256_tests.cpp \ @@ -641,21 +657,21 @@ SOURCES += src/activekarmanode.cpp \ src/leveldb/helpers/memenv/memenv.cc \ src/leveldb/helpers/memenv/memenv_test.cc \ src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c -RESOURCES += src/qt/ohmc.qrc src/qt/ohmc_locale.qrc +RESOURCES += src/qt/ohmcoin.qrc src/qt/ohmcoin_locale.qrc -TRANSLATIONS += src/qt/locale/ohmc_bg.ts \ - src/qt/locale/ohmc_de.ts \ - src/qt/locale/ohmc_en.ts \ - src/qt/locale/ohmc_es.ts \ - src/qt/locale/ohmc_fi.ts \ - src/qt/locale/ohmc_fr.ts \ - src/qt/locale/ohmc_it.ts \ - src/qt/locale/ohmc_ja.ts \ - src/qt/locale/ohmc_pl.ts \ - src/qt/locale/ohmc_pt.ts \ - src/qt/locale/ohmc_ru.ts \ - src/qt/locale/ohmc_sk.ts \ - src/qt/locale/ohmc_sv.ts \ - src/qt/locale/ohmc_vi.ts \ - src/qt/locale/ohmc_zh_CN.ts \ - src/qt/locale/ohmc_zh_TW.ts +TRANSLATIONS += src/qt/locale/ohmcoin_bg.ts \ + src/qt/locale/ohmcoin_de.ts \ + src/qt/locale/ohmcoin_en.ts \ + src/qt/locale/ohmcoin_es.ts \ + src/qt/locale/ohmcoin_fi.ts \ + src/qt/locale/ohmcoin_fr.ts \ + src/qt/locale/ohmcoin_it.ts \ + src/qt/locale/ohmcoin_ja.ts \ + src/qt/locale/ohmcoin_pl.ts \ + src/qt/locale/ohmcoin_pt.ts \ + src/qt/locale/ohmcoin_ru.ts \ + src/qt/locale/ohmcoin_sk.ts \ + src/qt/locale/ohmcoin_sv.ts \ + src/qt/locale/ohmcoin_vi.ts \ + src/qt/locale/ohmcoin_zh_CN.ts \ + src/qt/locale/ohmcoin_zh_TW.ts diff --git a/contrib/ohmcd.bash-completion b/contrib/ohmcoind.bash-completion old mode 100755 new mode 100644 similarity index 77% rename from contrib/ohmcd.bash-completion rename to contrib/ohmcoind.bash-completion index 92c6299..c4fbed3 --- a/contrib/ohmcd.bash-completion +++ b/contrib/ohmcoind.bash-completion @@ -1,12 +1,12 @@ -# bash programmable completion for ohmcd(1) and ohmc-cli(1) +# bash programmable completion for ohmcoind(1) and ohmcoin-cli(1) # Copyright (c) 2012,2014 Christian von Roques # Distributed under the MIT/X11 software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. -have ohmcd && { +have ohmcoind && { -# call $ohmcd for RPC -_ohmc_rpc() { +# call $ohmcoind for RPC +_ohmcoin_rpc() { # determine already specified args necessary for RPC local rpcargs=() for i in ${COMP_LINE}; do @@ -16,23 +16,23 @@ _ohmc_rpc() { ;; esac done - $ohmcd "${rpcargs[@]}" "$@" + $ohmcoind "${rpcargs[@]}" "$@" } -# Add ohmc accounts to COMPREPLY -_ohmc_accounts() { +# Add ohmcoin accounts to COMPREPLY +_ohmcoin_accounts() { local accounts - accounts=$(_ohmc_rpc listaccounts | awk '/".*"/ { a=$1; gsub(/"/, "", a); print a}') + accounts=$(_ohmcoin_rpc listaccounts | awk '/".*"/ { a=$1; gsub(/"/, "", a); print a}') COMPREPLY=( "${COMPREPLY[@]}" $( compgen -W "$accounts" -- "$cur" ) ) } -_ohmcd() { +_ohmcoind() { local cur prev words=() cword - local ohmcd + local ohmcoind - # save and use original argument to invoke ohmcd - # ohmcd might not be in $PATH - ohmcd="$1" + # save and use original argument to invoke ohmcoind + # ohmcoind might not be in $PATH + ohmcoind="$1" COMPREPLY=() _get_comp_words_by_ref -n = cur prev words cword @@ -53,10 +53,10 @@ _ohmcd() { if ((cword > 3)); then case ${words[cword-3]} in addmultisigaddress) - _ohmc_accounts + _ohmcoin_accounts return 0 ;; - getbalance|gettxout|importaddress|importprivkey|listreceivedbyaccount|listreceivedbyaddress|listsinceblock) + getbalance|gettxout|importaddress|importprivkey|listreceivedbyaccount|listreceivedbyaddress|listsinceblock|importpubkey) COMPREPLY=( $( compgen -W "true false" -- "$cur" ) ) return 0 ;; @@ -74,14 +74,14 @@ _ohmcd() { return 0 ;; move|setaccount) - _ohmc_accounts + _ohmcoin_accounts return 0 ;; esac fi case "$prev" in - backupwallet|dumpwallet|importwallet) + backupwallet|dumpwallet|dumpallprivatekeys|importwallet) _filedir return 0 ;; @@ -90,13 +90,13 @@ _ohmcd() { return 0 ;; getaccountaddress|getaddressesbyaccount|getbalance|getnewaddress|getreceivedbyaccount|listtransactions|move|sendfrom|sendmany) - _ohmc_accounts + _ohmcoin_accounts return 0 ;; esac case "$cur" in - -conf=*|-pid=*|-loadblock=*|-wallet=*|-rpcsslcertificatechainfile=*|-rpcsslprivatekeyfile=*) + -conf=*|-pid=*|-loadblock=*|-wallet=*) cur="${cur#*=}" _filedir return 0 @@ -114,12 +114,12 @@ _ohmcd() { # only parse --help if senseful if [[ -z "$cur" || "$cur" =~ ^- ]]; then - helpopts=$($ohmcd --help 2>&1 | awk '$1 ~ /^-/ { sub(/=.*/, "="); print $1 }' ) + helpopts=$($ohmcoind --help 2>&1 | awk '$1 ~ /^-/ { sub(/=.*/, "="); print $1 }' ) fi # only parse help if senseful if [[ -z "$cur" || "$cur" =~ ^[a-z] ]]; then - commands=$(_ohmc_rpc help 2>/dev/null | awk '$1 ~ /^[a-z]/ { print $1; }') + commands=$(_ohmcoin_rpc help 2>/dev/null | awk '$1 ~ /^[a-z]/ { print $1; }') fi COMPREPLY=( $( compgen -W "$helpopts $commands" -- "$cur" ) ) @@ -133,7 +133,7 @@ _ohmcd() { esac } -complete -F _ohmcd ohmcd ohmc-cli +complete -F _ohmcoind ohmcoind ohmcoin-cli } # Local variables: diff --git a/contrib/qos/README.md b/contrib/qos/README.md index 6f9409b..297a5a4 100755 --- a/contrib/qos/README.md +++ b/contrib/qos/README.md @@ -2,4 +2,4 @@ This is a Linux bash script that will set up tc to limit the outgoing bandwidth for connections to the Bitcoin network. It limits outbound TCP traffic with a source or destination port of 52020, but not if the destination IP is within a LAN (defined as 192.168.x.x). -This means one can have an always-on ohmcd instance running, and another local ohmcd/ohmc-qt instance which connects to this node and receives blocks from it. +This means one can have an always-on ohmcoind instance running, and another local ohmcoind/ohmcoin-qt instance which connects to this node and receives blocks from it. diff --git a/contrib/seeds/README.md b/contrib/seeds/README.md index 4dd8c6b..6a19363 100755 --- a/contrib/seeds/README.md +++ b/contrib/seeds/README.md @@ -8,7 +8,7 @@ and remove old versions as necessary. The seeds compiled into the release are created from fuzzbawls' DNS seed data, like this: - curl -s http://seeder.fuzzbawls.pw/ohmc-mainnet.txt > seeds_main.txt + curl -s http://seeder.fuzzbawls.pw/ohmcoin-mainnet.txt > seeds_main.txt python3 makeseeds.py < seeds_main.txt > nodes_main.txt python3 generate-seeds.py . > ../../src/chainparamsseeds.h diff --git a/contrib/seeds/generate-seeds.py b/contrib/seeds/generate-seeds.py index 4186616..e2e9fc5 100755 --- a/contrib/seeds/generate-seeds.py +++ b/contrib/seeds/generate-seeds.py @@ -130,7 +130,7 @@ def main(): process_nodes(g, f, 'pnSeed6_main', 52020) g.write('\n') with open(os.path.join(indir,'nodes_test.txt'),'r') as f: - process_nodes(g, f, 'pnSeed6_test', 51474) + process_nodes(g, f, 'pnSeed6_test', 11773) g.write('#endif // BITCOIN_CHAINPARAMSSEEDS_H\n') if __name__ == '__main__': diff --git a/contrib/seeds/makeseeds.py b/contrib/seeds/makeseeds.py index f0986f9..d224899 100755 --- a/contrib/seeds/makeseeds.py +++ b/contrib/seeds/makeseeds.py @@ -26,7 +26,7 @@ PATTERN_IPV4 = re.compile(r"^((\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})):(\d+)$") PATTERN_IPV6 = re.compile(r"^\[([0-9a-z:]+)\]:(\d+)$") PATTERN_ONION = re.compile(r"^([abcdefghijklmnopqrstuvwxyz234567]{16}\.onion):(\d+)$") -PATTERN_AGENT = re.compile(r"^(/OHMCCore:2.3.1(0|1|99)/)$") +PATTERN_AGENT = re.compile(r"^(/OhmcoinCore:2.2.(0|1|99)/)$") def parseline(line): sline = line.split() diff --git a/contrib/seeds/nodes_main.txt b/contrib/seeds/nodes_main.txt new file mode 100644 index 0000000..6bea6f6 --- /dev/null +++ b/contrib/seeds/nodes_main.txt @@ -0,0 +1,2 @@ +165.227.48.201:52020 +89.222.233.222:52020 diff --git a/contrib/seeds/nodes_test.txt b/contrib/seeds/nodes_test.txt new file mode 100644 index 0000000..02d694c --- /dev/null +++ b/contrib/seeds/nodes_test.txt @@ -0,0 +1,20 @@ +173.212.195.161:11773 +173.212.195.161:11773 +149.28.114.108:11773 +159.203.25.99:11773 +144.202.51.100:11773 +[2604:a880:cad:d0:2044::1]:11773 +[2604:a880:cad:d0:2044::2]:11773 +[2604:a880:cad:d0:2044::3]:11773 +[2604:a880:cad:d0:2044::4]:11773 +[2604:a880:cad:d0:2044::5]:11773 +[2001:19f0:5c01:1d24:2011::1]:11773 +[2001:19f0:5c01:1d24:2011::2]:11773 +[2001:19f0:5c01:1d24:2011::3]:11773 +[2001:19f0:5c01:1d24:2011::4]:11773 +[2001:19f0:5c01:1d24:2011::5]:11773 +[2001:19f0:5c01:1d81:2044::1]:11773 +[2001:19f0:5c01:1d81:2044::2]:11773 +[2001:19f0:5c01:1d81:2044::3]:11773 +[2001:19f0:5c01:1d81:2044::4]:11773 +[2001:19f0:5c01:1d81:2044::5]:11773 diff --git a/contrib/spendfrom/README.md b/contrib/spendfrom/README.md index 63066ea..5c50d68 100755 --- a/contrib/spendfrom/README.md +++ b/contrib/spendfrom/README.md @@ -7,7 +7,7 @@ address (or addresses). Depends on [jsonrpc](http://json-rpc.org/). spendfrom.py --from=FROMADDRESS1[,FROMADDRESS2] --to=TOADDRESS --amount=amount \ - --fee=fee --datadir=/path/to/.ohmc --testnet --dry_run + --fee=fee --datadir=/path/to/.ohmcoin --testnet --dry_run With no arguments, outputs a list of amounts associated with addresses. @@ -16,7 +16,7 @@ With arguments, sends coins received by the `FROMADDRESS` addresses to the `TOAD ### Notes ### - You may explicitly specify how much fee to pay (a fee more than 1% of the amount -will fail, though, to prevent ohmc-losing accidents). Spendfrom may fail if +will fail, though, to prevent ohmcoin-losing accidents). Spendfrom may fail if it thinks the transaction would never be confirmed (if the amount being sent is too small, or if the transaction is too many bytes for the fee). diff --git a/contrib/spendfrom/spendfrom.py b/contrib/spendfrom/spendfrom.py index 5c27a55..3a8f815 100755 --- a/contrib/spendfrom/spendfrom.py +++ b/contrib/spendfrom/spendfrom.py @@ -7,7 +7,7 @@ # spendfrom.py # Lists available funds # spendfrom.py --from=ADDRESS --to=ADDRESS --amount=11.00 # -# Assumes it will talk to a ohmcd or ohmc-Qt running +# Assumes it will talk to a ohmcoind or ohmcoin-Qt running # on localhost. # # Depends on jsonrpc @@ -33,15 +33,15 @@ def check_json_precision(): raise RuntimeError("JSON encode/decode loses precision") def determine_db_dir(): - """Return the default location of the ohmc data directory""" + """Return the default location of the ohmcoin data directory""" if platform.system() == "Darwin": - return os.path.expanduser("~/Library/Application Support/OHMC/") + return os.path.expanduser("~/Library/Application Support/Ohmcoin/") elif platform.system() == "Windows": - return os.path.join(os.environ['APPDATA'], "OHMC") - return os.path.expanduser("~/.ohmc") + return os.path.join(os.environ['APPDATA'], "Ohmcoin") + return os.path.expanduser("~/.ohmcoin") def read_bitcoin_config(dbdir): - """Read the ohmc.conf file from dbdir, returns dictionary of settings""" + """Read the ohmcoin.conf file from dbdir, returns dictionary of settings""" from ConfigParser import SafeConfigParser class FakeSecHead(object): @@ -59,20 +59,20 @@ def readline(self): return s config_parser = SafeConfigParser() - config_parser.readfp(FakeSecHead(open(os.path.join(dbdir, "ohmc.conf")))) + config_parser.readfp(FakeSecHead(open(os.path.join(dbdir, "ohmcoin.conf")))) return dict(config_parser.items("all")) def connect_JSON(config): - """Connect to a ohmc JSON-RPC server""" + """Connect to a ohmcoin JSON-RPC server""" testnet = config.get('testnet', '0') testnet = (int(testnet) > 0) # 0/1 in config file, convert to True/False if not 'rpcport' in config: - config['rpcport'] = 51475 if testnet else 52021 + config['rpcport'] = 11774 if testnet else 11772 connect = "http://%s:%s@127.0.0.1:%s"%(config['rpcuser'], config['rpcpassword'], config['rpcport']) try: result = ServiceProxy(connect) # ServiceProxy is lazy-connect, so send an RPC command mostly to catch connection errors, - # but also make sure the ohmcd we're talking to is/isn't testnet: + # but also make sure the ohmcoind we're talking to is/isn't testnet: if result.getmininginfo()['testnet'] != testnet: sys.stderr.write("RPC server at "+connect+" testnet setting mismatch\n") sys.exit(1) @@ -81,36 +81,36 @@ def connect_JSON(config): sys.stderr.write("Error connecting to RPC server at "+connect+"\n") sys.exit(1) -def unlock_wallet(ohmcd): - info = ohmcd.getinfo() +def unlock_wallet(ohmcoind): + info = ohmcoind.getinfo() if 'unlocked_until' not in info: return True # wallet is not encrypted t = int(info['unlocked_until']) if t <= time.time(): try: passphrase = getpass.getpass("Wallet is locked; enter passphrase: ") - ohmcd.walletpassphrase(passphrase, 5) + ohmcoind.walletpassphrase(passphrase, 5) except: sys.stderr.write("Wrong passphrase\n") - info = ohmcd.getinfo() + info = ohmcoind.getinfo() return int(info['unlocked_until']) > time.time() -def list_available(ohmcd): +def list_available(ohmcoind): address_summary = dict() address_to_account = dict() - for info in ohmcd.listreceivedbyaddress(0): + for info in ohmcoind.listreceivedbyaddress(0): address_to_account[info["address"]] = info["account"] - unspent = ohmcd.listunspent(0) + unspent = ohmcoind.listunspent(0) for output in unspent: # listunspent doesn't give addresses, so: - rawtx = ohmcd.getrawtransaction(output['txid'], 1) + rawtx = ohmcoind.getrawtransaction(output['txid'], 1) vout = rawtx["vout"][output['vout']] pk = vout["scriptPubKey"] - # This code only deals with ordinary pay-to-ohmc-address + # This code only deals with ordinary pay-to-ohmcoin-address # or pay-to-script-hash outputs right now; anything exotic is ignored. if pk["type"] != "pubkeyhash" and pk["type"] != "scripthash": continue @@ -139,8 +139,8 @@ def select_coins(needed, inputs): n += 1 return (outputs, have-needed) -def create_tx(ohmcd, fromaddresses, toaddress, amount, fee): - all_coins = list_available(ohmcd) +def create_tx(ohmcoind, fromaddresses, toaddress, amount, fee): + all_coins = list_available(ohmcoind) total_available = Decimal("0.0") needed = amount+fee @@ -159,7 +159,7 @@ def create_tx(ohmcd, fromaddresses, toaddress, amount, fee): # Note: # Python's json/jsonrpc modules have inconsistent support for Decimal numbers. # Instead of wrestling with getting json.dumps() (used by jsonrpc) to encode - # Decimals, I'm casting amounts to float before sending them to ohmcd. + # Decimals, I'm casting amounts to float before sending them to ohmcoind. # outputs = { toaddress : float(amount) } (inputs, change_amount) = select_coins(needed, potential_inputs) @@ -170,8 +170,8 @@ def create_tx(ohmcd, fromaddresses, toaddress, amount, fee): else: outputs[change_address] = float(change_amount) - rawtx = ohmcd.createrawtransaction(inputs, outputs) - signed_rawtx = ohmcd.signrawtransaction(rawtx) + rawtx = ohmcoind.createrawtransaction(inputs, outputs) + signed_rawtx = ohmcoind.signrawtransaction(rawtx) if not signed_rawtx["complete"]: sys.stderr.write("signrawtransaction failed\n") sys.exit(1) @@ -179,10 +179,10 @@ def create_tx(ohmcd, fromaddresses, toaddress, amount, fee): return txdata -def compute_amount_in(ohmcd, txinfo): +def compute_amount_in(ohmcoind, txinfo): result = Decimal("0.0") for vin in txinfo['vin']: - in_info = ohmcd.getrawtransaction(vin['txid'], 1) + in_info = ohmcoind.getrawtransaction(vin['txid'], 1) vout = in_info['vout'][vin['vout']] result = result + vout['value'] return result @@ -193,12 +193,12 @@ def compute_amount_out(txinfo): result = result + vout['value'] return result -def sanity_test_fee(ohmcd, txdata_hex, max_fee): +def sanity_test_fee(ohmcoind, txdata_hex, max_fee): class FeeError(RuntimeError): pass try: - txinfo = ohmcd.decoderawtransaction(txdata_hex) - total_in = compute_amount_in(ohmcd, txinfo) + txinfo = ohmcoind.decoderawtransaction(txdata_hex) + total_in = compute_amount_in(ohmcoind, txinfo) total_out = compute_amount_out(txinfo) if total_in-total_out > max_fee: raise FeeError("Rejecting transaction, unreasonable fee of "+str(total_in-total_out)) @@ -229,7 +229,7 @@ def main(): parser.add_option("--fee", dest="fee", default="0.0", help="fee to include") parser.add_option("--datadir", dest="datadir", default=determine_db_dir(), - help="location of ohmc.conf file with RPC username/password (default: %default)") + help="location of ohmcoin.conf file with RPC username/password (default: %default)") parser.add_option("--testnet", dest="testnet", default=False, action="store_true", help="Use the test network") parser.add_option("--dry_run", dest="dry_run", default=False, action="store_true", @@ -240,10 +240,10 @@ def main(): check_json_precision() config = read_bitcoin_config(options.datadir) if options.testnet: config['testnet'] = True - ohmcd = connect_JSON(config) + ohmcoind = connect_JSON(config) if options.amount is None: - address_summary = list_available(ohmcd) + address_summary = list_available(ohmcoind) for address,info in address_summary.iteritems(): n_transactions = len(info['outputs']) if n_transactions > 1: @@ -253,14 +253,14 @@ def main(): else: fee = Decimal(options.fee) amount = Decimal(options.amount) - while unlock_wallet(ohmcd) == False: + while unlock_wallet(ohmcoind) == False: pass # Keep asking for passphrase until they get it right - txdata = create_tx(ohmcd, options.fromaddresses.split(","), options.to, amount, fee) - sanity_test_fee(ohmcd, txdata, amount*Decimal("0.01")) + txdata = create_tx(ohmcoind, options.fromaddresses.split(","), options.to, amount, fee) + sanity_test_fee(ohmcoind, txdata, amount*Decimal("0.01")) if options.dry_run: print(txdata) else: - txid = ohmcd.sendrawtransaction(txdata) + txid = ohmcoind.sendrawtransaction(txdata) print(txid) if __name__ == '__main__': diff --git a/contrib/testgen/gen_base58_test_vectors.py b/contrib/testgen/gen_base58_test_vectors.py index 5bbd30f..c62a120 100755 --- a/contrib/testgen/gen_base58_test_vectors.py +++ b/contrib/testgen/gen_base58_test_vectors.py @@ -2,7 +2,7 @@ ''' Generate valid and invalid base58 address and private key test vectors. -Usage: +Usage: gen_base58_test_vectors.py valid 50 > ../../src/test/data/base58_keys_valid.json gen_base58_test_vectors.py invalid 50 > ../../src/test/data/base58_keys_invalid.json ''' @@ -15,7 +15,7 @@ from binascii import b2a_hex # key types -PUBKEY_ADDRESS = 30 +PUBKEY_ADDRESS = 55 SCRIPT_ADDRESS = 13 PUBKEY_ADDRESS_TEST = 139 SCRIPT_ADDRESS_TEST = 19 @@ -56,7 +56,7 @@ def gen_valid_vectors(): while True: for template in templates: prefix = str(bytearray(template[0])) - payload = os.urandom(template[1]) + payload = os.urandom(template[1]) suffix = str(bytearray(template[2])) rv = b58encode_chk(prefix + payload + suffix) assert is_valid(rv) @@ -69,12 +69,12 @@ def gen_invalid_vector(template, corrupt_prefix, randomize_payload_size, corrupt prefix = os.urandom(1) else: prefix = str(bytearray(template[0])) - + if randomize_payload_size: payload = os.urandom(max(int(random.expovariate(0.5)), 50)) else: payload = os.urandom(template[1]) - + if corrupt_suffix: suffix = os.urandom(len(template[2])) else: @@ -119,7 +119,7 @@ def gen_invalid_vectors(): count = int(sys.argv[2]) except IndexError: count = 0 - + data = list(islice(uiter(), count)) json.dump(data, sys.stdout, sort_keys=True, indent=4) sys.stdout.write('\n') diff --git a/depends/.gitignore b/depends/.gitignore index 3cb4b9a..6ab1fb2 100755 --- a/depends/.gitignore +++ b/depends/.gitignore @@ -8,3 +8,5 @@ i686* mips* arm* aarch64* +!patches/** +!Makefile \ No newline at end of file diff --git a/depends/Makefile b/depends/Makefile index dedb067..0ddd348 100644 --- a/depends/Makefile +++ b/depends/Makefile @@ -134,6 +134,7 @@ $(host_prefix)/share/config.site : config.site.in $(host_prefix)/.stamp_$(final_ -e 's|@CXXFLAGS@|$(strip $(host_CXXFLAGS) $(host_$(release_type)_CXXFLAGS))|' \ -e 's|@CPPFLAGS@|$(strip $(host_CPPFLAGS) $(host_$(release_type)_CPPFLAGS))|' \ -e 's|@LDFLAGS@|$(strip $(host_LDFLAGS) $(host_$(release_type)_LDFLAGS))|' \ + -e 's|@allow_host_packages@|$(ALLOW_HOST_PACKAGES)|' \ -e 's|@no_qt@|$(NO_QT)|' \ -e 's|@no_wallet@|$(NO_WALLET)|' \ -e 's|@no_upnp@|$(NO_UPNP)|' \ diff --git a/depends/packages/native_comparisontool.mk b/depends/packages/native_comparisontool.mk new file mode 100644 index 0000000..e0ae0ce --- /dev/null +++ b/depends/packages/native_comparisontool.mk @@ -0,0 +1,21 @@ +package=native_comparisontool +$(package)_version=8c6666f +$(package)_download_path=https://github.com/theuni/bitcoind-comparisontool/raw/master +$(package)_file_name=pull-tests-$($(package)_version).jar +$(package)_sha256_hash=a865332b3827abcde684ab79f5f43c083b0b6a4c97ff5508c79f29fee24f11cd +$(package)_install_dirname=BitcoindComparisonTool_jar +$(package)_install_filename=BitcoindComparisonTool.jar + +define $(package)_extract_cmds +endef + +define $(package)_configure_cmds +endef + +define $(package)_build_cmds +endef + +define $(package)_stage_cmds + mkdir -p $($(package)_staging_prefix_dir)/share/$($(package)_install_dirname) && \ + cp $($(package)_source) $($(package)_staging_prefix_dir)/share/$($(package)_install_dirname)/$($(package)_install_filename) +endef diff --git a/depends/packages/native_protobuf.mk b/depends/packages/native_protobuf.mk index ce50b36..260db6f 100755 --- a/depends/packages/native_protobuf.mk +++ b/depends/packages/native_protobuf.mk @@ -1,8 +1,9 @@ package=native_protobuf -$(package)_version=2.6.1 +$(package)_version=3.5.1 $(package)_download_path=https://github.com/google/protobuf/releases/download/v$($(package)_version) -$(package)_file_name=protobuf-$($(package)_version).tar.bz2 -$(package)_sha256_hash=ee445612d544d885ae240ffbcbf9267faa9f593b7b101f21d58beceb92661910 + https://github.com/google/protobuf/releases/download/v3.5.1/protobuf-cpp-3.5.1.tar.gz +$(package)_file_name=protobuf-cpp-$($(package)_version).tar.gz +$(package)_sha256_hash=c28dba8782da2cfea1e11c61d335958c31a9c1bc553063546af9cbe98f204092 define $(package)_set_vars $(package)_config_opts=--disable-shared diff --git a/depends/packages/qt46.mk b/depends/packages/qt46.mk new file mode 100644 index 0000000..8fb30a5 --- /dev/null +++ b/depends/packages/qt46.mk @@ -0,0 +1,66 @@ +PACKAGE=qt46 +$(package)_version=4.6.4 +$(package)_download_path=http://download.qt-project.org/archive/qt/4.6/ +$(package)_file_name=qt-everywhere-opensource-src-$($(package)_version).tar.gz +$(package)_sha256_hash=9ad4d46c721b53a429ed5a2eecfd3c239a9ab566562f183f99d3125f1a234250 +$(package)_dependencies=openssl freetype dbus libX11 xproto libXext libICE libSM +$(package)_patches=stlfix.patch + +define $(package)_set_vars +$(package)_config_opts = -prefix $(host_prefix) -headerdir $(host_prefix)/include/qt4 -bindir $(build_prefix)/bin +$(package)_config_opts += -release -no-separate-debug-info -opensource -confirm-license +$(package)_config_opts += -stl -qt-zlib + +$(package)_config_opts += -nomake examples -nomake tests -nomake tools -nomake translations -nomake demos -nomake docs +$(package)_config_opts += -no-audio-backend -no-glib -no-nis -no-cups -no-iconv -no-gif -no-pch +$(package)_config_opts += -no-xkb -no-xrender -no-xrandr -no-xfixes -no-xcursor -no-xinerama -no-xsync -no-xinput -no-mitshm -no-xshape +$(package)_config_opts += -no-libtiff -no-fontconfig -openssl-linked +$(package)_config_opts += -no-sql-db2 -no-sql-ibase -no-sql-oci -no-sql-tds -no-sql-mysql +$(package)_config_opts += -no-sql-odbc -no-sql-psql -no-sql-sqlite -no-sql-sqlite2 +$(package)_config_opts += -no-xmlpatterns -no-multimedia -no-phonon -no-scripttools -no-declarative +$(package)_config_opts += -no-phonon-backend -no-webkit -no-javascript-jit -no-script +$(package)_config_opts += -no-svg -no-libjpeg -no-libtiff -no-libpng -no-libmng -no-qt3support -no-opengl + +$(package)_config_opts_x86_64_linux += -platform linux-g++-64 +$(package)_config_opts_i686_linux = -platform linux-g++-32 +$(package)_build_env = QT_RCC_TEST=1 +endef + +define $(package)_preprocess_cmds + sed -i.old "s|/include /usr/include||" config.tests/unix/freetype/freetype.pri && \ + sed -i.old "s|src_plugins.depends = src_gui src_sql src_svg|src_plugins.depends = src_gui src_sql|" src/src.pro && \ + sed -i.old "s|\.lower(|\.toLower(|g" src/network/ssl/qsslsocket_openssl.cpp && \ + sed -i.old "s|Key_BackSpace|Key_Backspace|" src/gui/itemviews/qabstractitemview.cpp && \ + sed -i.old "s|/usr/X11R6/lib64|$(host_prefix)/lib|" mkspecs/*/*.conf && \ + sed -i.old "s|/usr/X11R6/lib|$(host_prefix)/lib|" mkspecs/*/*.conf && \ + sed -i.old "s|/usr/X11R6/include|$(host_prefix)/include|" mkspecs/*/*.conf && \ + sed -i.old "s|QMAKE_LFLAGS_SHLIB\t+= -shared|QMAKE_LFLAGS_SHLIB\t+= -shared -Wl,--exclude-libs,ALL|" mkspecs/common/g++.conf && \ + sed -i.old "/SSLv2_client_method/d" src/network/ssl/qsslsocket_openssl.cpp src/network/ssl/qsslsocket_openssl_symbols.cpp && \ + sed -i.old "/SSLv2_server_method/d" src/network/ssl/qsslsocket_openssl.cpp src/network/ssl/qsslsocket_openssl_symbols.cpp && \ + patch -p1 < $($(package)_patch_dir)/stlfix.patch +endef + +define $(package)_config_cmds + export PKG_CONFIG_SYSROOT_DIR=/ && \ + export PKG_CONFIG_LIBDIR=$(host_prefix)/lib/pkgconfig && \ + export PKG_CONFIG_PATH=$(host_prefix)/share/pkgconfig && \ + export CPATH=$(host_prefix)/include && \ + OPENSSL_LIBS='-L$(host_prefix)/lib -lssl -lcrypto' ./configure $($(package)_config_opts) && \ + cd tools/linguist/lrelease; ../../../bin/qmake -o Makefile lrelease.pro +endef + +define $(package)_build_cmds + export CPATH=$(host_prefix)/include && \ + $(MAKE) -C src && \ + $(MAKE) -C tools/linguist/lrelease +endef + +define $(package)_stage_cmds + $(MAKE) -C src INSTALL_ROOT=$($(package)_staging_dir) install && \ + $(MAKE) -C tools/linguist/lrelease INSTALL_ROOT=$($(package)_staging_dir) install +endef + +define $(package)_postprocess_cmds + rm -rf mkspecs/ lib/cmake/ lib/*.prl lib/*.la && \ + find native/bin -type f -exec mv {} {}-qt4 \; +endef diff --git a/depends/patches/native_mac_alias/python3.patch b/depends/patches/native_mac_alias/python3.patch index 41c00e5..6f2f553 100644 --- a/depends/patches/native_mac_alias/python3.patch +++ b/depends/patches/native_mac_alias/python3.patch @@ -1,13 +1,7 @@ diff -dur a/mac_alias/alias.py b/mac_alias/alias.py -<<<<<<< HEAD ---- a/mac_alias/alias.py 2015-10-19 12:12:48.000000000 +0200 -+++ b/mac_alias/alias.py 2016-04-03 12:13:12.037159417 +0200 -@@ -243,10 +243,10 @@ -======= --- a/mac_alias/alias.py +++ b/mac_alias/alias.py @@ -258,10 +258,10 @@ ->>>>>>> buddilla-patch-1 alias = Alias() alias.appinfo = appinfo @@ -20,11 +14,7 @@ diff -dur a/mac_alias/alias.py b/mac_alias/alias.py folder_cnid, cnid, crdate, creator_code, type_code) alias.target.levels_from = levels_from -<<<<<<< HEAD -@@ -261,9 +261,9 @@ -======= @@ -276,9 +276,9 @@ ->>>>>>> buddilla-patch-1 b.read(1) if tag == TAG_CARBON_FOLDER_NAME: @@ -36,11 +26,7 @@ diff -dur a/mac_alias/alias.py b/mac_alias/alias.py value) elif tag == TAG_CARBON_PATH: alias.target.carbon_path = value -<<<<<<< HEAD -@@ -298,9 +298,9 @@ -======= @@ -313,9 +313,9 @@ ->>>>>>> buddilla-patch-1 alias.target.creation_date \ = mac_epoch + datetime.timedelta(seconds=seconds) elif tag == TAG_POSIX_PATH: @@ -52,27 +38,7 @@ diff -dur a/mac_alias/alias.py b/mac_alias/alias.py elif tag == TAG_RECURSIVE_ALIAS_OF_DISK_IMAGE: alias.volume.disk_image_alias = Alias.from_bytes(value) elif tag == TAG_USER_HOME_LENGTH_PREFIX: -<<<<<<< HEAD -@@ -422,13 +422,13 @@ - # (so doing so is ridiculous, and nothing could rely on it). - b.write(struct.pack(b'>h28pI2shI64pII4s4shhI2s10s', - self.target.kind, -- carbon_volname, voldate, -+ carbon_volname, int(voldate), - self.volume.fs_type, - self.volume.disk_type, - self.target.folder_cnid, - carbon_filename, - self.target.cnid, -- crdate, -+ int(crdate), - self.target.creator_code, - self.target.type_code, - self.target.levels_from, -@@ -449,12 +449,12 @@ -======= @@ -467,12 +467,12 @@ ->>>>>>> buddilla-patch-1 b.write(struct.pack(b'>hhQhhQ', TAG_HIGH_RES_VOLUME_CREATION_DATE, diff --git a/depends/patches/zeromq/9114d3957725acd34aa8b8d011585812f3369411.patch b/depends/patches/zeromq/9114d3957725acd34aa8b8d011585812f3369411.patch deleted file mode 100644 index f704b3d..0000000 --- a/depends/patches/zeromq/9114d3957725acd34aa8b8d011585812f3369411.patch +++ /dev/null @@ -1,22 +0,0 @@ -From 9114d3957725acd34aa8b8d011585812f3369411 Mon Sep 17 00:00:00 2001 -From: Jeroen Ooms -Date: Tue, 20 Oct 2015 13:10:38 +0200 -Subject: [PATCH] enable static libraries on mingw - ---- - configure.ac | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/configure.ac b/configure.ac -index 393505b..e92131a 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -265,7 +265,7 @@ case "${host_os}" in - libzmq_dso_visibility="no" - - if test "x$enable_static" = "xyes"; then -- AC_MSG_ERROR([Building static libraries is not supported under MinGW32]) -+ CPPFLAGS="-DZMQ_STATIC" - fi - - # Set FD_SETSIZE to 1024 \ No newline at end of file diff --git a/depends/patches/zeromq/9e6745c12e0b100cd38acecc16ce7db02905e27c.patch b/depends/patches/zeromq/9e6745c12e0b100cd38acecc16ce7db02905e27c.patch deleted file mode 100644 index 9aff2c1..0000000 --- a/depends/patches/zeromq/9e6745c12e0b100cd38acecc16ce7db02905e27c.patch +++ /dev/null @@ -1,22 +0,0 @@ -From 9e6745c12e0b100cd38acecc16ce7db02905e27c Mon Sep 17 00:00:00 2001 -From: David Millard -Date: Tue, 10 May 2016 13:53:53 -0700 -Subject: [PATCH] Fix autotools for static MinGW builds - ---- - configure.ac | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/configure.ac b/configure.ac -index 5a0fa14..def6ea7 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -259,7 +259,7 @@ case "${host_os}" in - libzmq_dso_visibility="no" - - if test "x$enable_static" = "xyes"; then -- CPPFLAGS="-DZMQ_STATIC" -+ CPPFLAGS="-DZMQ_STATIC $CPPFLAGS" - fi - - # Set FD_SETSIZE to 1024 \ No newline at end of file diff --git a/doc/.gitignore b/doc/.gitignore new file mode 100644 index 0000000..cef6e7b --- /dev/null +++ b/doc/.gitignore @@ -0,0 +1 @@ +Doxyfile \ No newline at end of file diff --git a/doc/Doxyfile b/doc/Doxyfile old mode 100755 new mode 100644 index 3c59fe9..e871f7d --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -1,106 +1,122 @@ -# Doxyfile 1.7.4 - -# !!! Invoke doxygen from project root using: -# doxygen doc/Doxyfile +# Doxyfile 1.8.12 # This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. # -# All text after a hash (#) is considered a comment and will be ignored +# All text after a single hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] -# For lists items can also be appended using: +# For lists, items can also be appended using: # TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") +# Values that contain spaces should be placed between quotes (\" \"). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all -# text before the first occurrence of this tag. Doxygen uses libiconv (or the -# iconv built into libc) for the transcoding. See -# http://www.gnu.org/software/libiconv for the list of possible encodings. +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: UTF-8. DOXYFILE_ENCODING = UTF-8 -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. -PROJECT_NAME = OHMC +PROJECT_NAME = "Ohmcoin Core" -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. -PROJECT_NUMBER = 2.2.99 +PROJECT_NUMBER = 1.6.1 # Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer -# a quick idea about the purpose of the project. Keep the description short. +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = "P2P Digital Currency" -# With the PROJECT_LOGO tag one can specify an logo or icon that is -# included in the documentation. The maximum height of the logo should not -# exceed 55 pixels and the maximum width should not exceed 200 pixels. -# Doxygen will copy the logo to the output directory. +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. PROJECT_LOGO = doc/bitcoin_logo_doxygen.png -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. OUTPUT_DIRECTORY = doc/doxygen -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. CREATE_SUBDIRS = NO +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, -# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, -# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English -# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, -# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, -# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. OUTPUT_LANGUAGE = English -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. BRIEF_MEMBER_DESC = YES -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. +# The default value is: YES. REPEAT_BRIEF = YES -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ @@ -117,6 +133,7 @@ ABBREVIATE_BRIEF = "The $name class" \ # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. +# The default value is: NO. ALWAYS_DETAILED_SEC = NO @@ -124,521 +141,678 @@ ALWAYS_DETAILED_SEC = NO # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. +# The default value is: NO. INLINE_INHERITED_MEMB = NO -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. FULL_PATH_NAMES = YES -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. STRIP_FROM_PATH = -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. STRIP_FROM_INC_PATH = -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful if your file system -# doesn't support long names like on DOS, Mac, or CD-ROM. +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. SHORT_NAMES = NO -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like regular Qt-style comments -# (thus requiring an explicit @brief command for a brief description.) +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. JAVADOC_AUTOBRIEF = YES -# If the QT_AUTOBRIEF tag is set to YES then Doxygen will -# interpret the first line (until the first dot) of a Qt-style -# comment as the brief description. If set to NO, the comments -# will behave just like regular Qt-style comments (thus requiring -# an explicit \brief command for a brief description.) +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. QT_AUTOBRIEF = NO -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. MULTILINE_CPP_IS_BRIEF = NO -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. INHERIT_DOCS = YES -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. SEPARATE_MEMBER_PAGES = NO -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. TAB_SIZE = 8 -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n in the value part of an alias to insert newlines. +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. ALIASES = -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -# sources only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. OPTIMIZE_OUTPUT_FOR_C = NO -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java -# sources only. Doxygen will then generate output that is more tailored for -# Java. For instance, namespaces will be presented as packages, qualified -# scopes will look different, etc. +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources only. Doxygen will then generate output that is more tailored for -# Fortran. +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for -# VHDL. +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given extension. -# Doxygen has a built-in mapping, but you can override or extend it using this -# tag. The format is ext=language, where ext is a file extension, and language -# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, -# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make -# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C -# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions -# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: +# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: +# Fortran. In the later case the parser tries to guess whether the code is fixed +# or free formatted code, this is the default for Fortran type files), VHDL. For +# instance to make doxygen treat .inc files as Fortran files (default is PHP), +# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. EXTENSION_MAPPING = +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 0. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 0 + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also makes the inheritance and collaboration +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. +# The default value is: NO. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. +# The default value is: NO. CPP_CLI_SUPPORT = NO -# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. -# Doxygen will parse them like normal C++ but will assume all classes use public -# instead of private inheritance when no explicit protection keyword is present. +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. SIP_SUPPORT = NO -# For Microsoft's IDL there are propget and propput attributes to indicate getter -# and setter methods for a property. Setting this option to YES (the default) -# will make doxygen replace the get and set methods by a property in the -# documentation. This will only work if the methods are indeed getting or -# setting a simple type. If this is not the case, or you want to show the -# methods anyway, you should set this option to NO. +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first +# tag is set to YES then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. +# The default value is: NO. DISTRIBUTE_GROUP_DOC = NO -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. SUBGROUPING = YES -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and -# unions are shown inside the group in which they are included (e.g. using -# @ingroup) instead of on a separate page (for HTML and Man pages) or -# section (for LaTeX and RTF). +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. INLINE_GROUPED_CLASSES = NO -# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum -# is documented as struct, union, or enum with the name of the typedef. So +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically -# be useful for C code in case the coding convention dictates that all compound +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. TYPEDEF_HIDES_STRUCT = NO -# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to -# determine which symbols to keep in memory and which to flush to disk. -# When the cache is full, less often used symbols will be written to disk. -# For small to medium size projects (<1000 input files) the default value is -# probably good enough. For larger projects a too small cache size can cause -# doxygen to be busy swapping symbols to and from disk most of the time -# causing a significant performance penalty. -# If the system has enough physical memory increasing the cache will improve the -# performance by keeping more symbols in memory. Note that the value works on -# a logarithmic scale so increasing the size by one will roughly double the -# memory usage. The cache size is given by this formula: -# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, -# corresponding to a cache size of 2^16 = 65536 symbols - -SYMBOL_CACHE_SIZE = 0 +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. EXTRACT_ALL = YES -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. EXTRACT_PRIVATE = YES -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. EXTRACT_STATIC = NO -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. EXTRACT_LOCAL_CLASSES = YES -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base -# name of the file that contains the anonymous namespace. By default -# anonymous namespaces are hidden. +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. EXTRACT_ANON_NSPACES = NO -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. HIDE_UNDOC_CLASSES = NO -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO, these declarations will be +# included in the documentation. +# The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. HIDE_IN_BODY_DOCS = NO -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. INTERNAL_DOCS = NO -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES, upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. +# The default value is: system dependent. CASE_SENSE_NAMES = NO -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. HIDE_SCOPE_NAMES = NO -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. SHOW_INCLUDE_FILES = YES -# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen -# will list include files with double quotes in the documentation -# rather than with sharp brackets. +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. FORCE_LOCAL_INCLUDES = NO -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. INLINE_INFO = YES -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. SORT_MEMBER_DOCS = YES -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. SORT_BRIEF_DOCS = NO -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen -# will sort the (brief and detailed) documentation of class members so that -# constructors and destructors are listed first. If set to NO (the default) -# the constructors will appear in the respective orders defined by -# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. -# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO -# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. SORT_MEMBERS_CTORS_1ST = NO -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the -# hierarchy of group names into alphabetical order. If set to NO (the default) -# the group names will appear in their defined order. +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. SORT_GROUP_NAMES = NO -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. SORT_BY_SCOPE_NAME = NO -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to -# do proper type resolution of all parameters of a function it will reject a -# match between the prototype and the implementation of a member function even -# if there is only one candidate or it is obvious which candidate to choose -# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen -# will still accept a match between prototype and implementation in such cases. +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. STRICT_PROTO_MATCHING = NO -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. GENERATE_TODOLIST = YES -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. GENERATE_TESTLIST = YES -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. GENERATE_BUGLIST = YES -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. GENERATE_DEPRECATEDLIST= YES -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. ENABLED_SECTIONS = -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or macro consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and macros in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. MAX_INITIALIZER_LINES = 30 -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the # list will mention the files that were used to generate the documentation. +# The default value is: YES. SHOW_USED_FILES = YES -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is NO. - -SHOW_DIRECTORIES = NO - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. -# This will remove the Files entry from the Quick Index and from the -# Folder Tree View (if specified). The default is YES. +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. SHOW_FILES = YES -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the -# Namespaces page. This will remove the Namespaces entry from the Quick Index -# and from the Folder Tree View (if specified). The default is YES. +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the program writes to standard output -# is used as the file version. See the manual for examples. +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. The create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. -# You can optionally specify a file name after the option, if omitted -# DoxygenLayout.xml will be used as the name of the layout file. +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. LAYOUT_FILE = +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + #--------------------------------------------------------------------------- -# configuration options related to warning and progress messages +# Configuration options related to warning and progress messages #--------------------------------------------------------------------------- -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. WARNINGS = YES -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. WARN_IF_UNDOCUMENTED = YES -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. WARN_IF_DOC_ERROR = YES -# The WARN_NO_PARAMDOC option can be enabled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. +# The default value is: NO. WARN_NO_PARAMDOC = NO -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). WARN_LOGFILE = #--------------------------------------------------------------------------- -# configuration options related to the input files +# Configuration options related to the input files #--------------------------------------------------------------------------- -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. INPUT = src # This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is -# also the default input encoding. Doxygen uses libiconv (or the iconv built -# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for -# the list of possible encodings. +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: UTF-8. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh -# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py -# *.f90 *.f *.for *.vhd *.vhdl +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf. FILE_PATTERNS = *.c \ *.cc \ @@ -673,29 +847,37 @@ FILE_PATTERNS = *.c \ *.vhd \ *.vhdl -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. RECURSIVE = YES -# The EXCLUDE tag can be used to specify files and/or directories that should +# The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. -EXCLUDE = src/leveldb src/json src/test /src/qt/test +EXCLUDE = src/leveldb \ + src/json \ + src/test \ + src/qt/test -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. +# The default value is: NO. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* EXCLUDE_PATTERNS = @@ -704,120 +886,178 @@ EXCLUDE_PATTERNS = # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* -EXCLUDE_SYMBOLS = boost google +EXCLUDE_SYMBOLS = boost \ + google -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. EXAMPLE_PATTERNS = * # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. EXAMPLE_RECURSIVE = NO -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. If FILTER_PATTERNS is specified, this tag will be -# ignored. +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty or if -# non of the patterns match the file name, INPUT_FILTER is applied. +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) -# and it is also possible to disable source filtering for a specific pattern -# using *.ext= (so without naming a filter). This option only has effect when -# FILTER_SOURCE_FILES is enabled. +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. FILTER_SOURCE_PATTERNS = +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + #--------------------------------------------------------------------------- -# configuration options related to source browsing +# Configuration options related to source browsing #--------------------------------------------------------------------------- -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. SOURCE_BROWSER = YES -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. INLINE_SOURCES = NO -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. STRIP_CODE_COMMENTS = YES -# If the REFERENCED_BY_RELATION tag is set to YES -# then for each documented function all documented -# functions referencing it will be listed. +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. REFERENCED_BY_RELATION = NO -# If the REFERENCES_RELATION tag is set to YES -# then for each documented function all documented entities -# called/used by that function will be listed. +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. REFERENCES_RELATION = NO -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. Otherwise they will link to the documentation. +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. REFERENCES_LINK_SOURCE = YES -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. USE_HTAGS = NO -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. VERBATIM_HEADERS = YES @@ -825,614 +1065,952 @@ VERBATIM_HEADERS = YES # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. ALPHABETICAL_INDEX = YES -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. COLS_IN_ALPHA_INDEX = 5 -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. IGNORE_PREFIX = #--------------------------------------------------------------------------- -# configuration options related to the HTML output +# Configuration options related to the HTML output #--------------------------------------------------------------------------- -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. GENERATE_HTML = YES -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. HTML_OUTPUT = html -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. HTML_FILE_EXTENSION = .html -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. Note that when using a custom header you are responsible -# for the proper inclusion of any scripts and style sheets that doxygen -# needs, which is dependent on the configuration options used. -# It is adviced to generate a default header using "doxygen -w html -# header.html footer.html stylesheet.css YourConfigFile" and then modify -# that header. Note that the header is subject to change so you typically -# have to redo this when upgrading to a newer version of doxygen or when -# changing the value of configuration settings such as GENERATE_TREEVIEW! +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. HTML_HEADER = -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. HTML_FOOTER = -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. HTML_STYLESHEET = +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the -# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that -# the files will be copied as-is; there are no commands or markers available. +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_FILES = -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. -# Doxygen will adjust the colors in the stylesheet and background images -# according to this color. Hue is specified as an angle on a colorwheel, -# see http://en.wikipedia.org/wiki/Hue for more information. -# For instance the value 0 represents red, 60 is yellow, 120 is green, -# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. -# The allowed range is 0 to 359. +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_HUE = 220 -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of -# the colors in the HTML output. For a value of 0 the output will use -# grayscales only. A value of 255 will produce the most vivid colors. +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_SAT = 100 -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to -# the luminance component of the colors in the HTML output. Values below -# 100 gradually make the output lighter, whereas values above 100 make -# the output darker. The value divided by 100 is the actual gamma applied, -# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, -# and 100 does not change the gamma. +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting -# this to NO can help when comparing the output of multiple runs. +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. HTML_TIMESTAMP = YES -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - -HTML_ALIGN_MEMBERS = YES - # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the -# page has loaded. For this to work a browser that supports -# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox -# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. HTML_DYNAMIC_SECTIONS = NO -# If the GENERATE_DOCSET tag is set to YES, additional index files -# will be generated that can be used as input for Apple's Xcode 3 -# integrated development environment, introduced with OSX 10.5 (Leopard). -# To create a documentation set, doxygen will generate a Makefile in the -# HTML output directory. Running make will produce the docset in that -# directory and running "make install" will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find -# it at startup. -# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_DOCSET = NO -# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the -# feed. A documentation feed provides an umbrella under which multiple -# documentation sets from a single provider (such as a company or product suite) -# can be grouped. +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_FEEDNAME = "Doxygen generated docs" -# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that -# should uniquely identify the documentation set bundle. This should be a -# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen -# will append .docset to the name. +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. -DOCSET_BUNDLE_ID = org.doxygen.Project +DOCSET_BUNDLE_ID = io.ohmcoin.Ohmcoin -# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. -DOCSET_PUBLISHER_ID = org.doxygen.Publisher +DOCSET_PUBLISHER_ID = io.ohmcoin.Ohmcoin -# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_NAME = Publisher -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) -# of the generated HTML documentation. +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_HTMLHELP = NO -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be # written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_FILE = -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. HHC_LOCATION = -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the master .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. GENERATE_CHI = NO -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING -# is used to encode HtmlHelp index (hhk), content (hhc) and project file -# content. +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_INDEX_ENCODING = -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. BINARY_TOC = NO -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated -# that can be used as input for Qt's qhelpgenerator to generate a -# Qt Compressed Help (.qch) of the generated HTML documentation. +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_QHP = NO -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can -# be used to specify the file name of the resulting .qch file. -# The path specified is relative to the HTML output folder. +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. QCH_FILE = -# The QHP_NAMESPACE tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#namespace +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. QHP_NAMESPACE = org.doxygen.Project -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#virtual-folders +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. QHP_VIRTUAL_FOLDER = doc -# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to -# add. For more information please see -# http://doc.trolltech.com/qthelpproject.html#custom-filters +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_NAME = -# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see -# -# Qt Help Project / Custom Filters. +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's -# filter section matches. -# -# Qt Help Project / Filter Attributes. +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. QHP_SECT_FILTER_ATTRS = -# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can -# be used to specify the location of Qt's qhelpgenerator. -# If non-empty doxygen will try to run qhelpgenerator on the generated -# .qhp file. +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. QHG_LOCATION = -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files -# will be generated, which together with the HTML files, form an Eclipse help -# plugin. To install this plugin and make it available under the help contents -# menu in Eclipse, the contents of the directory containing the HTML and XML -# files needs to be copied into the plugins directory of eclipse. The name of -# the directory within the plugins directory should be the same as -# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before -# the help appears. +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_ECLIPSEHELP = NO # A unique identifier for the eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have -# this name. +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. ECLIPSE_DOC_ID = org.doxygen.Project -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. DISABLE_INDEX = NO -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values -# (range [0,1..20]) that doxygen will group on one line in the generated HTML -# documentation. Note that a value of 0 will completely suppress the enum -# values from appearing in the overview section. - -ENUM_VALUES_PER_LINE = 4 - # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. -# If the tag value is set to YES, a side panel will be generated -# containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). -# Windows users are probably better off using the HTML help feature. +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = NO -# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, -# and Class Hierarchy pages using a tree view instead of an ordered list. +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. -USE_INLINE_TREES = NO +ENUM_VALUES_PER_LINE = 4 -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. TREEVIEW_WIDTH = 250 -# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open -# links to external symbols imported via tag files in a separate window. +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. EXT_LINKS_IN_WINDOW = NO -# Use this tag to change the font size of Latex formulas included -# as images in the HTML documentation. The default is 10. Note that -# when you change the font size after a successful doxygen run you need -# to manually remove any form_*.png images from the HTML output directory -# to force them to be regenerated. +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are -# not supported properly for IE 6.0, but are supported on all modern browsers. -# Note that when changing this option you need to delete any form_*.png files -# in the HTML output before the changes have effect. +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_TRANSPARENT = YES -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax -# (see http://www.mathjax.org) which uses client side Javascript for the -# rendering instead of using prerendered bitmaps. Use this if you do not -# have LaTeX installed or if you want to formulas look prettier in the HTML -# output. When enabled you also need to install MathJax separately and -# configure the path to it using the MATHJAX_RELPATH option. +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. USE_MATHJAX = NO -# When MathJax is enabled you need to specify the location relative to the -# HTML output directory using the MATHJAX_RELPATH option. The destination -# directory should contain the MathJax.js script. For instance, if the mathjax -# directory is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to the -# mathjax.org site, so you can quickly see the result without installing -# MathJax, but it is strongly recommended to install a local copy of MathJax -# before deployment. +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = http://www.mathjax.org/mathjax -# When the SEARCHENGINE tag is enabled doxygen will generate a search box -# for the HTML output. The underlying search engine uses javascript -# and DHTML and should work on any modern browser. Note that when using -# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets -# (GENERATE_DOCSET) there is already a search function so this one should -# typically be disabled. For large projects the javascript based search engine -# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /