Skip to content

Commit 3595af0

Browse files
progress
1 parent 3de443d commit 3595af0

File tree

2 files changed

+40
-11
lines changed

2 files changed

+40
-11
lines changed

src/test/app/Vault_test.cpp

+29-11
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,13 @@ class Vault_test : public beast::unit_test::suite
4545
Asset asset = issuer["IOU"];
4646
auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
4747

48+
SUBCASE("nothing to delete")
49+
{
50+
tx = vault.del({.owner = issuer, .id = keylet.key});
51+
env(tx, ter(tecOBJECT_NOT_FOUND));
52+
env.close();
53+
}
54+
4855
SUBCASE("create")
4956
{
5057
env(tx);
@@ -117,12 +124,20 @@ class Vault_test : public beast::unit_test::suite
117124
env(tx, ter(temMALFORMED));
118125
env.close();
119126
}
127+
128+
SUBCASE("metadata too large")
129+
{
130+
// This metadata is for the share token.
131+
tx[sfMPTokenMetadata] = blob1025;
132+
env(tx, ter(temMALFORMED));
133+
env.close();
134+
}
120135
}
121136

122137
SUBCASE("MPT")
123138
{
124139
MPTTester mptt{env, issuer, {.fund = false}};
125-
mptt.create();
140+
mptt.create({.flags = tfMPTCanTransfer | tfMPTCanLock});
126141
Asset asset = mptt.issuanceID();
127142
auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
128143

@@ -132,15 +147,23 @@ class Vault_test : public beast::unit_test::suite
132147
env.close();
133148
}
134149

135-
SUBCASE("metadata too large")
150+
SUBCASE("global lock")
136151
{
137-
tx[sfMPTokenMetadata] = blob1025;
138-
env(tx, ter(temMALFORMED));
139-
env.close();
152+
mptt.set({.account = issuer, .flags = tfMPTLock});
153+
env(tx, ter(tecLOCKED));
140154
}
155+
156+
}
157+
158+
SUBCASE("MPT cannot transfer")
159+
{
160+
MPTTester mptt{env, issuer, {.fund = false}};
161+
mptt.create();
162+
Asset asset = mptt.issuanceID();
163+
auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
164+
env(tx, ter(tecLOCKED));
141165
}
142166

143-
// (update) => sfVaultID
144167
// TODO: VaultSet (update) succeed
145168
// TODO: VaultSet (update) fail: wrong owner
146169
// TODO: VaultSet (update) fail: Data too large
@@ -149,13 +172,8 @@ class Vault_test : public beast::unit_test::suite
149172
// TODO: VaultSet (update) fail: tfPrivate flag
150173
// TODO: VaultSet (update) fail: tfShareNonTransferable flag
151174
// TODO: Payment to VaultSet.PA fail
152-
// TODO: VaultDelete succeed
153-
// TODO: VaultDelete fail: missing vault
154175
// TODO: VaultSet (update) fail: missing vault
155176

156-
// TODO: VaultSet (create) fail: Asset is MPT but !CanTransfer
157-
// TODO: VaultSet (create) fail: Asset is MPT but Locked
158-
159177
BEAST_EXPECT(true);
160178
}
161179

src/xrpld/app/tx/detail/VaultCreate.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,17 @@ VaultCreate::calculateBaseFee(ReadView const& view, STTx const& tx)
6565
TER
6666
VaultCreate::preclaim(PreclaimContext const& ctx)
6767
{
68+
auto asset = ctx.tx[sfAsset];
69+
if (asset.holds<MPTIssue>())
70+
{
71+
auto mptID = asset.get<MPTIssue>().getMptID();
72+
auto issuance = ctx.view.read(keylet::mptIssuance(mptID));
73+
if (issuance->getFlags() & lsfMPTLocked)
74+
return tecLOCKED;
75+
if ((issuance->getFlags() & lsfMPTCanTransfer) == 0)
76+
return tecLOCKED;
77+
}
78+
6879
return tesSUCCESS;
6980
}
7081

0 commit comments

Comments
 (0)