diff --git a/cw_core/lib/erc20_token.dart b/cw_core/lib/erc20_token.dart index bfa60fc03..2e205e484 100644 --- a/cw_core/lib/erc20_token.dart +++ b/cw_core/lib/erc20_token.dart @@ -38,6 +38,21 @@ class Erc20Token extends CryptoCurrency with HiveObjectMixin { iconPath: iconPath, ); + Erc20Token.copyWith(Erc20Token other, String? icon) + : this.name = other.name, + this.symbol = other.symbol, + this.contractAddress = other.contractAddress, + this.decimal = other.decimal, + this._enabled = other.enabled, + this.iconPath = icon, + super( + name: other.name, + title: other.symbol.toUpperCase(), + fullName: other.name, + tag: "ETH", + iconPath: icon, + ); + static const typeId = 12; static const boxName = 'Erc20Tokens'; diff --git a/cw_ethereum/lib/default_erc20_tokens.dart b/cw_ethereum/lib/default_erc20_tokens.dart new file mode 100644 index 000000000..ded89f71e --- /dev/null +++ b/cw_ethereum/lib/default_erc20_tokens.dart @@ -0,0 +1,295 @@ +import 'package:cw_core/crypto_currency.dart'; +import 'package:cw_core/erc20_token.dart'; + +class DefaultErc20Tokens { + final List _defaultTokens = [ + Erc20Token( + name: "USD Coin", + symbol: "USDC", + contractAddress: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + decimal: 6, + enabled: true, + ), + Erc20Token( + name: "USDT Tether", + symbol: "USDT", + contractAddress: "0xdac17f958d2ee523a2206206994597c13d831ec7", + decimal: 6, + enabled: true, + ), + Erc20Token( + name: "Dai", + symbol: "DAI", + contractAddress: "0x6B175474E89094C44Da98b954EedeAC495271d0F", + decimal: 18, + enabled: true, + ), + Erc20Token( + name: "Wrapped Ether", + symbol: "WETH", + contractAddress: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "Pepe", + symbol: "PEPE", + contractAddress: "0x6982508145454ce325ddbe47a25d4ec3d2311933", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "SHIBA INU", + symbol: "SHIB", + contractAddress: "0x95ad61b0a150d79219dcf64e1e6cc01f0b64c4ce", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "ApeCoin", + symbol: "APE", + contractAddress: "0x4d224452801aced8b2f0aebe155379bb5d594381", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "Matic Token", + symbol: "MATIC", + contractAddress: "0x7D1AfA7B718fb893dB30A3aBc0Cfc608AaCfeBB0", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "Wrapped BTC", + symbol: "WBTC", + contractAddress: "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599", + decimal: 8, + enabled: false, + ), + Erc20Token( + name: "Gitcoin", + symbol: "GTC", + contractAddress: "0xde30da39c46104798bb5aa3fe8b9e0e1f348163f", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "Compound", + symbol: "COMP", + contractAddress: "0xc00e94cb662c3520282e6f5717214004a7f26888", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "Aave Token", + symbol: "AAVE", + contractAddress: "0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "Uniswap", + symbol: "UNI", + contractAddress: "0x1f9840a85d5af5bf1d1762f925bdaddc4201f984", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "Decentraland", + symbol: "MANA", + contractAddress: "0x0F5D2fB29fb7d3CFeE444a200298f468908cC942", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "Storj", + symbol: "STORJ", + contractAddress: "0xb64ef51c888972c908cfacf59b47c1afbc0ab8ac", + decimal: 8, + enabled: false, + ), + Erc20Token( + name: "Maker", + symbol: "MKR", + contractAddress: "0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "Orchid", + symbol: "OXT", + contractAddress: "0x4575f41308EC1483f3d399aa9a2826d74Da13Deb", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "Paxos Gold", + symbol: "PAXG", + contractAddress: "0x45804880De22913dAFE09f4980848ECE6EcbAf78", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "Binance Coin", + symbol: "BNB", + contractAddress: "0xB8c77482e45F1F44dE1745F52C74426C631bDD52", + decimal: 18, + enabled: true, + ), + Erc20Token( + name: "stETH", + symbol: "stETH", + contractAddress: "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "Lido DAO", + symbol: "LDO", + contractAddress: "0x5A98FcBEA516Cf06857215779Fd812CA3beF1B32", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "Arbitrum", + symbol: "ARB", + contractAddress: "0xB50721BCf8d664c30412Cfbc6cf7a15145234ad1", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "Graph Token", + symbol: "GRT", + contractAddress: "0xc944E90C64B2c07662A292be6244BDf05Cda44a7", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "Frax", + symbol: "FRAX", + contractAddress: "0x853d955aCEf822Db058eb8505911ED77F175b99e", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "Gemini dollar", + symbol: "GUSD", + contractAddress: "0x056Fd409E1d7A124BD7017459dFEa2F387b6d5Cd", + decimal: 2, + enabled: false, + ), + Erc20Token( + name: "Compound Ether", + symbol: "cETH", + contractAddress: "0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5", + decimal: 8, + enabled: false, + ), + Erc20Token( + name: "Binance USD", + symbol: "BUSD", + contractAddress: "0x4Fabb145d64652a948d72533023f6E7A623C7C53", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "TrueUSD", + symbol: "TUSD", + contractAddress: "0x0000000000085d4780B73119b644AE5ecd22b376", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "Cronos Coin", + symbol: "CRO", + contractAddress: "0xA0b73E1Ff0B80914AB6fe0444E65848C4C34450b", + decimal: 8, + enabled: false, + ), + Erc20Token( + name: "Pax Dollar", + symbol: "USDP", + contractAddress: "0x8E870D67F660D95d5be530380D0eC0bd388289E1", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "Fantom Token", + symbol: "FTM", + contractAddress: "0x4E15361FD6b4BB609Fa63C81A2be19d873717870", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "BitTorrent", + symbol: "BTT", + contractAddress: "0xC669928185DbCE49d2230CC9B0979BE6DC797957", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "Nexo", + symbol: "NEXO", + contractAddress: "0xB62132e35a6c13ee1EE0f84dC5d40bad8d815206", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "dYdX", + symbol: "DYDX", + contractAddress: "0x92D6C1e31e14520e676a687F0a93788B716BEff5", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "PancakeSwap Token", + symbol: "Cake", + contractAddress: "0x152649eA73beAb28c5b49B26eb48f7EAD6d4c898", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "BAT", + symbol: "BAT", + contractAddress: "0x0D8775F648430679A709E98d2b0Cb6250d2887EF", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "1INCH Token", + symbol: "1INCH", + contractAddress: "0x111111111117dC0aa78b770fA6A738034120C302", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "Ethereum Name Service", + symbol: "ENS", + contractAddress: "0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72", + decimal: 18, + enabled: false, + ), + Erc20Token( + name: "ZRX", + symbol: "ZRX", + contractAddress: "0xE41d2489571d322189246DaFA5ebDe1F4699F498", + decimal: 18, + enabled: false, + ), + ]; + + List get initialErc20Tokens => _defaultTokens.map((token) { + String? iconPath; + try { + iconPath = CryptoCurrency.all + .firstWhere((element) => element.title.toUpperCase() == token.symbol.toUpperCase()) + .iconPath; + } catch (_) {} + + if (iconPath != null) { + return Erc20Token.copyWith(token, iconPath); + } + + return token; + }).toList(); +} diff --git a/cw_ethereum/lib/ethereum_wallet.dart b/cw_ethereum/lib/ethereum_wallet.dart index 3f466b135..988f596fb 100644 --- a/cw_ethereum/lib/ethereum_wallet.dart +++ b/cw_ethereum/lib/ethereum_wallet.dart @@ -10,6 +10,7 @@ import 'package:cw_core/transaction_priority.dart'; import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/wallet_info.dart'; +import 'package:cw_ethereum/default_erc20_tokens.dart'; import 'package:cw_ethereum/ethereum_balance.dart'; import 'package:cw_ethereum/ethereum_client.dart'; import 'package:cw_ethereum/ethereum_exceptions.dart'; @@ -342,215 +343,8 @@ abstract class EthereumWalletBase } void addInitialTokens() { - final Map> _initialErc20Currencies = { - CryptoCurrency.usdc: { - 'contractAddress': "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", - 'decimal': 6, - 'enabled': true, - }, - CryptoCurrency.usdterc20: { - 'contractAddress': "0xdac17f958d2ee523a2206206994597c13d831ec7", - 'decimal': 6, - 'enabled': true, - }, - CryptoCurrency.dai: { - 'contractAddress': "0x6B175474E89094C44Da98b954EedeAC495271d0F", - 'decimal': 18, - 'enabled': true, - }, - CryptoCurrency.weth: { - 'contractAddress': "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.pepe: { - 'contractAddress': "0x6982508145454ce325ddbe47a25d4ec3d2311933", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.shib: { - 'contractAddress': "0x95ad61b0a150d79219dcf64e1e6cc01f0b64c4ce", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.ape: { - 'contractAddress': "0x4d224452801aced8b2f0aebe155379bb5d594381", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.matic: { - 'contractAddress': "0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.wbtc: { - 'contractAddress': "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599", - 'decimal': 8, - 'enabled': false, - }, - CryptoCurrency.gtc: { - 'contractAddress': "0xde30da39c46104798bb5aa3fe8b9e0e1f348163f", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.comp: { - 'contractAddress': "0xc00e94cb662c3520282e6f5717214004a7f26888", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.aave: { - 'contractAddress': "0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.uni: { - 'contractAddress': "0x1f9840a85d5af5bf1d1762f925bdaddc4201f984", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.mana: { - 'contractAddress': "0x0f5d2fb29fb7d3cfee444a200298f468908cc942", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.storj: { - 'contractAddress': "0xb64ef51c888972c908cfacf59b47c1afbc0ab8ac", - 'decimal': 8, - 'enabled': false, - }, - CryptoCurrency.mkr: { - 'contractAddress': "0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.oxt: { - 'contractAddress': "0x4575f41308EC1483f3d399aa9a2826d74Da13Deb", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.paxg: { - 'contractAddress': "0x45804880De22913dAFE09f4980848ECE6EcbAf78", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.bnb: { - 'contractAddress': "0xB8c77482e45F1F44dE1745F52C74426C631bDD52", - 'decimal': 18, - 'enabled': true, - }, - CryptoCurrency.steth: { - 'contractAddress': "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.ldo: { - 'contractAddress': "0x5A98FcBEA516Cf06857215779Fd812CA3beF1B32", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.arb: { - 'contractAddress': "0xB50721BCf8d664c30412Cfbc6cf7a15145234ad1", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.grt: { - 'contractAddress': "0xc944E90C64B2c07662A292be6244BDf05Cda44a7", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.frax: { - 'contractAddress': "0x853d955aCEf822Db058eb8505911ED77F175b99e", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.gusd: { - 'contractAddress': "0x056Fd409E1d7A124BD7017459dFEa2F387b6d5Cd", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.ceth: { - 'contractAddress': "0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5", - 'decimal': 8, - 'enabled': false, - }, - CryptoCurrency.busd: { - 'contractAddress': "0x4Fabb145d64652a948d72533023f6E7A623C7C53", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.tusd: { - 'contractAddress': "0x0000000000085d4780B73119b644AE5ecd22b376", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.cro: { - 'contractAddress': "0xA0b73E1Ff0B80914AB6fe0444E65848C4C34450b", - 'decimal': 8, - 'enabled': false, - }, - CryptoCurrency.usdp: { - 'contractAddress': "0x8E870D67F660D95d5be530380D0eC0bd388289E1", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.ftm: { - 'contractAddress': "0x4E15361FD6b4BB609Fa63C81A2be19d873717870", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.btt: { - 'contractAddress': "0xC669928185DbCE49d2230CC9B0979BE6DC797957", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.nexo: { - 'contractAddress': "0xB62132e35a6c13ee1EE0f84dC5d40bad8d815206", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.dydx: { - 'contractAddress': "0x92D6C1e31e14520e676a687F0a93788B716BEff5", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.cake: { - 'contractAddress': "0x152649eA73beAb28c5b49B26eb48f7EAD6d4c898", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.bat: { - 'contractAddress': "0x0D8775F648430679A709E98d2b0Cb6250d2887EF", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.1inch: { - 'contractAddress': "0x111111111117dC0aa78b770fA6A738034120C302", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.ens: { - 'contractAddress': "0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72", - 'decimal': 18, - 'enabled': false, - }, - CryptoCurrency.zrx: { - 'contractAddress': "0xE41d2489571d322189246DaFA5ebDe1F4699F498", - 'decimal': 18, - 'enabled': false, - }, - }; + final initialErc20Tokens = DefaultErc20Tokens().initialErc20Tokens; - for (var currency in _initialErc20Currencies.keys) { - erc20TokensBox.put( - _initialErc20Currencies[currency]!['contractAddress'], - Erc20Token( - name: currency.fullName ?? currency.title, - symbol: currency.title, - contractAddress: _initialErc20Currencies[currency]!['contractAddress'], - decimal: _initialErc20Currencies[currency]!['decimal'], - enabled: _initialErc20Currencies[currency]!['enabled'] ?? true, - iconPath: currency.iconPath, - )); - } + initialErc20Tokens.forEach((token) => erc20TokensBox.put(token.contractAddress, token)); } } diff --git a/lib/view_model/dashboard/home_settings_view_model.dart b/lib/view_model/dashboard/home_settings_view_model.dart index 1b7bf5073..66620f951 100644 --- a/lib/view_model/dashboard/home_settings_view_model.dart +++ b/lib/view_model/dashboard/home_settings_view_model.dart @@ -75,10 +75,18 @@ abstract class HomeSettingsViewModelBase with Store { @action void _updateTokensList() { - int _sortFunc(e1, e2) { + int _sortFunc(Erc20Token e1, Erc20Token e2) { int index1 = _balanceViewModel.formattedBalances.indexWhere((element) => element.asset == e1); int index2 = _balanceViewModel.formattedBalances.indexWhere((element) => element.asset == e2); + if (e1.enabled && !e2.enabled) { + return -1; + } else if (e2.enabled && !e1.enabled) { + return 1; + } else if (!e1.enabled && !e2.enabled) { // if both are disabled then sort alphabetically + return e1.name.compareTo(e2.name); + } + return index1.compareTo(index2); }