mirror of
https://github.com/XRPLF/rippled.git
synced 2025-12-06 17:27:55 +00:00
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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user