xrpld
Loading...
Searching...
No Matches
ConfidentialMPTConvertBackTests.cpp
1// Auto-generated unit tests for transaction ConfidentialMPTConvertBack
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/ConfidentialMPTConvertBack.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(TransactionsConfidentialMPTConvertBackTests, BuilderSettersRoundTrip)
21{
22 // Generate a deterministic keypair for signing
23 auto const [publicKey, secretKey] =
24 generateKeyPair(KeyType::Secp256k1, generateSeed("testConfidentialMPTConvertBack"));
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 mPTokenIssuanceIDValue = canonical_UINT192();
33 auto const mPTAmountValue = canonical_UINT64();
34 auto const holderEncryptedAmountValue = canonical_VL();
35 auto const issuerEncryptedAmountValue = canonical_VL();
36 auto const auditorEncryptedAmountValue = canonical_VL();
37 auto const blindingFactorValue = canonical_UINT256();
38 auto const zKProofValue = canonical_VL();
39 auto const balanceCommitmentValue = canonical_VL();
40
42 accountValue,
43 mPTokenIssuanceIDValue,
44 mPTAmountValue,
45 holderEncryptedAmountValue,
46 issuerEncryptedAmountValue,
47 blindingFactorValue,
48 zKProofValue,
49 balanceCommitmentValue,
50 sequenceValue,
51 feeValue
52 };
53
54 // Set optional fields
55 builder.setAuditorEncryptedAmount(auditorEncryptedAmountValue);
56
57 auto tx = builder.build(publicKey, secretKey);
58
59 std::string reason;
60 EXPECT_TRUE(tx.validate(reason)) << reason;
61
62 // Verify signing was applied
63 EXPECT_FALSE(tx.getSigningPubKey().empty());
64 EXPECT_TRUE(tx.hasTxnSignature());
65
66 // Verify common fields
67 EXPECT_EQ(tx.getAccount(), accountValue);
68 EXPECT_EQ(tx.getSequence(), sequenceValue);
69 EXPECT_EQ(tx.getFee(), feeValue);
70
71 // Verify required fields
72 {
73 auto const& expected = mPTokenIssuanceIDValue;
74 auto const actual = tx.getMPTokenIssuanceID();
75 expectEqualField(expected, actual, "sfMPTokenIssuanceID");
76 }
77
78 {
79 auto const& expected = mPTAmountValue;
80 auto const actual = tx.getMPTAmount();
81 expectEqualField(expected, actual, "sfMPTAmount");
82 }
83
84 {
85 auto const& expected = holderEncryptedAmountValue;
86 auto const actual = tx.getHolderEncryptedAmount();
87 expectEqualField(expected, actual, "sfHolderEncryptedAmount");
88 }
89
90 {
91 auto const& expected = issuerEncryptedAmountValue;
92 auto const actual = tx.getIssuerEncryptedAmount();
93 expectEqualField(expected, actual, "sfIssuerEncryptedAmount");
94 }
95
96 {
97 auto const& expected = blindingFactorValue;
98 auto const actual = tx.getBlindingFactor();
99 expectEqualField(expected, actual, "sfBlindingFactor");
100 }
101
102 {
103 auto const& expected = zKProofValue;
104 auto const actual = tx.getZKProof();
105 expectEqualField(expected, actual, "sfZKProof");
106 }
107
108 {
109 auto const& expected = balanceCommitmentValue;
110 auto const actual = tx.getBalanceCommitment();
111 expectEqualField(expected, actual, "sfBalanceCommitment");
112 }
113
114 // Verify optional fields
115 {
116 auto const& expected = auditorEncryptedAmountValue;
117 auto const actualOpt = tx.getAuditorEncryptedAmount();
118 ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfAuditorEncryptedAmount should be present";
119 expectEqualField(expected, *actualOpt, "sfAuditorEncryptedAmount");
120 EXPECT_TRUE(tx.hasAuditorEncryptedAmount());
121 }
122
123}
124
125// 2 & 4) Start from an STTx, construct a builder from it, build a new wrapper,
126// and verify all fields match.
127TEST(TransactionsConfidentialMPTConvertBackTests, BuilderFromStTxRoundTrip)
128{
129 // Generate a deterministic keypair for signing
130 auto const [publicKey, secretKey] =
131 generateKeyPair(KeyType::Secp256k1, generateSeed("testConfidentialMPTConvertBackFromTx"));
132
133 // Common transaction fields
134 auto const accountValue = calcAccountID(publicKey);
135 std::uint32_t const sequenceValue = 2;
136 auto const feeValue = canonical_AMOUNT();
137
138 // Transaction-specific field values
139 auto const mPTokenIssuanceIDValue = canonical_UINT192();
140 auto const mPTAmountValue = canonical_UINT64();
141 auto const holderEncryptedAmountValue = canonical_VL();
142 auto const issuerEncryptedAmountValue = canonical_VL();
143 auto const auditorEncryptedAmountValue = canonical_VL();
144 auto const blindingFactorValue = canonical_UINT256();
145 auto const zKProofValue = canonical_VL();
146 auto const balanceCommitmentValue = canonical_VL();
147
148 // Build an initial transaction
150 accountValue,
151 mPTokenIssuanceIDValue,
152 mPTAmountValue,
153 holderEncryptedAmountValue,
154 issuerEncryptedAmountValue,
155 blindingFactorValue,
156 zKProofValue,
157 balanceCommitmentValue,
158 sequenceValue,
159 feeValue
160 };
161
162 initialBuilder.setAuditorEncryptedAmount(auditorEncryptedAmountValue);
163
164 auto initialTx = initialBuilder.build(publicKey, secretKey);
165
166 // Create builder from existing STTx
167 ConfidentialMPTConvertBackBuilder builderFromTx{initialTx.getSTTx()};
168
169 auto rebuiltTx = builderFromTx.build(publicKey, secretKey);
170
171 std::string reason;
172 EXPECT_TRUE(rebuiltTx.validate(reason)) << reason;
173
174 // Verify common fields
175 EXPECT_EQ(rebuiltTx.getAccount(), accountValue);
176 EXPECT_EQ(rebuiltTx.getSequence(), sequenceValue);
177 EXPECT_EQ(rebuiltTx.getFee(), feeValue);
178
179 // Verify required fields
180 {
181 auto const& expected = mPTokenIssuanceIDValue;
182 auto const actual = rebuiltTx.getMPTokenIssuanceID();
183 expectEqualField(expected, actual, "sfMPTokenIssuanceID");
184 }
185
186 {
187 auto const& expected = mPTAmountValue;
188 auto const actual = rebuiltTx.getMPTAmount();
189 expectEqualField(expected, actual, "sfMPTAmount");
190 }
191
192 {
193 auto const& expected = holderEncryptedAmountValue;
194 auto const actual = rebuiltTx.getHolderEncryptedAmount();
195 expectEqualField(expected, actual, "sfHolderEncryptedAmount");
196 }
197
198 {
199 auto const& expected = issuerEncryptedAmountValue;
200 auto const actual = rebuiltTx.getIssuerEncryptedAmount();
201 expectEqualField(expected, actual, "sfIssuerEncryptedAmount");
202 }
203
204 {
205 auto const& expected = blindingFactorValue;
206 auto const actual = rebuiltTx.getBlindingFactor();
207 expectEqualField(expected, actual, "sfBlindingFactor");
208 }
209
210 {
211 auto const& expected = zKProofValue;
212 auto const actual = rebuiltTx.getZKProof();
213 expectEqualField(expected, actual, "sfZKProof");
214 }
215
216 {
217 auto const& expected = balanceCommitmentValue;
218 auto const actual = rebuiltTx.getBalanceCommitment();
219 expectEqualField(expected, actual, "sfBalanceCommitment");
220 }
221
222 // Verify optional fields
223 {
224 auto const& expected = auditorEncryptedAmountValue;
225 auto const actualOpt = rebuiltTx.getAuditorEncryptedAmount();
226 ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfAuditorEncryptedAmount should be present";
227 expectEqualField(expected, *actualOpt, "sfAuditorEncryptedAmount");
228 }
229
230}
231
232// 3) Verify wrapper throws when constructed from wrong transaction type.
233TEST(TransactionsConfidentialMPTConvertBackTests, WrapperThrowsOnWrongTxType)
234{
235 // Build a valid transaction of a different type
236 auto const [pk, sk] =
238 auto const account = calcAccountID(pk);
239
240 AccountSetBuilder wrongBuilder{account, 1, canonical_AMOUNT()};
241 auto wrongTx = wrongBuilder.build(pk, sk);
242
243 EXPECT_THROW(ConfidentialMPTConvertBack{wrongTx.getSTTx()}, std::runtime_error);
244}
245
246// 4) Verify builder throws when constructed from wrong transaction type.
247TEST(TransactionsConfidentialMPTConvertBackTests, BuilderThrowsOnWrongTxType)
248{
249 // Build a valid transaction of a different type
250 auto const [pk, sk] =
251 generateKeyPair(KeyType::Secp256k1, generateSeed("testWrongTypeBuilder"));
252 auto const account = calcAccountID(pk);
253
254 AccountSetBuilder wrongBuilder{account, 1, canonical_AMOUNT()};
255 auto wrongTx = wrongBuilder.build(pk, sk);
256
257 EXPECT_THROW(ConfidentialMPTConvertBackBuilder{wrongTx.getSTTx()}, std::runtime_error);
258}
259
260// 5) Build with only required fields and verify optional fields return nullopt.
261TEST(TransactionsConfidentialMPTConvertBackTests, OptionalFieldsReturnNullopt)
262{
263 // Generate a deterministic keypair for signing
264 auto const [publicKey, secretKey] =
265 generateKeyPair(KeyType::Secp256k1, generateSeed("testConfidentialMPTConvertBackNullopt"));
266
267 // Common transaction fields
268 auto const accountValue = calcAccountID(publicKey);
269 std::uint32_t const sequenceValue = 3;
270 auto const feeValue = canonical_AMOUNT();
271
272 // Transaction-specific required field values
273 auto const mPTokenIssuanceIDValue = canonical_UINT192();
274 auto const mPTAmountValue = canonical_UINT64();
275 auto const holderEncryptedAmountValue = canonical_VL();
276 auto const issuerEncryptedAmountValue = canonical_VL();
277 auto const blindingFactorValue = canonical_UINT256();
278 auto const zKProofValue = canonical_VL();
279 auto const balanceCommitmentValue = canonical_VL();
280
282 accountValue,
283 mPTokenIssuanceIDValue,
284 mPTAmountValue,
285 holderEncryptedAmountValue,
286 issuerEncryptedAmountValue,
287 blindingFactorValue,
288 zKProofValue,
289 balanceCommitmentValue,
290 sequenceValue,
291 feeValue
292 };
293
294 // Do NOT set optional fields
295
296 auto tx = builder.build(publicKey, secretKey);
297
298 // Verify optional fields are not present
299 EXPECT_FALSE(tx.hasAuditorEncryptedAmount());
300 EXPECT_FALSE(tx.getAuditorEncryptedAmount().has_value());
301}
302
303}
AccountSet build(PublicKey const &publicKey, SecretKey const &secretKey)
Build and return the AccountSet wrapper.
ConfidentialMPTConvertBackBuilder & setAuditorEncryptedAmount(std::decay_t< typename SF_VL::type::value_type > const &value)
Set sfAuditorEncryptedAmount (SoeOptional).
ConfidentialMPTConvertBack build(PublicKey const &publicKey, SecretKey const &secretKey)
Build and return the ConfidentialMPTConvertBack wrapper.
TEST(TransactionsAccountDeleteTests, BuilderSettersRoundTrip)
Seed generateSeed(std::string const &passPhrase)
Generate a seed deterministically.
Definition Seed.cpp:58
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)