feat: Add a new closed ended vault to extend SAV (#7921)

Co-authored-by: Vito Tumas <5780819+Tapanito@users.noreply.github.com>
This commit is contained in:
Jingchen
2026-08-12 17:07:43 +00:00
committed by GitHub
parent 946827b9bd
commit 8e9b1791c5
28 changed files with 2521 additions and 55 deletions

View File

@@ -36,6 +36,9 @@ TEST(VaultTests, BuilderSettersRoundTrip)
auto const withdrawalPolicyValue = canonical_UINT8();
auto const scaleValue = canonical_UINT8();
auto const lEVersionValue = canonical_UINT8();
auto const vaultKindValue = canonical_UINT8();
auto const subscriptionDateValue = canonical_UINT32();
auto const redemptionDateValue = canonical_UINT32();
VaultBuilder builder{
previousTxnIDValue,
@@ -56,6 +59,9 @@ TEST(VaultTests, BuilderSettersRoundTrip)
builder.setLossUnrealized(lossUnrealizedValue);
builder.setScale(scaleValue);
builder.setLEVersion(lEVersionValue);
builder.setVaultKind(vaultKindValue);
builder.setSubscriptionDate(subscriptionDateValue);
builder.setRedemptionDate(redemptionDateValue);
builder.setLedgerIndex(index);
builder.setFlags(0x1u);
@@ -176,6 +182,30 @@ TEST(VaultTests, BuilderSettersRoundTrip)
EXPECT_TRUE(entry.hasLEVersion());
}
{
auto const& expected = vaultKindValue;
auto const actualOpt = entry.getVaultKind();
ASSERT_TRUE(actualOpt.has_value());
expectEqualField(expected, *actualOpt, "sfVaultKind");
EXPECT_TRUE(entry.hasVaultKind());
}
{
auto const& expected = subscriptionDateValue;
auto const actualOpt = entry.getSubscriptionDate();
ASSERT_TRUE(actualOpt.has_value());
expectEqualField(expected, *actualOpt, "sfSubscriptionDate");
EXPECT_TRUE(entry.hasSubscriptionDate());
}
{
auto const& expected = redemptionDateValue;
auto const actualOpt = entry.getRedemptionDate();
ASSERT_TRUE(actualOpt.has_value());
expectEqualField(expected, *actualOpt, "sfRedemptionDate");
EXPECT_TRUE(entry.hasRedemptionDate());
}
EXPECT_TRUE(entry.hasLedgerIndex());
auto const ledgerIndex = entry.getLedgerIndex();
ASSERT_TRUE(ledgerIndex.has_value());
@@ -205,6 +235,9 @@ TEST(VaultTests, BuilderFromSleRoundTrip)
auto const withdrawalPolicyValue = canonical_UINT8();
auto const scaleValue = canonical_UINT8();
auto const lEVersionValue = canonical_UINT8();
auto const vaultKindValue = canonical_UINT8();
auto const subscriptionDateValue = canonical_UINT32();
auto const redemptionDateValue = canonical_UINT32();
auto sle = std::make_shared<SLE>(Vault::entryType, index);
@@ -224,6 +257,9 @@ TEST(VaultTests, BuilderFromSleRoundTrip)
sle->at(sfWithdrawalPolicy) = withdrawalPolicyValue;
sle->at(sfScale) = scaleValue;
sle->at(sfLEVersion) = lEVersionValue;
sle->at(sfVaultKind) = vaultKindValue;
sle->at(sfSubscriptionDate) = subscriptionDateValue;
sle->at(sfRedemptionDate) = redemptionDateValue;
VaultBuilder builderFromSle{sle};
EXPECT_TRUE(builderFromSle.validate());
@@ -415,6 +451,45 @@ TEST(VaultTests, BuilderFromSleRoundTrip)
expectEqualField(expected, *fromBuilderOpt, "sfLEVersion");
}
{
auto const& expected = vaultKindValue;
auto const fromSleOpt = entryFromSle.getVaultKind();
auto const fromBuilderOpt = entryFromBuilder.getVaultKind();
ASSERT_TRUE(fromSleOpt.has_value());
ASSERT_TRUE(fromBuilderOpt.has_value());
expectEqualField(expected, *fromSleOpt, "sfVaultKind");
expectEqualField(expected, *fromBuilderOpt, "sfVaultKind");
}
{
auto const& expected = subscriptionDateValue;
auto const fromSleOpt = entryFromSle.getSubscriptionDate();
auto const fromBuilderOpt = entryFromBuilder.getSubscriptionDate();
ASSERT_TRUE(fromSleOpt.has_value());
ASSERT_TRUE(fromBuilderOpt.has_value());
expectEqualField(expected, *fromSleOpt, "sfSubscriptionDate");
expectEqualField(expected, *fromBuilderOpt, "sfSubscriptionDate");
}
{
auto const& expected = redemptionDateValue;
auto const fromSleOpt = entryFromSle.getRedemptionDate();
auto const fromBuilderOpt = entryFromBuilder.getRedemptionDate();
ASSERT_TRUE(fromSleOpt.has_value());
ASSERT_TRUE(fromBuilderOpt.has_value());
expectEqualField(expected, *fromSleOpt, "sfRedemptionDate");
expectEqualField(expected, *fromBuilderOpt, "sfRedemptionDate");
}
EXPECT_EQ(entryFromSle.getKey(), index);
EXPECT_EQ(entryFromBuilder.getKey(), index);
}
@@ -499,5 +574,11 @@ TEST(VaultTests, OptionalFieldsReturnNullopt)
EXPECT_FALSE(entry.getScale().has_value());
EXPECT_FALSE(entry.hasLEVersion());
EXPECT_FALSE(entry.getLEVersion().has_value());
EXPECT_FALSE(entry.hasVaultKind());
EXPECT_FALSE(entry.getVaultKind().has_value());
EXPECT_FALSE(entry.hasSubscriptionDate());
EXPECT_FALSE(entry.getSubscriptionDate().has_value());
EXPECT_FALSE(entry.hasRedemptionDate());
EXPECT_FALSE(entry.getRedemptionDate().has_value());
}
}

