package Ġio . horizontal systems . bitcoin core . utils Ċ Ċ import Ġio . horizontal systems . bitcoin core . crypto . Be ch 3 2 Cash Ċ import Ġio . horizontal systems . bitcoin core . crypto . Be ch 3 2 Seg wit Ċ import Ġio . horizontal systems . bitcoin core . exceptions . Address FormatException Ċ import Ġio . horizontal systems . bitcoin core . models .* Ċ import Ġio . horizontal systems . bitcoin core . transactions . scripts . OpCodes Ċ import Ġio . horizontal systems . bitcoin core . transactions . scripts . Script Ċ import Ġio . horizontal systems . bitcoin core . transactions . scripts . Script Type Ċ import Ġjava . util .* Ċ Ċ abstract Ġclass ĠBe ch 3 2 Address Converter ( var Ġh rp : ĠString ) Ġ: ĠI Address Converter Ċ Ċ class ĠSe gw it Address Converter ( address Seg wit H rp : ĠString ) Ġ: ĠBe ch 3 2 Address Converter ( address Seg wit H rp ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġconvert ( address String : ĠString ): ĠSeg W it Address Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdecoded Ġ= ĠBe ch 3 2 Seg wit . decode ( address String ) ĊĠĠĠĠĠĠĠ Ġif Ġ( decoded . hr p Ġ!= Ġh rp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAddress FormatException (" Address ĠH RP Ġ${ decoded . hr p } Ġis Ġnot Ġcorrect ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpayload Ġ= Ġdecoded . data ĊĠĠĠĠĠĠĠ Ġval Ġstring Ġ= ĠBe ch 3 2 Seg wit . encode ( hr p , Ġpayload ) ĊĠĠĠĠĠĠĠ Ġval Ġprogram Ġ= ĠBe ch 3 2 Seg wit . convert Bits ( payload , Ġ 1 , Ġpayload . size Ġ- Ġ 1 , Ġ 5 , Ġ 8 , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSeg W it Address ( string , Ġprogram , ĠAddress Type . W ITNESS , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġconvert ( bytes : ĠByteArray , Ġscript Type : ĠScript Type ): ĠSeg W it Address Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaddress Type Ġ= Ġwhen Ġ( script Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScript Type . P 2 W PK H Ġ-> ĠAddress Type . W ITNESS ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScript Type . P 2 W SH Ġ-> ĠAddress Type . W ITNESS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠAddress FormatException (" Unknown ĠAddress ĠType ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġscript Ġ= ĠScript ( bytes ) ĊĠĠĠĠĠĠĠ Ġval Ġversion Ġ= Ġw itness Version ( script . chunks [ 0 ]. opcode ) ĊĠĠĠĠĠĠĠ Ġval Ġkey Hash Ġ= Ġscript . chunks [ 1 ]. data ĊĠĠĠĠĠĠĠ Ġif Ġ( key Hash Ġ== Ġnull Ġ|| Ġversion Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAddress FormatException (" Invalid Ġaddress Ġsize ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġw itness Script Ġ= ĠBe ch 3 2 Seg wit . convert Bits ( key Hash , Ġ 0 , Ġkey Hash . size , Ġ 8 , Ġ 5 , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġval Ġaddress String Ġ= ĠBe ch 3 2 Seg wit . encode ( hr p , Ġbyte ArrayOf ( version . to Byte ()) Ġ+ Ġw itness Script ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSeg W it Address ( address String , Ġkey Hash , Ġaddress Type , Ġversion ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġconvert ( publicKey : ĠPublicKey , Ġscript Type : ĠScript Type ): ĠAddress Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Hash Ġ= ĠOp Codes . script W PK H ( publicKey . publicKey Hash ) ĊĠĠĠĠĠĠĠ Ġreturn Ġconvert ( key Hash , Ġscript Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġw itness Version ( opcode : ĠInt ): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ ĠOP _ 0 Ġis Ġencoded Ġas Ġ 0 x 0 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( opcode Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġopcode ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠOP _ 1 Ġthrough ĠOP _ 1 6 Ġare Ġencoded Ġas Ġ 0 x 5 1 Ġthough Ġ 0 x 6 0 ĊĠĠĠĠĠĠĠ Ġval Ġversion Ġ= Ġopcode Ġ- Ġ 0 x 5 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( version Ġin Ġ 1 .. 1 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġversion ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠCash Address Converter ( address Seg wit H rp : ĠString ) Ġ: ĠBe ch 3 2 Address Converter ( address Seg wit H rp ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġconvert ( address String : ĠString ): ĠCash Address Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcorrected Address Ġ= Ġaddress String ĊĠĠĠĠĠĠĠ Ġif Ġ( address String . indexOf (": ") Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcorrected Address Ġ= Ġ"$ hr p :$ address String " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdecoded Ġ= ĠBe ch 3 2 Cash . decode ( corrected Address , Ġh rp ) ĊĠĠĠĠĠĠĠ Ġif Ġ( decoded . hr p Ġ!= Ġh rp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAddress FormatException (" Invalid Ġprefix Ġfor Ġnetwork : Ġ${ decoded . hr p } Ġ!= Ġ$ hr p Ġ( expected )") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpayload Ġ= Ġdecoded . data ĊĠĠĠĠĠĠĠ Ġif Ġ( payload . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAddress FormatException (" No Ġpayload ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthat Ġthe Ġpadding Ġis Ġzero . ĊĠĠĠĠĠĠĠ Ġval Ġextra Bits Ġ= Ġ( payload . size Ġ* Ġ 5 Ġ% Ġ 8 ). to Byte () ĊĠĠĠĠĠĠĠ Ġif Ġ( extra Bits Ġ>= Ġ 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAddress FormatException (" More Ġthan Ġallowed Ġpadding ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠByteArray ( payload . size Ġ* Ġ 5 Ġ/ Ġ 8 ) ĊĠĠĠĠĠĠĠ ĠBe ch 3 2 Cash . convert Bits ( data , Ġpayload , Ġ 5 , Ġ 8 , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠDecode Ġtype Ġand Ġsize Ġfrom Ġthe Ġversion . ĊĠĠĠĠĠĠĠ Ġval Ġversion Ġ= Ġdata [ 0 ]. toInt () ĊĠĠĠĠĠĠĠ Ġif Ġ( version Ġand Ġ 0 x 8 0 Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAddress FormatException (" First Ġbit Ġis Ġreserved ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġaddress Type Ġ= Ġwhen Ġ(( version Ġshr Ġ 3 ) Ġand Ġ 0 x 1 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> ĠAddress Type . P 2 PK H ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĠAddress Type . P 2 SH ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠAddress FormatException (" Unknown ĠAddress ĠType ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġhash Size Ġ= Ġ 2 0 Ġ+ Ġ 4 Ġ* Ġ( version Ġand Ġ 0 x 0 3 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( version Ġand Ġ 0 x 0 4 Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Size Ġ*= Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthat Ġwe Ġdecoded Ġthe Ġexact Ġnumber Ġof Ġbytes Ġwe Ġexpected . ĊĠĠĠĠĠĠĠ Ġif Ġ( data . size Ġ!= Ġhash Size Ġ+ Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAddress FormatException (" Data Ġlength Ġ${ data . size } Ġ!= Ġhash Ġsize Ġ$ hash Size ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠCash Address ( corrected Address , Ġdata . copyOf Range ( 1 , Ġdata . size ), Ġaddress Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġconvert ( bytes : ĠByteArray , Ġscript Type : ĠScript Type ): ĠCash Address Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaddress Type Ġ= Ġwhen Ġ( script Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScript Type . P 2 PK H , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScript Type . P 2 PK Ġ-> ĠAddress Type . P 2 PK H ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScript Type . P 2 SH Ġ-> ĠAddress Type . P 2 SH ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠAddress FormatException (" Unknown ĠAddress ĠType ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpayload Size Ġ= Ġbytes . size ĊĠĠĠĠĠĠĠ Ġval Ġencoded Size Ġ= Ġwhen Ġ( payload Size Ġ* Ġ 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 6 0 Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 9 2 Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 2 4 Ġ-> Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 5 6 Ġ-> Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 2 0 Ġ-> Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 8 4 Ġ-> Ġ 5 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 4 8 Ġ-> Ġ 6 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 5 1 2 Ġ-> Ġ 7 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠAddress FormatException (" Invalid Ġaddress Ġlength ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġversion Ġ= Ġ( address Type . ordinal Ġshl Ġ 3 ) Ġor Ġencoded Size ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġbyte ArrayOf ( version . to Byte ()) Ġ+ Ġbytes ĊĊĠĠĠĠĠĠĠ Ġ// ĠReser ve Ġthe Ġnumber Ġof Ġbytes Ġrequired Ġfor Ġa Ġ 5 - bit Ġpacked Ġversion Ġof Ġa ĊĠĠĠĠĠĠĠ Ġ// Ġhash , Ġwith Ġversion Ġbyte . Ġ ĠAdd Ġhalf Ġa Ġbyte ( 4 ) Ġso Ġinteger Ġmath Ġprovides ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġnext Ġmultiple - of - 5 Ġthat Ġwould Ġfit Ġall Ġthe Ġdata . ĊĊĠĠĠĠĠĠĠ Ġval Ġaddress Bytes Ġ= ĠByteArray ((( payload Size Ġ+ Ġ 1 ) Ġ* Ġ 8 Ġ+ Ġ 4 ) Ġ/ Ġ 5 ) ĊĠĠĠĠĠĠĠ ĠBe ch 3 2 Cash . convert Bits ( address Bytes , Ġdata , Ġ 8 , Ġ 5 , Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġval Ġaddress String Ġ= ĠBe ch 3 2 Cash . encode ( hr p , Ġaddress Bytes ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠCash Address ( address String , Ġbytes , Ġaddress Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġconvert ( publicKey : ĠPublicKey , Ġscript Type : ĠScript Type ): ĠAddress Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġconvert ( publicKey . publicKey Hash , Ġscript Type ) ĊĠĠĠ Ġ} Ċ } Ċ