From 30407a3a239f5fe069ccebbb812bdc89c2ef2a34 Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Tue, 22 May 2012 12:42:13 -0700 Subject: [PATCH] Work on transit fees. --- src/LedgerFormats.cpp | 29 ++++---- src/RPCServer.cpp | 10 +++ src/RPCServer.h | 1 - src/SerializedObject.h | 6 +- src/TransactionEngine.cpp | 147 ++++++++++++++++++++++++++++++++++++-- src/TransactionEngine.h | 9 +-- 6 files changed, 176 insertions(+), 26 deletions(-) diff --git a/src/LedgerFormats.cpp b/src/LedgerFormats.cpp index 490a0af40c..b0321ad991 100644 --- a/src/LedgerFormats.cpp +++ b/src/LedgerFormats.cpp @@ -6,18 +6,23 @@ LedgerEntryFormat LedgerFormats[]= { { "AccountRoot", ltACCOUNT_ROOT, { - { S_FIELD(Flags), STI_UINT32, SOE_FLAGS, 0 }, - { S_FIELD(Account), STI_ACCOUNT, SOE_REQUIRED, 0 }, - { S_FIELD(Sequence), STI_UINT32, SOE_REQUIRED, 0 }, - { S_FIELD(Balance), STI_AMOUNT, SOE_REQUIRED, 0 }, - { S_FIELD(LastReceive), STI_UINT32, SOE_REQUIRED, 0 }, - { S_FIELD(LastTxn), STI_UINT32, SOE_REQUIRED, 0 }, - { S_FIELD(AuthorizedKey),STI_HASH160, SOE_IFFLAG, 1 }, - { S_FIELD(EmailHash), STI_HASH128, SOE_IFFLAG, 2 }, - { S_FIELD(WalletLocator),STI_HASH256, SOE_IFFLAG, 4 }, - { S_FIELD(MessageKey), STI_VL, SOE_IFFLAG, 8 }, - { S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x01000000 }, - { sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } } + { S_FIELD(Flags), STI_UINT32, SOE_FLAGS, 0 }, + { S_FIELD(Account), STI_ACCOUNT, SOE_REQUIRED, 0 }, + { S_FIELD(Sequence), STI_UINT32, SOE_REQUIRED, 0 }, + { S_FIELD(Balance), STI_AMOUNT, SOE_REQUIRED, 0 }, + { S_FIELD(LastReceive), STI_UINT32, SOE_REQUIRED, 0 }, + { S_FIELD(LastTxn), STI_UINT32, SOE_REQUIRED, 0 }, + { S_FIELD(AuthorizedKey), STI_HASH160, SOE_IFFLAG, 1 }, + { S_FIELD(EmailHash), STI_HASH128, SOE_IFFLAG, 2 }, + { S_FIELD(WalletLocator), STI_HASH256, SOE_IFFLAG, 4 }, + { S_FIELD(MessageKey), STI_VL, SOE_IFFLAG, 8 }, + { S_FIELD(TransitRate), STI_UINT32, SOE_IFFLAG, 16 }, + { S_FIELD(TransitExpire), STI_UINT32, SOE_IFFLAG, 32 }, + { S_FIELD(NextTransitRate), STI_UINT32, SOE_IFFLAG, 64 }, + { S_FIELD(NextTransitStart), STI_UINT32, SOE_IFFLAG, 128 }, + { S_FIELD(NextTransitExpire), STI_UINT32, SOE_IFFLAG, 256 }, + { S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x01000000 }, + { sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } } }, { "GeneratorMap", ltGENERATOR_MAP, { { S_FIELD(Flags), STI_UINT32, SOE_FLAGS, 0 }, diff --git a/src/RPCServer.cpp b/src/RPCServer.cpp index cbc87357ce..e3b63cf40b 100644 --- a/src/RPCServer.cpp +++ b/src/RPCServer.cpp @@ -130,6 +130,16 @@ int RPCServer::getParamCount(const Json::Value& params) return 1; } + +// now, expire, n +bool RPCServer::parseBorrowRate(const std::string& sBorrowRate) +{ + if (!sBorrowRate.compare("expire")) + 0; + + return true; +} + bool RPCServer::extractString(std::string& param, const Json::Value& params, int index) { if (params.isNull()) return false; diff --git a/src/RPCServer.h b/src/RPCServer.h index 56458321ab..1076a75224 100644 --- a/src/RPCServer.h +++ b/src/RPCServer.h @@ -37,7 +37,6 @@ class RPCServer : public boost::enable_shared_from_this SerializedLedgerEntry::pointer& sleSrc); Json::Value doAccountInfo(Json::Value& params); - Json::Value doBorrowSet(Json::Value& params); Json::Value doConnect(Json::Value& params); Json::Value doCreditSet(Json::Value& params); Json::Value doLedger(Json::Value& params); diff --git a/src/SerializedObject.h b/src/SerializedObject.h index d321b6870b..aacffc11f8 100644 --- a/src/SerializedObject.h +++ b/src/SerializedObject.h @@ -56,9 +56,9 @@ enum SOE_Field sfLimitAmount, sfMessageKey, sfMinimumOffer, - sfNextRate, - sfNextRateExp, - sfNextRateLgr, + sfNextTransitExpire, + sfNextTransitRate, + sfNextTransitStart, sfNickname, sfOfferCurrency, sfPaths, diff --git a/src/TransactionEngine.cpp b/src/TransactionEngine.cpp index 432fcc3bec..a1251e92f2 100644 --- a/src/TransactionEngine.cpp +++ b/src/TransactionEngine.cpp @@ -53,6 +53,8 @@ TransactionEngineResult TransactionEngine::applyTransaction(const SerializedTran case ttINVOICE: case ttOFFER: + case ttCREDIT_SET: + case ttTRANSIT_SET: result = terSUCCESS; break; @@ -236,11 +238,6 @@ TransactionEngineResult TransactionEngine::applyTransaction(const SerializedTran return result; } -TransactionEngineResult TransactionEngine::doCreditSet(const SerializedTransaction&, std::vector&) -{ - return tenINVALID; -} - TransactionEngineResult TransactionEngine::doClaim(const SerializedTransaction& txn, std::vector& accounts) { @@ -331,6 +328,11 @@ TransactionEngineResult TransactionEngine::doClaim(const SerializedTransaction& return terSUCCESS; } +TransactionEngineResult TransactionEngine::doCreditSet(const SerializedTransaction&, std::vector&) +{ + return tenINVALID; +} + TransactionEngineResult TransactionEngine::doPayment(const SerializedTransaction& txn, std::vector& accounts, uint160 srcAccountID) @@ -425,8 +427,141 @@ TransactionEngineResult TransactionEngine::doPayment(const SerializedTransaction return terSUCCESS; } -TransactionEngineResult TransactionEngine::doTransitSet(const SerializedTransaction&, std::vector&) +TransactionEngineResult TransactionEngine::doTransitSet(const SerializedTransaction& st, std::vector&) { + std::cerr << "doTransitSet>" << std::endl; + + SerializedLedgerEntry::pointer sleSrc = accounts[0].second; + + bool bTxnTransitRate = st->getIFieldPresent(sfTransitRate); + bool bTxnTransitStart = st->getIFieldPresent(sfTransitStart); + bool bTxnTransitExpire = st->getIFieldPresent(sfTransitExpire); + uint32 uTxnTransitRate = bTxnTransitRate ? st->getIFieldU32(sfTransitRate) : 0; + uint32 uTxnTransitStart = bTxnTransitStart ? st->getIFieldU32(sfTransitStart) : 0; + uint32 uTxnTransitExpire = bTxnTransitExpire ? st->getIFieldU32(sfTransitExpire) : 0; + + bool bActTransitRate = sleSrc->getIFieldPresent(sfTransitRate); + bool bActTransitExpire = sleSrc->getIFieldPresent(sfTransitExpire); + bool bActNextTransitRate = sleSrc->getIFieldPresent(sfNextTransitRate); + bool bActNextTransitStart = sleSrc->getIFieldPresent(sfNextTransitStart); + bool bActNextTransitExpire = sleSrc->getIFieldPresent(sfNextTransitExpire); + uint32 uActTransitRate = bActTransitRate ? sleSrc->getIFieldU32(sfTransitRate) : 0; + uint32 uActTransitExpire = bActTransitExpire ? sleSrc->getIFieldU32(sfTransitExpire) : 0; + uint32 uActNextTransitRate = bActNextTransitRate ? sleSrc->getIFieldU32(sfNextTransitRate) : 0; + uint32 uActNextTransitStart = bActNextTransitStart ? sleSrc->getIFieldU32(sfNextTransitStart) : 0; + uint32 uActNextTransitExpire = bActNextTransitExpire ? sleSrc->getIFieldU32(sfNextTransitExpire) : 0; + + // Try to overwrite next rate. + + bool bBetterNextExpire = + (!bTxnTransitExpire // Txn does not expire (same or extends) + || (bActNextTransitExpire && uTxnTransitExpire >= uActTransitExpire)); // Same or longer the next. + + bool bBetterNextRate = + !bActNextTransitRate // No next rate, txn is better. + || (uTxnTransitRate <= uActNextTransitRate); // Charge is the same or less. + + // Must start at the same time or sooner. + bool bBetterNextStart = + + // If starting sooner, must be better than current, or current must not protect range. + + + if (!bActNextTransitRate) + { + // No next. Overwrite next. + } + else if (uTxnTransitRate <= uActNextTransitRate && bBetterNextExpire) + { + // Better than + } + + // True if no rate is active or going to be active; + bool bNoRate = !bActTransitRate && !bActNextTransitRate; + + bool bStartNow = bTxnTransitStart + ? uTxnTransitStart < uLedger + : bActTransitRate + ? bActTransitExpire + ? + : true // Current never expires. + : true; // Nothing is running. + + // True if new rate does not apply immediately. + boo bRateIsLater = bTxnTransitStart + ? uTxnTransitStart < uLedger + + : bActNextTransitRate && bTxnTransitExpire; + + if (no_rate || rate_is_better || rate_is_later) + { + // Install. + if (starting) + { + // install now + } + else + { + // install next + } + } + else + { + return tenTRANSIT_WORSE; + } + if (no_rate && starting) + + if (!bActTransitRate && !bActNextTransitRate) { + // No rate + bProtected = false; + } if (bActTransitRate && !bTx + + if (bTxnTransitStart && uTxnTransitStart > uLedger) + { + // Start at a particular time. + + } + else + { + // No start or start in the past, start now. + if (!bActTransitRate && !bActNextTransitRate) + { + // No current or future rate. + + uDstTransitRate = uTxnTransitRate; + uDstTransitExpire = uTxnTransitExpire; // 0 for never expire. + } + else if (bActTransitRate && !bActNextTransitRate) + { + // Have a current rate and none pending. + if (!bActTransitExpire) { + // Current rate does not expire + + } + } + else + { + // Have a future rate. + + } + } + if (!bActTransitRate && !bActNextTransitRate) + { + + } + + // Set current. + uDstTransitRate = uTxnTransitRate; + uDstTransitExpire = uTxnTransitExpire; // 0 for never expire. + + // Set future. + uDstNextTransitRate = uTxnTransitRate; + uDstNextTransitStart = uTxnTransitStart; + uDstNextTransitExpire = uTxnTransitExpire; // 0 for never expire. + + if (txn.getITFieldPresent(sfCurrency)) + + std::cerr << "doTransitSet<" << std::endl; return tenINVALID; } diff --git a/src/TransactionEngine.h b/src/TransactionEngine.h index c05ecee86d..bd2f3bdd55 100644 --- a/src/TransactionEngine.h +++ b/src/TransactionEngine.h @@ -14,14 +14,15 @@ enum TransactionEngineResult { // tenCAN_NEVER_SUCCEED = <0 - // Malformed - tenGEN_IN_USE = -300, // Generator already in use. + // Malformed: Fee claimed + tenGEN_IN_USE = -300, // Generator already in use. tenCREATEXNC, // Can not specify non XNC for Create. tenEXPLICITXNC, // XNC is used by default, don't specify it. - // Not possible due to ledger database. + // Not possible due to ledger database: Fee claimed tenCREATED = -200, // Can not create a previously created account. tenCLAIMED, // Can not claim a previously claimed account. + tenTRANSIT_WORSE, // Can not override a better promise. // Other tenFAILED = -100, // Something broke horribly @@ -29,7 +30,7 @@ enum TransactionEngineResult tenINSUF_FEE_P, // fee totally insufficient tenINVALID, // The transaction is ill-formed - terSUCCESS = 0, // The transaction was applied + terSUCCESS = 0, // The transaction was applied // terFAILED_BUT_COULD_SUCEED = >0 terALREADY, // The transaction was already in the ledger