mirror of
https://github.com/cypherstack/stack_wallet.git
synced 2024-12-22 19:39:22 +00:00
WIP: Add Ethereum
This commit is contained in:
parent
9dc9682686
commit
eca8ca21bc
15 changed files with 426 additions and 52 deletions
BIN
assets/images/ethereum.png
Normal file
BIN
assets/images/ethereum.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 343 KiB |
21
assets/svg/coin_icons/Ethereum.svg
Normal file
21
assets/svg/coin_icons/Ethereum.svg
Normal file
|
@ -0,0 +1,21 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<!-- Creator: CorelDRAW 2019 (64-Bit) -->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="100%" height="100%" version="1.1" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" clip-rule="evenodd"
|
||||
viewBox="0 0 784.37 1277.39"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:xodm="http://www.corel.com/coreldraw/odm/2003">
|
||||
<g id="Layer_x0020_1">
|
||||
<metadata id="CorelCorpID_0Corel-Layer"/>
|
||||
<g id="_1421394342400">
|
||||
<g>
|
||||
<polygon fill="#343434" fill-rule="nonzero" points="392.07,0 383.5,29.11 383.5,873.74 392.07,882.29 784.13,650.54 "/>
|
||||
<polygon fill="#8C8C8C" fill-rule="nonzero" points="392.07,0 -0,650.54 392.07,882.29 392.07,472.33 "/>
|
||||
<polygon fill="#3C3C3B" fill-rule="nonzero" points="392.07,956.52 387.24,962.41 387.24,1263.28 392.07,1277.38 784.37,724.89 "/>
|
||||
<polygon fill="#8C8C8C" fill-rule="nonzero" points="392.07,1277.38 392.07,956.52 -0,724.89 "/>
|
||||
<polygon fill="#141414" fill-rule="nonzero" points="392.07,882.29 784.13,650.54 392.07,472.33 "/>
|
||||
<polygon fill="#393939" fill-rule="nonzero" points="0,650.54 392.07,882.29 392.07,472.33 "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
|
@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
|
|||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:http/http.dart';
|
||||
import 'package:stackwallet/electrumx_rpc/electrumx.dart';
|
||||
import 'package:stackwallet/models/node_model.dart';
|
||||
import 'package:stackwallet/notifications/show_flush_bar.dart';
|
||||
|
@ -30,6 +31,7 @@ import 'package:stackwallet/widgets/stack_dialog.dart';
|
|||
import 'package:stackwallet/widgets/stack_text_field.dart';
|
||||
import 'package:stackwallet/widgets/textfield_icon_button.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
import 'package:web3dart/web3dart.dart';
|
||||
|
||||
enum AddEditNodeViewType { add, edit }
|
||||
|
||||
|
@ -157,11 +159,19 @@ class _AddEditNodeViewState extends ConsumerState<AddEditNodeView> {
|
|||
|
||||
try {
|
||||
testPassed = await client.ping();
|
||||
} catch (_) {
|
||||
testPassed = false;
|
||||
} catch (e, s) {
|
||||
Logging.instance.log("$e\n$s", level: LogLevel.Warning);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case Coin.ethereum:
|
||||
final client = Web3Client(
|
||||
"https://mainnet.infura.io/v3/22677300bf774e49a458b73313ee56ba",
|
||||
Client());
|
||||
try {
|
||||
await client.getSyncStatus();
|
||||
} catch (_) {}
|
||||
}
|
||||
|
||||
if (showFlushBar) {
|
||||
|
@ -695,6 +705,7 @@ class _NodeFormState extends ConsumerState<NodeForm> {
|
|||
return false;
|
||||
|
||||
case Coin.epicCash:
|
||||
case Coin.ethereum:
|
||||
case Coin.monero:
|
||||
case Coin.wownero:
|
||||
return true;
|
||||
|
|
|
@ -7,6 +7,7 @@ import 'package:stackwallet/services/coins/bitcoin/bitcoin_wallet.dart';
|
|||
import 'package:stackwallet/services/coins/bitcoincash/bitcoincash_wallet.dart';
|
||||
import 'package:stackwallet/services/coins/dogecoin/dogecoin_wallet.dart';
|
||||
import 'package:stackwallet/services/coins/epiccash/epiccash_wallet.dart';
|
||||
import 'package:stackwallet/services/coins/ethereum/ethereum_wallet.dart';
|
||||
import 'package:stackwallet/services/coins/firo/firo_wallet.dart';
|
||||
import 'package:stackwallet/services/coins/monero/monero_wallet.dart';
|
||||
import 'package:stackwallet/services/coins/namecoin/namecoin_wallet.dart';
|
||||
|
@ -172,6 +173,14 @@ abstract class CoinServiceAPI {
|
|||
// tracker: tracker,
|
||||
);
|
||||
|
||||
case Coin.ethereum:
|
||||
return EthereumWallet(
|
||||
walletId: walletId,
|
||||
walletName: walletName,
|
||||
coin: coin,
|
||||
secureStore: secureStorageInterface,
|
||||
);
|
||||
|
||||
case Coin.monero:
|
||||
return MoneroWallet(
|
||||
walletId: walletId,
|
||||
|
|
241
lib/services/coins/ethereum/ethereum_wallet.dart
Normal file
241
lib/services/coins/ethereum/ethereum_wallet.dart
Normal file
|
@ -0,0 +1,241 @@
|
|||
import 'dart:math';
|
||||
import 'package:bip39/bip39.dart' as bip39;
|
||||
import 'package:decimal/decimal.dart';
|
||||
import 'package:stackwallet/models/paymint/fee_object_model.dart';
|
||||
import 'package:stackwallet/models/paymint/transactions_model.dart';
|
||||
import 'package:stackwallet/models/paymint/utxo_model.dart';
|
||||
import 'package:stackwallet/services/price.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart';
|
||||
import 'package:string_to_hex/string_to_hex.dart';
|
||||
import 'package:web3dart/credentials.dart';
|
||||
import 'package:web3dart/web3dart.dart';
|
||||
import 'package:http/http.dart';
|
||||
|
||||
import 'package:stackwallet/hive/db.dart';
|
||||
import 'package:stackwallet/utilities/logger.dart';
|
||||
import 'package:stackwallet/services/coins/coin_service.dart';
|
||||
|
||||
const int MINIMUM_CONFIRMATIONS = 1;
|
||||
const int DUST_LIMIT = 294;
|
||||
|
||||
const String GENESIS_HASH_MAINNET =
|
||||
"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f";
|
||||
const String GENESIS_HASH_TESTNET =
|
||||
"000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943";
|
||||
|
||||
class EthereumWallet extends CoinServiceAPI {
|
||||
@override
|
||||
set isFavorite(bool markFavorite) {
|
||||
DB.instance.put<dynamic>(
|
||||
boxName: walletId, key: "isFavorite", value: markFavorite);
|
||||
}
|
||||
|
||||
@override
|
||||
bool get isFavorite {
|
||||
try {
|
||||
return DB.instance.get<dynamic>(boxName: walletId, key: "isFavorite")
|
||||
as bool;
|
||||
} catch (e, s) {
|
||||
Logging.instance.log(
|
||||
"isFavorite fetch failed (returning false by default): $e\n$s",
|
||||
level: LogLevel.Error);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Coin get coin => _coin;
|
||||
|
||||
late SecureStorageInterface _secureStore;
|
||||
|
||||
late PriceAPI _priceAPI;
|
||||
|
||||
EthereumWallet(
|
||||
{required String walletId,
|
||||
required String walletName,
|
||||
required Coin coin,
|
||||
PriceAPI? priceAPI,
|
||||
required SecureStorageInterface secureStore}) {
|
||||
_walletId = walletId;
|
||||
_walletName = walletName;
|
||||
_coin = coin;
|
||||
|
||||
_priceAPI = priceAPI ?? PriceAPI(Client());
|
||||
_secureStore = secureStore;
|
||||
}
|
||||
|
||||
@override
|
||||
bool shouldAutoSync = false;
|
||||
|
||||
@override
|
||||
String get walletName => _walletName;
|
||||
late String _walletName;
|
||||
|
||||
late Coin _coin;
|
||||
|
||||
@override
|
||||
// TODO: implement allOwnAddresses
|
||||
Future<List<String>> get allOwnAddresses => throw UnimplementedError();
|
||||
|
||||
@override
|
||||
// TODO: implement availableBalance
|
||||
Future<Decimal> get availableBalance => throw UnimplementedError();
|
||||
|
||||
@override
|
||||
// TODO: implement balanceMinusMaxFee
|
||||
Future<Decimal> get balanceMinusMaxFee => throw UnimplementedError();
|
||||
|
||||
@override
|
||||
Future<String> confirmSend({required Map<String, dynamic> txData}) {
|
||||
// TODO: implement confirmSend
|
||||
throw UnimplementedError();
|
||||
}
|
||||
|
||||
@override
|
||||
// TODO: implement currentReceivingAddress
|
||||
Future<String> get currentReceivingAddress => throw UnimplementedError();
|
||||
|
||||
@override
|
||||
Future<int> estimateFeeFor(int satoshiAmount, int feeRate) {
|
||||
// TODO: implement estimateFeeFor
|
||||
throw UnimplementedError();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> exit() {
|
||||
// TODO: implement exit
|
||||
throw UnimplementedError();
|
||||
}
|
||||
|
||||
@override
|
||||
// TODO: implement fees
|
||||
Future<FeeObject> get fees => throw UnimplementedError();
|
||||
|
||||
@override
|
||||
Future<void> fullRescan(
|
||||
int maxUnusedAddressGap, int maxNumberOfIndexesToCheck) {
|
||||
// TODO: implement fullRescan
|
||||
throw UnimplementedError();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<bool> generateNewAddress() {
|
||||
// TODO: implement generateNewAddress
|
||||
throw UnimplementedError();
|
||||
}
|
||||
|
||||
@override
|
||||
// TODO: implement hasCalledExit
|
||||
bool get hasCalledExit => throw UnimplementedError();
|
||||
|
||||
@override
|
||||
Future<void> initializeExisting() {
|
||||
// TODO: implement initializeExisting
|
||||
throw UnimplementedError();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> initializeNew() {
|
||||
// TODO: implement initializeNew
|
||||
throw UnimplementedError();
|
||||
}
|
||||
|
||||
@override
|
||||
// TODO: implement isConnected
|
||||
bool get isConnected => throw UnimplementedError();
|
||||
|
||||
@override
|
||||
// TODO: implement isRefreshing
|
||||
bool get isRefreshing => throw UnimplementedError();
|
||||
|
||||
@override
|
||||
// TODO: implement maxFee
|
||||
Future<int> get maxFee => throw UnimplementedError();
|
||||
|
||||
@override
|
||||
// TODO: implement mnemonic
|
||||
Future<List<String>> get mnemonic => throw UnimplementedError();
|
||||
|
||||
@override
|
||||
// TODO: implement pendingBalance
|
||||
Future<Decimal> get pendingBalance => throw UnimplementedError();
|
||||
|
||||
@override
|
||||
Future<Map<String, dynamic>> prepareSend(
|
||||
{required String address,
|
||||
required int satoshiAmount,
|
||||
Map<String, dynamic>? args}) {
|
||||
// TODO: implement prepareSend
|
||||
throw UnimplementedError();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> recoverFromMnemonic(
|
||||
{required String mnemonic,
|
||||
required int maxUnusedAddressGap,
|
||||
required int maxNumberOfIndexesToCheck,
|
||||
required int height}) {
|
||||
// TODO: implement recoverFromMnemonic
|
||||
throw UnimplementedError();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> refresh() {
|
||||
// TODO: implement refresh
|
||||
throw UnimplementedError();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<String> send(
|
||||
{required String toAddress,
|
||||
required int amount,
|
||||
Map<String, String> args = const {}}) {
|
||||
// TODO: implement send
|
||||
throw UnimplementedError();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<bool> testNetworkConnection() {
|
||||
// TODO: implement testNetworkConnection
|
||||
throw UnimplementedError();
|
||||
}
|
||||
|
||||
@override
|
||||
// TODO: implement totalBalance
|
||||
Future<Decimal> get totalBalance => throw UnimplementedError();
|
||||
|
||||
@override
|
||||
// TODO: implement transactionData
|
||||
Future<TransactionData> get transactionData => throw UnimplementedError();
|
||||
|
||||
@override
|
||||
// TODO: implement unspentOutputs
|
||||
Future<List<UtxoObject>> get unspentOutputs => throw UnimplementedError();
|
||||
|
||||
@override
|
||||
Future<void> updateNode(bool shouldRefresh) {
|
||||
// TODO: implement updateNode
|
||||
throw UnimplementedError();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> updateSentCachedTxData(Map<String, dynamic> txData) {
|
||||
// TODO: implement updateSentCachedTxData
|
||||
throw UnimplementedError();
|
||||
}
|
||||
|
||||
@override
|
||||
bool validateAddress(String address) {
|
||||
// TODO: implement validateAddress
|
||||
throw UnimplementedError();
|
||||
}
|
||||
|
||||
@override
|
||||
String get walletId => _walletId;
|
||||
late String _walletId;
|
||||
|
||||
@override
|
||||
@override
|
||||
set walletName(String newName) => _walletName = newName;
|
||||
}
|
|
@ -51,6 +51,8 @@ class AddressUtils {
|
|||
return Address.validateAddress(address, dogecoin);
|
||||
case Coin.epicCash:
|
||||
return validateSendAddress(address) == "1";
|
||||
case Coin.ethereum:
|
||||
return true; //TODO - validate ETH address
|
||||
case Coin.firo:
|
||||
return Address.validateAddress(address, firoNetwork);
|
||||
case Coin.monero:
|
||||
|
|
|
@ -176,6 +176,7 @@ class _SVG {
|
|||
String get bitcoincash => "assets/svg/coin_icons/Bitcoincash.svg";
|
||||
String get dogecoin => "assets/svg/coin_icons/Dogecoin.svg";
|
||||
String get epicCash => "assets/svg/coin_icons/EpicCash.svg";
|
||||
String get ethereum => "assets/svg/coin_icons/Ethereum.svg";
|
||||
String get firo => "assets/svg/coin_icons/Firo.svg";
|
||||
String get monero => "assets/svg/coin_icons/Monero.svg";
|
||||
String get wownero => "assets/svg/coin_icons/Wownero.svg";
|
||||
|
@ -206,6 +207,8 @@ class _SVG {
|
|||
return dogecoin;
|
||||
case Coin.epicCash:
|
||||
return epicCash;
|
||||
case Coin.ethereum:
|
||||
return ethereum;
|
||||
case Coin.firo:
|
||||
return firo;
|
||||
case Coin.monero:
|
||||
|
@ -239,6 +242,7 @@ class _PNG {
|
|||
String get bitcoin => "assets/images/bitcoin.png";
|
||||
String get litecoin => "assets/images/litecoin.png";
|
||||
String get epicCash => "assets/images/epic-cash.png";
|
||||
String get ethereum => "assets/images/ethereum.png";
|
||||
String get bitcoincash => "assets/images/bitcoincash.png";
|
||||
String get namecoin => "assets/images/namecoin.png";
|
||||
|
||||
|
@ -261,6 +265,8 @@ class _PNG {
|
|||
return dogecoin;
|
||||
case Coin.epicCash:
|
||||
return epicCash;
|
||||
case Coin.ethereum:
|
||||
return ethereum;
|
||||
case Coin.firo:
|
||||
return firo;
|
||||
case Coin.firoTestNet:
|
||||
|
|
|
@ -20,6 +20,8 @@ Uri getBlockExplorerTransactionUrlFor({
|
|||
case Coin.epicCash:
|
||||
// TODO: Handle this case.
|
||||
throw UnimplementedError("missing block explorer for epic cash");
|
||||
case Coin.ethereum:
|
||||
return Uri.parse("https://etherscan.io/tx/$txid");
|
||||
case Coin.monero:
|
||||
return Uri.parse("https://xmrchain.net/tx/$txid");
|
||||
case Coin.wownero:
|
||||
|
|
|
@ -53,6 +53,7 @@ abstract class Constants {
|
|||
case Coin.dogecoinTestNet:
|
||||
case Coin.firoTestNet:
|
||||
case Coin.epicCash:
|
||||
case Coin.ethereum:
|
||||
case Coin.namecoin:
|
||||
return _satsPerCoin;
|
||||
|
||||
|
@ -77,6 +78,7 @@ abstract class Constants {
|
|||
case Coin.dogecoinTestNet:
|
||||
case Coin.firoTestNet:
|
||||
case Coin.epicCash:
|
||||
case Coin.ethereum:
|
||||
case Coin.namecoin:
|
||||
return _decimalPlaces;
|
||||
|
||||
|
@ -102,6 +104,7 @@ abstract class Constants {
|
|||
case Coin.dogecoinTestNet:
|
||||
case Coin.firoTestNet:
|
||||
case Coin.epicCash:
|
||||
case Coin.ethereum:
|
||||
case Coin.namecoin:
|
||||
values.addAll([24, 21, 18, 15, 12]);
|
||||
break;
|
||||
|
@ -142,6 +145,9 @@ abstract class Constants {
|
|||
case Coin.epicCash:
|
||||
return 60;
|
||||
|
||||
case Coin.ethereum:
|
||||
return 60;
|
||||
|
||||
case Coin.monero:
|
||||
return 120;
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@ import 'dart:convert';
|
|||
|
||||
import 'package:stackwallet/models/node_model.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:web3dart/browser.dart';
|
||||
|
||||
abstract class DefaultNodes {
|
||||
static const String defaultNodeIdPrefix = "default_";
|
||||
|
@ -133,6 +134,19 @@ abstract class DefaultNodes {
|
|||
isDown: false,
|
||||
);
|
||||
|
||||
//TODO - Update with correct node details for ETH
|
||||
static NodeModel get ethereum => NodeModel(
|
||||
host: "https://mainnet.infura.io/v3/22677300bf774e49a458b73313ee56ba",
|
||||
port: 1234,
|
||||
name: defaultName,
|
||||
id: _nodeId(Coin.ethereum),
|
||||
useSSL: true,
|
||||
enabled: true,
|
||||
coinName: Coin.ethereum.name,
|
||||
isFailover: true,
|
||||
isDown: false,
|
||||
);
|
||||
|
||||
static NodeModel get namecoin => NodeModel(
|
||||
host: "namecoin.stackwallet.com",
|
||||
port: 57002,
|
||||
|
@ -210,6 +224,9 @@ abstract class DefaultNodes {
|
|||
case Coin.epicCash:
|
||||
return epicCash;
|
||||
|
||||
case Coin.ethereum:
|
||||
return ethereum;
|
||||
|
||||
case Coin.firo:
|
||||
return firo;
|
||||
|
||||
|
|
|
@ -5,6 +5,8 @@ import 'package:stackwallet/services/coins/dogecoin/dogecoin_wallet.dart'
|
|||
as doge;
|
||||
import 'package:stackwallet/services/coins/epiccash/epiccash_wallet.dart'
|
||||
as epic;
|
||||
import 'package:stackwallet/services/coins/ethereum/ethereum_wallet.dart'
|
||||
as eth;
|
||||
import 'package:stackwallet/services/coins/firo/firo_wallet.dart' as firo;
|
||||
import 'package:stackwallet/services/coins/litecoin/litecoin_wallet.dart'
|
||||
as ltc;
|
||||
|
@ -19,6 +21,7 @@ enum Coin {
|
|||
bitcoincash,
|
||||
dogecoin,
|
||||
epicCash,
|
||||
ethereum,
|
||||
firo,
|
||||
litecoin,
|
||||
monero,
|
||||
|
@ -52,6 +55,8 @@ extension CoinExt on Coin {
|
|||
return "Dogecoin";
|
||||
case Coin.epicCash:
|
||||
return "Epic Cash";
|
||||
case Coin.ethereum:
|
||||
return "Ethereum";
|
||||
case Coin.firo:
|
||||
return "Firo";
|
||||
case Coin.monero:
|
||||
|
@ -85,6 +90,8 @@ extension CoinExt on Coin {
|
|||
return "DOGE";
|
||||
case Coin.epicCash:
|
||||
return "EPIC";
|
||||
case Coin.ethereum:
|
||||
return "ETH";
|
||||
case Coin.firo:
|
||||
return "FIRO";
|
||||
case Coin.monero:
|
||||
|
@ -119,6 +126,8 @@ extension CoinExt on Coin {
|
|||
case Coin.epicCash:
|
||||
// TODO: is this actually the right one?
|
||||
return "epic";
|
||||
case Coin.ethereum:
|
||||
return "ethereum";
|
||||
case Coin.firo:
|
||||
return "firo";
|
||||
case Coin.monero:
|
||||
|
@ -156,6 +165,7 @@ extension CoinExt on Coin {
|
|||
return true;
|
||||
|
||||
case Coin.epicCash:
|
||||
case Coin.ethereum:
|
||||
case Coin.monero:
|
||||
case Coin.wownero:
|
||||
return false;
|
||||
|
@ -187,6 +197,9 @@ extension CoinExt on Coin {
|
|||
case Coin.epicCash:
|
||||
return epic.MINIMUM_CONFIRMATIONS;
|
||||
|
||||
case Coin.ethereum:
|
||||
return eth.MINIMUM_CONFIRMATIONS;
|
||||
|
||||
case Coin.monero:
|
||||
return xmr.MINIMUM_CONFIRMATIONS;
|
||||
|
||||
|
@ -222,6 +235,10 @@ Coin coinFromPrettyName(String name) {
|
|||
case "epicCash":
|
||||
return Coin.epicCash;
|
||||
|
||||
case "Ethereum":
|
||||
case "ethereum":
|
||||
return Coin.ethereum;
|
||||
|
||||
case "Firo":
|
||||
case "firo":
|
||||
return Coin.firo;
|
||||
|
@ -287,6 +304,8 @@ Coin coinFromTickerCaseInsensitive(String ticker) {
|
|||
return Coin.dogecoin;
|
||||
case "epic":
|
||||
return Coin.epicCash;
|
||||
case "eth":
|
||||
return Coin.ethereum;
|
||||
case "firo":
|
||||
return Coin.firo;
|
||||
case "xmr":
|
||||
|
|
|
@ -217,6 +217,7 @@ class CoinThemeColor {
|
|||
Color get firo => const Color(0xFFFF897A);
|
||||
Color get dogecoin => const Color(0xFFFFE079);
|
||||
Color get epicCash => const Color(0xFFC5C7CB);
|
||||
Color get ethereum => const Color(0xFFC5C7CB); //TODO - USE CORRECT COLOR FOR ETH
|
||||
Color get monero => const Color(0xFFFF9E6B);
|
||||
Color get namecoin => const Color(0xFF91B1E1);
|
||||
Color get wownero => const Color(0xFFED80C1);
|
||||
|
@ -237,6 +238,8 @@ class CoinThemeColor {
|
|||
return dogecoin;
|
||||
case Coin.epicCash:
|
||||
return epicCash;
|
||||
case Coin.ethereum:
|
||||
return ethereum;
|
||||
case Coin.firo:
|
||||
case Coin.firoTestNet:
|
||||
return firo;
|
||||
|
|
|
@ -1434,6 +1434,8 @@ class StackColors extends ThemeExtension<StackColors> {
|
|||
return _coin.dogecoin;
|
||||
case Coin.epicCash:
|
||||
return _coin.epicCash;
|
||||
case Coin.ethereum:
|
||||
return _coin.ethereum;
|
||||
case Coin.firo:
|
||||
case Coin.firoTestNet:
|
||||
return _coin.firo;
|
||||
|
|
128
pubspec.lock
128
pubspec.lock
|
@ -42,7 +42,7 @@ packages:
|
|||
name: archive
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.3.0"
|
||||
version: "3.1.11"
|
||||
args:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -56,14 +56,14 @@ packages:
|
|||
name: asn1lib
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
version: "1.4.0"
|
||||
async:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: async
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.9.0"
|
||||
version: "2.8.2"
|
||||
barcode_scan2:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -169,7 +169,7 @@ packages:
|
|||
name: build_runner_core
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "7.2.6"
|
||||
version: "7.2.7"
|
||||
built_collection:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -183,14 +183,21 @@ packages:
|
|||
name: built_value
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "8.4.1"
|
||||
version: "8.4.2"
|
||||
characters:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: characters
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.2.1"
|
||||
version: "1.2.0"
|
||||
charcode:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: charcode
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.3.1"
|
||||
checked_yaml:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -211,7 +218,7 @@ packages:
|
|||
name: clock
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.1.1"
|
||||
version: "1.1.0"
|
||||
code_builder:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -253,7 +260,7 @@ packages:
|
|||
name: connectivity_plus_platform_interface
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.2.2"
|
||||
version: "1.2.3"
|
||||
connectivity_plus_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -281,7 +288,7 @@ packages:
|
|||
name: coverage
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.5.0"
|
||||
version: "1.2.0"
|
||||
cross_file:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -372,7 +379,7 @@ packages:
|
|||
name: decimal
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.3.0"
|
||||
version: "2.3.2"
|
||||
dependency_validator:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
|
@ -435,7 +442,7 @@ packages:
|
|||
name: fake_async
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.3.1"
|
||||
version: "1.3.0"
|
||||
ffi:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -456,7 +463,7 @@ packages:
|
|||
name: file_picker
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "5.2.1"
|
||||
version: "5.2.4"
|
||||
fixnum:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -543,7 +550,7 @@ packages:
|
|||
name: flutter_mobx
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.6+4"
|
||||
version: "2.0.6+5"
|
||||
flutter_native_splash:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -585,35 +592,35 @@ packages:
|
|||
name: flutter_secure_storage_linux
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.1.1"
|
||||
version: "1.1.2"
|
||||
flutter_secure_storage_macos:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_secure_storage_macos
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.1.1"
|
||||
version: "1.1.2"
|
||||
flutter_secure_storage_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_secure_storage_platform_interface
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.0"
|
||||
version: "1.0.1"
|
||||
flutter_secure_storage_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_secure_storage_web
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.2"
|
||||
version: "1.1.1"
|
||||
flutter_secure_storage_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_secure_storage_windows
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.1.2"
|
||||
version: "1.1.3"
|
||||
flutter_spinkit:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -627,7 +634,7 @@ packages:
|
|||
name: flutter_svg
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.1.5"
|
||||
version: "1.1.6"
|
||||
flutter_test:
|
||||
dependency: "direct dev"
|
||||
description: flutter
|
||||
|
@ -670,7 +677,7 @@ packages:
|
|||
name: graphs
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
version: "2.2.0"
|
||||
hex:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -712,7 +719,7 @@ packages:
|
|||
name: html
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.15.0"
|
||||
version: "0.15.1"
|
||||
http:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -802,6 +809,13 @@ packages:
|
|||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "4.7.0"
|
||||
json_rpc_2:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: json_rpc_2
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.2"
|
||||
jsonrpc2:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -836,7 +850,7 @@ packages:
|
|||
name: lints
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.0"
|
||||
version: "2.0.1"
|
||||
local_auth:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -864,35 +878,35 @@ packages:
|
|||
name: matcher
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.12.12"
|
||||
version: "0.12.11"
|
||||
material_color_utilities:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: material_color_utilities
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.1.5"
|
||||
version: "0.1.4"
|
||||
meta:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: meta
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.8.0"
|
||||
version: "1.7.0"
|
||||
mime:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: mime
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.2"
|
||||
version: "1.0.3"
|
||||
mobx:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: mobx
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.1"
|
||||
version: "2.1.3"
|
||||
mockingjay:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
|
@ -920,7 +934,7 @@ packages:
|
|||
name: mutex
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.0"
|
||||
version: "3.0.1"
|
||||
nm:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -990,7 +1004,7 @@ packages:
|
|||
name: path
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.8.2"
|
||||
version: "1.8.1"
|
||||
path_drawing:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1018,7 +1032,7 @@ packages:
|
|||
name: path_provider_android
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.20"
|
||||
version: "2.0.22"
|
||||
path_provider_ios:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1060,7 +1074,7 @@ packages:
|
|||
name: permission_handler
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "10.1.0"
|
||||
version: "10.2.0"
|
||||
permission_handler_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1144,7 +1158,7 @@ packages:
|
|||
name: pub_semver
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.2"
|
||||
version: "2.1.3"
|
||||
pubspec_parse:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1172,7 +1186,7 @@ packages:
|
|||
name: rational
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.2.0"
|
||||
version: "2.2.2"
|
||||
riverpod:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1200,7 +1214,7 @@ packages:
|
|||
name: rxdart
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.27.5"
|
||||
version: "0.27.7"
|
||||
share_plus:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -1228,7 +1242,7 @@ packages:
|
|||
name: share_plus_platform_interface
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.1.1"
|
||||
version: "3.2.0"
|
||||
share_plus_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1326,7 +1340,7 @@ packages:
|
|||
name: shelf_web_socket
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.2"
|
||||
version: "1.0.3"
|
||||
sky_engine:
|
||||
dependency: transitive
|
||||
description: flutter
|
||||
|
@ -1366,7 +1380,7 @@ packages:
|
|||
name: source_span
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.9.0"
|
||||
version: "1.8.2"
|
||||
stack_trace:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1403,14 +1417,21 @@ packages:
|
|||
name: stream_transform
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.1"
|
||||
version: "2.1.0"
|
||||
string_scanner:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: string_scanner
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.1.1"
|
||||
version: "1.1.0"
|
||||
string_to_hex:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: string_to_hex
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.2.2"
|
||||
string_validator:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -1424,35 +1445,35 @@ packages:
|
|||
name: sync_http
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.3.1"
|
||||
version: "0.3.0"
|
||||
term_glyph:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: term_glyph
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.2.1"
|
||||
version: "1.2.0"
|
||||
test:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: test
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.21.4"
|
||||
version: "1.21.1"
|
||||
test_api:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: test_api
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.4.12"
|
||||
version: "0.4.9"
|
||||
test_core:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: test_core
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.4.16"
|
||||
version: "0.4.13"
|
||||
time:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1501,7 +1522,7 @@ packages:
|
|||
name: typed_data
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.3.1"
|
||||
version: "1.3.0"
|
||||
universal_io:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1515,14 +1536,14 @@ packages:
|
|||
name: url_launcher
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "6.1.6"
|
||||
version: "6.1.7"
|
||||
url_launcher_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_android
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "6.0.19"
|
||||
version: "6.0.22"
|
||||
url_launcher_ios:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1571,7 +1592,7 @@ packages:
|
|||
name: uuid
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.6"
|
||||
version: "3.0.7"
|
||||
vector_math:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1585,7 +1606,7 @@ packages:
|
|||
name: vm_service
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "9.0.0"
|
||||
version: "8.2.2"
|
||||
wakelock:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -1628,6 +1649,13 @@ packages:
|
|||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.2"
|
||||
web3dart:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: web3dart
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.3.5"
|
||||
web_socket_channel:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1655,7 +1683,7 @@ packages:
|
|||
name: win32
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.1"
|
||||
version: "3.1.2"
|
||||
window_size:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
|
|
@ -88,6 +88,11 @@ dependencies:
|
|||
ref: 22279d4bb24ed541b431acd269a1bc50af0f36a0
|
||||
bs58check: ^1.0.2
|
||||
|
||||
# Eth Plugins
|
||||
web3dart:
|
||||
2.3.5
|
||||
string_to_hex: 0.2.2
|
||||
|
||||
# Storage plugins
|
||||
flutter_secure_storage: ^5.0.2
|
||||
hive: ^2.0.5
|
||||
|
@ -207,6 +212,7 @@ flutter:
|
|||
- assets/images/doge.png
|
||||
- assets/images/bitcoin.png
|
||||
- assets/images/epic-cash.png
|
||||
- assets/images/ethereum.png
|
||||
- assets/images/bitcoincash.png
|
||||
- assets/images/namecoin.png
|
||||
- assets/images/glasses.png
|
||||
|
@ -306,6 +312,7 @@ flutter:
|
|||
- assets/svg/coin_icons/Bitcoincash.svg
|
||||
- assets/svg/coin_icons/Dogecoin.svg
|
||||
- assets/svg/coin_icons/EpicCash.svg
|
||||
- assets/svg/coin_icons/Ethereum.svg
|
||||
- assets/svg/coin_icons/Firo.svg
|
||||
- assets/svg/coin_icons/Monero.svg
|
||||
- assets/svg/coin_icons/Wownero.svg
|
||||
|
|
Loading…
Reference in a new issue