20#include <xrpl/basics/Buffer.h> 
   21#include <xrpl/basics/Slice.h> 
   22#include <xrpl/basics/contract.h> 
   23#include <xrpl/json/json_value.h> 
   24#include <xrpl/protocol/AccountID.h> 
   25#include <xrpl/protocol/PublicKey.h> 
   26#include <xrpl/protocol/SField.h> 
   27#include <xrpl/protocol/STAccount.h> 
   28#include <xrpl/protocol/STAmount.h> 
   29#include <xrpl/protocol/STArray.h> 
   30#include <xrpl/protocol/STObject.h> 
   31#include <xrpl/protocol/SecretKey.h> 
   32#include <xrpl/protocol/Serializer.h> 
   33#include <xrpl/protocol/XChainAttestations.h> 
   34#include <xrpl/protocol/json_get_or_throw.h> 
   35#include <xrpl/protocol/jss.h> 
   45namespace Attestations {
 
   54    bool wasLockingChainSend_)
 
   55    : attestationSignerAccount{attestationSignerAccount_}
 
   56    , publicKey{publicKey_}
 
   57    , signature{
std::move(signature_)}
 
   58    , sendingAccount{sendingAccount_}
 
   59    , sendingAmount{sendingAmount_}
 
   60    , rewardAccount{rewardAccount_}
 
   61    , wasLockingChainSend{wasLockingChainSend_}
 
 
  109    : attestationSignerAccount{o[sfAttestationSignerAccount]}
 
  110    , publicKey{o[sfPublicKey]}
 
  111    , signature{o[sfSignature]}
 
  112    , sendingAccount{o[sfAccount]}
 
  113    , sendingAmount{o[sfAmount]}
 
  114    , rewardAccount{o[sfAttestationRewardAccount]}
 
  115    , wasLockingChainSend{bool(o[sfWasLockingChainSend])}
 
 
  122          sfAttestationSignerAccount)}
 
  124    , signature{
Json::getOrThrow<
Buffer>(v, sfSignature)}
 
  126    , sendingAmount{
Json::getOrThrow<
STAmount>(v, sfAmount)}
 
  127    , rewardAccount{
Json::getOrThrow<
AccountID>(v, sfAttestationRewardAccount)}
 
  128    , wasLockingChainSend{
Json::getOrThrow<bool>(v, sfWasLockingChainSend)}
 
 
  151    bool wasLockingChainSend_,
 
  155          attestationSignerAccount_,
 
  157          std::move(signature_),
 
  161          wasLockingChainSend_)
 
 
  175    bool wasLockingChainSend_,
 
  179          attestationSignerAccount_,
 
  185          wasLockingChainSend_,
 
  189    auto const toSign = 
message(bridge);
 
 
  194    : 
AttestationBase(o), claimID{o[sfXChainClaimID]}, dst{o[~sfDestination]}
 
 
  200    , claimID{
Json::getOrThrow<
std::uint64_t>(v, sfXChainClaimID)}
 
  202    if (v.
isMember(sfDestination.getJsonName()))
 
  203        dst = Json::getOrThrow<AccountID>(v, sfDestination);
 
 
  214        o[sfDestination] = *
dst;
 
 
  224    bool wasLockingChainSend,
 
  233        o[sfDestination] = *
dst;
 
  237    o[sfXChainBridge] = bridge;
 
 
  280    , createCount{o[sfXChainAccountCreateCount]}
 
  281    , toCreate{o[sfDestination]}
 
  282    , rewardAmount{o[sfSignatureReward]}
 
 
  288    , createCount{
Json::getOrThrow<
std::uint64_t>(
 
  290          sfXChainAccountCreateCount)}
 
  292    , rewardAmount{
Json::getOrThrow<
STAmount>(v, sfSignatureReward)}
 
 
  304    bool wasLockingChainSend_,
 
  308          attestationSignerAccount_,
 
  310          std::move(signature_),
 
  314          wasLockingChainSend_)
 
  315    , createCount{createCount_}
 
  316    , toCreate{toCreate_}
 
  317    , rewardAmount{rewardAmount_}
 
 
  330    bool wasLockingChainSend_,
 
  334          attestationSignerAccount_,
 
  341          wasLockingChainSend_,
 
  345    auto const toSign = 
message(bridge);
 
 
  353        sfXChainCreateAccountAttestationCollectionElement);
 
 
  370    bool wasLockingChainSend,
 
  379    o[sfDestination] = dst;
 
  383    o[sfXChainBridge] = bridge;
 
 
  421    AttestationCreateAccount 
