From abaf21333633b8db8eb3d2982f54c2cc9bd508f9 Mon Sep 17 00:00:00 2001 From: Bronek Kozicki Date: Thu, 27 Mar 2025 14:07:37 +0000 Subject: [PATCH] Fix clang, minor refactor of createPseudoAccount --- src/test/app/Vault_test.cpp | 23 ++++++++++++----------- src/xrpld/ledger/View.h | 2 +- src/xrpld/ledger/detail/View.cpp | 31 +++++++++++++++++++------------ 3 files changed, 32 insertions(+), 24 deletions(-) diff --git a/src/test/app/Vault_test.cpp b/src/test/app/Vault_test.cpp index 5f1288e9bd..cd28caa0bd 100644 --- a/src/test/app/Vault_test.cpp +++ b/src/test/app/Vault_test.cpp @@ -348,7 +348,7 @@ class Vault_test : public beast::unit_test::suite Account issuer{"issuer"}; Account owner{"owner"}; Account depositor{"depositor"}; - Vault vault(env); + Vault vault{env}; env.fund(XRP(1000), issuer, owner, depositor); env.close(); env(fset(issuer, asfAllowTrustLineClawback)); @@ -413,7 +413,7 @@ class Vault_test : public beast::unit_test::suite Account depositor{"depositor"}; env.fund(XRP(1000), issuer, owner, depositor); env.close(); - Vault vault(env); + Vault vault{env}; Asset asset = xrpIssue(); test(env, issuer, owner, depositor, asset, vault); @@ -635,7 +635,7 @@ class Vault_test : public beast::unit_test::suite Account depositor{"depositor"}; env.fund(XRP(1000), issuer, owner, depositor); env.close(); - Vault vault(env); + Vault vault{env}; Asset asset = issuer["IOU"]; auto [tx, keylet] = vault.create({.owner = owner, .asset = asset}); @@ -656,7 +656,7 @@ class Vault_test : public beast::unit_test::suite Account depositor{"depositor"}; env.fund(XRP(1000), issuer, owner, depositor); env.close(); - Vault vault(env); + Vault vault{env}; MPTTester mptt{env, issuer, mptInitNoFund}; @@ -678,7 +678,7 @@ class Vault_test : public beast::unit_test::suite env.fund(XRP(1000), issuer, owner, depositor); env.close(); - Vault vault(env); + Vault vault{env}; PrettyAsset asset = issuer["IOU"]; env.trust(asset(1000), owner); env(pay(issuer, owner, asset(100))); @@ -801,7 +801,7 @@ class Vault_test : public beast::unit_test::suite Account depositor{"depositor"}; env.fund(XRP(1000), issuer, owner, depositor); env.close(); - Vault vault(env); + Vault vault{env}; MPTTester mptt{env, issuer, mptInitNoFund}; mptt.create({.flags = tfMPTCanTransfer | tfMPTCanLock}); @@ -888,7 +888,7 @@ class Vault_test : public beast::unit_test::suite Account credIssuer1{"credIssuer1"}; Account credIssuer2{"credIssuer2"}; std::string const credType = "credential"; - Vault vault(env); + Vault vault{env}; env.fund( XRP(1000), issuer, @@ -1063,7 +1063,7 @@ class Vault_test : public beast::unit_test::suite Account const owner{"owner"}; Account const issuer{"issuer"}; Account const charlie{"charlie"}; - Vault vault(env); + Vault vault{env}; env.fund(XRP(1000), issuer, owner, charlie); env.close(); @@ -1113,12 +1113,13 @@ class Vault_test : public beast::unit_test::suite BEAST_EXPECT( keylet::vault(ownerAccount, env.seq(owner) - 1).key == keylet.key); - auto const vaultBalance = [&]() -> PrettyAmount { - auto const sle = env.le(keylet::line(vaultAccount, issue)); + auto const vaultBalance = // + [&, account = vaultAccount]() -> PrettyAmount { + auto const sle = env.le(keylet::line(account, issue)); BEAST_EXPECT(sle != nullptr); auto amount = sle->getFieldAmount(sfBalance); amount.setIssuer(issue.account); - if (vaultAccount > issue.account) + if (account > issue.account) amount.negate(); return {amount, env.lookup(issue.account).name()}; }; diff --git a/src/xrpld/ledger/View.h b/src/xrpld/ledger/View.h index dcf2f44538..3232b023e7 100644 --- a/src/xrpld/ledger/View.h +++ b/src/xrpld/ledger/View.h @@ -659,7 +659,7 @@ requireAuth( /** Enforce account has MPToken to match its authorization. * * Called from doApply - it will check for expired (and delete if found any) - * credentials maching DomainID set in MPTIssuance. Must be called if + * credentials matching DomainID set in MPTIssuance. Must be called if * requireAuth(...MPTIssue...) returned tesSUCCESS or tecEXPIRED in preclaim. * Will create MPToken (if needed) on the basis of any non-expired credentals * and delete any expried credentials (indirectly via verifyValidDomain) diff --git a/src/xrpld/ledger/detail/View.cpp b/src/xrpld/ledger/detail/View.cpp index cd18b0d770..39e2c4d665 100644 --- a/src/xrpld/ledger/detail/View.cpp +++ b/src/xrpld/ledger/detail/View.cpp @@ -1043,18 +1043,25 @@ createPseudoAccount( uint256 const& pseudoOwnerKey, PseudoAccountOwnerType type) { - AccountID accountId; - for (auto i = 0;; ++i) - { - if (i >= 256) - return Unexpected(tecDUPLICATE); - ripesha_hasher rsh; - auto const hash = sha512Half(i, view.info().parentHash, pseudoOwnerKey); - rsh(hash.data(), hash.size()); - accountId = static_cast(rsh); - if (!view.read(keylet::account(accountId))) - break; - } + auto const accountId = [&]() -> AccountID { + AccountID ret = beast::zero; + // This number must not be changed without an amendment + constexpr int maxAccountAttempts = 256; + for (auto i = 0; i < maxAccountAttempts; ++i) + { + ripesha_hasher rsh; + auto const hash = + sha512Half(i, view.info().parentHash, pseudoOwnerKey); + rsh(hash.data(), hash.size()); + ret = static_cast(rsh); + if (!view.read(keylet::account(ret))) + return ret; + } + return ret; + }(); + + if (accountId == beast::zero) + return Unexpected(tecDUPLICATE); // Create pseudo-account. auto account = std::make_shared(keylet::account(accountId));