xrpld
Toggle main menu visibility
Loading...
Searching...
No Matches
tests
libxrpl
protocol_autogen
transactions
AMMWithdrawTests.cpp
1
// Auto-generated unit tests for transaction AMMWithdraw
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/AMMWithdraw.h>
12
#include <xrpl/protocol_autogen/transactions/AccountSet.h>
13
14
#include <
string
>
15
16
namespace
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.
20
TEST
(TransactionsAMMWithdrawTests, BuilderSettersRoundTrip)
21
{
22
// Generate a deterministic keypair for signing
23
auto
const
[publicKey, secretKey] =
24
generateKeyPair
(
KeyType::Secp256k1
,
generateSeed
(
"testAMMWithdraw"
));
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
lPTokenInValue =
canonical_AMOUNT
();
38
39
AMMWithdrawBuilder
builder{
40
accountValue,
41
assetValue,
42
asset2Value,
43
sequenceValue,
44
feeValue
45
};
46
47
// Set optional fields
48
builder.
setAmount
(amountValue);
49
builder.
setAmount2
(amount2Value);
50
builder.
setEPrice
(ePriceValue);
51
builder.
setLPTokenIn
(lPTokenInValue);
52
53
auto
tx = builder.
build
(publicKey, secretKey);
54
55
std::string
reason;
56
EXPECT_TRUE(tx.validate(reason)) << reason;
57
58
// Verify signing was applied
59
EXPECT_FALSE(tx.getSigningPubKey().empty());
60
EXPECT_TRUE(tx.hasTxnSignature());
61
62
// Verify common fields
63
EXPECT_EQ(tx.getAccount(), accountValue);
64
EXPECT_EQ(tx.getSequence(), sequenceValue);
65
EXPECT_EQ(tx.getFee(), feeValue);
66
67
// Verify required fields
68
{
69
auto
const
& expected = assetValue;
70
auto
const
actual = tx.getAsset();
71
expectEqualField
(expected, actual,
"sfAsset"
);
72
}
73
74
{
75
auto
const
& expected = asset2Value;
76
auto
const
actual = tx.getAsset2();
77
expectEqualField
(expected, actual,
"sfAsset2"
);
78
}
79
80
// Verify optional fields
81
{
82
auto
const
& expected = amountValue;
83
auto
const
actualOpt = tx.getAmount();
84
ASSERT_TRUE(actualOpt.has_value()) <<
"Optional field sfAmount should be present"
;
85
expectEqualField
(expected, *actualOpt,
"sfAmount"
);
86
EXPECT_TRUE(tx.hasAmount());
87
}
88
89
{
90
auto
const
& expected = amount2Value;
91
auto
const
actualOpt = tx.getAmount2();
92
ASSERT_TRUE(actualOpt.has_value()) <<
"Optional field sfAmount2 should be present"
;
93
expectEqualField
(expected, *actualOpt,
"sfAmount2"
);
94
EXPECT_TRUE(tx.hasAmount2());
95
}
96
97
{
98
auto
const
& expected = ePriceValue;
99
auto
const
actualOpt = tx.getEPrice();
100
ASSERT_TRUE(actualOpt.has_value()) <<
"Optional field sfEPrice should be present"
;
101
expectEqualField
(expected, *actualOpt,
"sfEPrice"
);
102
EXPECT_TRUE(tx.hasEPrice());
103
}
104
105
{
106
auto
const
& expected = lPTokenInValue;
107
auto
const
actualOpt = tx.getLPTokenIn();
108
ASSERT_TRUE(actualOpt.has_value()) <<
"Optional field sfLPTokenIn should be present"
;
109
expectEqualField
(expected, *actualOpt,
"sfLPTokenIn"
);
110
EXPECT_TRUE(tx.hasLPTokenIn());
111
}
112
113
}
114
115
// 2 & 4) Start from an STTx, construct a builder from it, build a new wrapper,
116
// and verify all fields match.
117
TEST
(TransactionsAMMWithdrawTests, BuilderFromStTxRoundTrip)
118
{
119
// Generate a deterministic keypair for signing
120
auto
const
[publicKey, secretKey] =
121
generateKeyPair
(
KeyType::Secp256k1
,
generateSeed
(
"testAMMWithdrawFromTx"
));
122
123
// Common transaction fields
124
auto
const
accountValue =
calcAccountID
(publicKey);
125
std::uint32_t
const
sequenceValue = 2;
126
auto
const
feeValue =
canonical_AMOUNT
();
127
128
// Transaction-specific field values
129
auto
const
assetValue =
canonical_ISSUE
();
130
auto
const
asset2Value =
canonical_ISSUE
();
131
auto
const
amountValue =
canonical_AMOUNT
();
132
auto
const
amount2Value =
canonical_AMOUNT
();
133
auto
const
ePriceValue =
canonical_AMOUNT
();
134
auto
const
lPTokenInValue =
canonical_AMOUNT
();
135
136
// Build an initial transaction
137
AMMWithdrawBuilder
initialBuilder{
138
accountValue,
139
assetValue,
140
asset2Value,
141
sequenceValue,
142
feeValue
143
};
144
145
initialBuilder.
setAmount
(amountValue);
146
initialBuilder.
setAmount2
(amount2Value);
147
initialBuilder.
setEPrice
(ePriceValue);
148
initialBuilder.
setLPTokenIn
(lPTokenInValue);
149
150
auto
initialTx = initialBuilder.
build
(publicKey, secretKey);
151
152
// Create builder from existing STTx
153
AMMWithdrawBuilder
builderFromTx{initialTx.getSTTx()};
154
155
auto
rebuiltTx = builderFromTx.
build
(publicKey, secretKey);
156
157
std::string
reason;
158
EXPECT_TRUE(rebuiltTx.validate(reason)) << reason;
159
160
// Verify common fields
161
EXPECT_EQ(rebuiltTx.getAccount(), accountValue);
162
EXPECT_EQ(rebuiltTx.getSequence(), sequenceValue);
163
EXPECT_EQ(rebuiltTx.getFee(), feeValue);
164
165
// Verify required fields
166
{
167
auto
const
& expected = assetValue;
168
auto
const
actual = rebuiltTx.getAsset();
169
expectEqualField
(expected, actual,
"sfAsset"
);
170
}
171
172
{
173
auto
const
& expected = asset2Value;
174
auto
const
actual = rebuiltTx.getAsset2();
175
expectEqualField
(expected, actual,
"sfAsset2"
);
176
}
177
178
// Verify optional fields
179
{
180
auto
const
& expected = amountValue;
181
auto
const
actualOpt = rebuiltTx.getAmount();
182
ASSERT_TRUE(actualOpt.has_value()) <<
"Optional field sfAmount should be present"
;
183
expectEqualField
(expected, *actualOpt,
"sfAmount"
);
184
}
185
186
{
187
auto
const
& expected = amount2Value;
188
auto
const
actualOpt = rebuiltTx.getAmount2();
189
ASSERT_TRUE(actualOpt.has_value()) <<
"Optional field sfAmount2 should be present"
;
190
expectEqualField
(expected, *actualOpt,
"sfAmount2"
);
191
}
192
193
{
194
auto
const
& expected = ePriceValue;
195
auto
const
actualOpt = rebuiltTx.getEPrice();
196
ASSERT_TRUE(actualOpt.has_value()) <<
"Optional field sfEPrice should be present"
;
197
expectEqualField
(expected, *actualOpt,
"sfEPrice"
);
198
}
199
200
{
201
auto
const
& expected = lPTokenInValue;
202
auto
const
actualOpt = rebuiltTx.getLPTokenIn();
203
ASSERT_TRUE(actualOpt.has_value()) <<
"Optional field sfLPTokenIn should be present"
;
204
expectEqualField
(expected, *actualOpt,
"sfLPTokenIn"
);
205
}
206
207
}
208
209
// 3) Verify wrapper throws when constructed from wrong transaction type.
210
TEST
(TransactionsAMMWithdrawTests, WrapperThrowsOnWrongTxType)
211
{
212
// Build a valid transaction of a different type
213
auto
const
[pk, sk] =
214
generateKeyPair
(
KeyType::Secp256k1
,
generateSeed
(
"testWrongType"
));
215
auto
const
account =
calcAccountID
(pk);
216
217
AccountSetBuilder
wrongBuilder{account, 1,
canonical_AMOUNT
()};
218
auto
wrongTx = wrongBuilder.
build
(pk, sk);
219
220
EXPECT_THROW(
AMMWithdraw
{wrongTx.getSTTx()},
std::runtime_error
);
221
}
222
223
// 4) Verify builder throws when constructed from wrong transaction type.
224
TEST
(TransactionsAMMWithdrawTests, BuilderThrowsOnWrongTxType)
225
{
226
// Build a valid transaction of a different type
227
auto
const
[pk, sk] =
228
generateKeyPair
(
KeyType::Secp256k1
,
generateSeed
(
"testWrongTypeBuilder"
));
229
auto
const
account =
calcAccountID
(pk);
230
231
AccountSetBuilder
wrongBuilder{account, 1,
canonical_AMOUNT
()};
232
auto
wrongTx = wrongBuilder.
build
(pk, sk);
233
234
EXPECT_THROW(
AMMWithdrawBuilder
{wrongTx.getSTTx()},
std::runtime_error
);
235
}
236
237
// 5) Build with only required fields and verify optional fields return nullopt.
238
TEST
(TransactionsAMMWithdrawTests, OptionalFieldsReturnNullopt)
239
{
240
// Generate a deterministic keypair for signing
241
auto
const
[publicKey, secretKey] =
242
generateKeyPair
(
KeyType::Secp256k1
,
generateSeed
(
"testAMMWithdrawNullopt"
));
243
244
// Common transaction fields
245
auto
const
accountValue =
calcAccountID
(publicKey);
246
std::uint32_t
const
sequenceValue = 3;
247
auto
const
feeValue =
canonical_AMOUNT
();
248
249
// Transaction-specific required field values
250
auto
const
assetValue =
canonical_ISSUE
();
251
auto
const
asset2Value =
canonical_ISSUE
();
252
253
AMMWithdrawBuilder
builder{
254
accountValue,
255
assetValue,
256
asset2Value,
257
sequenceValue,
258
feeValue
259
};
260
261
// Do NOT set optional fields
262
263
auto
tx = builder.
build
(publicKey, secretKey);
264
265
// Verify optional fields are not present
266
EXPECT_FALSE(tx.hasAmount());
267
EXPECT_FALSE(tx.getAmount().has_value());
268
EXPECT_FALSE(tx.hasAmount2());
269
EXPECT_FALSE(tx.getAmount2().has_value());
270
EXPECT_FALSE(tx.hasEPrice());
271
EXPECT_FALSE(tx.getEPrice().has_value());
272
EXPECT_FALSE(tx.hasLPTokenIn());
273
EXPECT_FALSE(tx.getLPTokenIn().has_value());
274
}
275
276
}
std::string
xrpl::transactions::AMMWithdrawBuilder
Builder for AMMWithdraw transactions.
Definition
protocol_autogen/transactions/AMMWithdraw.h:189
xrpl::transactions::AMMWithdrawBuilder::setLPTokenIn
AMMWithdrawBuilder & setLPTokenIn(std::decay_t< typename SF_AMOUNT::type::value_type > const &value)
Set sfLPTokenIn (SoeOptional).
Definition
protocol_autogen/transactions/AMMWithdraw.h:291
xrpl::transactions::AMMWithdrawBuilder::setAmount2
AMMWithdrawBuilder & setAmount2(std::decay_t< typename SF_AMOUNT::type::value_type > const &value)
Set sfAmount2 (SoeOptional).
Definition
protocol_autogen/transactions/AMMWithdraw.h:269
xrpl::transactions::AMMWithdrawBuilder::setEPrice
AMMWithdrawBuilder & setEPrice(std::decay_t< typename SF_AMOUNT::type::value_type > const &value)
Set sfEPrice (SoeOptional).
Definition
protocol_autogen/transactions/AMMWithdraw.h:280
xrpl::transactions::AMMWithdrawBuilder::setAmount
AMMWithdrawBuilder & setAmount(std::decay_t< typename SF_AMOUNT::type::value_type > const &value)
Set sfAmount (SoeOptional).
Definition
protocol_autogen/transactions/AMMWithdraw.h:257
xrpl::transactions::AMMWithdrawBuilder::build
AMMWithdraw build(PublicKey const &publicKey, SecretKey const &secretKey)
Build and return the AMMWithdraw wrapper.
Definition
protocol_autogen/transactions/AMMWithdraw.h:304
xrpl::transactions::AMMWithdraw
Transaction: AMMWithdraw.
Definition
protocol_autogen/transactions/AMMWithdraw.h:30
xrpl::transactions::AccountSetBuilder
Builder for AccountSet transactions.
Definition
protocol_autogen/transactions/AccountSet.h:319
xrpl::transactions::AccountSetBuilder::build
AccountSet build(PublicKey const &publicKey, SecretKey const &secretKey)
Build and return the AccountSet wrapper.
Definition
protocol_autogen/transactions/AccountSet.h:470
std::uint32_t
xrpl::transactions
Definition
TransactionBase.h:15
xrpl::transactions::TEST
TEST(TransactionsAccountDeleteTests, BuilderSettersRoundTrip)
Definition
AccountDeleteTests.cpp:20
xrpl::KeyType::Secp256k1
@ Secp256k1
Definition
KeyType.h:9
xrpl::generateSeed
Seed generateSeed(std::string const &passPhrase)
Generate a seed deterministically.
Definition
Seed.cpp:58
xrpl::canonical_ISSUE
IssueValue canonical_ISSUE()
Definition
/libxrpl/protocol_autogen/TestHelpers.h:125
xrpl::generateKeyPair
std::pair< PublicKey, SecretKey > generateKeyPair(KeyType type, Seed const &seed)
Generate a key pair deterministically.
Definition
SecretKey.cpp:338
xrpl::canonical_AMOUNT
AmountValue canonical_AMOUNT()
Definition
/libxrpl/protocol_autogen/TestHelpers.h:104
xrpl::calcAccountID
AccountID calcAccountID(PublicKey const &pk)
Definition
AccountID.cpp:149
xrpl::expectEqualField
void expectEqualField(T const &expected, T const &actual, char const *fieldName)
Definition
/libxrpl/protocol_autogen/TestHelpers.h:178
std::runtime_error
string
Generated by
1.17.0