invalidated name buys and sales that violate primary names

This commit is contained in:
kennycud 2025-05-27 08:15:50 -07:00
parent 61c010754e
commit 02e10e9de9
3 changed files with 76 additions and 0 deletions

View File

@ -49,6 +49,15 @@ public class BuyNameTransaction extends Transaction {
@Override
public ValidationResult isValid() throws DataException {
Optional<String> buyerPrimaryName = this.getBuyer().getPrimaryName();
if( buyerPrimaryName.isPresent() ) {
NameData nameData = repository.getNameRepository().fromName(buyerPrimaryName.get());
if (nameData.isForSale()) {
return ValidationResult.NOT_SUPPORTED;
}
}
String name = this.buyNameTransactionData.getName();
// Check seller address is valid

View File

@ -45,6 +45,12 @@ public class SellNameTransaction extends Transaction {
public ValidationResult isValid() throws DataException {
String name = this.sellNameTransactionData.getName();
// if the account has more than one name, then they cannot sell their primary name
if( this.repository.getNameRepository().getNamesByOwner(this.getOwner().getAddress()).size() > 1 &&
this.getOwner().getPrimaryName().get().equals(name) ) {
return ValidationResult.NOT_SUPPORTED;
}
// Check name size bounds
int nameLength = Utf8.encodedLength(name);
if (nameLength < 1 || nameLength > Name.MAX_NAME_SIZE)

View File

@ -133,6 +133,11 @@ public class BuySellTests extends Common {
// check that the order is correct
assertEquals(name1, namesByOwner.get(0).getName());
SellNameTransactionData sellPrimaryNameData = new SellNameTransactionData(TestTransaction.generateBase(alice), name, price);
Transaction.ValidationResult sellPrimaryNameResult = TransactionUtils.signAndImport(repository, sellPrimaryNameData, alice);
// check that selling primary name is not supported while owning multiple addresses
assertTrue(Transaction.ValidationResult.NOT_SUPPORTED.equals(sellPrimaryNameResult));
}
@Test
@ -438,4 +443,60 @@ public class BuySellTests extends Common {
assertEquals(bob.getPrimaryName(), bob.determinePrimaryName(TransactionsResource.ConfirmationStatus.CONFIRMED));
}
@Test
public void testBuyInvalidationDuringPrimaryNameSale() throws DataException {
// mint passed the feature trigger block
BlockUtils.mintBlocks(repository, BlockChain.getInstance().getMultipleNamesPerAccountHeight());
// Register-name
testRegisterName();
// assert primary name for alice
Optional<String> alicePrimaryName1 = alice.getPrimaryName();
assertTrue(alicePrimaryName1.isPresent());
assertTrue(alicePrimaryName1.get().equals(name));
// Sell-name
SellNameTransactionData transactionData = new SellNameTransactionData(TestTransaction.generateBase(alice), name, price);
TransactionUtils.signAndMint(repository, transactionData, alice);
// assert primary name for alice
Optional<String> alicePrimaryName2 = alice.getPrimaryName();
assertTrue(alicePrimaryName2.isPresent());
assertTrue(alicePrimaryName2.get().equals(name));
NameData nameData;
// Check name is for sale
nameData = repository.getNameRepository().fromName(name);
assertTrue(nameData.isForSale());
assertEquals("price incorrect", price, nameData.getSalePrice());
// assert alice cannot register another name while primary name is for sale
final String name2 = "another name";
RegisterNameTransactionData registerSecondNameData = new RegisterNameTransactionData(TestTransaction.generateBase(alice), name2, "{}");
Transaction.ValidationResult registrationResult = TransactionUtils.signAndImport(repository, registerSecondNameData, alice);
// check that registering is not supported while primary name is for sale
assertTrue(Transaction.ValidationResult.NOT_SUPPORTED.equals(registrationResult));
String bobName = "bob";
RegisterNameTransactionData bobRegisterData = new RegisterNameTransactionData(TestTransaction.generateBase(bob), bobName, "{}");
transactionData.setFee(new RegisterNameTransaction(null, null).getUnitFee(bobRegisterData.getTimestamp()));
TransactionUtils.signAndMint(repository, bobRegisterData, bob);
Optional<String> bobPrimaryName = bob.getPrimaryName();
assertTrue(bobPrimaryName.isPresent());
assertEquals(bobName, bobPrimaryName.get());
SellNameTransactionData bobSellData = new SellNameTransactionData(TestTransaction.generateBase(bob), bobName, price);
TransactionUtils.signAndMint(repository, bobSellData, bob);
BuyNameTransactionData aliceBuyData = new BuyNameTransactionData(TestTransaction.generateBase(alice), bobName, price, bob.getAddress());
Transaction.ValidationResult aliceBuyResult = TransactionUtils.signAndImport(repository, aliceBuyData, alice);
// check that buying is not supported while primary name is for sale
assertTrue(Transaction.ValidationResult.NOT_SUPPORTED.equals(aliceBuyResult));
}
}