package Ġme . uport . sdk . eth rd id Ċ Ċ import Ġandroid . support . annotation . Visible ForTesting Ċ import Ġandroid . support . annotation . Visible ForTesting . PRIVATE Ċ import Ġkotlinx . coroutines . experimental . launch Ċ import Ġkotlinx . coroutines . experimental . with Context Ċ import Ġme . uport . sdk . core .* Ċ import Ġme . uport . sdk . eth rd id . Delegate Type . Sec p 2 5 6 k 1 Signature Authentication 2 0 1 8 Ċ import Ġme . uport . sdk . eth rd id . Delegate Type . Sec p 2 5 6 k 1 Verification Key 2 0 1 8 Ċ import Ġme . uport . sdk . eth rd id . E thereum DID Registry . Events . DID Attribute Changed Ċ import Ġme . uport . sdk . eth rd id . E thereum DID Registry . Events . DID Delegate Changed Ċ import Ġme . uport . sdk . jsonrpc . Json RPC Ċ import Ġme . uport . sdk . jsonrpc . Json Rpc Base Response Ċ import Ġme . uport . sdk . jsonrpc . experimental . eth Call Ċ import Ġme . uport . sdk . jsonrpc . experimental . get Logs Ċ import Ġorg . ke thereum . en codings . encode To Base 5 8 String Ċ import Ġorg . ke thereum . extensions . hex To BigInteger Ċ import Ġorg . ke thereum . extensions . to HexString No Prefix Ċ import Ġorg . w alle th . k hex . hex To ByteArray Ċ import Ġorg . w alle th . k hex . prepend 0 x Prefix Ċ import Ġorg . w alle th . k hex . to HexString Ċ import Ġpm . gn osis . model . Solid ity Ċ import Ġjava . math . BigInteger Ċ import Ġjava . util .* Ċ Ċ class ĠE thr DID Resolver ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġrpc : ĠJson RPC , ĊĠĠĠĠĠĠĠ Ġ// TODO : Ġreplace Ġhardcoded Ġcoordinates Ġwith Ġconfiguration ĊĠĠĠĠĠĠĠ Ġval Ġregistry Address : ĠString Ġ= ĠDEFAULT _ REGISTRY _ ADDRESS Ċ ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRes olves Ġa Ġgiven Ġe thereum Ġaddress Ġor ĠD ID Ġstring Ġinto Ġa Ġcorresponding ĠD DO ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġresolve ( did : ĠString ): ĠD DO Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnormalized Did Ġ= Ġnormalize Did ( did ) ĊĠĠĠĠĠĠĠ Ġval Ġidentity Ġ= Ġparse Identity ( normalized Did ) ĊĠĠĠĠĠĠĠ Ġval Ġeth rd id Contract Ġ= ĠE thr DID ( identity , Ġrpc , Ġregistry Address , ĠSign er . blank ) ĊĠĠĠĠĠĠĠ Ġval Ġowner Ġ= Ġeth rd id Contract . lookup Owner ( false ) ĊĠĠĠĠĠĠĠ Ġval Ġhistory Ġ= Ġget History ( identity ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwrap Did Document ( normalized Did , Ġowner , Ġhistory ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRes olves Ġa Ġgiven Ġe thereum Ġaddress Ġor ĠD ID Ġstring Ġinto Ġa Ġcorresponding ĠD DO ĊĠĠĠĠ Ġ* ĠCalls Ġback Ġon Ġthe Ġmain Ġthread Ġwith Ġthe Ġresult Ġor Ġan Ġexception ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġresolve ( did : ĠString , Ġcallback : Ġ( err : ĠException ?, Ġd do : ĠD DO ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd do Ġ= Ġresolve ( did ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( UI ) Ġ{ Ġcallback ( null , Ġd do ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( UI ) Ġ{ Ġcallback ( ex , ĠD DO . blank ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOb t ains Ġthe Ġblock Ġnumber Ġwhen Ġthe Ġgiven Ġidentity Ġwas Ġlast Ġchanged , Ġor Ġ[ BigInteger . ZERO ] Ġif Ġno Ġchange Ġwas Ġever Ġmade ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Visible ForTesting ( otherwise Ġ= ĠPRIVATE ) ĊĠĠĠ Ġsuspend Ġfun Ġlast Changed ( identity : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġencoded Call Ġ= ĠEthereum DID Registry . Changed . encode ( Solid ity . Address ( identity . hex To BigInteger ())) ĊĠĠĠĠĠĠĠ Ġval Ġj rpc Response Ġ= Ġrpc . eth Call ( registry Address , Ġencoded Call ) ĊĠĠĠĠĠĠĠ Ġval Ġparsed Response Ġ= ĠJson Rpc Base Response . fromJson ( j rpc Response ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( parsed Response . error Ġ!= Ġnull ) Ġthrow Ġparsed Response . error ?. to Exception () !! ĊĊĠĠĠĠĠĠĠ Ġreturn Ġparsed Response . result . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuilds Ġa Ġlist Ġof Ġevents Ġassociated Ġwith Ġthe Ġ[ identity ] Ġin Ġthe Ġether - did - registry Ġcontract Ġthat Ġres ides Ġat Ġ[ registry Address ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSince Ġthe ĠEvent Ġclasses Ġare Ġgenerated Ġby Ġb iv rost - kotlin , Ġthey Ġdon 't Ġhave Ġa Ġspecific Ġtype Ġso Ġthe Ġlist Ġid Ġof Ġtype Ġ[ Any ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Visible ForTesting ( otherwise Ġ= ĠPRIVATE ) ĊĠĠĠ Ġsuspend Ġfun Ġget History ( identity : ĠString ): ĠList < Any > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlast Changed Queue : ĠQueue < BigInteger > Ġ= ĠPriority Queue < BigInteger >() ĊĠĠĠĠĠĠĠ Ġval Ġevents Ġ= Ġempty List < Any >(). to Mutable List () ĊĠĠĠĠĠĠĠ Ġlast Changed Queue . add ( last Changed ( identity ). hex To BigInteger ()) ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Change Ġ= Ġlast Changed Queue . remove () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlogs Ġ= Ġrpc . get Logs ( registry Address , ĠlistOf ( null , Ġidentity . hex ToBytes 3 2 ()), Ġlast Change , Ġlast Change ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogs . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtopics : ĠList < String > Ġ= Ġit . topics ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata : ĠString Ġ= Ġit . data ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Ġ= ĠEthereum DID Registry . Events . DID Owner Changed . decode ( topics , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Changed Queue . add ( event . previous change . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevents . add ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( err : ĠException ) Ġ{ Ġ/* nop */ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Ġ= ĠEthereum DID Registry . Events . DID Attribute Changed . decode ( topics , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Changed Queue . add ( event . previous change . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevents . add ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( err : ĠException ) Ġ{ Ġ/* nop */ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Ġ= ĠEthereum DID Registry . Events . DID Delegate Changed . decode ( topics , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Changed Queue . add ( event . previous change . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevents . add ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( err : ĠException ) Ġ{ Ġ/* nop */ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( last Change Ġ!= Ġnull Ġ&& Ġlast Change Ġ!= ĠBigInteger . ZERO ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġevents ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWrap s Ġpreviously Ġgather ed Ġinfo Ġinto Ġa ĠD DO ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Visible ForTesting ( otherwise Ġ= ĠPRIVATE ) ĊĠĠĠ Ġfun Ġwrap Did Document ( normalized Did : ĠString , Ġowner : ĠString , Ġhistory : ĠList < Any >): ĠD DO Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠSystem . currentTimeMillis () Ġ/ Ġ 1 0 0 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġpk Entries Ġ= Ġmap Of < String , ĠPublicKey Entry >(). to Mutable Map (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput (" owner ", ĠPublicKey Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġ"$ normalized Did # owner ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠSec p 2 5 6 k 1 Verification Key 2 0 1 8 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner Ġ= Ġnormalized Did , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe thereum Address Ġ= Ġowner ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġauth Entries Ġ= Ġmap Of < String , ĠAuthentication Entry >(). to Mutable Map (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput (" owner ", ĠAuthentication Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠSec p 2 5 6 k 1 Signature Authentication 2 0 1 8 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpublicKey Ġ= Ġ"$ normalized Did # owner " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġservice Entries Ġ= Ġmap Of < String , ĠService Entry >(). to Mutable Map () ĊĊĠĠĠĠĠĠĠ Ġvar Ġdelegate Count Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġhistory . forEach Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠD ID Delegate Changed . Arguments Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelegate Type Ġ= Ġevent . delegate type . bytes . toString ( utf 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelegate Ġ= Ġevent . delegate . value . to HexString No Prefix (). prepend 0 x Prefix () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġ" DID Delegate Changed -$ delegate Type -$ delegate " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalid To Ġ= Ġevent . valid to . value . to Long () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( valid To Ġ>= Ġnow ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate Count ++ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( delegate Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSec p 2 5 6 k 1 Signature Authentication 2 0 1 8 . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsig Auth Ġ-> Ġauth Entries [ key ] Ġ= ĠAuthentication Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠSec p 2 5 6 k 1 Signature Authentication 2 0 1 8 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpublicKey Ġ= Ġ"$ normalized Did # delegate -$ delegate Count ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSec p 2 5 6 k 1 Verification Key 2 0 1 8 . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġveri Key Ġ-> Ġpk Entries [ key ] Ġ= ĠPublicKey Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġ"$ normalized Did # delegate -$ delegate Count ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠSec p 2 5 6 k 1 Verification Key 2 0 1 8 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner Ġ= Ġnormalized Did , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe thereum Address Ġ= Ġdelegate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠD ID Attribute Changed . Arguments Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalid To Ġ= Ġevent . valid to . value . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( valid To Ġ>= Ġnow ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġevent . name . byteArray . bytes 3 2 ToString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġ" DID Attribute Changed -$ name -${ event . value . items . to HexString () }" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// language = RegExp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġregex Ġ= Ġ""" ^ did /( pub | auth | svc )/ (\ w + )( / (\ w + )) ? (/ (\ w + )) ?$ """. to Regex () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatch Result Ġ= Ġregex . find ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( match Result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( section , Ġalgo , Ġ_, Ġraw Type , Ġ_, Ġencoding ) Ġ= Ġmatch Result . de structured ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġparse Type ( algo , Ġraw Type ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( section ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" pub " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpk Ġ= ĠPublicKey Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġ"$ normalized Did # delegate -$ delegate Count ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner Ġ= Ġnormalized Did ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpk Entries [ key ] Ġ= Ġwhen Ġ( encoding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"", Ġ" null ", Ġ" hex " Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpk . copy ( publicKey Hex Ġ= Ġevent . value . items . to HexString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" base 6 4 " Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpk . copy ( publicKey Base 6 4 Ġ= Ġevent . value . items . to Base 6 4 ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" base 5 8 " Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpk . copy ( publicKey Base 5 8 Ġ= Ġevent . value . items . toString ( utf 8 ). hex To ByteArray (). encode To Base 5 8 String ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpk . copy ( value Ġ= Ġevent . value . items . to HexString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" svc " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice Entries [ key ] Ġ= ĠService Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġalgo , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice Endpoint Ġ= Ġevent . value . items . toString ( utf 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠD DO ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġnormalized Did , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpublicKey Ġ= Ġpk Entries . values . toList (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthentication Ġ= Ġauth Entries . values . toList (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice Ġ= Ġservice Entries . values . toList () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ REGISTRY _ ADDRESS Ġ= Ġ" 0 xd ca 7 ef 0 3 e 9 8 e 0 dc 2 b 8 5 5 be 6 4 7 c 3 9 abe 9 8 4 fcf 2 1 b " ĊĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval Ġveri Key Ġ= Ġ" ver i Key " ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval Ġsig Auth Ġ= Ġ" sig Auth " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġattr Types Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsig Auth Ġto Ġ" Signature Authentication 2 0 1 8 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġveri Key Ġto Ġ" Verification Key 2 0 1 8 " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġparse Type ( algo : ĠString , Ġraw Type : ĠString ): ĠDelegate Type Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtype Ġ= Ġif Ġ( raw Type . isBlank ()) Ġveri Key Ġelse Ġraw Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġattr Types [ type ] Ġ?: Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDelegate Type . valueOf ("$ algo $ type ") Ġ// will Ġthrow Ġexception Ġif Ġnone Ġfound ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// language = RegExp ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġidentity Extract Pattern Ġ= Ġ"^ did : eth r :( 0 x [ 0 - 9 a - fA - F ]{ 4 0 }) ". to Regex () ĊĊĠĠĠĠĠĠĠ Ġ// language = RegExp ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdid Parse Pattern Ġ= Ġ"^ ( did : )? (( \\ w + ): )? (( 0 x ) ([ 0 - 9 a - fA - F ]{ 4 0 })) ". to Regex () ĊĊĠĠĠĠĠĠĠ Ġ@ Visible ForTesting ( otherwise Ġ= ĠPRIVATE ) ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġparse Identity ( normalized Did : ĠString ) Ġ= Ġidentity Extract Pattern ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. find ( normalized Did ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . de structured ?. component 1 () Ġ?: Ġ"" ĊĊĠĠĠĠĠĠĠ Ġ@ Visible ForTesting ( otherwise Ġ= ĠPRIVATE ) ĊĠĠĠĠĠĠĠ Ġfun Ġnormalize Did ( did : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatch Result Ġ= Ġdid Parse Pattern . find ( did ) Ġ?: Ġreturn Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( did Header , Ġ_, Ġdid Type , Ġ_, Ġ_, Ġhe xD ig its ) Ġ= Ġmatch Result . de structured ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( did Type . isNotBlank () Ġ&& Ġdid Type Ġ!= Ġ" eth r ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// should Ġforward Ġto Ġanother Ġresolver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( did Header . isBlank () Ġ&& Ġdid Type . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// does n 't Ġreally Ġlook Ġlike Ġa Ġdid Ġif Ġit Ġonly Ġspecifies Ġtype Ġand Ġnot Ġ" did :" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" did : eth r : 0 x $ hex Digits " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ } Ċ