@startuml
title Value Transfer

participant "User A" as user
box "Hyperledger Cactus" #lightGrey 
entity "Service App" as sapp
entity "API Server" as apis
entity "Validator1" as validator_1
entity "Validator2" as validator_2
end box

box "Ledgers" #orange
database "Ledger1" as ledger_1
database "Ledger2" as ledger_2
end box

user -> sapp: "Request asset transfer \nfrom Ledger1 to Ledger2"
activate sapp

== Lock Ledger1 asset until Ledger2 asset transfer is completed ==
sapp -> apis: "Request to lock \nLedger1 asset"
activate apis

apis ->> ledger_1: "Invoke smart contract\n to transfer asset"
sapp <<-- apis: "Request posted"
deactivate apis
user <<-- sapp: "Request accepted"
deactivate sapp

activate ledger_1
ledger_1 -> ledger_1: "Consensus completed"
validator_1 <<- ledger_1: "Notify new block data"
deactivate ledger_1
activate validator_1

validator_1 -> validator_1: "Validate transactions"
validator_1 -> validator_1: "digital sign on \nvalid transaction"

validator_1 -> apis: "Request to update\n transaction status"
activate apis
apis -> apis: "Update transaction \nstatus(asset locked)"
apis -->> validator_1: "transaction update\n accepted"
deactivate validator_1

sapp <- apis: "Notify transaction \nstatus update"
activate sapp
sapp -> sapp: "update state"
sapp -->> apis: "notification received"
deactivate apis

sapp -> sapp: "determine \nnext operation\n(transfer Ledger2 asset)"

== Transfer Ledger2 Asset ==

sapp -> apis: "Request to \ntransfer Ledger2 asset"
activate apis
apis ->> ledger_2: "Invoke smart contract\n to transfer asset"
sapp <<-- apis: "Request posted"
deactivate apis
deactivate sapp

activate ledger_2
ledger_2 -> ledger_2: "Consensus completed"
validator_2 <<- ledger_2: "Notify new block data"
deactivate ledger_2
activate validator_2

validator_2 -> validator_2: "Validate transactions"
validator_2 -> validator_2: "digital sign on \nvalid transaction"

validator_2 -> apis: "Request to update\n transaction status"
activate apis
apis -> apis: "Update transaction \nstatus"
apis -->> validator_2: "transaction update\n accepted"
deactivate validator_2

sapp <- apis: "Notify transaction \nstatus update"
activate sapp
sapp -> sapp: "update state"
sapp -->> apis: "notification received"
deactivate apis

sapp -> sapp: "determine \nnext operation\n(Settle transfered \nLedger1 asset)"

== Settle transfered Ledger1 asset ==
sapp -> apis: "Request to transfer (unlock?) \nLedger1 asset"
activate apis

apis ->> ledger_1: "Invoke smart contract\n to transfer asset"
sapp <<-- apis: "Request posted"
deactivate apis
user <<-- sapp: "Request accepted"
deactivate sapp

activate ledger_1
ledger_1 -> ledger_1: "Consensus completed"
validator_1 <<- ledger_1: "Notify new block data"
deactivate ledger_1
activate validator_1

validator_1 -> validator_1: "Validate transactions"
validator_1 -> validator_1: "digital sign on \nvalid transaction"

validator_1 -> apis: "Request to update\n transaction status"
activate apis
apis -> apis: "Update transaction \nstatus(asset locked)"
apis -->> validator_1: "transaction update\n accepted"
deactivate validator_1

sapp <- apis: "Notify transaction \nstatus update"
activate sapp
sapp -> sapp: "update state"
sapp -->> apis: "notification received"
deactivate apis

sapp -> sapp: "determine \nnext operation\n(no more operation)"
deactivate sapp


@enduml
