2024-01-08 15:13:44 +00:00
import ' package:coinlib_flutter/coinlib_flutter.dart ' as coinlib ;
2024-05-27 23:56:22 +00:00
2024-05-23 00:37:06 +00:00
import ' ../../../models/isar/models/blockchain_data/address.dart ' ;
import ' ../../../models/node_model.dart ' ;
import ' ../../../utilities/amount/amount.dart ' ;
import ' ../../../utilities/default_nodes.dart ' ;
import ' ../../../utilities/enums/derive_path_type_enum.dart ' ;
import ' ../crypto_currency.dart ' ;
import ' ../interfaces/electrumx_currency_interface.dart ' ;
import ' ../intermediate/bip39_hd_currency.dart ' ;
2024-01-08 15:13:44 +00:00
2024-05-15 21:20:45 +00:00
class Namecoin extends Bip39HDCurrency with ElectrumXCurrencyInterface {
2024-01-08 15:13:44 +00:00
Namecoin ( super . network ) {
2024-05-15 21:20:45 +00:00
_idMain = " namecoin " ;
_uriScheme = " namecoin " ;
2024-01-08 15:13:44 +00:00
switch ( network ) {
case CryptoCurrencyNetwork . main:
2024-05-15 21:20:45 +00:00
_id = _idMain ;
_name = " Namecoin " ;
_ticker = " NMC " ;
2024-01-08 15:13:44 +00:00
default :
throw Exception ( " Unsupported network: $ network " ) ;
}
}
2024-05-15 21:20:45 +00:00
late final String _id ;
@ override
String get identifier = > _id ;
late final String _idMain ;
@ override
String get mainNetId = > _idMain ;
late final String _name ;
@ override
String get prettyName = > _name ;
late final String _uriScheme ;
@ override
String get uriScheme = > _uriScheme ;
late final String _ticker ;
@ override
String get ticker = > _ticker ;
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#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 ,
2024-05-15 21:20:45 +00:00
id: DefaultNodes . buildId ( this ) ,
2024-01-08 15:13:44 +00:00
useSSL: true ,
enabled: true ,
2024-05-15 21:20:45 +00:00
coinName: identifier ,
2024-01-08 15:13:44 +00:00
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
2024-05-15 21:20:45 +00:00
Amount get dustLimit = > Amount (
rawValue: BigInt . from ( 546 ) ,
fractionDigits: fractionDigits ,
) ;
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
2024-05-27 23:56:22 +00:00
( { 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-06-07 14:45:56 +00:00
minFee: BigInt . from ( 1 ) , // Not used in stack wallet currently
minOutput: dustLimit . raw , // Not used in stack wallet currently
feePerKb: BigInt . from ( 1 ) , // Not used in stack wallet currently
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
2024-05-15 21:20:45 +00:00
int get defaultSeedPhraseLength = > 12 ;
@ override
int get fractionDigits = > 8 ;
@ override
bool get hasBuySupport = > false ;
@ override
bool get hasMnemonicPassphraseSupport = > true ;
2024-04-17 18:04:10 +00:00
@ override
2024-05-15 21:20:45 +00:00
List < int > get possibleMnemonicLengths = > [ defaultSeedPhraseLength , 12 ] ;
@ override
2024-06-20 16:16:12 +00:00
AddressType get defaultAddressType = > defaultDerivePathType . getAddressType ( ) ;
2024-05-15 21:20:45 +00:00
@ override
BigInt get satsPerCoin = > BigInt . from ( 100000000 ) ;
@ override
int get targetBlockTimeSeconds = > 600 ;
@ override
2024-06-20 16:16:12 +00:00
DerivePathType get defaultDerivePathType = > DerivePathType . bip84 ;
2024-05-15 21:20:45 +00:00
@ override
Uri defaultBlockExplorer ( String txid ) {
switch ( network ) {
case CryptoCurrencyNetwork . main:
return Uri . parse ( " https://chainz.cryptoid.info/nmc/tx.dws? $ txid .htm " ) ;
default :
throw Exception (
" Unsupported network for defaultBlockExplorer(): $ network " ,
) ;
}
}
2024-06-05 22:19:33 +00:00
@ override
int get transactionVersion = > 1 ;
2024-06-07 20:56:57 +00:00
@ override
2024-06-07 22:04:42 +00:00
BigInt get defaultFeeRate = > BigInt . from ( 1000 ) ;
2024-01-08 15:13:44 +00:00
}