package Ġio . pro venance . digital currency . con sort ium . stream Ċ Ċ import Ġio . pro venance . digital currency . con sort ium . Base IntegrationTest Ċ import Ġio . pro venance . digital currency . con sort ium . DEFAULT _ AMOUNT Ċ import Ġio . pro venance . digital currency . con sort ium . TEST _ ADDRESS Ċ import Ġio . pro venance . digital currency . con sort ium . TEST _ MEMBER _ ADDRESS Ċ import Ġio . pro venance . digital currency . con sort ium . TEST _ OTHER _ MEMBER _ ADDRESS Ċ import Ġio . pro venance . digital currency . con sort ium . config . Event Stream Properties Ċ import Ġio . pro venance . digital currency . con sort ium . config . Provenance Properties Ċ import Ġio . pro venance . digital currency . con sort ium . config . Service Properties Ċ import Ġio . pro venance . digital currency . con sort ium . domain . ART Ċ import Ġio . pro venance . digital currency . con sort ium . domain . Address Registration Record Ċ import Ġio . pro venance . digital currency . con sort ium . domain . CM T Ċ import Ġio . pro venance . digital currency . con sort ium . domain . Coin Mint Record Ċ import Ġio . pro venance . digital currency . con sort ium . domain . Coin Movement Record Ċ import Ġio . pro venance . digital currency . con sort ium . domain . Coin Movement Table Ċ import Ġio . pro venance . digital currency . con sort ium . domain . MT Ċ import Ġio . pro venance . digital currency . con sort ium . domain . MT T Ċ import Ġio . pro venance . digital currency . con sort ium . domain . Marker Transfer Record Ċ import Ġio . pro venance . digital currency . con sort ium . domain . Migration Record Ċ import Ġio . pro venance . digital currency . con sort ium . domain . Tx Status Ċ import Ġio . pro venance . digital currency . con sort ium . frameworks . to Output Ċ import Ġio . pro venance . digital currency . con sort ium . get Burn Event Ċ import Ġio . pro venance . digital currency . con sort ium . get Marker Transfer Event Ċ import Ġio . pro venance . digital currency . con sort ium . get Migration Event Ċ import Ġio . pro venance . digital currency . con sort ium . getM int Event Ċ import Ġio . pro venance . digital currency . con sort ium . get Transfer Event Ċ import Ġio . pro venance . digital currency . con sort ium . random Tx Hash Ċ import Ġio . pro venance . digital currency . con sort ium . service . P bc Service Ċ import Ġio . pro venance . digital currency . con sort ium . service . Tx Request Service Ċ import Ġorg . jetbrains . ex posed . sql . and Ċ import Ġorg . jetbrains . ex posed . sql . transactions . transaction Ċ import Ġorg . jetbrains . ex posed . sql . update Ċ import Ġorg . junit . jupiter . api . Assertions Ċ import Ġorg . junit . jupiter . api . Before All Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . Nested Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . mockito . kotlin . reset Ċ import Ġorg . mockito . kotlin . wh enever Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġjava . time . Offset DateTime Ċ import Ġjava . util . UUID Ċ Ċ class ĠEvent Stream Consumer Test Ġ: ĠBase IntegrationTest () Ġ{ ĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġevent Stream Properties : ĠEvent Stream Properties ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpro venance Properties : ĠPro venance Properties ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġservice Properties : ĠService Properties ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtx Request Service : ĠTx Request Service ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġlateinit Ġvar Ġp bc Service Mock : ĠP bc Service ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġevent Stream Consumer : ĠEvent Stream Consumer ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun ĠbeforeEach () Ġ{ ĊĠĠĠĠĠĠĠ Ġreset ( p bc Service Mock ) ĊĊĠĠĠĠĠĠĠ Ġwhenever ( p bc Service Mock . manager Address ). thenReturn ( TEST _ MEMBER _ ADDRESS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Before All ĊĠĠĠ Ġfun Ġbefore All () Ġ{ ĊĠĠĠĠĠĠĠ Ġevent Stream Consumer Ġ= ĠEvent Stream Consumer ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp bc Service Mock , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Stream Properties , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice Properties , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpro venance Properties , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtx Request Service ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠCoin Movement Events Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmint Ġ= Ġget Mint Event ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd cc Denom Ġ= Ġservice Properties . dcc Denom ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġrede em Ġ= Ġget Transfer Event ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Address Ġ= ĠTEST _ MEMBER _ ADDRESS , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdenom Ġ= Ġservice Properties . dcc Denom ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġburn Ġ= Ġget Burn Event ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmember Id Ġ= ĠTEST _ MEMBER _ ADDRESS , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdenom Ġ= Ġservice Properties . dcc Denom ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtransfer Ġ= Ġget Marker Transfer Event ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Address Ġ= ĠTEST _ MEMBER _ ADDRESS , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdenom Ġ= Ġservice Properties . dcc Denom ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` coin Movement Ġ- Ġevents Ġwithout Ġbank Ġparties Ġor Ġmember Ġid Ġare Ġignored `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Time Ġ= ĠOffset DateTime . now () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Stream Consumer . handle Coin Movement Events ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm ints Ġ= ĠlistOf ( mint . copy ( member Id Ġ= Ġ" some other bank ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransfers Ġ= ĠlistOf ( re deem ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġburn s Ġ= ĠlistOf ( burn . copy ( member Id Ġ= Ġ" some other bank ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmarker Trans fers Ġ= ĠlistOf ( transfer . copy ( from Address Ġ= ĠTEST _ OTHER _ MEMBER _ ADDRESS , Ġto Address Ġ= Ġ" some other bank ")), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( 0 , Ġtransaction Ġ{ ĠCoin Movement Record . all (). count () Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` coin Movement Ġ- Ġm ints , Ġrede ems , Ġburn s Ġand Ġtransfers Ġfor Ġbank Ġparties Ġare Ġpersisted `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Time Ġ= ĠOffset DateTime . now () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ Ġinsert Registered Address ( bank Account Uuid Ġ= ĠUUID . randomUUID (), Ġaddress Ġ= ĠTEST _ ADDRESS ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Stream Consumer . handle Coin Movement Events ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm ints Ġ= ĠlistOf ( mint , Ġmint . copy ( withdraw Address Ġ= ĠTEST _ MEMBER _ ADDRESS )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransfers Ġ= ĠlistOf ( re deem , Ġrede em . copy ( sender Ġ= ĠTEST _ ADDRESS )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġburn s Ġ= ĠlistOf ( burn ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmarker Trans fers Ġ= ĠlistOf ( transfer , Ġtransfer . copy ( from Address Ġ= ĠTEST _ OTHER _ MEMBER _ ADDRESS )), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( 7 , Ġtransaction Ġ{ ĠCoin Movement Record . all (). count () Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` coin Movement Ġ- Ġblock Ġre entry Ġis Ġignored `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Time Ġ= ĠOffset DateTime . now () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ Ġinsert Registered Address ( bank Account Uuid Ġ= ĠUUID . randomUUID (), Ġaddress Ġ= ĠTEST _ ADDRESS ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Stream Consumer . handle Coin Movement Events ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm ints Ġ= ĠlistOf ( mint ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransfers Ġ= ĠlistOf ( re deem ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġburn s Ġ= ĠlistOf ( burn ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmarker Trans fers Ġ= ĠlistOf ( transfer ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( 4 , Ġtransaction Ġ{ ĠCoin Movement Record . all (). count () Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Stream Consumer . handle Coin Movement Events ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm ints Ġ= ĠlistOf ( mint ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransfers Ġ= ĠlistOf ( re deem ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġburn s Ġ= ĠlistOf ( burn ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmarker Trans fers Ġ= ĠlistOf ( transfer ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Stream Consumer . handle Coin Movement Events ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm ints Ġ= ĠlistOf ( mint ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransfers Ġ= ĠlistOf ( re deem ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġburn s Ġ= ĠlistOf ( burn ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmarker Trans fers Ġ= ĠlistOf ( transfer ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Stream Consumer . handle Coin Movement Events ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm ints Ġ= ĠlistOf ( mint ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransfers Ġ= ĠlistOf ( re deem ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġburn s Ġ= ĠlistOf ( burn ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmarker Trans fers Ġ= ĠlistOf ( transfer ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( 4 , Ġtransaction Ġ{ ĠCoin Movement Record . all (). count () Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` coin Movement Ġ- Ġb atched Ġmessages Ġin Ġone Ġtx Ġare Ġpersisted `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Time Ġ= ĠOffset DateTime . now () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ Ġinsert Registered Address ( bank Account Uuid Ġ= ĠUUID . randomUUID (), Ġaddress Ġ= ĠTEST _ ADDRESS ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Stream Consumer . handle Coin Movement Events ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm ints Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Mint Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Hash Ġ= Ġ" tx 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd cc Denom Ġ= Ġservice Properties . dcc Denom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransfers Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Transfer Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Hash Ġ= Ġ" tx 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Address Ġ= ĠTEST _ MEMBER _ ADDRESS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdenom Ġ= Ġservice Properties . dcc Denom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġburn s Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Burn Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Hash Ġ= Ġ" tx 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmember Id Ġ= ĠTEST _ MEMBER _ ADDRESS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdenom Ġ= Ġservice Properties . dcc Denom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmarker Trans fers Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Marker Transfer Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Hash Ġ= Ġ" tx 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Address Ġ= ĠTEST _ MEMBER _ ADDRESS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdenom Ġ= Ġservice Properties . dcc Denom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( 4 , Ġtransaction Ġ{ ĠCoin Movement Record . all (). count () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" tx 1 - 0 ", Ġ" tx 1 - 1 ", Ġ" tx 1 - 2 ", Ġ" tx 1 - 3 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĠCoin Movement Record . all (). toList () Ġ}. map Ġ{ Ġit . tx Hash () Ġ}. sorted (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` coin Movement Ġ- Ġcheck Ġv 1 Ġvs Ġv 2 Ġoutput `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Coin Movement ( tx Hash Ġ= Ġ" abc - 0 ", Ġdenom Ġ= Ġservice Properties . dcc Denom ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCoin Movement Table . update Ġ{ Ġit [ legacy Tx Hash ] Ġ= Ġ" abc " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Coin Movement ( tx Hash Ġ= Ġ" abc - 0 ", Ġdenom Ġ= Ġservice Properties . dcc Denom ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Coin Movement ( tx Hash Ġ= Ġ" xyz - 0 ", Ġdenom Ġ= Ġservice Properties . dcc Denom ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Coin Movement ( tx Hash Ġ= Ġ" xyz - 0 ", Ġdenom Ġ= Ġservice Properties . dcc Denom ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Coin Movement ( tx Hash Ġ= Ġ" xyz - 1 ", Ġdenom Ġ= Ġservice Properties . dcc Denom ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Coin Movement ( tx Hash Ġ= Ġ" xyz - 2 ", Ġdenom Ġ= Ġservice Properties . dcc Denom ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( 4 , Ġtransaction Ġ{ ĠCoin Movement Record . all (). count () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertArrayEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" abc - 0 ", Ġ" xyz - 0 ", Ġ" xyz - 1 ", Ġ" xyz - 2 "). to Typed Array (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĠCoin Movement Record . all (). toList () Ġ}. map Ġ{ Ġit ._ tx Hash V 2 . value Ġ}. sorted (). to Typed Array (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertArrayEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" abc ", Ġ" xyz - 0 ", Ġ" xyz - 1 ", Ġ" xyz - 2 "). to Typed Array (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĠCoin Movement Record . all (). toList () Ġ}. to Output (). transactions . map Ġ{ Ġit . tx Id Ġ}. sorted () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Typed Array (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠTx Request Events Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` mark Ġtx Ġrequest Ġevents Ġas Ġcomplete `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Hash Ġ= Ġrandom Tx Hash () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Registered Address ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbank Account Uuid Ġ= ĠUUID . randomUUID (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Ġ= ĠTEST _ ADDRESS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= ĠTx Status . PENDING , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Hash Ġ= Ġtx Hash ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Coin Mint ( address Ġ= Ġ"$ TEST _ ADDRESS . 2 "). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . tx Hash Ġ= Ġtx Hash ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . status Ġ= ĠTx Status . PENDING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Stream Consumer . handle Events ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Hashes Ġ= ĠlistOf ( tx Hash ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransfers Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmigrations Ġ= Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĠAddress Registration Record . find Ġ{ ĠA RT . status Ġeq ĠTx Status . TX N _ COMPLETE Ġ}. count () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĠCoin Mint Record . find Ġ{ ĠC MT . status Ġeq ĠTx Status . TX N _ COMPLETE Ġ}. count () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠMigration Events Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` event Ġis Ġnot Ġa Ġmigrate , Ġtx Ġhash Ġdoes Ġnot Ġexist , Ġdoes Ġnot Ġpersist , Ġdoes Ġnot Ġprocess `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Hash Ġ= Ġrandom Tx Hash () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Stream Consumer . handle Events ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Hashes Ġ= ĠlistOf ( tx Hash ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransfers Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransfer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdenom Ġ= Ġ" dummy Denom ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġamount Ġ= ĠDEFAULT _ AMOUNT . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġ 1 L , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdateTime Ġ= ĠOffset DateTime . now (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Hash Ġ= Ġtx Hash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Member Id Ġ= ĠTEST _ MEMBER _ ADDRESS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Member Id Ġ= ĠTEST _ MEMBER _ ADDRESS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsender Ġ= Ġ" sender ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecipient Ġ= Ġ" recipient " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmigrations Ġ= ĠlistOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( Migration Record . find Ġ{ ĠMT . tx Hash Ġeq Ġtx Hash Ġ}. count (), Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` migration Ġhash Ġexists , Ġdoes Ġnot Ġpersist , Ġdoes Ġnot Ġprocess `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Hash Ġ= Ġrandom Tx Hash () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Migration ( tx Hash ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmigration Event Ġ= Ġget Migration Event ( tx Hash ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Stream Consumer . handle Events ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Hashes Ġ= ĠlistOf ( tx Hash ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransfers Ġ= ĠlistOf (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmigrations Ġ= ĠlistOf ( migration Event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( Migration Record . find Ġ{ ĠMT . tx Hash Ġeq Ġtx Hash Ġ}. count (), Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` valid Ġmigration Ġpers ists , Ġprocesses `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Hash Ġ= Ġrandom Tx Hash () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmigration Event Ġ= Ġget Migration Event ( tx Hash ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Stream Consumer . handle Events ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Hashes Ġ= ĠlistOf ( tx Hash ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransfers Ġ= ĠlistOf (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmigrations Ġ= ĠlistOf ( migration Event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( Migration Record . find Ġ{ Ġ( MT . tx Hash Ġeq Ġtx Hash ) Ġand ĠMT . sent . isNull () Ġ}. count (), Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠMarker Transfer Events Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` event Ġis Ġnot Ġa Ġtransfer , Ġtx Ġhash , Ġdoes Ġnot Ġexist , Ġdoes Ġnot Ġpersist , Ġdoes Ġnot Ġprocess `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Hash Ġ= Ġrandom Tx Hash () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Stream Consumer . handle Events ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Hashes Ġ= ĠlistOf ( tx Hash ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransfers Ġ= ĠlistOf (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmigrations Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMigration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġ 1 L , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdateTime Ġ= ĠOffset DateTime . now (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Hash Ġ= Ġtx Hash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode Id Ġ= Ġ" 2 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( Marker Transfer Record . find Ġ{ ĠM TT . tx Hash Ġeq Ġtx Hash Ġ}. count (), Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` transfer Ġhash Ġexists , Ġdoes Ġnot Ġpersist , Ġdoes Ġnot Ġprocess `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Hash Ġ= Ġrandom Tx Hash () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Marker Transfer ( tx Hash , Ġdenom Ġ= Ġservice Properties . dcc Denom ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransfer Event Ġ= Ġget Transfer Event ( tx Hash , Ġdenom Ġ= Ġservice Properties . dcc Denom ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Stream Consumer . handle Events ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Hashes Ġ= ĠlistOf ( tx Hash ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransfers Ġ= ĠlistOf ( transfer Event ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmigrations Ġ= ĠlistOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( Marker Transfer Record . find Ġ{ ĠM TT . tx Hash Ġeq Ġtx Hash Ġ}. count (), Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` recipient Ġis Ġnot Ġthe Ġmember Ġbank Ġinstance , Ġdoes Ġnot Ġpersist , Ġdoes Ġnot Ġprocess `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Hash Ġ= Ġrandom Tx Hash () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransfer Ġ= Ġget Transfer Event ( tx Hash , Ġ" invalid recipient ", Ġdenom Ġ= Ġservice Properties . dcc Denom ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Stream Consumer . handle Events ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Hashes Ġ= ĠlistOf ( tx Hash ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransfers Ġ= ĠlistOf ( transfer ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmigrations Ġ= ĠlistOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( Marker Transfer Record . find Ġ{ ĠM TT . tx Hash Ġeq Ġtx Hash Ġ}. count (), Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` recipient Ġis Ġthe Ġmember Ġbank Ġinstance , Ġdenom Ġis Ġnot Ġvalid , Ġdoes Ġnot Ġpersist , Ġdoes Ġnot Ġprocess `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Hash Ġ= Ġrandom Tx Hash () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransfer Ġ= Ġget Transfer Event ( tx Hash , Ġdenom Ġ= Ġ" invalid denom ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Stream Consumer . handle Events ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Hashes Ġ= ĠlistOf ( tx Hash ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransfers Ġ= ĠlistOf ( transfer ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmigrations Ġ= ĠlistOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( Marker Transfer Record . find Ġ{ ĠM TT . tx Hash Ġeq Ġtx Hash Ġ}. count (), Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` valid Ġtransfer Ġpers ists , Ġprocesses `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Hash Ġ= Ġrandom Tx Hash () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransfer Ġ= Ġget Transfer Event ( tx Hash , Ġto Address Ġ= ĠTEST _ MEMBER _ ADDRESS , Ġdenom Ġ= Ġservice Properties . dcc Denom ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Stream Consumer . handle Events ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Hashes Ġ= ĠlistOf ( tx Hash ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransfers Ġ= ĠlistOf ( transfer ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmigrations Ġ= ĠlistOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMarker Transfer Record . find Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( MT T . tx Hash Ġeq Ġtx Hash ) Ġand Ġ( MT T . status Ġeq ĠTx Status . TX N _ COMPLETE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. count (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