Skip to content

Commit

Permalink
flags
Browse files Browse the repository at this point in the history
  • Loading branch information
thejohnfreeman committed Oct 8, 2024
1 parent 884e20e commit 1cbf843
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 49 deletions.
3 changes: 3 additions & 0 deletions include/xrpl/protocol/LedgerFormats.h
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,9 @@ enum LedgerSpecificFlags {

// ltMPTOKEN
lsfMPTAuthorized = 0x00000002,

// ltVAULT
lsfVaultPrivate = 0x00000001,
};

//------------------------------------------------------------------------------
Expand Down
3 changes: 2 additions & 1 deletion include/xrpl/protocol/TER.h
Original file line number Diff line number Diff line change
Expand Up @@ -345,7 +345,8 @@ enum TECcodes : TERUnderlyingType {
tecMPT_MAX_AMOUNT_EXCEEDED = 193,
tecMPT_LOCKED = 194,
tecMPT_NOT_SUPPORTED = 195,
tecMPT_ISSUANCE_NOT_FOUND = 196
tecMPT_ISSUANCE_NOT_FOUND = 196,
tecIMMUTABLE = 197,
};

//------------------------------------------------------------------------------
Expand Down
5 changes: 5 additions & 0 deletions include/xrpl/protocol/TxFlags.h
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,11 @@ constexpr std::uint32_t const tfMPTokenAuthorizeMask = ~(tfMPTUnauthorize | tfU

// MPTokenIssuanceSet flags:
constexpr std::uint32_t const tfMPTokenIssuanceSetMask = ~(tfMPTLock | tfMPTUnlock | tfUniversal);

// Vault flags:
constexpr std::uint32_t const tfVaultPrivate = 0x00000001;
static_assert(tfVaultPrivate == lsfVaultPrivate);
constexpr std::uint32_t const tfVaultShareNonTransferable = 0x00000002;
// clang-format on

} // namespace ripple
Expand Down
10 changes: 5 additions & 5 deletions include/xrpl/protocol/detail/ledger_entries.m
Original file line number Diff line number Diff line change
Expand Up @@ -437,14 +437,14 @@ to implement skip lists that allow for efficient backwards (and, in
{sfOwnerNode, soeREQUIRED},
{sfOwner, soeREQUIRED},
{sfAccount, soeREQUIRED},
{sfData, soeOPTIONAL},
{sfData, soeDEFAULT},
{sfAsset, soeREQUIRED},
{sfAssetTotal, soeREQUIRED},
{sfAssetAvailable, soeREQUIRED},
{sfAssetMaximum, soeOPTIONAL},
{sfAssetTotal, soeDEFAULT},
{sfAssetAvailable, soeDEFAULT},
{sfAssetMaximum, soeDEFAULT},
{sfMPTokenIssuanceID, soeREQUIRED}, // sfShare
// no ShareTotal ever (use MPTIssuance.sfOutstandingAmount)
// no WithdrawalPolicy ever (YAGNI)
// no PermissionedDomainID yet
{sfLossUnrealized, soeOPTIONAL}, // not in spec
{sfLossUnrealized, soeDEFAULT}, // not in spec
}))
87 changes: 44 additions & 43 deletions src/xrpld/app/tx/detail/VaultSet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,82 +56,83 @@ VaultSet::doApply()
auto const& owner = account_;

Check warning on line 56 in src/xrpld/app/tx/detail/VaultSet.cpp

View check run for this annotation

Codecov / codecov/patch

src/xrpld/app/tx/detail/VaultSet.cpp#L55-L56

Added lines #L55 - L56 were not covered by tests
auto sequence = tx.getSequence();

auto const& vaultId = tx[~sfVaultID];
auto keylet =
vaultId ? Keylet{ltVAULT, *vaultId} : keylet::vault(owner, sequence);

auto vault = view().peek(keylet);

