The difference I know so far is that restorePurchases can be called multiple times but only through user action while syncPurchases should be called programmatically only once every app version.
Is there any other differences or they are fundamentally different in what they do?
You are correct, both have the same functionality of syncing app store receipts with our SDK, but have different use cases.
The use case of restorePurchases is for users to use when they need to get access to their purchases if they delete the app. See here for more details on the usage of this:
The use case of syncPurchases would be to trigger a sync once per subscriber programmatically the first time they open a version of your app containing RevenueCat. You should not call this programmatically on every app launch for every user as this can increase latency in your app and can unintentionally alias users together.