std::string
LedgerEntryIsValid::checkIsValid(OfferEntry const& oe, uint32 version) const
{
    if (oe.offerID > INT64_MAX)
    {
        return fmt::format("Offer offerID ({}) exceeds limit ({})", oe.offerID,
                           INT64_MAX);
    }
    if (!isAssetValid(oe.selling))
    {
        return "Offer selling asset is invalid";
    }
    if (!isAssetValid(oe.buying))
    {
        return "Offer buying asset is invalid";
    }
    if (oe.amount <= 0)
    {
        return "Offer amount is not positive";
    }
    if (oe.price.n <= 0 || oe.price.d < 1)
    {
        return fmt::format("Offer price ({} / {}) is invalid", oe.price.n,
                           oe.price.d);
    }
    if ((oe.flags & ~MASK_OFFERENTRY_FLAGS) != 0)
    {
        return "Offer flags are invalid";
    }
    return {};
}
std::string
LedgerEntryIsValid::checkIsValid(TrustLineEntry const& tl, uint32 version) const
{
    if (tl.asset.type() == ASSET_TYPE_NATIVE)
    {
        return "TrustLine asset is native";
    }
    if (!isAssetValid(tl.asset))
    {
        return "TrustLine asset is invalid";
    }
    if (tl.balance < 0)
    {
        return fmt::format("TrustLine balance ({}) is negative", tl.balance);
    }
    if (tl.limit <= 0)
    {
        return fmt::format("TrustLine balance ({}) is not positive", tl.limit);
    }
    if (tl.balance > tl.limit)
    {
        return fmt::format("TrustLine balance ({}) exceeds limit ({})",
                           tl.balance, tl.limit);
    }
    if ((tl.flags & ~MASK_TRUSTLINE_FLAGS) != 0)
    {
        return "TrustLine flags are invalid";
    }
    return {};
}
bool
ChangeTrustOpFrame::doCheckValid(medida::MetricsRegistry& metrics)
{
    if (mChangeTrust.limit < 0)
    {
        metrics.NewMeter(
                    {"op-change-trust", "invalid", "malformed-negative-limit"},
                    "operation").Mark();
        innerResult().code(CHANGE_TRUST_MALFORMED);
        return false;
    }
    if (!isAssetValid(mChangeTrust.line))
    {
        metrics.NewMeter(
                    {"op-change-trust", "invalid", "malformed-invalid-asset"},
                    "operation").Mark();
        innerResult().code(CHANGE_TRUST_MALFORMED);
        return false;
    }
    return true;
}
bool
AllowTrustOpFrame::doCheckValid(Application& app)
{
    if (mAllowTrust.asset.type() == ASSET_TYPE_NATIVE)
    {
        app.getMetrics()
            .NewMeter({"op-allow-trust", "invalid", "malformed-non-alphanum"},
                      "operation")
            .Mark();
        innerResult().code(ALLOW_TRUST_MALFORMED);
        return false;
    }
    Asset ci;
    ci.type(mAllowTrust.asset.type());
    if (mAllowTrust.asset.type() == ASSET_TYPE_CREDIT_ALPHANUM4)
    {
        ci.alphaNum4().assetCode = mAllowTrust.asset.assetCode4();
        ci.alphaNum4().issuer = getSourceID();
    }
    else if (mAllowTrust.asset.type() == ASSET_TYPE_CREDIT_ALPHANUM12)
    {
        ci.alphaNum12().assetCode = mAllowTrust.asset.assetCode12();
        ci.alphaNum12().issuer = getSourceID();
    }

    if (!isAssetValid(ci))
    {
        app.getMetrics()
            .NewMeter({"op-allow-trust", "invalid", "malformed-invalid-asset"},
                      "operation")
            .Mark();
        innerResult().code(ALLOW_TRUST_MALFORMED);
        return false;
    }

    return true;
}
示例#5
0
bool
OfferFrame::isValid(OfferEntry const& oe)
{
    return isAssetValid(oe.buying) && isAssetValid(oe.selling);
}