package Ġcom . r 3 . cord a . lib . tokens . contracts Ċ Ċ import Ġcom . r 3 . cord a . lib . tokens . contracts . commands . Issue Token Command Ċ import Ġcom . r 3 . cord a . lib . tokens . contracts . commands . Move Token Command Ċ import Ġcom . r 3 . cord a . lib . tokens . contracts . commands . Re deem Token Command Ċ import Ġcom . r 3 . cord a . lib . tokens . contracts . commands . Token Command Ċ import Ġcom . r 3 . cord a . lib . tokens . contracts . states . Abstract Token Ċ import Ġcom . r 3 . cord a . lib . tokens . contracts . types . Iss ued TokenType Ċ import Ġcom . r 3 . cord a . lib . tokens . contracts . types . Token Pointer Ċ import Ġcom . r 3 . cord a . lib . tokens . contracts . types . TokenType Ċ import Ġnet . cord a . v 5 . base . util . unchecked Cast Ċ import Ġnet . cord a . v 5 . crypto . Secure Hash Ċ import Ġnet . cord a . v 5 . ledger . contracts . Attachment Ċ import Ġnet . cord a . v 5 . ledger . contracts . Command Ċ import Ġnet . cord a . v 5 . ledger . contracts . Contract Ċ import Ġnet . cord a . v 5 . ledger . contracts . Contract ClassName Ċ import Ġnet . cord a . v 5 . ledger . contracts . Contract State Ċ import Ġnet . cord a . v 5 . ledger . contracts . State And Ref Ċ import Ġnet . cord a . v 5 . ledger . contracts . Transaction State Ċ import Ġnet . cord a . v 5 . ledger . contracts . select Ċ import Ġnet . cord a . v 5 . ledger . transactions . Ledger Transaction Ċ Ċ /** Ċ Ġ* ĠThis Ġis Ġan Ġabstract Ġcontract Ġwhich Ġcontains Ġcommon Ġfunctionality Ġused Ġby Ġ[ F ung ible Token Contract ] Ġand Ċ Ġ* Ġ[ Non F ung ible Token Contract ]. ĠIt Ġworks Ġby Ġgrouping Ġtokens Ġby Ġtype Ġand Ġthen Ġverify ing Ġeach Ġgroup Ġindividually . ĠIt Ġmust Ċ Ġ* Ġdo Ġthis Ġbecause Ġdifferent Ġ[ Iss ued TokenType ] s Ġare Ġnot Ġf ung ible . ĠFor Ġexample : Ġ 1 0 ĠG BP Ġissued Ġby ĠA LIC E Ġis Ġnot Ġequal Ġto Ġ 1 0 Ċ Ġ* ĠG BP Ġissued Ġby ĠB OB . ĠL ik ew ise , Ġ 1 0 ĠUSD Ġis Ġnot Ġequal Ġto Ġ 1 0 ĠG BP . ĠThis Ġcontract Ġdoesn 't Ġneed Ġto Ġcare Ġabout Ġthe Ġspecific Ċ Ġ* Ġdetails Ġof Ġtokens . ĠIt 's Ġreally Ġonly Ġconcerned Ġwith Ġensuring Ġthat Ġtokens Ġare Ġissued , Ġmoved Ġ( input Ġamount Ġ== Ġoutput Ċ Ġ* Ġamount ) Ġand Ġre dee med Ġcorrectly . Ġ[ F ung ible Token Contract ] Ġand Ġ[ Non F ung ible Token Contract ] Ġspecify Ġtheir Ġown Ċ Ġ* Ġimplementations Ġfor Ġissue , Ġmove Ġand Ġrede em . Ċ Ġ*/ Ċ abstract Ġclass ĠAbstract Token Contract < AT Ġ: ĠAbstract Token > Ġ: ĠContract Ġ{ ĊĊĠĠĠ Ġabstract Ġval Ġaccepts : ĠClass < AT > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġcan Ġbe Ġoverridden Ġto Ġhandle Ġadditional Ġcommand Ġtypes . ĠThe Ġassumption Ġhere Ġis Ġthat Ġonly Ġthe Ġcommand ĊĠĠĠĠ Ġ* Ġinputs Ġand Ġoutputs Ġare Ġrequired Ġto Ġverify Ġiss u ances , Ġmoves Ġand Ġrede mpt ions . ĠAttach ments Ġand Ġthe Ġtimestamp ĊĠĠĠĠ Ġ* Ġare Ġnot Ġprovided . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġdispatch On Command ( ĊĠĠĠĠĠĠĠ Ġcommands : ĠList < Command < Token Command >>, ĊĠĠĠĠĠĠĠ Ġinputs : ĠList < Indexed State < AT >>, ĊĠĠĠĠĠĠĠ Ġoutputs : ĠList < Indexed State < AT >>, ĊĠĠĠĠĠĠĠ Ġattachments : ĠList < Attachment >, ĊĠĠĠĠĠĠĠ Ġreferences : ĠList < State And Ref < Contract State >> ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe ĠJ AR Ġwhich Ġimplements Ġthe ĠTokenType Ġfor Ġthis Ġgroup . ĊĠĠĠĠĠĠĠ Ġval Ġjar Hash : ĠSecure Hash ? Ġ= Ġverify All Tokens Use Same Type Jar ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinputs Ġ= Ġinputs . map Ġ{ Ġit . state . data Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutputs Ġ= Ġoutputs . map Ġ{ Ġit . state . data Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġgroup Ġinvolves Ġa Ġcustom ĠTokenType , Ġso Ġwe Ġneed Ġto Ġcheck Ġthe Ġcorrect ĠJ AR Ġis Ġattached . ĊĠĠĠĠĠĠĠ Ġjar Hash ?. let Ġ{ Ġverify Type Jar Present In Transaction ( jar Ġ= Ġjar Hash , Ġattachments Ġ= Ġattachments ) Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( commands . first (). value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// verify Ġthe Ġtype Ġjar Ġpresence Ġand Ġcorrect ness ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIss u ances Ġshould Ġonly Ġcontain Ġone Ġissue Ġcommand . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIssue Token Command Ġ-> Ġverify Issue ( commands . single (), Ġinputs , Ġoutputs , Ġattachments , Ġreferences ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMov es Ġmay Ġcontain Ġmore Ġthan Ġone Ġmove Ġcommand . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMove Token Command Ġ-> Ġverify Move ( commands , Ġinputs , Ġoutputs , Ġattachments , Ġreferences ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRe de ems Ġmust Ġonly Ġcontain Ġone Ġrede em Ġcommand . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRe deem Token Command Ġ-> Ġverify Re deem ( commands . single (), Ġinputs , Ġoutputs , Ġattachments , Ġreferences ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvide Ġcustom Ġlogic Ġfor Ġhandling Ġiss u ance Ġof Ġa Ġtoken . ĠWith Ġiss u ances , Ġthe Ġassumption Ġis Ġthat Ġonly Ġone Ġissuer ĊĠĠĠĠ Ġ* Ġwill Ġbe Ġinvolved Ġin Ġany Ġone Ġiss u ance , Ġtherefore Ġthere Ġwill Ġonly Ġbe Ġone Ġ[ Issue Token Command ] Ġper Ġgroup . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġverify Issue ( ĊĠĠĠĠĠĠĠ Ġissue Command : ĠCommand < Token Command >, ĊĠĠĠĠĠĠĠ Ġinputs : ĠList < Indexed State < AT >>, ĊĠĠĠĠĠĠĠ Ġoutputs : ĠList < Indexed State < AT >>, ĊĠĠĠĠĠĠĠ Ġattachments : ĠList < Attachment >, ĊĠĠĠĠĠĠĠ Ġreferences : ĠList < State And Ref < Contract State >> ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvide Ġcustom Ġlogic Ġfor Ġhandling Ġthe Ġmoving Ġof Ġa Ġtoken . ĠMore Ġthan Ġone Ġmove Ġcommand Ġcan Ġbe Ġsupplied Ġbecause ĊĠĠĠĠ Ġ* Ġmultiple Ġparties Ġmay Ġneed Ġto Ġmove Ġthe Ġsame Ġ[ Iss ued TokenType ] Ġin Ġone Ġatomic Ġtransaction . ĠEach Ġparty Ġadds Ġtheir ĊĠĠĠĠ Ġ* Ġown Ġcommand Ġwith Ġthe Ġrequired Ġpublic Ġkeys Ġfor Ġthe Ġtokens Ġthey Ġare Ġmoving . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġverify Move ( ĊĠĠĠĠĠĠĠ Ġmove Commands : ĠList < Command < Token Command >>, ĊĠĠĠĠĠĠĠ Ġinputs : ĠList < Indexed State < AT >>, ĊĠĠĠĠĠĠĠ Ġoutputs : ĠList < Indexed State < AT >>, ĊĠĠĠĠĠĠĠ Ġattachments : ĠList < Attachment >, ĊĠĠĠĠĠĠĠ Ġreferences : ĠList < State And Ref < Contract State >> ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvide Ġcustom Ġlogic Ġfor Ġhandling Ġthe Ġrede mpt ion Ġof Ġa Ġtoken . ĠThere Ġis Ġan Ġassumption Ġin Ġthat Ġonly Ġone Ġissuer Ġwill ĊĠĠĠĠ Ġ* Ġbe Ġinvolved Ġin Ġa Ġsingle Ġrede mpt ion Ġtransaction , Ġtherefore Ġthere Ġwill Ġonly Ġbe Ġone Ġ[ Re deem Token Command ] Ġper ĊĠĠĠĠ Ġ* Ġgroup Ġof Ġ[ Iss ued TokenType ] s . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġverify Re deem ( ĊĠĠĠĠĠĠĠ Ġrede em Command : ĠCommand < Token Command >, ĊĠĠĠĠĠĠĠ Ġinputs : ĠList < Indexed State < AT >>, ĊĠĠĠĠĠĠĠ Ġoutputs : ĠList < Indexed State < AT >>, ĊĠĠĠĠĠĠĠ Ġattachments : ĠList < Attachment >, ĊĠĠĠĠĠĠĠ Ġreferences : ĠList < State And Ref < Contract State >> ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġverify ( tx : ĠLed ger Transaction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGroup Ġtoken Ġamounts Ġby Ġtoken Ġtype . ĠWe Ġneed Ġto Ġdo Ġthis Ġbecause Ġtokens Ġof Ġdifferent Ġtypes Ġneed Ġto Ġbe ĊĠĠĠĠĠĠĠ Ġ// Ġverified Ġseparately . ĠThis Ġworks Ġfor Ġthe Ġsame Ġtoken Ġtype Ġwith Ġdifferent Ġiss u ers , Ġor Ġdifferent Ġtoken Ġtypes ĊĠĠĠĠĠĠĠ Ġ// Ġal together . ĠThe Ġgrouping Ġfunction Ġreturns Ġa Ġlist Ġcontaining Ġgroups Ġof Ġinput Ġand Ġoutput Ġstates Ġgrouped Ġby ĊĠĠĠĠĠĠĠ Ġ// Ġtoken Ġtype . ĠThe Ġtype Ġis Ġspecified Ġexplicitly Ġto Ġaid Ġunderstanding . ĊĠĠĠĠĠĠĠ Ġval Ġgroups Ġ= Ġgroup States ( tx ) Ġ{ ĠToken Info ( it . state . data . java Class , Ġit . state . data . iss ued TokenType , Ġit . state . contract ) Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠA Ġlist Ġof Ġonly Ġthe Ġcommands Ġwhich Ġimplement ĠToken Command . ĊĠĠĠĠĠĠĠ Ġval Ġtoken Commands Ġ= Ġtx . commands . select < Token Command >() ĊĠĠĠĠĠĠĠ Ġrequire ( token Commands . isNotEmpty ()) Ġ{ Ġ" There Ġmust Ġbe Ġat Ġleast Ġone Ġtoken Ġcommand Ġin Ġthis Ġtransaction ." Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠAs Ġinputs Ġand Ġoutputs Ġare Ġjust Ġ" b ags Ġof Ġstates " Ġand Ġthe ĠIn Out Groups Ġdo Ġnot Ġcontain Ġcommands , Ġwe Ġmust Ġmatch ĊĠĠĠĠĠĠĠ Ġ// Ġthe ĠToken Command Ġto Ġeach ĠIn Out Group . ĠThere Ġshould Ġbe Ġat Ġleast Ġa Ġsingle Ġcommand Ġfor Ġeach Ġgroup . ĠIf Ġthere ĊĠĠĠĠĠĠĠ Ġ// Ġisn 't Ġthen Ġwe Ġdon 't Ġknow Ġwhat Ġto Ġdo Ġfor Ġeach Ġgroup . ĠFor Ġtoken Ġmoves Ġit Ġmight Ġbe Ġthe Ġcase Ġthat Ġthere Ġis Ġmore ĊĠĠĠĠĠĠĠ Ġ// Ġthan Ġone Ġcommand . ĠHowever , Ġfor Ġiss u ances Ġand Ġrede mpt ions Ġwe Ġwould Ġexpect Ġto Ġsee Ġonly Ġone Ġcommand . ĊĊĠĠĠĠĠĠĠ Ġval Ġgroups And Commands Ġ= Ġgroups . map Ġ{ Ġgroup Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatched Commands : ĠList < Command < Token Command >> Ġ= Ġtoken Commands . filter Ġ{ Ġgroup Matches Command ( it , Ġgroup ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmatched Commands Ġto Ġgroup ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġgroups And Commands . forEach Ġ{ Ġ( commands , Ġgroup ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( commands . isNotEmpty ()) Ġ{ Ġ" There Ġis Ġa Ġtoken Ġgroup Ġwith Ġno Ġassigned Ġcommand !" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( commands . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġmust Ġbe Ġexactly Ġone Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Token Command Ġtype Ġper Ġgroup ! ĠFor Ġexample : ĠYou Ġcannot Ġmap Ġan ĠIssue ĠAND Ġa ĠMove Ġcommand Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" to Ġone Ġgroup Ġof Ġtokens Ġin Ġa Ġtransaction ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch On Command ( commands , Ġgroup . inputs , Ġgroup . outputs , Ġtx . attachments , Ġtx . references ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgroup Matches Command ( it : ĠCommand < Token Command >, Ġgroup : ĠIndexed InOut Group < Abstract Token , ĠToken Info >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġit . value . token Ġ== Ġgroup . grouping Key . iss ued TokenType ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġit . value . input Indic ies () Ġ== Ġgroup . input Indic ies ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġit . value . output Indic ies () Ġ== Ġgroup . output Indic ies ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġverify Type Jar Present In Transaction ( jar : ĠSecure Hash , Ġattachments : ĠList < Attachment >) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( jar Ġin Ġattachments . map Ġ{ Ġit . id Ġ}) Ġ{ Ġ" Expected Ġto Ġfind Ġtype Ġjar : Ġ$ jar Ġin Ġtransaction Ġattachment Ġlist , Ġbut Ġdid Ġnot " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġverify All Tokens Use Same Type Jar ( inputs : ĠList < Abstract Token >, Ġoutputs : ĠList < Abstract Token >): ĠSecure Hash ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinputs And Outputs Ġ= Ġinputs Ġ+ Ġoutputs ĊĠĠĠĠĠĠĠ Ġval Ġtoken Types Ġ= Ġinputs And Outputs . map ( Abstract Token :: token Type ). toSet () ĊĊĠĠĠĠĠĠĠ Ġrequire ( token Types . size Ġ== Ġ 1 ) Ġ{ Ġ" There Ġshould Ġonly Ġbe Ġone ĠTokenType Ġper Ġgroup " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġjar Hashes Ġ= Ġinputs And Outputs . map ( Abstract Token :: token Type Jar Hash ). toSet () ĊĠĠĠĠĠĠĠ Ġrequire ( jar Hashes . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġmust Ġbe Ġexactly Ġone ĠJar Ġ( Hash ) Ġproviding Ġextended ĠTokenType : Ġ${ outputs . first (). token Type . token Identifier } Ġ/ Ġ${ outputs . first (). token Type . java Class }" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( jar Hashes . single () Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// all Ġtoken Ġtypes Ġin Ġthis Ġgroup Ġseem Ġto Ġbe Ġnon - extended Ġtypes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( token Types . single (). java Class Ġ== ĠTokenType :: class . java Ġ|| Ġtoken Types . single (). java Class Ġ== ĠToken Pointer :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Extended ĠTokenType : Ġ${ token Types . single (). java Class } Ġhas Ġbeen Ġused , Ġwh il st Ġno Ġjar Hash Ġhas Ġbeen Ġprovided Ġto Ġpin Ġthe Ġproviding Ġjar " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġjar Hashes . single () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgroup States ( tx : ĠLed ger Transaction , Ġselector : Ġ( Indexed State < AT >) Ġ-> ĠToken Info ): ĠList < Indexed InOut Group < AT , ĠToken Info >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinputs To Verify Ġ= Ġ( 0 Ġuntil Ġtx . inputs . size ). map Ġ{ Ġit Ġto Ġtx . inputs [ it ]. state Ġ}. map NotNull Ġ{ Ġcast If Possible ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġoutputs To Verify Ġ= Ġ( 0 Ġuntil Ġtx . outputs . size ). map Ġ{ Ġit Ġto Ġtx . outputs [ it ] Ġ}. map NotNull Ġ{ Ġcast If Possible ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġin Groups Ġ= Ġinputs To Verify . groupBy ( selector ) ĊĠĠĠĠĠĠĠ Ġval Ġout Groups Ġ= Ġoutputs To Verify . groupBy ( selector ) ĊĠĠĠĠĠĠĠ Ġval Ġgroups Ġ= Ġ( in Groups . keys Ġ+ Ġout Groups . keys ). map Ġ{ Ġuniq Key Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Grouping Ġ= Ġin Groups [ uniq Key ] Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Grouping Ġ= Ġout Groups [ uniq Key ] Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIndexed InOut Group ( input Grouping , Ġoutput Grouping , Ġuniq Key ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġgroups ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠToken Info ( val Ġconcrete Class : ĠClass <* >, Ġval Ġissued TokenType : ĠIss ued TokenType , Ġval Ġcontract Class : ĠContract ClassName ) ĊĊĠĠĠ Ġ// This Ġfunction Ġchecks Ġthat Ġthe Ġunderlying ĠState Ġis Ġof Ġa Ġspecific Ġtype , Ġwh il st Ġreturning Ġthe ĠTransaction State Ġthat Ġwraps Ġit ĊĠĠĠ Ġ// it Ġalso Ġen forces Ġthe Ġfact Ġthat Ġeach Ġstate Ġis Ġof Ġa Ġtype Ġaccepted Ġby Ġthe Ġcurrent Ġconcrete Ġcontract Ġclass ĊĠĠĠ Ġprivate Ġfun Ġcast If Possible ( pair : ĠPair < Int , ĠTransaction State < Contract State >> ): ĠIndexed State < AT >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġpair . second ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġpair . first ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Abstract Token :: class . java . is Instance ( input . data ) Ġ&& Ġaccepts . is Instance ( input . data )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIndexed State ( unchecked Cast ( input ), Ġindex ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠIndexed InOut Group < out ĠT Ġ: ĠContract State , Ġout ĠK Ġ: ĠAny >( ĊĠĠĠĠĠĠĠ Ġval Ġinputs : ĠList < Indexed State < T >>, ĊĠĠĠĠĠĠĠ Ġval Ġoutputs : ĠList < Indexed State < T >>, ĊĠĠĠĠĠĠĠ Ġval Ġgrouping Key : ĠK ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Indic ies Ġ= Ġinputs . map Ġ{ Ġit . index Ġ}. sorted By Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġoutput Indic ies Ġ= Ġoutputs . map Ġ{ Ġit . index Ġ}. sorted By Ġ{ Ġit Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠIndexed State < out ĠT Ġ: ĠContract State >( val Ġstate : ĠTransaction State < T >, Ġval Ġindex : ĠInt ) Ċ }