mirror of
https://github.com/Such-Software/hash-wallet.git
synced 2026-10-23 06:38:35 +02:00
CW-438 add nano (#1015)
* Fix web3dart versioning issue * Add primary receive address extracted from private key * Implement open wallet functionality * Implement restore wallet from seed functionality * Fixate web3dart version as higher versions cause some issues * Add Initial Transaction priorities for eth Add estimated gas price * Rename priority value to tip * Re-order wallet types * Change ethereum node Fix connection issues * Fix estimating gas for priority * Add case for ethereum to fetch it's seeds * Add case for ethereum to request node * Fix Exchange screen initial pairs * Add initial send transaction flow * Add missing configure for ethereum class * Add Eth address initial setup * Fix Private key for Ethereum wallets * Change sign/send transaction flow * - Fix Conflicts with main - Remove unused function from Haven configure.dart * Add build command for ethereum package * Add missing Node list file to pubspec * - Fix balance display - Fix parsing of Ethereum amount - Add more Ethereum Nodes [skip ci] * - Fix extracting Ethereum Private key from seeds - Integrate signing/sending transaction with the send view model * - Update and Fix Conflicts with main * Add Balances for ERC20 tokens * Fix conflicts with main * Add erc20 abi json * Add send erc20 tokens initial function * add missing getHeightByDate in Haven [skip ci] * Allow contacts and wallets from the same tag * Add Shiba Inu icon * Add send ERC-20 tokens initial flow * Add missing import in generated file * Add initial approach for transaction sending for ERC-20 tokens * Refactor signing/sending transactions * Add initial flow for transactions subscription * Refactor signing/sending transactions * Add home settings icon * Fix conflicts with main * Initial flow for home settings * Add logic flow for adding erc20 tokens * Fix initial UI * Finalize UI for Tokens * Integrate UI with Ethereum flow * Add "Enable/Disable" feature for ERC20 tokens * Add initial Erc20 tokens * Add Sorting and Pin Native Token features * Fix price sorting * Sort tokens list as well when Sort criteria changes * - Improve sorting balances flow - Add initial add token from search bar flow * Fix Accounts Popup UI * Fix Pin native token * Fix Enabling/Disabling tokens Fix sorting by fiat once app is opened Improve token availability mechanism * Fix deleting token Fix renaming tokens * Fix issue with search * Add more tokens * - Fix scroll issue - Add ERC20 tokens placeholder image in picker * - Separate and organize default erc20 tokens - Fix scrolling - Add token placeholder images in picker - Sort disabled tokens alphabetically * Change BNB token initial availability [skip ci] * Fix Conflicts with main * Fix Conflicts with main * Add Verse ERC20 token to the initial tokens list * Add rename wallet to Ethereum * Integrate EtherScan API for fetching address transactions Generate Ethereum specific secrets in Ethereum package * Adjust transactions fiat price for ERC20 tokens * Free Up GitHub Actions Ubuntu Runner Disk Space * Free Up GitHub Actions Ubuntu Runner Disk space (trial 2) * Fix Transaction Fee display * Save transaction history * Enhance loading time for erc20 tokens transactions * Minor Fixes and Enhancements * Fix sending erc20 fix block explorer issue * Fix int overflow * Fix transaction amount conversions * Minor: `slow` -> `Slow` [skip-ci] * initial changes * more base config stuff * config changes * successfully builds! * save * successfully add nano wallet * save * seed generation * receive screen + node screen working * tx history working and fiat fixes * balance working * derivation updates * nano-unfinished * sends working * remove fees from send screen, send and receive transactions working * fixes + auto receive incoming txs * fix for scanning QR codes * save * update translations * fixes * more fixes * more strings * small fix * fix github actions workflow * potential fix * potential fix * ci/cd fix * change rep working * seed generation fixes * fixes * save * change rep screen functional * save * banano changes * fixes, start adding ui for PoW * pow node changes * update translations * fix * account changing barely working * save * disable account generation * small fix * save * UI work * save * fixes after merge main * fixes * remove monero stuff, work on derivation ui * lots of fixes + finish up seed derivation * last minute fixes * node related fixes * more fixes * small fix * more fixes * fixes * pretty big refactor for pow, still some bugs * finally works! * get transactions after send * fix * merge conflict fixes * save * fix pow node showing up twice * done * initial changes * small fix * more merge fixes * fixes * more fixes * fix * save * fix manage pow nodes setting appearing on other wallets * fix contact bug * fixes * fiat fixes * save * save * save * save * updates * cleanup * restore fix * fixes * remove deprecated alert * fix * small fix * remove outdated warning * electrum restore fixes * fixes * fixes * fix * derivation fixes * nano fixes pt.1 * nano fixes pt.2 * bip39 fixes * pownode refactor * nodes pages fixes * observer fix * ssl fix * remove old references * remove unused imports * code cleanup * small fix * small potential fix * save * undo all bitcoin related changes * remove dead code * review fixes * more fixes * fix * fix * review fix * small fix * nano derivation and nanoutil fixes * exchange nano fix * nano review fixes pt.1 * nano fixes pt.2 * nano fixes pt.3 * remove old imports + stop using dynamic in di * nanoutil fixes * add nano.dart to gitignore, configure fixes * review fixes, getnanowalletservice removed * fix settings screen, add changeRep to configure.dart, other minor fixes * remove manage_pow_nodes_page, key derivation edge case handled * remove old refs * more small fixes * Generic Enhancements/Minor fixes * review fixes * hopefully final fixes * review fixes * node connection fixes --------- Co-authored-by: OmarHatem <omarh.ismail1@gmail.com> Co-authored-by: Justin Ehrenhofer <justin.ehrenhofer@gmail.com> Co-authored-by: fossephate <fosse@book.local>
This commit is contained in:
co-authored by
OmarHatem
Justin Ehrenhofer
fossephate
parent
6233422643
commit
4c60b178be
@@ -19,4 +19,4 @@ void main(List<String> args) async {
|
||||
|
||||
appendStringToArbFile(fileName, name, translation);
|
||||
}
|
||||
}
|
||||
}
|
||||
+207
-16
@@ -4,6 +4,7 @@ const bitcoinOutputPath = 'lib/bitcoin/bitcoin.dart';
|
||||
const moneroOutputPath = 'lib/monero/monero.dart';
|
||||
const havenOutputPath = 'lib/haven/haven.dart';
|
||||
const ethereumOutputPath = 'lib/ethereum/ethereum.dart';
|
||||
const nanoOutputPath = 'lib/nano/nano.dart';
|
||||
const walletTypesPath = 'lib/wallet_types.g.dart';
|
||||
const pubspecDefaultPath = 'pubspec_default.yaml';
|
||||
const pubspecOutputPath = 'pubspec.yaml';
|
||||
@@ -14,14 +15,32 @@ Future<void> main(List<String> args) async {
|
||||
final hasMonero = args.contains('${prefix}monero');
|
||||
final hasHaven = args.contains('${prefix}haven');
|
||||
final hasEthereum = args.contains('${prefix}ethereum');
|
||||
final hasNano = args.contains('${prefix}nano');
|
||||
final hasBanano = args.contains('${prefix}banano');
|
||||
|
||||
await generateBitcoin(hasBitcoin);
|
||||
await generateMonero(hasMonero);
|
||||
await generateHaven(hasHaven);
|
||||
await generateEthereum(hasEthereum);
|
||||
await generateNano(hasNano);
|
||||
// await generateBanano(hasEthereum);
|
||||
|
||||
await generatePubspec(
|
||||
hasMonero: hasMonero, hasBitcoin: hasBitcoin, hasHaven: hasHaven, hasEthereum: hasEthereum);
|
||||
hasMonero: hasMonero,
|
||||
hasBitcoin: hasBitcoin,
|
||||
hasHaven: hasHaven,
|
||||
hasEthereum: hasEthereum,
|
||||
hasNano: hasNano,
|
||||
hasBanano: hasBanano,
|
||||
);
|
||||
await generateWalletTypes(
|
||||
hasMonero: hasMonero, hasBitcoin: hasBitcoin, hasHaven: hasHaven, hasEthereum: hasEthereum);
|
||||
hasMonero: hasMonero,
|
||||
hasBitcoin: hasBitcoin,
|
||||
hasHaven: hasHaven,
|
||||
hasEthereum: hasEthereum,
|
||||
hasNano: hasNano,
|
||||
hasBanano: hasBanano,
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> generateBitcoin(bool hasImplementation) async {
|
||||
@@ -549,11 +568,156 @@ abstract class Ethereum {
|
||||
await outputFile.writeAsString(output);
|
||||
}
|
||||
|
||||
Future<void> generatePubspec(
|
||||
{required bool hasMonero,
|
||||
required bool hasBitcoin,
|
||||
required bool hasHaven,
|
||||
required bool hasEthereum}) async {
|
||||
Future<void> generateNano(bool hasImplementation) async {
|
||||
final outputFile = File(nanoOutputPath);
|
||||
const nanoCommonHeaders = """
|
||||
import 'package:cw_core/cake_hive.dart';
|
||||
import 'package:cw_core/nano_account.dart';
|
||||
import 'package:cw_core/account.dart';
|
||||
import 'package:cw_core/node.dart';
|
||||
import 'package:cw_core/wallet_credentials.dart';
|
||||
import 'package:cw_core/wallet_info.dart';
|
||||
import 'package:cw_core/transaction_info.dart';
|
||||
import 'package:cw_core/transaction_history.dart';
|
||||
import 'package:cw_core/wallet_service.dart';
|
||||
import 'package:cw_core/output_info.dart';
|
||||
import 'package:cw_core/nano_account_info_response.dart';
|
||||
import 'package:mobx/mobx.dart';
|
||||
import 'package:hive/hive.dart';
|
||||
import 'package:cake_wallet/view_model/send/output.dart';
|
||||
""";
|
||||
const nanoCWHeaders = """
|
||||
import 'package:cw_nano/nano_client.dart';
|
||||
import 'package:cw_nano/nano_mnemonic.dart';
|
||||
import 'package:cw_nano/nano_wallet.dart';
|
||||
import 'package:cw_nano/nano_wallet_service.dart';
|
||||
import 'package:cw_nano/nano_transaction_info.dart';
|
||||
import 'package:cw_nano/nano_transaction_credentials.dart';
|
||||
import 'package:cw_nano/nano_wallet_creation_credentials.dart';
|
||||
// needed for nano_util:
|
||||
import 'dart:convert';
|
||||
import 'dart:typed_data';
|
||||
import 'package:convert/convert.dart';
|
||||
import "package:ed25519_hd_key/ed25519_hd_key.dart";
|
||||
import 'package:libcrypto/libcrypto.dart';
|
||||
import 'package:nanodart/nanodart.dart' as ND;
|
||||
import 'package:decimal/decimal.dart';
|
||||
""";
|
||||
const nanoCwPart = "part 'cw_nano.dart';";
|
||||
const nanoContent = """
|
||||
abstract class Nano {
|
||||
NanoAccountList getAccountList(Object wallet);
|
||||
|
||||
Account getCurrentAccount(Object wallet);
|
||||
|
||||
void setCurrentAccount(Object wallet, int id, String label, String? balance);
|
||||
|
||||
WalletService createNanoWalletService(Box<WalletInfo> walletInfoSource);
|
||||
|
||||
WalletCredentials createNanoNewWalletCredentials({
|
||||
required String name,
|
||||
String password,
|
||||
});
|
||||
|
||||
WalletCredentials createNanoRestoreWalletFromSeedCredentials({
|
||||
required String name,
|
||||
required String password,
|
||||
required String mnemonic,
|
||||
DerivationType? derivationType,
|
||||
});
|
||||
|
||||
WalletCredentials createNanoRestoreWalletFromKeysCredentials({
|
||||
required String name,
|
||||
required String password,
|
||||
required String seedKey,
|
||||
DerivationType? derivationType,
|
||||
});
|
||||
|
||||
List<String> getNanoWordList(String language);
|
||||
Map<String, String> getKeys(Object wallet);
|
||||
Object createNanoTransactionCredentials(List<Output> outputs);
|
||||
Future<void> changeRep(Object wallet, String address);
|
||||
Future<void> updateTransactions(Object wallet);
|
||||
BigInt getTransactionAmountRaw(TransactionInfo transactionInfo);
|
||||
}
|
||||
|
||||
abstract class NanoAccountList {
|
||||
ObservableList<NanoAccount> get accounts;
|
||||
void update(Object wallet);
|
||||
void refresh(Object wallet);
|
||||
Future<List<NanoAccount>> getAll(Object wallet);
|
||||
Future<void> addAccount(Object wallet, {required String label});
|
||||
Future<void> setLabelAccount(Object wallet, {required int accountIndex, required String label});
|
||||
}
|
||||
|
||||
abstract class NanoUtil {
|
||||
String seedToPrivate(String seed, int index);
|
||||
String seedToAddress(String seed, int index);
|
||||
String seedToMnemonic(String seed);
|
||||
Future<String> mnemonicToSeed(String mnemonic);
|
||||
String privateKeyToPublic(String privateKey);
|
||||
String addressToPublicKey(String publicAddress);
|
||||
String privateKeyToAddress(String privateKey);
|
||||
String publicKeyToAddress(String publicKey);
|
||||
bool isValidSeed(String seed);
|
||||
Future<String> hdMnemonicListToSeed(List<String> words);
|
||||
Future<String> hdSeedToPrivate(String seed, int index);
|
||||
Future<String> hdSeedToAddress(String seed, int index);
|
||||
Future<String> uniSeedToAddress(String seed, int index, String type);
|
||||
Future<String> uniSeedToPrivate(String seed, int index, String type);
|
||||
bool isValidBip39Seed(String seed);
|
||||
static const int maxDecimalDigits = 6; // Max digits after decimal
|
||||
BigInt rawPerNano = BigInt.parse("1000000000000000000000000000000");
|
||||
BigInt rawPerNyano = BigInt.parse("1000000000000000000000000");
|
||||
BigInt rawPerBanano = BigInt.parse("100000000000000000000000000000");
|
||||
BigInt rawPerXMR = BigInt.parse("1000000000000");
|
||||
BigInt convertXMRtoNano = BigInt.parse("1000000000000000000");
|
||||
Decimal getRawAsDecimal(String? raw, BigInt? rawPerCur);
|
||||
String truncateDecimal(Decimal input, {int digits = maxDecimalDigits});
|
||||
String getRawAsUsableString(String? raw, BigInt rawPerCur);
|
||||
String getRawAccuracy(String? raw, BigInt rawPerCur);
|
||||
String getAmountAsRaw(String amount, BigInt rawPerCur);
|
||||
|
||||
// derivationInfo:
|
||||
Future<AccountInfoResponse?> getInfoFromSeedOrMnemonic(
|
||||
DerivationType derivationType, {
|
||||
String? seedKey,
|
||||
String? mnemonic,
|
||||
required Node node,
|
||||
});
|
||||
Future<List<DerivationType>> compareDerivationMethods({
|
||||
String? mnemonic,
|
||||
String? privateKey,
|
||||
required Node node,
|
||||
});
|
||||
}
|
||||
""";
|
||||
|
||||
const nanoEmptyDefinition = 'Nano? nano;\nNanoUtil? nanoUtil = CWNanoUtil();\n';
|
||||
const nanoCWDefinition = 'Nano? nano = CWNano();\nNanoUtil? nanoUtil = CWNanoUtil();\n';
|
||||
|
||||
final output = '$nanoCommonHeaders\n' +
|
||||
(hasImplementation ? '$nanoCWHeaders\n' : '\n') +
|
||||
(hasImplementation ? '$nanoCwPart\n\n' : '\n') +
|
||||
(hasImplementation ? nanoCWDefinition : nanoEmptyDefinition) +
|
||||
'\n' +
|
||||
nanoContent;
|
||||
|
||||
if (outputFile.existsSync()) {
|
||||
await outputFile.delete();
|
||||
}
|
||||
|
||||
await outputFile.writeAsString(output);
|
||||
}
|
||||
|
||||
Future<void> generatePubspec({
|
||||
required bool hasMonero,
|
||||
required bool hasBitcoin,
|
||||
required bool hasHaven,
|
||||
required bool hasEthereum,
|
||||
required bool hasNano,
|
||||
required bool hasBanano,
|
||||
}) async {
|
||||
const cwCore = """
|
||||
cw_core:
|
||||
path: ./cw_core
|
||||
@@ -578,6 +742,14 @@ Future<void> generatePubspec(
|
||||
cw_ethereum:
|
||||
path: ./cw_ethereum
|
||||
""";
|
||||
const cwNano = """
|
||||
cw_nano:
|
||||
path: ./cw_nano
|
||||
""";
|
||||
const cwBanano = """
|
||||
cw_banano:
|
||||
path: ./cw_banano
|
||||
""";
|
||||
final inputFile = File(pubspecOutputPath);
|
||||
final inputText = await inputFile.readAsString();
|
||||
final inputLines = inputText.split('\n');
|
||||
@@ -592,16 +764,24 @@ Future<void> generatePubspec(
|
||||
output += '\n$cwBitcoin';
|
||||
}
|
||||
|
||||
if (hasEthereum) {
|
||||
output += '\n$cwEthereum';
|
||||
}
|
||||
|
||||
if (hasNano) {
|
||||
output += '\n$cwNano';
|
||||
}
|
||||
|
||||
if (hasBanano) {
|
||||
output += '\n$cwBanano';
|
||||
}
|
||||
|
||||
if (hasHaven && !hasMonero) {
|
||||
output += '\n$cwSharedExternal\n$cwHaven';
|
||||
} else if (hasHaven) {
|
||||
output += '\n$cwHaven';
|
||||
}
|
||||
|
||||
if (hasEthereum) {
|
||||
output += '\n$cwEthereum';
|
||||
}
|
||||
|
||||
final outputLines = output.split('\n');
|
||||
inputLines.insertAll(dependenciesIndex + 1, outputLines);
|
||||
final outputContent = inputLines.join('\n');
|
||||
@@ -614,11 +794,14 @@ Future<void> generatePubspec(
|
||||
await outputFile.writeAsString(outputContent);
|
||||
}
|
||||
|
||||
Future<void> generateWalletTypes(
|
||||
{required bool hasMonero,
|
||||
required bool hasBitcoin,
|
||||
required bool hasHaven,
|
||||
required bool hasEthereum}) async {
|
||||
Future<void> generateWalletTypes({
|
||||
required bool hasMonero,
|
||||
required bool hasBitcoin,
|
||||
required bool hasHaven,
|
||||
required bool hasEthereum,
|
||||
required bool hasNano,
|
||||
required bool hasBanano,
|
||||
}) async {
|
||||
final walletTypesFile = File(walletTypesPath);
|
||||
|
||||
if (walletTypesFile.existsSync()) {
|
||||
@@ -645,6 +828,14 @@ Future<void> generateWalletTypes(
|
||||
outputContent += '\tWalletType.litecoin,\n';
|
||||
}
|
||||
|
||||
if (hasNano) {
|
||||
outputContent += '\tWalletType.nano,\n';
|
||||
}
|
||||
|
||||
if (hasBanano) {
|
||||
outputContent += '\tWalletType.banano,\n';
|
||||
}
|
||||
|
||||
if (hasHaven) {
|
||||
outputContent += '\tWalletType.haven,\n';
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user