diff --git a/src/xrpld/app/tx/detail/MPTokenIssuanceCreate.cpp b/src/xrpld/app/tx/detail/MPTokenIssuanceCreate.cpp index 8016dead99..b150e7af4f 100644 --- a/src/xrpld/app/tx/detail/MPTokenIssuanceCreate.cpp +++ b/src/xrpld/app/tx/detail/MPTokenIssuanceCreate.cpp @@ -77,6 +77,11 @@ MPTokenIssuanceCreate::create( if (!acct) return Unexpected(tecINTERNAL); + if (args.priorBalance && + *(args.priorBalance) < + view.fees().accountReserve((*acct)[sfOwnerCount] + 1)) + return Unexpected(tecINSUFFICIENT_RESERVE); + auto mptId = makeMptID(args.sequence, args.account); auto const mptIssuanceKeylet = keylet::mptIssuance(mptId); @@ -125,11 +130,6 @@ TER MPTokenIssuanceCreate::doApply() { auto const& tx = ctx_.tx; - - auto const acct = view().peek(keylet::account(account_)); - if (mPriorBalance < view().fees().accountReserve((*acct)[sfOwnerCount] + 1)) - return tecINSUFFICIENT_RESERVE; - auto result = create( view(), j_, @@ -139,7 +139,8 @@ MPTokenIssuanceCreate::doApply() .maxAmount = tx[~sfMaximumAmount], .assetScale = tx[~sfAssetScale], .transferFee = tx[~sfTransferFee], - .metadata = tx[~sfMPTokenMetadata]}); + .metadata = tx[~sfMPTokenMetadata], + .priorBalance = mPriorBalance}); return result ? tesSUCCESS : result.error(); } diff --git a/src/xrpld/app/tx/detail/MPTokenIssuanceCreate.h b/src/xrpld/app/tx/detail/MPTokenIssuanceCreate.h index 65936c8e8f..09212c1b99 100644 --- a/src/xrpld/app/tx/detail/MPTokenIssuanceCreate.h +++ b/src/xrpld/app/tx/detail/MPTokenIssuanceCreate.h @@ -37,6 +37,7 @@ struct MPTCreateArgs std::optional transferFee{}; std::optional const& metadata{}; std::optional domainId{}; + std::optional priorBalance{}; }; class MPTokenIssuanceCreate : public Transactor