mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2025-01-10 12:54:38 +00:00
Merge branch 'v4.10.2_v1.7.2' of https://github.com/cake-tech/cake_wallet into cw_linux_direct_input_password
Conflicts: assets/text/Release_Notes.txt lib/di.dart scripts/android/app_env.sh scripts/ios/app_env.sh scripts/macos/app_env.sh
This commit is contained in:
commit
ff1efbd15c
59 changed files with 736 additions and 383 deletions
|
@ -5,7 +5,8 @@
|
||||||
uri: cakexmrl7bonq7ovjka5kuwuyd3f7qnkz6z6s6dmsy3uckwra7bvggyd.onion:18081
|
uri: cakexmrl7bonq7ovjka5kuwuyd3f7qnkz6z6s6dmsy3uckwra7bvggyd.onion:18081
|
||||||
is_default: false
|
is_default: false
|
||||||
-
|
-
|
||||||
uri: node.sethforprivacy.com:18089
|
uri: node.sethforprivacy.com:443
|
||||||
|
useSSL: true
|
||||||
is_default: false
|
is_default: false
|
||||||
-
|
-
|
||||||
uri: nodes.hashvault.pro:18081
|
uri: nodes.hashvault.pro:18081
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
Support getting Addresses from ENS and Mastodon
|
BirdPay enhancements
|
||||||
Bug fixes
|
Nano fixes and improvements
|
||||||
Minor enhancements
|
Minor bug fixes
|
||||||
|
Accessibility enhancements
|
|
@ -1,3 +1,4 @@
|
||||||
Add BitcoinCash (BCH)
|
BirdPay enhancements
|
||||||
Bug fixes
|
Nano fixes and improvements
|
||||||
|
Minor bug fixes
|
||||||
Accessibility enhancements
|
Accessibility enhancements
|
|
@ -10,13 +10,11 @@ class NanoRestoreWalletFromSeedCredentials extends WalletCredentials {
|
||||||
NanoRestoreWalletFromSeedCredentials({
|
NanoRestoreWalletFromSeedCredentials({
|
||||||
required String name,
|
required String name,
|
||||||
required this.mnemonic,
|
required this.mnemonic,
|
||||||
int height = 0,
|
|
||||||
String? password,
|
String? password,
|
||||||
DerivationType? derivationType,
|
DerivationType? derivationType,
|
||||||
}) : super(
|
}) : super(
|
||||||
name: name,
|
name: name,
|
||||||
password: password,
|
password: password,
|
||||||
height: height,
|
|
||||||
derivationType: derivationType,
|
derivationType: derivationType,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -33,9 +31,12 @@ class NanoRestoreWalletFromKeysCredentials extends WalletCredentials {
|
||||||
required String name,
|
required String name,
|
||||||
required String password,
|
required String password,
|
||||||
required this.seedKey,
|
required this.seedKey,
|
||||||
this.derivationType,
|
DerivationType? derivationType,
|
||||||
}) : super(name: name, password: password);
|
}) : super(
|
||||||
|
name: name,
|
||||||
|
password: password,
|
||||||
|
derivationType: derivationType,
|
||||||
|
);
|
||||||
|
|
||||||
final String seedKey;
|
final String seedKey;
|
||||||
final DerivationType? derivationType;
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -286,7 +286,7 @@ class BackupService {
|
||||||
await _sharedPreferences.setInt(
|
await _sharedPreferences.setInt(
|
||||||
PreferencesKey.currentTransactionPriorityKeyLegacy, currentTransactionPriorityKeyLegacy);
|
PreferencesKey.currentTransactionPriorityKeyLegacy, currentTransactionPriorityKeyLegacy);
|
||||||
|
|
||||||
if (allowBiometricalAuthentication != null)
|
if (allowBiometricalAuthentication != null && !Platform.isMacOS && !Platform.isLinux)
|
||||||
await _sharedPreferences.setBool(
|
await _sharedPreferences.setBool(
|
||||||
PreferencesKey.allowBiometricalAuthenticationKey, allowBiometricalAuthentication);
|
PreferencesKey.allowBiometricalAuthenticationKey, allowBiometricalAuthentication);
|
||||||
|
|
||||||
|
|
|
@ -237,6 +237,7 @@ import 'package:cake_wallet/src/screens/wallet_unlock/wallet_unlock_page.dart';
|
||||||
import 'package:cake_wallet/entities/qr_view_data.dart';
|
import 'package:cake_wallet/entities/qr_view_data.dart';
|
||||||
|
|
||||||
import 'core/totp_request_details.dart';
|
import 'core/totp_request_details.dart';
|
||||||
|
import 'src/screens/settings/desktop_settings/desktop_settings_page.dart';
|
||||||
|
|
||||||
final getIt = GetIt.instance;
|
final getIt = GetIt.instance;
|
||||||
|
|
||||||
|
@ -265,6 +266,7 @@ Future<void> setup({
|
||||||
required Box<Order> ordersSource,
|
required Box<Order> ordersSource,
|
||||||
required Box<UnspentCoinsInfo> unspentCoinsInfoSource,
|
required Box<UnspentCoinsInfo> unspentCoinsInfoSource,
|
||||||
required Box<AnonpayInvoiceInfo> anonpayInvoiceInfoSource,
|
required Box<AnonpayInvoiceInfo> anonpayInvoiceInfoSource,
|
||||||
|
required FlutterSecureStorage secureStorage,
|
||||||
}) async {
|
}) async {
|
||||||
_walletInfoSource = walletInfoSource;
|
_walletInfoSource = walletInfoSource;
|
||||||
_nodeSource = nodeSource;
|
_nodeSource = nodeSource;
|
||||||
|
@ -502,6 +504,7 @@ Future<void> setup({
|
||||||
getIt.registerFactory<DesktopSidebarWrapper>(() {
|
getIt.registerFactory<DesktopSidebarWrapper>(() {
|
||||||
final GlobalKey<NavigatorState> _navigatorKey = GlobalKey<NavigatorState>();
|
final GlobalKey<NavigatorState> _navigatorKey = GlobalKey<NavigatorState>();
|
||||||
return DesktopSidebarWrapper(
|
return DesktopSidebarWrapper(
|
||||||
|
bottomSheetService: getIt.get<BottomSheetService>(),
|
||||||
dashboardViewModel: getIt.get<DashboardViewModel>(),
|
dashboardViewModel: getIt.get<DashboardViewModel>(),
|
||||||
desktopSidebarViewModel: getIt.get<DesktopSidebarViewModel>(),
|
desktopSidebarViewModel: getIt.get<DesktopSidebarViewModel>(),
|
||||||
child: getIt.get<DesktopDashboardPage>(param1: _navigatorKey),
|
child: getIt.get<DesktopDashboardPage>(param1: _navigatorKey),
|
||||||
|
@ -510,7 +513,6 @@ Future<void> setup({
|
||||||
});
|
});
|
||||||
getIt.registerFactoryParam<DesktopDashboardPage, GlobalKey<NavigatorState>, void>(
|
getIt.registerFactoryParam<DesktopDashboardPage, GlobalKey<NavigatorState>, void>(
|
||||||
(desktopKey, _) => DesktopDashboardPage(
|
(desktopKey, _) => DesktopDashboardPage(
|
||||||
bottomSheetService: getIt.get<BottomSheetService>(),
|
|
||||||
balancePage: getIt.get<BalancePage>(),
|
balancePage: getIt.get<BalancePage>(),
|
||||||
dashboardViewModel: getIt.get<DashboardViewModel>(),
|
dashboardViewModel: getIt.get<DashboardViewModel>(),
|
||||||
addressListViewModel: getIt.get<WalletAddressListViewModel>(),
|
addressListViewModel: getIt.get<WalletAddressListViewModel>(),
|
||||||
|
@ -529,6 +531,9 @@ Future<void> setup({
|
||||||
getIt.registerFactory<Modify2FAPage>(
|
getIt.registerFactory<Modify2FAPage>(
|
||||||
() => Modify2FAPage(setup2FAViewModel: getIt.get<Setup2FAViewModel>()));
|
() => Modify2FAPage(setup2FAViewModel: getIt.get<Setup2FAViewModel>()));
|
||||||
|
|
||||||
|
getIt.registerFactory<DesktopSettingsPage>(
|
||||||
|
() => DesktopSettingsPage());
|
||||||
|
|
||||||
getIt.registerFactoryParam<ReceiveOptionViewModel, ReceivePageOption?, void>(
|
getIt.registerFactoryParam<ReceiveOptionViewModel, ReceivePageOption?, void>(
|
||||||
(pageOption, _) => ReceiveOptionViewModel(getIt.get<AppStore>().wallet!, pageOption));
|
(pageOption, _) => ReceiveOptionViewModel(getIt.get<AppStore>().wallet!, pageOption));
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,13 @@ class AddressResolver {
|
||||||
}
|
}
|
||||||
|
|
||||||
final match = RegExp(addressPattern).firstMatch(raw);
|
final match = RegExp(addressPattern).firstMatch(raw);
|
||||||
return match?.group(0)?.replaceAll(RegExp('[^0-9a-zA-Z]'), '');
|
return match?.group(0)?.replaceAllMapped(RegExp('[^0-9a-zA-Z]|bitcoincash:|nano_'), (Match match) {
|
||||||
|
String group = match.group(0)!;
|
||||||
|
if (group.startsWith('bitcoincash:') || group.startsWith('nano_')) {
|
||||||
|
return group;
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<ParsedAddress> resolve(String text, String ticker) async {
|
Future<ParsedAddress> resolve(String text, String ticker) async {
|
||||||
|
@ -59,16 +65,11 @@ class AddressResolver {
|
||||||
if (addressFromBio != null) {
|
if (addressFromBio != null) {
|
||||||
return ParsedAddress.fetchTwitterAddress(address: addressFromBio, name: text);
|
return ParsedAddress.fetchTwitterAddress(address: addressFromBio, name: text);
|
||||||
}
|
}
|
||||||
final tweets = twitterUser.tweets;
|
|
||||||
if (tweets != null) {
|
|
||||||
var subString = StringBuffer();
|
|
||||||
tweets.forEach((item) {
|
|
||||||
subString.writeln(item.text);
|
|
||||||
});
|
|
||||||
final userTweetsText = subString.toString();
|
|
||||||
final addressFromPinnedTweet =
|
|
||||||
extractAddressByType(raw: userTweetsText, type: CryptoCurrency.fromString(ticker));
|
|
||||||
|
|
||||||
|
final pinnedTweet = twitterUser.pinnedTweet?.text;
|
||||||
|
if (pinnedTweet != null) {
|
||||||
|
final addressFromPinnedTweet =
|
||||||
|
extractAddressByType(raw: pinnedTweet, type: CryptoCurrency.fromString(ticker));
|
||||||
if (addressFromPinnedTweet != null) {
|
if (addressFromPinnedTweet != null) {
|
||||||
return ParsedAddress.fetchTwitterAddress(address: addressFromPinnedTweet, name: text);
|
return ParsedAddress.fetchTwitterAddress(address: addressFromPinnedTweet, name: text);
|
||||||
}
|
}
|
||||||
|
|
|
@ -165,7 +165,7 @@ Future<void> initializeAppConfigs() async {
|
||||||
secureStorage: secureStorage,
|
secureStorage: secureStorage,
|
||||||
anonpayInvoiceInfo: anonpayInvoiceInfo,
|
anonpayInvoiceInfo: anonpayInvoiceInfo,
|
||||||
initialMigrationVersion: 23);
|
initialMigrationVersion: 23);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> initialSetup(
|
Future<void> initialSetup(
|
||||||
{required SharedPreferences sharedPreferences,
|
{required SharedPreferences sharedPreferences,
|
||||||
|
@ -204,7 +204,8 @@ Future<void> initialSetup(
|
||||||
transactionDescriptionBox: transactionDescriptions,
|
transactionDescriptionBox: transactionDescriptions,
|
||||||
ordersSource: ordersSource,
|
ordersSource: ordersSource,
|
||||||
anonpayInvoiceInfoSource: anonpayInvoiceInfo,
|
anonpayInvoiceInfoSource: anonpayInvoiceInfo,
|
||||||
unspentCoinsInfoSource: unspentCoinsInfoSource);
|
unspentCoinsInfoSource: unspentCoinsInfoSource,
|
||||||
|
secureStorage: secureStorage);
|
||||||
await bootstrap(navigatorKey);
|
await bootstrap(navigatorKey);
|
||||||
monero?.onStartup();
|
monero?.onStartup();
|
||||||
}
|
}
|
||||||
|
|
|
@ -406,6 +406,13 @@ class CWNanoUtil extends NanoUtil {
|
||||||
late String publicAddress;
|
late String publicAddress;
|
||||||
|
|
||||||
if (seedKey != null) {
|
if (seedKey != null) {
|
||||||
|
if (seedKey.length == 64) {
|
||||||
|
try {
|
||||||
|
mnemonic = nanoUtil!.seedToMnemonic(seedKey);
|
||||||
|
} catch (e) {
|
||||||
|
print("not a valid 'nano' seed key");
|
||||||
|
}
|
||||||
|
}
|
||||||
if (derivationType == DerivationType.bip39) {
|
if (derivationType == DerivationType.bip39) {
|
||||||
publicAddress = await hdSeedToAddress(seedKey, 0);
|
publicAddress = await hdSeedToAddress(seedKey, 0);
|
||||||
} else if (derivationType == DerivationType.nano) {
|
} else if (derivationType == DerivationType.nano) {
|
||||||
|
@ -429,7 +436,8 @@ class CWNanoUtil extends NanoUtil {
|
||||||
|
|
||||||
AccountInfoResponse? accountInfo = await nanoClient.getAccountInfo(publicAddress);
|
AccountInfoResponse? accountInfo = await nanoClient.getAccountInfo(publicAddress);
|
||||||
if (accountInfo == null) {
|
if (accountInfo == null) {
|
||||||
accountInfo = AccountInfoResponse(frontier: "", balance: "0", representative: "", confirmationHeight: 0);
|
accountInfo = AccountInfoResponse(
|
||||||
|
frontier: "", balance: "0", representative: "", confirmationHeight: 0);
|
||||||
}
|
}
|
||||||
accountInfo.address = publicAddress;
|
accountInfo.address = publicAddress;
|
||||||
return accountInfo;
|
return accountInfo;
|
||||||
|
@ -449,7 +457,11 @@ class CWNanoUtil extends NanoUtil {
|
||||||
if (seedKey?.length == 128) {
|
if (seedKey?.length == 128) {
|
||||||
return [DerivationType.bip39];
|
return [DerivationType.bip39];
|
||||||
} else if (seedKey?.length == 64) {
|
} else if (seedKey?.length == 64) {
|
||||||
return [DerivationType.nano];
|
try {
|
||||||
|
mnemonic = nanoUtil!.seedToMnemonic(seedKey!);
|
||||||
|
} catch (e) {
|
||||||
|
print("not a valid 'nano' seed key");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
late String publicAddressStandard;
|
late String publicAddressStandard;
|
||||||
|
@ -503,7 +515,7 @@ class CWNanoUtil extends NanoUtil {
|
||||||
// we don't know for sure:
|
// we don't know for sure:
|
||||||
return [DerivationType.nano, DerivationType.bip39];
|
return [DerivationType.nano, DerivationType.bip39];
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return [DerivationType.unknown];
|
return [DerivationType.nano, DerivationType.bip39];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -588,7 +588,7 @@ Route<dynamic> createRoute(RouteSettings settings) {
|
||||||
);
|
);
|
||||||
|
|
||||||
case Routes.desktop_settings_page:
|
case Routes.desktop_settings_page:
|
||||||
return CupertinoPageRoute<void>(builder: (_) => DesktopSettingsPage());
|
return CupertinoPageRoute<void>(builder: (_) => getIt.get<DesktopSettingsPage>());
|
||||||
|
|
||||||
case Routes.empty_no_route:
|
case Routes.empty_no_route:
|
||||||
return MaterialPageRoute<void>(builder: (_) => SizedBox.shrink());
|
return MaterialPageRoute<void>(builder: (_) => SizedBox.shrink());
|
||||||
|
|
|
@ -35,35 +35,39 @@ class ContactListPage extends BasePage {
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
shape: BoxShape.circle,
|
shape: BoxShape.circle,
|
||||||
color: Theme.of(context).extension<ExchangePageTheme>()!.buttonBackgroundColor),
|
color: Theme.of(context).extension<ExchangePageTheme>()!.buttonBackgroundColor),
|
||||||
child: Stack(
|
child: Semantics(
|
||||||
alignment: Alignment.center,
|
label: S.of(context).add_contact,
|
||||||
children: <Widget>[
|
button: true,
|
||||||
Icon(
|
child: Stack(
|
||||||
Icons.add,
|
alignment: Alignment.center,
|
||||||
color: Theme.of(context).appBarTheme.titleTextStyle!.color,
|
children: <Widget>[
|
||||||
size: 22.0,
|
Icon(
|
||||||
),
|
Icons.add,
|
||||||
ButtonTheme(
|
color: Theme.of(context).appBarTheme.titleTextStyle!.color,
|
||||||
minWidth: 32.0,
|
size: 22.0,
|
||||||
height: 32.0,
|
),
|
||||||
child: TextButton(
|
ButtonTheme(
|
||||||
// FIX-ME: Style
|
minWidth: 32.0,
|
||||||
//shape: CircleBorder(),
|
height: 32.0,
|
||||||
onPressed: () async {
|
child: TextButton(
|
||||||
if (contactListViewModel.shouldRequireTOTP2FAForAddingContacts) {
|
// FIX-ME: Style
|
||||||
authService.authenticateAction(
|
//shape: CircleBorder(),
|
||||||
context,
|
onPressed: () async {
|
||||||
route: Routes.addressBookAddContact,
|
if (contactListViewModel.shouldRequireTOTP2FAForAddingContacts) {
|
||||||
conditionToDetermineIfToUse2FA:
|
authService.authenticateAction(
|
||||||
contactListViewModel.shouldRequireTOTP2FAForAddingContacts,
|
context,
|
||||||
);
|
route: Routes.addressBookAddContact,
|
||||||
} else {
|
conditionToDetermineIfToUse2FA:
|
||||||
await Navigator.of(context).pushNamed(Routes.addressBookAddContact);
|
contactListViewModel.shouldRequireTOTP2FAForAddingContacts,
|
||||||
}
|
);
|
||||||
},
|
} else {
|
||||||
child: Offstage()),
|
await Navigator.of(context).pushNamed(Routes.addressBookAddContact);
|
||||||
)
|
}
|
||||||
],
|
},
|
||||||
|
child: Offstage()),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,10 +1,8 @@
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'package:cake_wallet/core/wallet_connect/wc_bottom_sheet_service.dart';
|
|
||||||
import 'package:cake_wallet/entities/preferences_key.dart';
|
import 'package:cake_wallet/entities/preferences_key.dart';
|
||||||
import 'package:cake_wallet/generated/i18n.dart';
|
import 'package:cake_wallet/generated/i18n.dart';
|
||||||
import 'package:cake_wallet/routes.dart';
|
import 'package:cake_wallet/routes.dart';
|
||||||
import 'package:cake_wallet/src/screens/release_notes/release_notes_screen.dart';
|
import 'package:cake_wallet/src/screens/release_notes/release_notes_screen.dart';
|
||||||
import 'package:cake_wallet/src/screens/wallet_connect/widgets/modals/bottom_sheet_listener.dart';
|
|
||||||
import 'package:cake_wallet/src/screens/yat_emoji_id.dart';
|
import 'package:cake_wallet/src/screens/yat_emoji_id.dart';
|
||||||
import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
|
import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
|
||||||
import 'package:cake_wallet/utils/show_pop_up.dart';
|
import 'package:cake_wallet/utils/show_pop_up.dart';
|
||||||
|
@ -21,14 +19,12 @@ import 'package:shared_preferences/shared_preferences.dart';
|
||||||
class DesktopDashboardPage extends StatelessWidget {
|
class DesktopDashboardPage extends StatelessWidget {
|
||||||
DesktopDashboardPage({
|
DesktopDashboardPage({
|
||||||
required this.balancePage,
|
required this.balancePage,
|
||||||
required this.bottomSheetService,
|
|
||||||
required this.dashboardViewModel,
|
required this.dashboardViewModel,
|
||||||
required this.addressListViewModel,
|
required this.addressListViewModel,
|
||||||
required this.desktopKey,
|
required this.desktopKey,
|
||||||
});
|
});
|
||||||
|
|
||||||
final BalancePage balancePage;
|
final BalancePage balancePage;
|
||||||
final BottomSheetService bottomSheetService;
|
|
||||||
final DashboardViewModel dashboardViewModel;
|
final DashboardViewModel dashboardViewModel;
|
||||||
final WalletAddressListViewModel addressListViewModel;
|
final WalletAddressListViewModel addressListViewModel;
|
||||||
final GlobalKey<NavigatorState> desktopKey;
|
final GlobalKey<NavigatorState> desktopKey;
|
||||||
|
@ -40,34 +36,31 @@ class DesktopDashboardPage extends StatelessWidget {
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
_setEffects(context);
|
_setEffects(context);
|
||||||
|
|
||||||
return BottomSheetListener(
|
return Container(
|
||||||
bottomSheetService: bottomSheetService,
|
color: Theme.of(context).colorScheme.background,
|
||||||
child: Container(
|
child: Row(
|
||||||
color: Theme.of(context).colorScheme.background,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
child: Row(
|
children: [
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
Container(
|
||||||
children: [
|
width: 400,
|
||||||
Container(
|
child: balancePage,
|
||||||
width: 400,
|
),
|
||||||
child: balancePage,
|
Flexible(
|
||||||
),
|
child: ConstrainedBox(
|
||||||
Flexible(
|
constraints: BoxConstraints(maxWidth: 500),
|
||||||
child: ConstrainedBox(
|
child: Navigator(
|
||||||
constraints: BoxConstraints(maxWidth: 500),
|
key: desktopKey,
|
||||||
child: Navigator(
|
initialRoute: Routes.desktop_actions,
|
||||||
key: desktopKey,
|
onGenerateRoute: (settings) => Router.createRoute(settings),
|
||||||
initialRoute: Routes.desktop_actions,
|
onGenerateInitialRoutes: (NavigatorState navigator, String initialRouteName) {
|
||||||
onGenerateRoute: (settings) => Router.createRoute(settings),
|
return [
|
||||||
onGenerateInitialRoutes: (NavigatorState navigator, String initialRouteName) {
|
navigator.widget.onGenerateRoute!(RouteSettings(name: initialRouteName))!
|
||||||
return [
|
];
|
||||||
navigator.widget.onGenerateRoute!(RouteSettings(name: initialRouteName))!
|
},
|
||||||
];
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
),
|
||||||
),
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import 'package:cake_wallet/core/wallet_connect/wc_bottom_sheet_service.dart';
|
||||||
import 'package:cake_wallet/di.dart';
|
import 'package:cake_wallet/di.dart';
|
||||||
import 'package:cake_wallet/routes.dart';
|
import 'package:cake_wallet/routes.dart';
|
||||||
import 'package:cake_wallet/src/screens/auth/auth_page.dart';
|
import 'package:cake_wallet/src/screens/auth/auth_page.dart';
|
||||||
|
@ -7,6 +8,7 @@ import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_sideba
|
||||||
import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_sidebar/side_menu_item.dart';
|
import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_sidebar/side_menu_item.dart';
|
||||||
import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart';
|
import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart';
|
||||||
import 'package:cake_wallet/src/screens/dashboard/widgets/sync_indicator.dart';
|
import 'package:cake_wallet/src/screens/dashboard/widgets/sync_indicator.dart';
|
||||||
|
import 'package:cake_wallet/src/screens/wallet_connect/widgets/modals/bottom_sheet_listener.dart';
|
||||||
import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
|
import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
|
||||||
import 'package:cake_wallet/view_model/dashboard/desktop_sidebar_view_model.dart';
|
import 'package:cake_wallet/view_model/dashboard/desktop_sidebar_view_model.dart';
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
|
@ -16,6 +18,7 @@ import 'package:cake_wallet/router.dart' as Router;
|
||||||
import 'package:mobx/mobx.dart';
|
import 'package:mobx/mobx.dart';
|
||||||
|
|
||||||
class DesktopSidebarWrapper extends BasePage {
|
class DesktopSidebarWrapper extends BasePage {
|
||||||
|
final BottomSheetService bottomSheetService;
|
||||||
final Widget child;
|
final Widget child;
|
||||||
final DesktopSidebarViewModel desktopSidebarViewModel;
|
final DesktopSidebarViewModel desktopSidebarViewModel;
|
||||||
final DashboardViewModel dashboardViewModel;
|
final DashboardViewModel dashboardViewModel;
|
||||||
|
@ -23,6 +26,7 @@ class DesktopSidebarWrapper extends BasePage {
|
||||||
|
|
||||||
DesktopSidebarWrapper({
|
DesktopSidebarWrapper({
|
||||||
required this.child,
|
required this.child,
|
||||||
|
required this.bottomSheetService,
|
||||||
required this.desktopSidebarViewModel,
|
required this.desktopSidebarViewModel,
|
||||||
required this.dashboardViewModel,
|
required this.dashboardViewModel,
|
||||||
required this.desktopNavigatorKey,
|
required this.desktopNavigatorKey,
|
||||||
|
@ -67,63 +71,75 @@ class DesktopSidebarWrapper extends BasePage {
|
||||||
Widget body(BuildContext context) {
|
Widget body(BuildContext context) {
|
||||||
_setEffects();
|
_setEffects();
|
||||||
|
|
||||||
return Row(
|
return BottomSheetListener(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
bottomSheetService: bottomSheetService,
|
||||||
children: [
|
child: Row(
|
||||||
Observer(builder: (_) {
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
return SideMenu(
|
children: [
|
||||||
width: sideMenuWidth,
|
Observer(builder: (_) {
|
||||||
topItems: [
|
return SideMenu(
|
||||||
SideMenuItem(
|
width: sideMenuWidth,
|
||||||
imagePath: 'assets/images/wallet_outline.png',
|
topItems: [
|
||||||
isSelected: desktopSidebarViewModel.currentPage == SidebarItem.dashboard,
|
SideMenuItem(
|
||||||
onTap: () {
|
imagePath: 'assets/images/wallet_outline.png',
|
||||||
desktopSidebarViewModel.onPageChange(SidebarItem.dashboard);
|
isSelected: desktopSidebarViewModel.currentPage == SidebarItem.dashboard,
|
||||||
desktopNavigatorKey.currentState
|
onTap: () {
|
||||||
?.pushNamedAndRemoveUntil(Routes.desktop_actions, (route) => false);
|
desktopSidebarViewModel.onPageChange(SidebarItem.dashboard);
|
||||||
},
|
|
||||||
),
|
|
||||||
SideMenuItem(
|
|
||||||
onTap: () {
|
|
||||||
if (desktopSidebarViewModel.currentPage == SidebarItem.transactions) {
|
|
||||||
desktopNavigatorKey.currentState
|
desktopNavigatorKey.currentState
|
||||||
?.pushNamedAndRemoveUntil(Routes.desktop_actions, (route) => false);
|
?.pushNamedAndRemoveUntil(Routes.desktop_actions, (route) => false);
|
||||||
desktopSidebarViewModel.resetSidebar();
|
},
|
||||||
} else {
|
),
|
||||||
desktopSidebarViewModel.onPageChange(SidebarItem.transactions);
|
SideMenuItem(
|
||||||
desktopNavigatorKey.currentState?.pushNamed(Routes.transactionsPage);
|
onTap: () {
|
||||||
}
|
if (desktopSidebarViewModel.currentPage == SidebarItem.transactions) {
|
||||||
},
|
desktopNavigatorKey.currentState
|
||||||
isSelected: desktopSidebarViewModel.currentPage == SidebarItem.transactions,
|
?.pushNamedAndRemoveUntil(Routes.desktop_actions, (route) => false);
|
||||||
imagePath: desktopSidebarViewModel.currentPage == SidebarItem.transactions
|
desktopSidebarViewModel.resetSidebar();
|
||||||
? selectedIconPath
|
} else {
|
||||||
: unselectedIconPath,
|
desktopSidebarViewModel.onPageChange(SidebarItem.transactions);
|
||||||
),
|
desktopNavigatorKey.currentState?.pushNamed(Routes.transactionsPage);
|
||||||
],
|
}
|
||||||
bottomItems: [
|
},
|
||||||
SideMenuItem(
|
isSelected: desktopSidebarViewModel.currentPage == SidebarItem.transactions,
|
||||||
imagePath: 'assets/images/support_icon.png',
|
imagePath: desktopSidebarViewModel.currentPage == SidebarItem.transactions
|
||||||
isSelected: desktopSidebarViewModel.currentPage == SidebarItem.support,
|
? selectedIconPath
|
||||||
onTap: () => desktopSidebarViewModel.onPageChange(SidebarItem.support)),
|
: unselectedIconPath,
|
||||||
SideMenuItem(
|
),
|
||||||
imagePath: 'assets/images/settings_outline.png',
|
],
|
||||||
isSelected: desktopSidebarViewModel.currentPage == SidebarItem.settings,
|
bottomItems: [
|
||||||
onTap: () => desktopSidebarViewModel.onPageChange(SidebarItem.settings),
|
SideMenuItem(
|
||||||
),
|
imagePath: 'assets/images/support_icon.png',
|
||||||
],
|
isSelected: desktopSidebarViewModel.currentPage == SidebarItem.support,
|
||||||
);
|
onTap: () => desktopSidebarViewModel.onPageChange(SidebarItem.support)),
|
||||||
}),
|
SideMenuItem(
|
||||||
Expanded(
|
imagePath: 'assets/images/settings_outline.png',
|
||||||
child: PageView(
|
isSelected: desktopSidebarViewModel.currentPage == SidebarItem.settings,
|
||||||
controller: pageController,
|
onTap: () => desktopSidebarViewModel.onPageChange(SidebarItem.settings),
|
||||||
physics: NeverScrollableScrollPhysics(),
|
),
|
||||||
children: [
|
],
|
||||||
child,
|
);
|
||||||
Container(
|
}),
|
||||||
color: Theme.of(context).colorScheme.background,
|
Expanded(
|
||||||
padding: EdgeInsets.all(20),
|
child: PageView(
|
||||||
child: Navigator(
|
controller: pageController,
|
||||||
initialRoute: Routes.support,
|
physics: NeverScrollableScrollPhysics(),
|
||||||
|
children: [
|
||||||
|
child,
|
||||||
|
Container(
|
||||||
|
color: Theme.of(context).colorScheme.background,
|
||||||
|
padding: EdgeInsets.all(20),
|
||||||
|
child: Navigator(
|
||||||
|
initialRoute: Routes.support,
|
||||||
|
onGenerateRoute: (settings) => Router.createRoute(settings),
|
||||||
|
onGenerateInitialRoutes: (NavigatorState navigator, String initialRouteName) {
|
||||||
|
return [
|
||||||
|
navigator.widget.onGenerateRoute!(RouteSettings(name: initialRouteName))!
|
||||||
|
];
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Navigator(
|
||||||
|
initialRoute: Routes.desktop_settings_page,
|
||||||
onGenerateRoute: (settings) => Router.createRoute(settings),
|
onGenerateRoute: (settings) => Router.createRoute(settings),
|
||||||
onGenerateInitialRoutes: (NavigatorState navigator, String initialRouteName) {
|
onGenerateInitialRoutes: (NavigatorState navigator, String initialRouteName) {
|
||||||
return [
|
return [
|
||||||
|
@ -131,20 +147,11 @@ class DesktopSidebarWrapper extends BasePage {
|
||||||
];
|
];
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
],
|
||||||
Navigator(
|
),
|
||||||
initialRoute: Routes.desktop_settings_page,
|
|
||||||
onGenerateRoute: (settings) => Router.createRoute(settings),
|
|
||||||
onGenerateInitialRoutes: (NavigatorState navigator, String initialRouteName) {
|
|
||||||
return [
|
|
||||||
navigator.widget.onGenerateRoute!(RouteSettings(name: initialRouteName))!
|
|
||||||
];
|
|
||||||
},
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
),
|
],
|
||||||
],
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -99,19 +99,22 @@ class AddressPage extends BasePage {
|
||||||
Widget? trailing(BuildContext context) {
|
Widget? trailing(BuildContext context) {
|
||||||
return Material(
|
return Material(
|
||||||
color: Colors.transparent,
|
color: Colors.transparent,
|
||||||
child: IconButton(
|
child: Semantics(
|
||||||
padding: EdgeInsets.zero,
|
label: S.of(context).share,
|
||||||
constraints: BoxConstraints(),
|
child: IconButton(
|
||||||
highlightColor: Colors.transparent,
|
padding: EdgeInsets.zero,
|
||||||
splashColor: Colors.transparent,
|
constraints: BoxConstraints(),
|
||||||
iconSize: 25,
|
highlightColor: Colors.transparent,
|
||||||
onPressed: () {
|
splashColor: Colors.transparent,
|
||||||
ShareUtil.share(
|
iconSize: 25,
|
||||||
text: addressListViewModel.uri.toString(),
|
onPressed: () {
|
||||||
context: context,
|
ShareUtil.share(
|
||||||
);
|
text: addressListViewModel.uri.toString(),
|
||||||
},
|
context: context,
|
||||||
icon: Icon(Icons.share, size: 20, color: pageIconColor(context)),
|
);
|
||||||
|
},
|
||||||
|
icon: Icon(Icons.share, size: 20, color: pageIconColor(context)),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,21 +31,29 @@ class HeaderRow extends StatelessWidget {
|
||||||
fontWeight: FontWeight.w500,
|
fontWeight: FontWeight.w500,
|
||||||
color: Theme.of(context).extension<DashboardPageTheme>()!.pageTitleTextColor),
|
color: Theme.of(context).extension<DashboardPageTheme>()!.pageTitleTextColor),
|
||||||
),
|
),
|
||||||
GestureDetector(
|
Semantics(
|
||||||
onTap: () {
|
container: true,
|
||||||
showPopUp<void>(
|
child: GestureDetector(
|
||||||
context: context,
|
onTap: () {
|
||||||
builder: (context) =>
|
showPopUp<void>(
|
||||||
FilterWidget(dashboardViewModel: dashboardViewModel)
|
context: context,
|
||||||
);
|
builder: (context) => FilterWidget(dashboardViewModel: dashboardViewModel),
|
||||||
},
|
);
|
||||||
child: Container(
|
},
|
||||||
height: 36,
|
child: Semantics(
|
||||||
width: 36,
|
label: 'Transaction Filter',
|
||||||
decoration: BoxDecoration(
|
button: true,
|
||||||
shape: BoxShape.circle,
|
enabled: true,
|
||||||
color: Theme.of(context).extension<FilterTheme>()!.buttonColor),
|
child: Container(
|
||||||
child: filterIcon,
|
height: 36,
|
||||||
|
width: 36,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
shape: BoxShape.circle,
|
||||||
|
color: Theme.of(context).extension<FilterTheme>()!.buttonColor,
|
||||||
|
),
|
||||||
|
child: filterIcon,
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
|
import 'package:cake_wallet/src/widgets/alert_close_button.dart';
|
||||||
import 'package:cake_wallet/themes/extensions/cake_text_theme.dart';
|
import 'package:cake_wallet/themes/extensions/cake_text_theme.dart';
|
||||||
import 'package:cake_wallet/palette.dart';
|
|
||||||
import 'package:cake_wallet/src/screens/ionia/widgets/rounded_checkbox.dart';
|
import 'package:cake_wallet/src/screens/ionia/widgets/rounded_checkbox.dart';
|
||||||
import 'package:cake_wallet/src/widgets/alert_background.dart';
|
import 'package:cake_wallet/src/widgets/alert_background.dart';
|
||||||
import 'package:cake_wallet/typography.dart';
|
import 'package:cake_wallet/typography.dart';
|
||||||
|
@ -71,77 +71,69 @@ class PresentReceiveOptionPicker extends StatelessWidget {
|
||||||
builder: (BuildContext popUpContext) => Scaffold(
|
builder: (BuildContext popUpContext) => Scaffold(
|
||||||
resizeToAvoidBottomInset: false,
|
resizeToAvoidBottomInset: false,
|
||||||
backgroundColor: Colors.transparent,
|
backgroundColor: Colors.transparent,
|
||||||
body: AlertBackground(
|
body: Stack(
|
||||||
child: Column(
|
alignment: AlignmentDirectional.center,
|
||||||
mainAxisSize: MainAxisSize.min,
|
children:[ AlertBackground(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
child: Column(
|
||||||
children: [
|
mainAxisSize: MainAxisSize.min,
|
||||||
Spacer(),
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
Container(
|
children: [
|
||||||
margin: EdgeInsets.symmetric(horizontal: 24),
|
Spacer(),
|
||||||
decoration: BoxDecoration(
|
Container(
|
||||||
borderRadius: BorderRadius.circular(30),
|
margin: EdgeInsets.symmetric(horizontal: 24),
|
||||||
color: Theme.of(context).colorScheme.background,
|
decoration: BoxDecoration(
|
||||||
),
|
borderRadius: BorderRadius.circular(30),
|
||||||
child: Padding(
|
color: Theme.of(context).colorScheme.background,
|
||||||
padding: const EdgeInsets.only(top: 24, bottom: 24),
|
),
|
||||||
child: (ListView.separated(
|
child: Padding(
|
||||||
padding: EdgeInsets.zero,
|
padding: const EdgeInsets.only(top: 24, bottom: 24),
|
||||||
shrinkWrap: true,
|
child: (ListView.separated(
|
||||||
itemCount: receiveOptionViewModel.options.length,
|
padding: EdgeInsets.zero,
|
||||||
itemBuilder: (_, index) {
|
shrinkWrap: true,
|
||||||
final option = receiveOptionViewModel.options[index];
|
itemCount: receiveOptionViewModel.options.length,
|
||||||
return InkWell(
|
itemBuilder: (_, index) {
|
||||||
onTap: () {
|
final option = receiveOptionViewModel.options[index];
|
||||||
Navigator.pop(popUpContext);
|
return InkWell(
|
||||||
|
onTap: () {
|
||||||
|
Navigator.pop(popUpContext);
|
||||||
|
|
||||||
receiveOptionViewModel.selectReceiveOption(option);
|
receiveOptionViewModel.selectReceiveOption(option);
|
||||||
},
|
},
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.only(left: 24, right: 24),
|
padding: const EdgeInsets.only(left: 24, right: 24),
|
||||||
child: Observer(builder: (_) {
|
child: Observer(builder: (_) {
|
||||||
final value = receiveOptionViewModel.selectedReceiveOption;
|
final value = receiveOptionViewModel.selectedReceiveOption;
|
||||||
|
|
||||||
return Row(
|
return Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
Text(option.toString(),
|
Text(option.toString(),
|
||||||
textAlign: TextAlign.left,
|
textAlign: TextAlign.left,
|
||||||
style: textSmall(
|
style: textSmall(
|
||||||
color: Theme.of(context).extension<CakeTextTheme>()!.titleColor,
|
color: Theme.of(context).extension<CakeTextTheme>()!.titleColor,
|
||||||
).copyWith(
|
).copyWith(
|
||||||
fontWeight:
|
fontWeight:
|
||||||
value == option ? FontWeight.w800 : FontWeight.w500,
|
value == option ? FontWeight.w800 : FontWeight.w500,
|
||||||
)),
|
)),
|
||||||
RoundedCheckbox(
|
RoundedCheckbox(
|
||||||
value: value == option,
|
value: value == option,
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
separatorBuilder: (_, index) => SizedBox(height: 30),
|
separatorBuilder: (_, index) => SizedBox(height: 30),
|
||||||
)),
|
)),
|
||||||
),
|
|
||||||
),
|
|
||||||
Spacer(),
|
|
||||||
Container(
|
|
||||||
margin: EdgeInsets.only(bottom: 40),
|
|
||||||
child: InkWell(
|
|
||||||
onTap: () => Navigator.pop(popUpContext),
|
|
||||||
child: CircleAvatar(
|
|
||||||
child: Icon(
|
|
||||||
Icons.close,
|
|
||||||
color: Palette.darkBlueCraiola,
|
|
||||||
),
|
|
||||||
backgroundColor: Colors.white,
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
)
|
Spacer()
|
||||||
],
|
],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
|
AlertCloseButton(onTap: () => Navigator.of(popUpContext).pop(), bottom: 40)
|
||||||
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
context: context,
|
context: context,
|
||||||
|
|
|
@ -416,37 +416,40 @@ class ExchangeCardState extends State<ExchangeCard> {
|
||||||
width: 34,
|
width: 34,
|
||||||
height: 34,
|
height: 34,
|
||||||
padding: EdgeInsets.only(top: 0),
|
padding: EdgeInsets.only(top: 0),
|
||||||
child: InkWell(
|
child: Semantics(
|
||||||
onTap: () async {
|
label: S.of(context).address_book,
|
||||||
final contact =
|
child: InkWell(
|
||||||
await Navigator.of(context)
|
onTap: () async {
|
||||||
.pushNamed(
|
final contact =
|
||||||
Routes.pickerAddressBook,
|
await Navigator.of(context)
|
||||||
arguments: widget.initialCurrency,
|
.pushNamed(
|
||||||
);
|
Routes.pickerAddressBook,
|
||||||
|
arguments: widget.initialCurrency,
|
||||||
|
);
|
||||||
|
|
||||||
if (contact is ContactBase &&
|
if (contact is ContactBase &&
|
||||||
contact.address != null) {
|
contact.address != null) {
|
||||||
setState(() =>
|
setState(() =>
|
||||||
addressController.text =
|
addressController.text =
|
||||||
contact.address);
|
contact.address);
|
||||||
widget.onPushAddressBookButton
|
widget.onPushAddressBookButton
|
||||||
?.call(context);
|
?.call(context);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
child: Container(
|
child: Container(
|
||||||
padding: EdgeInsets.all(8),
|
padding: EdgeInsets.all(8),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: widget
|
color: widget
|
||||||
.addressButtonsColor,
|
.addressButtonsColor,
|
||||||
borderRadius:
|
borderRadius:
|
||||||
BorderRadius.all(
|
BorderRadius.all(
|
||||||
Radius.circular(
|
Radius.circular(
|
||||||
6))),
|
6))),
|
||||||
child: Image.asset(
|
child: Image.asset(
|
||||||
'assets/images/open_book.png',
|
'assets/images/open_book.png',
|
||||||
color: Theme.of(context).extension<SendPageTheme>()!.textFieldButtonIconColor,
|
color: Theme.of(context).extension<SendPageTheme>()!.textFieldButtonIconColor,
|
||||||
)),
|
)),
|
||||||
|
),
|
||||||
)),
|
)),
|
||||||
),
|
),
|
||||||
Padding(
|
Padding(
|
||||||
|
@ -455,22 +458,25 @@ class ExchangeCardState extends State<ExchangeCard> {
|
||||||
width: 34,
|
width: 34,
|
||||||
height: 34,
|
height: 34,
|
||||||
padding: EdgeInsets.only(top: 0),
|
padding: EdgeInsets.only(top: 0),
|
||||||
child: InkWell(
|
child: Semantics(
|
||||||
onTap: () {
|
label: S.of(context).copy_address,
|
||||||
Clipboard.setData(ClipboardData(
|
child: InkWell(
|
||||||
text: addressController
|
onTap: () {
|
||||||
.text));
|
Clipboard.setData(ClipboardData(
|
||||||
showBar<void>(
|
text: addressController
|
||||||
context,
|
.text));
|
||||||
S
|
showBar<void>(
|
||||||
.of(context)
|
context,
|
||||||
.copied_to_clipboard);
|
S
|
||||||
},
|
.of(context)
|
||||||
child: Container(
|
.copied_to_clipboard);
|
||||||
padding: EdgeInsets.fromLTRB(
|
},
|
||||||
8, 8, 0, 8),
|
child: Container(
|
||||||
color: Colors.transparent,
|
padding: EdgeInsets.fromLTRB(
|
||||||
child: copyImage),
|
8, 8, 0, 8),
|
||||||
|
color: Colors.transparent,
|
||||||
|
child: copyImage),
|
||||||
|
),
|
||||||
)))
|
)))
|
||||||
])))
|
])))
|
||||||
])),
|
])),
|
||||||
|
|
|
@ -167,9 +167,16 @@ class WalletRestoreFromKeysFromState extends State<WalletRestoreFromKeysFrom> {
|
||||||
|
|
||||||
Widget _restoreFromKeysFormFields() {
|
Widget _restoreFromKeysFormFields() {
|
||||||
if (widget.displayPrivateKeyField) {
|
if (widget.displayPrivateKeyField) {
|
||||||
|
// the term "private key" isn't actually what we're accepting here, and it's confusing to
|
||||||
|
// users of the nano community, what this form actually accepts (when importing for nano) is a nano seed in it's hex form, referred to in code as a "seed key"
|
||||||
|
// so we should change the placeholder text to reflect this
|
||||||
|
// supporting actual nano private keys is possible, but it's super niche in the nano community / they're not really used
|
||||||
|
|
||||||
|
bool nanoBased = widget.walletRestoreViewModel.type == WalletType.nano ||
|
||||||
|
widget.walletRestoreViewModel.type == WalletType.banano;
|
||||||
return AddressTextField(
|
return AddressTextField(
|
||||||
controller: privateKeyController,
|
controller: privateKeyController,
|
||||||
placeholder: S.of(context).private_key,
|
placeholder: nanoBased ? S.of(context).seed_key : S.of(context).private_key,
|
||||||
options: [AddressTextFieldOption.paste],
|
options: [AddressTextFieldOption.paste],
|
||||||
buttonColor: Theme.of(context).hintColor,
|
buttonColor: Theme.of(context).hintColor,
|
||||||
onPushPasteButton: (_) {
|
onPushPasteButton: (_) {
|
||||||
|
|
|
@ -85,7 +85,7 @@ class ConnectionSyncPage extends BasePage {
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
if (dashboardViewModel.wallet.type == WalletType.ethereum && DeviceInfo.instance.isMobile) ...[
|
if (dashboardViewModel.wallet.type == WalletType.ethereum) ...[
|
||||||
WalletConnectTile(
|
WalletConnectTile(
|
||||||
onTap: () async {
|
onTap: () async {
|
||||||
Navigator.of(context).push(
|
Navigator.of(context).push(
|
||||||
|
|
|
@ -12,6 +12,7 @@ final _settingsNavigatorKey = GlobalKey<NavigatorState>();
|
||||||
class DesktopSettingsPage extends StatefulWidget {
|
class DesktopSettingsPage extends StatefulWidget {
|
||||||
const DesktopSettingsPage({super.key});
|
const DesktopSettingsPage({super.key});
|
||||||
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<DesktopSettingsPage> createState() => _DesktopSettingsPageState();
|
State<DesktopSettingsPage> createState() => _DesktopSettingsPageState();
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,8 +2,10 @@ import 'dart:developer';
|
||||||
import 'package:cake_wallet/core/wallet_connect/web3wallet_service.dart';
|
import 'package:cake_wallet/core/wallet_connect/web3wallet_service.dart';
|
||||||
import 'package:cake_wallet/generated/i18n.dart';
|
import 'package:cake_wallet/generated/i18n.dart';
|
||||||
import 'package:cake_wallet/src/screens/base_page.dart';
|
import 'package:cake_wallet/src/screens/base_page.dart';
|
||||||
|
import 'package:cake_wallet/src/screens/wallet_connect/widgets/enter_wallet_connect_uri_widget.dart';
|
||||||
import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
|
import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
|
||||||
import 'package:cake_wallet/themes/extensions/cake_text_theme.dart';
|
import 'package:cake_wallet/themes/extensions/cake_text_theme.dart';
|
||||||
|
import 'package:cake_wallet/utils/device_info.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_mobx/flutter_mobx.dart';
|
import 'package:flutter_mobx/flutter_mobx.dart';
|
||||||
import 'package:walletconnect_flutter_v2/walletconnect_flutter_v2.dart';
|
import 'package:walletconnect_flutter_v2/walletconnect_flutter_v2.dart';
|
||||||
|
@ -36,7 +38,13 @@ class WCPairingsWidget extends BasePage {
|
||||||
String get title => S.current.walletConnect;
|
String get title => S.current.walletConnect;
|
||||||
|
|
||||||
Future<void> _onScanQrCode(BuildContext context, Web3Wallet web3Wallet) async {
|
Future<void> _onScanQrCode(BuildContext context, Web3Wallet web3Wallet) async {
|
||||||
final String? uri = await presentQRScanner();
|
final String? uri;
|
||||||
|
|
||||||
|
if (DeviceInfo.instance.isMobile) {
|
||||||
|
uri = await presentQRScanner();
|
||||||
|
} else {
|
||||||
|
uri = await _showEnterWalletConnectURIPopUp(context);
|
||||||
|
}
|
||||||
|
|
||||||
if (uri == null) return _invalidUriToast(context, S.current.nullURIError);
|
if (uri == null) return _invalidUriToast(context, S.current.nullURIError);
|
||||||
|
|
||||||
|
@ -51,6 +59,16 @@ class WCPairingsWidget extends BasePage {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<String?> _showEnterWalletConnectURIPopUp(BuildContext context) async {
|
||||||
|
final walletConnectURI = await showPopUp<String>(
|
||||||
|
context: context,
|
||||||
|
builder: (BuildContext context) {
|
||||||
|
return EnterWalletConnectURIWrapperWidget();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
return walletConnectURI;
|
||||||
|
}
|
||||||
|
|
||||||
Future<void> _invalidUriToast(BuildContext context, String message) async {
|
Future<void> _invalidUriToast(BuildContext context, String message) async {
|
||||||
await showPopUp<void>(
|
await showPopUp<void>(
|
||||||
context: context,
|
context: context,
|
||||||
|
|
|
@ -0,0 +1,140 @@
|
||||||
|
import 'package:cake_wallet/generated/i18n.dart';
|
||||||
|
import 'package:cake_wallet/src/widgets/base_alert_dialog.dart';
|
||||||
|
import 'package:cake_wallet/themes/extensions/send_page_theme.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
|
|
||||||
|
class EnterWalletConnectURIWrapperWidget extends StatefulWidget {
|
||||||
|
const EnterWalletConnectURIWrapperWidget({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<EnterWalletConnectURIWrapperWidget> createState() =>
|
||||||
|
_EnterWallectConnectURIWrapperWidgetState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _EnterWallectConnectURIWrapperWidgetState extends State<EnterWalletConnectURIWrapperWidget> {
|
||||||
|
late final TextEditingController controller;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
controller = TextEditingController();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
controller.dispose();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return _EnterWalletConnectURIWidget(
|
||||||
|
controller: controller,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _EnterWalletConnectURIWidget extends BaseAlertDialog {
|
||||||
|
_EnterWalletConnectURIWidget({
|
||||||
|
required this.controller,
|
||||||
|
});
|
||||||
|
|
||||||
|
final TextEditingController controller;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get titleText => S.current.enterWalletConnectURI;
|
||||||
|
|
||||||
|
Future<void> _pasteWalletConnectURI() async {
|
||||||
|
final clipboard = await Clipboard.getData('text/plain');
|
||||||
|
final totpURI = clipboard?.text ?? '';
|
||||||
|
|
||||||
|
if (totpURI.isNotEmpty) {
|
||||||
|
controller.text = totpURI;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget content(BuildContext context) {
|
||||||
|
return Card(
|
||||||
|
margin: EdgeInsets.zero,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
SizedBox(height: 8),
|
||||||
|
Text(
|
||||||
|
S.current.copyWalletConnectLink,
|
||||||
|
style: Theme.of(context).textTheme.bodySmall,
|
||||||
|
),
|
||||||
|
SizedBox(height: 16),
|
||||||
|
TextField(
|
||||||
|
controller: controller,
|
||||||
|
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w500, color: Colors.white),
|
||||||
|
decoration: InputDecoration(
|
||||||
|
suffixIcon: Container(
|
||||||
|
width: 24,
|
||||||
|
height: 24,
|
||||||
|
padding: EdgeInsets.only(top: 0),
|
||||||
|
child: Semantics(
|
||||||
|
label: S.of(context).paste,
|
||||||
|
child: InkWell(
|
||||||
|
onTap: () => _pasteWalletConnectURI(),
|
||||||
|
child: Container(
|
||||||
|
padding: EdgeInsets.all(8),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.all(Radius.circular(6)),
|
||||||
|
),
|
||||||
|
child: Image.asset(
|
||||||
|
'assets/images/paste_ios.png',
|
||||||
|
color:
|
||||||
|
Theme.of(context).extension<SendPageTheme>()!.textFieldButtonIconColor,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
hintText: S.current.enterWalletConnectURI,
|
||||||
|
border: OutlineInputBorder(
|
||||||
|
borderSide: BorderSide(
|
||||||
|
color: Theme.of(context).extension<SendPageTheme>()!.textFieldBorderColor,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
hintStyle: TextStyle(
|
||||||
|
color: Theme.of(context).extension<SendPageTheme>()!.textFieldHintColor,
|
||||||
|
fontWeight: FontWeight.w500,
|
||||||
|
fontSize: 14,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget actionButtons(BuildContext context) {
|
||||||
|
return Container(
|
||||||
|
width: 300,
|
||||||
|
height: 52,
|
||||||
|
padding: EdgeInsets.only(left: 12, right: 12),
|
||||||
|
color: Theme.of(context).dialogBackgroundColor,
|
||||||
|
child: ButtonTheme(
|
||||||
|
minWidth: double.infinity,
|
||||||
|
child: TextButton(
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.pop(context, controller.text);
|
||||||
|
},
|
||||||
|
child: Text(
|
||||||
|
S.current.confirm,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 15,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
color: Theme.of(context).primaryColor,
|
||||||
|
decoration: TextDecoration.none,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,8 +1,10 @@
|
||||||
|
import 'package:cake_wallet/generated/i18n.dart';
|
||||||
import 'package:cake_wallet/palette.dart';
|
import 'package:cake_wallet/palette.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class AlertCloseButton extends StatelessWidget {
|
class AlertCloseButton extends StatelessWidget {
|
||||||
AlertCloseButton({this.image, this.bottom, this.onTap});
|
AlertCloseButton({this.image, this.bottom, this.onTap});
|
||||||
|
|
||||||
final VoidCallback? onTap;
|
final VoidCallback? onTap;
|
||||||
|
|
||||||
final Image? image;
|
final Image? image;
|
||||||
|
@ -19,12 +21,17 @@ class AlertCloseButton extends StatelessWidget {
|
||||||
bottom: bottom ?? 60,
|
bottom: bottom ?? 60,
|
||||||
child: GestureDetector(
|
child: GestureDetector(
|
||||||
onTap: onTap ?? () => Navigator.of(context).pop(),
|
onTap: onTap ?? () => Navigator.of(context).pop(),
|
||||||
child: Container(
|
child: Semantics(
|
||||||
height: 42,
|
label: S.of(context).close,
|
||||||
width: 42,
|
button: true,
|
||||||
decoration: BoxDecoration(color: Colors.white, shape: BoxShape.circle),
|
enabled: true,
|
||||||
child: Center(
|
child: Container(
|
||||||
child: image ?? closeButton,
|
height: 42,
|
||||||
|
width: 42,
|
||||||
|
decoration: BoxDecoration(color: Colors.white, shape: BoxShape.circle),
|
||||||
|
child: Center(
|
||||||
|
child: image ?? closeButton,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import 'package:cake_wallet/generated/i18n.dart';
|
||||||
import 'package:cake_wallet/themes/extensions/cake_text_theme.dart';
|
import 'package:cake_wallet/themes/extensions/cake_text_theme.dart';
|
||||||
import 'package:cw_core/wallet_type.dart';
|
import 'package:cw_core/wallet_type.dart';
|
||||||
import 'package:cake_wallet/src/widgets/validable_annotated_editable_text.dart';
|
import 'package:cake_wallet/src/widgets/validable_annotated_editable_text.dart';
|
||||||
|
@ -75,7 +76,7 @@ class SeedWidgetState extends State<SeedWidget> {
|
||||||
Positioned(
|
Positioned(
|
||||||
top: 10,
|
top: 10,
|
||||||
left: 0,
|
left: 0,
|
||||||
child: Text('Enter your seed',
|
child: Text(S.of(context).enter_seed_phrase,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 16.0, color: Theme.of(context).hintColor))),
|
fontSize: 16.0, color: Theme.of(context).hintColor))),
|
||||||
Padding(
|
Padding(
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:cake_wallet/.secrets.g.dart' as secrets;
|
||||||
import 'package:cake_wallet/twitter/twitter_user.dart';
|
import 'package:cake_wallet/twitter/twitter_user.dart';
|
||||||
import 'package:http/http.dart' as http;
|
import 'package:http/http.dart' as http;
|
||||||
import 'package:cake_wallet/.secrets.g.dart' as secrets;
|
|
||||||
|
|
||||||
class TwitterApi {
|
class TwitterApi {
|
||||||
static const twitterBearerToken = secrets.twitterBearerToken;
|
static const twitterBearerToken = secrets.twitterBearerToken;
|
||||||
|
@ -10,28 +11,49 @@ class TwitterApi {
|
||||||
static const userPath = '/2/users/by/username/';
|
static const userPath = '/2/users/by/username/';
|
||||||
|
|
||||||
static Future<TwitterUser> lookupUserByName({required String userName}) async {
|
static Future<TwitterUser> lookupUserByName({required String userName}) async {
|
||||||
final queryParams = {'user.fields': 'description', 'expansions': 'pinned_tweet_id'};
|
final queryParams = {
|
||||||
|
'user.fields': 'description',
|
||||||
|
'expansions': 'pinned_tweet_id',
|
||||||
|
'tweet.fields': 'note_tweet'
|
||||||
|
};
|
||||||
final headers = {'authorization': 'Bearer $twitterBearerToken'};
|
final headers = {'authorization': 'Bearer $twitterBearerToken'};
|
||||||
|
|
||||||
final uri = Uri(
|
final uri = Uri(
|
||||||
scheme: httpsScheme,
|
scheme: httpsScheme,
|
||||||
host: apiHost,
|
host: apiHost,
|
||||||
path: userPath + userName,
|
path: userPath + userName,
|
||||||
queryParameters: queryParams,
|
queryParameters: queryParams);
|
||||||
);
|
|
||||||
|
|
||||||
var response = await http.get(uri, headers: headers);
|
final response = await http.get(uri, headers: headers).catchError((error) {
|
||||||
|
throw Exception('HTTP request failed: $error');
|
||||||
|
});
|
||||||
|
|
||||||
if (response.statusCode != 200) {
|
if (response.statusCode != 200) {
|
||||||
throw Exception('Unexpected http status: ${response.statusCode}');
|
throw Exception('Unexpected http status: ${response.statusCode}');
|
||||||
}
|
}
|
||||||
final responseJSON = json.decode(response.body) as Map<String, dynamic>;
|
|
||||||
|
|
||||||
|
final Map<String, dynamic> responseJSON = jsonDecode(response.body) as Map<String, dynamic>;
|
||||||
if (responseJSON['errors'] != null) {
|
if (responseJSON['errors'] != null) {
|
||||||
throw Exception(responseJSON['errors'][0]['detail']);
|
throw Exception(responseJSON['errors'][0]['detail']);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TwitterUser.fromJson(responseJSON);
|
return TwitterUser.fromJson(responseJSON, _getPinnedTweet(responseJSON));
|
||||||
|
}
|
||||||
|
|
||||||
|
static Tweet? _getPinnedTweet(Map<String, dynamic> responseJSON) {
|
||||||
|
final tweetId = responseJSON['data']['pinned_tweet_id'] as String?;
|
||||||
|
if (tweetId == null || responseJSON['includes'] == null) return null;
|
||||||
|
|
||||||
|
final tweetIncludes = List.from(responseJSON['includes']['tweets'] as List);
|
||||||
|
final pinnedTweetData = tweetIncludes.firstWhere(
|
||||||
|
(tweet) => tweet['id'] == tweetId,
|
||||||
|
orElse: () => null,
|
||||||
|
) as Map<String, dynamic>?;
|
||||||
|
|
||||||
|
if (pinnedTweetData == null) return null;
|
||||||
|
|
||||||
|
final pinnedTweetText =
|
||||||
|
(pinnedTweetData['note_tweet']?['text'] ?? pinnedTweetData['text']) as String;
|
||||||
|
|
||||||
|
return Tweet(id: tweetId, text: pinnedTweetText);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,25 +4,21 @@ class TwitterUser {
|
||||||
required this.username,
|
required this.username,
|
||||||
required this.name,
|
required this.name,
|
||||||
required this.description,
|
required this.description,
|
||||||
this.tweets});
|
this.pinnedTweet});
|
||||||
|
|
||||||
final String id;
|
final String id;
|
||||||
final String username;
|
final String username;
|
||||||
final String name;
|
final String name;
|
||||||
final String description;
|
final String description;
|
||||||
final List<Tweet>? tweets;
|
final Tweet? pinnedTweet;
|
||||||
|
|
||||||
factory TwitterUser.fromJson(Map<String, dynamic> json) {
|
factory TwitterUser.fromJson(Map<String, dynamic> json, [Tweet? pinnedTweet]) {
|
||||||
return TwitterUser(
|
return TwitterUser(
|
||||||
id: json['data']['id'] as String,
|
id: json['data']['id'] as String,
|
||||||
username: json['data']['username'] as String,
|
username: json['data']['username'] as String,
|
||||||
name: json['data']['name'] as String,
|
name: json['data']['name'] as String,
|
||||||
description: json['data']['description'] as String? ?? '',
|
description: json['data']['description'] as String? ?? '',
|
||||||
tweets: json['includes'] != null
|
pinnedTweet: pinnedTweet,
|
||||||
? List.from(json['includes']['tweets'] as List)
|
|
||||||
.map((e) => Tweet.fromJson(e as Map<String, dynamic>))
|
|
||||||
.toList()
|
|
||||||
: null,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -185,15 +185,15 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
|
||||||
@computed
|
@computed
|
||||||
bool get hasCoinControl =>
|
bool get hasCoinControl =>
|
||||||
wallet.type == WalletType.bitcoin ||
|
wallet.type == WalletType.bitcoin ||
|
||||||
wallet.type == WalletType.litecoin ||
|
wallet.type == WalletType.litecoin ||
|
||||||
wallet.type == WalletType.monero ||
|
wallet.type == WalletType.monero ||
|
||||||
wallet.type == WalletType.bitcoinCash;
|
wallet.type == WalletType.bitcoinCash;
|
||||||
|
|
||||||
@computed
|
@computed
|
||||||
bool get isElectrumWallet =>
|
bool get isElectrumWallet =>
|
||||||
wallet.type == WalletType.bitcoin ||
|
wallet.type == WalletType.bitcoin ||
|
||||||
wallet.type == WalletType.litecoin ||
|
wallet.type == WalletType.litecoin ||
|
||||||
wallet.type == WalletType.bitcoinCash;
|
wallet.type == WalletType.bitcoinCash;
|
||||||
|
|
||||||
@computed
|
@computed
|
||||||
bool get hasFees => wallet.type != WalletType.nano && wallet.type != WalletType.banano;
|
bool get hasFees => wallet.type != WalletType.nano && wallet.type != WalletType.banano;
|
||||||
|
@ -281,7 +281,6 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
|
||||||
List<bool> conditionsList = [];
|
List<bool> conditionsList = [];
|
||||||
|
|
||||||
for (var output in outputs) {
|
for (var output in outputs) {
|
||||||
|
|
||||||
final show = checkThroughChecksToDisplayTOTP(output.extractedAddress);
|
final show = checkThroughChecksToDisplayTOTP(output.extractedAddress);
|
||||||
conditionsList.add(show);
|
conditionsList.add(show);
|
||||||
}
|
}
|
||||||
|
@ -350,31 +349,27 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
|
||||||
Object _credentials() {
|
Object _credentials() {
|
||||||
final priority = _settingsStore.priority[wallet.type];
|
final priority = _settingsStore.priority[wallet.type];
|
||||||
|
|
||||||
if (priority == null) throw Exception('Priority is null for wallet type: ${wallet.type}');
|
if (priority == null && wallet.type != WalletType.nano) {
|
||||||
|
throw Exception('Priority is null for wallet type: ${wallet.type}');
|
||||||
|
}
|
||||||
|
|
||||||
switch (wallet.type) {
|
switch (wallet.type) {
|
||||||
case WalletType.bitcoin:
|
case WalletType.bitcoin:
|
||||||
case WalletType.litecoin:
|
case WalletType.litecoin:
|
||||||
case WalletType.bitcoinCash:
|
case WalletType.bitcoinCash:
|
||||||
return bitcoin!.createBitcoinTransactionCredentials(outputs, priority: priority);
|
return bitcoin!.createBitcoinTransactionCredentials(outputs, priority: priority!);
|
||||||
|
|
||||||
case WalletType.monero:
|
case WalletType.monero:
|
||||||
return monero!
|
return monero!
|
||||||
.createMoneroTransactionCreationCredentials(outputs: outputs, priority: priority);
|
.createMoneroTransactionCreationCredentials(outputs: outputs, priority: priority!);
|
||||||
|
|
||||||
case WalletType.haven:
|
case WalletType.haven:
|
||||||
return haven!.createHavenTransactionCreationCredentials(
|
return haven!.createHavenTransactionCreationCredentials(
|
||||||
outputs: outputs, priority: priority, assetType: selectedCryptoCurrency.title);
|
outputs: outputs, priority: priority!, assetType: selectedCryptoCurrency.title);
|
||||||
|
|
||||||
case WalletType.ethereum:
|
case WalletType.ethereum:
|
||||||
final priority = _settingsStore.priority[wallet.type];
|
|
||||||
|
|
||||||
if (priority == null) {
|
|
||||||
throw Exception('Priority is null for wallet type: ${wallet.type}');
|
|
||||||
}
|
|
||||||
|
|
||||||
return ethereum!.createEthereumTransactionCredentials(outputs,
|
return ethereum!.createEthereumTransactionCredentials(outputs,
|
||||||
priority: priority, currency: selectedCryptoCurrency);
|
priority: priority!, currency: selectedCryptoCurrency);
|
||||||
case WalletType.nano:
|
case WalletType.nano:
|
||||||
return nano!.createNanoTransactionCredentials(outputs);
|
return nano!.createNanoTransactionCredentials(outputs);
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -103,7 +103,7 @@ EXTERNAL SOURCES:
|
||||||
|
|
||||||
SPEC CHECKSUMS:
|
SPEC CHECKSUMS:
|
||||||
connectivity_plus_macos: f6e86fd000e971d361e54b5afcadc8c8fa773308
|
connectivity_plus_macos: f6e86fd000e971d361e54b5afcadc8c8fa773308
|
||||||
cw_monero: ec03de55a19c4a2b174ea687e0f4202edc716fa4
|
cw_monero: f8b7f104508efba2591548e76b5c058d05cba3f0
|
||||||
device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f
|
device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f
|
||||||
devicelocale: 9f0f36ac651cabae2c33f32dcff4f32b61c38225
|
devicelocale: 9f0f36ac651cabae2c33f32dcff4f32b61c38225
|
||||||
flutter_secure_storage_macos: d56e2d218c1130b262bef8b4a7d64f88d7f9c9ea
|
flutter_secure_storage_macos: d56e2d218c1130b262bef8b4a7d64f88d7f9c9ea
|
||||||
|
|
0
model_generator.sh
Normal file → Executable file
0
model_generator.sh
Normal file → Executable file
|
@ -723,5 +723,10 @@
|
||||||
"message": "ﺔﻟﺎﺳﺭ",
|
"message": "ﺔﻟﺎﺳﺭ",
|
||||||
"do_not_have_enough_gas_asset": "ليس لديك ما يكفي من ${currency} لإجراء معاملة وفقًا لشروط شبكة blockchain الحالية. أنت بحاجة إلى المزيد من ${currency} لدفع رسوم شبكة blockchain، حتى لو كنت ترسل أصلًا مختلفًا.",
|
"do_not_have_enough_gas_asset": "ليس لديك ما يكفي من ${currency} لإجراء معاملة وفقًا لشروط شبكة blockchain الحالية. أنت بحاجة إلى المزيد من ${currency} لدفع رسوم شبكة blockchain، حتى لو كنت ترسل أصلًا مختلفًا.",
|
||||||
"totp_auth_url": "TOTP ﺔﻗﺩﺎﺼﻤﻟ URL ﻥﺍﻮﻨﻋ",
|
"totp_auth_url": "TOTP ﺔﻗﺩﺎﺼﻤﻟ URL ﻥﺍﻮﻨﻋ",
|
||||||
"awaitDAppProcessing": ".ﺔﺠﻟﺎﻌﻤﻟﺍ ﻦﻣ dApp ﻲﻬﺘﻨﻳ ﻰﺘﺣ ﺭﺎﻈﺘﻧﻻﺍ ﻰﺟﺮﻳ"
|
"awaitDAppProcessing": ".ﺔﺠﻟﺎﻌﻤﻟﺍ ﻦﻣ dApp ﻲﻬﺘﻨﻳ ﻰﺘﺣ ﺭﺎﻈﺘﻧﻻﺍ ﻰﺟﺮﻳ",
|
||||||
|
"copyWalletConnectLink": "ﺎﻨﻫ ﻪﻘﺼﻟﺍﻭ dApp ﻦﻣ WalletConnect ﻂﺑﺍﺭ ﺦﺴﻧﺍ",
|
||||||
|
"enterWalletConnectURI": "WalletConnect ـﻟ URI ﻞﺧﺩﺃ",
|
||||||
|
"seed_key": "مفتاح البذور",
|
||||||
|
"enter_seed_phrase": "أدخل عبارة البذور الخاصة بك",
|
||||||
|
"add_contact": " ﻝﺎﺼﺗﺍ ﺔﻬﺟ ﺔﻓﺎﺿﺇ"
|
||||||
}
|
}
|
||||||
|
|
|
@ -719,5 +719,10 @@
|
||||||
"message": "Съобщение",
|
"message": "Съобщение",
|
||||||
"do_not_have_enough_gas_asset": "Нямате достатъчно ${currency}, за да извършите транзакция с текущите условия на блокчейн мрежата. Имате нужда от повече ${currency}, за да платите таксите за блокчейн мрежа, дори ако изпращате различен актив.",
|
"do_not_have_enough_gas_asset": "Нямате достатъчно ${currency}, за да извършите транзакция с текущите условия на блокчейн мрежата. Имате нужда от повече ${currency}, за да платите таксите за блокчейн мрежа, дори ако изпращате различен актив.",
|
||||||
"totp_auth_url": "TOTP AUTH URL",
|
"totp_auth_url": "TOTP AUTH URL",
|
||||||
"awaitDAppProcessing": "Моля, изчакайте dApp да завърши обработката."
|
"awaitDAppProcessing": "Моля, изчакайте dApp да завърши обработката.",
|
||||||
|
"copyWalletConnectLink": "Копирайте връзката WalletConnect от dApp и я поставете тук",
|
||||||
|
"enterWalletConnectURI": "Въведете URI на WalletConnect",
|
||||||
|
"seed_key": "Ключ за семена",
|
||||||
|
"enter_seed_phrase": "Въведете вашата фраза за семена",
|
||||||
|
"add_contact": "Добави контакт"
|
||||||
}
|
}
|
||||||
|
|
|
@ -719,5 +719,10 @@
|
||||||
"message": "Zpráva",
|
"message": "Zpráva",
|
||||||
"do_not_have_enough_gas_asset": "Nemáte dostatek ${currency} k provedení transakce s aktuálními podmínkami blockchainové sítě. K placení poplatků za blockchainovou síť potřebujete více ${currency}, i když posíláte jiné aktivum.",
|
"do_not_have_enough_gas_asset": "Nemáte dostatek ${currency} k provedení transakce s aktuálními podmínkami blockchainové sítě. K placení poplatků za blockchainovou síť potřebujete více ${currency}, i když posíláte jiné aktivum.",
|
||||||
"totp_auth_url": "URL AUTH TOTP",
|
"totp_auth_url": "URL AUTH TOTP",
|
||||||
"awaitDAppProcessing": "Počkejte, až dApp dokončí zpracování."
|
"awaitDAppProcessing": "Počkejte, až dApp dokončí zpracování.",
|
||||||
|
"copyWalletConnectLink": "Zkopírujte odkaz WalletConnect z dApp a vložte jej sem",
|
||||||
|
"enterWalletConnectURI": "Zadejte identifikátor URI WalletConnect",
|
||||||
|
"seed_key": "Klíč semen",
|
||||||
|
"enter_seed_phrase": "Zadejte svou frázi semen",
|
||||||
|
"add_contact": "Přidat kontakt"
|
||||||
}
|
}
|
||||||
|
|
|
@ -727,5 +727,10 @@
|
||||||
"message": "Nachricht",
|
"message": "Nachricht",
|
||||||
"do_not_have_enough_gas_asset": "Sie verfügen nicht über genügend ${currency}, um eine Transaktion unter den aktuellen Bedingungen des Blockchain-Netzwerks durchzuführen. Sie benötigen mehr ${currency}, um die Gebühren für das Blockchain-Netzwerk zu bezahlen, auch wenn Sie einen anderen Vermögenswert senden.",
|
"do_not_have_enough_gas_asset": "Sie verfügen nicht über genügend ${currency}, um eine Transaktion unter den aktuellen Bedingungen des Blockchain-Netzwerks durchzuführen. Sie benötigen mehr ${currency}, um die Gebühren für das Blockchain-Netzwerk zu bezahlen, auch wenn Sie einen anderen Vermögenswert senden.",
|
||||||
"totp_auth_url": "TOTP-Auth-URL",
|
"totp_auth_url": "TOTP-Auth-URL",
|
||||||
"awaitDAppProcessing": "Bitte warten Sie, bis die dApp die Verarbeitung abgeschlossen hat."
|
"awaitDAppProcessing": "Bitte warten Sie, bis die dApp die Verarbeitung abgeschlossen hat.",
|
||||||
|
"copyWalletConnectLink": "Kopieren Sie den WalletConnect-Link von dApp und fügen Sie ihn hier ein",
|
||||||
|
"enterWalletConnectURI": "Geben Sie den WalletConnect-URI ein",
|
||||||
|
"seed_key": "Samenschlüssel",
|
||||||
|
"enter_seed_phrase": "Geben Sie Ihre Samenphrase ein",
|
||||||
|
"add_contact": "Kontakt hinzufügen"
|
||||||
}
|
}
|
||||||
|
|
|
@ -728,5 +728,10 @@
|
||||||
"message": "Message",
|
"message": "Message",
|
||||||
"do_not_have_enough_gas_asset": "You do not have enough ${currency} to make a transaction with the current blockchain network conditions. You need more ${currency} to pay blockchain network fees, even if you are sending a different asset.",
|
"do_not_have_enough_gas_asset": "You do not have enough ${currency} to make a transaction with the current blockchain network conditions. You need more ${currency} to pay blockchain network fees, even if you are sending a different asset.",
|
||||||
"totp_auth_url": "TOTP AUTH URL",
|
"totp_auth_url": "TOTP AUTH URL",
|
||||||
"awaitDAppProcessing": "Kindly wait for the dApp to finish processing."
|
"awaitDAppProcessing": "Kindly wait for the dApp to finish processing.",
|
||||||
|
"copyWalletConnectLink": "Copy the WalletConnect link from dApp and paste here",
|
||||||
|
"enterWalletConnectURI": "Enter WalletConnect URI",
|
||||||
|
"seed_key": "Seed key",
|
||||||
|
"enter_seed_phrase": "Enter your seed phrase",
|
||||||
|
"add_contact": "Add contact"
|
||||||
}
|
}
|
||||||
|
|
|
@ -727,5 +727,10 @@
|
||||||
"message": "Mensaje",
|
"message": "Mensaje",
|
||||||
"do_not_have_enough_gas_asset": "No tienes suficiente ${currency} para realizar una transacción con las condiciones actuales de la red blockchain. Necesita más ${currency} para pagar las tarifas de la red blockchain, incluso si envía un activo diferente.",
|
"do_not_have_enough_gas_asset": "No tienes suficiente ${currency} para realizar una transacción con las condiciones actuales de la red blockchain. Necesita más ${currency} para pagar las tarifas de la red blockchain, incluso si envía un activo diferente.",
|
||||||
"totp_auth_url": "URL de autenticación TOTP",
|
"totp_auth_url": "URL de autenticación TOTP",
|
||||||
"awaitDAppProcessing": "Espere a que la dApp termine de procesarse."
|
"awaitDAppProcessing": "Espere a que la dApp termine de procesarse.",
|
||||||
|
"copyWalletConnectLink": "Copie el enlace de WalletConnect de dApp y péguelo aquí",
|
||||||
|
"enterWalletConnectURI": "Ingrese el URI de WalletConnect",
|
||||||
|
"seed_key": "Llave de semilla",
|
||||||
|
"enter_seed_phrase": "Ingrese su frase de semillas",
|
||||||
|
"add_contact": "Agregar contacto"
|
||||||
}
|
}
|
||||||
|
|
|
@ -727,5 +727,10 @@
|
||||||
"message": "Message",
|
"message": "Message",
|
||||||
"do_not_have_enough_gas_asset": "Vous n'avez pas assez de ${currency} pour effectuer une transaction avec les conditions actuelles du réseau blockchain. Vous avez besoin de plus de ${currency} pour payer les frais du réseau blockchain, même si vous envoyez un actif différent.",
|
"do_not_have_enough_gas_asset": "Vous n'avez pas assez de ${currency} pour effectuer une transaction avec les conditions actuelles du réseau blockchain. Vous avez besoin de plus de ${currency} pour payer les frais du réseau blockchain, même si vous envoyez un actif différent.",
|
||||||
"totp_auth_url": "URL D'AUTORISATION TOTP",
|
"totp_auth_url": "URL D'AUTORISATION TOTP",
|
||||||
"awaitDAppProcessing": "Veuillez attendre que le dApp termine le traitement."
|
"awaitDAppProcessing": "Veuillez attendre que le dApp termine le traitement.",
|
||||||
|
"copyWalletConnectLink": "Copiez le lien WalletConnect depuis dApp et collez-le ici",
|
||||||
|
"enterWalletConnectURI": "Saisissez l'URI de WalletConnect.",
|
||||||
|
"seed_key": "Clé de graines",
|
||||||
|
"enter_seed_phrase": "Entrez votre phrase de semence",
|
||||||
|
"add_contact": "Ajouter le contact"
|
||||||
}
|
}
|
||||||
|
|
|
@ -705,5 +705,10 @@
|
||||||
"message": "Sako",
|
"message": "Sako",
|
||||||
"do_not_have_enough_gas_asset": "Ba ku da isassun ${currency} don yin ma'amala tare da yanayin cibiyar sadarwar blockchain na yanzu. Kuna buƙatar ƙarin ${currency} don biyan kuɗaɗen cibiyar sadarwar blockchain, koda kuwa kuna aika wata kadara daban.",
|
"do_not_have_enough_gas_asset": "Ba ku da isassun ${currency} don yin ma'amala tare da yanayin cibiyar sadarwar blockchain na yanzu. Kuna buƙatar ƙarin ${currency} don biyan kuɗaɗen cibiyar sadarwar blockchain, koda kuwa kuna aika wata kadara daban.",
|
||||||
"totp_auth_url": "TOTP AUTH URL",
|
"totp_auth_url": "TOTP AUTH URL",
|
||||||
"awaitDAppProcessing": "Da fatan za a jira dApp ya gama aiki."
|
"awaitDAppProcessing": "Da fatan za a jira dApp ya gama aiki.",
|
||||||
|
"copyWalletConnectLink": "Kwafi hanyar haɗin WalletConnect daga dApp kuma liƙa a nan",
|
||||||
|
"enterWalletConnectURI": "Shigar da WalletConnect URI",
|
||||||
|
"seed_key": "Maɓallin iri",
|
||||||
|
"enter_seed_phrase": "Shigar da Sert Sentarku",
|
||||||
|
"add_contact": "Ƙara lamba"
|
||||||
}
|
}
|
||||||
|
|
|
@ -727,5 +727,10 @@
|
||||||
"message": "संदेश",
|
"message": "संदेश",
|
||||||
"do_not_have_enough_gas_asset": "वर्तमान ब्लॉकचेन नेटवर्क स्थितियों में लेनदेन करने के लिए आपके पास पर्याप्त ${currency} नहीं है। ब्लॉकचेन नेटवर्क शुल्क का भुगतान करने के लिए आपको अधिक ${currency} की आवश्यकता है, भले ही आप एक अलग संपत्ति भेज रहे हों।",
|
"do_not_have_enough_gas_asset": "वर्तमान ब्लॉकचेन नेटवर्क स्थितियों में लेनदेन करने के लिए आपके पास पर्याप्त ${currency} नहीं है। ब्लॉकचेन नेटवर्क शुल्क का भुगतान करने के लिए आपको अधिक ${currency} की आवश्यकता है, भले ही आप एक अलग संपत्ति भेज रहे हों।",
|
||||||
"totp_auth_url": "TOTP प्रामाणिक यूआरएल",
|
"totp_auth_url": "TOTP प्रामाणिक यूआरएल",
|
||||||
"awaitDAppProcessing": "कृपया डीएपी की प्रोसेसिंग पूरी होने तक प्रतीक्षा करें।"
|
"awaitDAppProcessing": "कृपया डीएपी की प्रोसेसिंग पूरी होने तक प्रतीक्षा करें।",
|
||||||
|
"copyWalletConnectLink": "dApp से वॉलेटकनेक्ट लिंक को कॉपी करें और यहां पेस्ट करें",
|
||||||
|
"enterWalletConnectURI": "वॉलेटकनेक्ट यूआरआई दर्ज करें",
|
||||||
|
"seed_key": "बीज कुंजी",
|
||||||
|
"enter_seed_phrase": "अपना बीज वाक्यांश दर्ज करें",
|
||||||
|
"add_contact": "संपर्क जोड़ें"
|
||||||
}
|
}
|
||||||
|
|
|
@ -725,5 +725,10 @@
|
||||||
"message": "Poruka",
|
"message": "Poruka",
|
||||||
"do_not_have_enough_gas_asset": "Nemate dovoljno ${currency} da izvršite transakciju s trenutačnim uvjetima blockchain mreže. Trebate više ${currency} da platite naknade za blockchain mrežu, čak i ako šaljete drugu imovinu.",
|
"do_not_have_enough_gas_asset": "Nemate dovoljno ${currency} da izvršite transakciju s trenutačnim uvjetima blockchain mreže. Trebate više ${currency} da platite naknade za blockchain mrežu, čak i ako šaljete drugu imovinu.",
|
||||||
"totp_auth_url": "TOTP AUTH URL",
|
"totp_auth_url": "TOTP AUTH URL",
|
||||||
"awaitDAppProcessing": "Molimo pričekajte da dApp završi obradu."
|
"awaitDAppProcessing": "Molimo pričekajte da dApp završi obradu.",
|
||||||
|
"copyWalletConnectLink": "Kopirajte vezu WalletConnect iz dApp-a i zalijepite je ovdje",
|
||||||
|
"enterWalletConnectURI": "Unesite WalletConnect URI",
|
||||||
|
"seed_key": "Sjemenski ključ",
|
||||||
|
"enter_seed_phrase": "Unesite svoju sjemensku frazu",
|
||||||
|
"add_contact": "Dodaj kontakt"
|
||||||
}
|
}
|
||||||
|
|
|
@ -715,5 +715,10 @@
|
||||||
"message": "Pesan",
|
"message": "Pesan",
|
||||||
"do_not_have_enough_gas_asset": "Anda tidak memiliki cukup ${currency} untuk melakukan transaksi dengan kondisi jaringan blockchain saat ini. Anda memerlukan lebih banyak ${currency} untuk membayar biaya jaringan blockchain, meskipun Anda mengirimkan aset yang berbeda.",
|
"do_not_have_enough_gas_asset": "Anda tidak memiliki cukup ${currency} untuk melakukan transaksi dengan kondisi jaringan blockchain saat ini. Anda memerlukan lebih banyak ${currency} untuk membayar biaya jaringan blockchain, meskipun Anda mengirimkan aset yang berbeda.",
|
||||||
"totp_auth_url": "URL Otentikasi TOTP",
|
"totp_auth_url": "URL Otentikasi TOTP",
|
||||||
"awaitDAppProcessing": "Mohon tunggu hingga dApp menyelesaikan pemrosesan."
|
"awaitDAppProcessing": "Mohon tunggu hingga dApp menyelesaikan pemrosesan.",
|
||||||
|
"copyWalletConnectLink": "Salin tautan WalletConnect dari dApp dan tempel di sini",
|
||||||
|
"enterWalletConnectURI": "Masukkan URI WalletConnect",
|
||||||
|
"seed_key": "Kunci benih",
|
||||||
|
"enter_seed_phrase": "Masukkan frasa benih Anda",
|
||||||
|
"add_contact": "Tambah kontak"
|
||||||
}
|
}
|
||||||
|
|
|
@ -727,5 +727,10 @@
|
||||||
"message": "Messaggio",
|
"message": "Messaggio",
|
||||||
"do_not_have_enough_gas_asset": "Non hai abbastanza ${currency} per effettuare una transazione con le attuali condizioni della rete blockchain. Hai bisogno di più ${currency} per pagare le commissioni della rete blockchain, anche se stai inviando una risorsa diversa.",
|
"do_not_have_enough_gas_asset": "Non hai abbastanza ${currency} per effettuare una transazione con le attuali condizioni della rete blockchain. Hai bisogno di più ${currency} per pagare le commissioni della rete blockchain, anche se stai inviando una risorsa diversa.",
|
||||||
"totp_auth_url": "URL DI AUT. TOTP",
|
"totp_auth_url": "URL DI AUT. TOTP",
|
||||||
"awaitDAppProcessing": "Attendi gentilmente che la dApp termini l'elaborazione."
|
"awaitDAppProcessing": "Attendi gentilmente che la dApp termini l'elaborazione.",
|
||||||
|
"copyWalletConnectLink": "Copia il collegamento WalletConnect dalla dApp e incollalo qui",
|
||||||
|
"enterWalletConnectURI": "Inserisci l'URI di WalletConnect",
|
||||||
|
"seed_key": "Chiave di semi",
|
||||||
|
"enter_seed_phrase": "Inserisci la tua frase di semi",
|
||||||
|
"add_contact": "Aggiungi contatto"
|
||||||
}
|
}
|
||||||
|
|
|
@ -727,5 +727,10 @@
|
||||||
"message": "メッセージ",
|
"message": "メッセージ",
|
||||||
"do_not_have_enough_gas_asset": "現在のブロックチェーン ネットワークの状況では、トランザクションを行うのに十分な ${currency} がありません。別のアセットを送信する場合でも、ブロックチェーン ネットワーク料金を支払うにはさらに ${currency} が必要です。",
|
"do_not_have_enough_gas_asset": "現在のブロックチェーン ネットワークの状況では、トランザクションを行うのに十分な ${currency} がありません。別のアセットを送信する場合でも、ブロックチェーン ネットワーク料金を支払うにはさらに ${currency} が必要です。",
|
||||||
"totp_auth_url": "TOTP認証URL",
|
"totp_auth_url": "TOTP認証URL",
|
||||||
"awaitDAppProcessing": "dAppの処理が完了するまでお待ちください。"
|
"awaitDAppProcessing": "dAppの処理が完了するまでお待ちください。",
|
||||||
|
"copyWalletConnectLink": "dApp から WalletConnect リンクをコピーし、ここに貼り付けます",
|
||||||
|
"enterWalletConnectURI": "WalletConnect URI を入力してください",
|
||||||
|
"seed_key": "シードキー",
|
||||||
|
"enter_seed_phrase": "シードフレーズを入力してください",
|
||||||
|
"add_contact": "連絡先を追加"
|
||||||
}
|
}
|
||||||
|
|
|
@ -725,5 +725,10 @@
|
||||||
"message": "메시지",
|
"message": "메시지",
|
||||||
"do_not_have_enough_gas_asset": "현재 블록체인 네트워크 조건으로 거래를 하기에는 ${currency}이(가) 충분하지 않습니다. 다른 자산을 보내더라도 블록체인 네트워크 수수료를 지불하려면 ${currency}가 더 필요합니다.",
|
"do_not_have_enough_gas_asset": "현재 블록체인 네트워크 조건으로 거래를 하기에는 ${currency}이(가) 충분하지 않습니다. 다른 자산을 보내더라도 블록체인 네트워크 수수료를 지불하려면 ${currency}가 더 필요합니다.",
|
||||||
"totp_auth_url": "TOTP 인증 URL",
|
"totp_auth_url": "TOTP 인증 URL",
|
||||||
"awaitDAppProcessing": "dApp이 처리를 마칠 때까지 기다려주세요."
|
"awaitDAppProcessing": "dApp이 처리를 마칠 때까지 기다려주세요.",
|
||||||
|
"copyWalletConnectLink": "dApp에서 WalletConnect 링크를 복사하여 여기에 붙여넣으세요.",
|
||||||
|
"enterWalletConnectURI": "WalletConnect URI를 입력하세요.",
|
||||||
|
"seed_key": "시드 키",
|
||||||
|
"enter_seed_phrase": "시드 문구를 입력하십시오",
|
||||||
|
"add_contact": "주소록에 추가"
|
||||||
}
|
}
|
||||||
|
|
|
@ -725,5 +725,10 @@
|
||||||
"message": "မက်ဆေ့ချ်",
|
"message": "မက်ဆေ့ချ်",
|
||||||
"do_not_have_enough_gas_asset": "လက်ရှိ blockchain ကွန်ရက်အခြေအနေများနှင့် အရောင်းအဝယ်ပြုလုပ်ရန် သင့်တွင် ${currency} လုံလောက်မှုမရှိပါ။ သင်သည် မတူညီသော ပိုင်ဆိုင်မှုတစ်ခုကို ပေးပို့နေသော်လည်း blockchain ကွန်ရက်အခကြေးငွေကို ပေးဆောင်ရန် သင်သည် နောက်ထပ် ${currency} လိုအပ်ပါသည်။",
|
"do_not_have_enough_gas_asset": "လက်ရှိ blockchain ကွန်ရက်အခြေအနေများနှင့် အရောင်းအဝယ်ပြုလုပ်ရန် သင့်တွင် ${currency} လုံလောက်မှုမရှိပါ။ သင်သည် မတူညီသော ပိုင်ဆိုင်မှုတစ်ခုကို ပေးပို့နေသော်လည်း blockchain ကွန်ရက်အခကြေးငွေကို ပေးဆောင်ရန် သင်သည် နောက်ထပ် ${currency} လိုအပ်ပါသည်။",
|
||||||
"totp_auth_url": "TOTP AUTH URL",
|
"totp_auth_url": "TOTP AUTH URL",
|
||||||
"awaitDAppProcessing": "ကျေးဇူးပြု၍ dApp ကို စီမံလုပ်ဆောင်ခြင်း အပြီးသတ်ရန် စောင့်ပါ။"
|
"awaitDAppProcessing": "ကျေးဇူးပြု၍ dApp ကို စီမံလုပ်ဆောင်ခြင်း အပြီးသတ်ရန် စောင့်ပါ။",
|
||||||
|
"copyWalletConnectLink": "dApp မှ WalletConnect လင့်ခ်ကို ကူးယူပြီး ဤနေရာတွင် ကူးထည့်ပါ။",
|
||||||
|
"enterWalletConnectURI": "WalletConnect URI ကိုရိုက်ထည့်ပါ။",
|
||||||
|
"seed_key": "မျိုးစေ့သော့",
|
||||||
|
"enter_seed_phrase": "သင့်ရဲ့မျိုးစေ့စကားစုကိုရိုက်ထည့်ပါ",
|
||||||
|
"add_contact": "အဆက်အသွယ်ထည့်ပါ။"
|
||||||
}
|
}
|
||||||
|
|
|
@ -727,5 +727,10 @@
|
||||||
"message": "Bericht",
|
"message": "Bericht",
|
||||||
"do_not_have_enough_gas_asset": "U heeft niet genoeg ${currency} om een transactie uit te voeren met de huidige blockchain-netwerkomstandigheden. U heeft meer ${currency} nodig om blockchain-netwerkkosten te betalen, zelfs als u een ander item verzendt.",
|
"do_not_have_enough_gas_asset": "U heeft niet genoeg ${currency} om een transactie uit te voeren met de huidige blockchain-netwerkomstandigheden. U heeft meer ${currency} nodig om blockchain-netwerkkosten te betalen, zelfs als u een ander item verzendt.",
|
||||||
"totp_auth_url": "TOTP AUTH-URL",
|
"totp_auth_url": "TOTP AUTH-URL",
|
||||||
"awaitDAppProcessing": "Wacht tot de dApp klaar is met verwerken."
|
"awaitDAppProcessing": "Wacht tot de dApp klaar is met verwerken.",
|
||||||
|
"copyWalletConnectLink": "Kopieer de WalletConnect-link van dApp en plak deze hier",
|
||||||
|
"enterWalletConnectURI": "Voer WalletConnect-URI in",
|
||||||
|
"seed_key": "Zaadsleutel",
|
||||||
|
"enter_seed_phrase": "Voer uw zaadzin in",
|
||||||
|
"add_contact": "Contactpersoon toevoegen"
|
||||||
}
|
}
|
||||||
|
|
|
@ -727,5 +727,10 @@
|
||||||
"message": "Wiadomość",
|
"message": "Wiadomość",
|
||||||
"do_not_have_enough_gas_asset": "Nie masz wystarczającej ilości ${currency}, aby dokonać transakcji przy bieżących warunkach sieci blockchain. Potrzebujesz więcej ${currency}, aby uiścić opłaty za sieć blockchain, nawet jeśli wysyłasz inny zasób.",
|
"do_not_have_enough_gas_asset": "Nie masz wystarczającej ilości ${currency}, aby dokonać transakcji przy bieżących warunkach sieci blockchain. Potrzebujesz więcej ${currency}, aby uiścić opłaty za sieć blockchain, nawet jeśli wysyłasz inny zasób.",
|
||||||
"totp_auth_url": "Adres URL TOTP AUTH",
|
"totp_auth_url": "Adres URL TOTP AUTH",
|
||||||
"awaitDAppProcessing": "Poczekaj, aż dApp zakończy przetwarzanie."
|
"awaitDAppProcessing": "Poczekaj, aż dApp zakończy przetwarzanie.",
|
||||||
|
"copyWalletConnectLink": "Skopiuj link do WalletConnect z dApp i wklej tutaj",
|
||||||
|
"enterWalletConnectURI": "Wprowadź identyfikator URI WalletConnect",
|
||||||
|
"seed_key": "Klucz nasion",
|
||||||
|
"enter_seed_phrase": "Wprowadź swoją frazę nasienną",
|
||||||
|
"add_contact": "Dodaj kontakt"
|
||||||
}
|
}
|
||||||
|
|
|
@ -726,5 +726,10 @@
|
||||||
"message": "Mensagem",
|
"message": "Mensagem",
|
||||||
"do_not_have_enough_gas_asset": "Você não tem ${currency} suficiente para fazer uma transação com as condições atuais da rede blockchain. Você precisa de mais ${currency} para pagar as taxas da rede blockchain, mesmo se estiver enviando um ativo diferente.",
|
"do_not_have_enough_gas_asset": "Você não tem ${currency} suficiente para fazer uma transação com as condições atuais da rede blockchain. Você precisa de mais ${currency} para pagar as taxas da rede blockchain, mesmo se estiver enviando um ativo diferente.",
|
||||||
"totp_auth_url": "URL de autenticação TOTP",
|
"totp_auth_url": "URL de autenticação TOTP",
|
||||||
"awaitDAppProcessing": "Aguarde até que o dApp termine o processamento."
|
"awaitDAppProcessing": "Aguarde até que o dApp termine o processamento.",
|
||||||
|
"copyWalletConnectLink": "Copie o link WalletConnect do dApp e cole aqui",
|
||||||
|
"enterWalletConnectURI": "Insira o URI do WalletConnect",
|
||||||
|
"seed_key": "Chave de semente",
|
||||||
|
"enter_seed_phrase": "Digite sua frase de semente",
|
||||||
|
"add_contact": "Adicionar contato"
|
||||||
}
|
}
|
||||||
|
|
|
@ -727,5 +727,10 @@
|
||||||
"message": "Сообщение",
|
"message": "Сообщение",
|
||||||
"do_not_have_enough_gas_asset": "У вас недостаточно ${currency} для совершения транзакции при текущих условиях сети блокчейн. Вам нужно больше ${currency} для оплаты комиссий за сеть блокчейна, даже если вы отправляете другой актив.",
|
"do_not_have_enough_gas_asset": "У вас недостаточно ${currency} для совершения транзакции при текущих условиях сети блокчейн. Вам нужно больше ${currency} для оплаты комиссий за сеть блокчейна, даже если вы отправляете другой актив.",
|
||||||
"totp_auth_url": "URL-адрес TOTP-АВТОРИЗАЦИИ",
|
"totp_auth_url": "URL-адрес TOTP-АВТОРИЗАЦИИ",
|
||||||
"awaitDAppProcessing": "Пожалуйста, подождите, пока dApp завершит обработку."
|
"awaitDAppProcessing": "Пожалуйста, подождите, пока dApp завершит обработку.",
|
||||||
|
"copyWalletConnectLink": "Скопируйте ссылку WalletConnect из dApp и вставьте сюда.",
|
||||||
|
"enterWalletConnectURI": "Введите URI WalletConnect",
|
||||||
|
"seed_key": "Ключ семян",
|
||||||
|
"enter_seed_phrase": "Введите свою семенную фразу",
|
||||||
|
"add_contact": "Добавить контакт"
|
||||||
}
|
}
|
||||||
|
|
|
@ -725,5 +725,10 @@
|
||||||
"message": "ข้อความ",
|
"message": "ข้อความ",
|
||||||
"do_not_have_enough_gas_asset": "คุณมี ${currency} ไม่เพียงพอที่จะทำธุรกรรมกับเงื่อนไขเครือข่ายบล็อคเชนในปัจจุบัน คุณต้องมี ${currency} เพิ่มขึ้นเพื่อชำระค่าธรรมเนียมเครือข่ายบล็อคเชน แม้ว่าคุณจะส่งสินทรัพย์อื่นก็ตาม",
|
"do_not_have_enough_gas_asset": "คุณมี ${currency} ไม่เพียงพอที่จะทำธุรกรรมกับเงื่อนไขเครือข่ายบล็อคเชนในปัจจุบัน คุณต้องมี ${currency} เพิ่มขึ้นเพื่อชำระค่าธรรมเนียมเครือข่ายบล็อคเชน แม้ว่าคุณจะส่งสินทรัพย์อื่นก็ตาม",
|
||||||
"totp_auth_url": "URL การตรวจสอบสิทธิ์ TOTP",
|
"totp_auth_url": "URL การตรวจสอบสิทธิ์ TOTP",
|
||||||
"awaitDAppProcessing": "โปรดรอให้ dApp ประมวลผลเสร็จสิ้น"
|
"awaitDAppProcessing": "โปรดรอให้ dApp ประมวลผลเสร็จสิ้น",
|
||||||
|
"copyWalletConnectLink": "คัดลอกลิงก์ WalletConnect จาก dApp แล้ววางที่นี่",
|
||||||
|
"enterWalletConnectURI": "เข้าสู่ WalletConnect URI",
|
||||||
|
"seed_key": "คีย์เมล็ดพันธุ์",
|
||||||
|
"enter_seed_phrase": "ป้อนวลีเมล็ดพันธุ์ของคุณ",
|
||||||
|
"add_contact": "เพิ่มผู้ติดต่อ"
|
||||||
}
|
}
|
||||||
|
|
|
@ -716,5 +716,10 @@
|
||||||
"message": "Mensahe",
|
"message": "Mensahe",
|
||||||
"do_not_have_enough_gas_asset": "Wala kang sapat na ${currency} para gumawa ng transaksyon sa kasalukuyang kundisyon ng network ng blockchain. Kailangan mo ng higit pang ${currency} upang magbayad ng mga bayarin sa network ng blockchain, kahit na nagpapadala ka ng ibang asset.",
|
"do_not_have_enough_gas_asset": "Wala kang sapat na ${currency} para gumawa ng transaksyon sa kasalukuyang kundisyon ng network ng blockchain. Kailangan mo ng higit pang ${currency} upang magbayad ng mga bayarin sa network ng blockchain, kahit na nagpapadala ka ng ibang asset.",
|
||||||
"totp_auth_url": "TOTP AUTH URL",
|
"totp_auth_url": "TOTP AUTH URL",
|
||||||
"awaitDAppProcessing": "Pakihintay na matapos ang pagproseso ng dApp."
|
"awaitDAppProcessing": "Pakihintay na matapos ang pagproseso ng dApp.",
|
||||||
|
"copyWalletConnectLink": "Kopyahin ang link ng WalletConnect mula sa dApp at i-paste dito",
|
||||||
|
"enterWalletConnectURI": "Ilagay ang WalletConnect URI",
|
||||||
|
"seed_key": "Seed Key",
|
||||||
|
"enter_seed_phrase": "Ipasok ang iyong pariralang binhi",
|
||||||
|
"add_contact": "Magdagdag ng contact"
|
||||||
}
|
}
|
||||||
|
|
|
@ -725,5 +725,10 @@
|
||||||
"message": "İleti",
|
"message": "İleti",
|
||||||
"do_not_have_enough_gas_asset": "Mevcut blockchain ağ koşullarıyla işlem yapmak için yeterli ${currency} paranız yok. Farklı bir varlık gönderiyor olsanız bile blockchain ağ ücretlerini ödemek için daha fazla ${currency} miktarına ihtiyacınız var.",
|
"do_not_have_enough_gas_asset": "Mevcut blockchain ağ koşullarıyla işlem yapmak için yeterli ${currency} paranız yok. Farklı bir varlık gönderiyor olsanız bile blockchain ağ ücretlerini ödemek için daha fazla ${currency} miktarına ihtiyacınız var.",
|
||||||
"totp_auth_url": "TOTP YETKİ URL'si",
|
"totp_auth_url": "TOTP YETKİ URL'si",
|
||||||
"awaitDAppProcessing": "Lütfen dApp'in işlemeyi bitirmesini bekleyin."
|
"awaitDAppProcessing": "Lütfen dApp'in işlemeyi bitirmesini bekleyin.",
|
||||||
|
"copyWalletConnectLink": "WalletConnect bağlantısını dApp'ten kopyalayıp buraya yapıştırın",
|
||||||
|
"enterWalletConnectURI": "WalletConnect URI'sini girin",
|
||||||
|
"seed_key": "Tohum",
|
||||||
|
"enter_seed_phrase": "Tohum ifadenizi girin",
|
||||||
|
"add_contact": "Kişi ekle"
|
||||||
}
|
}
|
||||||
|
|
|
@ -727,5 +727,10 @@
|
||||||
"message": "повідомлення",
|
"message": "повідомлення",
|
||||||
"do_not_have_enough_gas_asset": "У вас недостатньо ${currency}, щоб здійснити трансакцію з поточними умовами мережі блокчейн. Вам потрібно більше ${currency}, щоб сплатити комісію мережі блокчейн, навіть якщо ви надсилаєте інший актив.",
|
"do_not_have_enough_gas_asset": "У вас недостатньо ${currency}, щоб здійснити трансакцію з поточними умовами мережі блокчейн. Вам потрібно більше ${currency}, щоб сплатити комісію мережі блокчейн, навіть якщо ви надсилаєте інший актив.",
|
||||||
"totp_auth_url": "TOTP AUTH URL",
|
"totp_auth_url": "TOTP AUTH URL",
|
||||||
"awaitDAppProcessing": "Зачекайте, доки dApp завершить обробку."
|
"awaitDAppProcessing": "Зачекайте, доки dApp завершить обробку.",
|
||||||
|
"copyWalletConnectLink": "Скопіюйте посилання WalletConnect із dApp і вставте сюди",
|
||||||
|
"enterWalletConnectURI": "Введіть URI WalletConnect",
|
||||||
|
"seed_key": "Насіннєвий ключ",
|
||||||
|
"enter_seed_phrase": "Введіть свою насіннєву фразу",
|
||||||
|
"add_contact": "Додати контакт"
|
||||||
}
|
}
|
||||||
|
|
|
@ -719,5 +719,10 @@
|
||||||
"message": "ﻡﺎﻐﯿﭘ",
|
"message": "ﻡﺎﻐﯿﭘ",
|
||||||
"do_not_have_enough_gas_asset": "آپ کے پاس موجودہ بلاکچین نیٹ ورک کی شرائط کے ساتھ لین دین کرنے کے لیے کافی ${currency} نہیں ہے۔ آپ کو بلاکچین نیٹ ورک کی فیس ادا کرنے کے لیے مزید ${currency} کی ضرورت ہے، چاہے آپ کوئی مختلف اثاثہ بھیج رہے ہوں۔",
|
"do_not_have_enough_gas_asset": "آپ کے پاس موجودہ بلاکچین نیٹ ورک کی شرائط کے ساتھ لین دین کرنے کے لیے کافی ${currency} نہیں ہے۔ آپ کو بلاکچین نیٹ ورک کی فیس ادا کرنے کے لیے مزید ${currency} کی ضرورت ہے، چاہے آپ کوئی مختلف اثاثہ بھیج رہے ہوں۔",
|
||||||
"totp_auth_url": "TOTP AUTH URL",
|
"totp_auth_url": "TOTP AUTH URL",
|
||||||
"awaitDAppProcessing": "۔ﮟﯾﺮﮐ ﺭﺎﻈﺘﻧﺍ ﺎﮐ ﮯﻧﻮﮨ ﻞﻤﮑﻣ ﮓﻨﺴﯿﺳﻭﺮﭘ ﮯﮐ dApp ﻡﺮﮐ ﮦﺍﺮﺑ"
|
"awaitDAppProcessing": "۔ﮟﯾﺮﮐ ﺭﺎﻈﺘﻧﺍ ﺎﮐ ﮯﻧﻮﮨ ﻞﻤﮑﻣ ﮓﻨﺴﯿﺳﻭﺮﭘ ﮯﮐ dApp ﻡﺮﮐ ﮦﺍﺮﺑ",
|
||||||
|
"copyWalletConnectLink": "dApp ﮯﺳ WalletConnect ۔ﮟﯾﺮﮐ ﭧﺴﯿﭘ ﮞﺎﮩﯾ ﺭﻭﺍ ﮟﯾﺮﮐ ﯽﭘﺎﮐ ﻮﮐ ﮏﻨﻟ",
|
||||||
|
"enterWalletConnectURI": "WalletConnect URI ۔ﮟﯾﺮﮐ ﺝﺭﺩ",
|
||||||
|
"seed_key": "بیج کی کلید",
|
||||||
|
"enter_seed_phrase": "اپنے بیج کا جملہ درج کریں",
|
||||||
|
"add_contact": " ۔ﮟﯾﺮﮐ ﻞﻣﺎﺷ ﮧﻄﺑﺍﺭ"
|
||||||
}
|
}
|
||||||
|
|
|
@ -721,5 +721,10 @@
|
||||||
"message": "Ifiranṣẹ",
|
"message": "Ifiranṣẹ",
|
||||||
"do_not_have_enough_gas_asset": "O ko ni to ${currency} lati ṣe idunadura kan pẹlu awọn ipo nẹtiwọki blockchain lọwọlọwọ. O nilo diẹ sii ${currency} lati san awọn owo nẹtiwọọki blockchain, paapaa ti o ba nfi dukia miiran ranṣẹ.",
|
"do_not_have_enough_gas_asset": "O ko ni to ${currency} lati ṣe idunadura kan pẹlu awọn ipo nẹtiwọki blockchain lọwọlọwọ. O nilo diẹ sii ${currency} lati san awọn owo nẹtiwọọki blockchain, paapaa ti o ba nfi dukia miiran ranṣẹ.",
|
||||||
"totp_auth_url": "TOTP AUTH URL",
|
"totp_auth_url": "TOTP AUTH URL",
|
||||||
"awaitDAppProcessing": "Fi inurere duro fun dApp lati pari sisẹ."
|
"awaitDAppProcessing": "Fi inurere duro fun dApp lati pari sisẹ.",
|
||||||
|
"copyWalletConnectLink": "Daakọ ọna asopọ WalletConnect lati dApp ki o si lẹẹmọ nibi",
|
||||||
|
"enterWalletConnectURI": "Tẹ WalletConnect URI sii",
|
||||||
|
"seed_key": "Bọtini Ose",
|
||||||
|
"enter_seed_phrase": "Tẹ ọrọ-iru irugbin rẹ",
|
||||||
|
"add_contact": "Fi olubasọrọ kun"
|
||||||
}
|
}
|
||||||
|
|
|
@ -726,5 +726,10 @@
|
||||||
"message": "信息",
|
"message": "信息",
|
||||||
"do_not_have_enough_gas_asset": "您没有足够的 ${currency} 来在当前的区块链网络条件下进行交易。即使您发送的是不同的资产,您也需要更多的 ${currency} 来支付区块链网络费用。",
|
"do_not_have_enough_gas_asset": "您没有足够的 ${currency} 来在当前的区块链网络条件下进行交易。即使您发送的是不同的资产,您也需要更多的 ${currency} 来支付区块链网络费用。",
|
||||||
"totp_auth_url": "TOTP 授权 URL",
|
"totp_auth_url": "TOTP 授权 URL",
|
||||||
"awaitDAppProcessing": "请等待 dApp 处理完成。"
|
"awaitDAppProcessing": "请等待 dApp 处理完成。",
|
||||||
|
"copyWalletConnectLink": "从 dApp 复制 WalletConnect 链接并粘贴到此处",
|
||||||
|
"enterWalletConnectURI": "输入 WalletConnect URI",
|
||||||
|
"seed_key": "种子钥匙",
|
||||||
|
"enter_seed_phrase": "输入您的种子短语",
|
||||||
|
"add_contact": "增加联系人"
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,15 +15,15 @@ TYPES=($MONERO_COM $CAKEWALLET $HAVEN)
|
||||||
APP_ANDROID_TYPE=$1
|
APP_ANDROID_TYPE=$1
|
||||||
|
|
||||||
MONERO_COM_NAME="Monero.com"
|
MONERO_COM_NAME="Monero.com"
|
||||||
MONERO_COM_VERSION="1.7.1"
|
MONERO_COM_VERSION="1.7.2"
|
||||||
MONERO_COM_BUILD_NUMBER=62
|
MONERO_COM_BUILD_NUMBER=63
|
||||||
MONERO_COM_BUNDLE_ID="com.monero.app"
|
MONERO_COM_BUNDLE_ID="com.monero.app"
|
||||||
MONERO_COM_PACKAGE="com.monero.app"
|
MONERO_COM_PACKAGE="com.monero.app"
|
||||||
MONERO_COM_SCHEME="monero.com"
|
MONERO_COM_SCHEME="monero.com"
|
||||||
|
|
||||||
CAKEWALLET_NAME="Cake Wallet"
|
CAKEWALLET_NAME="Cake Wallet"
|
||||||
CAKEWALLET_VERSION="4.10.1"
|
CAKEWALLET_VERSION="4.10.2"
|
||||||
CAKEWALLET_BUILD_NUMBER=176
|
CAKEWALLET_BUILD_NUMBER=177
|
||||||
CAKEWALLET_BUNDLE_ID="com.cakewallet.cake_wallet"
|
CAKEWALLET_BUNDLE_ID="com.cakewallet.cake_wallet"
|
||||||
CAKEWALLET_PACKAGE="com.cakewallet.cake_wallet"
|
CAKEWALLET_PACKAGE="com.cakewallet.cake_wallet"
|
||||||
CAKEWALLET_SCHEME="cakewallet"
|
CAKEWALLET_SCHEME="cakewallet"
|
||||||
|
|
|
@ -13,13 +13,13 @@ TYPES=($MONERO_COM $CAKEWALLET $HAVEN)
|
||||||
APP_IOS_TYPE=$1
|
APP_IOS_TYPE=$1
|
||||||
|
|
||||||
MONERO_COM_NAME="Monero.com"
|
MONERO_COM_NAME="Monero.com"
|
||||||
MONERO_COM_VERSION="1.7.1"
|
MONERO_COM_VERSION="1.7.2"
|
||||||
MONERO_COM_BUILD_NUMBER=60
|
MONERO_COM_BUILD_NUMBER=61
|
||||||
MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
|
MONERO_COM_BUNDLE_ID="com.cakewallet.monero"
|
||||||
|
|
||||||
CAKEWALLET_NAME="Cake Wallet"
|
CAKEWALLET_NAME="Cake Wallet"
|
||||||
CAKEWALLET_VERSION="4.10.1"
|
CAKEWALLET_VERSION="4.10.2"
|
||||||
CAKEWALLET_BUILD_NUMBER=190
|
CAKEWALLET_BUILD_NUMBER=191
|
||||||
CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
|
CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
|
||||||
|
|
||||||
HAVEN_NAME="Haven"
|
HAVEN_NAME="Haven"
|
||||||
|
|
|
@ -15,8 +15,8 @@ if [ -n "$1" ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
CAKEWALLET_NAME="Cake Wallet"
|
CAKEWALLET_NAME="Cake Wallet"
|
||||||
CAKEWALLET_VERSION="1.3.1"
|
CAKEWALLET_VERSION="1.3.2"
|
||||||
CAKEWALLET_BUILD_NUMBER=37
|
CAKEWALLET_BUILD_NUMBER=39
|
||||||
CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
|
CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet"
|
||||||
|
|
||||||
if ! [[ " ${TYPES[*]} " =~ " ${APP_MACOS_TYPE} " ]]; then
|
if ! [[ " ${TYPES[*]} " =~ " ${APP_MACOS_TYPE} " ]]; then
|
||||||
|
|
|
@ -10,7 +10,7 @@ echo "============================ SODIUM ============================"
|
||||||
echo "Cloning SODIUM from - $SODIUM_URL"
|
echo "Cloning SODIUM from - $SODIUM_URL"
|
||||||
git clone $SODIUM_URL $SODIUM_PATH --branch stable
|
git clone $SODIUM_URL $SODIUM_PATH --branch stable
|
||||||
cd $SODIUM_PATH
|
cd $SODIUM_PATH
|
||||||
./dist-build/osx.sh
|
./dist-build/macos.sh
|
||||||
|
|
||||||
mv ${SODIUM_PATH}/libsodium-osx/include/* $EXTERNAL_MACOS_INCLUDE_DIR
|
mv ${SODIUM_PATH}/libsodium-osx/include/* $EXTERNAL_MACOS_INCLUDE_DIR
|
||||||
mv ${SODIUM_PATH}/libsodium-osx/lib/* $EXTERNAL_MACOS_LIB_DIR
|
mv ${SODIUM_PATH}/libsodium-osx/lib/* $EXTERNAL_MACOS_LIB_DIR
|
Loading…
Reference in a new issue