Skip to content

Commit f9107a7

Browse files
committed
Fixed tx flags check in case trustline doesn't exist yet
1 parent ffa6ccd commit f9107a7

File tree

1 file changed

+44
-47
lines changed

1 file changed

+44
-47
lines changed

src/xrpld/app/tx/detail/SetTrust.cpp

+44-47
Original file line numberDiff line numberDiff line change
@@ -229,59 +229,56 @@ SetTrust::preclaim(PreclaimContext const& ctx)
229229
}
230230

231231
// Checking all freeze/deep freeze flag invariants.
232-
auto sleRippleState =
233-
ctx.view.read(keylet::line(id, uDstAccountID, currency));
234-
235-
if (sleRippleState)
232+
if (ctx.view.rules().enabled(featureDeepFreeze))
236233
{
237-
if (ctx.view.rules().enabled(featureDeepFreeze))
238-
{
239-
bool const bNoFreeze = sle->isFlag(lsfNoFreeze);
240-
bool const bSetFreeze = (uTxFlags & tfSetFreeze);
241-
bool const bSetDeepFreeze = (uTxFlags & tfSetDeepFreeze);
234+
bool const bNoFreeze = sle->isFlag(lsfNoFreeze);
235+
bool const bSetFreeze = (uTxFlags & tfSetFreeze);
236+
bool const bSetDeepFreeze = (uTxFlags & tfSetDeepFreeze);
242237

243-
if (bNoFreeze)
244-
{
245-
if (bSetFreeze || bSetDeepFreeze)
246-
{
247-
// Cannot freeze the trust line if NoFreeze is set
248-
return tecNO_PERMISSION;
249-
}
250-
}
251-
bool const bClearFreeze = (uTxFlags & tfClearFreeze);
252-
bool const bClearDeepFreeze = (uTxFlags & tfClearDeepFreeze);
253-
if ((bSetFreeze || bSetDeepFreeze) &&
254-
(bClearFreeze || bClearDeepFreeze))
238+
if (bNoFreeze)
239+
{
240+
if (bSetFreeze || bSetDeepFreeze)
255241
{
256-
// Freezing and unfreezing in the same transaction should be
257-
// illegal
242+
// Cannot freeze the trust line if NoFreeze is set
258243
return tecNO_PERMISSION;
259244
}
245+
}
246+
bool const bClearFreeze = (uTxFlags & tfClearFreeze);
247+
bool const bClearDeepFreeze = (uTxFlags & tfClearDeepFreeze);
248+
if ((bSetFreeze || bSetDeepFreeze) &&
249+
(bClearFreeze || bClearDeepFreeze))
250+
{
251+
// Freezing and unfreezing in the same transaction should be
252+
// illegal
253+
return tecNO_PERMISSION;
254+
}
260255

261-
bool const bHigh = id > uDstAccountID;
262-
// Fetching current state of trust line
263-
std::uint32_t uFlags = sleRippleState->getFieldU32(sfFlags);
264-
// Computing expected trust line state
265-
uFlags = applyFreezeFlags(
266-
uFlags,
267-
bHigh,
268-
bNoFreeze,
269-
bSetFreeze,
270-
bClearFreeze,
271-
bSetDeepFreeze,
272-
bClearDeepFreeze);
273-
274-
auto const frozen = uFlags & (bHigh ? lsfHighFreeze : lsfLowFreeze);
275-
auto const deepFrozen =
276-
uFlags & (bHigh ? lsfHighDeepFreeze : lsfLowDeepFreeze);
277-
278-
// Trying to set deep freeze on not already frozen trust line must
279-
// fail. This also checks that clearing normal freeze while deep
280-
// frozen must not work
281-
if (deepFrozen && !frozen)
282-
{
283-
return tecNO_PERMISSION;
284-
}
256+
bool const bHigh = id > uDstAccountID;
257+
// Fetching current state of trust line
258+
auto const sleRippleState =
259+
ctx.view.read(keylet::line(id, uDstAccountID, currency));
260+
std::uint32_t uFlags =
261+
sleRippleState ? sleRippleState->getFieldU32(sfFlags) : 0u;
262+
// Computing expected trust line state
263+
uFlags = applyFreezeFlags(
264+
uFlags,
265+
bHigh,
266+
bNoFreeze,
267+
bSetFreeze,
268+
bClearFreeze,
269+
bSetDeepFreeze,
270+
bClearDeepFreeze);
271+
272+
auto const frozen = uFlags & (bHigh ? lsfHighFreeze : lsfLowFreeze);
273+
auto const deepFrozen =
274+
uFlags & (bHigh ? lsfHighDeepFreeze : lsfLowDeepFreeze);
275+
276+
// Trying to set deep freeze on not already frozen trust line must
277+
// fail. This also checks that clearing normal freeze while deep
278+
// frozen must not work
279+
if (deepFrozen && !frozen)
280+
{
281+
return tecNO_PERMISSION;
285282
}
286283
}
287284

0 commit comments

Comments
 (0)