Compare commits

..

15 Commits

Author SHA1 Message Date
Richard Holland
3a6f5faacd clangf 2023-12-20 11:35:51 +00:00
Richard Holland
4eba415e9b . 2023-12-20 11:19:07 +00:00
Richard Holland
9d73b12713 . 2023-12-20 11:15:57 +00:00
Richard Holland
d3d4f4dbad lite fixes for tsh issues 2023-12-20 11:14:20 +00:00
RichardAH
dd3b0447d5 FXV1: allow duplicate entries in genesis mint transactor (#239) 2023-12-20 11:23:11 +01:00
Denis Angell
bba014a27c Merge branch 'dev' into fixXahauV1 2023-12-19 20:47:53 +01:00
Denis Angell
617c896514 Merge branch 'dev' into fixXahauV1 2023-12-19 10:09:41 +01:00
Denis Angell
97ab309a09 FXV1: Namespace Limit (#220) 2023-12-15 12:19:25 +01:00
Denis Angell
6cb07b0000 FXV1: Fix Import Quorum (#235) 2023-12-14 14:46:59 +01:00
Denis Angell
049efbcdc0 FXV1: Patch Hooks OwnerDir (#236) 2023-12-14 14:45:29 +01:00
Denis Angell
9f449e97bc clang-format 2023-12-13 15:15:58 +01:00
Denis Angell
6561cd7f58 fix tsh tests (offer seq now optional) 2023-12-13 15:13:21 +01:00
Denis Angell
27b91f997c Merge branch 'dev' into fixXahauV1 2023-12-11 13:51:11 +01:00
Denis Angell
75b760debe FXV1: Optional Offer Sequence (#224) 2023-12-07 13:26:47 +01:00
Denis Angell
3f7e15893e FXV1: Meta Amount (#225)
ensure default-value amount fields are correctly recorded in metadata for created nodes (fixXahau1)
2023-12-03 10:27:06 +01:00
20 changed files with 2024 additions and 2048 deletions

View File

@@ -2030,20 +2030,19 @@ TxQ::doRPC(Application& app, std::optional<XRPAmount> hookFeeUnits) const
levels[jss::median_level] = to_string(metrics.medFeeLevel);
levels[jss::open_ledger_level] = to_string(metrics.openLedgerFeeLevel);
auto const baseFee =
hookFeeUnits ? XRPAmount{hookFeeUnits->drops()} : view->fees().base;
auto const txFee = XRPAmount{hookFeeUnits->drops()};
auto const baseFee = view->fees().base;
// If the base fee is 0 drops, but escalation has kicked in, treat the
// base fee as if it is 1 drop, which makes the rest of the math
// work.
auto const effectiveBaseFee = [&baseFee, &metrics]() {
if (!baseFee && metrics.openLedgerFeeLevel != metrics.referenceFeeLevel)
auto const effectiveBaseFee = [&txFee, &metrics]() {
if (!txFee && metrics.openLedgerFeeLevel != metrics.referenceFeeLevel)
return XRPAmount{1};
return baseFee;
return txFee;
}();
auto& drops = ret[jss::drops] = Json::Value();
drops[jss::base_fee_no_hooks] = to_string(view->fees().base);
drops[jss::base_fee] = to_string(baseFee);
drops[jss::median_fee] = to_string(toDrops(metrics.medFeeLevel, baseFee));
drops[jss::minimum_fee] = to_string(toDrops(

View File

@@ -111,14 +111,6 @@ CancelOffer::doApply()
JLOG(j_.debug()) << "Trying to cancel offer :" << *offerID;
else
JLOG(j_.debug()) << "Trying to cancel offer #" << *offerSequence;
bool const fixV1 = view().rules().enabled(fixXahauV1);
if (fixV1 && sleOffer->getFieldU16(sfLedgerEntryType) != ltOFFER)
{
JLOG(j_.debug()) << "OfferCancel specified non-offer ledger object";
return tecINTERNAL;
}
return offerDelete(view(), sleOffer, ctx_.app.journal("View"));
}

View File

@@ -431,25 +431,9 @@ EscrowFinish::preflight(PreflightContext const& ctx)
}
}
// sfOfferSequence was changed to optional, so ensure the behaviour is the
// same until amendment passes
if (!ctx.rules.enabled(fixXahauV1))
{
if (!ctx.tx.isFieldPresent(sfOfferSequence))
return temMALFORMED;
if (ctx.tx.isFieldPresent(sfEscrowID) &&
ctx.tx.getFieldU32(sfOfferSequence) != 0)
return temMALFORMED;
}
else
{
if ((!ctx.tx.isFieldPresent(sfEscrowID) &&
!ctx.tx.isFieldPresent(sfOfferSequence)) ||
ctx.tx.isFieldPresent(sfEscrowID) &&
ctx.tx.isFieldPresent(sfOfferSequence))
return temMALFORMED;
}
if (!ctx.tx.isFieldPresent(sfEscrowID) &&
!ctx.tx.isFieldPresent(sfOfferSequence))
return temMALFORMED;
return tesSUCCESS;
}
@@ -478,7 +462,16 @@ EscrowFinish::doApply()
std::optional<uint256> escrowID = ctx_.tx[~sfEscrowID];
std::optional<std::uint32_t> offerSequence = ctx_.tx[~sfOfferSequence];
bool const fixV1 = view().rules().enabled(fixXahauV1);
if (!view().rules().enabled(fixXahauV1))
{
if (escrowID && ctx_.tx[sfOfferSequence] != 0)
return temMALFORMED;
}
else
{
if (escrowID && offerSequence)
return temMALFORMED;
}
Keylet k = escrowID ? Keylet(ltESCROW, *escrowID)
: keylet::escrow(ctx_.tx[sfOwner], *offerSequence);
@@ -487,9 +480,6 @@ EscrowFinish::doApply()
if (!slep)
return tecNO_TARGET;
if (fixV1 && slep->getFieldU16(sfLedgerEntryType) != ltESCROW)
return tecINTERNAL;
AccountID const account = (*slep)[sfAccount];
auto const sle = ctx_.view().peek(keylet::account(account));
auto const amount = slep->getFieldAmount(sfAmount);
@@ -714,25 +704,9 @@ EscrowCancel::preflight(PreflightContext const& ctx)
if (auto const ret = preflight1(ctx); !isTesSuccess(ret))
return ret;
// sfOfferSequence was changed to optional, so ensure the behaviour is the
// same until amendment passes
if (!ctx.rules.enabled(fixXahauV1))
{
if (!ctx.tx.isFieldPresent(sfOfferSequence))
return temMALFORMED;
if (ctx.tx.isFieldPresent(sfEscrowID) &&
ctx.tx.getFieldU32(sfOfferSequence) != 0)
return temMALFORMED;
}
else
{
if ((!ctx.tx.isFieldPresent(sfEscrowID) &&
!ctx.tx.isFieldPresent(sfOfferSequence)) ||
ctx.tx.isFieldPresent(sfEscrowID) &&
ctx.tx.isFieldPresent(sfOfferSequence))
return temMALFORMED;
}
if (!ctx.tx.isFieldPresent(sfEscrowID) &&
!ctx.tx.isFieldPresent(sfOfferSequence))
return temMALFORMED;
return preflight2(ctx);
}
@@ -748,7 +722,16 @@ EscrowCancel::doApply()
std::optional<uint256> escrowID = ctx_.tx[~sfEscrowID];
std::optional<std::uint32_t> offerSequence = ctx_.tx[~sfOfferSequence];
bool const fixV1 = view().rules().enabled(fixXahauV1);
if (!view().rules().enabled(fixXahauV1))
{
if (escrowID && ctx_.tx[sfOfferSequence] != 0)
return temMALFORMED;
}
else
{
if (escrowID && offerSequence)
return temMALFORMED;
}
Keylet k = escrowID ? Keylet(ltESCROW, *escrowID)
: keylet::escrow(ctx_.tx[sfOwner], *offerSequence);
@@ -757,9 +740,6 @@ EscrowCancel::doApply()
if (!slep)
return tecNO_TARGET;
if (fixV1 && slep->getFieldU16(sfLedgerEntryType) != ltESCROW)
return tecINTERNAL;
if (ctx_.view().rules().enabled(fix1571))
{
auto const now = ctx_.view().info().parentCloseTime;

View File

@@ -299,16 +299,10 @@ GenesisMint::doApply()
auto const flags = dest[~sfGovernanceFlags];
auto const marks = dest[~sfGovernanceMarks];
auto const id = dest.getAccountID(sfDestination);
auto const k = keylet::account(id);
bool const firstOccurance = mints.find(id) == mints.end();
if (dropsAdded + toCredit < dropsAdded)
{
JLOG(ctx_.journal.warn()) << "GenesisMint: cannot credit " << id
<< " due to dropsAdded overflow";
return tecINTERNAL;
}
dropsAdded += toCredit;
// if flags / marks appear more than once we just take the first

View File

@@ -817,17 +817,16 @@ Import::preflight(PreflightContext const& ctx)
<< " validation count: " << validationCount;
// check if the validation count is adequate
auto hasInsufficientQuorum =
[&ctx](uint64_t quorum, uint64_t validationCount) {
if (ctx.rules.enabled(fixXahauV1))
{
return quorum > validationCount;
}
else
{
return quorum >= validationCount;
}
};
auto hasInsufficientQuorum = [&ctx](int quorum, int validationCount) {
if (ctx.rules.enabled(fixXahauV1))
{
return quorum > validationCount;
}
else
{
return quorum >= validationCount;
}
};
if (hasInsufficientQuorum(quorum, validationCount))
{
JLOG(ctx.j.warn()) << "Import: xpop did not contain an 80% quorum for "

View File

@@ -86,27 +86,6 @@ Invoke::calculateBaseFee(ReadView const& view, STTx const& tx)
extraFee +=
XRPAmount{static_cast<XRPAmount>(tx.getFieldVL(sfBlob).size())};
// old code (prior to fixXahauV1)
if (!view.rules().enabled(fixXahauV1))
{
if (tx.isFieldPresent(sfHookParameters))
{
uint64_t paramBytes = 0;
auto const& params = tx.getFieldArray(sfHookParameters);
for (auto const& param : params)
{
paramBytes +=
(param.isFieldPresent(sfHookParameterName)
? param.getFieldVL(sfHookParameterName).size()
: 0) +
(param.isFieldPresent(sfHookParameterValue)
? param.getFieldVL(sfHookParameterValue).size()
: 0);
}
extraFee += XRPAmount{static_cast<XRPAmount>(paramBytes)};
}
}
return Transactor::calculateBaseFee(view, tx) + extraFee;
}

View File

@@ -351,7 +351,7 @@ Transactor::calculateBaseFee(ReadView const& view, STTx const& tx)
XRPAmount accumulator = baseFee;
if (view.rules().enabled(featureHooks) &&
view.rules().enabled(fixXahauV1) && tx.isFieldPresent(sfHookParameters))
tx.isFieldPresent(sfHookParameters))
{
uint64_t paramBytes = 0;
auto const& params = tx.getFieldArray(sfHookParameters);

File diff suppressed because it is too large Load Diff

View File

@@ -27,7 +27,6 @@
#include <ripple/ledger/OpenView.h>
#include <ripple/ledger/RawView.h>
#include <ripple/ledger/ReadView.h>
#include <ripple/ledger/Sandbox.h>
#include <ripple/protocol/Feature.h>
#include <ripple/protocol/Protocol.h>
#include <ripple/protocol/Rate.h>
@@ -395,8 +394,7 @@ accountSend(
AccountID const& from,
AccountID const& to,
const STAmount& saAmount,
beast::Journal j,
bool const senderPaysXferFees = true);
beast::Journal j);
[[nodiscard]] TER
issueIOU(
@@ -629,7 +627,7 @@ trustTransferAllowed(
{
static_assert(
std::is_same<V, ReadView const>::value ||
std::is_same<V, ApplyView>::value || std::is_same<V, Sandbox>::value);
std::is_same<V, ApplyView>::value);
typedef typename std::conditional<
std::is_same<V, ApplyView>::value,

View File

@@ -1157,8 +1157,7 @@ rippleSend(
AccountID const& uReceiverID,
STAmount const& saAmount,
STAmount& saActual,
beast::Journal j,
bool const senderPaysXferFees)
beast::Journal j)
{
auto const issuer = saAmount.getIssuer();
@@ -1180,30 +1179,17 @@ rippleSend(
// Calculate the amount to transfer accounting
// for any transfer fees:
STAmount senderPays = saAmount;
STAmount destReceives = saAmount;
if (senderPaysXferFees)
{
senderPays = multiply(saAmount, transferRate(view, issuer));
saActual = senderPays;
}
else
{
destReceives = divide(saAmount, transferRate(view, issuer));
saActual = destReceives;
}
saActual = multiply(saAmount, transferRate(view, issuer));
JLOG(j.debug()) << "rippleSend> " << to_string(uSenderID) << " - > "
<< to_string(uReceiverID)
<< " : deliver=" << saAmount.getFullText()
<< " cost=" << saActual.getFullText();
TER terResult =
rippleCredit(view, issuer, uReceiverID, destReceives, true, j);
TER terResult = rippleCredit(view, issuer, uReceiverID, saAmount, true, j);
if (tesSUCCESS == terResult)
terResult = rippleCredit(view, uSenderID, issuer, senderPays, true, j);
terResult = rippleCredit(view, uSenderID, issuer, saActual, true, j);
return terResult;
}
@@ -1214,8 +1200,7 @@ accountSend(
AccountID const& uSenderID,
AccountID const& uReceiverID,
STAmount const& saAmount,
beast::Journal j,
bool const senderPaysXferFees)
beast::Journal j)
{
assert(saAmount >= beast::zero);
@@ -1233,14 +1218,7 @@ accountSend(
<< to_string(uReceiverID) << " : "
<< saAmount.getFullText();
return rippleSend(
view,
uSenderID,
uReceiverID,
saAmount,
saActual,
j,
senderPaysXferFees);
return rippleSend(view, uSenderID, uReceiverID, saAmount, saActual, j);
}
/* XRP send which does not check reserve and can do pure adjustment.
@@ -1249,6 +1227,7 @@ accountSend(
* ensure that transfers are balanced.
*/
TER terResult(tesSUCCESS);
SLE::pointer sender = uSenderID != beast::zero
? view.peek(keylet::account(uSenderID))
: SLE::pointer();

View File

@@ -74,7 +74,7 @@ namespace detail {
// Feature.cpp. Because it's only used to reserve storage, and determine how
// large to make the FeatureBitset, it MAY be larger. It MUST NOT be less than
// the actual number of amendments. A LogicError on startup will verify this.
static constexpr std::size_t numFeatures = 66;
static constexpr std::size_t numFeatures = 67;
/** Amendments that this server supports and the default voting behavior.
Whether they are enabled depends on the Rules defined in the validated
@@ -353,6 +353,7 @@ extern uint256 const fixNFTokenRemint;
extern uint256 const featureImport;
extern uint256 const featureXahauGenesis;
extern uint256 const featureHooksUpdate1;
extern uint256 const fixURITokenV1;
extern uint256 const fixXahauV1;
} // namespace ripple

View File

@@ -337,7 +337,6 @@ enum TECcodes : TERUnderlyingType {
tecXCHAIN_PAYMENT_FAILED = 184, // RESERVED - XCHAIN
tecXCHAIN_SELF_COMMIT = 185, // RESERVED - XCHAIN
tecXCHAIN_BAD_PUBLIC_KEY_ACCOUNT_PAIR = 186, // RESERVED - XCHAIN
tecINSUF_RESERVE_SELLER = 187,
tecLAST_POSSIBLE_ENTRY = 255,
};

View File

@@ -459,6 +459,7 @@ REGISTER_FEATURE(URIToken, Supported::yes, VoteBehavior::De
REGISTER_FEATURE(Import, Supported::yes, VoteBehavior::DefaultYes);
REGISTER_FEATURE(XahauGenesis, Supported::yes, VoteBehavior::DefaultYes);
REGISTER_FEATURE(HooksUpdate1, Supported::yes, VoteBehavior::DefaultYes);
REGISTER_FIX (fixURITokenV1, Supported::yes, VoteBehavior::DefaultNo);
REGISTER_FIX (fixXahauV1, Supported::yes, VoteBehavior::DefaultNo);

View File

@@ -91,7 +91,6 @@ transResults()
MAKE_ERROR(tecHOOK_REJECTED, "Rejected by hook on sending or receiving account."),
MAKE_ERROR(tecREQUIRES_FLAG, "The transaction or part-thereof requires a flag that wasn't set."),
MAKE_ERROR(tecPRECISION_LOSS, "The amounts used by the transaction cannot interact."),
MAKE_ERROR(tecINSUF_RESERVE_SELLER, "The seller of an object has insufficient reserves, and thus cannot complete the sale."),
MAKE_ERROR(tefALREADY, "The exact transaction was already in this ledger."),
MAKE_ERROR(tefBAD_ADD_AUTH, "Not authorized to add account."),
MAKE_ERROR(tefBAD_AUTH, "Transaction's public key is not authorized."),

View File

@@ -173,30 +173,29 @@ JSS(accounts); // in: LedgerEntry, Subscribe,
JSS(accounts_proposed); // in: Subscribe, Unsubscribe
JSS(acroot);
JSS(action);
JSS(acquiring); // out: LedgerRequest
JSS(address); // out: PeerImp
JSS(affected); // out: AcceptedLedgerTx
JSS(age); // out: NetworkOPs, Peers
JSS(alternatives); // out: PathRequest, RipplePathFind
JSS(amendment_blocked); // out: NetworkOPs
JSS(amendments); // in: AccountObjects, out: NetworkOPs
JSS(amount); // out: AccountChannels
JSS(api_version); // in: many, out: Version
JSS(api_version_low); // out: Version
JSS(applied); // out: SubmitTransaction
JSS(asks); // out: Subscribe
JSS(assets); // out: GatewayBalances
JSS(authorized); // out: AccountLines
JSS(auth_change); // out: AccountInfo
JSS(auth_change_queued); // out: AccountInfo
JSS(available); // out: ValidatorList
JSS(avg_bps_recv); // out: Peers
JSS(avg_bps_sent); // out: Peers
JSS(balance); // out: AccountLines
JSS(balances); // out: GatewayBalances
JSS(base); // out: LogLevel
JSS(base_fee); // out: NetworkOPs
JSS(base_fee_no_hooks);
JSS(acquiring); // out: LedgerRequest
JSS(address); // out: PeerImp
JSS(affected); // out: AcceptedLedgerTx
JSS(age); // out: NetworkOPs, Peers
JSS(alternatives); // out: PathRequest, RipplePathFind
JSS(amendment_blocked); // out: NetworkOPs
JSS(amendments); // in: AccountObjects, out: NetworkOPs
JSS(amount); // out: AccountChannels
JSS(api_version); // in: many, out: Version
JSS(api_version_low); // out: Version
JSS(applied); // out: SubmitTransaction
JSS(asks); // out: Subscribe
JSS(assets); // out: GatewayBalances
JSS(authorized); // out: AccountLines
JSS(auth_change); // out: AccountInfo
JSS(auth_change_queued); // out: AccountInfo
JSS(available); // out: ValidatorList
JSS(avg_bps_recv); // out: Peers
JSS(avg_bps_sent); // out: Peers
JSS(balance); // out: AccountLines
JSS(balances); // out: GatewayBalances
JSS(base); // out: LogLevel
JSS(base_fee); // out: NetworkOPs
JSS(base_fee_xrp); // out: NetworkOPs
JSS(base_fee_native); // out: NetworkOPs
JSS(bids); // out: Subscribe

View File

@@ -59,7 +59,7 @@ class BaseFee_test : public beast::unit_test::suite
// verify base fee & open ledger fee
auto const drops = jrr[jss::result][jss::drops];
auto const baseFee = drops[jss::base_fee_no_hooks];
auto const baseFee = drops[jss::base_fee];
BEAST_EXPECT(baseFee == to_string(feeDrops));
auto const openLedgerFee = drops[jss::open_ledger_fee];
BEAST_EXPECT(openLedgerFee == expected);
@@ -77,7 +77,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const account = Account("alice");
env.fund(XRP(1000), account);
@@ -87,9 +87,7 @@ class BaseFee_test : public beast::unit_test::suite
auto tx = fset(account, asfTshCollect);
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "16" : "10";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "16");
}
void
@@ -100,7 +98,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const account = Account("alice");
auto const bene = Account("bob");
@@ -111,9 +109,7 @@ class BaseFee_test : public beast::unit_test::suite
auto tx = acctdelete(account, bene);
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "200000" : "200000";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "200000");
}
static uint256
@@ -130,7 +126,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const account = Account("alice");
env.fund(XRP(1000), account);
@@ -141,9 +137,7 @@ class BaseFee_test : public beast::unit_test::suite
auto tx = check::cancel(account, checkId);
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "16" : "10";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "16");
}
void
@@ -154,7 +148,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const account = Account("alice");
auto const dest = Account("bob");
@@ -166,9 +160,7 @@ class BaseFee_test : public beast::unit_test::suite
auto tx = check::cash(dest, checkId, XRP(100));
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "16" : "10";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "16");
}
void
@@ -179,7 +171,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const account = Account("alice");
auto const dest = Account("bob");
@@ -190,9 +182,7 @@ class BaseFee_test : public beast::unit_test::suite
auto tx = check::create(account, dest, XRP(100));
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "16" : "10";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "16");
}
void
@@ -203,7 +193,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const account = Account("alice");
env.fund(XRP(1000), account);
@@ -213,9 +203,7 @@ class BaseFee_test : public beast::unit_test::suite
auto tx = reward::claim(account);
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "16" : "10";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "16");
}
void
@@ -226,7 +214,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const account = Account("alice");
auto const authed = Account("bob");
@@ -237,9 +225,7 @@ class BaseFee_test : public beast::unit_test::suite
auto tx = deposit::auth(account, authed);
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "16" : "10";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "16");
}
void
@@ -250,7 +236,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const account = Account("alice");
env.fund(XRP(1000), account);
@@ -261,9 +247,7 @@ class BaseFee_test : public beast::unit_test::suite
auto tx = escrow::cancel(account, account, seq1);
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "16" : "10";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "16");
}
void
@@ -274,7 +258,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const account = Account("alice");
auto const dest = Account("bob");
@@ -285,9 +269,7 @@ class BaseFee_test : public beast::unit_test::suite
auto tx = escrow::create(account, dest, XRP(10));
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "16" : "10";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "16");
}
void
@@ -298,7 +280,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const account = Account("alice");
env.fund(XRP(1000), account);
@@ -309,9 +291,7 @@ class BaseFee_test : public beast::unit_test::suite
auto tx = escrow::finish(account, account, seq1);
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "16" : "10";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "16");
}
void
@@ -322,7 +302,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const account = Account("alice");
env.fund(XRP(1000), account);
@@ -333,9 +313,7 @@ class BaseFee_test : public beast::unit_test::suite
account, import::loadXpop(ImportTCAccountSet::w_seed));
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "106" : "100";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "106");
}
void
@@ -346,7 +324,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const account = Account("alice");
env.fund(XRP(1000), account);
@@ -356,9 +334,7 @@ class BaseFee_test : public beast::unit_test::suite
auto tx = invoke::invoke(account);
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "16" : "16";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "16");
}
void
@@ -369,7 +345,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const account = Account("alice");
env.fund(XRP(1000), account);
@@ -380,9 +356,7 @@ class BaseFee_test : public beast::unit_test::suite
auto tx = offer_cancel(account, offerSeq);
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "16" : "10";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "16");
}
void
@@ -393,7 +367,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const account = Account("alice");
auto const gw = Account("gw");
@@ -405,9 +379,7 @@ class BaseFee_test : public beast::unit_test::suite
auto tx = offer(account, USD(1000), XRP(1000));
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "16" : "10";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "16");
}
void
@@ -418,7 +390,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const account = Account("alice");
auto const dest = Account("bob");
@@ -429,9 +401,7 @@ class BaseFee_test : public beast::unit_test::suite
auto tx = pay(account, dest, XRP(1));
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "16" : "10";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "16");
}
static uint256
@@ -452,7 +422,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const account = Account("alice");
auto const dest = Account("bob");
@@ -467,9 +437,7 @@ class BaseFee_test : public beast::unit_test::suite
auto tx = paychan::claim(account, chan, reqBal, authAmt);
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "16" : "10";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "16");
}
void
@@ -480,7 +448,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const account = Account("alice");
auto const dest = Account("bob");
@@ -493,9 +461,7 @@ class BaseFee_test : public beast::unit_test::suite
auto tx = paychan::create(account, dest, XRP(10), settleDelay, pk);
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "16" : "10";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "16");
}
void
@@ -506,7 +472,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const account = Account("alice");
auto const dest = Account("bob");
@@ -518,9 +484,7 @@ class BaseFee_test : public beast::unit_test::suite
auto tx = paychan::fund(account, chan, XRP(1));
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "16" : "10";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "16");
}
void
@@ -531,7 +495,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const account = Account("alice");
env.fund(XRP(1000), account);
@@ -551,9 +515,7 @@ class BaseFee_test : public beast::unit_test::suite
hookParams[jss::HookParameter][jss::HookParameterValue] = "DEADBEEF";
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "73022" : "73016";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "73022");
}
void
@@ -564,7 +526,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const account = Account("alice");
auto const dest = Account("bob");
@@ -575,9 +537,7 @@ class BaseFee_test : public beast::unit_test::suite
auto tx = regkey(account, dest);
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "0" : "0";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "0");
}
void
@@ -588,7 +548,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const account = Account("alice");
auto const signer1 = Account("bob");
@@ -600,9 +560,7 @@ class BaseFee_test : public beast::unit_test::suite
auto tx = signers(account, 2, {{signer1, 1}, {signer2, 1}});
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "16" : "10";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "16");
}
void
@@ -613,7 +571,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const account = Account("alice");
env.fund(XRP(1000), account);
@@ -623,9 +581,7 @@ class BaseFee_test : public beast::unit_test::suite
auto tx = ticket::create(account, 2);
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "16" : "10";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "16");
}
void
@@ -636,7 +592,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const account = Account("alice");
auto const gw = Account("gw");
@@ -648,9 +604,7 @@ class BaseFee_test : public beast::unit_test::suite
auto tx = trust(account, USD(1000));
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "16" : "10";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "16");
}
void
@@ -661,7 +615,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const issuer = Account("alice");
env.fund(XRP(1000), issuer);
@@ -674,9 +628,7 @@ class BaseFee_test : public beast::unit_test::suite
auto tx = uritoken::burn(issuer, hexid);
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "16" : "10";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "16");
}
void
@@ -687,7 +639,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const issuer = Account("alice");
env.fund(XRP(1000), issuer);
@@ -701,9 +653,7 @@ class BaseFee_test : public beast::unit_test::suite
tx[jss::Amount] = "1000000";
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "16" : "10";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "16");
}
void
@@ -714,7 +664,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const issuer = Account("alice");
env.fund(XRP(1000), issuer);
@@ -727,9 +677,7 @@ class BaseFee_test : public beast::unit_test::suite
auto tx = uritoken::cancel(issuer, hexid);
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "16" : "10";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "16");
}
void
@@ -740,7 +688,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const issuer = Account("alice");
auto const buyer = Account("bob");
@@ -756,9 +704,7 @@ class BaseFee_test : public beast::unit_test::suite
tx[jss::Amount] = "1000000";
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "16" : "10";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "16");
}
void
@@ -769,7 +715,7 @@ class BaseFee_test : public beast::unit_test::suite
using namespace test::jtx;
using namespace std::literals;
Env env{*this, network::makeNetworkConfig(21337), features};
Env env{*this, network::makeNetworkConfig(21337)};
auto const account = Account("alice");
env.fund(XRP(1000), account);
@@ -780,9 +726,7 @@ class BaseFee_test : public beast::unit_test::suite
auto tx = uritoken::mint(account, uri);
// verify hooks fee
std::string const feeResult =
env.current()->rules().enabled(fixXahauV1) ? "16" : "10";
testRPCCall(env, tx, feeResult);
testRPCCall(env, tx, "16");
}
void
@@ -826,7 +770,6 @@ public:
using namespace test::jtx;
auto const sa = supported_amendments();
testWithFeats(sa);
testWithFeats(sa - fixXahauV1);
}
};

View File

@@ -5298,6 +5298,7 @@ public:
// both offer id and offer sequence 0
{
uint256 const offerId{getOfferIndex(alice, env.seq(alice))};
std::uint32_t const offerSeqId{env.seq(alice)};
env(offer(alice, XRP(50), USD(50)));
env.close();
@@ -5403,12 +5404,12 @@ public:
FeatureBitset const rmSmallIncreasedQOffers{fixRmSmallIncreasedQOffers};
FeatureBitset const immediateOfferKilled{featureImmediateOfferKilled};
testAll(all - takerDryOffer - immediateOfferKilled);
testAll(all - flowCross - takerDryOffer - immediateOfferKilled);
testAll(all - flowCross - immediateOfferKilled);
testAll(all - rmSmallIncreasedQOffers - immediateOfferKilled);
testAll(all);
testFalseAssert();
// testAll(all - takerDryOffer - immediateOfferKilled);
// testAll(all - flowCross - takerDryOffer - immediateOfferKilled);
// testAll(all - flowCross - immediateOfferKilled);
// testAll(all - rmSmallIncreasedQOffers - immediateOfferKilled);
// testAll(all);
// testFalseAssert();
testOfferID(all);
}
};

File diff suppressed because it is too large Load Diff

View File

@@ -191,25 +191,30 @@ struct URIToken_test : public beast::unit_test::suite
using namespace jtx;
using namespace std::literals::chrono_literals;
// fixXahauV1
// fixURITokenV1
{
Env env{*this, features};
auto const alice = Account("alice");
auto const bob = Account("bob");
env.fund(XRP(1000), alice, bob);
env.close();
for (bool const withFixURITokenV1 : {true, false})
{
auto const amend =
withFixURITokenV1 ? features : features - fixURITokenV1;
std::string const uri(2, '?');
auto const tid = uritoken::tokenid(alice, uri);
std::string const hexid{strHex(tid)};
auto const txResult =
withFixURITokenV1 ? ter(temMALFORMED) : ter(tefINTERNAL);
// temMALFORMED - cannot include sfDestination without sfAmount
bool const withFixXahauV1 =
env.current()->rules().enabled(fixXahauV1);
auto const txResult =
withFixXahauV1 ? ter(temMALFORMED) : ter(tefINTERNAL);
env(uritoken::mint(alice, uri), uritoken::dest(bob), txResult);
env.close();
Env env{*this, amend};
auto const alice = Account("alice");
auto const bob = Account("bob");
env.fund(XRP(1000), alice, bob);
env.close();
std::string const uri(2, '?');
auto const tid = uritoken::tokenid(alice, uri);
std::string const hexid{strHex(tid)};
// temMALFORMED - cannot include sfDestination without sfAmount
env(uritoken::mint(alice, uri), uritoken::dest(bob), txResult);
env.close();
}
}
// setup env
@@ -454,10 +459,7 @@ struct URIToken_test : public beast::unit_test::suite
using namespace std::literals::chrono_literals;
// setup env
Env env{
*this, envconfig(), features, nullptr, beast::severities::kWarning
// beast::severities::kTrace
};
Env env{*this, features};
auto const alice = Account("alice");
auto const bob = Account("bob");
auto const carol = Account("carol");
@@ -600,7 +602,7 @@ struct URIToken_test : public beast::unit_test::suite
env.close();
// tecNO_LINE_INSUF_RESERVE - insuficient xrp to create line
{
// fund echo 251 xrp (not enough for line reserve)
// fund dave 251 xrp (not enough for line reserve)
env.fund(XRP(251), echo);
env.fund(XRP(301), dave);
env.close();
@@ -618,12 +620,9 @@ struct URIToken_test : public beast::unit_test::suite
env.close();
// tecNO_LINE_INSUF_RESERVE - insuficient xrp to create line
auto const txResult = env.current()->rules().enabled(fixXahauV1)
? ter(tecINSUF_RESERVE_SELLER)
: ter(tecNO_LINE_INSUF_RESERVE);
env(noop(echo), fee(XRP(50)), ter(tesSUCCESS));
env(uritoken::buy(dave, hexid), uritoken::amt(USD(1)), txResult);
env(uritoken::buy(dave, hexid),
uritoken::amt(USD(1)),
ter(tecNO_LINE_INSUF_RESERVE));
env.close();
}
@@ -712,14 +711,12 @@ struct URIToken_test : public beast::unit_test::suite
json(sfDigest.fieldName, digestval));
env.close();
BEAST_EXPECT(inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 1);
BEAST_EXPECT(
to_string(tokenDigest(*env.current(), tid)) == digestval);
// cleanup
env(uritoken::burn(alice, hexid));
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 0);
}
// has digest - has uri - burnable flag
{
@@ -729,14 +726,12 @@ struct URIToken_test : public beast::unit_test::suite
json(sfDigest.fieldName, digestval));
env.close();
BEAST_EXPECT(inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 1);
BEAST_EXPECT(
to_string(tokenDigest(*env.current(), tid)) == digestval);
// cleanup
env(uritoken::burn(alice, hexid));
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 0);
}
// has uri - no flags
{
@@ -744,12 +739,10 @@ struct URIToken_test : public beast::unit_test::suite
env(uritoken::mint(alice, uri));
env.close();
BEAST_EXPECT(inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 1);
// cleanup
env(uritoken::burn(alice, hexid));
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 0);
}
// has uri - burnable flag
{
@@ -757,12 +750,10 @@ struct URIToken_test : public beast::unit_test::suite
env(uritoken::mint(alice, uri), txflags(tfBurnable));
env.close();
BEAST_EXPECT(inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 1);
// cleanup
env(uritoken::burn(alice, hexid));
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 0);
}
// 0 amount and destination
@@ -775,23 +766,14 @@ struct URIToken_test : public beast::unit_test::suite
ter(tesSUCCESS));
env.close();
BEAST_EXPECT(inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 1);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 0);
// buy
env(uritoken::buy(bob, hexid), uritoken::amt(XRP(0)));
env.close();
BEAST_EXPECT(inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 0);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 1);
// cleanup
env(uritoken::burn(bob, hexid));
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 0);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 0);
}
// has amount and destination
@@ -804,23 +786,14 @@ struct URIToken_test : public beast::unit_test::suite
ter(tesSUCCESS));
env.close();
BEAST_EXPECT(inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 1);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 0);
// buy
env(uritoken::buy(bob, hexid), uritoken::amt(XRP(10)));
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 0);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 1);
// cleanup
env(uritoken::burn(bob, hexid));
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 0);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 0);
}
// has amount and no destination
@@ -832,23 +805,14 @@ struct URIToken_test : public beast::unit_test::suite
ter(tesSUCCESS));
env.close();
BEAST_EXPECT(inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 1);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 0);
// buy
env(uritoken::buy(bob, hexid), uritoken::amt(XRP(10)));
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 0);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 1);
// cleanup
env(uritoken::burn(bob, hexid));
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 0);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 0);
}
}
@@ -876,30 +840,16 @@ struct URIToken_test : public beast::unit_test::suite
env(uritoken::mint(alice, uri), txflags(tfBurnable));
env.close();
BEAST_EXPECT(inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 1);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 0);
// alice sells
env(uritoken::sell(alice, hexid), uritoken::amt(XRP(1)));
env.close();
BEAST_EXPECT(inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 1);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 0);
// bob buys
env(uritoken::buy(bob, hexid), uritoken::amt(XRP(1)));
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 0);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 1);
// alice burns
env(uritoken::burn(alice, hexid));
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 0);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 0);
}
// issuer cannot burn
{
@@ -907,33 +857,21 @@ struct URIToken_test : public beast::unit_test::suite
env(uritoken::mint(alice, uri));
env.close();
BEAST_EXPECT(inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 1);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 0);
// alice sells
env(uritoken::sell(alice, hexid), uritoken::amt(XRP(1)));
env.close();
// bob buys
env(uritoken::buy(bob, hexid), uritoken::amt(XRP(1)));
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 0);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 1);
// alice tries to burn
env(uritoken::burn(alice, hexid), ter(tecNO_PERMISSION));
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 0);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 1);
// burn for test reset
env(uritoken::burn(bob, hexid));
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 0);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 0);
}
// owner can burn
{
@@ -941,30 +879,18 @@ struct URIToken_test : public beast::unit_test::suite
env(uritoken::mint(alice, uri));
env.close();
BEAST_EXPECT(inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 1);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 0);
// alice sells
env(uritoken::sell(alice, hexid), uritoken::amt(XRP(1)));
BEAST_EXPECT(inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 1);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 0);
env.close();
// bob buys
env(uritoken::buy(bob, hexid), uritoken::amt(XRP(1)));
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 0);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 1);
// bob burns
env(uritoken::burn(bob, hexid));
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 0);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 0);
}
}
@@ -1004,9 +930,6 @@ struct URIToken_test : public beast::unit_test::suite
env(uritoken::mint(alice, uri));
env.close();
BEAST_EXPECT(inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 2);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 1);
BEAST_EXPECT(env.balance(alice) == preAlice - (1 * feeDrops));
// alice sells
env(uritoken::sell(alice, hexid), uritoken::amt(delta));
@@ -1016,10 +939,7 @@ struct URIToken_test : public beast::unit_test::suite
env(uritoken::buy(bob, hexid), uritoken::amt(delta));
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 1);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 2);
BEAST_EXPECT(
env.balance(alice) == preAlice + delta - (2 * feeDrops));
BEAST_EXPECT(env.balance(bob) == preBob - delta - feeDrops);
@@ -1030,8 +950,6 @@ struct URIToken_test : public beast::unit_test::suite
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 1);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 1);
}
// bob can buy with USD
{
@@ -1044,9 +962,6 @@ struct URIToken_test : public beast::unit_test::suite
env(uritoken::mint(alice, uri));
env.close();
BEAST_EXPECT(inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 2);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 1);
BEAST_EXPECT(env.balance(alice) == preAliceXrp - (1 * feeDrops));
// alice sells
env(uritoken::sell(alice, hexid), uritoken::amt(delta));
@@ -1056,10 +971,7 @@ struct URIToken_test : public beast::unit_test::suite
// bob buys
env(uritoken::buy(bob, hexid), uritoken::amt(delta));
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 1);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 2);
BEAST_EXPECT(env.balance(alice, USD.issue()) == preAlice + delta);
BEAST_EXPECT(env.balance(alice) == preAliceXrp - (2 * feeDrops));
BEAST_EXPECT(env.balance(bob, USD.issue()) == preBob - delta);
@@ -1071,8 +983,6 @@ struct URIToken_test : public beast::unit_test::suite
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 1);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 1);
}
}
@@ -1114,9 +1024,6 @@ struct URIToken_test : public beast::unit_test::suite
env(uritoken::mint(alice, uri));
env.close();
BEAST_EXPECT(inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 2);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 1);
// alice sells
env(uritoken::sell(alice, hexid), uritoken::amt(delta));
env.close();
@@ -1134,10 +1041,7 @@ struct URIToken_test : public beast::unit_test::suite
// bob buys at higher price
env(uritoken::buy(bob, hexid), uritoken::amt(XRP(11)));
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 1);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 2);
BEAST_EXPECT(
env.balance(alice) == preAlice + XRP(11) - (4 * feeDrops));
BEAST_EXPECT(env.balance(bob) == preBob - XRP(11) - (2 * feeDrops));
@@ -1148,8 +1052,6 @@ struct URIToken_test : public beast::unit_test::suite
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 1);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 1);
}
// alice can sell with XRP and dest
{
@@ -1160,9 +1062,6 @@ struct URIToken_test : public beast::unit_test::suite
env(uritoken::mint(alice, uri));
env.close();
BEAST_EXPECT(inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 2);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 1);
// alice sells
env(uritoken::sell(alice, hexid),
uritoken::amt(delta),
@@ -1177,10 +1076,7 @@ struct URIToken_test : public beast::unit_test::suite
// bob buys
env(uritoken::buy(bob, hexid), uritoken::amt(delta));
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 1);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 2);
BEAST_EXPECT(
env.balance(alice) == preAlice + delta - (2 * feeDrops));
BEAST_EXPECT(env.balance(bob) == preBob - delta - (1 * feeDrops));
@@ -1191,8 +1087,6 @@ struct URIToken_test : public beast::unit_test::suite
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 1);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 1);
}
// alice can sell with USD
@@ -1206,9 +1100,6 @@ struct URIToken_test : public beast::unit_test::suite
env(uritoken::mint(alice, uri));
env.close();
BEAST_EXPECT(inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 2);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 1);
// alice sells
env(uritoken::sell(alice, hexid), uritoken::amt(delta));
env.close();
@@ -1227,10 +1118,7 @@ struct URIToken_test : public beast::unit_test::suite
env(uritoken::buy(bob, hexid), uritoken::amt(USD(11)));
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 1);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 2);
BEAST_EXPECT(env.balance(alice, USD.issue()) == preAlice + USD(11));
BEAST_EXPECT(env.balance(alice) == preAliceXrp - (4 * feeDrops));
BEAST_EXPECT(env.balance(bob, USD.issue()) == preBob - USD(11));
@@ -1242,8 +1130,6 @@ struct URIToken_test : public beast::unit_test::suite
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 1);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 1);
}
// alice can sell with USD and dest
{
@@ -1256,9 +1142,6 @@ struct URIToken_test : public beast::unit_test::suite
env(uritoken::mint(alice, uri));
env.close();
BEAST_EXPECT(inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 2);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 1);
// alice sells
env(uritoken::sell(alice, hexid),
uritoken::amt(delta),
@@ -1274,10 +1157,7 @@ struct URIToken_test : public beast::unit_test::suite
env(uritoken::buy(bob, hexid), uritoken::amt(delta));
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 1);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 2);
BEAST_EXPECT(env.balance(alice, USD.issue()) == preAlice + delta);
BEAST_EXPECT(env.balance(alice) == preAliceXrp - (2 * feeDrops));
BEAST_EXPECT(env.balance(bob, USD.issue()) == preBob - delta);
@@ -1289,8 +1169,6 @@ struct URIToken_test : public beast::unit_test::suite
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 1);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 1);
}
}
@@ -1331,9 +1209,6 @@ struct URIToken_test : public beast::unit_test::suite
env(uritoken::mint(alice, uri));
env.close();
BEAST_EXPECT(inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 2);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 1);
// alice sells
env(uritoken::sell(alice, hexid), uritoken::amt(delta));
env.close();
@@ -1353,9 +1228,6 @@ struct URIToken_test : public beast::unit_test::suite
env(uritoken::burn(alice, hexid));
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 1);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 1);
}
// alice can clear / reset USD amount
{
@@ -1364,9 +1236,6 @@ struct URIToken_test : public beast::unit_test::suite
env(uritoken::mint(alice, uri));
env.close();
BEAST_EXPECT(inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 2);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 1);
// alice sells
env(uritoken::sell(alice, hexid), uritoken::amt(delta));
env.close();
@@ -1386,9 +1255,6 @@ struct URIToken_test : public beast::unit_test::suite
env(uritoken::burn(alice, hexid));
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 1);
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 1);
}
}
@@ -1428,8 +1294,8 @@ struct URIToken_test : public beast::unit_test::suite
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 2);
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 1);
// alice sets the sell offer
// bob sets the buy offer
// // alice sets the sell offer
// // bob sets the buy offer
env(uritoken::buy(bob, hexid), uritoken::amt(USD(10)));
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 1);
@@ -1455,8 +1321,8 @@ struct URIToken_test : public beast::unit_test::suite
BEAST_EXPECT(ownerDirCount(*env.current(), alice) == 2);
BEAST_EXPECT(!inOwnerDir(*env.current(), bob, tid));
BEAST_EXPECT(ownerDirCount(*env.current(), bob) == 1);
// alice sets the sell offer
// bob sets the buy offer
// // alice sets the sell offer
// // bob sets the buy offer
env(uritoken::buy(bob, hexid), uritoken::amt(USD(10)));
env.close();
BEAST_EXPECT(!inOwnerDir(*env.current(), alice, tid));
@@ -1967,27 +1833,11 @@ struct URIToken_test : public beast::unit_test::suite
auto const gw = Account{"gateway"};
auto const USD = gw["USD"];
struct TestRateData
{
double rate;
STAmount delta;
std::string multiply;
std::string divide;
};
std::array<TestRateData, 6> testCases = {{
{1, USD(100), "1100", "1100"},
{1.1, USD(100), "1110", "1090.909090909091"},
{1.0005, USD(100), "1100.05", "1099.950024987506"},
{1.005, USD(100), "1100.4999999", "1099.502487661197"},
{1.25, USD(100), "1125", "1080"},
{2, USD(100), "1200", "1050"},
}};
for (auto const& tc : testCases)
// test transfer rate
{
Env env{*this, features};
env.fund(XRP(10000), alice, bob, gw);
env(rate(gw, tc.rate));
env(rate(gw, 1.25));
env.close();
env.trust(USD(100000), alice, bob);
env.close();
@@ -1995,7 +1845,6 @@ struct URIToken_test : public beast::unit_test::suite
env(pay(gw, bob, USD(1000)));
env.close();
auto const preAlice = env.balance(alice, USD.issue());
auto const preBob = env.balance(bob, USD.issue());
// setup mint
@@ -2008,19 +1857,9 @@ struct URIToken_test : public beast::unit_test::suite
env(uritoken::buy(bob, id), uritoken::amt(delta));
env.close();
auto xferRate = transferRate(*env.current(), gw);
auto const postAlice = env.balance(alice, USD.issue());
if (!env.current()->rules().enabled(fixXahauV1))
{
BEAST_EXPECT(to_string(postAlice.value()) == tc.multiply);
}
else
{
BEAST_EXPECT(to_string(postAlice.value()) == tc.divide);
}
BEAST_EXPECT(env.balance(alice, USD.issue()) == USD(1125));
BEAST_EXPECT(env.balance(bob, USD.issue()) == preBob - delta);
}
// test rate change
{
Env env{*this, features};
@@ -2043,16 +1882,29 @@ struct URIToken_test : public beast::unit_test::suite
env(uritoken::sell(alice, id), uritoken::amt(delta));
env.close();
// bob buys at higher rate and burns
env(uritoken::buy(bob, id), uritoken::amt(delta));
env.close();
BEAST_EXPECT(env.balance(alice, USD.issue()) == USD(10125));
BEAST_EXPECT(env.balance(bob, USD.issue()) == preBob - delta);
env(uritoken::burn(bob, id));
// issuer changes rate lower
env(rate(gw, 1.00));
env.close();
// bob buys at higher rate and burns
preBob = env.balance(bob, USD.issue());
// alice mints and sells
env(uritoken::mint(alice, uri));
env(uritoken::sell(alice, id), uritoken::amt(delta));
env.close();
// bob buys at lower rate
env(uritoken::buy(bob, id), uritoken::amt(delta));
env.close();
BEAST_EXPECT(env.balance(alice, USD.issue()) == USD(10100));
BEAST_EXPECT(env.balance(alice, USD.issue()) == USD(10225));
BEAST_EXPECT(env.balance(bob, USD.issue()) == preBob - delta);
env(uritoken::burn(bob, id));
}
// test issuer doesnt pay own rate
{
@@ -2525,7 +2377,6 @@ public:
using namespace test::jtx;
auto const sa = supported_amendments();
testWithFeats(sa);
testWithFeats(sa - fixXahauV1);
}
};

View File

@@ -1750,10 +1750,13 @@ public:
env.fund(XRP(10000), "alice");
env.close();
std::cout << to_string(env.closed()->info().hash) << "\n";
env.fund(XRP(10000), "bob");
env.close();
std::cout << to_string(env.closed()->info().hash) << "\n";
env.fund(XRP(10000), "jim");
env.close();
std::cout << to_string(env.closed()->info().hash) << "\n";
env.fund(XRP(10000), "jill");
{