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_,
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_,
353 sfXChainCreateAccountAttestationCollectionElement);
370 bool wasLockingChainSend,
379 o[sfDestination] = dst;
383 o[sfXChainBridge] =
bridge;
422 AttestationCreateAccount
const& rhs)
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)
Json::Value bridge(Account const &lockingChainDoor, Issue const &lockingChainIssue, Account const &issuingChainDoor, Issue const &issuingChainIssue)
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)