Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
3296220
fix(multisig): reject non-canonical and oversized signer sets (#93276)
illuzen Jun 29, 2026
a6f95b4
fix(payload-parser): preserve delay unit type for reversible transfer…
illuzen Jun 29, 2026
8b390f4
fix(multisig): verify discovered multisig addresses match predicted (…
illuzen Jun 29, 2026
fd2db6a
fix(settings): separate clearAll from mnemonic deletion (#93198)
illuzen Jun 29, 2026
61b60b3
fix(crypto): validate SS58 prefix matches expected network (#93263)
illuzen Jun 29, 2026
5af4148
fix(network): improve RPC failover robustness (#93264)
illuzen Jun 29, 2026
c625088
fix(wallet): block dev mnemonics in release builds (#93267)
illuzen Jun 29, 2026
27fb4c6
fix(docs): correct pallet indices in payload parser documentation (#9…
illuzen Jun 29, 2026
e9688fd
fix(high-security): use correct pallet for guardian fund recovery (#9…
illuzen Jun 29, 2026
84386b3
fix(input): improve paste detection in DecimalInputFilter
illuzen Jun 29, 2026
968e816
fix(security): validate exchange rate data in fromJson parser
illuzen Jun 29, 2026
105fa13
fix(security): enforce maxSigners limit in multisig event parsers
illuzen Jun 29, 2026
1356576
fix(security): reject negative fee values in MultisigCreationEvent
illuzen Jun 29, 2026
204a8f0
fix(security): add mutex to prevent account persistence race conditions
illuzen Jun 29, 2026
a1b9874
fix(security): bound account discovery to prevent DoS attacks
illuzen Jun 29, 2026
cbe3056
fix(security): add request timeout to RedundantEndpointService
illuzen Jun 29, 2026
5138b00
fix(pagination): advance cursor by raw rows consumed, not parsed items
illuzen Jun 29, 2026
e377751
fix(high-security): handle block-number delays instead of throwing
illuzen Jun 29, 2026
7fe69ab
fix(checksum): bound address length and cache size to prevent DoS
illuzen Jun 30, 2026
381db11
fix(migration): use each account's walletIndex and handle encrypted a…
illuzen Jun 30, 2026
c1977d2
fix(amounts): validate grouping structure and reject ambiguous separa…
illuzen Jul 1, 2026
b66d512
fix(signing): validate account type and address before deriving keypa…
illuzen Jul 1, 2026
a1ebdc1
fix(multisig): verify call_raw matches indexer-provided recipient/amo…
illuzen Jul 1, 2026
17e928f
fix(lifecycle): prevent stale async init from mutating cleared/dispos…
illuzen Jul 1, 2026
bfaf9a2
fix(security): prevent SSRF via path concatenation host override (#93…
illuzen Jul 1, 2026
d816e9a
fix(security): bound recent address storage to prevent DoS (#93180)
illuzen Jul 1, 2026
2bb9acd
fix(recovery): use ss58AddressFromBytes for proxy lookup to avoid dou…
illuzen Jul 1, 2026
293e2a5
fix(security): remove hard-coded test address from getInterceptedAcco…
illuzen Jul 1, 2026
eb55a14
fix(privacy): exclude wormhole accounts from Senoti registration (#93…
illuzen Jul 1, 2026
a1a5b0b
chore: update pubspec.lock transitive dependencies
illuzen Jul 2, 2026
80daab9
fix(migration): show Skip button when all accounts fail derivation
illuzen Jul 2, 2026
49ef02a
fix(migration): track and notify partial migration failures
illuzen Jul 2, 2026
16c90a9
fix(multisig): detect spoofed transfer when call_raw is not a transfer
illuzen Jul 2, 2026
722299f
fix(logging): use debugPrint for dev mnemonic warning
illuzen Jul 2, 2026
ca98363
Merge main into illuzen/v12-sdk
illuzen Jul 2, 2026
984373d
chore: apply dart format (line-length=120)
illuzen Jul 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions cold-wallet-app/lib/screens/sign_transaction_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -154,8 +154,8 @@ class _SignTransactionScreenState extends ConsumerState<SignTransactionScreen> {
if (_toCheckphrase != null && _toCheckphrase!.isNotEmpty)
_detailRow(context, 'Checkphrase', _toCheckphrase!, valueColor: colors.checksum),
_detailRow(context, 'Reversible', info.isReversible ? 'Yes' : 'No'),
if (info.isReversible && info.reversibleTimeframe != null)
_detailRow(context, 'Reversible window', '${info.reversibleTimeframe} blocks'),
if (info.isReversible && info.reversibleDelay != null)
_detailRow(context, 'Reversible window', info.reversibleDelay.toString()),
if (_error != null) ...[
const SizedBox(height: 16),
Text(
Expand Down
42 changes: 21 additions & 21 deletions cold-wallet-app/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ packages:
dependency: transitive
description:
name: _fe_analyzer_shared
sha256: a49d6cf99e8d8e7a8e93668d09ced0bbdb954d0b4fccc2f5f9241c6b87fad95c
sha256: "8d7ff3948166b8ec5da0fbb5962000926b8e02f2ed9b3e51d1738905fbd4c98d"
url: "https://pub.dev"
source: hosted
version: "99.0.0"
version: "93.0.0"
adaptive_number:
dependency: transitive
description:
Expand All @@ -21,10 +21,10 @@ packages:
dependency: transitive
description:
name: analyzer
sha256: "663efa951fb8a45e06f491223a604c93820598f20e6a99c25617a1576065e8b7"
sha256: de7148ed2fcec579b19f122c1800933dfa028f6d9fd38a152b04b1516cec120b
url: "https://pub.dev"
source: hosted
version: "12.1.0"
version: "10.0.1"
ansicolor:
dependency: transitive
description:
Expand Down Expand Up @@ -213,10 +213,10 @@ packages:
dependency: transitive
description:
name: dbus
sha256: "792974a4007974fbc5c1b5433eb2330a9db3e368c3f906253af4c007d0f49a91"
sha256: "0ce9b0a839e6dee59a37a623d2fc26a35bbbe6404213e419b0d6411023d62645"
url: "https://pub.dev"
source: hosted
version: "0.7.13"
version: "0.7.14"
decimal:
dependency: transitive
description:
Expand Down Expand Up @@ -330,10 +330,10 @@ packages:
dependency: "direct dev"
description:
name: flutter_native_splash
sha256: "9db4b80b044e9af17cc4b1272137fc7ace0054d879ef8210a76adc34aaf4cdff"
sha256: "4fb9f4113350d3a80841ce05ebf1976a36de622af7d19aca0ca9a9911c7ff002"
url: "https://pub.dev"
source: hosted
version: "2.4.8"
version: "2.4.7"
flutter_plugin_android_lifecycle:
dependency: transitive
description:
Expand Down Expand Up @@ -501,10 +501,10 @@ packages:
dependency: transitive
description:
name: image
sha256: "6300175e00616bbc832e2fc91bfa4d776af5402c81c7151bee6905bb08473c52"
sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce
url: "https://pub.dev"
source: hosted
version: "4.9.1"
version: "4.8.0"
intl:
dependency: transitive
description:
Expand Down Expand Up @@ -661,10 +661,10 @@ packages:
dependency: transitive
description:
name: meta
sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349"
sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
url: "https://pub.dev"
source: hosted
version: "1.18.0"
version: "1.17.0"
mime:
dependency: transitive
description:
Expand Down Expand Up @@ -1144,26 +1144,26 @@ packages:
dependency: transitive
description:
name: test
sha256: "8d9ceddbab833f180fbefed08afa76d7c03513dfdba87ffcec2718b02bbcbf20"
sha256: "280d6d890011ca966ad08df7e8a4ddfab0fb3aa49f96ed6de56e3521347a9ae7"
url: "https://pub.dev"
source: hosted
version: "1.31.0"
version: "1.30.0"
test_api:
dependency: transitive
description:
name: test_api
sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e"
sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a"
url: "https://pub.dev"
source: hosted
version: "0.7.11"
version: "0.7.10"
test_core:
dependency: transitive
description:
name: test_core
sha256: "1991d4cfe85d5043241acac92962c3977c8d2f2add1ee73130c7b286417d1d34"
sha256: "0381bd1585d1a924763c308100f2138205252fb90c9d4eeaf28489ee65ccde51"
url: "https://pub.dev"
source: hosted
version: "0.6.17"
version: "0.6.16"
typed_data:
dependency: transitive
description:
Expand Down Expand Up @@ -1312,10 +1312,10 @@ packages:
dependency: transitive
description:
name: xml
sha256: "67f0aff7be013d107995e9b75bf4e7f2c3ef2dfdb2c8e68024bba0a7fd5756a4"
sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025"
url: "https://pub.dev"
source: hosted
version: "7.0.1"
version: "6.6.1"
yaml:
dependency: transitive
description:
Expand All @@ -1325,5 +1325,5 @@ packages:
source: hosted
version: "3.1.3"
sdks:
dart: ">=3.11.0 <4.0.0"
dart: ">=3.10.3 <4.0.0"
flutter: ">=3.38.4"
2 changes: 1 addition & 1 deletion cold-wallet-app/test/transaction_signing_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ void main() {

expect(info, isNotNull);
expect(info!.isReversible, isFalse);
expect(info.reversibleTimeframe, isNull);
expect(info.reversibleDelay, isNull);
expect(info.toAddress, startsWith('qz'));
expect(info.amount, BigInt.parse('100000000000')); // 0.1 QUAN at 12 decimals
});
Expand Down
8 changes: 4 additions & 4 deletions miner-app/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -564,10 +564,10 @@ packages:
dependency: transitive
description:
name: meta
sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349"
sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
url: "https://pub.dev"
source: hosted
version: "1.18.0"
version: "1.17.0"
native_toolchain_c:
dependency: transitive
description:
Expand Down Expand Up @@ -967,10 +967,10 @@ packages:
dependency: transitive
description:
name: test_api
sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e"
sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a"
url: "https://pub.dev"
source: hosted
version: "0.7.11"
version: "0.7.10"
typed_data:
dependency: transitive
description:
Expand Down
58 changes: 36 additions & 22 deletions mobile-app/lib/features/components/migration_dialog.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@ import 'package:resonance_network_wallet/v2/theme/app_colors.dart';
import 'package:resonance_network_wallet/v2/theme/app_text_styles.dart';

class MigrationDialog extends StatefulWidget {
final List<MigrationAccountData> migrationData;
final List<MigrationResult> migrationResults;
final Future<void> Function() onMigrate;
final Future<void> Function()? onTryLater;

const MigrationDialog({super.key, required this.migrationData, required this.onMigrate, this.onTryLater});
const MigrationDialog({super.key, required this.migrationResults, required this.onMigrate, this.onTryLater});

static Future<void> show({
required BuildContext context,
required List<MigrationAccountData> migrationData,
required List<MigrationResult> migrationResults,
required Future<void> Function() onMigrate,
Future<void> Function()? onTryLater,
}) {
Expand All @@ -24,7 +24,8 @@ class MigrationDialog extends StatefulWidget {
isDismissible: false,
enableDrag: false,
constraints: BoxConstraints(maxWidth: MediaQuery.of(context).size.width),
builder: (ctx) => MigrationDialog(migrationData: migrationData, onMigrate: onMigrate, onTryLater: onTryLater),
builder: (ctx) =>
MigrationDialog(migrationResults: migrationResults, onMigrate: onMigrate, onTryLater: onTryLater),
);
}

Expand All @@ -38,7 +39,8 @@ class _MigrationDialogState extends State<MigrationDialog> {

@override
Widget build(BuildContext context) {
final accountCount = widget.migrationData.length;
final successCount = widget.migrationResults.whereType<MigrationSuccess>().length;
final failureCount = widget.migrationResults.whereType<MigrationFailure>().length;
final colors = context.colors;
final text = context.themeText;

Expand All @@ -64,9 +66,16 @@ class _MigrationDialogState extends State<MigrationDialog> {
),
const SizedBox(height: 24),
Text(
'$accountCount ${accountCount > 1 ? 'Accounts' : 'Account'} to migrate.',
'$successCount ${successCount == 1 ? 'Account' : 'Accounts'} to migrate.',
style: text.paragraph?.copyWith(fontWeight: FontWeight.w600, color: colors.accentGreen),
),
if (failureCount > 0) ...[
const SizedBox(height: 8),
Text(
'$failureCount ${failureCount == 1 ? 'account' : 'accounts'} cannot be migrated (missing wallet data).',
style: text.smallParagraph?.copyWith(color: colors.accentOrange),
),
],
const SizedBox(height: 40),
if (_errorMessage != null)
Container(
Expand All @@ -79,25 +88,30 @@ class _MigrationDialogState extends State<MigrationDialog> {
QuantusButton.simple(
label: _errorMessage != null ? 'Retry' : 'Migrate Accounts',
isLoading: _isMigrating,
onTap: () async {
setState(() => _isMigrating = true);
try {
await widget.onMigrate();
// ignore: use_build_context_synchronously
if (mounted) Navigator.of(context).pop();
} catch (e) {
if (mounted) {
setState(() => _errorMessage = 'We couldn\'t upload migration data. Please retry or try later.');
}
} finally {
if (mounted) setState(() => _isMigrating = false);
}
},
onTap: successCount == 0
? null
: () async {
setState(() => _isMigrating = true);
try {
await widget.onMigrate();
// ignore: use_build_context_synchronously
if (mounted) Navigator.of(context).pop();
} catch (e) {
if (mounted) {
setState(
() => _errorMessage = 'We couldn\'t upload migration data. Please retry or try later.',
);
}
} finally {
if (mounted) setState(() => _isMigrating = false);
}
},
),
if (_errorMessage != null) ...[
// Show "Try later" when there's an error OR when there are no migratable accounts
if (_errorMessage != null || successCount == 0) ...[
const SizedBox(height: 12),
QuantusButton.simple(
label: 'Try later',
label: successCount == 0 && _errorMessage == null ? 'Skip' : 'Try later',
variant: ButtonVariant.transparent,
onTap: () async {
if (widget.onTryLater != null) await widget.onTryLater!();
Expand Down
Loading
Loading