package Ġcom . trust . web 3 . demo Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . webkit . Javascript Interface Ċ import Ġandroid . webkit . WebView Ċ import Ġorg . json . JSONObject Ċ import Ġsplit ties . alert dialog . appcompat . cancel Button Ċ import Ġsplit ties . alert dialog . appcompat . message Ċ import Ġsplit ties . alert dialog . appcompat . ok Button Ċ import Ġsplit ties . alert dialog . appcompat . title Ċ import Ġsplit ties . alert dialog . material . material AlertDialog Ċ import Ġwallet . core . jni . Coin Type Ċ import Ġwallet . core . jni . Curve Ċ import Ġwallet . core . jni . PrivateKey Ċ Ċ class ĠWeb App Interface ( ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠContext , ĊĠĠĠ Ġprivate Ġval ĠwebView : ĠWebView , ĊĠĠĠ Ġprivate Ġval Ġd app Url : ĠString Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval ĠprivateKey Ġ= ĊĠĠĠĠĠĠĠ ĠPrivate Key (" 0 x 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 ". to Hex ByteArray ()) ĊĠĠĠ Ġprivate Ġval Ġaddr Ġ= ĠCoin Type . ET HERE UM . derive Address ( privateKey ). toLowerCase () ĊĊĠĠĠ Ġ@ Javascript Interface ĊĠĠĠ Ġfun Ġpost Message ( json : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġobj Ġ= ĠJSONObject ( json ) ĊĠĠĠĠĠĠĠ Ġprintln ( obj ) ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġobj . getLong (" id ") ĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= ĠD App Method . from Value ( obj . getString (" name ")) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( method ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠD App Method . REQUEST ACCOUNT S Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . material AlertDialog Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ" Request ĠAccounts " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ"${ d app Url } Ġrequests Ġyour Ġaddress " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġok Button Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġset Address Ġ= Ġ" window . ethereum . set Address (\" $ addr \ "); " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= Ġ" window . ethereum . send Response ($ id , Ġ[ \" $ addr \" ]) " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠwebView . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠwebView . evaluate Javascript ( set Address ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠwebView . evaluate Javascript ( callback ) Ġ{ Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Button () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠD App Method . SIGN MESSAGE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġextract Message ( obj ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Sign Message ( id , Ġdata , Ġadd Prefix Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠD App Method . SIGN PERSON AL MESSAGE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġextract Message ( obj ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Sign Message ( id , Ġdata , Ġadd Prefix Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠD App Method . SIGN TYPE D MESSAGE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġextract Message ( obj ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Ġ= Ġextract Raw ( obj ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Sign Typed Message ( id , Ġdata , Ġraw ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . material AlertDialog Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ" Error " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ"$ method Ġnot Ġimplemented " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġok Button Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġextract Message ( json : ĠJSONObject ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparam Ġ= Ġjson . getJSONObject (" object ") ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġparam . getString (" data ") ĊĠĠĠĠĠĠĠ Ġreturn ĠNumeric . hex StringTo ByteArray ( data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġextract Raw ( json : ĠJSONObject ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparam Ġ= Ġjson . getJSONObject (" object ") ĊĠĠĠĠĠĠĠ Ġreturn Ġparam . getString (" raw ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Sign Message ( id : ĠLong , Ġdata : ĠByteArray , Ġadd Prefix : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . material AlertDialog Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ" Sign ĠMessage " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġif Ġ( add Prefix ) ĠString ( data , ĠChar sets . UTF _ 8 ) Ġelse ĠNumeric . to HexString ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Button Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠwebView . send Error (" Cancel ", Ġid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġok Button Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠwebView . send Result ( sign E thereum Message ( data , Ġadd Prefix ), Ġid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Sign Typed Message ( id : ĠLong , Ġdata : ĠByteArray , Ġraw : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . material AlertDialog Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ" Sign ĠTyped ĠMessage " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġraw ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Button Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠwebView . send Error (" Cancel ", Ġid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġok Button Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠwebView . send Result ( sign E thereum Message ( data , Ġfalse ), Ġid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsign E thereum Message ( message : ĠByteArray , Ġadd Prefix : ĠBoolean ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġdata Ġ= Ġmessage ĊĠĠĠĠĠĠĠ Ġif Ġ( add Prefix ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Prefix Ġ= Ġ"\ u 0 0 1 9 E thereum ĠSigned ĠMessage :\ n " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprefix Ġ= Ġ( message Prefix Ġ+ Ġmessage . size ). toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠByteArray ( prefix . size Ġ+ Ġmessage . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy ( prefix , Ġ 0 , Ġresult , Ġ 0 , Ġprefix . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy ( message , Ġ 0 , Ġresult , Ġprefix . size , Ġmessage . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġwallet . core . jni . Hash . ke cc ak 2 5 6 ( result ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsignature Data Ġ= ĠprivateKey . sign ( data , ĠCurve . SE CP 2 5 6 K 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( this [ this . size Ġ- Ġ 1 ]) Ġ= Ġ( this [ this . size Ġ- Ġ 1 ] Ġ+ Ġ 2 7 ). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠNumeric . to HexString ( signature Data ) ĊĠĠĠ Ġ} Ċ } Ċ