mirror of
https://github.com/XRPLF/rippled.git
synced 2025-12-06 17:27:55 +00:00
Work on transit fees.
This commit is contained in:
@@ -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 },
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -37,7 +37,6 @@ class RPCServer : public boost::enable_shared_from_this<RPCServer>
|
||||
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);
|
||||
|
||||
@@ -56,9 +56,9 @@ enum SOE_Field
|
||||
sfLimitAmount,
|
||||
sfMessageKey,
|
||||
sfMinimumOffer,
|
||||
sfNextRate,
|
||||
sfNextRateExp,
|
||||
sfNextRateLgr,
|
||||
sfNextTransitExpire,
|
||||
sfNextTransitRate,
|
||||
sfNextTransitStart,
|
||||
sfNickname,
|
||||
sfOfferCurrency,
|
||||
sfPaths,
|
||||
|
||||
@@ -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<AffectedAccount>&)
|
||||
{
|
||||
return tenINVALID;
|
||||
}
|
||||
|
||||
TransactionEngineResult TransactionEngine::doClaim(const SerializedTransaction& txn,
|
||||
std::vector<AffectedAccount>& accounts)
|
||||
{
|
||||
@@ -331,6 +328,11 @@ TransactionEngineResult TransactionEngine::doClaim(const SerializedTransaction&
|
||||
return terSUCCESS;
|
||||
}
|
||||
|
||||
TransactionEngineResult TransactionEngine::doCreditSet(const SerializedTransaction&, std::vector<AffectedAccount>&)
|
||||
{
|
||||
return tenINVALID;
|
||||
}
|
||||
|
||||
TransactionEngineResult TransactionEngine::doPayment(const SerializedTransaction& txn,
|
||||
std::vector<AffectedAccount>& accounts,
|
||||
uint160 srcAccountID)
|
||||
@@ -425,8 +427,141 @@ TransactionEngineResult TransactionEngine::doPayment(const SerializedTransaction
|
||||
return terSUCCESS;
|
||||
}
|
||||
|
||||
TransactionEngineResult TransactionEngine::doTransitSet(const SerializedTransaction&, std::vector<AffectedAccount>&)
|
||||
TransactionEngineResult TransactionEngine::doTransitSet(const SerializedTransaction& st, std::vector<AffectedAccount>&)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user