package Ġio . horizontal systems . atom ics wap core Ċ Ċ import Ġjava . security . Message Digest Ċ import Ġjava . util .* Ċ Ċ class ĠSwap Factory ( private Ġval Ġdb : ĠSwap Database ) Ġ{ ĊĠĠĠ Ġval Ġsupported Coins Ġget () Ġ= Ġswap Blockchain Creators . keys ĊĊĠĠĠ Ġprivate Ġval Ġswap Blockchain Creators Ġ= Ġmutable Map Of < String , ĠIS wap Blockchain Creator >() ĊĊĠĠĠ Ġfun Ġregister Swap Blockchain Creator ( coin Code : ĠString , Ġcreator : ĠIS wap Blockchain Creator ) Ġ{ ĊĠĠĠĠĠĠĠ Ġswap Blockchain Creators [ coin Code ] Ġ= Ġcreator ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Blockchain ( coin Code : ĠString ): ĠIS wap Blockchain Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġswap Blockchain Creators [ coin Code ]?. create () Ġ?: Ġthrow ĠAtomic Swap NotSupported ( coin Code ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Atomic Swap Responder ( swap : ĠSwap ): ĠSwap Responder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinit iator Blockchain Ġ= Ġcreate Blockchain ( swap . init iator Coin Code ) ĊĠĠĠĠĠĠĠ Ġval Ġresponder Blockchain Ġ= Ġcreate Blockchain ( swap . responder Coin Code ) ĊĊĠĠĠĠĠĠĠ Ġval Ġswap Responder Do er Ġ= ĠSwap Responder Do er ( init iator Blockchain , Ġresponder Blockchain , Ġswap , Ġdb . swap Dao ) ĊĠĠĠĠĠĠĠ Ġval Ġswap Responder Ġ= ĠSwap Responder ( swap Responder Do er ) ĊĠĠĠĠĠĠĠ Ġswap Responder Do er . delegate Ġ= Ġswap Responder ĊĊĠĠĠĠĠĠĠ Ġreturn Ġswap Responder ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Atomic Swap Init iator ( swap : ĠSwap ): ĠSwap Init iator Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinit iator Blockchain Ġ= Ġcreate Blockchain ( swap . init iator Coin Code ) ĊĠĠĠĠĠĠĠ Ġval Ġresponder Blockchain Ġ= Ġcreate Blockchain ( swap . responder Coin Code ) ĊĊĠĠĠĠĠĠĠ Ġval Ġswap Init iator Do er Ġ= ĠSwap Init iator Do er ( init iator Blockchain , Ġresponder Blockchain , Ġswap , Ġdb . swap Dao ) ĊĠĠĠĠĠĠĠ Ġval Ġswap Init iator Ġ= ĠSwap Init iator ( swap Init iator Do er ) ĊĠĠĠĠĠĠĠ Ġswap Init iator Do er . delegate Ġ= Ġswap Init iator ĊĊĠĠĠĠĠĠĠ Ġreturn Ġswap Init iator ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Swap ( init iator Coin Code : ĠString , Ġresponder Coin Code : ĠString , Ġrate : ĠDouble , Ġamount : ĠDouble ): ĠSwap Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinit iator Blockchain Ġ= Ġcreate Blockchain ( init iator Coin Code ) ĊĠĠĠĠĠĠĠ Ġval Ġresponder Blockchain Ġ= Ġcreate Blockchain ( responder Coin Code ) ĊĊĠĠĠĠĠĠĠ Ġval Ġinit iator Re deem PublicKey Ġ= Ġresponder Blockchain . get Re deem PublicKey () ĊĠĠĠĠĠĠĠ Ġval Ġinit iator Refund PublicKey Ġ= Ġinit iator Blockchain . get Refund PublicKey () ĊĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠĠĠĠĠ Ġval Ġsecret Ġ= Ġsha 2 5 6 ( UUID . randomUUID (). toString (). toByteArray ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġswap Ġ= ĠSwap (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . id Ġ= Ġid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . init iator Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state Ġ= ĠSwap . State . REQUEST ED ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . init iator Coin Code Ġ= Ġinit iator Coin Code ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . responder Coin Code Ġ= Ġresponder Coin Code ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . rate Ġ= Ġrate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . init iator Amount Ġ= Ġ"$ amount " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . init iator Re deem PK H Ġ= Ġinit iator Re deem PublicKey . publicKey Hash ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . init iator Re deem PK Id Ġ= Ġinit iator Re deem PublicKey . public KeyId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . init iator Refund PK H Ġ= Ġinit iator Refund PublicKey . publicKey Hash ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . init iator Refund PK Id Ġ= Ġinit iator Refund PublicKey . public KeyId ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . secret Ġ= Ġsecret ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . secret Hash Ġ= Ġsha 2 5 6 ( secret ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdb . swap Dao . save ( swap ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġswap ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Swap As Responder ( id : ĠString , Ġinit iator Coin Code : ĠString , Ġresponder Coin Code : ĠString , Ġrate : ĠDouble , Ġamount : ĠDouble , Ġinit iator Refund PK H : ĠByteArray , Ġinit iator Re deem PK H : ĠByteArray , Ġsecret Hash : ĠByteArray ): ĠSwap Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinit iator Blockchain Ġ= Ġcreate Blockchain ( init iator Coin Code ) ĊĠĠĠĠĠĠĠ Ġval Ġresponder Blockchain Ġ= Ġcreate Blockchain ( responder Coin Code ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrede em PublicKey Ġ= Ġinit iator Blockchain . get Re deem PublicKey () ĊĠĠĠĠĠĠĠ Ġval Ġrefund PublicKey Ġ= Ġresponder Blockchain . get Refund PublicKey () ĊĊĠĠĠĠĠĠĠ Ġval Ġcalendar Ġ= ĠCalendar . getInstance () ĊĊĠĠĠĠĠĠĠ Ġcalendar . add ( Calendar . DAY _ OF _ YEAR , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġtomorrow Ġ= Ġcalendar . time In Millis Ġ/ Ġ 1 0 0 0 ĊĊĠĠĠĠĠĠĠ Ġcalendar . add ( Calendar . DAY _ OF _ YEAR , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġday After Tom orrow Ġ= Ġcalendar . time In Millis Ġ/ Ġ 1 0 0 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġswap Ġ= ĠSwap (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . id Ġ= Ġid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . init iator Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state Ġ= ĠSwap . State . RESP ON DED ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . init iator Coin Code Ġ= Ġinit iator Coin Code ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . responder Coin Code Ġ= Ġresponder Coin Code ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . rate Ġ= Ġrate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . init iator Amount Ġ= Ġ"$ amount " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . init iator Re deem PK H Ġ= Ġinit iator Re deem PK H ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . init iator Refund PK H Ġ= Ġinit iator Refund PK H ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . secret Hash Ġ= Ġsecret Hash ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponder Re deem PK H Ġ= Ġrede em PublicKey . publicKey Hash ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponder Re deem PK Id Ġ= Ġrede em PublicKey . public KeyId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponder Refund PK H Ġ= Ġrefund PublicKey . publicKey Hash ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponder Refund PK Id Ġ= Ġrefund PublicKey . public KeyId ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponder Refund Time Ġ= Ġtomorrow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit iator Refund Time Ġ= Ġday After Tom orrow ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdb . swap Dao . save ( swap ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġswap ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġretrieve Swap For Response ( id : ĠString , Ġresponder Re deem PK H : ĠByteArray , Ġresponder Refund PK H : ĠByteArray , Ġresponder Refund Time : ĠLong , Ġinit iator Refund Time : ĠLong ): ĠSwap Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġswap From DB Ġ= Ġdb . swap Dao . load ( id ) ĊĊĠĠĠĠĠĠĠ Ġswap From DB . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state Ġ= ĠSwap . State . RESP ON DED ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . responder Re deem PK H Ġ= Ġresponder Re deem PK H ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . responder Refund PK H Ġ= Ġresponder Refund PK H ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . responder Refund Time Ġ= Ġresponder Refund Time ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . init iator Refund Time Ġ= Ġinit iator Refund Time ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdb . swap Dao . save ( swap From DB ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġswap From DB ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsha 2 5 6 ( input : ĠByteArray ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdigest Ġ= ĠMessage Digest . getInstance (" SHA - 2 5 6 ") ĊĠĠĠĠĠĠĠ Ġreturn Ġdigest . digest ( input ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ interface ĠIS wap Blockchain Creator Ġ{ ĊĠĠĠ Ġfun Ġcreate (): ĠIS wap Blockchain Ċ } Ċ Ċ class ĠAtomic Swap NotSupported ( coin Code : ĠString ) Ġ: ĠException (" Atomic Ġswap Ġis Ġnot Ġsupported Ġfor Ġ$ coin Code ") Ċ