package Ġcom . r 3 . demo . cross not ary swap . flows . utils Ċ Ċ import Ġco . parallel universe . fib ers . Suspend able Ċ import Ġcom . r 3 . cord a . lib . tokens . contracts . states . Abstract Token Ċ import Ġcom . r 3 . cord a . lib . tokens . contracts . states . F ung ible Token Ċ import Ġcom . r 3 . cord a . lib . tokens . contracts . states . Non F ung ible Token Ċ import Ġcom . r 3 . cord a . lib . tokens . contracts . types . TokenType Ċ import Ġcom . r 3 . cord a . lib . tokens . workflows . utilities . held Token Amount Criteria Ċ import Ġcom . r 3 . cord a . lib . tokens . workflows . utilities . rows To Amount Ċ import Ġcom . r 3 . cord a . lib . tokens . workflows . utilities . sum Token Criteria Ċ import Ġcom . r 3 . demo . cross not ary swap . flows . dto . Abstract Asset Request Ċ import Ġcom . r 3 . demo . cross not ary swap . flows . dto . Exchange Request DTO Ċ import Ġcom . r 3 . demo . cross not ary swap . flows . dto . F ung ible Asset Request Ċ import Ġcom . r 3 . demo . cross not ary swap . flows . dto . Non F ung ible Asset Request Ċ import Ġcom . r 3 . demo . cross not ary swap . schemas . Exchange Request Ċ import Ġcom . r 3 . demo . cross not ary swap . services . Exchange Request Service Ċ import Ġcom . r 3 . demo . cross not ary swap . states . Lock State Ċ import Ġcom . r 3 . demo . cross not ary swap . types . Request Status Ċ import Ġcom . r 3 . demo . generic . arg Fail Ċ import Ġcom . r 3 . demo . generic . flow Fail Ċ import Ġnet . cord a . core . contracts . Time Window Ċ import Ġnet . cord a . core . contracts . Unique Identifier Ċ import Ġnet . cord a . core . crypto . Transaction Signature Ċ import Ġnet . cord a . core . flows . Flow Logic Ċ import Ġnet . cord a . core . identity . Abstract Party Ċ import Ġnet . cord a . core . internal . unchecked Cast Ċ import Ġnet . cord a . core . node . Service Hub Ċ import Ġnet . cord a . core . node . services . Vault Ċ import Ġnet . cord a . core . node . services . vault . Query Criteria Ċ import Ġnet . cord a . core . transactions . Signed Transaction Ċ import Ġjava . time . Instant ĊĊ Ċ /** Ċ Ġ* ĠGet ĠExchange Ġrequest Ġby ĠrequestId Ċ Ġ*/ Ċ @ Suspend able Ċ fun ĠFlow Logic <* >. getRequest ById ( requestId : ĠString ): ĠExchange Request DTO Ġ= ĊĠĠĠ ĠExchange Request DTO . from Exchange Request Entity ( getRequest Entity ById ( requestId , Ġservice Hub )) ĊĊ Ċ /** Ċ Ġ* ĠGet ĠExchange Ġrequest Ġentity Ġby ĠrequestId Ċ Ġ*/ Ċ fun Ġget Request Entity ById ( requestId : ĠString , Ġservice Hub : ĠService Hub ): ĠExchange Request Ġ= ĊĠĠĠ Ġservice Hub . with EntityManager Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . find ( Exchange Request :: class . java , ĠrequestId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġarg Fail (" Cannot Ġfind Ġexchange Ġrequest Ġwith ĠId : Ġ$ requestId ") ĊĠĠĠ Ġ} Ċ Ċ /** Ċ Ġ* ĠSet Ġrequest Ġstatus Ġof Ġthe Ġexchange Ġrequest Ċ Ġ* Ġ@ param ĠrequestId Ġto Ġbe Ġmodified Ċ Ġ* Ġ@ param Ġrequest Status Ġto Ġbe Ġset Ġfor Ġthe Ġ[ Exchange Request ] Ċ Ġ*/ Ċ @ Suspend able Ċ fun ĠFlow Logic <* >. setRequest Status ( requestId : ĠString , Ġrequest Status : ĠRequest Status , Ġreason : ĠString ? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġval Ġrequest Ġ= Ġget Request Entity ById ( requestId , Ġservice Hub ) ĊĠĠĠ Ġservice Hub . with EntityManager Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( request . request Status Ġ== Ġnull Ġ&& Ġrequest Status Ġ! in ĠlistOf ( Request Status . REQUEST ED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest Status . ABORT ED ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflow Fail (" Status Ġupdate Ġshould Ġbe ĠREQUEST ED / ABORT ED Ġfor Ġnull Ġrequest Status ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( request . request Status Ġ== ĠRequest Status . REQUEST ED Ġ&& Ġrequest . request Status !! Ġin ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest Status . APPRO VED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest Status . DEN IED ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflow Fail (" Request Ġstatus Ġhas Ġalready Ġbeen Ġset Ġwith Ġthe Ġresponse ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrequest . request Status Ġ= Ġrequest Status ĊĠĠĠĠĠĠĠ Ġrequest . reason Ġ= Ġreason ĊĠĠĠĠĠĠĠ Ġmerge ( request ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠSet Ġthe Ġtransaction Ġid Ġafter Ġcompletion Ġof Ġthe Ġrequest Ġlifecycle Ċ Ġ* Ġ@ param ĠrequestId Ġto Ġbe Ġmodified Ċ Ġ* Ġ@ param Ġtx Id Ġto Ġbe Ġupdated Ġin Ġthe Ġ[ Exchange Request ] Ċ Ġ*/ Ċ @ Suspend able Ċ fun ĠFlow Logic <* >. set Tx Details ( requestId : ĠString , Ġtx Id : ĠString , Ġtx : ĠByteArray ) Ġ{ ĊĠĠĠ Ġval Ġrequest Ġ= Ġget Request Entity ById ( requestId , Ġservice Hub ) ĊĠĠĠ Ġservice Hub . with EntityManager Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( request . request Status Ġ== Ġnull Ġ|| Ġrequest . request Status !! Ġin ĠlistOf ( Request Status . REQUEST ED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest Status . DEN IED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest Status . ABORT ED ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflow Fail (" Cannot Ġset Ġthe Ġtransaction Ġid Ġfor Ġrequests Ġwith Ġno Ġrequest Ġstatus Ġor ĠREQUEST ED Ġrequest Ġstatus ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( request . tx Id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflow Fail (" Transaction Ġid Ġhas Ġalready Ġbeen Ġset Ġfor Ġrequest Ġid Ġ$ requestId ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrequest . tx Id Ġ= Ġtx Id ĊĠĠĠĠĠĠĠ Ġrequest . unsigned Transaction Ġ= Ġtx ĊĠĠĠĠĠĠĠ Ġmerge ( request ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreate Ġa Ġnew Ġ[ Exchange Request ] Ġfrom Ġ[ Exchange Request DTO ] Ġobject Ġin Ġthe Ġexchange _ request Ġtable Ġin Ġthe Ġdb Ġof Ċ Ġ* Ġthe Ġlocal Ġnode Ċ Ġ* Ġ@ param Ġexchange Request DTO Ċ Ġ*/ Ċ @ Suspend able Ċ fun ĠFlow Logic <* >. new Exchange Request From Dto ( exchange Request DTO : ĠExchange Request DTO ) Ġ{ ĊĠĠĠ ĠExchange Request Service . logger . info (" exchange Ġrequest Ġdto Ġ: Ġ$ exchange Request DTO ") ĊĠĠĠ Ġval Ġexchange Request Entity Ġ= Ġexchange Request DTO . to Exchange Request Entity () ĊĠĠĠ Ġif Ġ( exchange Request DTO . request Status Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexchange Request Entity . request Status Ġ= ĠRequest Status . REQUEST ED ĊĠĠĠ Ġ} ĊĠĠĠ Ġservice Hub . with EntityManager Ġ{ ĊĠĠĠĠĠĠĠ Ġpersist ( exchange Request Entity ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠChecks Ġif Ġthe Ġspecified Ġasset Ġis Ġowned Ġby Ġour Ġidentity Ċ Ġ* Ġ@ param Ġabstract Asset Request Ġto Ġbe Ġchecked Ġagainst Ġour Ġvault Ċ Ġ* Ġ@ param Ġholder Ġthe Ġidentity Ġto Ġbe Ġchecked Ġagainst Ċ Ġ*/ Ċ @ Suspend able Ċ fun ĠFlow Logic <* >. is Exchange Asset Owned ( abstract Asset Request : ĠAbstract Asset Request , Ġholder : ĠAbstract Party ): ĠBoolean Ġ{ ĊĊĠĠĠ Ġreturn Ġwith ( abstract Asset Request ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ung ible Asset Request Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheld Token Criteria Ġ= Ġheld Token Amount Criteria ( token Amount . token , Ġholder ). and ( sum Token Criteria ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġservice Hub . vault Service . query By ( F ung ible Token :: class . java , Ġheld Token Criteria ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrows To Amount ( token Amount . token , Ġunchecked Cast ( results )) Ġ>= Ġtoken Amount ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNon F ung ible Asset Request Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn fts : ĠVault . Page < Non F ung ible Token > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunchecked Cast ( get Matching Assets Again st Request ( abstract Asset Request , Ġholder )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn fts . states . isNotEmpty () Ġ&& Ġn fts . states . single (). state . data . holder Ġ== Ġholder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġarg Fail (" Cannot Ġdetermine Ġasset Ġrequest Ġtype . ĠIt Ġneeds Ġto Ġbe Ġeither Ġa Ġregular Ġf ung ible Ġor Ġnon Ġf ung ible Ġasset ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠGet Ġmatching ĠAssets Ġfrom Ġan Ġ[ Abstract Asset Request ] Ċ Ġ* Ġ@ param Ġabstract Asset Request Ġto Ġuse Ġto Ġsearch Ċ Ġ* Ġ@ param Ġholder Ġof Ġthe Ġasset Ċ Ġ*/ Ċ @ Suspend able Ċ fun ĠFlow Logic <* >. get Matching Assets Again st Request ( ĊĠĠĠ Ġabstract Asset Request : ĠAbstract Asset Request , ĊĠĠĠ Ġholder : ĠAbstract Party Ċ ): ĠVault . Page < Abstract Token > Ġ{ ĊĠĠĠ Ġreturn Ġwith ( abstract Asset Request ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ung ible Asset Request Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheld Token Criteria Ġ= Ġheld Token Amount Criteria ( token Amount . token , Ġholder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice Hub . vault Service . query By ( F ung ible Token :: class . java , Ġheld Token Criteria ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNon F ung ible Asset Request Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Ġ= ĠQuery Criteria . Linear State Query Criteria ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlinear Id Ġ= ĠlistOf ( Unique Identifier . fromString ( token Identifier )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= ĠVault . State Status . UN CON SU MED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre lev ancy Status Ġ= ĠVault . Re lev ancy Status . RE LE V ANT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice Hub . vault Service . query By ( Non F ung ible Token :: class . java , Ġquery ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġarg Fail (" Cannot Ġdetermine Ġasset Ġrequest Ġtype . ĠIt Ġneeds Ġto Ġbe Ġeither Ġa Ġregular Ġf ung ible Ġor Ġnon Ġf ung ible Ġasset ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠFind Ġout Ġthe Ġrelevant Ġ[ TokenType ] Ġfrom Ġthe Ġ[ Abstract Asset Request ] Ċ Ġ* Ġ@ param Ġabstract Asset Request Ġto Ġuse Ċ Ġ*/ Ċ @ Suspend able Ċ fun ĠFlow Logic <* >. get TokenType From Asset Request ( abstract Asset Request : ĠAbstract Asset Request ): ĠTokenType Ġ{ ĊĠĠĠ Ġreturn Ġwith ( abstract Asset Request ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ung ible Asset Request Ġ-> Ġtoken Amount . token ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNon F ung ible Asset Request Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Ġ= ĠQuery Criteria . Linear State Query Criteria ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlinear Id Ġ= ĠlistOf ( Unique Identifier . fromString ( token Identifier )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= ĠVault . State Status . UN CON SU MED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre lev ancy Status Ġ= ĠVault . Re lev ancy Status . ALL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery By Ġ= Ġservice Hub . vault Service . query By ( Non F ung ible Token :: class . java , Ġquery ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery By . states . single (). state . data . token ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġarg Fail (" Cannot Ġdetermine Ġasset Ġrequest Ġtype . ĠIt Ġneeds Ġto Ġbe Ġeither Ġa Ġregular Ġf ung ible Ġor Ġnon Ġf ung ible Ġasset ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠFind Ġthe Ġ[ Exchange Request ] Ġentity Ġwith Ġthe Ġtransaction Ġid Ġand Ġconvert Ġit Ġinto Ġa Ġ[ Exchange Request DTO ] Ċ Ġ* Ġ@ param Ġtransaction Id Ġto Ġfetch Ġthe Ġ[ Exchange Request ] Ġby Ċ Ġ*/ Ċ @ Suspend able Ċ fun ĠFlow Logic <* >. get Exchange Request By Tx Id ( transaction Id : ĠString ): ĠExchange Request DTO Ġ{ ĊĠĠĠ Ġval Ġquery Results Ġ= Ġservice Hub . with EntityManager Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġcriteria Builder . createQuery ( Exchange Request :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Ġ= Ġfrom ( Exchange Request :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Id Eq Predicate Ġ= Ġcriteria Builder . equal ( root . get < String >(" tx Id "), Ġtransaction Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhere ( criteria Builder . and ( tx Id Eq Predicate )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselect ( root ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcreate Query ( query ). result List ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠExchange Request DTO . from Exchange Request Entity ( query Results . first ()) Ċ } Ċ Ċ /** Ċ Ġ* ĠExtract Ġthe Ġnot ary Ġsignature Ġfrom Ġthe Ġbuy er Ġtransaction Ġas Ġconfigured Ġin Ġthe Ġ[ Lock State ] Ċ Ġ* Ġof Ġthe Ġenc umber ed Ġtransaction Ċ Ġ* Ġ@ param Ġsell er Enc umber ed Tx Ġcontaining Ġinformation Ġabout Ġbuy er 's Ġnot ary Ġin Ġthe Ġ[ Lock State ] Ċ Ġ* Ġ@ param Ġbuy er Tx Ġfinal ised Ċ Ġ*/ Ċ fun ĠFlow Logic <* >. get Not ary Sig From Enc umber ed Tx ( ĊĠĠĠ Ġsell er Enc umber ed Tx : ĠSigned Transaction , ĊĠĠĠ Ġbuy er Tx : ĠSigned Transaction Ċ ): ĠTransaction Signature Ġ{ ĊĠĠĠ Ġval Ġto Ledger Transaction Ġ= Ġsell er Enc umber ed Tx . to Ledger Transaction ( service Hub ) ĊĠĠĠ Ġval Ġlock State Ġ= Ġto Ledger Transaction . outputs OfType ( Lock State :: class . java ). single () ĊĠĠĠ Ġreturn Ġbuy er Tx ĊĠĠĠĠĠĠĠ Ġ. sigs ĊĠĠĠĠĠĠĠ Ġ. single Ġ{ Ġit . by Ġ== Ġlock State . cont rolling Not ary . own ing Key Ġ} Ċ Ċ } Ċ Ċ /** Ċ Ġ* ĠUtility Ġto Ġget Ġtransaction Ġdeadline Ġas Ġconfigured Ġin Ġ[ Lock State ] Ċ Ġ* Ġ@ param Ġsigned Enc umber ed Tx Ġcontaining Ġa Ġsingle Ġ[ Lock State ] Ġwith Ġa Ġ[ Time Window ] Ċ Ġ*/ Ċ fun Ġget Deadline From Lock State ( signed Enc umber ed Tx : ĠSigned Transaction ): ĠInstant Ġ= ĊĠĠĠ Ġsigned Enc umber ed Tx . core Transaction . outputs OfType < Lock State >(). single (). time Window . until Time !! Ċ