package Ġorg . star coin . si ri us . core ĊĊ Ċ import Ġcom . google . protobuf . ByteString Ċ import Ġkotlinx . serialization .* Ċ import Ġorg . star coin . proto . Star coin Ċ import Ġorg . star coin . si ri us . crypto . Crypto Service Ċ import Ġorg . star coin . si ri us . lang . hex To ByteArray Ċ import Ġorg . star coin . si ri us . lang . to HEX String Ċ import Ġorg . star coin . si ri us . serialization . Binary Decoder Ċ import Ġorg . star coin . si ri us . serialization . Binary Encoder Ċ import Ġorg . star coin . si ri us . serialization . Codec Ċ import Ġorg . star coin . si ri us . util . Mock Utils Ċ import Ġjava . security . PublicKey Ċ Ċ @ Serializable Ċ class ĠAddress Ġprivate Ġconstructor ( internal Ġval Ġbytes : ĠByteArray ) Ġ: ĠCached Hash able (), ĠTo ByteArray Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( bytes . size Ġ== ĠLEN GTH ) Ġ{ Ġ" expect Ġaddress Ġlength :$ LENGTH " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġto Bytes () Ġ= Ġbytes . copyOf () ĊĊĠĠĠ Ġfun Ġto ByteString (): ĠByte String Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠByte String . copyFrom ( this . bytes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . bytes . to HEX String () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhash Data (): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . bytes ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠAddress ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! bytes . content Equals ( other . bytes )) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbytes . content HashCode () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġto Proto (): ĠStar coin . Proto Block Address Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠStar coin . Proto Block Address . newBuilder (). set Address ( ByteString . copyFrom ( bytes )). build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Serializer ( for Class Ġ= ĠAddress :: class ) ĊĠĠĠ Ġcompanion Ġobject Ġ: ĠK Serializer < Address >, ĠCodec < Address > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval ĠLEN GTH Ġ= Ġ 2 0 ĊĊĠĠĠĠĠĠĠ Ġval ĠD UMMY _ ADDRESS : ĠAddress Ġby Ġlazy Ġ{ ĠCrypto Service . dummy Crypto Key . address Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠZERO _ ADDRESS Ġ= ĠAddress . wrap ( ByteArray ( LENGTH )) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( decoder : ĠDecoder ): ĠAddress Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( decoder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBinary Decoder Ġ-> Ġwrap ( decoder . decode ByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwrap ( decoder . decode String ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( encoder : ĠEncoder , Ġobj : ĠAddress ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( encoder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBinary Encoder Ġ-> Ġencoder . encode ByteArray ( obj . bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġencoder . encode String ( obj . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġwrap ( address Hex : ĠString ): ĠAddress Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAddress ( address Hex . hex To ByteArray ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġwrap ( address : ĠByteArray ): ĠAddress Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAddress ( address ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġwrap ( address : ĠByte String ): ĠAddress Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire (! address . isEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAddress ( address . toByteArray ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġrandom (): ĠAddress Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAddress ( Mock Utils . next Bytes ( LENGTH )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Address ( publicKey : ĠPublicKey ): ĠAddress Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCrypto Service . generate Address ( publicKey ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdecode ( bytes : ĠByteArray ): ĠAddress Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAddress . wrap ( bytes ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġencode ( value : ĠAddress ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue . bytes ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠByteArray . to Address () Ġ= ĠAddress . wrap ( this ) Ċ fun ĠString . to Address () Ġ= ĠAddress . wrap ( this . let Ġ{ ĊĠĠĠ Ġif Ġ( this . startsWith (" 0 x ")) Ġthis . substring ( 2 ) Ġelse Ġthis Ċ }) Ċ