WIP: Add Ethereum

This commit is contained in:
likho 2022-12-13 19:39:19 +02:00
parent 9dc9682686
commit eca8ca21bc
15 changed files with 426 additions and 52 deletions

BIN
assets/images/ethereum.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 KiB

View 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

View file

@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:http/http.dart';
import 'package:stackwallet/electrumx_rpc/electrumx.dart'; import 'package:stackwallet/electrumx_rpc/electrumx.dart';
import 'package:stackwallet/models/node_model.dart'; import 'package:stackwallet/models/node_model.dart';
import 'package:stackwallet/notifications/show_flush_bar.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/stack_text_field.dart';
import 'package:stackwallet/widgets/textfield_icon_button.dart'; import 'package:stackwallet/widgets/textfield_icon_button.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
import 'package:web3dart/web3dart.dart';
enum AddEditNodeViewType { add, edit } enum AddEditNodeViewType { add, edit }
@ -157,11 +159,19 @@ class _AddEditNodeViewState extends ConsumerState<AddEditNodeView> {
try { try {
testPassed = await client.ping(); testPassed = await client.ping();
} catch (_) { } catch (e, s) {
testPassed = false; Logging.instance.log("$e\n$s", level: LogLevel.Warning);
} }
break; break;
case Coin.ethereum:
final client = Web3Client(
"https://mainnet.infura.io/v3/22677300bf774e49a458b73313ee56ba",
Client());
try {
await client.getSyncStatus();
} catch (_) {}
} }
if (showFlushBar) { if (showFlushBar) {
@ -695,6 +705,7 @@ class _NodeFormState extends ConsumerState<NodeForm> {
return false; return false;
case Coin.epicCash: case Coin.epicCash:
case Coin.ethereum:
case Coin.monero: case Coin.monero:
case Coin.wownero: case Coin.wownero:
return true; return true;

View file

@ -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/bitcoincash/bitcoincash_wallet.dart';
import 'package:stackwallet/services/coins/dogecoin/dogecoin_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/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/firo/firo_wallet.dart';
import 'package:stackwallet/services/coins/monero/monero_wallet.dart'; import 'package:stackwallet/services/coins/monero/monero_wallet.dart';
import 'package:stackwallet/services/coins/namecoin/namecoin_wallet.dart'; import 'package:stackwallet/services/coins/namecoin/namecoin_wallet.dart';
@ -172,6 +173,14 @@ abstract class CoinServiceAPI {
// tracker: tracker, // tracker: tracker,
); );
case Coin.ethereum:
return EthereumWallet(
walletId: walletId,
walletName: walletName,
coin: coin,
secureStore: secureStorageInterface,
);
case Coin.monero: case Coin.monero:
return MoneroWallet( return MoneroWallet(
walletId: walletId, walletId: walletId,

View 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;
}

View file

@ -51,6 +51,8 @@ class AddressUtils {
return Address.validateAddress(address, dogecoin); return Address.validateAddress(address, dogecoin);
case Coin.epicCash: case Coin.epicCash:
return validateSendAddress(address) == "1"; return validateSendAddress(address) == "1";
case Coin.ethereum:
return true; //TODO - validate ETH address
case Coin.firo: case Coin.firo:
return Address.validateAddress(address, firoNetwork); return Address.validateAddress(address, firoNetwork);
case Coin.monero: case Coin.monero:

View file

@ -176,6 +176,7 @@ class _SVG {
String get bitcoincash => "assets/svg/coin_icons/Bitcoincash.svg"; String get bitcoincash => "assets/svg/coin_icons/Bitcoincash.svg";
String get dogecoin => "assets/svg/coin_icons/Dogecoin.svg"; String get dogecoin => "assets/svg/coin_icons/Dogecoin.svg";
String get epicCash => "assets/svg/coin_icons/EpicCash.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 firo => "assets/svg/coin_icons/Firo.svg";
String get monero => "assets/svg/coin_icons/Monero.svg"; String get monero => "assets/svg/coin_icons/Monero.svg";
String get wownero => "assets/svg/coin_icons/Wownero.svg"; String get wownero => "assets/svg/coin_icons/Wownero.svg";
@ -206,6 +207,8 @@ class _SVG {
return dogecoin; return dogecoin;
case Coin.epicCash: case Coin.epicCash:
return epicCash; return epicCash;
case Coin.ethereum:
return ethereum;
case Coin.firo: case Coin.firo:
return firo; return firo;
case Coin.monero: case Coin.monero:
@ -239,6 +242,7 @@ class _PNG {
String get bitcoin => "assets/images/bitcoin.png"; String get bitcoin => "assets/images/bitcoin.png";
String get litecoin => "assets/images/litecoin.png"; String get litecoin => "assets/images/litecoin.png";
String get epicCash => "assets/images/epic-cash.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 bitcoincash => "assets/images/bitcoincash.png";
String get namecoin => "assets/images/namecoin.png"; String get namecoin => "assets/images/namecoin.png";
@ -261,6 +265,8 @@ class _PNG {
return dogecoin; return dogecoin;
case Coin.epicCash: case Coin.epicCash:
return epicCash; return epicCash;
case Coin.ethereum:
return ethereum;
case Coin.firo: case Coin.firo:
return firo; return firo;
case Coin.firoTestNet: case Coin.firoTestNet:

View file

@ -20,6 +20,8 @@ Uri getBlockExplorerTransactionUrlFor({
case Coin.epicCash: case Coin.epicCash:
// TODO: Handle this case. // TODO: Handle this case.
throw UnimplementedError("missing block explorer for epic cash"); throw UnimplementedError("missing block explorer for epic cash");
case Coin.ethereum:
return Uri.parse("https://etherscan.io/tx/$txid");
case Coin.monero: case Coin.monero:
return Uri.parse("https://xmrchain.net/tx/$txid"); return Uri.parse("https://xmrchain.net/tx/$txid");
case Coin.wownero: case Coin.wownero:

View file

@ -53,6 +53,7 @@ abstract class Constants {
case Coin.dogecoinTestNet: case Coin.dogecoinTestNet:
case Coin.firoTestNet: case Coin.firoTestNet:
case Coin.epicCash: case Coin.epicCash:
case Coin.ethereum:
case Coin.namecoin: case Coin.namecoin:
return _satsPerCoin; return _satsPerCoin;
@ -77,6 +78,7 @@ abstract class Constants {
case Coin.dogecoinTestNet: case Coin.dogecoinTestNet:
case Coin.firoTestNet: case Coin.firoTestNet:
case Coin.epicCash: case Coin.epicCash:
case Coin.ethereum:
case Coin.namecoin: case Coin.namecoin:
return _decimalPlaces; return _decimalPlaces;
@ -102,6 +104,7 @@ abstract class Constants {
case Coin.dogecoinTestNet: case Coin.dogecoinTestNet:
case Coin.firoTestNet: case Coin.firoTestNet:
case Coin.epicCash: case Coin.epicCash:
case Coin.ethereum:
case Coin.namecoin: case Coin.namecoin:
values.addAll([24, 21, 18, 15, 12]); values.addAll([24, 21, 18, 15, 12]);
break; break;
@ -142,6 +145,9 @@ abstract class Constants {
case Coin.epicCash: case Coin.epicCash:
return 60; return 60;
case Coin.ethereum:
return 60;
case Coin.monero: case Coin.monero:
return 120; return 120;

View file

@ -2,6 +2,7 @@ import 'dart:convert';
import 'package:stackwallet/models/node_model.dart'; import 'package:stackwallet/models/node_model.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:web3dart/browser.dart';
abstract class DefaultNodes { abstract class DefaultNodes {
static const String defaultNodeIdPrefix = "default_"; static const String defaultNodeIdPrefix = "default_";
@ -133,6 +134,19 @@ abstract class DefaultNodes {
isDown: false, 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( static NodeModel get namecoin => NodeModel(
host: "namecoin.stackwallet.com", host: "namecoin.stackwallet.com",
port: 57002, port: 57002,
@ -210,6 +224,9 @@ abstract class DefaultNodes {
case Coin.epicCash: case Coin.epicCash:
return epicCash; return epicCash;
case Coin.ethereum:
return ethereum;
case Coin.firo: case Coin.firo:
return firo; return firo;

View file

@ -5,6 +5,8 @@ import 'package:stackwallet/services/coins/dogecoin/dogecoin_wallet.dart'
as doge; as doge;
import 'package:stackwallet/services/coins/epiccash/epiccash_wallet.dart' import 'package:stackwallet/services/coins/epiccash/epiccash_wallet.dart'
as epic; 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/firo/firo_wallet.dart' as firo;
import 'package:stackwallet/services/coins/litecoin/litecoin_wallet.dart' import 'package:stackwallet/services/coins/litecoin/litecoin_wallet.dart'
as ltc; as ltc;
@ -19,6 +21,7 @@ enum Coin {
bitcoincash, bitcoincash,
dogecoin, dogecoin,
epicCash, epicCash,
ethereum,
firo, firo,
litecoin, litecoin,
monero, monero,
@ -52,6 +55,8 @@ extension CoinExt on Coin {
return "Dogecoin"; return "Dogecoin";
case Coin.epicCash: case Coin.epicCash:
return "Epic Cash"; return "Epic Cash";
case Coin.ethereum:
return "Ethereum";
case Coin.firo: case Coin.firo:
return "Firo"; return "Firo";
case Coin.monero: case Coin.monero:
@ -85,6 +90,8 @@ extension CoinExt on Coin {
return "DOGE"; return "DOGE";
case Coin.epicCash: case Coin.epicCash:
return "EPIC"; return "EPIC";
case Coin.ethereum:
return "ETH";
case Coin.firo: case Coin.firo:
return "FIRO"; return "FIRO";
case Coin.monero: case Coin.monero:
@ -119,6 +126,8 @@ extension CoinExt on Coin {
case Coin.epicCash: case Coin.epicCash:
// TODO: is this actually the right one? // TODO: is this actually the right one?
return "epic"; return "epic";
case Coin.ethereum:
return "ethereum";
case Coin.firo: case Coin.firo:
return "firo"; return "firo";
case Coin.monero: case Coin.monero:
@ -156,6 +165,7 @@ extension CoinExt on Coin {
return true; return true;
case Coin.epicCash: case Coin.epicCash:
case Coin.ethereum:
case Coin.monero: case Coin.monero:
case Coin.wownero: case Coin.wownero:
return false; return false;
@ -187,6 +197,9 @@ extension CoinExt on Coin {
case Coin.epicCash: case Coin.epicCash:
return epic.MINIMUM_CONFIRMATIONS; return epic.MINIMUM_CONFIRMATIONS;
case Coin.ethereum:
return eth.MINIMUM_CONFIRMATIONS;
case Coin.monero: case Coin.monero:
return xmr.MINIMUM_CONFIRMATIONS; return xmr.MINIMUM_CONFIRMATIONS;
@ -222,6 +235,10 @@ Coin coinFromPrettyName(String name) {
case "epicCash": case "epicCash":
return Coin.epicCash; return Coin.epicCash;
case "Ethereum":
case "ethereum":
return Coin.ethereum;
case "Firo": case "Firo":
case "firo": case "firo":
return Coin.firo; return Coin.firo;
@ -287,6 +304,8 @@ Coin coinFromTickerCaseInsensitive(String ticker) {
return Coin.dogecoin; return Coin.dogecoin;
case "epic": case "epic":
return Coin.epicCash; return Coin.epicCash;
case "eth":
return Coin.ethereum;
case "firo": case "firo":
return Coin.firo; return Coin.firo;
case "xmr": case "xmr":

View file

@ -217,6 +217,7 @@ class CoinThemeColor {
Color get firo => const Color(0xFFFF897A); Color get firo => const Color(0xFFFF897A);
Color get dogecoin => const Color(0xFFFFE079); Color get dogecoin => const Color(0xFFFFE079);
Color get epicCash => const Color(0xFFC5C7CB); 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 monero => const Color(0xFFFF9E6B);
Color get namecoin => const Color(0xFF91B1E1); Color get namecoin => const Color(0xFF91B1E1);
Color get wownero => const Color(0xFFED80C1); Color get wownero => const Color(0xFFED80C1);
@ -237,6 +238,8 @@ class CoinThemeColor {
return dogecoin; return dogecoin;
case Coin.epicCash: case Coin.epicCash:
return epicCash; return epicCash;
case Coin.ethereum:
return ethereum;
case Coin.firo: case Coin.firo:
case Coin.firoTestNet: case Coin.firoTestNet:
return firo; return firo;

View file

@ -1434,6 +1434,8 @@ class StackColors extends ThemeExtension<StackColors> {
return _coin.dogecoin; return _coin.dogecoin;
case Coin.epicCash: case Coin.epicCash:
return _coin.epicCash; return _coin.epicCash;
case Coin.ethereum:
return _coin.ethereum;
case Coin.firo: case Coin.firo:
case Coin.firoTestNet: case Coin.firoTestNet:
return _coin.firo; return _coin.firo;

View file

@ -42,7 +42,7 @@ packages:
name: archive name: archive
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.3.0" version: "3.1.11"
args: args:
dependency: transitive dependency: transitive
description: description:
@ -56,14 +56,14 @@ packages:
name: asn1lib name: asn1lib
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0" version: "1.4.0"
async: async:
dependency: transitive dependency: transitive
description: description:
name: async name: async
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.9.0" version: "2.8.2"
barcode_scan2: barcode_scan2:
dependency: "direct main" dependency: "direct main"
description: description:
@ -169,7 +169,7 @@ packages:
name: build_runner_core name: build_runner_core
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "7.2.6" version: "7.2.7"
built_collection: built_collection:
dependency: transitive dependency: transitive
description: description:
@ -183,14 +183,21 @@ packages:
name: built_value name: built_value
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "8.4.1" version: "8.4.2"
characters: characters:
dependency: transitive dependency: transitive
description: description:
name: characters name: characters
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted 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: checked_yaml:
dependency: transitive dependency: transitive
description: description:
@ -211,7 +218,7 @@ packages:
name: clock name: clock
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.1" version: "1.1.0"
code_builder: code_builder:
dependency: transitive dependency: transitive
description: description:
@ -253,7 +260,7 @@ packages:
name: connectivity_plus_platform_interface name: connectivity_plus_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.2" version: "1.2.3"
connectivity_plus_web: connectivity_plus_web:
dependency: transitive dependency: transitive
description: description:
@ -281,7 +288,7 @@ packages:
name: coverage name: coverage
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.5.0" version: "1.2.0"
cross_file: cross_file:
dependency: transitive dependency: transitive
description: description:
@ -372,7 +379,7 @@ packages:
name: decimal name: decimal
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.3.0" version: "2.3.2"
dependency_validator: dependency_validator:
dependency: "direct dev" dependency: "direct dev"
description: description:
@ -435,7 +442,7 @@ packages:
name: fake_async name: fake_async
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.3.1" version: "1.3.0"
ffi: ffi:
dependency: "direct main" dependency: "direct main"
description: description:
@ -456,7 +463,7 @@ packages:
name: file_picker name: file_picker
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "5.2.1" version: "5.2.4"
fixnum: fixnum:
dependency: transitive dependency: transitive
description: description:
@ -543,7 +550,7 @@ packages:
name: flutter_mobx name: flutter_mobx
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.6+4" version: "2.0.6+5"
flutter_native_splash: flutter_native_splash:
dependency: "direct main" dependency: "direct main"
description: description:
@ -585,35 +592,35 @@ packages:
name: flutter_secure_storage_linux name: flutter_secure_storage_linux
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.1" version: "1.1.2"
flutter_secure_storage_macos: flutter_secure_storage_macos:
dependency: transitive dependency: transitive
description: description:
name: flutter_secure_storage_macos name: flutter_secure_storage_macos
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.1" version: "1.1.2"
flutter_secure_storage_platform_interface: flutter_secure_storage_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: flutter_secure_storage_platform_interface name: flutter_secure_storage_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.0" version: "1.0.1"
flutter_secure_storage_web: flutter_secure_storage_web:
dependency: transitive dependency: transitive
description: description:
name: flutter_secure_storage_web name: flutter_secure_storage_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.2" version: "1.1.1"
flutter_secure_storage_windows: flutter_secure_storage_windows:
dependency: transitive dependency: transitive
description: description:
name: flutter_secure_storage_windows name: flutter_secure_storage_windows
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.2" version: "1.1.3"
flutter_spinkit: flutter_spinkit:
dependency: "direct main" dependency: "direct main"
description: description:
@ -627,7 +634,7 @@ packages:
name: flutter_svg name: flutter_svg
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.5" version: "1.1.6"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
@ -670,7 +677,7 @@ packages:
name: graphs name: graphs
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "2.2.0"
hex: hex:
dependency: transitive dependency: transitive
description: description:
@ -712,7 +719,7 @@ packages:
name: html name: html
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.15.0" version: "0.15.1"
http: http:
dependency: "direct main" dependency: "direct main"
description: description:
@ -802,6 +809,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.7.0" 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: jsonrpc2:
dependency: "direct main" dependency: "direct main"
description: description:
@ -836,7 +850,7 @@ packages:
name: lints name: lints
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.0" version: "2.0.1"
local_auth: local_auth:
dependency: "direct main" dependency: "direct main"
description: description:
@ -864,35 +878,35 @@ packages:
name: matcher name: matcher
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.12.12" version: "0.12.11"
material_color_utilities: material_color_utilities:
dependency: transitive dependency: transitive
description: description:
name: material_color_utilities name: material_color_utilities
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.1.5" version: "0.1.4"
meta: meta:
dependency: transitive dependency: transitive
description: description:
name: meta name: meta
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.8.0" version: "1.7.0"
mime: mime:
dependency: transitive dependency: transitive
description: description:
name: mime name: mime
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.2" version: "1.0.3"
mobx: mobx:
dependency: transitive dependency: transitive
description: description:
name: mobx name: mobx
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.1" version: "2.1.3"
mockingjay: mockingjay:
dependency: "direct dev" dependency: "direct dev"
description: description:
@ -920,7 +934,7 @@ packages:
name: mutex name: mutex
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.0" version: "3.0.1"
nm: nm:
dependency: transitive dependency: transitive
description: description:
@ -990,7 +1004,7 @@ packages:
name: path name: path
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.8.2" version: "1.8.1"
path_drawing: path_drawing:
dependency: transitive dependency: transitive
description: description:
@ -1018,7 +1032,7 @@ packages:
name: path_provider_android name: path_provider_android
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.20" version: "2.0.22"
path_provider_ios: path_provider_ios:
dependency: transitive dependency: transitive
description: description:
@ -1060,7 +1074,7 @@ packages:
name: permission_handler name: permission_handler
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "10.1.0" version: "10.2.0"
permission_handler_android: permission_handler_android:
dependency: transitive dependency: transitive
description: description:
@ -1144,7 +1158,7 @@ packages:
name: pub_semver name: pub_semver
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.2" version: "2.1.3"
pubspec_parse: pubspec_parse:
dependency: transitive dependency: transitive
description: description:
@ -1172,7 +1186,7 @@ packages:
name: rational name: rational
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.2.0" version: "2.2.2"
riverpod: riverpod:
dependency: transitive dependency: transitive
description: description:
@ -1200,7 +1214,7 @@ packages:
name: rxdart name: rxdart
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.27.5" version: "0.27.7"
share_plus: share_plus:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1228,7 +1242,7 @@ packages:
name: share_plus_platform_interface name: share_plus_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.1.1" version: "3.2.0"
share_plus_web: share_plus_web:
dependency: transitive dependency: transitive
description: description:
@ -1326,7 +1340,7 @@ packages:
name: shelf_web_socket name: shelf_web_socket
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.2" version: "1.0.3"
sky_engine: sky_engine:
dependency: transitive dependency: transitive
description: flutter description: flutter
@ -1366,7 +1380,7 @@ packages:
name: source_span name: source_span
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.9.0" version: "1.8.2"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
@ -1403,14 +1417,21 @@ packages:
name: stream_transform name: stream_transform
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.1" version: "2.1.0"
string_scanner: string_scanner:
dependency: transitive dependency: transitive
description: description:
name: string_scanner name: string_scanner
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted 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: string_validator:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1424,35 +1445,35 @@ packages:
name: sync_http name: sync_http
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.3.1" version: "0.3.0"
term_glyph: term_glyph:
dependency: transitive dependency: transitive
description: description:
name: term_glyph name: term_glyph
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.1" version: "1.2.0"
test: test:
dependency: transitive dependency: transitive
description: description:
name: test name: test
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.21.4" version: "1.21.1"
test_api: test_api:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.4.12" version: "0.4.9"
test_core: test_core:
dependency: transitive dependency: transitive
description: description:
name: test_core name: test_core
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.4.16" version: "0.4.13"
time: time:
dependency: transitive dependency: transitive
description: description:
@ -1501,7 +1522,7 @@ packages:
name: typed_data name: typed_data
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.3.1" version: "1.3.0"
universal_io: universal_io:
dependency: transitive dependency: transitive
description: description:
@ -1515,14 +1536,14 @@ packages:
name: url_launcher name: url_launcher
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "6.1.6" version: "6.1.7"
url_launcher_android: url_launcher_android:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_android name: url_launcher_android
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "6.0.19" version: "6.0.22"
url_launcher_ios: url_launcher_ios:
dependency: transitive dependency: transitive
description: description:
@ -1571,7 +1592,7 @@ packages:
name: uuid name: uuid
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.6" version: "3.0.7"
vector_math: vector_math:
dependency: transitive dependency: transitive
description: description:
@ -1585,7 +1606,7 @@ packages:
name: vm_service name: vm_service
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "9.0.0" version: "8.2.2"
wakelock: wakelock:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1628,6 +1649,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.2" 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: web_socket_channel:
dependency: transitive dependency: transitive
description: description:
@ -1655,7 +1683,7 @@ packages:
name: win32 name: win32
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.1" version: "3.1.2"
window_size: window_size:
dependency: "direct main" dependency: "direct main"
description: description:

View file

@ -88,6 +88,11 @@ dependencies:
ref: 22279d4bb24ed541b431acd269a1bc50af0f36a0 ref: 22279d4bb24ed541b431acd269a1bc50af0f36a0
bs58check: ^1.0.2 bs58check: ^1.0.2
# Eth Plugins
web3dart:
2.3.5
string_to_hex: 0.2.2
# Storage plugins # Storage plugins
flutter_secure_storage: ^5.0.2 flutter_secure_storage: ^5.0.2
hive: ^2.0.5 hive: ^2.0.5
@ -207,6 +212,7 @@ flutter:
- assets/images/doge.png - assets/images/doge.png
- assets/images/bitcoin.png - assets/images/bitcoin.png
- assets/images/epic-cash.png - assets/images/epic-cash.png
- assets/images/ethereum.png
- assets/images/bitcoincash.png - assets/images/bitcoincash.png
- assets/images/namecoin.png - assets/images/namecoin.png
- assets/images/glasses.png - assets/images/glasses.png
@ -306,6 +312,7 @@ flutter:
- assets/svg/coin_icons/Bitcoincash.svg - assets/svg/coin_icons/Bitcoincash.svg
- assets/svg/coin_icons/Dogecoin.svg - assets/svg/coin_icons/Dogecoin.svg
- assets/svg/coin_icons/EpicCash.svg - assets/svg/coin_icons/EpicCash.svg
- assets/svg/coin_icons/Ethereum.svg
- assets/svg/coin_icons/Firo.svg - assets/svg/coin_icons/Firo.svg
- assets/svg/coin_icons/Monero.svg - assets/svg/coin_icons/Monero.svg
- assets/svg/coin_icons/Wownero.svg - assets/svg/coin_icons/Wownero.svg