Merge branch 'dev' into fixXahauV1

This commit is contained in:
Denis Angell
2023-12-19 10:09:41 +01:00
committed by GitHub

View File

@@ -106,10 +106,18 @@ struct GenesisMint_test : public beast::unit_test::suite
using namespace std::literals::chrono_literals; using namespace std::literals::chrono_literals;
Env env{*this, envconfig(), features, nullptr}; Env env{*this, envconfig(), features, nullptr};
// Env env{*this, envconfig(), features, nullptr,
// // beast::severities::kWarning
// beast::severities::kTrace
// };
auto const alice = Account("alice"); auto const alice = Account("alice");
auto const bob = Account("bob"); auto const bob = Account("bob");
auto const invoker = Account("invoker"); auto const invoker = Account("invoker");
env.fund(XRP(10000), alice, bob, invoker); auto const gw = Account("gateway");
auto const USD = gw["USD"];
auto const edward = Account("edward");
env.fund(XRP(10000), alice, bob, invoker, edward);
env.close();
// burn down the total ledger coins so that genesis mints don't mint // burn down the total ledger coins so that genesis mints don't mint
// above 100B tripping invariant // above 100B tripping invariant
@@ -189,14 +197,14 @@ struct GenesisMint_test : public beast::unit_test::suite
auto acc = env.le(keylet::account(carol.id())); auto acc = env.le(keylet::account(carol.id()));
BEAST_EXPECT( BEAST_EXPECT(
acc->getFieldAmount(sfBalance).xrp().drops() == 67890000000ULL); acc->getFieldAmount(sfBalance).xrp().drops() == 67890000000ULL);
BEAST_EXPECT(acc->getFieldU32(sfSequence) == 50); BEAST_EXPECT(acc->getFieldU32(sfSequence) == 60);
} }
{ {
auto acc = env.le(keylet::account(david.id())); auto acc = env.le(keylet::account(david.id()));
BEAST_EXPECT( BEAST_EXPECT(
acc->getFieldAmount(sfBalance).xrp().drops() == 12345000000ULL); acc->getFieldAmount(sfBalance).xrp().drops() == 12345000000ULL);
BEAST_EXPECT(acc->getFieldU32(sfSequence) == 50); BEAST_EXPECT(acc->getFieldU32(sfSequence) == 60);
} }
// lots of entries // lots of entries
@@ -267,9 +275,6 @@ struct GenesisMint_test : public beast::unit_test::suite
// invalid amount should cause emit fail which should cause hook // invalid amount should cause emit fail which should cause hook
// rollback // rollback
auto const gw = Account("gateway");
auto const USD = gw["USD"];
auto const edward = Account("edward");
env(invoke::invoke( env(invoke::invoke(
invoker, invoker,
env.master, env.master,
@@ -278,13 +283,36 @@ struct GenesisMint_test : public beast::unit_test::suite
fee(XRP(1)), fee(XRP(1)),
ter(tecHOOK_REJECTED)); ter(tecHOOK_REJECTED));
// zero xrp is allowed // zero xrp is not allowed
env(invoke::invoke( {
invoker, env(invoke::invoke(
env.master, invoker,
genesis::makeBlob( env.master,
{{edward.id(), XRP(0), std::nullopt, std::nullopt}})), genesis::makeBlob(
fee(XRP(1))); {{edward.id(), XRP(0), std::nullopt, std::nullopt}})),
fee(XRP(1)),
ter(tesSUCCESS));
env.close();
// get the emitted txn id
Json::Value params;
params[jss::transaction] =
env.tx()->getJson(JsonOptions::none)[jss::hash];
auto const jrr = env.rpc("json", "tx", to_string(params));
auto const meta = jrr[jss::result][jss::meta];
auto const emissions = meta[sfHookEmissions.jsonName];
auto const emission = emissions[0u][sfHookEmission.jsonName];
auto const txId = emission[sfEmittedTxnID.jsonName];
env.close();
// verify emitted result
Json::Value params1;
params1[jss::transaction] = txId;
auto const jrr1 = env.rpc("json", "tx", to_string(params1));
auto const meta1 = jrr1[jss::result][jss::meta];
BEAST_EXPECT(meta1[sfTransactionResult.jsonName] == "tecINTERNAL");
}
// missing an amount // missing an amount
env(invoke::invoke( env(invoke::invoke(
@@ -543,8 +571,26 @@ struct GenesisMint_test : public beast::unit_test::suite
})), })),
fee(XRP(1))); fee(XRP(1)));
env.close(); env.close();
// get the emitted txn id
Json::Value params;
params[jss::transaction] =
env.tx()->getJson(JsonOptions::none)[jss::hash];
auto const jrr = env.rpc("json", "tx", to_string(params));
auto const meta = jrr[jss::result][jss::meta];
auto const emissions = meta[sfHookEmissions.jsonName];
auto const emission = emissions[0u][sfHookEmission.jsonName];
auto const txId = emission[sfEmittedTxnID.jsonName];
env.close(); env.close();
// verify emitted result
Json::Value params1;
params1[jss::transaction] = txId;
auto const jrr1 = env.rpc("json", "tx", to_string(params1));
auto const meta1 = jrr1[jss::result][jss::meta];
BEAST_EXPECT(
meta1[sfTransactionResult.jsonName] == "tecINVARIANT_FAILED");
// check balance wasn't changed // check balance wasn't changed
auto const le = env.le(keylet::account(greg.id())); auto const le = env.le(keylet::account(greg.id()));
BEAST_EXPECT( BEAST_EXPECT(
@@ -602,88 +648,22 @@ struct GenesisMint_test : public beast::unit_test::suite
le->getFieldAmount(sfBalance).xrp().drops() == 10000000000ULL); le->getFieldAmount(sfBalance).xrp().drops() == 10000000000ULL);
} }
void
testGenesisMintTSH(FeatureBitset features)
{
testcase("GenesisMint TSH");
using namespace jtx;
using namespace std::literals::chrono_literals;
Env env{*this, envconfig(), features, nullptr};
auto const alice = Account("alice");
auto const bob = Account("bob");
auto const invoker = Account("invoker");
env.fund(XRP(10000), alice, bob, invoker);
// set tsh collect on bob
env(fset(bob, asfTshCollect));
// burn down the total ledger coins so that genesis mints don't mint
// above 100B tripping invariant
env(burn(env.master), fee(XRP(10'000'000ULL)));
env.close();
// set the test hook
env(genesis::setMintHook(env.master), fee(XRP(10)));
env.close();
// set the accept hook
env(genesis::setAcceptHook(bob), fee(XRP(10)));
env.close();
// test a mint
{
env(invoke::invoke(
invoker,
env.master,
genesis::makeBlob({
{bob.id(),
XRP(123).value(),
std::nullopt,
std::nullopt},
})),
fee(XRP(10)),
ter(tesSUCCESS));
env.close();
// get the emitted txn id
Json::Value params;
params[jss::transaction] =
env.tx()->getJson(JsonOptions::none)[jss::hash];
auto const jrr = env.rpc("json", "tx", to_string(params));
auto const meta = jrr[jss::result][jss::meta];
auto const emissions = meta[sfHookEmissions.jsonName];
auto const emission = emissions[0u][sfHookEmission.jsonName];
auto const txId = emission[sfEmittedTxnID.jsonName];
// trigger the emitted txn
env.close();
// verify tsh hook triggered
Json::Value params1;
params1[jss::transaction] = txId;
auto const jrr1 = env.rpc("json", "tx", to_string(params1));
auto const meta1 = jrr1[jss::result][jss::meta];
auto const executions = meta1[sfHookExecutions.jsonName];
auto const execution = executions[0u][sfHookExecution.jsonName];
BEAST_EXPECT(execution[sfHookResult.jsonName] == 3);
}
}
public: public:
void
testWithFeats(FeatureBitset features)
{
testDisabled(features);
testGenesisEmit(features);
testGenesisNonEmit(features);
testNonGenesisEmit(features);
testNonGenesisNonEmit(features);
}
void void
run() override run() override
{ {
using namespace test::jtx; using namespace test::jtx;
auto const sa = supported_amendments(); auto const sa = supported_amendments();
testDisabled(sa); testWithFeats(sa);
testGenesisEmit(sa);
testGenesisNonEmit(sa);
testNonGenesisEmit(sa);
testNonGenesisNonEmit(sa);
testGenesisMintTSH(sa);
} }
}; };