flutter 3.47 and dart 3.13 minimum and associated changes
What changed, and why it matters
This commit updates the Stack Wallet app to require newer Flutter and Dart versions. Most changes are routine housekeeping: reformatting code, removing the 'final' keyword from function parameters to match new language rules, updating iOS/macOS build files, and bumping dependency versions. There are a few small logic tweaks, such as adding null-assertions ('!') to some wallet scanning code and changing how the app detects iPads, but nothing in the diff clearly introduces or fixes a security vulnerability.
Treat as a routine framework upgrade. Verify that the flutter_libsparkmobile 0.2.0 release notes do not contain undisclosed security fixes, run existing test suites, and confirm that the new non-null assertions in wallet scanning do not mask null-safety issues that could crash during wallet restore. No immediate security response is indicated by this diff alone.
Security signals we found
Dependency version bump: flutter_libsparkmobile 0.1.0 -> 0.2.0 (git ref fe505c29f5dbb5dd94fb986e509506be9e2f37e7)
Platform minimum version raised: macOS 10.15 -> 12.0, Flutter 3.44.9 -> 3.47.2, Dart 3.12 -> 3.13
New non-null assertions added in wallet gap scanning (bitcoin_frost_wallet.dart, electrumx_interface.dart)
iPad detection logic changed from async boolean check to synchronous equality check
No explicit security-relevant description in commit message or diff
Evidence from the diff
The commit bumps minimum SDK constraints to Dart 3.13 and Flutter 3.47.2, updates pubspec.lock, iOS SwiftPM package resolution files, macOS Podfile platform target, and Xcode scheme pre-actions. Dart source changes are largely syntactic: removal of ‘final’ keyword from positional/formal parameters (a Dart 3.13 style/behavior adjustment), formatting changes, and a handful of functional adjustments: Util.isIPad comparison change, addition of non-null assertions on serializedKeys and root variables in wallet gap-scanning paths, and a flutter_libsparkmobile git ref bump from 0.1.0 to 0.2.0. No explicit security fix or vulnerability is described in the commit message or diff.
Changed components
Flutter/Dart toolchain constraintsiOS build configuration (Xcode scheme, SwiftPM Package.resolved)macOS build configuration (Podfile)pubspec.lock and dependency resolutionlib/wallets/wallet/impl/bitcoin_frost_wallet.dartlib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dartlib/pages/paynym/paynym_home_view.dartflutter_libsparkmobile native dependencyInspect captured patch +261 / −127
diff --git a/analysis_options.yaml b/analysis_options.yaml
index f63ed52..02972b9 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -20,6 +20,12 @@ analyzer:
- "lib/generated_plugin_registrant.dart"
- "lib/wl_gen/generated/**"
- '**/*.template.dart'
+ - build/**
+ - android/**
+ - ios/**
+ - windows/**
+ - macos/**
+ - linux/**
# For more information see:
# https://dart.dev/guides/language/analysis-options#enabling-additional-type-checks
diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
new file mode 100644
index 0000000..4d7193e
--- /dev/null
+++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -0,0 +1,59 @@
+{
+ "pins" : [
+ {
+ "identity" : "dkcamera",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/zhangao0086/DKCamera",
+ "state" : {
+ "branch" : "master",
+ "revision" : "5c691d11014b910aff69f960475d70e65d9dcc96"
+ }
+ },
+ {
+ "identity" : "dkimagepickercontroller",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/zhangao0086/DKImagePickerController",
+ "state" : {
+ "branch" : "4.3.9",
+ "revision" : "0bdfeacefa308545adde07bef86e349186335915"
+ }
+ },
+ {
+ "identity" : "dkphotogallery",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/zhangao0086/DKPhotoGallery",
+ "state" : {
+ "branch" : "master",
+ "revision" : "311c1bc7a94f1538f82773a79c84374b12a2ef3d"
+ }
+ },
+ {
+ "identity" : "sdwebimage",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/SDWebImage/SDWebImage",
+ "state" : {
+ "revision" : "2de3a496eaf6df9a1312862adcfd54acd73c39c0",
+ "version" : "5.21.7"
+ }
+ },
+ {
+ "identity" : "swiftygif",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/kirualex/SwiftyGif.git",
+ "state" : {
+ "revision" : "4430cbc148baa3907651d40562d96325426f409a",
+ "version" : "5.4.5"
+ }
+ },
+ {
+ "identity" : "tocropviewcontroller",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/TimOliver/TOCropViewController",
+ "state" : {
+ "revision" : "d4a6d8100f4b886fdbc8ae399bf144ff3e9afb7e",
+ "version" : "2.8.0"
+ }
+ }
+ ],
+ "version" : 2
+}
diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
index 9c12df5..5db441f 100644
--- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -5,6 +5,24 @@
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
+ <PreActions>
+ <ExecutionAction
+ ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction">
+ <ActionContent
+ title = "Run Prepare Flutter Framework Script"
+ scriptText = "/bin/sh "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" prepare ">
+ <EnvironmentBuildable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "97C146ED1CF9000F007C117D"
+ BuildableName = "Runner.app"
+ BlueprintName = "Runner"
+ ReferencedContainer = "container:Runner.xcodeproj">
+ </BuildableReference>
+ </EnvironmentBuildable>
+ </ActionContent>
+ </ExecutionAction>
+ </PreActions>
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
diff --git a/ios/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ios/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved
new file mode 100644
index 0000000..4d7193e
--- /dev/null
+++ b/ios/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -0,0 +1,59 @@
+{
+ "pins" : [
+ {
+ "identity" : "dkcamera",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/zhangao0086/DKCamera",
+ "state" : {
+ "branch" : "master",
+ "revision" : "5c691d11014b910aff69f960475d70e65d9dcc96"
+ }
+ },
+ {
+ "identity" : "dkimagepickercontroller",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/zhangao0086/DKImagePickerController",
+ "state" : {
+ "branch" : "4.3.9",
+ "revision" : "0bdfeacefa308545adde07bef86e349186335915"
+ }
+ },
+ {
+ "identity" : "dkphotogallery",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/zhangao0086/DKPhotoGallery",
+ "state" : {
+ "branch" : "master",
+ "revision" : "311c1bc7a94f1538f82773a79c84374b12a2ef3d"
+ }
+ },
+ {
+ "identity" : "sdwebimage",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/SDWebImage/SDWebImage",
+ "state" : {
+ "revision" : "2de3a496eaf6df9a1312862adcfd54acd73c39c0",
+ "version" : "5.21.7"
+ }
+ },
+ {
+ "identity" : "swiftygif",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/kirualex/SwiftyGif.git",
+ "state" : {
+ "revision" : "4430cbc148baa3907651d40562d96325426f409a",
+ "version" : "5.4.5"
+ }
+ },
+ {
+ "identity" : "tocropviewcontroller",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/TimOliver/TOCropViewController",
+ "state" : {
+ "revision" : "d4a6d8100f4b886fdbc8ae399bf144ff3e9afb7e",
+ "version" : "2.8.0"
+ }
+ }
+ ],
+ "version" : 2
+}
diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard
index 7aa6dfb..576b9d4 100644
--- a/ios/Runner/Base.lproj/LaunchScreen.storyboard
+++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard
@@ -38,7 +38,7 @@
</scene>
</scenes>
<resources>
- <image name="LaunchImage" width="512" height="512"/>
+ <image name="LaunchImage" width="512" height="373"/>
<image name="LaunchBackground" width="1" height="1"/>
</resources>
</document>
diff --git a/lib/app_config.dart b/lib/app_config.dart
index 7ee72af..4e926ad 100644
--- a/lib/app_config.dart
+++ b/lib/app_config.dart
@@ -42,7 +42,7 @@ abstract class AppConfig {
}
static CryptoCurrency? getCryptoCurrencyForTicker(
- final String ticker, {
+ String ticker, {
bool caseInsensitive = true,
}) {
final _ticker = caseInsensitive ? ticker.toLowerCase() : ticker;
@@ -76,7 +76,7 @@ abstract class AppConfig {
/// Fuzzy logic. Use with caution!!
@Deprecated("dangerous")
- static CryptoCurrency getCryptoCurrencyByPrettyName(final String prettyName) {
+ static CryptoCurrency getCryptoCurrencyByPrettyName(String prettyName) {
// trocador hack
const hackSplitter = " (Mainnet";
final name = prettyName.contains(hackSplitter)
diff --git a/lib/db/sqlite/firo_cache_writer.dart b/lib/db/sqlite/firo_cache_writer.dart
index fadc3eb..9818d0c 100644
--- a/lib/db/sqlite/firo_cache_writer.dart
+++ b/lib/db/sqlite/firo_cache_writer.dart
@@ -52,7 +52,7 @@ FCResult _updateSparkUsedTagsWith(Database db, List<List<dynamic>> tags) {
/// returns true if successful, otherwise false
FCResult _updateSparkAnonSetCoinsWith(
Database db,
- final List<RawSparkCoin> coinsRaw,
+ List<RawSparkCoin> coinsRaw,
SparkAnonymitySetMeta meta,
) {
if (coinsRaw.isEmpty) {
diff --git a/lib/pages/paynym/paynym_home_view.dart b/lib/pages/paynym/paynym_home_view.dart
index d70cff6..7649942 100644
--- a/lib/pages/paynym/paynym_home_view.dart
+++ b/lib/pages/paynym/paynym_home_view.dart
@@ -86,17 +86,17 @@ class _PaynymHomeViewState extends ConsumerState<PaynymHomeView> {
padding: const EdgeInsets.only(left: 24, right: 20),
child: AppBarIconButton(
size: 32,
- color: Theme.of(
- context,
- ).extension<StackColors>()!.textFieldDefaultBG,
+ color: Theme.of(context)
+ .extension<StackColors>()!
+ .textFieldDefaultBG,
shadows: const [],
icon: SvgPicture.asset(
Assets.svg.arrowLeft,
width: 18,
height: 18,
- color: Theme.of(
- context,
- ).extension<StackColors>()!.topNavIconPrimary,
+ color: Theme.of(context)
+ .extension<StackColors>()!
+ .topNavIconPrimary,
),
onPressed: Navigator.of(context).pop,
),
@@ -139,9 +139,9 @@ class _PaynymHomeViewState extends ConsumerState<PaynymHomeView> {
horizontal: 24.0,
),
color: _followButtonHoverState
- ? Theme.of(
- context,
- ).extension<StackColors>()!.highlight
+ ? Theme.of(context)
+ .extension<StackColors>()!
+ .highlight
: Colors.transparent,
radiusMultiplier: 100,
child: Row(
@@ -150,9 +150,9 @@ class _PaynymHomeViewState extends ConsumerState<PaynymHomeView> {
Assets.svg.plus,
width: 16,
height: 16,
- color: Theme.of(
- context,
- ).extension<StackColors>()!.textDark,
+ color: Theme.of(context)
+ .extension<StackColors>()!
+ .textDark,
),
const SizedBox(width: 8),
Column(
@@ -199,9 +199,9 @@ class _PaynymHomeViewState extends ConsumerState<PaynymHomeView> {
Assets.svg.circlePlusFilled,
width: 20,
height: 20,
- color: Theme.of(
- context,
- ).extension<StackColors>()!.accentColorDark,
+ color: Theme.of(context)
+ .extension<StackColors>()!
+ .accentColorDark,
),
onPressed: () {
Navigator.of(context).pushNamed(
@@ -221,9 +221,9 @@ class _PaynymHomeViewState extends ConsumerState<PaynymHomeView> {
Assets.svg.circleQuestion,
width: 20,
height: 20,
- color: Theme.of(
- context,
- ).extension<StackColors>()!.accentColorDark,
+ color: Theme.of(context)
+ .extension<StackColors>()!
+ .accentColorDark,
),
onPressed: () {
// todo info ?
@@ -306,9 +306,9 @@ class _PaynymHomeViewState extends ConsumerState<PaynymHomeView> {
icon: CopyIcon(
width: 12,
height: 12,
- color: Theme.of(
- context,
- ).extension<StackColors>()!.buttonTextSecondary,
+ color: Theme.of(context)
+ .extension<StackColors>()!
+ .buttonTextSecondary,
),
onPressed: () async {
await Clipboard.setData(
@@ -340,13 +340,13 @@ class _PaynymHomeViewState extends ConsumerState<PaynymHomeView> {
icon: ShareIcon(
width: 12,
height: 12,
- color: Theme.of(
- context,
- ).extension<StackColors>()!.buttonTextSecondary,
+ color: Theme.of(context)
+ .extension<StackColors>()!
+ .buttonTextSecondary,
),
onPressed: () async {
Rect? sharePositionOrigin;
- if (await Util.isIPad) {
+ if (Util.isIpad == true) {
final box =
context.findRenderObject() as RenderBox?;
if (box != null) {
@@ -376,9 +376,9 @@ class _PaynymHomeViewState extends ConsumerState<PaynymHomeView> {
icon: QrCodeIcon(
width: 12,
height: 12,
- color: Theme.of(
- context,
- ).extension<StackColors>()!.buttonTextSecondary,
+ color: Theme.of(context)
+ .extension<StackColors>()!
+ .buttonTextSecondary,
),
onPressed: () {
showDialog<void>(
@@ -469,9 +469,9 @@ class _PaynymHomeViewState extends ConsumerState<PaynymHomeView> {
icon: CopyIcon(
width: 18,
height: 18,
- color: Theme.of(
- context,
- ).extension<StackColors>()!.textDark,
+ color: Theme.of(context)
+ .extension<StackColors>()!
+ .textDark,
),
onPressed: () async {
await Clipboard.setData(
@@ -501,9 +501,9 @@ class _PaynymHomeViewState extends ConsumerState<PaynymHomeView> {
icon: QrCodeIcon(
width: 18,
height: 18,
- color: Theme.of(
- context,
- ).extension<StackColors>()!.textDark,
+ color: Theme.of(context)
+ .extension<StackColors>()!
+ .textDark,
),
onPressed: () {
showDialog<void>(
@@ -535,9 +535,9 @@ class _PaynymHomeViewState extends ConsumerState<PaynymHomeView> {
onColor: Theme.of(context).extension<StackColors>()!.popupBG,
onText:
"Following (${ref.watch(myPaynymAccountStateProvider.state).state?.following.length ?? 0})",
- offColor: Theme.of(
- context,
- ).extension<StackColors>()!.textFieldDefaultBG,
+ offColor: Theme.of(context)
+ .extension<StackColors>()!
+ .textFieldDefaultBG,
offText:
"Followers (${ref.watch(myPaynymAccountStateProvider.state).state?.followers.length ?? 0})",
isOn: showFollowers,
diff --git a/lib/utilities/custom_text_selection_controls.dart b/lib/utilities/custom_text_selection_controls.dart
index 6817d5f..84a19d3 100644
--- a/lib/utilities/custom_text_selection_controls.dart
+++ b/lib/utilities/custom_text_selection_controls.dart
@@ -16,7 +16,7 @@ class CustomMaterialTextSelectionControls
CustomMaterialTextSelectionControls({required this.onPaste});
ValueChanged<TextSelectionDelegate> onPaste;
@override
- Future<void> handlePaste(final TextSelectionDelegate delegate) async {
+ Future<void> handlePaste(TextSelectionDelegate delegate) async {
return onPaste(delegate);
}
}
@@ -26,7 +26,7 @@ class CustomCupertinoTextSelectionControls
CustomCupertinoTextSelectionControls({required this.onPaste});
ValueChanged<TextSelectionDelegate> onPaste;
@override
- Future<void> handlePaste(final TextSelectionDelegate delegate) async {
+ Future<void> handlePaste(TextSelectionDelegate delegate) async {
return onPaste(delegate);
}
}
diff --git a/lib/utilities/electrum_seed_utils.dart b/lib/utilities/electrum_seed_utils.dart
index 337987a..882af7a 100644
--- a/lib/utilities/electrum_seed_utils.dart
+++ b/lib/utilities/electrum_seed_utils.dart
@@ -12,8 +12,8 @@ abstract class ElectrumSeedUtils {
static const kSeedPrefix2faSegwit = "102"; // 2FA segwit
static Uint8List electrumMnemonicToSeedBytes(
- final String mnemonic, {
- final String passphrase = "",
+ String mnemonic, {
+ String passphrase = "",
}) {
final salt = Uint8List.fromList([
..."electrum".toUint8ListFromUtf8,
@@ -28,8 +28,8 @@ abstract class ElectrumSeedUtils {
// based on https://electrum.readthedocs.io/en/latest/seedphrase.html#version-number
static String electrumMnemonicVersion(
- final String mnemonic, {
- final String passphrase = "",
+ String mnemonic, {
+ String passphrase = "",
}) {
final normalized = normalize(mnemonic).toUint8ListFromUtf8;
@@ -40,17 +40,18 @@ abstract class ElectrumSeedUtils {
return hash.substring(0, length);
}
- static bool isNewSeed(final String mnemonic, {String prefix = kSeedPrefix}) {
+ static bool isNewSeed(String mnemonic, {String prefix = kSeedPrefix}) {
final normalized = normalize(mnemonic).toUint8ListFromUtf8;
final hash = _hmacHex(normalized);
return hash.startsWith(prefix);
}
- static String normalize(final String mnemonic) {
+ static String normalize(String mnemonic) {
final characters = String.fromCharCodes(
- nfkd(
- mnemonic,
- ).toLowerCase().runes.where((e) => !_kNonZeroCCCCodeUnits.contains(e)),
+ nfkd(mnemonic)
+ .toLowerCase()
+ .runes
+ .where((e) => !_kNonZeroCCCCodeUnits.contains(e)),
).split(RegExp(r"\s+")).join(" ").trim().split("");
final buffer = StringBuffer();
diff --git a/lib/utilities/extensions/impl/cl_transaction.dart b/lib/utilities/extensions/impl/cl_transaction.dart
index 1c117cf..3718b1e 100644
--- a/lib/utilities/extensions/impl/cl_transaction.dart
+++ b/lib/utilities/extensions/impl/cl_transaction.dart
@@ -11,7 +11,7 @@ extension CLTransactionExt on Transaction {
int vSize() => (weight() / 4).ceil();
- int _byteLength(final bool allowWitness) {
+ int _byteLength(bool allowWitness) {
final hasWitness = allowWitness && isWitness;
return (hasWitness ? 10 : 8) +
_encodingLength(inputs.length) +
@@ -37,17 +37,14 @@ extension CLTransactionExt on Transaction {
int _vectorSize(List<Uint8List> someVector) {
final length = someVector.length;
return _encodingLength(length) +
- someVector.fold(
- 0,
- (sum, witness) => sum + _varSliceSize(witness),
- );
+ someVector.fold(0, (sum, witness) => sum + _varSliceSize(witness));
}
int _encodingLength(int number) => number < 0xfd
? 1
: number <= 0xffff
- ? 3
- : number <= 0xffffffff
- ? 5
- : 9;
+ ? 3
+ : number <= 0xffffffff
+ ? 5
+ : 9;
}
diff --git a/lib/wallets/wallet/impl/bitcoin_frost_wallet.dart b/lib/wallets/wallet/impl/bitcoin_frost_wallet.dart
index c108ddc..b499b82 100644
--- a/lib/wallets/wallet/impl/bitcoin_frost_wallet.dart
+++ b/lib/wallets/wallet/impl/bitcoin_frost_wallet.dart
@@ -839,7 +839,7 @@ class BitcoinFrostWallet<T extends FrostCurrency> extends Wallet<T>
const changeChain = 1;
final List<Future<({int index, List<Address> addresses})>>
receiveFutures = [
- _checkGapsLinearly(serializedKeys, receiveChain, secure: true),
+ _checkGapsLinearly(serializedKeys!, receiveChain, secure: true),
];
final List<Future<({int index, List<Address> addresses})>>
changeFutures = [
@@ -872,8 +872,9 @@ class BitcoinFrostWallet<T extends FrostCurrency> extends Wallet<T>
}
int highestChangeIndexWithHistory = 0;
- // If restoring a wallet that never sent any funds with change, then set changeArray
- // manually. If we didn't do this, it'd store an empty array.
+ // If restoring a wallet that never sent any funds with change, then
+ // set changeArray manually.
+ // If we didn't do this, it'd store an empty array.
for (final tuple in changeResults) {
if (tuple.addresses.isEmpty) {
await checkChangeAddressForTransactions();
@@ -900,7 +901,7 @@ class BitcoinFrostWallet<T extends FrostCurrency> extends Wallet<T>
await mainDB.updateOrPutAddresses(addressesToStore);
- await _legacyInsecureScan(serializedKeys);
+ await _legacyInsecureScan(serializedKeys!);
});
GlobalEventBus.instance.fire(
@@ -1432,7 +1433,8 @@ class BitcoinFrostWallet<T extends FrostCurrency> extends Wallet<T>
throw Exception();
} catch (_, s) {
Logging.instance.e(
- "checkReceivingAddressForTransactions called but reuse address flag set: $s",
+ "checkReceivingAddressForTransactions called but reuse address flag"
+ " set: $s",
stackTrace: s,
);
}
@@ -1602,7 +1604,7 @@ class BitcoinFrostWallet<T extends FrostCurrency> extends Wallet<T>
}
Future<Address> _generateAddressSafe({
- required final int chain,
+ required int chain,
required int startingIndex,
}) async {
final serializedKeys = (await getSerializedKeys())!;
diff --git a/lib/wallets/wallet/impl/solana_wallet.dart b/lib/wallets/wallet/impl/solana_wallet.dart
index 9abc4cf..6290c2c 100644
--- a/lib/wallets/wallet/impl/solana_wallet.dart
+++ b/lib/wallets/wallet/impl/solana_wallet.dart
@@ -472,9 +472,8 @@ class SolanaWallet extends Bip39Wallet<Solana> {
@override
Future<void> updateNode() async {
_solNode =
- NodeService(
- secureStorageInterface: secureStorageInterface,
- ).getPrimaryNodeFor(currency: info.coin) ??
+ NodeService(secureStorageInterface: secureStorageInterface)
+ .getPrimaryNodeFor(currency: info.coin) ??
info.coin.defaultNode(isPrimary: true);
await refresh();
}
@@ -482,9 +481,8 @@ class SolanaWallet extends Bip39Wallet<Solana> {
@override
NodeModel getCurrentNode() {
_solNode ??=
- NodeService(
- secureStorageInterface: secureStorageInterface,
- ).getPrimaryNodeFor(currency: info.coin) ??
+ NodeService(secureStorageInterface: secureStorageInterface)
+ .getPrimaryNodeFor(currency: info.coin) ??
info.coin.defaultNode(isPrimary: true);
return _solNode!;
@@ -713,11 +711,11 @@ class SolanaWallet extends Bip39Wallet<Solana> {
// static helper function for building a sol rpc client
static RpcClient createRpcClient(
- final String host,
- final int port,
- final bool useSSL,
- final Prefs prefs,
- final TorService torService,
+ String host,
+ int port,
+ bool useSSL,
+ Prefs prefs,
+ TorService torService,
) {
HttpClient? httpClient;
diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart
index 0152ca3..f2d5eb0 100644
--- a/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart
+++ b/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart
@@ -2104,10 +2104,7 @@ mixin ElectrumXInterface<T extends ElectrumXCurrencyInterface>
}
@override
- Future<String> signMessage(
- final String message, {
- required final Address address,
- }) async {
+ Future<String> signMessage(String message, {required Address address}) async {
if (isViewOnly) {
throw Exception("Cannot sign a message in a view only wallet");
}
@@ -2128,9 +2125,9 @@ mixin ElectrumXInterface<T extends ElectrumXCurrencyInterface>
@override
Future<bool> verifyMessage(
- final String message, {
- required final String address,
- required final String signature,
+ String message, {
+ required String address,
+ required String signature,
}) async {
final signed = coinlib.MessageSignature.fromBase64(signature);
@@ -2324,11 +2321,11 @@ mixin ElectrumXInterface<T extends ElectrumXCurrencyInterface>
canBatch
? checkGapsBatched(
txCountBatchSize,
- root,
+ root!,
type,
receiveChain,
)
- : checkGapsLinearly(root, type, receiveChain),
+ : checkGapsLinearly(root!, type, receiveChain),
);
}
}
@@ -2348,11 +2345,11 @@ mixin ElectrumXInterface<T extends ElectrumXCurrencyInterface>
canBatch
? checkGapsBatched(
txCountBatchSize,
- root,
+ root!,
type,
changeChain,
)
- : checkGapsLinearly(root, type, changeChain),
+ : checkGapsLinearly(root!, type, changeChain),
);
}
}
diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/sign_verify_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/sign_verify_interface.dart
index fdceb34..95a102d 100644
--- a/lib/wallets/wallet/wallet_mixin_interfaces/sign_verify_interface.dart
+++ b/lib/wallets/wallet/wallet_mixin_interfaces/sign_verify_interface.dart
@@ -1,14 +1,11 @@
import '../../../models/isar/models/blockchain_data/address.dart';
mixin SignVerifyInterface {
- Future<String> signMessage(
- final String message, {
- required final Address address,
- });
+ Future<String> signMessage(String message, {required Address address});
Future<bool> verifyMessage(
- final String message, {
- required final String address,
- required final String signature,
+ String message, {
+ required String address,
+ required String signature,
});
}
diff --git a/lib/wl_gen/interfaces/lib_spark_interface.dart b/lib/wl_gen/interfaces/lib_spark_interface.dart
index 06ddf07..93a2dc6 100644
--- a/lib/wl_gen/interfaces/lib_spark_interface.dart
+++ b/lib/wl_gen/interfaces/lib_spark_interface.dart
@@ -91,18 +91,18 @@ abstract class LibSparkInterface {
Uint8List serializeMintContext({required List<(String, int)> inputs});
WrappedLibSparkCoin? identifyAndRecoverCoin(
- final String serializedCoin, {
- required final String privateKeyHex,
- required final int index,
- required final Uint8List context,
- final bool isTestNet = false,
+ String serializedCoin, {
+ required String privateKeyHex,
+ required int index,
+ required Uint8List context,
+ bool isTestNet = false,
});
WrappedLibSparkCoin? identifyAndRecoverCoinByFullViewKey(
- final String serializedCoin, {
- required final String fullViewKeyHex,
- required final Uint8List context,
- final bool isTestNet = false,
+ String serializedCoin, {
+ required String fullViewKeyHex,
+ required Uint8List context,
+ bool isTestNet = false,
});
Future<String> getAddressFromFullViewKey({
diff --git a/macos/Podfile b/macos/Podfile
index 3936acf..e28f7e3 100644
--- a/macos/Podfile
+++ b/macos/Podfile
@@ -1,4 +1,4 @@
-platform :osx, '10.15'
+platform :osx, '12.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
diff --git a/pubspec.lock b/pubspec.lock
index 18ca559..82c90c1 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -1035,11 +1035,11 @@ packages:
dependency: "direct main"
description:
path: "."
- ref: e017e62766908e9714c5309761183e8be8b37799
- resolved-ref: e017e62766908e9714c5309761183e8be8b37799
+ ref: fe505c29f5dbb5dd94fb986e509506be9e2f37e7
+ resolved-ref: fe505c29f5dbb5dd94fb986e509506be9e2f37e7
url: "https://github.com/cypherstack/flutter_libsparkmobile.git"
source: git
- version: "0.1.0"
+ version: "0.2.0"
flutter_lints:
dependency: "direct dev"
description:
@@ -1593,10 +1593,10 @@ packages:
dependency: transitive
description:
name: matcher
- sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861
+ sha256: "31bd099b47c10cd1aeb55146a2d46ce0277630ecef3f7dae54ad7873f36696cd"
url: "https://pub.dev"
source: hosted
- version: "0.12.19"
+ version: "0.12.20"
material_color_utilities:
dependency: transitive
description:
@@ -1617,10 +1617,10 @@ packages:
dependency: "direct main"
description:
name: meta
- sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349"
+ sha256: "307249ce4ff29d58a18e97f6345f539382eb9c9c29ecda628900f31de0443dd9"
url: "https://pub.dev"
source: hosted
- version: "1.18.0"
+ version: "1.19.0"
mime:
dependency: transitive
description:
@@ -2291,26 +2291,26 @@ packages:
dependency: transitive
description:
name: test
- sha256: "8d9ceddbab833f180fbefed08afa76d7c03513dfdba87ffcec2718b02bbcbf20"
+ sha256: ca578dc12bb8b2f40b67b7d3bd2fac4f31c01a6ff7130a14e2597b919934507f
url: "https://pub.dev"
source: hosted
- version: "1.31.0"
+ version: "1.31.1"
test_api:
dependency: transitive
description:
name: test_api
- sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e"
+ sha256: "2a122cbe059f8b610d3a5415f42e255b6c17b1f21eee1d960f31080237fb4f11"
url: "https://pub.dev"
source: hosted
- version: "0.7.11"
+ version: "0.7.12"
test_core:
dependency: transitive
description:
name: test_core
- sha256: "1991d4cfe85d5043241acac92962c3977c8d2f2add1ee73130c7b286417d1d34"
+ sha256: d2e98ec12998368dc59ddd47ab709f2cd55acd6b66dc7db764455a44082f4bc5
url: "https://pub.dev"
source: hosted
- version: "0.6.17"
+ version: "0.6.18"
tezart:
dependency: "direct main"
description:
@@ -2509,10 +2509,10 @@ packages:
dependency: transitive
description:
name: vector_math
- sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b
+ sha256: f36f9f3be64c6198714492bb455c11056e33e2f85d9a0b676a48301e44fdcf47
url: "https://pub.dev"
source: hosted
- version: "2.2.0"
+ version: "2.4.2"
very_good_analysis:
dependency: transitive
description:
@@ -2716,5 +2716,5 @@ packages:
source: hosted
version: "0.2.4"
sdks:
- dart: ">=3.12.2 <4.0.0"
- flutter: ">=3.44.9 <4.0.0"
+ dart: ">=3.13.0 <4.0.0"
+ flutter: ">=3.47.2 <4.0.0"
diff --git a/scripts/app_config/templates/pubspec.template.yaml b/scripts/app_config/templates/pubspec.template.yaml
index b20b5aa..0993949 100644
--- a/scripts/app_config/templates/pubspec.template.yaml
+++ b/scripts/app_config/templates/pubspec.template.yaml
@@ -14,8 +14,8 @@ description: PLACEHOLDER
version: PLACEHOLDER_V+PLACEHOLDER_B
environment:
- sdk: ">=3.12.0 <4.0.0"
- flutter: ^3.44.9
+ sdk: ">=3.13.0 <4.0.0"
+ flutter: ^3.47.2
dependencies:
flutter:
@@ -44,7 +44,7 @@ dependencies:
# flutter_libsparkmobile:
# git:
# url: https://github.com/cypherstack/flutter_libsparkmobile.git
-# ref: e017e62766908e9714c5309761183e8be8b37799
+# ref: fe505c29f5dbb5dd94fb986e509506be9e2f37e7
# %%END_ENABLE_FIRO%%
# %%ENABLE_EPIC%%
diff --git a/tool/process_pubspec_deps.dart b/tool/process_pubspec_deps.dart
index 80110b7..d6c2b09 100644
--- a/tool/process_pubspec_deps.dart
+++ b/tool/process_pubspec_deps.dart
@@ -16,7 +16,7 @@ void main(List<String> args) {
_process(args[0], args.sublist(1));
}
-void _process(final String filePath, final List<String> enableCoinMarkers) {
+void _process(String filePath, List<String> enableCoinMarkers) {
final lines = File(filePath).readAsLinesSync();
String? activeMarker;
Why this scored 18/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.