const& lhs,
 
  422    AttestationCreateAccount 
const& rhs)
 
  425        std::tie(lhs.createCount, lhs.toCreate, lhs.rewardAmount) ==
 
  426        std::tie(rhs.createCount, rhs.toCreate, rhs.rewardAmount);
 
  433    sfXChainCreateAccountAttestations};
 
  440    bool wasLockingChainSend_,
 
  442    : keyAccount(keyAccount_)
 
  443    , publicKey(publicKey_)
 
  444    , amount(sfAmount, amount_)
 
  445    , rewardAccount(rewardAccount_)
 
  446    , wasLockingChainSend(wasLockingChainSend_)
 
 
  456    bool wasLockingChainSend_,
 
  462          rewardAccount_.value(),
 
  463          wasLockingChainSend_,
 
 
  468XChainClaimAttestation::XChainClaimAttestation(
STObject const& o)
 
  470          o[sfAttestationSignerAccount],
 
  473          o[sfAttestationRewardAccount],
 
  474          o[sfWasLockingChainSend] != 0,
 
  475          o[~sfDestination]} {};
 
 
  483          Json::getOrThrow<bool>(v, sfWasLockingChainSend),
 
  486    if (v.
isMember(sfDestination.getJsonName()))
 
  487        dst = Json::getOrThrow<AccountID>(v, sfDestination);
 
 
  493          claimAtt.attestationSignerAccount,
 
  495          claimAtt.sendingAmount,
 
  496          claimAtt.rewardAccount,
 
  497          claimAtt.wasLockingChainSend,
 
 
  506    o[sfAttestationSignerAccount] =
 
  510    o[sfAttestationRewardAccount] =
 
 
  539    : amount{att.sendingAmount}
 
  540    , wasLockingChainSend{att.wasLockingChainSend}
 
 
  565    bool wasLockingChainSend_,
 
  569    , 
