buyoutLien() will cause the vault to fail to processEpoch()
LienToken#buyoutLien() did not reduce vault#liensOpenForEpoch when vault#processEpoch()will check vault#liensOpenForEpoch[currentEpoch] == uint256(0) so processEpoch() will fail\\nwhen create LienToken , vault#liensOpenForEpoch[currentEpoch] will ++ when repay or liquidate , vault#liensOpenForEpoch[currentEpoch] will -- and LienToken#buyoutLien() will transfer from vault to to other receiver,so liensOpenForEpoch need reduce\\n```\\nfunction buyoutLien(ILienToken.LienActionBuyout calldata params) external {\\n   // rest of code.\\n    /**** tranfer but not liensOpenForEpoch-- *****/\\n    _transfer(ownerOf(lienId), address(params.receiver), lienId);\\n  }\\n```\\n
Issue buyoutLien() will cause the vault to fail to processEpoch()\\n```\\n  function buyoutLien(ILienToken.LienActionBuyout calldata params) external {\\n// rest of code.\\n\\n+   //do decreaseEpochLienCount()\\n+   address lienOwner = ownerOf(lienId);\\n+    bool isPublicVault = IPublicVault(lienOwner).supportsInterface(\\n+      type(IPublicVault).interfaceId\\n+    );\\n+    if (isPublicVault && !AUCTION_HOUSE.auctionExists(collateralId)) {      \\n+        IPublicVault(lienOwner).decreaseEpochLienCount(\\n+          IPublicVault(lienOwner).getLienEpoch(lienData[lienId].start + lienData[lienId].duration)\\n+        );\\n+    }    \\n\\n    lienData[lienId].last = block.timestamp.safeCastTo32();\\n    lienData[lienId].start = block.timestamp.safeCastTo32();\\n    lienData[lienId].rate = ld.rate.safeCastTo240();\\n    lienData[lienId].duration = ld.duration.safeCastTo32();\\n    _transfer(ownerOf(lienId), address(params.receiver), lienId);\\n  }\\n```\\n
processEpoch() maybe fail
```\\nfunction buyoutLien(ILienToken.LienActionBuyout calldata params) external {\\n   // rest of code.\\n    /**** tranfer but not liensOpenForEpoch-- *****/\\n    _transfer(ownerOf(lienId), address(params.receiver), lienId);\\n  }\\n```\\n