rippled
Loading...
Searching...
No Matches
XChainAddAccountCreateAttestationTests.cpp
1// Auto-generated unit tests for transaction XChainAddAccountCreateAttestation
2
3
4#include <gtest/gtest.h>
5
6#include <protocol_autogen/TestHelpers.h>
7
8#include <xrpl/protocol/SecretKey.h>
9#include <xrpl/protocol/Seed.h>
10#include <xrpl/protocol/STTx.h>
11#include <xrpl/protocol_autogen/transactions/XChainAddAccountCreateAttestation.h>
12#include <xrpl/protocol_autogen/transactions/AccountSet.h>
13
14#include <string>
15
16namespace xrpl::transactions {
17
18// 1 & 4) Set fields via builder setters, build, then read them back via
19// wrapper getters. After build(), validate() should succeed.
20TEST(TransactionsXChainAddAccountCreateAttestationTests, BuilderSettersRoundTrip)
21{
22 // Generate a deterministic keypair for signing
23 auto const [publicKey, secretKey] =
24 generateKeyPair(KeyType::secp256k1, generateSeed("testXChainAddAccountCreateAttestation"));
25
26 // Common transaction fields
27 auto const accountValue = calcAccountID(publicKey);
28 std::uint32_t const sequenceValue = 1;
29 auto const feeValue = canonical_AMOUNT();
30
31 // Transaction-specific field values
32 auto const xChainBridgeValue = canonical_XCHAIN_BRIDGE();
33 auto const attestationSignerAccountValue = canonical_ACCOUNT();
34 auto const publicKeyValue = canonical_VL();
35 auto const signatureValue = canonical_VL();
36 auto const otherChainSourceValue = canonical_ACCOUNT();
37 auto const amountValue = canonical_AMOUNT();
38 auto const attestationRewardAccountValue = canonical_ACCOUNT();
39 auto const wasLockingChainSendValue = canonical_UINT8();
40 auto const xChainAccountCreateCountValue = canonical_UINT64();
41 auto const destinationValue = canonical_ACCOUNT();
42 auto const signatureRewardValue = canonical_AMOUNT();
43
45 accountValue,
46 xChainBridgeValue,
47 attestationSignerAccountValue,
48 publicKeyValue,
49 signatureValue,
50 otherChainSourceValue,
51 amountValue,
52 attestationRewardAccountValue,
53 wasLockingChainSendValue,
54 xChainAccountCreateCountValue,
55 destinationValue,
56 signatureRewardValue,
57 sequenceValue,
58 feeValue
59 };
60
61 // Set optional fields
62
63 auto tx = builder.build(publicKey, secretKey);
64
65 std::string reason;
66 EXPECT_TRUE(tx.validate(reason)) << reason;
67
68 // Verify signing was applied
69 EXPECT_FALSE(tx.getSigningPubKey().empty());
70 EXPECT_TRUE(tx.hasTxnSignature());
71
72 // Verify common fields
73 EXPECT_EQ(tx.getAccount(), accountValue);
74 EXPECT_EQ(tx.getSequence(), sequenceValue);
75 EXPECT_EQ(tx.getFee(), feeValue);
76
77 // Verify required fields
78 {
79 auto const& expected = xChainBridgeValue;
80 auto const actual = tx.getXChainBridge();
81 expectEqualField(expected, actual, "sfXChainBridge");
82 }
83
84 {
85 auto const& expected = attestationSignerAccountValue;
86 auto const actual = tx.getAttestationSignerAccount();
87 expectEqualField(expected, actual, "sfAttestationSignerAccount");
88 }
89
90 {
91 auto const& expected = publicKeyValue;
92 auto const actual = tx.getPublicKey();
93 expectEqualField(expected, actual, "sfPublicKey");
94 }
95
96 {
97 auto const& expected = signatureValue;
98 auto const actual = tx.getSignature();
99 expectEqualField(expected, actual, "sfSignature");
100 }
101
102 {
103 auto const& expected = otherChainSourceValue;
104 auto const actual = tx.getOtherChainSource();
105 expectEqualField(expected, actual, "sfOtherChainSource");
106 }
107
108 {
109 auto const& expected = amountValue;
110 auto const actual = tx.getAmount();
111 expectEqualField(expected, actual, "sfAmount");
112 }
113
114 {
115 auto const& expected = attestationRewardAccountValue;
116 auto const actual = tx.getAttestationRewardAccount();
117 expectEqualField(expected, actual, "sfAttestationRewardAccount");
118 }
119
120 {
121 auto const& expected = wasLockingChainSendValue;
122 auto const actual = tx.getWasLockingChainSend();
123 expectEqualField(expected, actual, "sfWasLockingChainSend");
124 }
125
126 {
127 auto const& expected = xChainAccountCreateCountValue;
128 auto const actual = tx.getXChainAccountCreateCount();
129 expectEqualField(expected, actual, "sfXChainAccountCreateCount");
130 }
131
132 {
133 auto const& expected = destinationValue;
134 auto const actual = tx.getDestination();
135 expectEqualField(expected, actual, "sfDestination");
136 }
137
138 {
139 auto const& expected = signatureRewardValue;
140 auto const actual = tx.getSignatureReward();
141 expectEqualField(expected, actual, "sfSignatureReward");
142 }
143
144 // Verify optional fields
145}
146
147// 2 & 4) Start from an STTx, construct a builder from it, build a new wrapper,
148// and verify all fields match.
149TEST(TransactionsXChainAddAccountCreateAttestationTests, BuilderFromStTxRoundTrip)
150{
151 // Generate a deterministic keypair for signing
152 auto const [publicKey, secretKey] =
153 generateKeyPair(KeyType::secp256k1, generateSeed("testXChainAddAccountCreateAttestationFromTx"));
154
155 // Common transaction fields
156 auto const accountValue = calcAccountID(publicKey);
157 std::uint32_t const sequenceValue = 2;
158 auto const feeValue = canonical_AMOUNT();
159
160 // Transaction-specific field values
161 auto const xChainBridgeValue = canonical_XCHAIN_BRIDGE();
162 auto const attestationSignerAccountValue = canonical_ACCOUNT();
163 auto const publicKeyValue = canonical_VL();
164 auto const signatureValue = canonical_VL();
165 auto const otherChainSourceValue = canonical_ACCOUNT();
166 auto const amountValue = canonical_AMOUNT();
167 auto const attestationRewardAccountValue = canonical_ACCOUNT();
168 auto const wasLockingChainSendValue = canonical_UINT8();
169 auto const xChainAccountCreateCountValue = canonical_UINT64();
170 auto const destinationValue = canonical_ACCOUNT();
171 auto const signatureRewardValue = canonical_AMOUNT();
172
173 // Build an initial transaction
175 accountValue,
176 xChainBridgeValue,
177 attestationSignerAccountValue,
178 publicKeyValue,
179 signatureValue,
180 otherChainSourceValue,
181 amountValue,
182 attestationRewardAccountValue,
183 wasLockingChainSendValue,
184 xChainAccountCreateCountValue,
185 destinationValue,
186 signatureRewardValue,
187 sequenceValue,
188 feeValue
189 };
190
191
192 auto initialTx = initialBuilder.build(publicKey, secretKey);
193
194 // Create builder from existing STTx
195 XChainAddAccountCreateAttestationBuilder builderFromTx{initialTx.getSTTx()};
196
197 auto rebuiltTx = builderFromTx.build(publicKey, secretKey);
198
199 std::string reason;
200 EXPECT_TRUE(rebuiltTx.validate(reason)) << reason;
201
202 // Verify common fields
203 EXPECT_EQ(rebuiltTx.getAccount(), accountValue);
204 EXPECT_EQ(rebuiltTx.getSequence(), sequenceValue);
205 EXPECT_EQ(rebuiltTx.getFee(), feeValue);
206
207 // Verify required fields
208 {
209 auto const& expected = xChainBridgeValue;
210 auto const actual = rebuiltTx.getXChainBridge();
211 expectEqualField(expected, actual, "sfXChainBridge");
212 }
213
214 {
215 auto const& expected = attestationSignerAccountValue;
216 auto const actual = rebuiltTx.getAttestationSignerAccount();
217 expectEqualField(expected, actual, "sfAttestationSignerAccount");
218 }
219
220 {
221 auto const& expected = publicKeyValue;
222 auto const actual = rebuiltTx.getPublicKey();
223 expectEqualField(expected, actual, "sfPublicKey");
224 }
225
226 {
227 auto const& expected = signatureValue;
228 auto const actual = rebuiltTx.getSignature();
229 expectEqualField(expected, actual, "sfSignature");
230 }
231
232 {
233 auto const& expected = otherChainSourceValue;
234 auto const actual = rebuiltTx.getOtherChainSource();
235 expectEqualField(expected, actual, "sfOtherChainSource");
236 }
237
238 {
239 auto const& expected = amountValue;
240 auto const actual = rebuiltTx.getAmount();
241 expectEqualField(expected, actual, "sfAmount");
242 }
243
244 {
245 auto const& expected = attestationRewardAccountValue;
246 auto const actual = rebuiltTx.getAttestationRewardAccount();
247 expectEqualField(expected, actual, "sfAttestationRewardAccount");
248 }
249
250 {
251 auto const& expected = wasLockingChainSendValue;
252 auto const actual = rebuiltTx.getWasLockingChainSend();
253 expectEqualField(expected, actual, "sfWasLockingChainSend");
254 }
255
256 {
257 auto const& expected = xChainAccountCreateCountValue;
258 auto const actual = rebuiltTx.getXChainAccountCreateCount();
259 expectEqualField(expected, actual, "sfXChainAccountCreateCount");
260 }
261
262 {
263 auto const& expected = destinationValue;
264 auto const actual = rebuiltTx.getDestination();
265 expectEqualField(expected, actual, "sfDestination");
266 }
267
268 {
269 auto const& expected = signatureRewardValue;
270 auto const actual = rebuiltTx.getSignatureReward();
271 expectEqualField(expected, actual, "sfSignatureReward");
272 }
273
274 // Verify optional fields
275}
276
277// 3) Verify wrapper throws when constructed from wrong transaction type.
278TEST(TransactionsXChainAddAccountCreateAttestationTests, WrapperThrowsOnWrongTxType)
279{
280 // Build a valid transaction of a different type
281 auto const [pk, sk] =
283 auto const account = calcAccountID(pk);
284
285 AccountSetBuilder wrongBuilder{account, 1, canonical_AMOUNT()};
286 auto wrongTx = wrongBuilder.build(pk, sk);
287
289}
290
291// 4) Verify builder throws when constructed from wrong transaction type.
292TEST(TransactionsXChainAddAccountCreateAttestationTests, BuilderThrowsOnWrongTxType)
293{
294 // Build a valid transaction of a different type
295 auto const [pk, sk] =
296 generateKeyPair(KeyType::secp256k1, generateSeed("testWrongTypeBuilder"));
297 auto const account = calcAccountID(pk);
298
299 AccountSetBuilder wrongBuilder{account, 1, canonical_AMOUNT()};
300 auto wrongTx = wrongBuilder.build(pk, sk);
301
302 EXPECT_THROW(XChainAddAccountCreateAttestationBuilder{wrongTx.getSTTx()}, std::runtime_error);
303}
304
305
306}
std::shared_ptr< STTx const > getSTTx() const
Get the underlying STTx object.
Builder for XChainAddAccountCreateAttestation transactions.
XChainAddAccountCreateAttestation build(PublicKey const &publicKey, SecretKey const &secretKey)
Build and return the XChainAddAccountCreateAttestation wrapper.
TEST(TransactionsAccountDeleteTests, BuilderSettersRoundTrip)
Seed generateSeed(std::string const &passPhrase)
Generate a seed deterministically.
Definition Seed.cpp:57
XChainBridgeValue canonical_XCHAIN_BRIDGE()
std::pair< PublicKey, SecretKey > generateKeyPair(KeyType type, Seed const &seed)
Generate a key pair deterministically.
AccountID calcAccountID(PublicKey const &pk)
void expectEqualField(T const &expected, T const &actual, char const *fieldName)