if (vault)
if (auto const& vaultId = tx[~sfVaultID]; vaultId)
{
// Update existing object.
auto keylet = Keylet{ltVAULT, *vaultId};

Check warning on line 62 in src/xrpld/app/tx/detail/VaultSet.cpp

View check run for this annotation

Codecov / codecov/patch

src/xrpld/app/tx/detail/VaultSet.cpp#L62

Added line #L62 was not covered by tests
auto vault = view().peek(keylet);
if (!vault)
return tecOBJECT_NOT_FOUND;

Check warning on line 65 in src/xrpld/app/tx/detail/VaultSet.cpp

View check run for this annotation

Codecov / codecov/patch

src/xrpld/app/tx/detail/VaultSet.cpp#L65

Added line #L65 was not covered by tests

// Assert that submitter is the Owner.
if (owner != (*vault)[sfOwner])
return tecNO_PERMISSION;
// Assert that Asset is the same if given.
if (tx.isFieldPresent(sfAsset) && tx[sfAsset] != (*vault)[sfAsset])
if (owner != vault->at(sfOwner))
return tecNO_PERMISSION;

Check warning on line 69 in src/xrpld/app/tx/detail/VaultSet.cpp

View check run for this annotation

Codecov / codecov/patch

src/xrpld/app/tx/detail/VaultSet.cpp#L69

Added line #L69 was not covered by tests

// Assert immutable flags not given.
auto txFlags = tx[sfFlags];
if ((txFlags & tfVaultPrivate) || (txFlags & tfVaultShareNonTransferable))
return tecIMMUTABLE;

Check warning on line 74 in src/xrpld/app/tx/detail/VaultSet.cpp

View check run for this annotation

Codecov / codecov/patch

src/xrpld/app/tx/detail/VaultSet.cpp#L74

Added line #L74 was not covered by tests
// Assert identical immutable fields if given.
if (tx.isFieldPresent(sfAsset) && tx[sfAsset] != vault->at(sfAsset))
return tecIMMUTABLE;

Check warning on line 77 in src/xrpld/app/tx/detail/VaultSet.cpp

View check run for this annotation

Codecov / codecov/patch

src/xrpld/app/tx/detail/VaultSet.cpp#L77

Added line #L77 was not covered by tests

// TODO: sfMPTokenMetadata?

// Update mutable flags and fields if given.
if (tx.isFieldPresent(sfData))
vault->at(~sfData) = tx[~sfData];
if (tx.isFieldPresent(sfAssetMaximum))
vault->at(~sfAssetMaximum) = tx[sfAssetMaximum];

view().update(vault);
}
else if (tx.isFieldPresent(sfVaultID))
{
// Update missing object.
return tecOBJECT_NOT_FOUND;
}
else
{
// Create new object.
if (!tx.isFieldPresent(sfAsset))
return tecINCOMPLETE;

Check warning on line 93 in src/xrpld/app/tx/detail/VaultSet.cpp

View check run for this annotation

Codecov / codecov/patch

src/xrpld/app/tx/detail/VaultSet.cpp#L93

Added line #L93 was not covered by tests

vault = std::make_shared<SLE>(keylet);
auto keylet = keylet::vault(owner, sequence);

Check warning on line 95 in src/xrpld/app/tx/detail/VaultSet.cpp

View check run for this annotation

Codecov / codecov/patch

src/xrpld/app/tx/detail/VaultSet.cpp#L95

Added line #L95 was not covered by tests
auto vault = std::make_shared<SLE>(keylet);
if (auto ter = dirLink(view(), owner, vault); ter)
return ter;

Check warning on line 98 in src/xrpld/app/tx/detail/VaultSet.cpp

View check run for this annotation

Codecov / codecov/patch

src/xrpld/app/tx/detail/VaultSet.cpp#L98

Added line #L98 was not covered by tests
auto maybe = createPseudoAccount(view(), vault->key());
if (!maybe)
return maybe.error();
auto& pseudo = *maybe;
auto pseudoId = (*pseudo)[sfAccount];
auto pseudoId = pseudo->at(sfAccount);
auto txFlags = tx[sfFlags];
std::uint32_t mptFlags = 0;

Check warning on line 105 in src/xrpld/app/tx/detail/VaultSet.cpp

View check run for this annotation

Codecov / codecov/patch

src/xrpld/app/tx/detail/VaultSet.cpp#L105

Added line #L105 was not covered by tests
if (!(txFlags & tfVaultShareNonTransferable))
mptFlags |= (lsfMPTCanEscrow | lsfMPTCanTrade | lsfMPTCanTransfer);

Check warning on line 107 in src/xrpld/app/tx/detail/VaultSet.cpp

View check run for this annotation

Codecov / codecov/patch

src/xrpld/app/tx/detail/VaultSet.cpp#L107

Added line #L107 was not covered by tests
if (txFlags & tfVaultPrivate)
mptFlags |= lsfMPTRequireAuth;

Check warning on line 109 in src/xrpld/app/tx/detail/VaultSet.cpp

View check run for this annotation

Codecov / codecov/patch

src/xrpld/app/tx/detail/VaultSet.cpp#L109

Added line #L109 was not covered by tests
auto maybe2 = MPTokenIssuanceCreate::create(
view(),
j_,
{
.account = pseudoId,
.sequence = 1,
// !tfShareNonTransferable => lsfMPTCanEscrow, lsfMPTCanTrade,
// lsfMPTCanTransfer tfPrivate => lsfMPTRequireAuth
.flags = 0,
.flags = mptFlags,
.metadata = tx[~sfMPTokenMetadata],
});
if (!maybe2)
return maybe2.error();
auto& mptId = *maybe2;
(*vault)[sfSequence] = sequence;
(*vault)[sfOwner] = owner;
(*vault)[sfAccount] = pseudoId;
(*vault)[~sfData] = tx[~sfData];
(*vault)[sfAsset] = tx[sfAsset];
(*vault)[sfAssetTotal] = 0;
(*vault)[sfAssetAvailable] = 0;
(*vault)[~sfAssetMaximum] = tx[~sfAssetMaximum];
(*vault)[sfMPTokenIssuanceID] = mptId;
vault->at(sfFlags) = txFlags & tfVaultPrivate;
vault->at(sfSequence) = sequence;
vault->at(sfOwner) = owner;
vault->at(sfAccount) = pseudoId;
vault->at(~sfData) = tx[~sfData];
vault->at(sfAsset) = tx[sfAsset];
// vault->at(sfAssetTotal) = 0;
// vault->at(sfAssetAvailable) = 0;
vault->at(~sfAssetMaximum) = tx[~sfAssetMaximum];
vault->at(sfMPTokenIssuanceID) = mptId;
// No `LossUnrealized`.
view().insert(vault);
}

// Set or clear field AssetMaximum.
if (tx.isFieldPresent(sfAssetMaximum))
{
if (tx[sfAssetMaximum] == 0)
{
vault->delField(sfAssetMaximum);
}
else
{
(*vault)[sfAssetMaximum] = tx[sfAssetMaximum];
}
}

return tesSUCCESS;

Check warning on line 136 in src/xrpld/app/tx/detail/VaultSet.cpp

View check run for this annotation

Codecov / codecov/patch

src/xrpld/app/tx/detail/VaultSet.cpp#L136

Added line #L136 was not covered by tests
}

Expand Down

0 comments on commit 1cbf843

Please sign in to comment.