Skip to content

Commit

Permalink
Merge remote-tracking branch 'greg/feature/mpt-v1' into fix-exceed-ma…
Browse files Browse the repository at this point in the history
…x-amt
  • Loading branch information
shawnxie999 committed Sep 9, 2024
2 parents fc74112 + 8fd18a5 commit 2a3e887
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 0 deletions.
1 change: 1 addition & 0 deletions include/xrpl/protocol/TER.h
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,7 @@ enum TECcodes : TERUnderlyingType {
tecMPT_MAX_AMOUNT_EXCEEDED = 193,
tecMPT_LOCKED = 194,
tecMPT_NOT_SUPPORTED = 195,
tecMPT_ISSUANCE_NOT_FOUND = 196
};

//------------------------------------------------------------------------------
Expand Down
1 change: 1 addition & 0 deletions src/libxrpl/protocol/TER.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ transResults()
MAKE_ERROR(tecMPTOKEN_EXISTS, "The account already owns the MPToken object."),
MAKE_ERROR(tecMPT_MAX_AMOUNT_EXCEEDED, "The MPT's maximum amount is exceeded."),
MAKE_ERROR(tecMPT_LOCKED, "MPT is locked by the issuer."),
MAKE_ERROR(tecMPT_ISSUANCE_NOT_FOUND, "The MPTokenIssuance object is not found"),

MAKE_ERROR(tefALREADY, "The exact transaction was already in this ledger."),
MAKE_ERROR(tefBAD_ADD_AUTH, "Not authorized to add account."),
Expand Down
35 changes: 35 additions & 0 deletions src/test/app/MPToken_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -981,6 +981,41 @@ class MPToken_test : public beast::unit_test::suite
"Field 'build_path' not allowed in this context.");
}

// Issuer fails trying to send fund after issuance was destroyed
{
Env env{*this, features};

MPTTester mptAlice(env, alice, {.holders = {&bob}});

mptAlice.create({.ownerCount = 1, .holderCount = 0});

mptAlice.authorize({.account = &bob});

// alice destroys issuance
mptAlice.destroy({.ownerCount = 0});

// alice tries to send bob fund after issuance is destroy, should
// fail.
mptAlice.pay(alice, bob, 100, tecMPT_ISSUANCE_NOT_FOUND);
}

// Issuer fails trying to send to some who doesn't own MPT for a
// issuance that was destroyed
{
Env env{*this, features};

MPTTester mptAlice(env, alice, {.holders = {&bob}});

mptAlice.create({.ownerCount = 1, .holderCount = 0});

// alice destroys issuance
mptAlice.destroy({.ownerCount = 0});

// alice tries to send bob who doesn't own the MPT after issuance is
// destroyed, it should fail
mptAlice.pay(alice, bob, 100, tecMPT_ISSUANCE_NOT_FOUND);
}

// Issuers issues maximum amount of MPT to a holder, the holder should
// be able to transfer the max amount to someone else
{
Expand Down
4 changes: 4 additions & 0 deletions src/xrpld/ledger/detail/View.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1872,6 +1872,10 @@ rippleCredit(
{
auto const mptID = keylet::mptIssuance(saAmount.issue().getMptID());
auto const issuer = saAmount.getIssuer();

if (!view.exists(mptID))
return tecMPT_ISSUANCE_NOT_FOUND;

if (uSenderID == issuer)
{
if (auto sle = view.peek(mptID))
Expand Down

0 comments on commit 2a3e887

Please sign in to comment.