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 {}; }