Skip to content

Commit

Permalink
fix: cherry-pick: TokenUpdateNftsHandler throwing HandleException in …
Browse files Browse the repository at this point in the history
…preHandle (#14606)

Signed-off-by: Derek Riley <derek.riley@swirldslabs.com>
  • Loading branch information
derektriley committed Aug 5, 2024
1 parent 980341c commit fa3ccf4
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
import static com.hedera.hapi.node.base.ResponseCodeEnum.MISSING_SERIAL_NUMBERS;
import static com.hedera.hapi.node.base.ResponseCodeEnum.TOKEN_HAS_NO_METADATA_KEY;
import static com.hedera.hapi.node.base.ResponseCodeEnum.TOKEN_HAS_NO_METADATA_OR_SUPPLY_KEY;
import static com.hedera.node.app.service.token.impl.util.TokenHandlerHelper.getIfUsable;
import static com.hedera.node.app.spi.workflows.HandleException.validateTrue;
import static com.hedera.node.app.spi.workflows.PreCheckException.validateTruePreCheck;
import static java.util.Objects.requireNonNull;
Expand Down Expand Up @@ -85,7 +84,8 @@ public void preHandle(@NonNull final PreHandleContext context) throws PreCheckEx
final var txn = context.body();
final var op = txn.tokenUpdateNftsOrThrow();
final var tokenStore = context.createStore(ReadableTokenStore.class);
final var token = getIfUsable(op.tokenOrElse(TokenID.DEFAULT), tokenStore);
final var token = tokenStore.get(op.tokenOrElse(TokenID.DEFAULT));
validateTruePreCheck(token != null, INVALID_TOKEN_ID);

final var nftStore = context.createStore(ReadableNftStore.class);
if (serialNumbersInTreasury(
Expand Down Expand Up @@ -173,20 +173,26 @@ private void validateSemantics(
* @param nftStore the nft store
* @param tokenId the token id
* @return true if all serial numbers are owned by the treasury account
* @throws PreCheckException if the Nft does not exist
*/
private boolean serialNumbersInTreasury(
@NonNull final AccountID treasuryAccount,
@NonNull final List<Long> serialNumbers,
@NonNull final ReadableNftStore nftStore,
@NonNull final TokenID tokenId) {
return serialNumbers.stream()
.map(serialNumber -> getIfUsable(
NftID.newBuilder()
.tokenId(tokenId)
.serialNumber(serialNumber)
.build(),
nftStore))
.allMatch(nft ->
nft != null && (nft.ownerId() == null || Objects.equals(nft.ownerId(), treasuryAccount)));
@NonNull final TokenID tokenId)
throws PreCheckException {
boolean serialNumbersInTreasury = true;
for (final Long serialNumber : serialNumbers) {
final Nft nft = nftStore.get(NftID.newBuilder()
.tokenId(tokenId)
.serialNumber(serialNumber)
.build());
validateTruePreCheck(nft != null, INVALID_NFT_ID);
if (nft.ownerId() != null && !Objects.equals(nft.ownerId(), treasuryAccount)) {
serialNumbersInTreasury = false;
break;
}
}
return serialNumbersInTreasury;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,7 @@ void preHandle_WhenTokenIsNull() {
when(readableTokenStore.get(TokenID.DEFAULT)).thenReturn(null);

Assertions.assertThatThrownBy(() -> subject.preHandle(preHandleContext))
.isInstanceOf(HandleException.class)
.isInstanceOf(PreCheckException.class)
.has(responseCode(INVALID_TOKEN_ID));
}

Expand All @@ -282,8 +282,6 @@ void preHandle_WhenTokenHasMetadataKeySerialsOutsideTreasury() throws PreCheckEx
when(readableNftStore.get(nftIdSl1)).thenReturn(nft);
when(token.tokenIdOrThrow()).thenReturn(nonFungibleTokenId);
when(nft.ownerId()).thenReturn(AccountID.newBuilder().accountNum(1).build());
when(nft.nftId()).thenReturn(nftId);
when(nftId.tokenId()).thenReturn(nonFungibleTokenId);
when(token.hasMetadataKey()).thenReturn(true);

assertThatCode(() -> subject.preHandle(preHandleContext)).doesNotThrowAnyException();
Expand All @@ -302,8 +300,6 @@ void preHandle_WhenTokenHasNoMetadataKeySerialsOutsideTreasury() {
when(readableNftStore.get(nftIdSl1)).thenReturn(nft);
when(token.tokenIdOrThrow()).thenReturn(nonFungibleTokenId);
when(nft.ownerId()).thenReturn(AccountID.newBuilder().accountNum(1).build());
when(nft.nftId()).thenReturn(nftId);
when(nftId.tokenId()).thenReturn(nonFungibleTokenId);
when(token.hasMetadataKey()).thenReturn(false);

Assertions.assertThatThrownBy(() -> subject.preHandle(preHandleContext))
Expand Down

0 comments on commit fa3ccf4

Please sign in to comment.