Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
ce8a12d
feat(hd): integrate hd privkey export
CharlVS Jul 23, 2025
938554c
chore: roll KDF
CharlVS Jul 23, 2025
423b6a0
chore: enable tendermint hd support
CharlVS Jul 23, 2025
ec55546
refactor(rpc): Misc rpc class formats/fixes
CharlVS Jul 23, 2025
0ffd4d9
feat: private keys + fixed Tendermint
CharlVS Jul 26, 2025
d86e5d4
refactor(sdk): implement co-ordinated activation manager
CharlVS Jul 26, 2025
50bf020
fix: invalid path error
CharlVS Jul 26, 2025
7a3116e
fix: remove unnecessary activation logging
CharlVS Jul 26, 2025
29b5481
chore(pr): apply formatting and fixes to PR
CharlVS Jul 26, 2025
4c77699
feat(example): integrate private key export to example app
CharlVS Jul 26, 2025
242b069
chore: roll KDF
CharlVS Jul 27, 2025
4b24883
Merge branch 'dev' of https://github.com/KomodoPlatform/komodo-wallet…
CharlVS Jul 27, 2025
454ac70
chore: roll KDF
CharlVS Jul 28, 2025
cda3780
feat: fee estimation
CharlVS Jul 28, 2025
f5f144b
fix(build): make re-build failure stand out
CharlVS Jul 28, 2025
2ab32ae
chore: roll KDF
CharlVS Jul 28, 2025
182ff66
feat(tx): further progress on fee/priority integration
CharlVS Jul 28, 2025
e756a29
Merge branch 'dev' of https://github.com/KomodoPlatform/komodo-wallet…
CharlVS Jul 28, 2025
3cc9b32
chore: roll KDF fro `v2.6.1`
CharlVS Jul 29, 2025
bc92b1f
fix(api): disable fee/priority features
CharlVS Jul 29, 2025
002b89d
fix: Temporarily disable fee/priority features
CharlVS Jul 29, 2025
d3b4493
feat: add memo support protocol value
CharlVS Jul 29, 2025
4f9dc29
fix: resolve incorrect `unban_pubkeys` parsing
CharlVS Jul 29, 2025
14c0210
fix: resolve regression in legacy withdrawal manager
CharlVS Jul 29, 2025
3a7aec2
feat(security): Include failed activations in privkey export
CharlVS Jul 30, 2025
a0cc8d7
docs(build): expand asset build failure explination
CharlVS Jul 30, 2025
2abf52f
fix: tweak private key type json to match class properties
CharlVS Jul 30, 2025
d03fbe6
fix(RPC): fix new address generation types
CharlVS Jul 30, 2025
76d89df
chore: bump version tags
CharlVS Jul 30, 2025
fd76e40
fix: apply Claude PR review suggestions
CharlVS Jul 30, 2025
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
2 changes: 1 addition & 1 deletion packages/komodo_cex_market_data/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ version: 0.0.1
publish_to: none # publishable packages should not have git dependencies

environment:
sdk: ">=3.6.0 <4.0.0"
sdk: ">=3.7.0 <4.0.0"

