2024-01-08 15:13:44 +00:00
import ' package:coinlib_flutter/coinlib_flutter.dart ' as coinlib ;
import ' package:stackwallet/models/isar/models/blockchain_data/address.dart ' ;
import ' package:stackwallet/models/node_model.dart ' ;
import ' package:stackwallet/utilities/amount/amount.dart ' ;
import ' package:stackwallet/utilities/default_nodes.dart ' ;
import ' package:stackwallet/utilities/enums/coin_enum.dart ' ;
import ' package:stackwallet/utilities/enums/derive_path_type_enum.dart ' ;
import ' package:stackwallet/wallets/crypto_currency/crypto_currency.dart ' ;
import ' package:stackwallet/wallets/crypto_currency/intermediate/bip39_hd_currency.dart ' ;
class Namecoin extends Bip39HDCurrency {
Namecoin ( super . network ) {
switch ( network ) {
case CryptoCurrencyNetwork . main:
coin = Coin . namecoin ;
default :
throw Exception ( " Unsupported network: $ network " ) ;
}
}
@ override
2024-01-09 22:57:32 +00:00
// See https://github.com/cypherstack/stack_wallet/blob/621aff47969761014e0a6c4e699cb637d5687ab3/lib/services/coins/namecoin/namecoin_wallet.dart#L58
int get minConfirms = > 2 ;
2024-01-08 15:13:44 +00:00
2024-04-16 22:42:51 +00:00
@ override
bool get torSupport = > true ;
2024-01-08 15:13:44 +00:00
@ override
2024-01-09 22:57:32 +00:00
// See https://github.com/cypherstack/stack_wallet/blob/621aff47969761014e0a6c4e699cb637d5687ab3/lib/services/coins/namecoin/namecoin_wallet.dart#L80
2024-01-08 15:13:44 +00:00
String constructDerivePath ( {
required DerivePathType derivePathType ,
int account = 0 ,
required int chain ,
required int index ,
} ) {
2024-01-09 22:57:32 +00:00
String coinType ;
switch ( networkParams . wifPrefix ) {
case 0xb4 : // NMC mainnet wif.
coinType = " 7 " ; // NMC mainnet.
break ;
// TODO: [prio=low] Add testnet support.
default :
throw Exception ( " Invalid Namecoin network wif used! " ) ;
}
int purpose ;
switch ( derivePathType ) {
case DerivePathType . bip44:
purpose = 44 ;
break ;
2024-01-10 16:15:26 +00:00
2024-01-11 19:36:53 +00:00
case DerivePathType . bip49:
purpose = 49 ;
break ;
2024-01-10 16:15:26 +00:00
2024-01-09 22:57:32 +00:00
case DerivePathType . bip84:
purpose = 84 ;
break ;
default :
throw Exception ( " DerivePathType $ derivePathType not supported " ) ;
}
return " m/ $ purpose '/ $ coinType '/ $ account '/ $ chain / $ index " ;
2024-01-08 15:13:44 +00:00
}
@ override
NodeModel get defaultNode {
switch ( network ) {
case CryptoCurrencyNetwork . main:
return NodeModel (
host: " namecoin.stackwallet.com " ,
port: 57002 ,
name: DefaultNodes . defaultName ,
id: DefaultNodes . buildId ( Coin . namecoin ) ,
useSSL: true ,
enabled: true ,
coinName: Coin . namecoin . name ,
isFailover: true ,
isDown: false ,
) ;
2024-01-09 22:57:32 +00:00
// case CryptoCurrencyNetwork.test:
// TODO: [prio=low] Add testnet support.
2024-01-08 15:13:44 +00:00
default :
throw UnimplementedError ( ) ;
}
}
@ override
2024-01-09 22:57:32 +00:00
// See https://github.com/cypherstack/stack_wallet/blob/621aff47969761014e0a6c4e699cb637d5687ab3/lib/services/coins/namecoin/namecoin_wallet.dart#L60
Amount get dustLimit = >
Amount ( rawValue: BigInt . from ( 546 ) , fractionDigits: Coin . particl . decimals ) ;
2024-01-08 15:13:44 +00:00
@ override
2024-01-09 22:57:32 +00:00
// See https://github.com/cypherstack/stack_wallet/blob/621aff47969761014e0a6c4e699cb637d5687ab3/lib/services/coins/namecoin/namecoin_wallet.dart#L6
String get genesisHash {
switch ( network ) {
case CryptoCurrencyNetwork . main:
return " 000000000062b72c5e2ceb45fbc8587e807c155b0da735e6483dfba2f0a9c770 " ;
case CryptoCurrencyNetwork . test:
return " 00000007199508e34a9ff81e6ec0c477a4cccff2a4767a8eee39c11db367b008 " ;
default :
throw Exception ( " Unsupported network: $ network " ) ;
}
}
2024-01-08 15:13:44 +00:00
@ override
( { coinlib . Address address , AddressType addressType } ) getAddressForPublicKey (
{ required coinlib . ECPublicKey publicKey ,
required DerivePathType derivePathType } ) {
2024-01-09 22:57:32 +00:00
switch ( derivePathType ) {
2024-01-10 16:15:26 +00:00
// case DerivePathType.bip16:
2024-01-09 22:57:32 +00:00
case DerivePathType . bip44:
final addr = coinlib . P2PKHAddress . fromPublicKey (
publicKey ,
version: networkParams . p2pkhPrefix ,
) ;
return ( address: addr , addressType: AddressType . p2pkh ) ;
2024-01-11 19:36:53 +00:00
case DerivePathType . bip49:
final p2wpkhScript = coinlib . P2WPKHAddress . fromPublicKey (
publicKey ,
hrp: networkParams . bech32Hrp ,
) . program . script ;
2024-03-22 21:19:57 +00:00
final addr = coinlib . P2SHAddress . fromRedeemScript (
2024-01-11 19:36:53 +00:00
p2wpkhScript ,
version: networkParams . p2shPrefix ,
) ;
return ( address: addr , addressType: AddressType . p2sh ) ;
2024-01-09 22:57:32 +00:00
case DerivePathType . bip84:
final addr = coinlib . P2WPKHAddress . fromPublicKey (
publicKey ,
hrp: networkParams . bech32Hrp ,
) ;
return ( address: addr , addressType: AddressType . p2wpkh ) ;
default :
throw Exception ( " DerivePathType $ derivePathType not supported " ) ;
}
2024-01-08 15:13:44 +00:00
}
@ override
2024-01-09 22:57:32 +00:00
// See https://github.com/cypherstack/stack_wallet/blob/621aff47969761014e0a6c4e699cb637d5687ab3/lib/services/coins/namecoin/namecoin_wallet.dart#L3474
2024-03-22 21:19:48 +00:00
coinlib . Network get networkParams {
2024-01-09 22:57:32 +00:00
switch ( network ) {
case CryptoCurrencyNetwork . main:
2024-03-22 21:19:48 +00:00
return coinlib . Network (
2024-01-09 22:57:32 +00:00
wifPrefix: 0xb4 , // From 180.
p2pkhPrefix: 0x34 , // From 52.
p2shPrefix: 0x0d , // From 13.
privHDPrefix: 0x0488ade4 ,
pubHDPrefix: 0x0488b21e ,
bech32Hrp: " nc " ,
messagePrefix: ' \x18 Namecoin Signed Message: \n ' ,
2024-03-22 21:19:48 +00:00
minFee: BigInt . from ( 1 ) , // TODO [prio=high].
2024-04-15 19:22:30 +00:00
minOutput: dustLimit . raw , // TODO.
2024-03-22 21:19:48 +00:00
feePerKb: BigInt . from ( 1 ) , // TODO.
2024-01-09 22:57:32 +00:00
) ;
// case CryptoCurrencyNetwork.test:
// TODO: [prio=low] Add testnet support.
default :
throw Exception ( " Unsupported network: $ network " ) ;
}
}
2024-01-08 15:13:44 +00:00
@ override
2024-01-09 22:57:32 +00:00
List < DerivePathType > get supportedDerivationPathTypes = > [
2024-01-10 16:15:26 +00:00
// DerivePathType.bip16,
2024-01-09 22:57:32 +00:00
DerivePathType . bip44 ,
2024-01-11 19:36:53 +00:00
DerivePathType . bip49 ,
2024-01-09 22:57:32 +00:00
DerivePathType . bip84 ,
] ;
2024-01-08 15:13:44 +00:00
@ override
bool validateAddress ( String address ) {
2024-01-09 22:57:32 +00:00
try {
coinlib . Address . fromString ( address , networkParams ) ;
return true ;
} catch ( _ ) {
return false ;
}
2024-01-08 15:13:44 +00:00
}
2024-04-17 18:04:10 +00:00
@ override
bool operator = = ( Object other ) {
return other is Namecoin & & other . network = = network ;
}
@ override
int get hashCode = > Object . hash ( Namecoin , network ) ;
2024-01-08 15:13:44 +00:00
}