View File

@@ -36,6 +36,9 @@ TEST(TransactionsVaultCreateTests, BuilderSettersRoundTrip)
auto const withdrawalPolicyValue = canonical_UINT8();
auto const dataValue = canonical_VL();
auto const scaleValue = canonical_UINT8();
auto const vaultKindValue = canonical_UINT8();
auto const subscriptionDateValue = canonical_UINT32();
auto const redemptionDateValue = canonical_UINT32();
VaultCreateBuilder builder{
accountValue,
@@ -51,6 +54,9 @@ TEST(TransactionsVaultCreateTests, BuilderSettersRoundTrip)
builder.setWithdrawalPolicy(withdrawalPolicyValue);
builder.setData(dataValue);
builder.setScale(scaleValue);
builder.setVaultKind(vaultKindValue);
builder.setSubscriptionDate(subscriptionDateValue);
builder.setRedemptionDate(redemptionDateValue);
auto tx = builder.build(publicKey, secretKey);
@@ -122,6 +128,30 @@ TEST(TransactionsVaultCreateTests, BuilderSettersRoundTrip)
EXPECT_TRUE(tx.hasScale());
}
{
auto const& expected = vaultKindValue;
auto const actualOpt = tx.getVaultKind();
ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfVaultKind should be present";
expectEqualField(expected, *actualOpt, "sfVaultKind");
EXPECT_TRUE(tx.hasVaultKind());
}
{
auto const& expected = subscriptionDateValue;
auto const actualOpt = tx.getSubscriptionDate();
ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfSubscriptionDate should be present";
expectEqualField(expected, *actualOpt, "sfSubscriptionDate");
EXPECT_TRUE(tx.hasSubscriptionDate());
}
{
auto const& expected = redemptionDateValue;
auto const actualOpt = tx.getRedemptionDate();
ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfRedemptionDate should be present";
expectEqualField(expected, *actualOpt, "sfRedemptionDate");
EXPECT_TRUE(tx.hasRedemptionDate());
}
}
// 2 & 4) Start from an STTx, construct a builder from it, build a new wrapper,
@@ -145,6 +175,9 @@ TEST(TransactionsVaultCreateTests, BuilderFromStTxRoundTrip)
auto const withdrawalPolicyValue = canonical_UINT8();
auto const dataValue = canonical_VL();
auto const scaleValue = canonical_UINT8();
auto const vaultKindValue = canonical_UINT8();
auto const subscriptionDateValue = canonical_UINT32();
auto const redemptionDateValue = canonical_UINT32();
// Build an initial transaction
VaultCreateBuilder initialBuilder{
@@ -160,6 +193,9 @@ TEST(TransactionsVaultCreateTests, BuilderFromStTxRoundTrip)
initialBuilder.setWithdrawalPolicy(withdrawalPolicyValue);
initialBuilder.setData(dataValue);
initialBuilder.setScale(scaleValue);
initialBuilder.setVaultKind(vaultKindValue);
initialBuilder.setSubscriptionDate(subscriptionDateValue);
initialBuilder.setRedemptionDate(redemptionDateValue);
auto initialTx = initialBuilder.build(publicKey, secretKey);
@@ -226,6 +262,27 @@ TEST(TransactionsVaultCreateTests, BuilderFromStTxRoundTrip)
expectEqualField(expected, *actualOpt, "sfScale");
}
{
auto const& expected = vaultKindValue;
auto const actualOpt = rebuiltTx.getVaultKind();
ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfVaultKind should be present";
expectEqualField(expected, *actualOpt, "sfVaultKind");
}
{
auto const& expected = subscriptionDateValue;
auto const actualOpt = rebuiltTx.getSubscriptionDate();
ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfSubscriptionDate should be present";
expectEqualField(expected, *actualOpt, "sfSubscriptionDate");
}
{
auto const& expected = redemptionDateValue;
auto const actualOpt = rebuiltTx.getRedemptionDate();
ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfRedemptionDate should be present";
expectEqualField(expected, *actualOpt, "sfRedemptionDate");
}
}
// 3) Verify wrapper throws when constructed from wrong transaction type.
@@ -295,6 +352,12 @@ TEST(TransactionsVaultCreateTests, OptionalFieldsReturnNullopt)
EXPECT_FALSE(tx.getData().has_value());
EXPECT_FALSE(tx.hasScale());
EXPECT_FALSE(tx.getScale().has_value());
EXPECT_FALSE(tx.hasVaultKind());
EXPECT_FALSE(tx.getVaultKind().has_value());
EXPECT_FALSE(tx.hasSubscriptionDate());
EXPECT_FALSE(tx.getSubscriptionDate().has_value());
EXPECT_FALSE(tx.hasRedemptionDate());
EXPECT_FALSE(tx.getRedemptionDate().has_value());
}
}