Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support PermissionDelegation Amendment XLS-74d XLS-75d #5354

Open
wants to merge 11 commits into
base: develop
Choose a base branch
from
Prev Previous commit
Next Next commit
Add uint32 to string parse
yinyiqian1 committed Mar 21, 2025

Verified

This commit was signed with the committer’s verified signature.
commit 2da1590090b3a7a58870dfef7113f99a3f7eb083
5 changes: 5 additions & 0 deletions include/xrpl/protocol/Permissions.h
Original file line number Diff line number Diff line change
@@ -55,6 +55,8 @@ class Permission
std::unordered_map<std::string, GranularPermissionType>
granularPermissionMap;

std::unordered_map<GranularPermissionType, std::string> granularNameMap;

std::unordered_map<GranularPermissionType, TxType> granularTxTypeMap;

std::unordered_set<std::string> supportedTransactions;
@@ -70,6 +72,9 @@ class Permission
std::optional<std::uint32_t>
getGranularValue(std::string const& name) const;

std::optional<std::string>
getGranularName(GranularPermissionType const& value) const;

std::optional<TxType>
getGranularTxType(GranularPermissionType const& gpType) const;

22 changes: 22 additions & 0 deletions src/libxrpl/protocol/Permissions.cpp
Original file line number Diff line number Diff line change
@@ -33,11 +33,23 @@

#include <xrpl/protocol/detail/permissions.macro>

#undef PERMISSION
#pragma pop_macro("PERMISSION")
};

granularNameMap = {
#pragma push_macro("PERMISSION")
#undef PERMISSION

#define PERMISSION(type, txType, value) {type, #type},

#include <xrpl/protocol/detail/permissions.macro>

#undef PERMISSION
#pragma pop_macro("PERMISSION")
};

granularTxTypeMap = {

Check warning on line 52 in src/libxrpl/protocol/Permissions.cpp

Codecov / codecov/patch

src/libxrpl/protocol/Permissions.cpp#L52

Added line #L52 was not covered by tests
#pragma push_macro("PERMISSION")
#undef PERMISSION

@@ -73,6 +85,16 @@
return std::nullopt;
}

std::optional<std::string>
Permission::getGranularName(GranularPermissionType const& value) const
{
auto const it = granularNameMap.find(value);
if (it != granularNameMap.end())
return it->second;

return std::nullopt;
}

std::optional<TxType>
Permission::getGranularTxType(GranularPermissionType const& gpType) const
{
22 changes: 22 additions & 0 deletions src/libxrpl/protocol/STInteger.cpp
Original file line number Diff line number Diff line change
@@ -22,6 +22,7 @@
#include <xrpl/beast/utility/instrumentation.h>
#include <xrpl/json/json_value.h>
#include <xrpl/protocol/LedgerFormats.h>
#include <xrpl/protocol/Permissions.h>
#include <xrpl/protocol/SField.h>
#include <xrpl/protocol/STBase.h>
#include <xrpl/protocol/STInteger.h>
@@ -177,6 +178,27 @@ template <>
Json::Value
STUInt32::getJson(JsonOptions) const
{
if (getFName() == sfPermissionValue)
{
auto const permissionValue =
static_cast<GranularPermissionType>(value_);
auto const granular =
Permission::getInstance().getGranularName(permissionValue);

if (granular)
{
return *granular;
}
else
{
auto item = TxFormats::getInstance().findByType(
static_cast<TxType>(value_ - 1));

if (item != nullptr)
return item->getName();
}
}

return value_;
}

19 changes: 3 additions & 16 deletions src/test/app/Delegate_test.cpp
Original file line number Diff line number Diff line change
@@ -119,22 +119,9 @@ class Delegate_test : public beast::unit_test::suite
unsigned i = 0;
for (auto const& permission : permissions)
{
auto const granularVal =
Permission::getInstance().getGranularValue(permission);
if (granularVal)
BEAST_EXPECT(
jPermissions[i][sfPermission.jsonName]
[sfPermissionValue.jsonName] ==
*granularVal);
else
{
auto const transVal =
TxFormats::getInstance().findTypeByName(permission);
BEAST_EXPECT(
jPermissions[i][sfPermission.jsonName]
[sfPermissionValue.jsonName] ==
transVal + 1);
}
BEAST_EXPECT(
jPermissions[i][sfPermission.jsonName]
[sfPermissionValue.jsonName] == permission);
i++;
}
};