# Add regular dependencies here.
dependencies:
Expand Down
2 changes: 1 addition & 1 deletion packages/komodo_coins/lib/src/config_transform.dart
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ class WssWebsocketTransform implements CoinConfigTransform {
@override
bool needsTransform(JsonMap config) {
final electrum = config.valueOrNull<JsonList>('electrum');
return electrum != null && kIsWeb;
return electrum != null;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: WSS Transform Incorrectly Applied on Native Platforms

The WssWebsocketTransform now runs on all platforms due to the removal of the kIsWeb condition from its needsTransform method. This transform is designed for web platforms, which require WSS connections. Applying it on native platforms, where non-WSS servers are supported, will lead to incorrect filtering of electrum servers.

Locations (1)

Fix in CursorFix in Web

}

@override
Expand Down
2 changes: 1 addition & 1 deletion packages/komodo_coins/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: komodo_coins
description: "A package for fetching managing Komodo Platform coin configuration data storage, runtime updates, and queries."
version: 0.2.0+0
version: 0.3.0+0
homepage: "komodoplatform.com"
publish_to: none

Expand Down
1 change: 1 addition & 0 deletions packages/komodo_defi_framework/analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
analyzer:
errors:
public_member_api_docs: ignore
omit_local_variable_types: ignore
include: package:very_good_analysis/analysis_options.6.0.0.yaml
18 changes: 9 additions & 9 deletions packages/komodo_defi_framework/app_build/build_config.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"api": {
"api_commit_hash": "fbab8ec85d65f3bb014d894eabd98717f97ec29a",
"api_commit_hash": "a9fbf6096257b802e0aac4d936dcc5d2f0c28461",
"branch": "main",
"fetch_at_build_enabled": true,
"concurrent_downloads_enabled": true,
Expand All @@ -12,49 +12,49 @@
"web": {
"matching_pattern": "^(?:kdf_[a-f0-9]{7,40}-wasm|mm2_[a-f0-9]{7,40}-wasm|mm2-[a-f0-9]{7,40}-wasm)\\.zip$",
"valid_zip_sha256_checksums": [
"593df1f3f65a2e9faaa58cfd5336cd526eb1fcada037363f0ab9fe5c7e31a0cd"
"d4476637d566a87974ed54bd708e83f9d05a45a7dfae7ade57c0d00b0f0df631"
],
"path": "web/kdf/bin"
},
"ios": {
"matching_pattern": "^(?:kdf_[a-f0-9]{7,40}-ios-aarch64|mm2_[a-f0-9]{7,40}-ios-aarch64|mm2-[a-f0-9]{7,40}-ios-aarch64-CI)\\.zip$",
"valid_zip_sha256_checksums": [
"98e6fd3c04582cc10a0a7b43f98178969b58043148c90313d10a616ad5af90f9"
"efd8e8e738541a4838a2b044edc60030db9a4ba14392e30fb1a152472d4f4313"
],
"path": "ios"
},
"macos": {
"matching_pattern": "^(?:kdf_[a-f0-9]{7,40}-mac-arm64|mm2-[a-f0-9]{7,40}-Darwin-Release)\\.zip$",
"valid_zip_sha256_checksums": [
"d8c4c31366eb91dcb6b41c0248b3b576d714d2731b145a3595b38453474ae356"
"bc411c8d95dbe565b0e56871babaea7412ccbd1ad7f525f3cf56a384a4a77ee7"
],
"path": "macos/bin"
},
"windows": {
"matching_pattern": "^(?:kdf_[a-f0-9]{7,40}-win-x86-64|mm2_[a-f0-9]{7,40}-win-x86-64|mm2-[a-f0-9]{7,40}-Win64)\\.zip$",
"valid_zip_sha256_checksums": [
"1fb6bbad615d23cb6cf5222eb110d89c945e50ce6f04424f69d1720da7a2b81d"
"d9849d01962b4e05899cde7ec17f6b9e8ba9411f484369724c7a73a4b6a3fb80"
],
"path": "windows/bin"
},
"android-armv7": {
"matching_pattern": "^(?:kdf_[a-f0-9]{7,40}-android-armv7|mm2_[a-f0-9]{7,40}-android-armv7|mm2-[a-f0-9]{7,40}-android-armv7-CI)\\.zip$",
"valid_zip_sha256_checksums": [
"0174dcc47ec33648424f914925f19ec969b2dc125c3b85b1df2a011d2742e557"
"10ae609f3c7e4ed47e5a1134dd74da84375f9a1c6538c985afb1c148d58f8756"
],
"path": "android/app/src/main/cpp/libs/armeabi-v7a"
},
"android-aarch64": {
"matching_pattern": "^(?:kdf_[a-f0-9]{7,40}-android-aarch64|mm2_[a-f0-9]{7,40}-android-aarch64|mm2-[a-f0-9]{7,40}-android-aarch64-CI)\\.zip$",
"valid_zip_sha256_checksums": [
"332d91a933cb4aa71de3502b9194ef0b4b69caa97f222ec0a976b59b2bd5fab0"
"ab4b5311e0d1b6b2f57ed1783d5b7a51c4b7558cbf0bad593d9235f6a32db906"
],
"path": "android/app/src/main/cpp/libs/arm64-v8a"
},
"linux": {
"matching_pattern": "^(?:kdf_[a-f0-9]{7,40}-linux-x86-64|mm2_[a-f0-9]{7,40}-linux-x86-64|mm2-[a-f0-9]{7,40}-Linux-Release)\\.zip$",
"valid_zip_sha256_checksums": [
"3878ce652c45be95a547e7622a36773bfd2bc3275631bb2ad8c7ee0ae6990c22"
"913a165e434ed9696c0e8c9a1875bfd6448e291f85d2e7e8dae78618ef3534e3"
],
"path": "linux/bin"
}
Expand All @@ -63,7 +63,7 @@
"coins": {
"fetch_at_build_enabled": true,
"update_commit_on_build": true,
"bundled_coins_repo_commit": "8b8ec47623388e6465c33ccd03c7c7ff13f7bb0b",
"bundled_coins_repo_commit": "1fe493212b34937d82c668e6118a1356d7eb2f06",
"coins_repo_api_url": "https://api.github.com/repos/KomodoPlatform/coins",
"coins_repo_content_url": "https://komodoplatform.github.io/coins",
"coins_repo_branch": "master",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ import 'package:komodo_coins/komodo_coins.dart';
import 'package:komodo_defi_framework/src/config/seed_node_validator.dart';
import 'package:komodo_defi_framework/src/services/seed_node_service.dart'
show SeedNodeService;
import 'package:komodo_defi_types/komodo_defi_types.dart';
import 'package:komodo_defi_types/komodo_defi_type_utils.dart';
import 'package:komodo_defi_types/komodo_defi_types.dart';
import 'package:path/path.dart' as path;
import 'package:path_provider/path_provider.dart';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,6 @@ class KdfOperationsLocalExecutable implements IKdfOperations {
executablePath,
[sensitiveArgs.toJsonString()],
environment: environment,
runInShell: true,
);

_logCallback('Launched executable: $executablePath');
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:komodo_coin_updates/komodo_coin_updates.dart';
import 'package:flutter/foundation.dart';
import 'package:komodo_coin_updates/komodo_coin_updates.dart';
import 'package:komodo_defi_framework/src/config/kdf_logging_config.dart';
import 'package:komodo_defi_framework/src/config/seed_node_validator.dart';
import 'package:komodo_defi_types/komodo_defi_types.dart';
Expand Down
2 changes: 1 addition & 1 deletion packages/komodo_defi_framework/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: komodo_defi_framework
description: "A Flutter plugin for the Komodo DeFi Framework, supporting both
native (FFI) and web (WASM) platforms."
version: 0.2.0
version: 0.3.0+0
homepage: https://komodoplatform.com
publish_to: "none"

Expand Down
2 changes: 1 addition & 1 deletion packages/komodo_defi_local_auth/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: komodo_defi_local_auth
description: A package responsible for managing and abstracting out an
authentication service on top of the API's methods
version: 0.2.0+0
version: 0.3.0+0
publish_to: none

environment:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'package:komodo_defi_types/komodo_defi_type_utils.dart';

class TendermintActivationParams extends ActivationParams {
TendermintActivationParams({
required super.mode,
required this.rpcUrls,
required List<TokensRequest> tokensParams,
required this.getBalances,
Expand All @@ -13,30 +14,39 @@ class TendermintActivationParams extends ActivationParams {
super.privKeyPolicy,
}) : _tokensParams = tokensParams;

factory TendermintActivationParams.fromJson(
JsonMap json, {
PrivateKeyPolicy? privKeyPolicy,
}) {
factory TendermintActivationParams.fromJson(JsonMap json) {
final base = ActivationParams.fromConfigJson(json);

final rpcUrls =
json
.value<JsonList>('rpc_urls')
.map((e) => EvmNode.fromJson(e).url)
.toList();
final tokensParams =
json
.valueOrNull<List<dynamic>>('tokens_params')
?.map((e) => TokensRequest.fromJson(e as JsonMap))
.toList() ??
[];
final getBalances = json.valueOrNull<bool>('get_balances') ?? true;
final txHistory = json.valueOrNull<bool>('tx_history') ?? false;
final nodes =
json.value<JsonList>('rpc_urls').map(EvmNode.fromJson).toList();

return TendermintActivationParams(
rpcUrls:
json
.value<JsonList>('rpc_urls')
.map((e) => EvmNode.fromJson(e).url)
.toList(),
tokensParams:
json
.valueOrNull<List<dynamic>>('tokens_params')
?.map((e) => TokensRequest.fromJson(e as JsonMap))
.toList() ??
[],
txHistory: json.valueOrNull<bool>('tx_history') ?? false,
mode:
base.mode ??
(throw const FormatException(
'Tendermint activation requires mode parameter',
)),
rpcUrls: rpcUrls,
tokensParams: tokensParams,
txHistory: txHistory,
requiredConfirmations: base.requiredConfirmations,
requiresNotarization: base.requiresNotarization,
getBalances: json.valueOrNull<bool>('get_balances') ?? true,
privKeyPolicy: privKeyPolicy ?? base.privKeyPolicy,
nodes: json.value<JsonList>('rpc_urls').map(EvmNode.fromJson).toList(),
getBalances: getBalances,
privKeyPolicy: base.privKeyPolicy,
nodes: nodes,
);
}

Expand All @@ -59,14 +69,18 @@ class TendermintActivationParams extends ActivationParams {
List<EvmNode>? nodes,
}) {
return TendermintActivationParams(
mode: mode,
rpcUrls: rpcUrls ?? this.rpcUrls,
tokensParams: tokensParams ?? _tokensParams,
txHistory: txHistory ?? this.txHistory,
requiredConfirmations:
requiredConfirmations ?? this.requiredConfirmations,
requiresNotarization: requiresNotarization ?? this.requiresNotarization,
getBalances: getBalances ?? this.getBalances,
privKeyPolicy: privKeyPolicy ?? this.privKeyPolicy,
privKeyPolicy:
privKeyPolicy ??
this.privKeyPolicy ??
const PrivateKeyPolicy.contextPrivKey(),
nodes: nodes ?? this.nodes,
);
}
Expand All @@ -80,39 +94,41 @@ class TendermintActivationParams extends ActivationParams {
'get_balances': getBalances,
'nodes': nodes.map((e) => e.toJson()).toList(),
'tx_history': txHistory,
'priv_key_policy':
(privKeyPolicy ?? const PrivateKeyPolicy.contextPrivKey())
.pascalCaseName,
};
}
}

// tendermint_token_activation_params.dart
/// Simple activation params for Tendermint tokens - single address only
class TendermintTokenActivationParams extends ActivationParams {
TendermintTokenActivationParams({
required super.mode,
super.requiredConfirmations,
super.privKeyPolicy,
});

factory TendermintTokenActivationParams.fromJson(
JsonMap json, {
PrivateKeyPolicy? privKeyPolicy,
}) {
factory TendermintTokenActivationParams.fromJson(JsonMap json) {
final base = ActivationParams.fromConfigJson(json);

return TendermintTokenActivationParams(
mode:
base.mode ??
(throw const FormatException(
'Tendermint token activation requires mode parameter',
)),
requiredConfirmations: base.requiredConfirmations ?? 3,
privKeyPolicy: privKeyPolicy ?? base.privKeyPolicy,
privKeyPolicy: base.privKeyPolicy,
);
}

@override
JsonMap toRpcParams() {
return {
...super.toRpcParams(),
'priv_key_policy':
(privKeyPolicy ?? const PrivateKeyPolicy.contextPrivKey())
.pascalCaseName,
};
TendermintTokenActivationParams copyWith({
int? requiredConfirmations,
PrivateKeyPolicy? privKeyPolicy,
}) {
return TendermintTokenActivationParams(
mode: mode,
requiredConfirmations:
requiredConfirmations ?? this.requiredConfirmations,
privKeyPolicy: privKeyPolicy ?? this.privKeyPolicy,
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,35 +7,60 @@ class NewAddressInfo extends Equatable {
required this.address,
required this.derivationPath,
required this.chain,
required this.balance,
required this.balances,
});

factory NewAddressInfo.fromJson(Map<String, dynamic> json) {
final balanceMap = json.value<JsonMap>('balance');
final balances = <String, BalanceInfo>{};

for (final entry in balanceMap.entries) {
balances[entry.key] = BalanceInfo.fromJson(entry.value as JsonMap);
}

return NewAddressInfo(
address: json.value<String>('address'),
derivationPath: json.valueOrNull<String>('derivation_path'),
chain: json.valueOrNull<String>('chain'),
balance: BalanceInfo.fromJson(
json.value<JsonMap>('balance').entries.single.value as JsonMap,
),
balances: balances,
);
}
final String address;
final BalanceInfo balance;
final Map<String, BalanceInfo> balances;

/// Get balance for a specific coin ticker
BalanceInfo? getBalanceForCoin(String coinTicker) => balances[coinTicker];

/// Get the first balance entry (for backwards compatibility)
BalanceInfo get balance {
assert(
balances.length == 1,
'Expected 1 balance entry, got ${balances.length}',
);
return balances.values.fold(
BalanceInfo.zero(),
(total, balance) => total + balance,
);
}

// HD Wallet properties (Null if not HD Wallet)
final String? derivationPath;
final String? chain;

Map<String, dynamic> toJson() {
final balanceMap = <String, dynamic>{};
for (final entry in balances.entries) {
balanceMap[entry.key] = entry.value.toJson();
}

return {
'address': address,
'derivation_path': derivationPath,
'chain': chain,
'balance': balance.toJson(),
'balance': balanceMap,
};
}

@override
List<Object?> get props => [address, derivationPath, chain, balance];
List<Object?> get props => [address, derivationPath, chain, balances];
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ class TaskStatusRequest
required this.taskId,
required super.rpcPass,
required super.method,
}) : super(mmrpc: '2.0');
}) : super(mmrpc: RpcVersion.v2_0);

final int taskId;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
// }) : super(
// method: 'enable_bch_with_tokens',
// rpcPass: rpcPass,
// mmrpc: '2.0',
// mmrpc: RpcVersion.v2_0,
// params: activationParams,
// );

Expand Down Expand Up @@ -55,7 +55,7 @@
// }) : super(
// method: 'enable_erc20',
// rpcPass: rpcPass,
// mmrpc: '2.0',
// mmrpc: RpcVersion.v2_0,
// params: activationParams,
// );

Expand Down Expand Up @@ -88,7 +88,7 @@
// }) : super(
// method: 'enable_tendermint_token',
// rpcPass: rpcPass,
// mmrpc: '2.0',
// mmrpc: RpcVersion.v2_0,
// params: activationParams,
// );

Expand Down
Loading
Loading