@@ -39,8 +39,8 @@ use secp256k1::{Secp256k1, Verification, XOnlyPublicKey};
3939
4040use crate :: base58;
4141use crate :: blockdata:: constants:: {
42- MAX_SCRIPT_ELEMENT_SIZE , PUBKEY_ADDRESS_PREFIX_MAIN , PUBKEY_ADDRESS_PREFIX_TEST ,
43- SCRIPT_ADDRESS_PREFIX_MAIN , SCRIPT_ADDRESS_PREFIX_TEST ,
42+ MAX_SCRIPT_ELEMENT_SIZE , PUBKEY_ADDRESS_PREFIX_MAIN , PUBKEY_ADDRESS_PREFIX_REGTEST , PUBKEY_ADDRESS_PREFIX_TEST ,
43+ SCRIPT_ADDRESS_PREFIX_MAIN , SCRIPT_ADDRESS_PREFIX_REGTEST , SCRIPT_ADDRESS_PREFIX_TEST ,
4444} ;
4545use crate :: blockdata:: script:: witness_program:: WitnessProgram ;
4646use crate :: blockdata:: script:: witness_version:: WitnessVersion ;
@@ -368,15 +368,17 @@ impl<V: NetworkValidation> Address<V> {
368368 fn fmt_internal ( & self , fmt : & mut fmt:: Formatter ) -> fmt:: Result {
369369 let p2pkh_prefix = match self . network ( ) {
370370 Network :: Mainnet => PUBKEY_ADDRESS_PREFIX_MAIN ,
371- Network :: Testnet | Network :: Devnet | Network :: Regtest => PUBKEY_ADDRESS_PREFIX_TEST ,
371+ Network :: Testnet | Network :: Devnet | Network :: Devnet => PUBKEY_ADDRESS_PREFIX_TEST ,
372+ Network :: Regtest => PUBKEY_ADDRESS_PREFIX_REGTEST ,
372373 } ;
373374 let p2sh_prefix = match self . network ( ) {
374375 Network :: Mainnet => SCRIPT_ADDRESS_PREFIX_MAIN ,
375- Network :: Testnet | Network :: Devnet | Network :: Regtest => SCRIPT_ADDRESS_PREFIX_TEST ,
376+ Network :: Testnet | Network :: Devnet | Network :: Devnet => SCRIPT_ADDRESS_PREFIX_TEST ,
377+ Network :: Regtest => SCRIPT_ADDRESS_PREFIX_REGTEST ,
376378 } ;
377379 let hrp = match self . network ( ) {
378- Network :: Mainnet => hrp :: BC ,
379- Network :: Testnet | Network :: Devnet => hrp :: TB ,
380+ Network :: Mainnet => Hrp :: parse ( "df" ) . unwrap ( ) ,
381+ Network :: Testnet | Network :: Devnet => Hrp :: parse ( "tf" ) . unwrap ( ) ,
380382 Network :: Regtest => hrp:: BCRT ,
381383 } ;
382384 let encoding = AddressEncoding { payload : self . payload ( ) , p2pkh_prefix, p2sh_prefix, hrp } ;
@@ -781,6 +783,10 @@ impl FromStr for Address<NetworkUnchecked> {
781783 ( Network :: Testnet , Payload :: PubkeyHash ( PubkeyHash :: from_slice ( & data[ 1 ..] ) . unwrap ( ) ) ) ,
782784 SCRIPT_ADDRESS_PREFIX_TEST =>
783785 ( Network :: Testnet , Payload :: ScriptHash ( ScriptHash :: from_slice ( & data[ 1 ..] ) . unwrap ( ) ) ) ,
786+ PUBKEY_ADDRESS_PREFIX_REGTEST =>
787+ ( Network :: Testnet , Payload :: PubkeyHash ( PubkeyHash :: from_slice ( & data[ 1 ..] ) . unwrap ( ) ) ) ,
788+ SCRIPT_ADDRESS_PREFIX_REGTEST =>
789+ ( Network :: Testnet , Payload :: ScriptHash ( ScriptHash :: from_slice ( & data[ 1 ..] ) . unwrap ( ) ) ) ,
784790 x => return Err ( ParseError :: Base58 ( base58:: Error :: InvalidAddressVersion ( x) ) ) ,
785791 } ;
786792
@@ -796,6 +802,58 @@ fn segwit_redeem_hash(pubkey_hash: &PubkeyHash) -> crate::hashes::hash160::Hash
796802 crate :: hashes:: hash160:: Hash :: from_engine ( sha_engine)
797803}
798804
805+ #[ test]
806+ fn test_defi_addr ( ) {
807+ // mainnet
808+ println ! ( "mainnet" ) ;
809+ {
810+ let legacy = "8PTeJhFbLR6NFdbXbxMyPVbSHnADbvvBFR" ;
811+ let legacy = Address :: from_str ( legacy) ;
812+ println ! ( "legacy: {:?}" , legacy) ;
813+
814+ let p2sh = "dQgtBZ3rUe89p5xB37BY52ouchoq9eKeSU" ;
815+ let p2sh = Address :: from_str ( p2sh) ;
816+ println ! ( "p2sh: {:?}" , p2sh) ;
817+
818+ let bech32 = "df1q6qvx8rvw4lw6t7dhhvh25s7dm32yh75ufvzdxt" ;
819+ let bech32 = Address :: from_str ( bech32) ;
820+ println ! ( "bech32: {:?}" , bech32) ;
821+ }
822+
823+ // testnet
824+ println ! ( "testnet" ) ;
825+ {
826+ let legacy = "73QYLGdMQp7dtsXEfDV5y1APSGDH5AaNpA" ;
827+ let legacy = Address :: from_str ( legacy) ;
828+ println ! ( "legacy: {:?}" , legacy) ;
829+
830+ let p2sh = "ttA5usesnEsseDa2UfRz3HqeDtwEmvMEhr" ;
831+ let p2sh = Address :: from_str ( p2sh) ;
832+ println ! ( "p2sh: {:?}" , p2sh) ;
833+
834+ let bech32 = "tf1qv73jmh3x9ydnzvwuhk739dq7fpquyun7msuppu" ;
835+ let bech32 = Address :: from_str ( bech32) ;
836+ println ! ( "bech32: {:?}" , bech32) ;
837+ }
838+
839+ // regtest
840+ println ! ( "regtest" ) ;
841+ {
842+ let legacy = "mwjqFtKDbf8w8bRCLBxxjfyBfBNJcaBAdm" ;
843+ let legacy = Address :: from_str ( legacy) ;
844+ println ! ( "legacy: {:?}" , legacy) ;
845+
846+ let p2sh = "2NFb7jCNEJPz1CyBA6b97mENJPhm6qpfnKc" ;
847+ let p2sh = Address :: from_str ( p2sh) ;
848+ println ! ( "p2sh: {:?}" , p2sh) ;
849+
850+ let bech32 = "bcrt1qeq2g82kj99mqfvnwc2g5w0azzd298q0t84tc6s" ;
851+ let bech32 = Address :: from_str ( bech32) ;
852+ println ! ( "bech32: {:?}" , bech32) ;
853+ }
854+ }
855+
856+
799857#[ cfg( test) ]
800858mod tests {
801859 use core:: str:: FromStr ;
@@ -805,7 +863,7 @@ mod tests {
805863
806864 use super :: * ;
807865 use crate :: crypto:: key:: PublicKey ;
808- use crate :: network:: Network :: { Bitcoin , Testnet } ;
866+ use crate :: network:: Network :: { Mainnet , Testnet } ;
809867
810868 fn roundtrips ( addr : & Address ) {
811869 assert_eq ! (
@@ -833,7 +891,7 @@ mod tests {
833891 #[ test]
834892 fn test_p2pkh_address_58 ( ) {
835893 let addr = Address :: new (
836- Bitcoin ,
894+ Mainnet ,
837895 Payload :: PubkeyHash ( "162c5ea71c0b23f5b9022ef047c4a86470a5b070" . parse ( ) . unwrap ( ) ) ,
838896 ) ;
839897
@@ -849,7 +907,7 @@ mod tests {
849907 #[ test]
850908 fn test_p2pkh_from_key ( ) {
851909 let key = "048d5141948c1702e8c95f438815794b87f706a8d4cd2bffad1dc1570971032c9b6042a0431ded2478b5c9cf2d81c124a5e57347a3c63ef0e7716cf54d613ba183" . parse :: < PublicKey > ( ) . unwrap ( ) ;
852- let addr = Address :: p2pkh ( & key, Bitcoin ) ;
910+ let addr = Address :: p2pkh ( & key, Mainnet ) ;
853911 assert_eq ! ( & addr. to_string( ) , "1QJVDzdqb1VpbDK7uDeyVXy9mR27CJiyhY" ) ;
854912
855913 let key = "03df154ebfcf29d29cc10d5c2565018bce2d9edbab267c31d2caf44a63056cf99f"
@@ -864,7 +922,7 @@ mod tests {
864922 #[ test]
865923 fn test_p2sh_address_58 ( ) {
866924 let addr = Address :: new (
867- Bitcoin ,
925+ Mainnet ,
868926 Payload :: ScriptHash ( "162c5ea71c0b23f5b9022ef047c4a86470a5b070" . parse ( ) . unwrap ( ) ) ,
869927 ) ;
870928
@@ -898,21 +956,21 @@ mod tests {
898956 let mut key = "033bc8c83c52df5712229a2f72206d90192366c36428cb0c12b6af98324d97bfbc"
899957 . parse :: < PublicKey > ( )
900958 . unwrap ( ) ;
901- let addr = Address :: p2wpkh ( & key, Bitcoin ) . unwrap ( ) ;
959+ let addr = Address :: p2wpkh ( & key, Mainnet ) . unwrap ( ) ;
902960 assert_eq ! ( & addr. to_string( ) , "bc1qvzvkjn4q3nszqxrv3nraga2r822xjty3ykvkuw" ) ;
903961 assert_eq ! ( addr. address_type( ) , Some ( AddressType :: P2wpkh ) ) ;
904962 roundtrips ( & addr) ;
905963
906964 // Test uncompressed pubkey
907965 key. compressed = false ;
908- assert_eq ! ( Address :: p2wpkh( & key, Bitcoin ) , Err ( Error :: UncompressedPubkey ) ) ;
966+ assert_eq ! ( Address :: p2wpkh( & key, Mainnet ) , Err ( Error :: UncompressedPubkey ) ) ;
909967 }
910968
911969 #[ test]
912970 fn test_p2wsh ( ) {
913971 // stolen from Bitcoin transaction 5df912fda4becb1c29e928bec8d64d93e9ba8efa9b5b405bd683c86fd2c65667
914972 let script = ScriptBuf :: from_hex ( "52210375e00eb72e29da82b89367947f29ef34afb75e8654f6ea368e0acdfd92976b7c2103a1b26313f430c4b15bb1fdce663207659d8cac749a0e53d70eff01874496feff2103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae" ) . unwrap ( ) ;
915- let addr = Address :: p2wsh ( & script, Bitcoin ) ;
973+ let addr = Address :: p2wsh ( & script, Mainnet ) ;
916974 assert_eq ! (
917975 & addr. to_string( ) ,
918976 "bc1qwqdg6squsna38e46795at95yu9atm8azzmyvckulcc7kytlcckxswvvzej"
@@ -927,21 +985,21 @@ mod tests {
927985 let mut key = "026c468be64d22761c30cd2f12cbc7de255d592d7904b1bab07236897cc4c2e766"
928986 . parse :: < PublicKey > ( )
929987 . unwrap ( ) ;
930- let addr = Address :: p2shwpkh ( & key, Bitcoin ) . unwrap ( ) ;
988+ let addr = Address :: p2shwpkh ( & key, Mainnet ) . unwrap ( ) ;
931989 assert_eq ! ( & addr. to_string( ) , "3QBRmWNqqBGme9er7fMkGqtZtp4gjMFxhE" ) ;
932990 assert_eq ! ( addr. address_type( ) , Some ( AddressType :: P2sh ) ) ;
933991 roundtrips ( & addr) ;
934992
935993 // Test uncompressed pubkey
936994 key. compressed = false ;
937- assert_eq ! ( Address :: p2wpkh( & key, Bitcoin ) , Err ( Error :: UncompressedPubkey ) ) ;
995+ assert_eq ! ( Address :: p2wpkh( & key, Mainnet ) , Err ( Error :: UncompressedPubkey ) ) ;
938996 }
939997
940998 #[ test]
941999 fn test_p2shwsh ( ) {
9421000 // stolen from Bitcoin transaction f9ee2be4df05041d0e0a35d7caa3157495ca4f93b233234c9967b6901dacf7a9
9431001 let script = ScriptBuf :: from_hex ( "522103e5529d8eaa3d559903adb2e881eb06c86ac2574ffa503c45f4e942e2a693b33e2102e5f10fcdcdbab211e0af6a481f5532536ec61a5fdbf7183770cf8680fe729d8152ae" ) . unwrap ( ) ;
944- let addr = Address :: p2shwsh ( & script, Bitcoin ) ;
1002+ let addr = Address :: p2shwsh ( & script, Mainnet ) ;
9451003 assert_eq ! ( & addr. to_string( ) , "36EqgNnsWW94SreZgBWc1ANC6wpFZwirHr" ) ;
9461004 assert_eq ! ( addr. address_type( ) , Some ( AddressType :: P2sh ) ) ;
9471005 roundtrips ( & addr) ;
@@ -954,7 +1012,7 @@ mod tests {
9541012 "654f6ea368e0acdfd92976b7c2103a1b26313f430654f6ea368e0acdfd92976b7c2103a1b26313f4"
9551013 ) ;
9561014 let witness_prog = WitnessProgram :: new ( WitnessVersion :: V13 , program. to_vec ( ) ) . unwrap ( ) ;
957- let addr = Address :: new ( Bitcoin , Payload :: WitnessProgram ( witness_prog) ) ;
1015+ let addr = Address :: new ( Mainnet , Payload :: WitnessProgram ( witness_prog) ) ;
9581016 roundtrips ( & addr) ;
9591017 }
9601018
0 commit comments