```\nbool isNative = LibAsset.isNativeAsset(assetId);\nif (!isNative) {\n  LibAsset.increaseERC20Allowance(assetId, callTo, amount);\n}\n\n// Check if the callTo is a contract\nbool success;\nbytes memory returnData;\nif (Address.isContract(callTo)) {\n  // Try to execute the callData\n  // the low level call will return `false` if its execution reverts\n  (success, returnData) = callTo.call{value: isNative ? amount : 0}(callData);\n}\n\n// Handle failure cases\nif (!success) {\n  // If it fails, transfer to fallback\n  LibAsset.transferAsset(assetId, fallbackAddress, amount);\n  // Decrease allowance\n  if (!isNative) {\n    LibAsset.decreaseERC20Allowance(assetId, callTo, amount);\n  }\n}\n```\n