mirror of
https://github.com/XRPLF/rippled.git
synced 2025-12-06 17:27:55 +00:00
Introduce Credentials support (XLS-70d): (#5103)
Amendment:
- Credentials
New Transactions:
- CredentialCreate
- CredentialAccept
- CredentialDelete
Modified Transactions:
- DepositPreauth
- Payment
- EscrowFinish
- PaymentChannelClaim
- AccountDelete
New Object:
- Credential
Modified Object:
- DepositPreauth
API updates:
- ledger_entry
- account_objects
- ledger_data
- deposit_authorized
Read full spec: https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-0070d-credentials
This commit is contained in:
@@ -50,6 +50,15 @@ checkArraySize(Json::Value const& val, unsigned int size)
|
||||
return val.isArray() && val.size() == size;
|
||||
}
|
||||
|
||||
std::uint32_t
|
||||
ownerCount(Env const& env, Account const& account)
|
||||
{
|
||||
std::uint32_t ret{0};
|
||||
if (auto const sleAccount = env.le(account))
|
||||
ret = sleAccount->getFieldU32(sfOwnerCount);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Path finding */
|
||||
/******************************************************************************/
|
||||
void
|
||||
@@ -385,4 +394,4 @@ allpe(AccountID const& a, Issue const& iss)
|
||||
|
||||
} // namespace jtx
|
||||
} // namespace test
|
||||
} // namespace ripple
|
||||
} // namespace ripple
|
||||
|
||||
110
src/test/jtx/impl/credentials.cpp
Normal file
110
src/test/jtx/impl/credentials.cpp
Normal file
@@ -0,0 +1,110 @@
|
||||
//------------------------------------------------------------------------------
|
||||
/*
|
||||
This file is part of rippled: https://github.com/ripple/rippled
|
||||
Copyright (c) 2024 Ripple Labs Inc.
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any
|
||||
purpose with or without fee is hereby granted, provided that the above
|
||||
copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
//==============================================================================
|
||||
|
||||
#include <test/jtx/credentials.h>
|
||||
#include <xrpl/protocol/TxFlags.h>
|
||||
#include <xrpl/protocol/jss.h>
|
||||
|
||||
namespace ripple {
|
||||
namespace test {
|
||||
namespace jtx {
|
||||
|
||||
namespace credentials {
|
||||
|
||||
Json::Value
|
||||
create(
|
||||
jtx::Account const& subject,
|
||||
jtx::Account const& issuer,
|
||||
std::string_view credType)
|
||||
{
|
||||
Json::Value jv;
|
||||
jv[jss::TransactionType] = jss::CredentialCreate;
|
||||
|
||||
jv[jss::Account] = issuer.human();
|
||||
jv[jss::Subject] = subject.human();
|
||||
|
||||
jv[jss::Flags] = tfUniversal;
|
||||
jv[sfCredentialType.jsonName] = strHex(credType);
|
||||
|
||||
return jv;
|
||||
}
|
||||
|
||||
Json::Value
|
||||
accept(
|
||||
jtx::Account const& subject,
|
||||
jtx::Account const& issuer,
|
||||
std::string_view credType)
|
||||
{
|
||||
Json::Value jv;
|
||||
jv[jss::TransactionType] = jss::CredentialAccept;
|
||||
jv[jss::Account] = subject.human();
|
||||
jv[jss::Issuer] = issuer.human();
|
||||
jv[sfCredentialType.jsonName] = strHex(credType);
|
||||
jv[jss::Flags] = tfUniversal;
|
||||
|
||||
return jv;
|
||||
}
|
||||
|
||||
Json::Value
|
||||
deleteCred(
|
||||
jtx::Account const& acc,
|
||||
jtx::Account const& subject,
|
||||
jtx::Account const& issuer,
|
||||
std::string_view credType)
|
||||
{
|
||||
Json::Value jv;
|
||||
jv[jss::TransactionType] = jss::CredentialDelete;
|
||||
jv[jss::Account] = acc.human();
|
||||
jv[jss::Subject] = subject.human();
|
||||
jv[jss::Issuer] = issuer.human();
|
||||
jv[sfCredentialType.jsonName] = strHex(credType);
|
||||
jv[jss::Flags] = tfUniversal;
|
||||
return jv;
|
||||
}
|
||||
|
||||
Json::Value
|
||||
ledgerEntry(
|
||||
jtx::Env& env,
|
||||
jtx::Account const& subject,
|
||||
jtx::Account const& issuer,
|
||||
std::string_view credType)
|
||||
{
|
||||
Json::Value jvParams;
|
||||
jvParams[jss::ledger_index] = jss::validated;
|
||||
jvParams[jss::credential][jss::subject] = subject.human();
|
||||
jvParams[jss::credential][jss::issuer] = issuer.human();
|
||||
jvParams[jss::credential][jss::credential_type] = strHex(credType);
|
||||
return env.rpc("json", "ledger_entry", to_string(jvParams));
|
||||
}
|
||||
|
||||
Json::Value
|
||||
ledgerEntry(jtx::Env& env, std::string const& credIdx)
|
||||
{
|
||||
Json::Value jvParams;
|
||||
jvParams[jss::ledger_index] = jss::validated;
|
||||
jvParams[jss::credential] = credIdx;
|
||||
return env.rpc("json", "ledger_entry", to_string(jvParams));
|
||||
}
|
||||
|
||||
} // namespace credentials
|
||||
|
||||
} // namespace jtx
|
||||
|
||||
} // namespace test
|
||||
} // namespace ripple
|
||||
@@ -48,6 +48,46 @@ unauth(jtx::Account const& account, jtx::Account const& unauth)
|
||||
return jv;
|
||||
}
|
||||
|
||||
// Add DepositPreauth.
|
||||
Json::Value
|
||||
authCredentials(
|
||||
jtx::Account const& account,
|
||||
std::vector<AuthorizeCredentials> const& auth)
|
||||
{
|
||||
Json::Value jv;
|
||||
jv[sfAccount.jsonName] = account.human();
|
||||
jv[sfAuthorizeCredentials.jsonName] = Json::arrayValue;
|
||||
auto& arr(jv[sfAuthorizeCredentials.jsonName]);
|
||||
for (auto const& o : auth)
|
||||
{
|
||||
Json::Value j2;
|
||||
j2[jss::Credential] = o.toJson();
|
||||
arr.append(std::move(j2));
|
||||
}
|
||||
jv[sfTransactionType.jsonName] = jss::DepositPreauth;
|
||||
return jv;
|
||||
}
|
||||
|
||||
// Remove DepositPreauth.
|
||||
Json::Value
|
||||
unauthCredentials(
|
||||
jtx::Account const& account,
|
||||
std::vector<AuthorizeCredentials> const& auth)
|
||||
{
|
||||
Json::Value jv;
|
||||
jv[sfAccount.jsonName] = account.human();
|
||||
jv[sfUnauthorizeCredentials.jsonName] = Json::arrayValue;
|
||||
auto& arr(jv[sfUnauthorizeCredentials.jsonName]);
|
||||
for (auto const& o : auth)
|
||||
{
|
||||
Json::Value j2;
|
||||
j2[jss::Credential] = o.toJson();
|
||||
arr.append(std::move(j2));
|
||||
}
|
||||
jv[sfTransactionType.jsonName] = jss::DepositPreauth;
|
||||
return jv;
|
||||
}
|
||||
|
||||
} // namespace deposit
|
||||
|
||||
} // namespace jtx
|
||||
|
||||
@@ -301,14 +301,23 @@ MPTTester::pay(
|
||||
Account const& src,
|
||||
Account const& dest,
|
||||
std::int64_t amount,
|
||||
std::optional<TER> err)
|
||||
std::optional<TER> err,
|
||||
std::optional<std::vector<std::string>> credentials)
|
||||
{
|
||||
if (!id_)
|
||||
Throw<std::runtime_error>("MPT has not been created");
|
||||
auto const srcAmt = getBalance(src);
|
||||
auto const destAmt = getBalance(dest);
|
||||
auto const outstnAmt = getBalance(issuer_);
|
||||
env_(jtx::pay(src, dest, mpt(amount)), ter(err.value_or(tesSUCCESS)));
|
||||
|
||||
if (credentials)
|
||||
env_(
|
||||
jtx::pay(src, dest, mpt(amount)),
|
||||
ter(err.value_or(tesSUCCESS)),
|
||||
credentials::ids(*credentials));
|
||||
else
|
||||
env_(jtx::pay(src, dest, mpt(amount)), ter(err.value_or(tesSUCCESS)));
|
||||
|
||||
if (env_.ter() != tesSUCCESS)
|
||||
amount = 0;
|
||||
if (close_)
|
||||
|
||||
Reference in New Issue
Block a user