rippled
Loading...
Searching...
No Matches
AMMDepositTests.cpp
1// Auto-generated unit tests for transaction AMMDeposit
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/AMMDeposit.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(TransactionsAMMDepositTests, BuilderSettersRoundTrip)
21{
22 // Generate a deterministic keypair for signing
23 auto const [publicKey, secretKey] =
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 assetValue = canonical_ISSUE();
33 auto const asset2Value = canonical_ISSUE();
34 auto const amountValue = canonical_AMOUNT();
35 auto const amount2Value = canonical_AMOUNT();
36 auto const ePriceValue = canonical_AMOUNT();
37 auto const lPTokenOutValue = canonical_AMOUNT();
38 auto const tradingFeeValue = canonical_UINT16();
39
40 AMMDepositBuilder builder{
41 accountValue,
42 assetValue,
43 asset2Value,
44 sequenceValue,
45 feeValue
46 };
47
48 // Set optional fields
49 builder.setAmount(amountValue);
50 builder.setAmount2(amount2Value);
51 builder.setEPrice(ePriceValue);
52 builder.setLPTokenOut(lPTokenOutValue);
53 builder.setTradingFee(tradingFeeValue);
54
55 auto tx = builder.build(publicKey, secretKey);
56
57 std::string reason;
58 EXPECT_TRUE(tx.validate(reason)) << reason;
59
60 // Verify signing was applied
61 EXPECT_FALSE(tx.getSigningPubKey().empty());
62 EXPECT_TRUE(tx.hasTxnSignature());
63
64 // Verify common fields
65 EXPECT_EQ(tx.getAccount(), accountValue);
66 EXPECT_EQ(tx.getSequence(), sequenceValue);
67 EXPECT_EQ(tx.getFee(), feeValue);
68
69 // Verify required fields
70 {
71 auto const& expected = assetValue;
72 auto const actual = tx.getAsset();
73 expectEqualField(expected, actual, "sfAsset");
74 }
75
76 {
77 auto const& expected = asset2Value;
78 auto const actual = tx.getAsset2();
79 expectEqualField(expected, actual, "sfAsset2");
80 }
81
82 // Verify optional fields
83 {
84 auto const& expected = amountValue;
85 auto const actualOpt = tx.getAmount();
86 ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfAmount should be present";
87 expectEqualField(expected, *actualOpt, "sfAmount");
88 EXPECT_TRUE(tx.hasAmount());
89 }
90
91 {
92 auto const& expected = amount2Value;
93 auto const actualOpt = tx.getAmount2();
94 ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfAmount2 should be present";
95 expectEqualField(expected, *actualOpt, "sfAmount2");
96 EXPECT_TRUE(tx.hasAmount2());
97 }
98
99 {
100 auto const& expected = ePriceValue;
101 auto const actualOpt = tx.getEPrice();
102 ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfEPrice should be present";
103 expectEqualField(expected, *actualOpt, "sfEPrice");
104 EXPECT_TRUE(tx.hasEPrice());
105 }
106
107 {
108 auto const& expected = lPTokenOutValue;
109 auto const actualOpt = tx.getLPTokenOut();
110 ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfLPTokenOut should be present";
111 expectEqualField(expected, *actualOpt, "sfLPTokenOut");
112 EXPECT_TRUE(tx.hasLPTokenOut());
113 }
114
115 {
116 auto const& expected = tradingFeeValue;
117 auto const actualOpt = tx.getTradingFee();
118 ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfTradingFee should be present";
119 expectEqualField(expected, *actualOpt, "sfTradingFee");
120 EXPECT_TRUE(tx.hasTradingFee());
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(TransactionsAMMDepositTests, BuilderFromStTxRoundTrip)
128{
129 // Generate a deterministic keypair for signing
130 auto const [publicKey, secretKey] =
131 generateKeyPair(KeyType::secp256k1, generateSeed("testAMMDepositFromTx"));
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 assetValue = canonical_ISSUE();
140 auto const asset2Value = canonical_ISSUE();
141 auto const amountValue = canonical_AMOUNT();
142 auto const amount2Value = canonical_AMOUNT();
143 auto const ePriceValue = canonical_AMOUNT();
144 auto const lPTokenOutValue = canonical_AMOUNT();
145 auto const tradingFeeValue = canonical_UINT16();
146
147 // Build an initial transaction
148 AMMDepositBuilder initialBuilder{
149 accountValue,
150 assetValue,
151 asset2Value,
152 sequenceValue,
153 feeValue
154 };
155
156 initialBuilder.setAmount(amountValue);
157 initialBuilder.setAmount2(amount2Value);
158 initialBuilder.setEPrice(ePriceValue);
159 initialBuilder.setLPTokenOut(lPTokenOutValue);
160 initialBuilder.setTradingFee(tradingFeeValue);
161
162 auto initialTx = initialBuilder.build(publicKey, secretKey);
163
164 // Create builder from existing STTx
165 AMMDepositBuilder builderFromTx{initialTx.getSTTx()};
166
167 auto rebuiltTx = builderFromTx.build(publicKey, secretKey);
168
169 std::string reason;
170 EXPECT_TRUE(rebuiltTx.validate(reason)) << reason;
171
172 // Verify common fields
173 EXPECT_EQ(rebuiltTx.getAccount(), accountValue);
174 EXPECT_EQ(rebuiltTx.getSequence(), sequenceValue);
175 EXPECT_EQ(rebuiltTx.getFee(), feeValue);
176
177 // Verify required fields
178 {
179 auto const& expected = assetValue;
180 auto const actual = rebuiltTx.getAsset();
181 expectEqualField(expected, actual, "sfAsset");
182 }
183
184 {
185 auto const& expected = asset2Value;
186 auto const actual = rebuiltTx.getAsset2();
187 expectEqualField(expected, actual, "sfAsset2");
188 }
189
190 // Verify optional fields
191 {
192 auto const& expected = amountValue;
193 auto const actualOpt = rebuiltTx.getAmount();
194 ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfAmount should be present";
195 expectEqualField(expected, *actualOpt, "sfAmount");
196 }
197
198 {
199 auto const& expected = amount2Value;
200 auto const actualOpt = rebuiltTx.getAmount2();
201 ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfAmount2 should be present";
202 expectEqualField(expected, *actualOpt, "sfAmount2");
203 }
204
205 {
206 auto const& expected = ePriceValue;
207 auto const actualOpt = rebuiltTx.getEPrice();
208 ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfEPrice should be present";
209 expectEqualField(expected, *actualOpt, "sfEPrice");
210 }
211
212 {
213 auto const& expected = lPTokenOutValue;
214 auto const actualOpt = rebuiltTx.getLPTokenOut();
215 ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfLPTokenOut should be present";
216 expectEqualField(expected, *actualOpt, "sfLPTokenOut");
217 }
218
219 {
220 auto const& expected = tradingFeeValue;
221 auto const actualOpt = rebuiltTx.getTradingFee();
222 ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfTradingFee should be present";
223 expectEqualField(expected, *actualOpt, "sfTradingFee");
224 }
225
226}
227
228// 3) Verify wrapper throws when constructed from wrong transaction type.
229TEST(TransactionsAMMDepositTests, WrapperThrowsOnWrongTxType)
230{
231 // Build a valid transaction of a different type
232 auto const [pk, sk] =
234 auto const account = calcAccountID(pk);
235
236 AccountSetBuilder wrongBuilder{account, 1, canonical_AMOUNT()};
237 auto wrongTx = wrongBuilder.build(pk, sk);
238
239 EXPECT_THROW(AMMDeposit{wrongTx.getSTTx()}, std::runtime_error);
240}
241
242// 4) Verify builder throws when constructed from wrong transaction type.
243TEST(TransactionsAMMDepositTests, BuilderThrowsOnWrongTxType)
244{
245 // Build a valid transaction of a different type
246 auto const [pk, sk] =
247 generateKeyPair(KeyType::secp256k1, generateSeed("testWrongTypeBuilder"));
248 auto const account = calcAccountID(pk);
249
250 AccountSetBuilder wrongBuilder{account, 1, canonical_AMOUNT()};
251 auto wrongTx = wrongBuilder.build(pk, sk);
252
253 EXPECT_THROW(AMMDepositBuilder{wrongTx.getSTTx()}, std::runtime_error);
254}
255
256// 5) Build with only required fields and verify optional fields return nullopt.
257TEST(TransactionsAMMDepositTests, OptionalFieldsReturnNullopt)
258{
259 // Generate a deterministic keypair for signing
260 auto const [publicKey, secretKey] =
261 generateKeyPair(KeyType::secp256k1, generateSeed("testAMMDepositNullopt"));
262
263 // Common transaction fields
264 auto const accountValue = calcAccountID(publicKey);
265 std::uint32_t const sequenceValue = 3;
266 auto const feeValue = canonical_AMOUNT();
267
268 // Transaction-specific required field values
269 auto const assetValue = canonical_ISSUE();
270 auto const asset2Value = canonical_ISSUE();
271
272 AMMDepositBuilder builder{
273 accountValue,
274 assetValue,
275 asset2Value,
276 sequenceValue,
277 feeValue
278 };
279
280 // Do NOT set optional fields
281
282 auto tx = builder.build(publicKey, secretKey);
283
284 // Verify optional fields are not present
285 EXPECT_FALSE(tx.hasAmount());
286 EXPECT_FALSE(tx.getAmount().has_value());
287 EXPECT_FALSE(tx.hasAmount2());
288 EXPECT_FALSE(tx.getAmount2().has_value());
289 EXPECT_FALSE(tx.hasEPrice());
290 EXPECT_FALSE(tx.getEPrice().has_value());
291 EXPECT_FALSE(tx.hasLPTokenOut());
292 EXPECT_FALSE(tx.getLPTokenOut().has_value());
293 EXPECT_FALSE(tx.hasTradingFee());
294 EXPECT_FALSE(tx.getTradingFee().has_value());
295}
296
297}
AMMDeposit build(PublicKey const &publicKey, SecretKey const &secretKey)
Build and return the AMMDeposit wrapper.
std::shared_ptr< STTx const > getSTTx() const
Get the underlying STTx object.
TEST(TransactionsAccountDeleteTests, BuilderSettersRoundTrip)
Seed generateSeed(std::string const &passPhrase)
Generate a seed deterministically.
Definition Seed.cpp:57
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)