diff --git a/.gitignore b/.gitignore index 84a7ecdcd..7777bc3cc 100644 --- a/.gitignore +++ b/.gitignore @@ -135,6 +135,7 @@ lib/ethereum/ethereum.dart lib/bitcoin_cash/bitcoin_cash.dart lib/nano/nano.dart lib/polygon/polygon.dart +lib/gnosis/gnosis.dart lib/solana/solana.dart lib/tron/tron.dart lib/wownero/wownero.dart diff --git a/cakewallet.bat b/cakewallet.bat index 1904c5710..64c6f52be 100644 --- a/cakewallet.bat +++ b/cakewallet.bat @@ -1,5 +1,5 @@ @echo off -set cw_win_app_config=--monero --bitcoin --ethereum --polygon --nano --bitcoinCash --solana --tron +set cw_win_app_config=--monero --bitcoin --ethereum --polygon --gnosis --nano --bitcoinCash --solana --tron set cw_root=%cd% set cw_archive_name=Cake Wallet.zip set cw_archive_path=%cw_root%\%cw_archive_name% diff --git a/scripts/android/pubspec_gen.sh b/scripts/android/pubspec_gen.sh index b980f877d..f86afa095 100755 --- a/scripts/android/pubspec_gen.sh +++ b/scripts/android/pubspec_gen.sh @@ -10,7 +10,7 @@ case $APP_ANDROID_TYPE in CONFIG_ARGS="--monero" ;; $CAKEWALLET) - CONFIG_ARGS="--monero --bitcoin --ethereum --polygon --nano --bitcoinCash --solana --tron --wownero --zano --decred" + CONFIG_ARGS="--monero --bitcoin --ethereum --polygon --gnosis --nano --bitcoinCash --solana --tron --wownero --zano --decred" ;; esac diff --git a/scripts/ios/app_config.sh b/scripts/ios/app_config.sh index b642d67e4..0eb3e2199 100755 --- a/scripts/ios/app_config.sh +++ b/scripts/ios/app_config.sh @@ -31,7 +31,7 @@ case $APP_IOS_TYPE in ;; $CAKEWALLET) - CONFIG_ARGS="--monero --bitcoin --ethereum --polygon --nano --bitcoinCash --solana --tron --wownero --zano --decred" + CONFIG_ARGS="--monero --bitcoin --ethereum --polygon --gnosis --nano --bitcoinCash --solana --tron --wownero --zano --decred" ;; esac diff --git a/scripts/linux/app_config.sh b/scripts/linux/app_config.sh index 5d9d8597b..dff88f74b 100755 --- a/scripts/linux/app_config.sh +++ b/scripts/linux/app_config.sh @@ -13,7 +13,7 @@ CONFIG_ARGS="" case $APP_LINUX_TYPE in $CAKEWALLET) - CONFIG_ARGS="--monero --bitcoin --ethereum --polygon --nano --bitcoinCash --solana --tron --wownero --excludeFlutterSecureStorage";; + CONFIG_ARGS="--monero --bitcoin --ethereum --polygon --gnosis --nano --bitcoinCash --solana --tron --wownero --excludeFlutterSecureStorage";; esac cp -rf pubspec_description.yaml pubspec.yaml diff --git a/scripts/macos/app_config.sh b/scripts/macos/app_config.sh index 641a7b46b..3b8696db2 100755 --- a/scripts/macos/app_config.sh +++ b/scripts/macos/app_config.sh @@ -36,7 +36,7 @@ case $APP_MACOS_TYPE in $MONERO_COM) CONFIG_ARGS="--monero";; $CAKEWALLET) - CONFIG_ARGS="--monero --bitcoin --ethereum --polygon --nano --bitcoinCash --solana --tron --wownero";; + CONFIG_ARGS="--monero --bitcoin --ethereum --polygon --gnosis --nano --bitcoinCash --solana --tron --wownero";; esac cp -rf pubspec_description.yaml pubspec.yaml diff --git a/tool/configure.dart b/tool/configure.dart index 612958f4a..dec1132c5 100644 --- a/tool/configure.dart +++ b/tool/configure.dart @@ -6,6 +6,7 @@ const ethereumOutputPath = 'lib/ethereum/ethereum.dart'; const bitcoinCashOutputPath = 'lib/bitcoin_cash/bitcoin_cash.dart'; const nanoOutputPath = 'lib/nano/nano.dart'; const polygonOutputPath = 'lib/polygon/polygon.dart'; +const gnosisOutputPath = 'lib/gnosis/gnosis.dart'; const solanaOutputPath = 'lib/solana/solana.dart'; const tronOutputPath = 'lib/tron/tron.dart'; const wowneroOutputPath = 'lib/wownero/wownero.dart'; @@ -25,6 +26,7 @@ Future main(List args) async { final hasNano = args.contains('${prefix}nano'); final hasBanano = args.contains('${prefix}banano'); final hasPolygon = args.contains('${prefix}polygon'); + final hasGnosis = args.contains('${prefix}gnosis'); final hasSolana = args.contains('${prefix}solana'); final hasTron = args.contains('${prefix}tron'); final hasWownero = args.contains('${prefix}wownero'); @@ -38,6 +40,7 @@ Future main(List args) async { await generateBitcoinCash(hasBitcoinCash); await generateNano(hasNano); await generatePolygon(hasPolygon); + await generateGnosis(hasGnosis); await generateSolana(hasSolana); await generateTron(hasTron); await generateWownero(hasWownero); @@ -54,6 +57,7 @@ Future main(List args) async { hasBitcoinCash: hasBitcoinCash, hasFlutterSecureStorage: !excludeFlutterSecureStorage, hasPolygon: hasPolygon, + hasGnosis: hasGnosis, hasSolana: hasSolana, hasTron: hasTron, hasWownero: hasWownero, @@ -68,6 +72,7 @@ Future main(List args) async { hasBanano: hasBanano, hasBitcoinCash: hasBitcoinCash, hasPolygon: hasPolygon, + hasGnosis: hasGnosis, hasSolana: hasSolana, hasTron: hasTron, hasWownero: hasWownero, @@ -875,6 +880,113 @@ abstract class Polygon { await outputFile.writeAsString(output); } +Future generateGnosis(bool hasImplementation) async { + final outputFile = File(gnosisOutputPath); + const gnosisCommonHeaders = """ +import 'package:cake_wallet/view_model/hardware_wallet/ledger_view_model.dart'; +import 'package:cake_wallet/view_model/send/output.dart'; +import 'package:cw_core/crypto_currency.dart'; +import 'package:cw_core/erc20_token.dart'; +import 'package:cw_core/hardware/hardware_account_data.dart'; +import 'package:cw_core/output_info.dart'; +import 'package:cw_core/transaction_info.dart'; +import 'package:cw_core/transaction_priority.dart'; +import 'package:cw_core/wallet_base.dart'; +import 'package:cw_core/wallet_credentials.dart'; +import 'package:cw_core/wallet_info.dart'; +import 'package:cw_core/wallet_service.dart'; +import 'package:cw_core/utils/print_verbose.dart'; +import 'package:hive/hive.dart'; +import 'package:ledger_flutter_plus/ledger_flutter_plus.dart' as ledger; +import 'package:web3dart/web3dart.dart'; + +"""; + const gnosisCWHeaders = """ +import 'package:cw_evm/evm_chain_formatter.dart'; +import 'package:cw_evm/evm_chain_mnemonics.dart'; +import 'package:cw_evm/evm_chain_transaction_credentials.dart'; +import 'package:cw_evm/evm_chain_transaction_info.dart'; +import 'package:cw_evm/evm_chain_transaction_priority.dart'; +import 'package:cw_evm/evm_chain_wallet_creation_credentials.dart'; +import 'package:cw_evm/evm_chain_hardware_wallet_service.dart'; +import 'package:cw_evm/evm_ledger_credentials.dart'; +import 'package:cw_evm/evm_chain_wallet.dart'; + +import 'package:cw_gnosis/gnosis_client.dart'; +import 'package:cw_gnosis/gnosis_wallet.dart'; +import 'package:cw_gnosis/gnosis_wallet_service.dart'; +import 'package:cw_gnosis/default_gnosis_erc20_tokens.dart'; + +import 'package:eth_sig_util/util/utils.dart'; + +"""; + const gnosisCwPart = "part 'cw_gnosis.dart';"; + const gnosisContent = """ +abstract class Gnosis { + List getGnosisWordList(String language); + WalletService createGnosisWalletService(Box walletInfoSource, bool isDirect); + WalletCredentials createGnosisNewWalletCredentials({required String name, WalletInfo? walletInfo, String? password, String? mnemonic, String? passphrase}); + WalletCredentials createGnosisRestoreWalletFromSeedCredentials({required String name, required String mnemonic, required String password, String? passphrase}); + WalletCredentials createGnosisRestoreWalletFromPrivateKey({required String name, required String privateKey, required String password}); + WalletCredentials createGnosisHardwareWalletCredentials({required String name, required HardwareAccountData hwAccountData, WalletInfo? walletInfo}); + String getAddress(WalletBase wallet); + String getPrivateKey(WalletBase wallet); + String getPublicKey(WalletBase wallet); + TransactionPriority getDefaultTransactionPriority(); + TransactionPriority getGnosisTransactionPrioritySlow(); + List getTransactionPriorities(); + TransactionPriority deserializeGnosisTransactionPriority(int raw); + + Object createGnosisTransactionCredentials( + List outputs, { + required TransactionPriority priority, + required CryptoCurrency currency, + int? feeRate, + }); + + Object createGnosisTransactionCredentialsRaw( + List outputs, { + TransactionPriority? priority, + required CryptoCurrency currency, + required int feeRate, + }); + + int formatterGnosisParseAmount(String amount); + double formatterGnosisAmountToDouble({TransactionInfo? transaction, BigInt? amount, int exponent = 18}); + List getERC20Currencies(WalletBase wallet); + Future addErc20Token(WalletBase wallet, CryptoCurrency token); + Future deleteErc20Token(WalletBase wallet, CryptoCurrency token); + Future removeTokenTransactionsInHistory(WalletBase wallet, CryptoCurrency token); + Future getErc20Token(WalletBase wallet, String contractAddress); + + CryptoCurrency assetOfTransaction(WalletBase wallet, TransactionInfo transaction); + void updateGnosisScanUsageState(WalletBase wallet, bool isEnabled); + Web3Client? getWeb3Client(WalletBase wallet); + String getTokenAddress(CryptoCurrency asset); + + void setLedgerConnection(WalletBase wallet, ledger.LedgerConnection connection); + Future> getHardwareWalletAccounts(LedgerViewModel ledgerVM, {int index = 0, int limit = 5}); + List getDefaultTokenContractAddresses(); +} + """; + + const gnosisEmptyDefinition = 'Gnosis? gnosis;\n'; + const gnosisCWDefinition = 'Gnosis? gnosis = CWGnosis();\n'; + + final output = '$gnosisCommonHeaders\n' + + (hasImplementation ? '$gnosisCWHeaders\n' : '\n') + + (hasImplementation ? '$gnosisCwPart\n\n' : '\n') + + (hasImplementation ? gnosisCWDefinition : gnosisEmptyDefinition) + + '\n' + + gnosisContent; + + if (outputFile.existsSync()) { + await outputFile.delete(); + } + + await outputFile.writeAsString(output); +} + Future generateBitcoinCash(bool hasImplementation) async { final outputFile = File(bitcoinCashOutputPath); const bitcoinCashCommonHeaders = """ @@ -1400,6 +1512,7 @@ Future generatePubspec({ required bool hasBitcoinCash, required bool hasFlutterSecureStorage, required bool hasPolygon, + required bool hasGnosis, required bool hasSolana, required bool hasTron, required bool hasWownero, @@ -1445,6 +1558,10 @@ Future generatePubspec({ cw_polygon: path: ./cw_polygon """; + const cwGnosis = """ + cw_gnosis: + path: ./cw_gnosis + """; const cwSolana = """ cw_solana: path: ./cw_solana @@ -1506,6 +1623,10 @@ Future generatePubspec({ output += '\n$cwPolygon'; } + if (hasGnosis) { + output += '\n$cwGnosis'; + } + if (hasSolana) { output += '\n$cwSolana'; } @@ -1554,6 +1675,7 @@ Future generateWalletTypes({ required bool hasBanano, required bool hasBitcoinCash, required bool hasPolygon, + required bool hasGnosis, required bool hasSolana, required bool hasTron, required bool hasWownero, @@ -1594,6 +1716,10 @@ Future generateWalletTypes({ outputContent += '\tWalletType.polygon,\n'; } + if (hasGnosis) { + outputContent += '\tWalletType.gnosis,\n'; + } + if (hasSolana) { outputContent += '\tWalletType.solana,\n'; }