package Ġcom . rar ible . protocol . unlock able . util Ċ Ċ import Ġio . da onom ic . rpc . domain . Binary Ċ import Ġorg . slf 4 j . Logger Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . web 3 j . crypto . Keys Ċ import Ġorg . web 3 j . crypto . Sign Ċ import Ġscale ther . domain . Address Ċ import Ġscale ther . util . Hex Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . security . Signature Exception Ċ Ċ object ĠSign Util Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogger : ĠLogger Ġ= ĠLoggerFactory . getLogger ( Sign Util :: class . java ) ĊĠĠĠ Ġprivate Ġconst Ġval ĠSTART Ġ= Ġ"\ u 0 0 1 9 E thereum ĠSigned ĠMessage :\ n " ĊĊĠĠĠ Ġprivate Ġfun Ġfix V ( v : ĠByte ): ĠByte Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( v Ġ< Ġ 2 7 ) Ġ( 2 7 Ġ+ Ġv ). to Byte () Ġelse Ġv ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Start ( message : ĠString ): ĠBinary Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstring Ġ= Ġif Ġ( message . startsWith (" 0 x ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString ( Hex . to Bytes ( message ), ĠStandard Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresult Message Ġ= ĠSTART Ġ+ Ġ( string . toByteArray ( StandardCharsets . UTF _ 8 ). size ) Ġ+ Ġstring ĊĠĠĠĠĠĠĠ Ġreturn ĠBinary . apply ( result Message . toByteArray ( StandardCharsets . UTF _ 8 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrecover ( message : ĠString , Ġsignature : ĠBinary ?): ĠAddress Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġrecover ( add Start ( message ). bytes (), Ġsignature ) ĊĠĠĠĠĠĠĠ Ġlogger . info (" re covered Ġaddress : Ġ{}", Ġdata ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdata ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Signature Exception :: class ) ĊĠĠĠ Ġfun Ġrecover ( message : ĠByteArray , Ġsignature : ĠBinary ?): ĠAddress Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( signature Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSignature Exception (" Signature Ġis Ġnull Ġfor Ġmessage : Ġ$ message ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġfix V ( signature . bytes ()[ 6 4 ]) ĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= ĠByteArray ( 3 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġs Ġ= ĠByteArray ( 3 2 ) ĊĠĠĠĠĠĠĠ ĠSystem . arraycopy ( signature . bytes (), Ġ 0 , Ġr , Ġ 0 , Ġ 3 2 ) ĊĠĠĠĠĠĠĠ ĠSystem . arraycopy ( signature . bytes (), Ġ 3 2 , Ġs , Ġ 0 , Ġ 3 2 ) ĊĠĠĠĠĠĠĠ Ġlogger . info (" recover Internal Ġr ={} Ġs ={} Ġv ={ }", ĠHex . to ( r ), ĠHex . to ( s ), Ġv ) ĊĠĠĠĠĠĠĠ Ġval ĠpublicKey Ġ= ĠSign . signed Message To Key ( message , ĠSign . Signature Data ( v , Ġr , Ġs )) ĊĠĠĠĠĠĠĠ Ġreturn ĠAddress . apply ( Keys . getAddress ( publicKey )) ĊĠĠĠ Ġ} Ċ Ċ }