Unchanged files with check annotations Beta

checkTxPermission(std::shared_ptr<SLE const> const& delegate, STTx const& tx)
{
if (!delegate)
return tesSUCCESS;

Check warning on line 29 in src/xrpld/app/misc/detail/DelegateUtils.cpp

Codecov / codecov/patch

src/xrpld/app/misc/detail/DelegateUtils.cpp#L29

Added line #L29 was not covered by tests
auto const permissionArray = delegate->getFieldArray(sfPermissions);
auto const transactionType = tx.getTxnType();
std::unordered_set<GranularPermissionType>& granularPermissions)
{
if (!delegate)
return;

Check warning on line 51 in src/xrpld/app/misc/detail/DelegateUtils.cpp

Codecov / codecov/patch

src/xrpld/app/misc/detail/DelegateUtils.cpp#L51

Added line #L51 was not covered by tests
auto const permissionArray = delegate->getFieldArray(sfPermissions);
for (auto const& permission : permissionArray)
auto const sle = view.read(delegateKey);
if (!sle)
return tecNO_PERMISSION;

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

Codecov / codecov/patch

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

Added line #L65 was not covered by tests
if (checkTxPermission(sle, tx) == tesSUCCESS)
return tesSUCCESS;
auto const sle = view.read(delegateKey);
if (!sle)
return tecNO_PERMISSION;

Check warning on line 253 in src/xrpld/app/tx/detail/Payment.cpp

Codecov / codecov/patch

src/xrpld/app/tx/detail/Payment.cpp#L253

Added line #L253 was not covered by tests
if (checkTxPermission(sle, tx) == tesSUCCESS)
return tesSUCCESS;
auto const sle = view.read(delegateKey);
if (!sle)
return tecNO_PERMISSION;

Check warning on line 142 in src/xrpld/app/tx/detail/SetTrust.cpp

Codecov / codecov/patch

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

Added line #L142 was not covered by tests
if (checkTxPermission(sle, tx) == tesSUCCESS)
return tesSUCCESS;
return tecNO_PERMISSION;
if (tx.isFieldPresent(sfQualityIn) || tx.isFieldPresent(sfQualityOut))
return tecNO_PERMISSION;

Check warning on line 156 in src/xrpld/app/tx/detail/SetTrust.cpp

Codecov / codecov/patch

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

Added line #L156 was not covered by tests
auto const saLimitAmount = tx.getFieldAmount(sfLimitAmount);
auto const sleRippleState = view.read(keylet::line(
auto const sle = view.read(delegateKey);
if (!sle)
return tecNO_PERMISSION;

Check warning on line 205 in src/xrpld/app/tx/detail/Transactor.cpp

Codecov / codecov/patch

src/xrpld/app/tx/detail/Transactor.cpp#L205

Added line #L205 was not covered by tests
return checkTxPermission(sle, tx);
}
auto const delegate = ctx_.tx.getAccountID(sfDelegate);
auto const delegatedSle = view().peek(keylet::account(delegate));
if (!delegatedSle)
return tefINTERNAL;

Check warning on line 304 in src/xrpld/app/tx/detail/Transactor.cpp

Codecov / codecov/patch

src/xrpld/app/tx/detail/Transactor.cpp#L304

Added line #L304 was not covered by tests
delegatedSle->setFieldAmount(
sfBalance, delegatedSle->getFieldAmount(sfBalance) - feePaid);
{
auto const sle = view().peek(keylet::account(account_));
if (!sle)
return tefINTERNAL;

Check warning on line 314 in src/xrpld/app/tx/detail/Transactor.cpp

Codecov / codecov/patch

src/xrpld/app/tx/detail/Transactor.cpp#L314

Added line #L314 was not covered by tests
// Deduct the fee, so it's not available during the transaction.
// Will only write the account back if the transaction succeeds.
? view().peek(keylet::account(ctx_.tx.getAccountID(sfDelegate)))
: txnAcct;
if (!payerSle)
return {tefINTERNAL, beast::zero};

Check warning on line 915 in src/xrpld/app/tx/detail/Transactor.cpp

Codecov / codecov/patch

src/xrpld/app/tx/detail/Transactor.cpp#L915

Added line #L915 was not covered by tests
auto const balance = payerSle->getFieldAmount(sfBalance).xrp();