---- main.cpp 2012-06-13 21:40:29.000000000 +0400
-+++ main.cpp.orig 2012-05-08 21:34:24.000000000 +0400
-@@ -3222,21 +3222,18 @@
+diff --git a/src/bitcoinrpc.cpp b/src/bitcoinrpc.cpp
+index 15bcf1d..1ace361 100644
+--- a/src/bitcoinrpc.cpp
++++ b/src/bitcoinrpc.cpp
+@@ -1497,6 +1497,43 @@ Value gettransaction(const Array& params, bool fHelp)
+ }
- // Size limits
- unsigned int nTxSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION);
-- //if (nBlockSize + nTxSize >= MAX_BLOCK_SIZE_GEN)
-- // continue;
-+ if (nBlockSize + nTxSize >= MAX_BLOCK_SIZE_GEN)
-+ continue;
- // Legacy limits on sigOps:
- unsigned int nTxSigOps = tx.GetLegacySigOpCount();
-- //if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS)
-- // continue;
-+ if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS)
-+ continue;
++Value importtransaction(const Array& params, bool fHelp)
++{
++ string hexdump;
++ if (fHelp || params.size() != 1 || (hexdump=params[0].get_str()).size()&1)
++ throw runtime_error(
++ "importtransaction <hexdata>\n"
++ "Import an offline transaction to announce it into the network");
++
++ std::vector<unsigned char> rawtx;
++ for (int i=0; i<hexdump.size(); i+=2)
++ {
++ int v;
++ if (sscanf(hexdump.substr(i,2).c_str(), "%x", &v)!=1)
++ throw JSONRPCError(-4, "Error in hex data.");
++ rawtx.push_back((unsigned char)v);
++ }
++try
++ {
++ CDataStream ss(rawtx, SER_NETWORK, PROTOCOL_VERSION);
++ CTransaction tx;
++ ss >> tx;
++ CInv inv(MSG_TX, tx.GetHash());
++
++ CTxDB txdb("r");
++ if(! tx.AcceptToMemoryPool(txdb, true)) throw JSONRPCError(-4, "Transaction not accepted to memory pool.");
++ CDataStream msg(rawtx, SER_NETWORK, PROTOCOL_VERSION);
++ RelayMessage(inv, msg);
++ return tx.GetHash().GetHex();
++ }
++ catch (std::exception& e)
++ {
++ throw JSONRPCError(-4, "Exception while parsing the transaction data.");
++ }
++
++}
++
++
+ Value backupwallet(const Array& params, bool fHelp)
+ {
+ if (fHelp || params.size() != 1)
+@@ -2055,6 +2092,7 @@ static const CRPCCommand vRPCCommands[] =
+ { "listsinceblock", &listsinceblock, false },
+ { "dumpprivkey", &dumpprivkey, false },
+ { "importprivkey", &importprivkey, false },
++ { "importtransaction", &importtransaction, false },
+ };
- // Transaction fee required depends on block size
- bool fAllowFree = (nBlockSize + nTxSize < 4000 || CTransaction::AllowFree(dPriority));
- int64 nMinFee = tx.GetMinFee(nBlockSize, fAllowFree, GMF_BLOCK);
+ CRPCTable::CRPCTable()
+diff --git a/src/main.cpp b/src/main.cpp
+index 427e435..35a0aea 100644
+--- a/src/main.cpp
++++ b/src/main.cpp
+@@ -3134,156 +3134,28 @@ CBlock* CreateNewBlock(CReserveKey& reservekey)
+ if (!pblock.get())
+ return NULL;
-- // Electrum server: do not check fees
-- nMinFee = 0;
--
- // Connecting shouldn't fail due to dependency on other memory pool transactions
- // because we're already processing them in order of dependency
- map<uint256, CTxIndex> mapTestPoolTmp(mapTestPool);
-@@ -3295,13 +3292,6 @@
- pblock->nBits = GetNextWorkRequired(pindexPrev, pblock.get());
- pblock->nNonce = 0;
+- // Create coinbase tx
+- CTransaction txNew;
+- txNew.vin.resize(1);
+- txNew.vin[0].prevout.SetNull();
+- txNew.vout.resize(1);
+- txNew.vout[0].scriptPubKey << reservekey.GetReservedKey() << OP_CHECKSIG;
+-
+- // Add our coinbase tx as first transaction
+- pblock->vtx.push_back(txNew);
+-
+ // Collect memory pool transactions into the block
+- int64 nFees = 0;
+ {
+ LOCK2(cs_main, mempool.cs);
+ CTxDB txdb("r");
+- // Priority order to process transactions
+- list<COrphan> vOrphan; // list memory doesn't move
+- map<uint256, vector<COrphan*> > mapDependers;
+- multimap<double, CTransaction*> mapPriority;
+- for (map<uint256, CTransaction>::iterator mi = mempool.mapTx.begin(); mi != mempool.mapTx.end(); ++mi)
+- {
+- CTransaction& tx = (*mi).second;
+- if (tx.IsCoinBase() || !tx.IsFinal())
+- continue;
-
+- COrphan* porphan = NULL;
+- double dPriority = 0;
+- BOOST_FOREACH(const CTxIn& txin, tx.vin)
+- {
+- // Read prev transaction
+- CTransaction txPrev;
+- CTxIndex txindex;
+- if (!txPrev.ReadFromDisk(txdb, txin.prevout, txindex))
+- {
+- // Has to wait for dependencies
+- if (!porphan)
+- {
+- // Use list for automatic deletion
+- vOrphan.push_back(COrphan(&tx));
+- porphan = &vOrphan.back();
+- }
+- mapDependers[txin.prevout.hash].push_back(porphan);
+- porphan->setDependsOn.insert(txin.prevout.hash);
+- continue;
+- }
+- int64 nValueIn = txPrev.vout[txin.prevout.n].nValue;
-
-- // Electrum: remove from mem pool
-- BOOST_FOREACH(CTransaction& tx, pblock->vtx)
-- mempool.remove(tx);
+- // Read block header
+- int nConf = txindex.GetDepthInMainChain();
-
+- dPriority += (double)nValueIn * nConf;
-
- return pblock.release();
- }
-
---- bitcoinrpc.cpp 2012-06-13 21:37:34.000000000 +0400
-+++ bitcoinrpc.cpp.orig 2012-05-08 21:34:23.000000000 +0400
-@@ -1496,45 +1496,7 @@
- return entry;
- }
+- if (fDebug && GetBoolArg("-printpriority"))
+- printf("priority nValueIn=%-12I64d nConf=%-5d dPriority=%-20.1f\n", nValueIn, nConf, dPriority);
+- }
+-
+- // Priority is sum(valuein * age) / txsize
+- dPriority /= ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION);
+-
+- if (porphan)
+- porphan->dPriority = dPriority;
+- else
+- mapPriority.insert(make_pair(-dPriority, &(*mi).second));
+-
+- if (fDebug && GetBoolArg("-printpriority"))
+- {
+- printf("priority %-20.1f %s\n%s", dPriority, tx.GetHash().ToString().substr(0,10).c_str(), tx.ToString().c_str());
+- if (porphan)
+- porphan->print();
+- printf("\n");
+- }
+- }
+-
+- // Collect transactions into block
+- map<uint256, CTxIndex> mapTestPool;
+- uint64 nBlockSize = 1000;
+ uint64 nBlockTx = 0;
+- int nBlockSigOps = 100;
+- while (!mapPriority.empty())
++ for (map<uint256, CTransaction>::iterator mi = mempool.mapTx.begin(); mi != mempool.mapTx.end(); ++mi)
+ {
+- // Take highest priority transaction off priority queue
+- double dPriority = -(*mapPriority.begin()).first;
+- CTransaction& tx = *(*mapPriority.begin()).second;
+- mapPriority.erase(mapPriority.begin());
+-
+- // Size limits
+- unsigned int nTxSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION);
+- if (nBlockSize + nTxSize >= MAX_BLOCK_SIZE_GEN)
+- continue;
+-
+- // Legacy limits on sigOps:
+- unsigned int nTxSigOps = tx.GetLegacySigOpCount();
+- if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS)
+- continue;
+-
+- // Transaction fee required depends on block size
+- bool fAllowFree = (nBlockSize + nTxSize < 4000 || CTransaction::AllowFree(dPriority));
+- int64 nMinFee = tx.GetMinFee(nBlockSize, fAllowFree, GMF_BLOCK);
+-
+- // Connecting shouldn't fail due to dependency on other memory pool transactions
+- // because we're already processing them in order of dependency
+- map<uint256, CTxIndex> mapTestPoolTmp(mapTestPool);
+- MapPrevTx mapInputs;
+- bool fInvalid;
+- if (!tx.FetchInputs(txdb, mapTestPoolTmp, false, true, mapInputs, fInvalid))
+- continue;
++ CTransaction& tx = (*mi).second;
++ if (tx.IsCoinBase() || !tx.IsFinal())
++ continue;
--Value importtransaction(const Array& params, bool fHelp)
--{
-- string hexdump;
-- if (fHelp || params.size() != 1 || (hexdump=params[0].get_str()).size()&1)
-- throw runtime_error(
-- "importtransaction <hexdata>\n"
-- "Import an offline transaction to announce it into the network");
--
-- std::vector<unsigned char> rawtx;
-- for (int i=0; i<hexdump.size(); i+=2)
-- {
-- int v;
-- if (sscanf(hexdump.substr(i,2).c_str(), "%x", &v)!=1)
-- throw JSONRPCError(-4, "Error in hex data.");
-- rawtx.push_back((unsigned char)v);
-- }
--try
-- {
-- CDataStream ss(rawtx, SER_NETWORK, PROTOCOL_VERSION);
-- CTransaction tx;
-- ss >> tx;
-- CInv inv(MSG_TX, tx.GetHash());
--
-- CTxDB txdb("r");
-- if(! tx.AcceptToMemoryPool(txdb, true)) throw JSONRPCError(-4, "Transaction not accepted to memory pool.");
-- CDataStream msg(rawtx, SER_NETWORK, PROTOCOL_VERSION);
-- RelayMessage(inv, msg);
-- return tx.GetHash().GetHex();
-- }
-- catch (std::exception& e)
-- {
-- throw JSONRPCError(-4, "Exception while parsing the transaction data.");
-- }
--
--}
+- int64 nTxFees = tx.GetValueIn(mapInputs)-tx.GetValueOut();
+- if (nTxFees < nMinFee)
+- continue;
+-
+- nTxSigOps += tx.GetP2SHSigOpCount(mapInputs);
+- if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS)
+- continue;
-
+- if (!tx.ConnectInputs(mapInputs, mapTestPoolTmp, CDiskTxPos(1,1,1), pindexPrev, false, true))
+- continue;
+- mapTestPoolTmp[tx.GetHash()] = CTxIndex(CDiskTxPos(1,1,1), tx.vout.size());
+- swap(mapTestPool, mapTestPoolTmp);
-
+- // Added
+- pblock->vtx.push_back(tx);
+- nBlockSize += nTxSize;
+- ++nBlockTx;
+- nBlockSigOps += nTxSigOps;
+- nFees += nTxFees;
+-
+- // Add transactions that depend on this one to the priority queue
+- uint256 hash = tx.GetHash();
+- if (mapDependers.count(hash))
+- {
+- BOOST_FOREACH(COrphan* porphan, mapDependers[hash])
+- {
+- if (!porphan->setDependsOn.empty())
+- {
+- porphan->setDependsOn.erase(hash);
+- if (porphan->setDependsOn.empty())
+- mapPriority.insert(make_pair(-porphan->dPriority, porphan->ptx));
+- }
+- }
+- }
++ if (!tx.get_electrum_flag())
++ {
++ tx.set_electrum_flag(true);
++ pblock->vtx.push_back(tx);
++ ++nBlockTx;
++ }
+ }
--
- Value backupwallet(const Array& params, bool fHelp)
- {
- if (fHelp || params.size() != 1)
-@@ -2093,7 +2055,6 @@
- { "listsinceblock", &listsinceblock, false },
- { "dumpprivkey", &dumpprivkey, false },
- { "importprivkey", &importprivkey, false },
-- { "importtransaction", &importtransaction, false },
- };
+- nLastBlockTx = nBlockTx;
+- nLastBlockSize = nBlockSize;
+- printf("CreateNewBlock(): total size %lu\n", nBlockSize);
+-
++ printf("CreateNewBlock(): transactions: %lu\n", nBlockTx);
+ }
+- pblock->vtx[0].vout[0].nValue = GetBlockValue(pindexPrev->nHeight+1, nFees);
- CRPCTable::CRPCTable()
+ // Fill in header
+ pblock->hashPrevBlock = pindexPrev->GetBlockHash();
+diff --git a/src/main.h b/src/main.h
+index 262e77e..4cc9319 100644
+--- a/src/main.h
++++ b/src/main.h
+@@ -395,6 +395,16 @@ public:
+ mutable int nDoS;
+ bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; }
+
++ bool electrum_flag;
++
++ void set_electrum_flag(bool x){
++ electrum_flag = x;
++ }
++
++ bool get_electrum_flag(){
++ return electrum_flag;
++ }
++
+ CTransaction()
+ {
+ SetNull();
+@@ -416,6 +426,7 @@ public:
+ vout.clear();
+ nLockTime = 0;
+ nDoS = 0; // Denial-of-service prevention
++ set_electrum_flag(false);
+ }
+
+ bool IsNull() const