diff --git a/.gitignore b/.gitignore index a7619995e..84a7ecdcd 100644 --- a/.gitignore +++ b/.gitignore @@ -141,9 +141,28 @@ lib/wownero/wownero.dart lib/zano/zano.dart lib/decred/decred.dart -ios/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_180.png -ios/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_120.png -ios/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png +ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x.png +ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x~ipad.png +ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@3x.png +ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x.png +ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x~ipad.png +ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@3x.png +ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20~ipad.png +ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29.png +ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x.png +ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x~ipad.png +ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@3x.png +ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29~ipad.png +ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x.png +ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x~ipad.png +ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@3x.png +ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40~ipad.png +ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x~car.png +ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@3x~car.png +ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5@2x~ipad.png +ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon~ios-marketing.png +ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon~ipad.png + ios/Runner/Info.plist android/app/src/main/res/mipmap-* android/app/src/main/res/drawable/ic_launcher.png diff --git a/README.md b/README.md index ea8f34624..ea796dbf2 100644 --- a/README.md +++ b/README.md @@ -26,10 +26,13 @@ Cake Wallet includes support for several cryptocurrencies, including: * Ethereum (ETH) * Litecoin (LTC) * Bitcoin Cash (BCH) -* Polygon (Pol) +* Polygon (POL) * Solana (SOL) +* Tron (TRX) * Nano (XNO) -* Haven (XHV) +* Zano (ZANO) +* Decred (DCR) +* Wownero (WOW) ## Features @@ -81,10 +84,6 @@ Cake Wallet includes support for several cryptocurrencies, including: * Automatically generate new addresses * Specify multiple recipients for batch sending -### Haven Specific Features - -* Send, receive, and store XHV and all xAssets like xUSD, xEUR, xAG, etc. - # Monero.com by Cake Wallet for Android and iOS ## Open Source Monero-Only Wallet diff --git a/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-20@2x.png b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-20@2x.png new file mode 100644 index 000000000..3fd15f3ce Binary files /dev/null and b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-20@2x.png differ diff --git a/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-20@2x~ipad.png b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-20@2x~ipad.png new file mode 100644 index 000000000..3fd15f3ce Binary files /dev/null and b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-20@2x~ipad.png differ diff --git a/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-20@3x.png b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-20@3x.png new file mode 100644 index 000000000..b6ff994f6 Binary files /dev/null and b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-20@3x.png differ diff --git a/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-20~ipad.png b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-20~ipad.png new file mode 100644 index 000000000..4be1a2317 Binary files /dev/null and b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-20~ipad.png differ diff --git a/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-29.png b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-29.png new file mode 100644 index 000000000..219f2c6be Binary files /dev/null and b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-29.png differ diff --git a/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-29@2x.png b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-29@2x.png new file mode 100644 index 000000000..ae94bb0ac Binary files /dev/null and b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-29@2x.png differ diff --git a/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-29@2x~ipad.png b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-29@2x~ipad.png new file mode 100644 index 000000000..ae94bb0ac Binary files /dev/null and b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-29@2x~ipad.png differ diff --git a/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-29@3x.png b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-29@3x.png new file mode 100644 index 000000000..0ef9d3bbf Binary files /dev/null and b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-29@3x.png differ diff --git a/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-29~ipad.png b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-29~ipad.png new file mode 100644 index 000000000..219f2c6be Binary files /dev/null and b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-29~ipad.png differ diff --git a/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-40@2x.png b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-40@2x.png new file mode 100644 index 000000000..9fdb32376 Binary files /dev/null and b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-40@2x.png differ diff --git a/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-40@2x~ipad.png b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-40@2x~ipad.png new file mode 100644 index 000000000..9fdb32376 Binary files /dev/null and b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-40@2x~ipad.png differ diff --git a/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-40@3x.png b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-40@3x.png new file mode 100644 index 000000000..485f8b37b Binary files /dev/null and b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-40@3x.png differ diff --git a/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-40~ipad.png b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-40~ipad.png new file mode 100644 index 000000000..3fd15f3ce Binary files /dev/null and b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-40~ipad.png differ diff --git a/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-60@2x~car.png b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-60@2x~car.png new file mode 100644 index 000000000..485f8b37b Binary files /dev/null and b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-60@2x~car.png differ diff --git a/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-60@3x~car.png b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-60@3x~car.png new file mode 100644 index 000000000..50148e6dc Binary files /dev/null and b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-60@3x~car.png differ diff --git a/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-83.5@2x~ipad.png b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-83.5@2x~ipad.png new file mode 100644 index 000000000..8f290ada2 Binary files /dev/null and b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon-83.5@2x~ipad.png differ diff --git a/assets/images/ios_icons/cakewallet_ios_icons/AppIcon@2x.png b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon@2x.png new file mode 100644 index 000000000..485f8b37b Binary files /dev/null and b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon@2x.png differ diff --git a/assets/images/ios_icons/cakewallet_ios_icons/AppIcon@2x~ipad.png b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon@2x~ipad.png new file mode 100644 index 000000000..b11d7332f Binary files /dev/null and b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon@2x~ipad.png differ diff --git a/assets/images/ios_icons/cakewallet_ios_icons/AppIcon@3x.png b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon@3x.png new file mode 100644 index 000000000..50148e6dc Binary files /dev/null and b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon@3x.png differ diff --git a/assets/images/ios_icons/cakewallet_ios_icons/AppIcon~ios-marketing.png b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon~ios-marketing.png new file mode 100644 index 000000000..1fce95553 Binary files /dev/null and b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon~ios-marketing.png differ diff --git a/assets/images/ios_icons/cakewallet_ios_icons/AppIcon~ipad.png b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon~ipad.png new file mode 100644 index 000000000..7d4a82186 Binary files /dev/null and b/assets/images/ios_icons/cakewallet_ios_icons/AppIcon~ipad.png differ diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon-20@2x.png b/assets/images/ios_icons/monero_ios_icons/AppIcon-20@2x.png new file mode 100644 index 000000000..7ea540caf Binary files /dev/null and b/assets/images/ios_icons/monero_ios_icons/AppIcon-20@2x.png differ diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon-20@2x~ipad.png b/assets/images/ios_icons/monero_ios_icons/AppIcon-20@2x~ipad.png new file mode 100644 index 000000000..7ea540caf Binary files /dev/null and b/assets/images/ios_icons/monero_ios_icons/AppIcon-20@2x~ipad.png differ diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon-20@3x.png b/assets/images/ios_icons/monero_ios_icons/AppIcon-20@3x.png new file mode 100644 index 000000000..6ac773754 Binary files /dev/null and b/assets/images/ios_icons/monero_ios_icons/AppIcon-20@3x.png differ diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon-20~ipad.png b/assets/images/ios_icons/monero_ios_icons/AppIcon-20~ipad.png new file mode 100644 index 000000000..57864a9b3 Binary files /dev/null and b/assets/images/ios_icons/monero_ios_icons/AppIcon-20~ipad.png differ diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon-29.png b/assets/images/ios_icons/monero_ios_icons/AppIcon-29.png new file mode 100644 index 000000000..27f817dfc Binary files /dev/null and b/assets/images/ios_icons/monero_ios_icons/AppIcon-29.png differ diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon-29@2x.png b/assets/images/ios_icons/monero_ios_icons/AppIcon-29@2x.png new file mode 100644 index 000000000..0455b4409 Binary files /dev/null and b/assets/images/ios_icons/monero_ios_icons/AppIcon-29@2x.png differ diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon-29@2x~ipad.png b/assets/images/ios_icons/monero_ios_icons/AppIcon-29@2x~ipad.png new file mode 100644 index 000000000..0455b4409 Binary files /dev/null and b/assets/images/ios_icons/monero_ios_icons/AppIcon-29@2x~ipad.png differ diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon-29@3x.png b/assets/images/ios_icons/monero_ios_icons/AppIcon-29@3x.png new file mode 100644 index 000000000..1b8a73481 Binary files /dev/null and b/assets/images/ios_icons/monero_ios_icons/AppIcon-29@3x.png differ diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon-29~ipad.png b/assets/images/ios_icons/monero_ios_icons/AppIcon-29~ipad.png new file mode 100644 index 000000000..27f817dfc Binary files /dev/null and b/assets/images/ios_icons/monero_ios_icons/AppIcon-29~ipad.png differ diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon-40@2x.png b/assets/images/ios_icons/monero_ios_icons/AppIcon-40@2x.png new file mode 100644 index 000000000..963612d0c Binary files /dev/null and b/assets/images/ios_icons/monero_ios_icons/AppIcon-40@2x.png differ diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon-40@2x~ipad.png b/assets/images/ios_icons/monero_ios_icons/AppIcon-40@2x~ipad.png new file mode 100644 index 000000000..963612d0c Binary files /dev/null and b/assets/images/ios_icons/monero_ios_icons/AppIcon-40@2x~ipad.png differ diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon-40@3x.png b/assets/images/ios_icons/monero_ios_icons/AppIcon-40@3x.png new file mode 100644 index 000000000..b6da404cb Binary files /dev/null and b/assets/images/ios_icons/monero_ios_icons/AppIcon-40@3x.png differ diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon-40~ipad.png b/assets/images/ios_icons/monero_ios_icons/AppIcon-40~ipad.png new file mode 100644 index 000000000..7ea540caf Binary files /dev/null and b/assets/images/ios_icons/monero_ios_icons/AppIcon-40~ipad.png differ diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon-60@2x~car.png b/assets/images/ios_icons/monero_ios_icons/AppIcon-60@2x~car.png new file mode 100644 index 000000000..b6da404cb Binary files /dev/null and b/assets/images/ios_icons/monero_ios_icons/AppIcon-60@2x~car.png differ diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon-60@3x~car.png b/assets/images/ios_icons/monero_ios_icons/AppIcon-60@3x~car.png new file mode 100644 index 000000000..37f7651a5 Binary files /dev/null and b/assets/images/ios_icons/monero_ios_icons/AppIcon-60@3x~car.png differ diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon-83.5@2x~ipad.png b/assets/images/ios_icons/monero_ios_icons/AppIcon-83.5@2x~ipad.png new file mode 100644 index 000000000..21aa12463 Binary files /dev/null and b/assets/images/ios_icons/monero_ios_icons/AppIcon-83.5@2x~ipad.png differ diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon@2x.png b/assets/images/ios_icons/monero_ios_icons/AppIcon@2x.png new file mode 100644 index 000000000..b6da404cb Binary files /dev/null and b/assets/images/ios_icons/monero_ios_icons/AppIcon@2x.png differ diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon@2x~ipad.png b/assets/images/ios_icons/monero_ios_icons/AppIcon@2x~ipad.png new file mode 100644 index 000000000..b6b63a61e Binary files /dev/null and b/assets/images/ios_icons/monero_ios_icons/AppIcon@2x~ipad.png differ diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon@3x.png b/assets/images/ios_icons/monero_ios_icons/AppIcon@3x.png new file mode 100644 index 000000000..37f7651a5 Binary files /dev/null and b/assets/images/ios_icons/monero_ios_icons/AppIcon@3x.png differ diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon~ios-marketing.png b/assets/images/ios_icons/monero_ios_icons/AppIcon~ios-marketing.png new file mode 100644 index 000000000..0c977110a Binary files /dev/null and b/assets/images/ios_icons/monero_ios_icons/AppIcon~ios-marketing.png differ diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon~ipad.png b/assets/images/ios_icons/monero_ios_icons/AppIcon~ipad.png new file mode 100644 index 000000000..849c5612a Binary files /dev/null and b/assets/images/ios_icons/monero_ios_icons/AppIcon~ipad.png differ diff --git a/cw_core/lib/erc20_token.dart b/cw_core/lib/erc20_token.dart index e47488143..fd76d28fc 100644 --- a/cw_core/lib/erc20_token.dart +++ b/cw_core/lib/erc20_token.dart @@ -17,11 +17,11 @@ class Erc20Token extends CryptoCurrency with HiveObjectMixin { @HiveField(4, defaultValue: true) bool _enabled; @HiveField(5) - final String? iconPath; + String? iconPath; @HiveField(6) final String? tag; @HiveField(7, defaultValue: false) - final bool isPotentialScam; + bool isPotentialScam; bool get enabled => _enabled; diff --git a/cw_core/lib/wallet_type.dart b/cw_core/lib/wallet_type.dart index 5ae1c1290..fed998ed0 100644 --- a/cw_core/lib/wallet_type.dart +++ b/cw_core/lib/wallet_type.dart @@ -193,7 +193,7 @@ String walletTypeToDisplayName(WalletType type) { case WalletType.banano: return 'Banano (BAN)'; case WalletType.polygon: - return 'Polygon (MATIC)'; + return 'Polygon (POL)'; case WalletType.solana: return 'Solana (SOL)'; case WalletType.tron: diff --git a/cw_ethereum/lib/ethereum_wallet.dart b/cw_ethereum/lib/ethereum_wallet.dart index ae6158557..7cc140c5a 100644 --- a/cw_ethereum/lib/ethereum_wallet.dart +++ b/cw_ethereum/lib/ethereum_wallet.dart @@ -76,9 +76,13 @@ class EthereumWallet extends EVMChainWallet { await erc20TokensBox.deleteFromDisk(); // Add all the previous tokens with configs to the new box - evmChainErc20TokensBox.addAll(allValues); + await evmChainErc20TokensBox.addAll(allValues); } + @override + List get getDefaultTokenContractAddresses => + DefaultEthereumErc20Tokens().initialErc20Tokens.map((e) => e.contractAddress).toList(); + @override EVMChainTransactionInfo getTransactionInfo( EVMChainTransactionModel transactionModel, String address) { diff --git a/cw_evm/lib/evm_chain_wallet.dart b/cw_evm/lib/evm_chain_wallet.dart index 77331758c..d640f8c14 100644 --- a/cw_evm/lib/evm_chain_wallet.dart +++ b/cw_evm/lib/evm_chain_wallet.dart @@ -144,6 +144,8 @@ abstract class EVMChainWalletBase // required WalletInfo walletInfo, // }); + List get getDefaultTokenContractAddresses; + Future initErc20TokensBox(); String getTransactionHistoryFileName(); @@ -171,6 +173,9 @@ abstract class EVMChainWalletBase await walletAddresses.init(); await transactionHistory.init(); + // check for Already existing scam tokens, cuz users can get scammed twice ¯\_(ツ)_/¯ + await _checkForExistingScamTokens(); + if (walletInfo.isHardwareWallet) { _evmChainPrivateKey = EvmLedgerCredentials(walletInfo.address); walletAddresses.address = walletInfo.address; @@ -186,6 +191,31 @@ abstract class EVMChainWalletBase await save(); } + Future _checkForExistingScamTokens() async { + final baseCurrencySymbols = CryptoCurrency.all.map((e) => e.title.toUpperCase()).toList(); + + for (var token in erc20Currencies) { + bool isPotentialScam = false; + + bool isWhitelisted = + getDefaultTokenContractAddresses.any((element) => element == token.contractAddress); + + final tokenSymbol = token.title.toUpperCase(); + + // check if the token symbol is the same as any of the base currencies symbols (ETH, SOL, POL, TRX, etc): + // if it is, then it's probably a scam unless it's in the whitelist + if (baseCurrencySymbols.contains(tokenSymbol.trim().toUpperCase()) && !isWhitelisted) { + isPotentialScam = true; + } + + if (isPotentialScam) { + token.isPotentialScam = true; + token.iconPath = null; + await token.save(); + } + } + } + @override int calculateEstimatedFee(TransactionPriority priority, int? amount) { { diff --git a/cw_polygon/lib/polygon_wallet.dart b/cw_polygon/lib/polygon_wallet.dart index d2b62ca4d..b2bf064b1 100644 --- a/cw_polygon/lib/polygon_wallet.dart +++ b/cw_polygon/lib/polygon_wallet.dart @@ -49,6 +49,10 @@ class PolygonWallet extends EVMChainWallet { } } + @override + List get getDefaultTokenContractAddresses => + DefaultPolygonErc20Tokens().initialPolygonErc20Tokens.map((e) => e.contractAddress).toList(); + @override Future checkIfScanProviderIsEnabled() async { bool isPolygonScanEnabled = (await sharedPrefs.future).getBool("use_polygonscan") ?? true; diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index df5cf1cc5..bd04914ae 100644 --- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,114 +1,134 @@ { - "images" : [ + "images": [ { - "filename" : "Icon-App-40x40@1x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" + "filename": "AppIcon@2x.png", + "idiom": "iphone", + "scale": "2x", + "size": "60x60" }, { - "filename" : "Icon-App-20x20@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" + "filename": "AppIcon@3x.png", + "idiom": "iphone", + "scale": "3x", + "size": "60x60" }, { - "filename" : "Icon-App-29x29@2x 1.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" + "filename": "AppIcon~ipad.png", + "idiom": "ipad", + "scale": "1x", + "size": "76x76" }, { - "filename" : "Icon-App-29x29@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" + "filename": "AppIcon@2x~ipad.png", + "idiom": "ipad", + "scale": "2x", + "size": "76x76" }, { - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" + "filename": "AppIcon-83.5@2x~ipad.png", + "idiom": "ipad", + "scale": "2x", + "size": "83.5x83.5" }, { - "filename" : "Icon-App-40x40@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" + "filename": "AppIcon-40@2x.png", + "idiom": "iphone", + "scale": "2x", + "size": "40x40" }, { - "filename" : "app_icon_120.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" + "filename": "AppIcon-40@3x.png", + "idiom": "iphone", + "scale": "3x", + "size": "40x40" }, { - "filename" : "app_icon_180.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" + "filename": "AppIcon-40~ipad.png", + "idiom": "ipad", + "scale": "1x", + "size": "40x40" }, { - "filename" : "Icon-App-20x20@1x.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "20x20" + "filename": "AppIcon-40@2x~ipad.png", + "idiom": "ipad", + "scale": "2x", + "size": "40x40" }, { - "filename" : "Icon-App-20x20@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "20x20" + "filename": "AppIcon-20@2x.png", + "idiom": "iphone", + "scale": "2x", + "size": "20x20" }, { - "filename" : "Icon-App-29x29@1x.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "29x29" + "filename": "AppIcon-20@3x.png", + "idiom": "iphone", + "scale": "3x", + "size": "20x20" }, { - "filename" : "Icon-App-29x29@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "29x29" + "filename": "AppIcon-20~ipad.png", + "idiom": "ipad", + "scale": "1x", + "size": "20x20" }, { - "filename" : "Icon-App-40x40@1x 1.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "40x40" + "filename": "AppIcon-20@2x~ipad.png", + "idiom": "ipad", + "scale": "2x", + "size": "20x20" }, { - "idiom" : "ipad", - "scale" : "2x", - "size" : "40x40" + "filename": "AppIcon-29.png", + "idiom": "iphone", + "scale": "1x", + "size": "29x29" }, { - "filename" : "Icon-App-76x76@1x.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "76x76" + "filename": "AppIcon-29@2x.png", + "idiom": "iphone", + "scale": "2x", + "size": "29x29" }, { - "filename" : "Icon-App-76x76@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "76x76" + "filename": "AppIcon-29@3x.png", + "idiom": "iphone", + "scale": "3x", + "size": "29x29" }, { - "filename" : "Icon-App-83.5x83.5@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "83.5x83.5" + "filename": "AppIcon-29~ipad.png", + "idiom": "ipad", + "scale": "1x", + "size": "29x29" }, { - "filename" : "app_icon_1024.png", - "idiom" : "ios-marketing", - "scale" : "1x", - "size" : "1024x1024" + "filename": "AppIcon-29@2x~ipad.png", + "idiom": "ipad", + "scale": "2x", + "size": "29x29" + }, + { + "filename": "AppIcon-60@2x~car.png", + "idiom": "car", + "scale": "2x", + "size": "60x60" + }, + { + "filename": "AppIcon-60@3x~car.png", + "idiom": "car", + "scale": "3x", + "size": "60x60" + }, + { + "filename": "AppIcon~ios-marketing.png", + "idiom": "ios-marketing", + "scale": "1x", + "size": "1024x1024" } ], - "info" : { - "author" : "xcode", - "version" : 1 + "info": { + "author": "iconkitchen", + "version": 1 } -} +} \ No newline at end of file diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100644 index 369d8d9a4..000000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png deleted file mode 100644 index 65ed7f3db..000000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index fb14bfc55..000000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png deleted file mode 100644 index d24d594a3..000000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x 1.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x 1.png deleted file mode 100644 index 07acd0a82..000000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x 1.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index 07acd0a82..000000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png deleted file mode 100644 index bdc20091d..000000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x 1.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x 1.png deleted file mode 100644 index 65ed7f3db..000000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x 1.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png deleted file mode 100644 index 65ed7f3db..000000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index 80e78be41..000000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index e06998b67..000000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png deleted file mode 100644 index 78a2ccfb1..000000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png deleted file mode 100644 index 0ba8d647c..000000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and /dev/null differ diff --git a/lib/entities/provider_types.dart b/lib/entities/provider_types.dart index 63918aa8b..400b5b9d4 100644 --- a/lib/entities/provider_types.dart +++ b/lib/entities/provider_types.dart @@ -6,7 +6,6 @@ import 'package:cake_wallet/buy/moonpay/moonpay_provider.dart'; import 'package:cake_wallet/buy/onramper/onramper_buy_provider.dart'; import 'package:cake_wallet/buy/robinhood/robinhood_buy_provider.dart'; import 'package:cake_wallet/di.dart'; -import 'package:cw_core/wallet_type.dart'; enum ProviderType { robinhood, dfx, onramper, moonpay, meld, kriptonim } @@ -47,7 +46,7 @@ extension ProviderTypeName on ProviderType { } class ProvidersHelper { - static List getAvailableBuyProviderTypes(WalletType walletType) => [ + static List getAvailableBuyProviderTypes() => [ ProviderType.robinhood, ProviderType.dfx, ProviderType.onramper, @@ -55,7 +54,7 @@ class ProvidersHelper { ProviderType.kriptonim ]; - static List getAvailableSellProviderTypes(WalletType walletType) => [ + static List getAvailableSellProviderTypes() => [ ProviderType.robinhood, ProviderType.dfx, ProviderType.onramper, @@ -63,7 +62,7 @@ class ProvidersHelper { ProviderType.kriptonim ]; - static BuyProvider? getProviderByType(ProviderType type) { + static BuyProvider getProviderByType(ProviderType type) { switch (type) { case ProviderType.robinhood: return getIt.get(); @@ -77,8 +76,6 @@ class ProvidersHelper { return getIt.get(); case ProviderType.kriptonim: return getIt.get(); - default: - return null; - } + } } } diff --git a/lib/src/screens/backup/edit_backup_password_page.dart b/lib/src/screens/backup/edit_backup_password_page.dart index 93207c191..1c80f1bb3 100644 --- a/lib/src/screens/backup/edit_backup_password_page.dart +++ b/lib/src/screens/backup/edit_backup_password_page.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; @@ -68,7 +67,9 @@ class EditBackupPasswordPage extends BasePage { actionRightButton: () async { await editBackupPasswordViewModel.save(); Navigator.of(dialogContext).pop(); - Navigator.of(context).pop(); + if (context.mounted) { + Navigator.of(context).pop(); + } }, actionLeftButton: () => Navigator.of(dialogContext).pop()); }); diff --git a/lib/src/screens/dashboard/pages/address_page.dart b/lib/src/screens/dashboard/pages/address_page.dart index 10f9aef43..a9c265e58 100644 --- a/lib/src/screens/dashboard/pages/address_page.dart +++ b/lib/src/screens/dashboard/pages/address_page.dart @@ -185,7 +185,7 @@ class AddressPage extends BasePage { } reaction((_) => receiveOptionViewModel.selectedReceiveOption, (ReceivePageOption option) { - if (bitcoin!.isBitcoinReceivePageOption(option)) { + if (dashboardViewModel.type == WalletType.bitcoin && bitcoin!.isBitcoinReceivePageOption(option)) { addressListViewModel.setAddressType(bitcoin!.getOptionToType(option)); return; } diff --git a/lib/src/screens/dashboard/widgets/action_button.dart b/lib/src/screens/dashboard/widgets/action_button.dart index 786c56658..b26dadb67 100644 --- a/lib/src/screens/dashboard/widgets/action_button.dart +++ b/lib/src/screens/dashboard/widgets/action_button.dart @@ -47,6 +47,8 @@ class ActionButton extends StatelessWidget { SizedBox(height: 4), Text( title, + maxLines: 1, + overflow: TextOverflow.visible, style: TextStyle( fontSize: 9, color: textColor ?? diff --git a/lib/src/screens/send/send_page.dart b/lib/src/screens/send/send_page.dart index 499bdb200..91f94e060 100644 --- a/lib/src/screens/send/send_page.dart +++ b/lib/src/screens/send/send_page.dart @@ -98,7 +98,7 @@ class SendPage extends BasePage { return MergeSemantics( child: SizedBox( height: isMobileView ? 37 : 45, - width: isMobileView ? 47: 45, + width: isMobileView ? 47 : 45, child: ButtonTheme( minWidth: double.minPositive, child: Semantics( @@ -397,7 +397,6 @@ class SendPage extends BasePage { return LoadingPrimaryButton( key: ValueKey('send_page_send_button_key'), onPressed: () async { - //Request dummy node to get the focus out of the text fields FocusScope.of(context).requestFocus(FocusNode()); @@ -507,7 +506,6 @@ class SendPage extends BasePage { Navigator.of(loadingBottomSheetContext!).pop(); } - if (state is FailureState) { WidgetsBinding.instance.addPostFrameCallback((_) { showPopUp( @@ -525,7 +523,6 @@ class SendPage extends BasePage { } if (state is IsExecutingState) { - // wait a bit to avoid showing the loading dialog if transaction is failed await Future.delayed(const Duration(milliseconds: 300)); final currentState = sendViewModel.state; @@ -584,8 +581,6 @@ class SendPage extends BasePage { }); } - - if (state is TransactionCommitted) { WidgetsBinding.instance.addPostFrameCallback((_) async { if (!context.mounted) { @@ -594,7 +589,8 @@ class SendPage extends BasePage { newContactAddress = newContactAddress ?? sendViewModel.newContactAddress(); - if (newContactAddress?.address != null && isRegularElectrumAddress(newContactAddress!.address)) { + if (newContactAddress?.address != null && + isRegularElectrumAddress(newContactAddress!.address)) { newContactAddress = null; } @@ -606,47 +602,53 @@ class SendPage extends BasePage { builder: (BuildContext bottomSheetContext) { return showContactSheet ? InfoBottomSheet( - currentTheme: currentTheme, - showDontAskMeCheckbox: true, - onCheckboxChanged: (value) => sendViewModel.setShowAddressBookPopup(!value), - titleText: S.of(bottomSheetContext).transaction_sent, - contentImage: 'assets/images/contact_icon.svg', - contentImageColor: Theme.of(context) - .extension()! - .titleColor, - content: S.of(bottomSheetContext).add_contact_to_address_book, - isTwoAction: true, - leftButtonText: 'No', - rightButtonText: 'Yes', - actionLeftButton: () { - Navigator.of(bottomSheetContext).pop(); - Navigator.of(context) - .pushNamedAndRemoveUntil(Routes.dashboard, (route) => false); - RequestReviewHandler.requestReview(); - newContactAddress = null; - }, - actionRightButton: () { - Navigator.of(bottomSheetContext).pop(); - RequestReviewHandler.requestReview(); - Navigator.of(context) - .pushNamed(Routes.addressBookAddContact, arguments: newContactAddress); - newContactAddress = null; - }, - ) + currentTheme: currentTheme, + showDontAskMeCheckbox: true, + onCheckboxChanged: (value) => sendViewModel.setShowAddressBookPopup(!value), + titleText: S.of(bottomSheetContext).transaction_sent, + contentImage: 'assets/images/contact_icon.svg', + contentImageColor: Theme.of(context).extension()!.titleColor, + content: S.of(bottomSheetContext).add_contact_to_address_book, + isTwoAction: true, + leftButtonText: 'No', + rightButtonText: 'Yes', + actionLeftButton: () { + Navigator.of(bottomSheetContext).pop(); + if (context.mounted) { + Navigator.of(context) + .pushNamedAndRemoveUntil(Routes.dashboard, (route) => false); + } + RequestReviewHandler.requestReview(); + newContactAddress = null; + }, + actionRightButton: () { + Navigator.of(bottomSheetContext).pop(); + RequestReviewHandler.requestReview(); + if (context.mounted) { + Navigator.of(context).pushNamed(Routes.addressBookAddContact, + arguments: newContactAddress); + } + newContactAddress = null; + }, + ) : InfoBottomSheet( - currentTheme: currentTheme, - titleText: S.of(bottomSheetContext).transaction_sent, - contentImage: 'assets/images/birthday_cake.svg', - actionButtonText: S.of(bottomSheetContext).close, - actionButtonKey: ValueKey('send_page_sent_dialog_ok_button_key'), - actionButton: () { - Navigator.of(bottomSheetContext).pop(); - Navigator.of(context) - .pushNamedAndRemoveUntil(Routes.dashboard, (route) => false); - RequestReviewHandler.requestReview(); - newContactAddress = null; - }, - ); + currentTheme: currentTheme, + titleText: S.of(bottomSheetContext).transaction_sent, + contentImage: 'assets/images/birthday_cake.svg', + actionButtonText: S.of(bottomSheetContext).close, + actionButtonKey: ValueKey('send_page_sent_dialog_ok_button_key'), + actionButton: () { + Navigator.of(bottomSheetContext).pop(); + Future.delayed(Duration.zero, () { + if (context.mounted) { + Navigator.of(context) + .pushNamedAndRemoveUntil(Routes.dashboard, (route) => false); + } + RequestReviewHandler.requestReview(); + newContactAddress = null; + }); + }, + ); }, ); @@ -678,8 +680,7 @@ class SendPage extends BasePage { currentTheme: currentTheme, titleText: S.of(bottomSheetContext).proceed_on_device, contentImage: 'assets/images/hardware_wallet/ledger_nano_x.png', - contentImageColor: - Theme.of(context).extension()!.titleColor, + contentImageColor: Theme.of(context).extension()!.titleColor, content: S.of(bottomSheetContext).proceed_on_device_description, isTwoAction: false, actionButtonText: S.of(context).cancel, @@ -778,5 +779,4 @@ class SendPage extends BasePage { return isValid; } - } diff --git a/lib/view_model/buy/buy_sell_view_model.dart b/lib/view_model/buy/buy_sell_view_model.dart index bf05109ad..df4b838f2 100644 --- a/lib/view_model/buy/buy_sell_view_model.dart +++ b/lib/view_model/buy/buy_sell_view_model.dart @@ -15,7 +15,6 @@ import 'package:cake_wallet/store/app_store.dart'; import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/themes/theme_base.dart'; import 'package:cw_core/crypto_currency.dart'; -import 'package:cw_core/currency_for_wallet_type.dart'; import 'package:flutter/cupertino.dart'; import 'package:intl/intl.dart'; import 'package:mobx/mobx.dart'; @@ -61,21 +60,17 @@ abstract class BuySellViewModelBase extends WalletChangeListenerViewModel with S late Timer bestRateSync; List get availableBuyProviders { - final providerTypes = ProvidersHelper.getAvailableBuyProviderTypes( - walletTypeForCurrency(cryptoCurrency) ?? wallet.type); + final providerTypes = ProvidersHelper.getAvailableBuyProviderTypes(); return providerTypes .map((type) => ProvidersHelper.getProviderByType(type)) - .where((provider) => provider != null) .cast() .toList(); } List get availableSellProviders { - final providerTypes = ProvidersHelper.getAvailableSellProviderTypes( - walletTypeForCurrency(cryptoCurrency) ?? wallet.type); + final providerTypes = ProvidersHelper.getAvailableSellProviderTypes(); return providerTypes .map((type) => ProvidersHelper.getProviderByType(type)) - .where((provider) => provider != null) .cast() .toList(); } diff --git a/scripts/ios/app_icon.sh b/scripts/ios/app_icon.sh index e3eb36b3c..dcb168888 100755 --- a/scripts/ios/app_icon.sh +++ b/scripts/ios/app_icon.sh @@ -1,24 +1,101 @@ #!/bin/sh -ICON_120_PATH="" -ICON_180_PATH="" -ICON_1024_PATH="" +ICON_2x_PATH="" +ICON_2x_ipad_PATH="" +ICON_3x_PATH="" +ICON_20_2x_PATH="" +ICON_20_2x_ipad_PATH="" +ICON_20_3x_PATH="" +ICON_20_ipad_PATH="" +ICON_29_PATH="" +ICON_29_2x_PATH="" +ICON_29_2x_ipad_PATH="" +ICON_29_3x_PATH="" +ICON_29_3x_ipad_PATH="" +ICON_29_ipad_PATH="" +ICON_40_2x_PATH="" +ICON_40_2x_ipad_PATH="" +ICON_40_3x_PATH="" +ICON_40_ipad_PATH="" +ICON_60_2x_PATH="" +ICON_60_3x_PATH="" +ICON_83_2x_ipad_PATH="" +ICON_marketing_PATH="" +ICON_ipad_PATH="" + +ICON_DIRECTORY="" + DEST_DIR_PATH=`pwd`/../../ios/Runner/Assets.xcassets/AppIcon.appiconset case $APP_IOS_TYPE in "monero.com") - ICON_120_PATH=`pwd`/../../assets/images/monero.com_icon_120.png - ICON_180_PATH=`pwd`/../../assets/images/monero.com_icon_180.png - ICON_1024_PATH=`pwd`/../../assets/images/monero.com_icon_1024.png;; + ICON_DIRECTORY=monero_ios_icons;; "cakewallet") - ICON_120_PATH=`pwd`/../../assets/images/cakewallet_icon_120.png - ICON_180_PATH=`pwd`/../../assets/images/cakewallet_icon_180.png - ICON_1024_PATH=`pwd`/../../assets/images/cakewallet_icon_1024.png;; + ICON_DIRECTORY=cakewallet_ios_icons;; esac -rm $DEST_DIR_PATH/app_icon_120.png -rm $DEST_DIR_PATH/app_icon_180.png -rm $DEST_DIR_PATH/app_icon_1024.png -ln -s $ICON_120_PATH $DEST_DIR_PATH/app_icon_120.png -ln -s $ICON_180_PATH $DEST_DIR_PATH/app_icon_180.png -ln -s $ICON_1024_PATH $DEST_DIR_PATH/app_icon_1024.png \ No newline at end of file +ICON_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon@2x.png +ICON_2x_ipad_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon@2x~ipad.png +ICON_3x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon@3x.png +ICON_20_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-20@2x.png +ICON_20_2x_ipad_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-20@2x~ipad.png +ICON_20_3x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-20@3x.png +ICON_20_ipad_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-20~ipad.png +ICON_29_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-29.png +ICON_29_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-29@2x.png +ICON_29_2x_ipad_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-29@2x~ipad.png +ICON_29_3x_ipad_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-29@3x.png +ICON_29_ipad_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-29~ipad.png +ICON_40_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-40@2x.png +ICON_40_2x_ipad_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-40@2x~ipad.png +ICON_40_3x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-40@3x.png +ICON_40_ipad_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-40~ipad.png +ICON_60_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-60@2x~car.png +ICON_60_3x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-60@3x~car.png +ICON_83_2x_ipad_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-83.5@2x~ipad.png +ICON_marketing_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon~ios-marketing.png +ICON_ipad_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon~ipad.png + +rm $DEST_DIR_PATH/AppIcon@2x.png +rm $DEST_DIR_PATH/AppIcon@2x~ipad.png +rm $DEST_DIR_PATH/AppIcon@3x.png +rm $DEST_DIR_PATH/AppIcon-20@2x.png +rm $DEST_DIR_PATH/AppIcon-20@2x~ipad.png +rm $DEST_DIR_PATH/AppIcon-20@3x.png +rm $DEST_DIR_PATH/AppIcon-20~ipad.png +rm $DEST_DIR_PATH/AppIcon-29.png +rm $DEST_DIR_PATH/AppIcon-29@2x.png +rm $DEST_DIR_PATH/AppIcon-29@2x~ipad.png +rm $DEST_DIR_PATH/AppIcon-29@3x.png +rm $DEST_DIR_PATH/AppIcon-29~ipad.png +rm $DEST_DIR_PATH/AppIcon-40@2x.png +rm $DEST_DIR_PATH/AppIcon-40@2x~ipad.png +rm $DEST_DIR_PATH/AppIcon-40@3x.png +rm $DEST_DIR_PATH/AppIcon-40~ipad.png +rm $DEST_DIR_PATH/AppIcon-60@2x~car.png +rm $DEST_DIR_PATH/AppIcon-60@3x~car.png +rm $DEST_DIR_PATH/AppIcon-83.5@2x~ipad.png +rm $DEST_DIR_PATH/AppIcon~ios-marketing.png +rm $DEST_DIR_PATH/AppIcon~ipad.png + +ln -s $ICON_2x_PATH $DEST_DIR_PATH/AppIcon@2x.png +ln -s $ICON_2x_ipad_PATH $DEST_DIR_PATH/AppIcon@2x~ipad.png +ln -s $ICON_3x_PATH $DEST_DIR_PATH/AppIcon@3x.png +ln -s $ICON_20_2x_PATH $DEST_DIR_PATH/AppIcon-20@2x.png +ln -s $ICON_20_2x_ipad_PATH $DEST_DIR_PATH/AppIcon-20@2x~ipad.png +ln -s $ICON_20_3x_PATH $DEST_DIR_PATH/AppIcon-20@3x.png +ln -s $ICON_20_ipad_PATH $DEST_DIR_PATH/AppIcon-20~ipad.png +ln -s $ICON_29_PATH $DEST_DIR_PATH/AppIcon-29.png +ln -s $ICON_29_2x_PATH $DEST_DIR_PATH/AppIcon-29@2x.png +ln -s $ICON_29_2x_ipad_PATH $DEST_DIR_PATH/AppIcon-29@2x~ipad.png +ln -s $ICON_29_3x_ipad_PATH $DEST_DIR_PATH/AppIcon-29@3x.png +ln -s $ICON_29_ipad_PATH $DEST_DIR_PATH/AppIcon-29~ipad.png +ln -s $ICON_40_2x_PATH $DEST_DIR_PATH/AppIcon-40@2x.png +ln -s $ICON_40_2x_ipad_PATH $DEST_DIR_PATH/AppIcon-40@2x~ipad.png +ln -s $ICON_40_3x_PATH $DEST_DIR_PATH/AppIcon-40@3x.png +ln -s $ICON_40_ipad_PATH $DEST_DIR_PATH/AppIcon-40~ipad.png +ln -s $ICON_60_2x_PATH $DEST_DIR_PATH/AppIcon-60@2x~car.png +ln -s $ICON_60_3x_PATH $DEST_DIR_PATH/AppIcon-60@3x~car.png +ln -s $ICON_83_2x_ipad_PATH $DEST_DIR_PATH/AppIcon-83.5@2x~ipad.png +ln -s $ICON_marketing_PATH $DEST_DIR_PATH/AppIcon~ios-marketing.png +ln -s $ICON_ipad_PATH $DEST_DIR_PATH/AppIcon~ipad.png