NotTEC CreateTicket::preflight (PreflightContext const& ctx) { if (! ctx.rules.enabled(featureTickets)) return temDISABLED; if (ctx.tx.getFlags() & tfUniversalMask) return temINVALID_FLAG; auto const ret = preflight1 (ctx); if (!isTesSuccess (ret)) return ret; if (ctx.tx.isFieldPresent (sfExpiration)) { if (ctx.tx.getFieldU32 (sfExpiration) == 0) { JLOG(ctx.j.warn()) << "Malformed transaction: bad expiration"; return temBAD_EXPIRATION; } } return preflight2 (ctx); }
TER CancelOffer::preflight (PreflightContext const& ctx) { auto const ret = preflight1 (ctx); if (!isTesSuccess (ret)) return ret; auto const uTxFlags = ctx.tx.getFlags(); if (uTxFlags & tfUniversalMask) { JLOG(ctx.j.trace) << "Malformed transaction: " << "Invalid flags set."; return temINVALID_FLAG; } auto const seq = ctx.tx.getFieldU32 (sfOfferSequence); if (! seq) { JLOG(ctx.j.trace) << "CancelOffer::preflight: missing sequence"; return temBAD_SEQUENCE; } return preflight2(ctx); }
TER SetTrust::preflight (PreflightContext const& ctx) { auto const ret = preflight1 (ctx); if (!isTesSuccess (ret)) return ret; auto& tx = ctx.tx; auto& j = ctx.j; std::uint32_t const uTxFlags = tx.getFlags (); if (uTxFlags & tfTrustSetMask) { JLOG(j.trace) << "Malformed transaction: Invalid flags set."; return temINVALID_FLAG; } STAmount const saLimitAmount (tx.getFieldAmount (sfLimitAmount)); if (!isLegalNet (saLimitAmount)) return temBAD_AMOUNT; if (saLimitAmount.native ()) { JLOG(j.trace) << "Malformed transaction: specifies native limit " << saLimitAmount.getFullText (); return temBAD_LIMIT; } if (badCurrency() == saLimitAmount.getCurrency ()) { JLOG(j.trace) << "Malformed transaction: specifies XRP as IOU"; return temBAD_CURRENCY; } if (saLimitAmount < zero) { JLOG(j.trace) << "Malformed transaction: Negative credit limit."; return temBAD_LIMIT; } // Check if destination makes sense. auto const& issuer = saLimitAmount.getIssuer (); if (!issuer || issuer == noAccount()) { JLOG(j.trace) << "Malformed transaction: no destination account."; return temDST_NEEDED; } return preflight2 (ctx); }
TER CancelTicket::preflight (PreflightContext const& ctx) { #if ! RIPPLE_ENABLE_TICKETS if (! (ctx.flags & tapENABLE_TESTING)) return temDISABLED; #endif auto const ret = preflight1 (ctx); if (!isTesSuccess (ret)) return ret; return preflight2 (ctx); }
NotTEC CancelTicket::preflight (PreflightContext const& ctx) { if (! ctx.rules.enabled(featureTickets)) return temDISABLED; if (ctx.tx.getFlags() & tfUniversalMask) return temINVALID_FLAG; auto const ret = preflight1 (ctx); if (!isTesSuccess (ret)) return ret; return preflight2 (ctx); }
TER SetRegularKey::preflight (PreflightContext const& ctx) { auto const ret = preflight1 (ctx); if (!isTesSuccess (ret)) return ret; std::uint32_t const uTxFlags = ctx.tx.getFlags (); if (uTxFlags & tfUniversalMask) { JLOG(ctx.j.trace) << "Malformed transaction: Invalid flags set."; return temINVALID_FLAG; } return preflight2(ctx); }
TER SetSignerList::preflight (PreflightContext const& ctx) { if (! ctx.rules.enabled(featureMultiSign, ctx.app.config().features)) return temDISABLED; auto const ret = preflight1 (ctx); if (!isTesSuccess (ret)) return ret; auto const result = determineOperation(ctx.tx, ctx.flags, ctx.j); if (std::get<0>(result) != tesSUCCESS) return std::get<0>(result); if (std::get<3>(result) == unknown) { // Neither a set nor a destroy. Malformed. JLOG(ctx.j.trace) << "Malformed transaction: Invalid signer set list format."; return temMALFORMED; } if (std::get<3>(result) == set) { // Validate our settings. auto const account = ctx.tx.getAccountID(sfAccount); TER const ter = validateQuorumAndSignerEntries(std::get<1>(result), std::get<2>(result), account, ctx.j); if (ter != tesSUCCESS) { return ter; } } return preflight2 (ctx); }
TER SetAccount::preflight (PreflightContext const& ctx) { auto const ret = preflight1 (ctx); if (!isTesSuccess (ret)) return ret; auto& tx = ctx.tx; auto& j = ctx.j; std::uint32_t const uTxFlags = tx.getFlags (); if (uTxFlags & tfAccountSetMask) { JLOG(j.trace) << "Malformed transaction: Invalid flags set."; return temINVALID_FLAG; } std::uint32_t const uSetFlag = tx.getFieldU32 (sfSetFlag); std::uint32_t const uClearFlag = tx.getFieldU32 (sfClearFlag); if ((uSetFlag != 0) && (uSetFlag == uClearFlag)) { JLOG(j.trace) << "Malformed transaction: Set and clear same flag."; return temINVALID_FLAG; } // // RequireAuth // bool bSetRequireAuth = (uTxFlags & tfRequireAuth) || (uSetFlag == asfRequireAuth); bool bClearRequireAuth = (uTxFlags & tfOptionalAuth) || (uClearFlag == asfRequireAuth); if (bSetRequireAuth && bClearRequireAuth) { JLOG(j.trace) << "Malformed transaction: Contradictory flags set."; return temINVALID_FLAG; } // // RequireDestTag // bool bSetRequireDest = (uTxFlags & TxFlag::requireDestTag) || (uSetFlag == asfRequireDest); bool bClearRequireDest = (uTxFlags & tfOptionalDestTag) || (uClearFlag == asfRequireDest); if (bSetRequireDest && bClearRequireDest) { JLOG(j.trace) << "Malformed transaction: Contradictory flags set."; return temINVALID_FLAG; } // // DisallowXRP // bool bSetDisallowXRP = (uTxFlags & tfDisallowXRP) || (uSetFlag == asfDisallowXRP); bool bClearDisallowXRP = (uTxFlags & tfAllowXRP) || (uClearFlag == asfDisallowXRP); if (bSetDisallowXRP && bClearDisallowXRP) { JLOG(j.trace) << "Malformed transaction: Contradictory flags set."; return temINVALID_FLAG; } // TransferRate if (tx.isFieldPresent (sfTransferRate)) { std::uint32_t uRate = tx.getFieldU32 (sfTransferRate); if (uRate && (uRate < QUALITY_ONE)) { JLOG(j.trace) << "Malformed transaction: Bad transfer rate."; return temBAD_TRANSFER_RATE; } } auto const messageKey = tx[~sfMessageKey]; if (messageKey && messageKey->size() > PUBLIC_BYTES_MAX) { JLOG(j.trace) << "message key too long"; return telBAD_PUBLIC_KEY; } auto const domain = tx[~sfDomain]; if (domain&& domain->size() > DOMAIN_BYTES_MAX) { JLOG(j.trace) << "domain too long"; return telBAD_DOMAIN; } return preflight2(ctx); }