@@ -584,14 +584,14 @@ contract HtsSystemContract is IHederaTokenService {
584584 if (selector == this .associateToken.selector ) {
585585 require (msg .data .length >= 48 , "associateToken: Not enough calldata " );
586586 address account = address (bytes20 (msg .data [40 :60 ]));
587- bytes32 slot = _isAssociatedSlot (account);
587+ bytes32 slot = _isAssociatedSlot (account, false );
588588 assembly { sstore (slot, true ) }
589589 return abi.encode (HederaResponseCodes.SUCCESS);
590590 }
591591 if (selector == this .dissociateToken.selector ) {
592592 require (msg .data .length >= 48 , "dissociateToken: Not enough calldata " );
593593 address account = address (bytes20 (msg .data [40 :60 ]));
594- bytes32 slot = _isAssociatedSlot (account);
594+ bytes32 slot = _isAssociatedSlot (account, false );
595595 assembly { sstore (slot, false ) }
596596 return abi.encode (HederaResponseCodes.SUCCESS);
597597 }
@@ -797,17 +797,17 @@ contract HtsSystemContract is IHederaTokenService {
797797
798798 function _redirectForHRC719 (bytes4 selector ) private returns (bytes memory ) {
799799 if (selector == IHRC719.associate.selector ) {
800- bytes32 slot = _isAssociatedSlot (msg .sender );
800+ bytes32 slot = _isAssociatedSlot (msg .sender , false );
801801 assembly { sstore (slot, true ) }
802802 return abi.encode (true );
803803 }
804804 if (selector == IHRC719.dissociate.selector ) {
805- bytes32 slot = _isAssociatedSlot (msg .sender );
805+ bytes32 slot = _isAssociatedSlot (msg .sender , false );
806806 assembly { sstore (slot, false ) }
807807 return abi.encode (true );
808808 }
809809 if (selector == IHRC719.isAssociated.selector ) {
810- bytes32 slot = _isAssociatedSlot (msg .sender );
810+ bytes32 slot = _isAssociatedSlot (msg .sender , true );
811811 bool res;
812812 assembly { res := sload (slot) }
813813 return abi.encode (res);
@@ -892,11 +892,11 @@ contract HtsSystemContract is IHederaTokenService {
892892 return bytes32 (abi.encodePacked (selector, pad, spenderId, ownerId));
893893 }
894894
895- function _isAssociatedSlot (address account ) internal virtual returns (bytes32 ) {
895+ function _isAssociatedSlot (address account , bool revertIfNotExists ) internal virtual returns (bytes32 ) {
896896 bytes4 selector = IHRC719.isAssociated.selector ;
897897 uint192 pad = 0x0 ;
898898 (uint32 accountId , bool exists ) = HtsSystemContract (HTS_ADDRESS).getAccountId (account);
899- require (exists);
899+ require (! revertIfNotExists || exists, " _isAssociatedSlot: account does not exist " );
900900 return bytes32 (abi.encodePacked (selector, pad, accountId));
901901 }
902902
0 commit comments