From f47bf56ac842c61e18eca6e1d8f7f48d2b21b7d6 Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Wed, 6 Mar 2013 01:22:35 -0800 Subject: [PATCH] Add fill or kill support. --- src/cpp/ripple/OfferCreateTransactor.cpp | 12 ++++++++++++ src/cpp/ripple/TransactionErr.h | 1 + src/cpp/ripple/TransactionFormats.h | 3 ++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/cpp/ripple/OfferCreateTransactor.cpp b/src/cpp/ripple/OfferCreateTransactor.cpp index a70f191356..5055e8715a 100644 --- a/src/cpp/ripple/OfferCreateTransactor.cpp +++ b/src/cpp/ripple/OfferCreateTransactor.cpp @@ -342,6 +342,7 @@ TER OfferCreateTransactor::doApply() const uint32 uTxFlags = mTxn.getFlags(); const bool bPassive = isSetBit(uTxFlags, tfPassive); const bool bImmediateOrCancel = isSetBit(uTxFlags, tfImmediateOrCancel); + const bool bFillOrKill = isSetBit(uTxFlags, tfFillOrKill); STAmount saTakerPays = mTxn.getFieldAmount(sfTakerPays); STAmount saTakerGets = mTxn.getFieldAmount(sfTakerGets); @@ -374,6 +375,12 @@ TER OfferCreateTransactor::doApply() return temINVALID_FLAG; } + else if (bImmediateOrCancel && bFillOrKill) + { + cLog(lsINFO) << "OfferCreate: Malformed transaction: both IoC and FoK set."; + + return temINVALID_FLAG; + } else if (bHaveExpiration && !uExpiration) { cLog(lsWARNING) << "OfferCreate: Malformed offer: bad expiration"; @@ -490,6 +497,11 @@ TER OfferCreateTransactor::doApply() // If ledger is not final, can vote no. terResult = bOpenLedger ? telFAILED_PROCESSING : tecFAILED_PROCESSING; } + else if (bFillOrKill && (saTakerPays || saTakerGets)) + { + // Fill or kill and have leftovers. + terResult = tecKILL; + } else if ( !saTakerPays // Wants nothing more. || !saTakerGets // Offering nothing more. diff --git a/src/cpp/ripple/TransactionErr.h b/src/cpp/ripple/TransactionErr.h index a1d9fb6909..05c5c9ad63 100644 --- a/src/cpp/ripple/TransactionErr.h +++ b/src/cpp/ripple/TransactionErr.h @@ -123,6 +123,7 @@ enum TER // aka TransactionEngineResult tecUNFUNDED_OFFER = 103, tecUNFUNDED_PAYMENT = 104, tecFAILED_PROCESSING = 105, + tecKILL = 106, // tesSUCCESS is not retryable. tecDIR_FULL = 121, tecINSUF_RESERVE_LINE = 122, tecINSUF_RESERVE_OFFER = 123, diff --git a/src/cpp/ripple/TransactionFormats.h b/src/cpp/ripple/TransactionFormats.h index 9a279610c7..7b285c73d7 100644 --- a/src/cpp/ripple/TransactionFormats.h +++ b/src/cpp/ripple/TransactionFormats.h @@ -69,7 +69,8 @@ const uint32 tfAccountSetMask = ~(tfRequireDestTag|tfOptionalDestTag|tfRequireA // OfferCreate flags: const uint32 tfPassive = 0x00010000; const uint32 tfImmediateOrCancel = 0x00020000; -const uint32 tfOfferCreateMask = ~(tfPassive|tfImmediateOrCancel); +const uint32 tfFillOrKill = 0x00040000; +const uint32 tfOfferCreateMask = ~(tfPassive|tfImmediateOrCancel|tfFillOrKill); // Payment flags: const uint32 tfNoRippleDirect = 0x00010000;