mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2024-10-30 00:47:48 +00:00
a3a35f05e1
* inital migration changes * feat: rest of changes * minor fix [skip ci] * fix: P2wshAddress & wallet address index * fix: address review comments * fix: address type restore * feat: add testnet * Fix review comments Remove bitcoin_base from cw_core * Fix address not matching selected type on start * remove un-necessary parameter [skip ci] * Remove bitcoin specific code from main lib Fix possible runtime exception from list wrong access * Minor fix * fix: fixes for Testnet * fix: bitcoin receive option dependency breaks monerocom * Fix issues when building Monero.com * feat: Transaction Builder changes * fix: discover addresses, testnet restoring, duplicate unspent coins, and taproot address vs schnorr sig tweak * fix: remove print * feat: improve error when failed broadcast response * feat: create fish shell env script * fix: unmodifiable maps * fix: build * fix: build * fix: computed observable side effect bug * feat: add nix script for android build_all * fix: wrong keypairs used for signing * fix: wrong addresses when using fromScriptPubKey scripts * fix(actual commit): testnet tx expanded + wrong addresses when using fromScriptPubKey scripts (update bitcoin_base deps) * fix: self-send [skip ci] * fix: p2wsh * fix: testnet fees * New versions * Update macos build number Minor UI fix * fix: use new bitcoin_base ref, fix tx list wrong hex value & refactor hidden vs hd use - if always use sideHd for isHidden, it is easier to simplify the functions instead of passing both which can be error prone - (ps: now this could probably be changed, for example from isHidden to isChange since with address list we now see "hidden" addresses) * Fix if condition to handle litecoin case * fix: self-send, change address was always making direction incoming * refactor: improve estimation function, add more inputs if balance missing * fix: new bitcoin_base update, fixes script issues * Update evm chain wallet service arguments * Fix translation [skip ci] * Fix translation [skip ci] * Update strings_fr.arb [skip ci] * fix: async isChange function not being awaited, refactor to reduce looping into a single place * fix: _address vs address, missing p2sh * fix: minor mistake in storing p2sh page type [skip ci] * refactor: use already matched addresses property * feat: improved perfomance for fetching transaction histories * feat: continue perfomance change, improve address discovery only to last address by type with history * fix: make sure transaction list is sorted by date * refactor: isTestnet only for bitcoin * fix: walletInfo type null case * fix: deprecated p2pk * refactor: make condition more readable * refactor: remove unnecessary Str variant * refactor: make condition more readable * fix: infinite loop possible * Revert removing isTestnet from other wallets [skip ci] * refactor: rename addresses when matched by receive type * Make the beta build [skip ci] Remove app_env.fish --------- Co-authored-by: OmarHatem <omarh.ismail1@gmail.com>
301 lines
10 KiB
Dart
301 lines
10 KiB
Dart
import 'package:bitcoin_base/bitcoin_base.dart';
|
|
import 'package:cake_wallet/generated/i18n.dart';
|
|
import 'package:cake_wallet/core/validator.dart';
|
|
import 'package:cake_wallet/solana/solana.dart';
|
|
import 'package:cw_core/crypto_currency.dart';
|
|
import 'package:cw_core/erc20_token.dart';
|
|
|
|
class AddressValidator extends TextValidator {
|
|
AddressValidator({required CryptoCurrency type})
|
|
: super(
|
|
errorMessage: S.current.error_text_address,
|
|
useAdditionalValidation: type == CryptoCurrency.btc
|
|
? (String txt) => validateAddress(address: txt, network: BitcoinNetwork.mainnet)
|
|
: null,
|
|
pattern: getPattern(type),
|
|
length: getLength(type));
|
|
|
|
static String getPattern(CryptoCurrency type) {
|
|
if (type is Erc20Token) {
|
|
return '0x[0-9a-zA-Z]';
|
|
}
|
|
switch (type) {
|
|
case CryptoCurrency.xmr:
|
|
return '^4[0-9a-zA-Z]{94}\$|^8[0-9a-zA-Z]{94}\$|^[0-9a-zA-Z]{106}\$';
|
|
case CryptoCurrency.ada:
|
|
return '^[0-9a-zA-Z]{59}\$|^[0-9a-zA-Z]{92}\$|^[0-9a-zA-Z]{104}\$'
|
|
'|^[0-9a-zA-Z]{105}\$|^addr1[0-9a-zA-Z]{98}\$';
|
|
case CryptoCurrency.btc:
|
|
return '^${P2pkhAddress.regex.pattern}\$|^${P2shAddress.regex.pattern}\$|^${P2wpkhAddress.regex.pattern}\$|${P2trAddress.regex.pattern}\$|^${P2wshAddress.regex.pattern}\$';
|
|
case CryptoCurrency.nano:
|
|
return '[0-9a-zA-Z_]';
|
|
case CryptoCurrency.banano:
|
|
return '[0-9a-zA-Z_]';
|
|
case CryptoCurrency.usdc:
|
|
case CryptoCurrency.usdcpoly:
|
|
case CryptoCurrency.usdtPoly:
|
|
case CryptoCurrency.usdcEPoly:
|
|
case CryptoCurrency.ape:
|
|
case CryptoCurrency.avaxc:
|
|
case CryptoCurrency.eth:
|
|
case CryptoCurrency.mana:
|
|
case CryptoCurrency.matic:
|
|
case CryptoCurrency.maticpoly:
|
|
case CryptoCurrency.mkr:
|
|
case CryptoCurrency.oxt:
|
|
case CryptoCurrency.paxg:
|
|
case CryptoCurrency.uni:
|
|
case CryptoCurrency.aave:
|
|
case CryptoCurrency.bat:
|
|
case CryptoCurrency.comp:
|
|
case CryptoCurrency.cro:
|
|
case CryptoCurrency.ens:
|
|
case CryptoCurrency.ftm:
|
|
case CryptoCurrency.frax:
|
|
case CryptoCurrency.gusd:
|
|
case CryptoCurrency.gtc:
|
|
case CryptoCurrency.grt:
|
|
case CryptoCurrency.ldo:
|
|
case CryptoCurrency.nexo:
|
|
case CryptoCurrency.pepe:
|
|
case CryptoCurrency.storj:
|
|
case CryptoCurrency.tusd:
|
|
case CryptoCurrency.wbtc:
|
|
case CryptoCurrency.weth:
|
|
case CryptoCurrency.zrx:
|
|
case CryptoCurrency.dydx:
|
|
case CryptoCurrency.steth:
|
|
case CryptoCurrency.shib:
|
|
return '0x[0-9a-zA-Z]';
|
|
case CryptoCurrency.xrp:
|
|
return '^[0-9a-zA-Z]{34}\$|^X[0-9a-zA-Z]{46}\$';
|
|
case CryptoCurrency.xhv:
|
|
return '^hvx|hvi|hvs[0-9a-zA-Z]';
|
|
case CryptoCurrency.xag:
|
|
case CryptoCurrency.xau:
|
|
case CryptoCurrency.xaud:
|
|
case CryptoCurrency.xbtc:
|
|
case CryptoCurrency.xcad:
|
|
case CryptoCurrency.xchf:
|
|
case CryptoCurrency.xcny:
|
|
case CryptoCurrency.xeur:
|
|
case CryptoCurrency.xgbp:
|
|
case CryptoCurrency.xjpy:
|
|
case CryptoCurrency.xnok:
|
|
case CryptoCurrency.xnzd:
|
|
case CryptoCurrency.xusd:
|
|
case CryptoCurrency.usdt:
|
|
case CryptoCurrency.usdterc20:
|
|
case CryptoCurrency.xlm:
|
|
case CryptoCurrency.trx:
|
|
case CryptoCurrency.dai:
|
|
case CryptoCurrency.dash:
|
|
case CryptoCurrency.eos:
|
|
return '[0-9a-zA-Z]';
|
|
case CryptoCurrency.bch:
|
|
return '^(?!bitcoincash:)[0-9a-zA-Z]*\$|^(?!bitcoincash:)q|p[0-9a-zA-Z]{41}\$|^(?!bitcoincash:)q|p[0-9a-zA-Z]{42}\$|^bitcoincash:q|p[0-9a-zA-Z]{41}\$|^bitcoincash:q|p[0-9a-zA-Z]{42}\$';
|
|
case CryptoCurrency.bnb:
|
|
return '[0-9a-zA-Z]';
|
|
case CryptoCurrency.ltc:
|
|
return '^(?!(ltc|LTC)1)[0-9a-zA-Z]*\$|(^LTC1[A-Z0-9]*\$)|(^ltc1[a-z0-9]*\$)';
|
|
case CryptoCurrency.hbar:
|
|
return '[0-9a-zA-Z.]';
|
|
case CryptoCurrency.zaddr:
|
|
return '^zs[0-9a-zA-Z]{75}';
|
|
case CryptoCurrency.zec:
|
|
return '^t1[0-9a-zA-Z]{33}\$|^t3[0-9a-zA-Z]{33}\$';
|
|
case CryptoCurrency.dcr:
|
|
return 'D[ksecS]([0-9a-zA-Z])+';
|
|
case CryptoCurrency.rvn:
|
|
return '[Rr]([1-9a-km-zA-HJ-NP-Z]){33}';
|
|
case CryptoCurrency.near:
|
|
return '[0-9a-f]{64}';
|
|
case CryptoCurrency.rune:
|
|
return 'thor1[0-9a-z]{38}';
|
|
case CryptoCurrency.scrt:
|
|
return 'secret1[0-9a-z]{38}';
|
|
case CryptoCurrency.stx:
|
|
return 'S[MP][0-9a-zA-Z]+';
|
|
case CryptoCurrency.kmd:
|
|
return 'R[0-9a-zA-Z]{33}';
|
|
case CryptoCurrency.pivx:
|
|
return 'D([1-9a-km-zA-HJ-NP-Z]){33}';
|
|
case CryptoCurrency.btcln:
|
|
return '^(lnbc|LNBC)([0-9]{1,}[a-zA-Z0-9]+)';
|
|
default:
|
|
return '[0-9a-zA-Z]';
|
|
}
|
|
}
|
|
|
|
static List<int>? getLength(CryptoCurrency type) {
|
|
if (type is Erc20Token) {
|
|
return [42];
|
|
}
|
|
|
|
if (solana != null) {
|
|
final length = solana!.getValidationLength(type);
|
|
if (length != null) return length;
|
|
}
|
|
|
|
switch (type) {
|
|
case CryptoCurrency.xmr:
|
|
return null;
|
|
case CryptoCurrency.ada:
|
|
return null;
|
|
case CryptoCurrency.btc:
|
|
return null;
|
|
case CryptoCurrency.dash:
|
|
return [34];
|
|
case CryptoCurrency.eos:
|
|
return [42];
|
|
case CryptoCurrency.eth:
|
|
case CryptoCurrency.usdcpoly:
|
|
case CryptoCurrency.usdtPoly:
|
|
case CryptoCurrency.usdcEPoly:
|
|
case CryptoCurrency.mana:
|
|
case CryptoCurrency.matic:
|
|
case CryptoCurrency.maticpoly:
|
|
case CryptoCurrency.mkr:
|
|
case CryptoCurrency.oxt:
|
|
case CryptoCurrency.paxg:
|
|
case CryptoCurrency.uni:
|
|
case CryptoCurrency.dai:
|
|
case CryptoCurrency.ape:
|
|
case CryptoCurrency.usdc:
|
|
case CryptoCurrency.usdterc20:
|
|
case CryptoCurrency.aave:
|
|
case CryptoCurrency.bat:
|
|
case CryptoCurrency.comp:
|
|
case CryptoCurrency.cro:
|
|
case CryptoCurrency.ens:
|
|
case CryptoCurrency.ftm:
|
|
case CryptoCurrency.frax:
|
|
case CryptoCurrency.gusd:
|
|
case CryptoCurrency.gtc:
|
|
case CryptoCurrency.grt:
|
|
case CryptoCurrency.ldo:
|
|
case CryptoCurrency.nexo:
|
|
case CryptoCurrency.pepe:
|
|
case CryptoCurrency.storj:
|
|
case CryptoCurrency.tusd:
|
|
case CryptoCurrency.wbtc:
|
|
case CryptoCurrency.weth:
|
|
case CryptoCurrency.zrx:
|
|
case CryptoCurrency.dydx:
|
|
case CryptoCurrency.steth:
|
|
case CryptoCurrency.shib:
|
|
case CryptoCurrency.avaxc:
|
|
return [42];
|
|
case CryptoCurrency.bch:
|
|
return [42, 43, 44, 54, 55];
|
|
case CryptoCurrency.bnb:
|
|
return [42];
|
|
case CryptoCurrency.ltc:
|
|
return [34, 43, 63];
|
|
case CryptoCurrency.nano:
|
|
return [64, 65];
|
|
case CryptoCurrency.banano:
|
|
return [64, 65];
|
|
case CryptoCurrency.sc:
|
|
return [76];
|
|
case CryptoCurrency.sol:
|
|
case CryptoCurrency.usdtSol:
|
|
case CryptoCurrency.usdcsol:
|
|
return [32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44];
|
|
case CryptoCurrency.trx:
|
|
return [34];
|
|
case CryptoCurrency.usdt:
|
|
return [34];
|
|
case CryptoCurrency.usdttrc20:
|
|
return [34];
|
|
case CryptoCurrency.xlm:
|
|
return [56];
|
|
case CryptoCurrency.xrp:
|
|
return null;
|
|
case CryptoCurrency.xhv:
|
|
case CryptoCurrency.xag:
|
|
case CryptoCurrency.xau:
|
|
case CryptoCurrency.xaud:
|
|
case CryptoCurrency.xbtc:
|
|
case CryptoCurrency.xcad:
|
|
case CryptoCurrency.xchf:
|
|
case CryptoCurrency.xcny:
|
|
case CryptoCurrency.xeur:
|
|
case CryptoCurrency.xgbp:
|
|
case CryptoCurrency.xjpy:
|
|
case CryptoCurrency.xnok:
|
|
case CryptoCurrency.xnzd:
|
|
case CryptoCurrency.xusd:
|
|
return [98, 99, 106];
|
|
case CryptoCurrency.btt:
|
|
case CryptoCurrency.bttc:
|
|
case CryptoCurrency.doge:
|
|
case CryptoCurrency.firo:
|
|
return [34];
|
|
case CryptoCurrency.hbar:
|
|
return [4, 5, 6, 7, 8, 9, 10, 11];
|
|
case CryptoCurrency.xvg:
|
|
return [34];
|
|
case CryptoCurrency.zen:
|
|
return [35];
|
|
case CryptoCurrency.zaddr:
|
|
return null;
|
|
case CryptoCurrency.zec:
|
|
return null;
|
|
case CryptoCurrency.kmd:
|
|
case CryptoCurrency.pivx:
|
|
case CryptoCurrency.rvn:
|
|
return [34];
|
|
case CryptoCurrency.dcr:
|
|
return [35];
|
|
case CryptoCurrency.stx:
|
|
return [40, 41, 42];
|
|
case CryptoCurrency.rune:
|
|
return [43];
|
|
case CryptoCurrency.scrt:
|
|
return [45];
|
|
case CryptoCurrency.near:
|
|
return [64];
|
|
case CryptoCurrency.btcln:
|
|
return null;
|
|
default:
|
|
return [];
|
|
}
|
|
}
|
|
|
|
static String? getAddressFromStringPattern(CryptoCurrency type) {
|
|
switch (type) {
|
|
case CryptoCurrency.xmr:
|
|
return '([^0-9a-zA-Z]|^)4[0-9a-zA-Z]{94}([^0-9a-zA-Z]|\$)'
|
|
'|([^0-9a-zA-Z]|^)8[0-9a-zA-Z]{94}([^0-9a-zA-Z]|\$)'
|
|
'|([^0-9a-zA-Z]|^)[0-9a-zA-Z]{106}([^0-9a-zA-Z]|\$)';
|
|
case CryptoCurrency.btc:
|
|
return '([^0-9a-zA-Z]|^)${P2pkhAddress.regex.pattern}|\$)'
|
|
'([^0-9a-zA-Z]|^)${P2shAddress.regex.pattern}|\$)'
|
|
'([^0-9a-zA-Z]|^)${P2wpkhAddress.regex.pattern}|\$)'
|
|
'([^0-9a-zA-Z]|^)${P2wshAddress.regex.pattern}|\$)'
|
|
'([^0-9a-zA-Z]|^)${P2trAddress.regex.pattern}|\$)';
|
|
case CryptoCurrency.ltc:
|
|
return '([^0-9a-zA-Z]|^)^L[a-zA-Z0-9]{26,33}([^0-9a-zA-Z]|\$)'
|
|
'|([^0-9a-zA-Z]|^)[LM][a-km-zA-HJ-NP-Z1-9]{26,33}([^0-9a-zA-Z]|\$)'
|
|
'|([^0-9a-zA-Z]|^)ltc[a-zA-Z0-9]{26,45}([^0-9a-zA-Z]|\$)';
|
|
case CryptoCurrency.eth:
|
|
return '0x[0-9a-zA-Z]{42}';
|
|
case CryptoCurrency.maticpoly:
|
|
return '0x[0-9a-zA-Z]{42}';
|
|
case CryptoCurrency.nano:
|
|
return 'nano_[0-9a-zA-Z]{60}';
|
|
case CryptoCurrency.banano:
|
|
return 'ban_[0-9a-zA-Z]{60}';
|
|
case CryptoCurrency.bch:
|
|
return 'bitcoincash:q[0-9a-zA-Z]{41}([^0-9a-zA-Z]|\$)'
|
|
'|bitcoincash:q[0-9a-zA-Z]{42}([^0-9a-zA-Z]|\$)'
|
|
'|([^0-9a-zA-Z]|^)q[0-9a-zA-Z]{41}([^0-9a-zA-Z]|\$)'
|
|
'|([^0-9a-zA-Z]|^)q[0-9a-zA-Z]{42}([^0-9a-zA-Z]|\$)';
|
|
case CryptoCurrency.sol:
|
|
return '([^0-9a-zA-Z]|^)[1-9A-HJ-NP-Za-km-z]{43,44}([^0-9a-zA-Z]|\$)';
|
|
default:
|
|
return null;
|
|
}
|
|
}
|
|
}
|