vector<TxInfo>
    createRandomTransaction_uniformLoadingCreating()
    {
        vector<optional<TxInfo>> txs;
        size_t iFrom, iTo;
        do
        {
            iFrom = static_cast<int>(rand_fraction() * mAccounts.size());
            iTo = static_cast<int>(rand_fraction() * mAccounts.size());
        } while (iFrom == iTo);

        txs.push_back(ensureAccountIsLoadedCreated(iFrom));
        txs.push_back(ensureAccountIsLoadedCreated(iTo));

        uint64_t amount = static_cast<uint64_t>(
            rand_fraction() *
            min(static_cast<uint64_t>(1000),
            (mAccounts[iFrom]->mBalance - getMinBalance()) / 3));
        txs.push_back(make_optional<TxInfo>(createTransferTransaction(iFrom, iTo, amount)));

        vector<TxInfo> result;
        for(auto tx : txs)
        {
            if (tx)
                result.push_back(*tx);
        }
        return result;
    }
static std::string
checkBalanceAndLimit(LedgerHeader const& header,
                     std::shared_ptr<LedgerEntry const> const& current,
                     std::shared_ptr<LedgerEntry const> const& previous,
                     uint32_t ledgerVersion)
{
    if (!current)
    {
        return {};
    }

    if (current->data.type() == ACCOUNT)
    {
        if (shouldCheckAccount(current, previous, ledgerVersion))
        {
            auto const& account = current->data.account();
            Liabilities liabilities;
            if (ledgerVersion >= 10)
            {
                liabilities.selling = getSellingLiabilities(*current);
                liabilities.buying = getBuyingLiabilities(*current);
            }
            int64_t minBalance = getMinBalance(header, account.numSubEntries);
            if ((account.balance < minBalance + liabilities.selling) ||
                (INT64_MAX - account.balance < liabilities.buying))
            {
                return fmt::format(
                    "Balance not compatible with liabilities for account {}",
                    xdr::xdr_to_string(account));
            }
        }
    }
    else if (current->data.type() == TRUSTLINE)
    {
        auto const& trust = current->data.trustLine();
        Liabilities liabilities;
        if (ledgerVersion >= 10)
        {
            liabilities.selling = getSellingLiabilities(*current);
            liabilities.buying = getBuyingLiabilities(*current);
        }
        if ((trust.balance < liabilities.selling) ||
            (trust.limit - trust.balance < liabilities.buying))
        {
            return fmt::format(
                "Balance not compatible with liabilities for trustline {}",
                xdr::xdr_to_string(trust));
        }
    }
    return {};
}