test: enable unit tests to work with variable reference fee (#5145)

Fix remaining unit tests to be able to process reference fee values other than 10.
This commit is contained in:
Vlad
2025-03-25 14:31:25 +00:00
committed by GitHub
parent 67028d6ea6
commit 2bc5cb240f
37 changed files with 801 additions and 384 deletions

View File

@@ -73,6 +73,7 @@ struct Escrow_test : public beast::unit_test::suite
using namespace std::chrono;
Env env(*this);
auto const baseFee = env.current()->fees().base;
env.fund(XRP(5000), "alice", "bob");
env(escrow("alice", "bob", XRP(1000)), finish_time(env.now() + 1s));
env.close();
@@ -82,12 +83,12 @@ struct Escrow_test : public beast::unit_test::suite
env(escrow("alice", "bob", XRP(1000)),
condition(cb1),
finish_time(env.now() + 1s),
fee(1500));
fee(baseFee * 150));
env.close();
env(finish("bob", "alice", seq1),
condition(cb1),
fulfillment(fb1),
fee(1500));
fee(baseFee * 150));
auto const seq2 = env.seq("alice");
@@ -95,9 +96,9 @@ struct Escrow_test : public beast::unit_test::suite
condition(cb2),
finish_time(env.now() + 1s),
cancel_time(env.now() + 2s),
fee(1500));
fee(baseFee * 150));
env.close();
env(cancel("bob", "alice", seq2), fee(1500));
env(cancel("bob", "alice", seq2), fee(baseFee * 150));
}
void
@@ -109,6 +110,7 @@ struct Escrow_test : public beast::unit_test::suite
{
testcase("Timing: Finish Only");
Env env(*this);
auto const baseFee = env.current()->fees().base;
env.fund(XRP(5000), "alice", "bob");
env.close();
@@ -122,15 +124,16 @@ struct Escrow_test : public beast::unit_test::suite
// prematurely.
for (; env.now() < ts; env.close())
env(finish("bob", "alice", seq),
fee(1500),
fee(baseFee * 150),
ter(tecNO_PERMISSION));
env(finish("bob", "alice", seq), fee(1500));
env(finish("bob", "alice", seq), fee(baseFee * 150));
}
{
testcase("Timing: Cancel Only");
Env env(*this);
auto const baseFee = env.current()->fees().base;
env.fund(XRP(5000), "alice", "bob");
env.close();
@@ -146,23 +149,24 @@ struct Escrow_test : public beast::unit_test::suite
// prematurely.
for (; env.now() < ts; env.close())
env(cancel("bob", "alice", seq),
fee(1500),
fee(baseFee * 150),
ter(tecNO_PERMISSION));
// Verify that a finish won't work anymore.
env(finish("bob", "alice", seq),
condition(cb1),
fulfillment(fb1),
fee(1500),
fee(baseFee * 150),
ter(tecNO_PERMISSION));
// Verify that the cancel will succeed
env(cancel("bob", "alice", seq), fee(1500));
env(cancel("bob", "alice", seq), fee(baseFee * 150));
}
{
testcase("Timing: Finish and Cancel -> Finish");
Env env(*this);
auto const baseFee = env.current()->fees().base;
env.fund(XRP(5000), "alice", "bob");
env.close();
@@ -180,23 +184,26 @@ struct Escrow_test : public beast::unit_test::suite
for (; env.now() < fts; env.close())
{
env(finish("bob", "alice", seq),
fee(1500),
fee(baseFee * 150),
ter(tecNO_PERMISSION));
env(cancel("bob", "alice", seq),
fee(1500),
fee(baseFee * 150),
ter(tecNO_PERMISSION));
}
// Verify that a cancel still won't work
env(cancel("bob", "alice", seq), fee(1500), ter(tecNO_PERMISSION));
env(cancel("bob", "alice", seq),
fee(baseFee * 150),
ter(tecNO_PERMISSION));
// And verify that a finish will
env(finish("bob", "alice", seq), fee(1500));
env(finish("bob", "alice", seq), fee(baseFee * 150));
}
{
testcase("Timing: Finish and Cancel -> Cancel");
Env env(*this);
auto const baseFee = env.current()->fees().base;
env.fund(XRP(5000), "alice", "bob");
env.close();
@@ -214,10 +221,10 @@ struct Escrow_test : public beast::unit_test::suite
for (; env.now() < fts; env.close())
{
env(finish("bob", "alice", seq),
fee(1500),
fee(baseFee * 150),
ter(tecNO_PERMISSION));
env(cancel("bob", "alice", seq),
fee(1500),
fee(baseFee * 150),
ter(tecNO_PERMISSION));
}
@@ -225,15 +232,17 @@ struct Escrow_test : public beast::unit_test::suite
// prematurely. At this point a finish would succeed.
for (; env.now() < cts; env.close())
env(cancel("bob", "alice", seq),
fee(1500),
fee(baseFee * 150),
ter(tecNO_PERMISSION));
// Verify that finish will no longer work, since we are past the
// cancel activation time.
env(finish("bob", "alice", seq), fee(1500), ter(tecNO_PERMISSION));
env(finish("bob", "alice", seq),
fee(baseFee * 150),
ter(tecNO_PERMISSION));
// And verify that a cancel will succeed.
env(cancel("bob", "alice", seq), fee(1500));
env(cancel("bob", "alice", seq), fee(baseFee * 150));
}
}
@@ -312,6 +321,7 @@ struct Escrow_test : public beast::unit_test::suite
testcase("Implied Finish Time (without fix1571)");
Env env(*this, supported_amendments() - fix1571);
auto const baseFee = env.current()->fees().base;
env.fund(XRP(5000), "alice", "bob", "carol");
env.close();
@@ -320,9 +330,9 @@ struct Escrow_test : public beast::unit_test::suite
auto const seq1 = env.seq("alice");
env(escrow("alice", "bob", XRP(100)),
cancel_time(env.now() + 1s),
fee(1500));
fee(baseFee * 150));
env.close();
env(finish("carol", "alice", seq1), fee(1500));
env(finish("carol", "alice", seq1), fee(baseFee * 150));
BEAST_EXPECT(env.balance("bob") == XRP(5100));
env.close();
@@ -333,12 +343,12 @@ struct Escrow_test : public beast::unit_test::suite
env(escrow("alice", "bob", XRP(100)),
cancel_time(env.now() + 1s),
condition(cb1),
fee(1500));
fee(baseFee * 150));
env.close();
env(finish("carol", "alice", seq2),
condition(cb1),
fulfillment(fb1),
fee(1500));
fee(baseFee * 150));
BEAST_EXPECT(env.balance("bob") == XRP(5200));
}
@@ -346,13 +356,14 @@ struct Escrow_test : public beast::unit_test::suite
testcase("Implied Finish Time (with fix1571)");
Env env(*this);
auto const baseFee = env.current()->fees().base;
env.fund(XRP(5000), "alice", "bob", "carol");
env.close();
// Creating an escrow with only a cancel time is not allowed:
env(escrow("alice", "bob", XRP(100)),
cancel_time(env.now() + 90s),
fee(1500),
fee(baseFee * 150),
ter(temMALFORMED));
// Creating an escrow with only a cancel time and a condition is
@@ -361,12 +372,12 @@ struct Escrow_test : public beast::unit_test::suite
env(escrow("alice", "bob", XRP(100)),
cancel_time(env.now() + 90s),
condition(cb1),
fee(1500));
fee(baseFee * 150));
env.close();
env(finish("carol", "alice", seq),
condition(cb1),
fulfillment(fb1),
fee(1500));
fee(baseFee * 150));
BEAST_EXPECT(env.balance("bob") == XRP(5100));
}
}
@@ -380,6 +391,7 @@ struct Escrow_test : public beast::unit_test::suite
using namespace std::chrono;
Env env(*this);
auto const baseFee = env.current()->fees().base;
env.fund(XRP(5000), "alice", "bob");
env.close();
@@ -482,10 +494,10 @@ struct Escrow_test : public beast::unit_test::suite
auto const seq = env.seq("hannah");
env(escrow("hannah", "hannah", XRP(10)),
finish_time(env.now() + 1s),
fee(1500));
fee(150 * baseFee));
env.close();
env(finish("hannah", "hannah", seq + 7),
fee(1500),
fee(150 * baseFee),
ter(tecNO_TARGET));
}
@@ -498,7 +510,7 @@ struct Escrow_test : public beast::unit_test::suite
env(finish("ivan", "ivan", seq),
condition(cb1),
fulfillment(fb1),
fee(1500),
fee(150 * baseFee),
ter(tecCRYPTOCONDITION_ERROR));
}
}
@@ -514,11 +526,12 @@ struct Escrow_test : public beast::unit_test::suite
{
// Unconditional
Env env(*this);
auto const baseFee = env.current()->fees().base;
env.fund(XRP(5000), "alice", "bob");
auto const seq = env.seq("alice");
env(escrow("alice", "alice", XRP(1000)),
finish_time(env.now() + 5s));
env.require(balance("alice", XRP(4000) - drops(10)));
env.require(balance("alice", XRP(4000) - drops(baseFee)));
// Not enough time has elapsed for a finish and canceling isn't
// possible.
@@ -531,17 +544,18 @@ struct Escrow_test : public beast::unit_test::suite
// Finish should succeed. Verify funds.
env(finish("bob", "alice", seq));
env.require(balance("alice", XRP(5000) - drops(10)));
env.require(balance("alice", XRP(5000) - drops(baseFee)));
}
{
// Unconditionally pay from Alice to Bob. Zelda (neither source nor
// destination) signs all cancels and finishes. This shows that
// Escrow will make a payment to Bob with no intervention from Bob.
Env env(*this);
auto const baseFee = env.current()->fees().base;
env.fund(XRP(5000), "alice", "bob", "zelda");
auto const seq = env.seq("alice");
env(escrow("alice", "bob", XRP(1000)), finish_time(env.now() + 5s));
env.require(balance("alice", XRP(4000) - drops(10)));
env.require(balance("alice", XRP(4000) - drops(baseFee)));
// Not enough time has elapsed for a finish and canceling isn't
// possible.
@@ -556,13 +570,14 @@ struct Escrow_test : public beast::unit_test::suite
env(finish("zelda", "alice", seq));
env.close();
env.require(balance("alice", XRP(4000) - drops(10)));
env.require(balance("alice", XRP(4000) - drops(baseFee)));
env.require(balance("bob", XRP(6000)));
env.require(balance("zelda", XRP(5000) - drops(40)));
env.require(balance("zelda", XRP(5000) - drops(4 * baseFee)));
}
{
// Bob sets DepositAuth so only Bob can finish the escrow.
Env env(*this);
auto const baseFee = env.current()->fees().base;
env.fund(XRP(5000), "alice", "bob", "zelda");
env(fset("bob", asfDepositAuth));
@@ -570,7 +585,7 @@ struct Escrow_test : public beast::unit_test::suite
auto const seq = env.seq("alice");
env(escrow("alice", "bob", XRP(1000)), finish_time(env.now() + 5s));
env.require(balance("alice", XRP(4000) - drops(10)));
env.require(balance("alice", XRP(4000) - drops(baseFee)));
// Not enough time has elapsed for a finish and canceling isn't
// possible.
@@ -592,7 +607,6 @@ struct Escrow_test : public beast::unit_test::suite
env(finish("bob", "alice", seq));
env.close();
auto const baseFee = env.current()->fees().base;
env.require(balance("alice", XRP(4000) - (baseFee * 5)));
env.require(balance("bob", XRP(6000) - (baseFee * 5)));
env.require(balance("zelda", XRP(5000) - (baseFee * 4)));
@@ -601,6 +615,7 @@ struct Escrow_test : public beast::unit_test::suite
// Bob sets DepositAuth but preauthorizes Zelda, so Zelda can
// finish the escrow.
Env env(*this);
auto const baseFee = env.current()->fees().base;
env.fund(XRP(5000), "alice", "bob", "zelda");
env(fset("bob", asfDepositAuth));
@@ -610,7 +625,7 @@ struct Escrow_test : public beast::unit_test::suite
auto const seq = env.seq("alice");
env(escrow("alice", "bob", XRP(1000)), finish_time(env.now() + 5s));
env.require(balance("alice", XRP(4000) - drops(10)));
env.require(balance("alice", XRP(4000) - drops(baseFee)));
env.close();
// DepositPreauth allows Finish to succeed for either Zelda or
@@ -620,7 +635,6 @@ struct Escrow_test : public beast::unit_test::suite
env(finish("zelda", "alice", seq));
env.close();
auto const baseFee = env.current()->fees().base;
env.require(balance("alice", XRP(4000) - (baseFee * 2)));
env.require(balance("bob", XRP(6000) - (baseFee * 2)));
env.require(balance("zelda", XRP(5000) - (baseFee * 1)));
@@ -628,12 +642,13 @@ struct Escrow_test : public beast::unit_test::suite
{
// Conditional
Env env(*this);
auto const baseFee = env.current()->fees().base;
env.fund(XRP(5000), "alice", "bob");
auto const seq = env.seq("alice");
env(escrow("alice", "alice", XRP(1000)),
condition(cb2),
finish_time(env.now() + 5s));
env.require(balance("alice", XRP(4000) - drops(10)));
env.require(balance("alice", XRP(4000) - drops(baseFee)));
// Not enough time has elapsed for a finish and canceling isn't
// possible.
@@ -643,13 +658,13 @@ struct Escrow_test : public beast::unit_test::suite
env(finish("alice", "alice", seq),
condition(cb2),
fulfillment(fb2),
fee(1500),
fee(150 * baseFee),
ter(tecNO_PERMISSION));
env(finish("bob", "alice", seq), ter(tecNO_PERMISSION));
env(finish("bob", "alice", seq),
condition(cb2),
fulfillment(fb2),
fee(1500),
fee(150 * baseFee),
ter(tecNO_PERMISSION));
env.close();
@@ -664,18 +679,19 @@ struct Escrow_test : public beast::unit_test::suite
env(finish("bob", "alice", seq),
condition(cb2),
fulfillment(fb2),
fee(1500));
fee(150 * baseFee));
}
{
// Self-escrowed conditional with DepositAuth.
Env env(*this);
auto const baseFee = env.current()->fees().base;
env.fund(XRP(5000), "alice", "bob");
auto const seq = env.seq("alice");
env(escrow("alice", "alice", XRP(1000)),
condition(cb3),
finish_time(env.now() + 5s));
env.require(balance("alice", XRP(4000) - drops(10)));
env.require(balance("alice", XRP(4000) - drops(baseFee)));
env.close();
// Finish is now possible but requires the cryptocondition.
@@ -690,28 +706,29 @@ struct Escrow_test : public beast::unit_test::suite
env(finish("alice", "alice", seq),
condition(cb2),
fulfillment(fb2),
fee(1500),
fee(150 * baseFee),
ter(tecCRYPTOCONDITION_ERROR));
env(finish("bob", "alice", seq),
condition(cb3),
fulfillment(fb3),
fee(1500),
fee(150 * baseFee),
ter(tecNO_PERMISSION));
env(finish("alice", "alice", seq),
condition(cb3),
fulfillment(fb3),
fee(1500));
fee(150 * baseFee));
}
{
// Self-escrowed conditional with DepositAuth and DepositPreauth.
Env env(*this);
auto const baseFee = env.current()->fees().base;
env.fund(XRP(5000), "alice", "bob", "zelda");
auto const seq = env.seq("alice");
env(escrow("alice", "alice", XRP(1000)),
condition(cb3),
finish_time(env.now() + 5s));
env.require(balance("alice", XRP(4000) - drops(10)));
env.require(balance("alice", XRP(4000) - drops(baseFee)));
env.close();
// Alice preauthorizes Zelda for deposit, even though Alice has not
@@ -732,17 +749,17 @@ struct Escrow_test : public beast::unit_test::suite
env(finish("alice", "alice", seq),
condition(cb2),
fulfillment(fb2),
fee(1500),
fee(150 * baseFee),
ter(tecCRYPTOCONDITION_ERROR));
env(finish("bob", "alice", seq),
condition(cb3),
fulfillment(fb3),
fee(1500),
fee(150 * baseFee),
ter(tecNO_PERMISSION));
env(finish("zelda", "alice", seq),
condition(cb3),
fulfillment(fb3),
fee(1500));
fee(150 * baseFee));
}
}
@@ -756,6 +773,7 @@ struct Escrow_test : public beast::unit_test::suite
{ // Test cryptoconditions
Env env(*this);
auto const baseFee = env.current()->fees().base;
env.fund(XRP(5000), "alice", "bob", "carol");
auto const seq = env.seq("alice");
BEAST_EXPECT((*env.le("alice"))[sfOwnerCount] == 0);
@@ -763,7 +781,7 @@ struct Escrow_test : public beast::unit_test::suite
condition(cb1),
cancel_time(env.now() + 1s));
BEAST_EXPECT((*env.le("alice"))[sfOwnerCount] == 1);
env.require(balance("alice", XRP(4000) - drops(10)));
env.require(balance("alice", XRP(4000) - drops(baseFee)));
env.require(balance("carol", XRP(5000)));
env(cancel("bob", "alice", seq), ter(tecNO_PERMISSION));
BEAST_EXPECT((*env.le("alice"))[sfOwnerCount] == 1);
@@ -776,19 +794,19 @@ struct Escrow_test : public beast::unit_test::suite
env(finish("bob", "alice", seq),
condition(cb1),
fulfillment(cb1),
fee(1500),
fee(150 * baseFee),
ter(tecCRYPTOCONDITION_ERROR));
BEAST_EXPECT((*env.le("alice"))[sfOwnerCount] == 1);
env(finish("bob", "alice", seq),
condition(cb1),
fulfillment(cb2),
fee(1500),
fee(150 * baseFee),
ter(tecCRYPTOCONDITION_ERROR));
BEAST_EXPECT((*env.le("alice"))[sfOwnerCount] == 1);
env(finish("bob", "alice", seq),
condition(cb1),
fulfillment(cb3),
fee(1500),
fee(150 * baseFee),
ter(tecCRYPTOCONDITION_ERROR));
BEAST_EXPECT((*env.le("alice"))[sfOwnerCount] == 1);
@@ -797,19 +815,19 @@ struct Escrow_test : public beast::unit_test::suite
env(finish("bob", "alice", seq),
condition(cb2),
fulfillment(fb1),
fee(1500),
fee(150 * baseFee),
ter(tecCRYPTOCONDITION_ERROR));
BEAST_EXPECT((*env.le("alice"))[sfOwnerCount] == 1);
env(finish("bob", "alice", seq),
condition(cb2),
fulfillment(fb2),
fee(1500),
fee(150 * baseFee),
ter(tecCRYPTOCONDITION_ERROR));
BEAST_EXPECT((*env.le("alice"))[sfOwnerCount] == 1);
env(finish("bob", "alice", seq),
condition(cb2),
fulfillment(fb3),
fee(1500),
fee(150 * baseFee),
ter(tecCRYPTOCONDITION_ERROR));
BEAST_EXPECT((*env.le("alice"))[sfOwnerCount] == 1);
@@ -817,7 +835,7 @@ struct Escrow_test : public beast::unit_test::suite
env(finish("bob", "alice", seq),
condition(cb1),
fulfillment(fb1),
fee(1500));
fee(150 * baseFee));
// SLE removed on finish
BEAST_EXPECT(!env.le(keylet::escrow(Account("alice").id(), seq)));
@@ -829,6 +847,7 @@ struct Escrow_test : public beast::unit_test::suite
}
{ // Test cancel when condition is present
Env env(*this);
auto const baseFee = env.current()->fees().base;
env.fund(XRP(5000), "alice", "bob", "carol");
auto const seq = env.seq("alice");
BEAST_EXPECT((*env.le("alice"))[sfOwnerCount] == 0);
@@ -836,15 +855,16 @@ struct Escrow_test : public beast::unit_test::suite
condition(cb2),
cancel_time(env.now() + 1s));
env.close();
env.require(balance("alice", XRP(4000) - drops(10)));
env.require(balance("alice", XRP(4000) - drops(baseFee)));
// balance restored on cancel
env(cancel("bob", "alice", seq));
env.require(balance("alice", XRP(5000) - drops(10)));
env.require(balance("alice", XRP(5000) - drops(baseFee)));
// SLE removed on cancel
BEAST_EXPECT(!env.le(keylet::escrow(Account("alice").id(), seq)));
}
{
Env env(*this);
auto const baseFee = env.current()->fees().base;
env.fund(XRP(5000), "alice", "bob", "carol");
env.close();
auto const seq = env.seq("alice");
@@ -860,7 +880,7 @@ struct Escrow_test : public beast::unit_test::suite
env(finish("bob", "alice", seq),
condition(cb3),
fulfillment(fb3),
fee(1500),
fee(150 * baseFee),
ter(tecNO_PERMISSION));
BEAST_EXPECT((*env.le("alice"))[sfOwnerCount] == 1);
env.require(balance("carol", XRP(5000)));
@@ -910,16 +930,17 @@ struct Escrow_test : public beast::unit_test::suite
ter(temMALFORMED));
auto const seq = env.seq("alice");
auto const baseFee = env.current()->fees().base;
env(escrow("alice", "carol", XRP(1000)),
condition(Slice{p + 1, s - 2}),
cancel_time(ts),
fee(100));
fee(10 * baseFee));
env(finish("bob", "alice", seq),
condition(cb1),
fulfillment(fb1),
fee(1500));
env.require(balance("alice", XRP(4000) - drops(100)));
env.require(balance("bob", XRP(5000) - drops(1500)));
fee(150 * baseFee));
env.require(balance("alice", XRP(4000) - drops(10 * baseFee)));
env.require(balance("bob", XRP(5000) - drops(150 * baseFee)));
env.require(balance("carol", XRP(6000)));
}
{ // Test long and short conditions & fulfillments during finish
@@ -974,97 +995,98 @@ struct Escrow_test : public beast::unit_test::suite
ter(temMALFORMED));
auto const seq = env.seq("alice");
auto const baseFee = env.current()->fees().base;
env(escrow("alice", "carol", XRP(1000)),
condition(Slice{cp + 1, cs - 2}),
cancel_time(ts),
fee(100));
fee(10 * baseFee));
// Now, try to fulfill using the same sequence of
// malformed conditions.
env(finish("bob", "alice", seq),
condition(Slice{cp, cs}),
fulfillment(Slice{fp, fs}),
fee(1500),
fee(150 * baseFee),
ter(tecCRYPTOCONDITION_ERROR));
env(finish("bob", "alice", seq),
condition(Slice{cp, cs - 1}),
fulfillment(Slice{fp, fs}),
fee(1500),
fee(150 * baseFee),
ter(tecCRYPTOCONDITION_ERROR));
env(finish("bob", "alice", seq),
condition(Slice{cp, cs - 2}),
fulfillment(Slice{fp, fs}),
fee(1500),
fee(150 * baseFee),
ter(tecCRYPTOCONDITION_ERROR));
env(finish("bob", "alice", seq),
condition(Slice{cp + 1, cs - 1}),
fulfillment(Slice{fp, fs}),
fee(1500),
fee(150 * baseFee),
ter(tecCRYPTOCONDITION_ERROR));
env(finish("bob", "alice", seq),
condition(Slice{cp + 1, cs - 3}),
fulfillment(Slice{fp, fs}),
fee(1500),
fee(150 * baseFee),
ter(tecCRYPTOCONDITION_ERROR));
env(finish("bob", "alice", seq),
condition(Slice{cp + 2, cs - 2}),
fulfillment(Slice{fp, fs}),
fee(1500),
fee(150 * baseFee),
ter(tecCRYPTOCONDITION_ERROR));
env(finish("bob", "alice", seq),
condition(Slice{cp + 2, cs - 3}),
fulfillment(Slice{fp, fs}),
fee(1500),
fee(150 * baseFee),
ter(tecCRYPTOCONDITION_ERROR));
// Now, using the correct condition, try malformed fulfillments:
env(finish("bob", "alice", seq),
condition(Slice{cp + 1, cs - 2}),
fulfillment(Slice{fp, fs}),
fee(1500),
fee(150 * baseFee),
ter(tecCRYPTOCONDITION_ERROR));
env(finish("bob", "alice", seq),
condition(Slice{cp + 1, cs - 2}),
fulfillment(Slice{fp, fs - 1}),
fee(1500),
fee(150 * baseFee),
ter(tecCRYPTOCONDITION_ERROR));
env(finish("bob", "alice", seq),
condition(Slice{cp + 1, cs - 2}),
fulfillment(Slice{fp, fs - 2}),
fee(1500),
fee(150 * baseFee),
ter(tecCRYPTOCONDITION_ERROR));
env(finish("bob", "alice", seq),
condition(Slice{cp + 1, cs - 2}),
fulfillment(Slice{fp + 1, fs - 1}),
fee(1500),
fee(150 * baseFee),
ter(tecCRYPTOCONDITION_ERROR));
env(finish("bob", "alice", seq),
condition(Slice{cp + 1, cs - 2}),
fulfillment(Slice{fp + 1, fs - 3}),
fee(1500),
fee(150 * baseFee),
ter(tecCRYPTOCONDITION_ERROR));
env(finish("bob", "alice", seq),
condition(Slice{cp + 1, cs - 2}),
fulfillment(Slice{fp + 1, fs - 3}),
fee(1500),
fee(150 * baseFee),
ter(tecCRYPTOCONDITION_ERROR));
env(finish("bob", "alice", seq),
condition(Slice{cp + 1, cs - 2}),
fulfillment(Slice{fp + 2, fs - 2}),
fee(1500),
fee(150 * baseFee),
ter(tecCRYPTOCONDITION_ERROR));
env(finish("bob", "alice", seq),
condition(Slice{cp + 1, cs - 2}),
fulfillment(Slice{fp + 2, fs - 3}),
fee(1500),
fee(150 * baseFee),
ter(tecCRYPTOCONDITION_ERROR));
// Now try for the right one
env(finish("bob", "alice", seq),
condition(cb2),
fulfillment(fb2),
fee(1500));
env.require(balance("alice", XRP(4000) - drops(100)));
fee(150 * baseFee));
env.require(balance("alice", XRP(4000) - drops(10 * baseFee)));
env.require(balance("carol", XRP(6000)));
}
{ // Test empty condition during creation and
@@ -1078,6 +1100,7 @@ struct Escrow_test : public beast::unit_test::suite
ter(temMALFORMED));
auto const seq = env.seq("alice");
auto const baseFee = env.current()->fees().base;
env(escrow("alice", "carol", XRP(1000)),
condition(cb3),
cancel_time(env.now() + 1s));
@@ -1085,17 +1108,17 @@ struct Escrow_test : public beast::unit_test::suite
env(finish("bob", "alice", seq),
condition(Slice{}),
fulfillment(Slice{}),
fee(1500),
fee(150 * baseFee),
ter(tecCRYPTOCONDITION_ERROR));
env(finish("bob", "alice", seq),
condition(cb3),
fulfillment(Slice{}),
fee(1500),
fee(150 * baseFee),
ter(tecCRYPTOCONDITION_ERROR));
env(finish("bob", "alice", seq),
condition(Slice{}),
fulfillment(fb3),
fee(1500),
fee(150 * baseFee),
ter(tecCRYPTOCONDITION_ERROR));
// Assemble finish that is missing the Condition or the Fulfillment
@@ -1109,9 +1132,9 @@ struct Escrow_test : public beast::unit_test::suite
env(finish("bob", "alice", seq),
condition(cb3),
fulfillment(fb3),
fee(1500));
fee(150 * baseFee));
env.require(balance("carol", XRP(6000)));
env.require(balance("alice", XRP(4000) - drops(10)));
env.require(balance("alice", XRP(4000) - drops(baseFee)));
}
{ // Test a condition other than PreimageSha256, which
// would require a separate amendment
@@ -1319,6 +1342,7 @@ struct Escrow_test : public beast::unit_test::suite
using namespace jtx;
using namespace std::chrono;
Env env(*this);
auto const baseFee = env.current()->fees().base;
env.memoize("alice");
env.memoize("bob");
@@ -1329,7 +1353,7 @@ struct Escrow_test : public beast::unit_test::suite
escrow("alice", "carol", XRP(1000)),
finish_time(env.now() + 1s),
seq(1),
fee(10));
fee(baseFee));
auto const pf = preflight(
env.app(),
env.current()->rules(),
@@ -1338,12 +1362,13 @@ struct Escrow_test : public beast::unit_test::suite
env.journal);
BEAST_EXPECT(pf.ter == tesSUCCESS);
BEAST_EXPECT(!pf.consequences.isBlocker());
BEAST_EXPECT(pf.consequences.fee() == drops(10));
BEAST_EXPECT(pf.consequences.fee() == drops(baseFee));
BEAST_EXPECT(pf.consequences.potentialSpend() == XRP(1000));
}
{
auto const jtx = env.jt(cancel("bob", "alice", 3), seq(1), fee(10));
auto const jtx =
env.jt(cancel("bob", "alice", 3), seq(1), fee(baseFee));
auto const pf = preflight(
env.app(),
env.current()->rules(),
@@ -1352,12 +1377,13 @@ struct Escrow_test : public beast::unit_test::suite
env.journal);
BEAST_EXPECT(pf.ter == tesSUCCESS);
BEAST_EXPECT(!pf.consequences.isBlocker());
BEAST_EXPECT(pf.consequences.fee() == drops(10));
BEAST_EXPECT(pf.consequences.fee() == drops(baseFee));
BEAST_EXPECT(pf.consequences.potentialSpend() == XRP(0));
}
{
auto const jtx = env.jt(finish("bob", "alice", 3), seq(1), fee(10));
auto const jtx =
env.jt(finish("bob", "alice", 3), seq(1), fee(baseFee));
auto const pf = preflight(
env.app(),
env.current()->rules(),
@@ -1366,7 +1392,7 @@ struct Escrow_test : public beast::unit_test::suite
env.journal);
BEAST_EXPECT(pf.ter == tesSUCCESS);
BEAST_EXPECT(!pf.consequences.isBlocker());
BEAST_EXPECT(pf.consequences.fee() == drops(10));
BEAST_EXPECT(pf.consequences.fee() == drops(baseFee));
BEAST_EXPECT(pf.consequences.potentialSpend() == XRP(0));
}
}
@@ -1384,6 +1410,7 @@ struct Escrow_test : public beast::unit_test::suite
{
// Create escrow and finish using tickets.
Env env(*this);
auto const baseFee = env.current()->fees().base;
env.fund(XRP(5000), alice, bob);
env.close();
@@ -1422,7 +1449,7 @@ struct Escrow_test : public beast::unit_test::suite
for (; env.now() < ts; env.close())
{
env(finish(bob, alice, escrowSeq),
fee(1500),
fee(150 * baseFee),
ticket::use(--bobTicket),
ter(tecNO_PERMISSION));
BEAST_EXPECT(env.seq(bob) == bobRootSeq);
@@ -1430,21 +1457,21 @@ struct Escrow_test : public beast::unit_test::suite
// bob tries to re-use a ticket, which is rejected.
env(finish(bob, alice, escrowSeq),
fee(1500),
fee(150 * baseFee),
ticket::use(bobTicket),
ter(tefNO_TICKET));
// bob uses one of his remaining tickets. Success!
env(finish(bob, alice, escrowSeq),
fee(1500),
fee(150 * baseFee),
ticket::use(--bobTicket));
env.close();
BEAST_EXPECT(env.seq(bob) == bobRootSeq);
}
{
// Create escrow and cancel using tickets.
Env env(*this);
auto const baseFee = env.current()->fees().base;
env.fund(XRP(5000), alice, bob);
env.close();
@@ -1483,7 +1510,7 @@ struct Escrow_test : public beast::unit_test::suite
for (; env.now() < ts; env.close())
{
env(cancel(bob, alice, escrowSeq),
fee(1500),
fee(150 * baseFee),
ticket::use(bobTicket++),
ter(tecNO_PERMISSION));
BEAST_EXPECT(env.seq(bob) == bobRootSeq);
@@ -1493,14 +1520,14 @@ struct Escrow_test : public beast::unit_test::suite
env(finish(bob, alice, escrowSeq),
condition(cb1),
fulfillment(fb1),
fee(1500),
fee(150 * baseFee),
ticket::use(bobTicket++),
ter(tecNO_PERMISSION));
BEAST_EXPECT(env.seq(bob) == bobRootSeq);
// Verify that the cancel succeeds.
env(cancel(bob, alice, escrowSeq),
fee(1500),
fee(150 * baseFee),
ticket::use(bobTicket++));
env.close();
BEAST_EXPECT(env.seq(bob) == bobRootSeq);