amount(sfAmount, amount_)
 
  570    , rewardAmount(sfSignatureReward, rewardAmount_)
 
 
  580          o[sfAttestationSignerAccount],
 
  583          o[sfSignatureReward],
 
  584          o[sfAttestationRewardAccount],
 
  585          o[sfWasLockingChainSend] != 0,
 
  586          o[sfDestination]} {};
 
 
  588XChainCreateAccountAttestation ::XChainCreateAccountAttestation(
 
  596          Json::getOrThrow<bool>(v, sfWasLockingChainSend),
 
 
  604          createAtt.attestationSignerAccount,
 
  606          createAtt.sendingAmount,
 
  607          createAtt.rewardAmount,
 
  608          createAtt.rewardAccount,
 
  609          createAtt.wasLockingChainSend,
 
 
  619    o[sfAttestationSignerAccount] =
 
  624    o[sfAttestationRewardAccount] =
 
 
  634    : amount{att.sendingAmount}
 
  635    , rewardAmount(att.rewardAmount)
 
  636    , wasLockingChainSend{att.wasLockingChainSend}
 
 
  678template <
class TAttestation>
 
  681    : attestations_{
std::move(atts)}
 
  685template <
class TAttestation>
 
  686typename XChainAttestationsBase<TAttestation>::AttCollection::const_iterator
 
  689    return attestations_.begin();
 
 
  692template <
class TAttestation>
 
  696    return attestations_.
end();
 
 
  699template <
class TAttestation>
 
  703    return attestations_.
begin();
 
 
  706template <
class TAttestation>
 
  710    return attestations_.
end();
 
 
 
  713template <
class TAttestation>
 
  719        Throw<std::runtime_error>(
 
  720            "XChainAttestationsBase can only be specified with an 'object' " 
  724    attestations_ = [&] {
 
  725        auto const jAtts = v[jss::attestations];
 
  727        if (jAtts.size() > maxAttestations)
 
  728            Throw<std::runtime_error>(
 
  729                "XChainAttestationsBase exceeded max number of attestations");
 
  733        for (
auto const& a : jAtts)
 
 
  739template <
class TAttestation>
 
  742    if (arr.
size() > maxAttestations)
 
  743        Throw<std::runtime_error>(
 
  744            "XChainAttestationsBase exceeded max number of attestations");
 
  746    attestations_.reserve(arr.
size());
 
  747    for (
auto const& o : arr)
 
  748        attestations_.emplace_back(o);
 
 
  751template <
class TAttestation>
 
  755    STArray r{TAttestation::ArrayFieldName, attestations_.
size()};
 
  756    for (
auto const& e : attestations_)
 
  757        r.emplace_back(e.toSTObject());
 
 
 
 
 
 
 
 
 
bool isMember(char const *key) const
Return true if the object has a member named key.
 
Like std::vector<char> but better.
 
static STObject makeInnerObject(SField const &name)
 
XChainAttestationsBase()=default
 
AttCollection::const_iterator end() const
 
AttCollection::const_iterator begin() const
 
STArray toSTArray() const
 
T emplace_back(T... args)
 
JSON (JavaScript Object Notation).
 
bool operator==(AttestationClaim const &lhs, AttestationClaim const &rhs)
 
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
 
bool verify(PublicKey const &publicKey, Slice const &m, Slice const &sig, bool mustBeFullyCanonical=true) noexcept
Verify a signature on a message.
 
bool isLegalNet(STAmount const &value)
 
Buffer sign(PublicKey const &pk, SecretKey const &sk, Slice const &message)
Generate a signature for a message.
 
std::enable_if_t< std::is_same< T, char >::value||std::is_same< T, unsigned char >::value, Slice > makeSlice(std::array< T, N > const &a)
 
constexpr bool operator==(base_uint< Bits, Tag > const &lhs, base_uint< Bits, Tag > const &rhs)
 
static bool equalHelper(AttestationBase const &lhs, AttestationBase const &rhs)
 
virtual std::vector< std::uint8_t > message(STXChainBridge const &bridge) const =0
 
AccountID attestationSignerAccount
 
void addHelper(STObject &o) const
 
AttestationBase(AccountID attestationSignerAccount_, PublicKey const &publicKey_, Buffer signature_, AccountID const &sendingAccount_, STAmount const &sendingAmount_, AccountID const &rewardAccount_, bool wasLockingChainSend_)
 
static bool sameEventHelper(AttestationBase const &lhs, AttestationBase const &rhs)
 
bool verify(STXChainBridge const &bridge) const
 
bool validAmounts() const
 
std::optional< AccountID > dst
 
bool sameEvent(AttestationClaim const &rhs) const
 
AttestationClaim(AccountID attestationSignerAccount_, PublicKey const &publicKey_, Buffer signature_, AccountID const &sendingAccount_, STAmount const &sendingAmount_, AccountID const &rewardAccount_, bool wasLockingChainSend_, std::uint64_t claimID_, std::optional< AccountID > const &dst_)
 
STObject toSTObject() const
 
static std::vector< std::uint8_t > message(STXChainBridge const &bridge, AccountID const &sendingAccount, STAmount const &sendingAmount, AccountID const &rewardAccount, bool wasLockingChainSend, std::uint64_t claimID, std::optional< AccountID > const &dst)
 
AttestationCreateAccount(STObject const &o)
 
bool validAmounts() const
 
static std::vector< std::uint8_t > message(STXChainBridge const &bridge, AccountID const &sendingAccount, STAmount const &sendingAmount, STAmount const &rewardAmount, AccountID const &rewardAccount, bool wasLockingChainSend, std::uint64_t createCount, AccountID const &dst)
 
std::uint64_t createCount
 
STObject toSTObject() const
 
bool sameEvent(AttestationCreateAccount const &rhs) const
 
std::optional< AccountID > dst
 
MatchFields(TSignedAttestation const &att)
 
STObject toSTObject() const
 
AttestationMatch match(MatchFields const &rhs) const
 
static SField const  & ArrayFieldName
 
std::optional< AccountID > dst
 
XChainClaimAttestation(AccountID const &keyAccount_, PublicKey const &publicKey_, STAmount const &amount_, AccountID const &rewardAccount_, bool wasLockingChainSend_, std::optional< AccountID > const &dst)
 
MatchFields(TSignedAttestation const &att)
 
static SField const  & ArrayFieldName
 
STObject toSTObject() const
 
XChainCreateAccountAttestation(AccountID const &keyAccount_, PublicKey const &publicKey_, STAmount const &amount_, STAmount const &rewardAmount_, AccountID const &rewardAccount_, bool wasLockingChainSend_, AccountID const &dst_)
 
AttestationMatch match(MatchFields const &rhs) const
 
friend bool operator==(XChainCreateAccountAttestation const &lhs, XChainCreateAccountAttestation const &rhs)