mirror of
https://github.com/corda/corda.git
synced 2025-06-11 20:01:46 +00:00
Cleanup of the irs demo
This commit is contained in:
1
.idea/compiler.xml
generated
1
.idea/compiler.xml
generated
@ -65,6 +65,7 @@
|
|||||||
<module name="raft-notary-demo_test" target="1.8" />
|
<module name="raft-notary-demo_test" target="1.8" />
|
||||||
<module name="rpc_integrationTest" target="1.8" />
|
<module name="rpc_integrationTest" target="1.8" />
|
||||||
<module name="rpc_main" target="1.8" />
|
<module name="rpc_main" target="1.8" />
|
||||||
|
<module name="rpc_smokeTest" target="1.8" />
|
||||||
<module name="rpc_test" target="1.8" />
|
<module name="rpc_test" target="1.8" />
|
||||||
<module name="samples_main" target="1.8" />
|
<module name="samples_main" target="1.8" />
|
||||||
<module name="samples_test" target="1.8" />
|
<module name="samples_test" target="1.8" />
|
||||||
|
@ -83,14 +83,14 @@ class IRSDemoTest : IntegrationTestCategory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun runTrade(nodeAddr: HostAndPort) {
|
private fun runTrade(nodeAddr: HostAndPort) {
|
||||||
val fileContents = IOUtils.toString(Thread.currentThread().contextClassLoader.getResourceAsStream("example-irs-trade.json"), Charsets.UTF_8.name())
|
val fileContents = IOUtils.toString(Thread.currentThread().contextClassLoader.getResourceAsStream("net/corda/irs/simulation/example-irs-trade.json"), Charsets.UTF_8.name())
|
||||||
val tradeFile = fileContents.replace("tradeXXX", "trade1")
|
val tradeFile = fileContents.replace("tradeXXX", "trade1")
|
||||||
val url = URL("http://$nodeAddr/api/irs/deals")
|
val url = URL("http://$nodeAddr/api/irs/deals")
|
||||||
assertThat(postJson(url, tradeFile)).isTrue()
|
assertThat(postJson(url, tradeFile)).isTrue()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun runUploadRates(host: HostAndPort) {
|
private fun runUploadRates(host: HostAndPort) {
|
||||||
val fileContents = IOUtils.toString(Thread.currentThread().contextClassLoader.getResourceAsStream("example.rates.txt"), Charsets.UTF_8.name())
|
val fileContents = IOUtils.toString(Thread.currentThread().contextClassLoader.getResourceAsStream("net/corda/irs/simulation/example.rates.txt"), Charsets.UTF_8.name())
|
||||||
val url = URL("http://$host/upload/interest-rates")
|
val url = URL("http://$host/upload/interest-rates")
|
||||||
assertThat(uploadFile(url, fileContents)).isTrue()
|
assertThat(uploadFile(url, fileContents)).isTrue()
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,7 @@ class IRSDemoClientApi(private val hostAndPort: HostAndPort) {
|
|||||||
private val api = HttpApi.fromHostAndPort(hostAndPort, apiRoot)
|
private val api = HttpApi.fromHostAndPort(hostAndPort, apiRoot)
|
||||||
|
|
||||||
fun runTrade(tradeId: String): Boolean {
|
fun runTrade(tradeId: String): Boolean {
|
||||||
val fileContents = IOUtils.toString(javaClass.classLoader.getResourceAsStream("example-irs-trade.json"), Charsets.UTF_8.name())
|
val fileContents = IOUtils.toString(javaClass.classLoader.getResourceAsStream("net/corda/irs/simulation/example-irs-trade.json"), Charsets.UTF_8.name())
|
||||||
val tradeFile = fileContents.replace("tradeXXX", tradeId)
|
val tradeFile = fileContents.replace("tradeXXX", tradeId)
|
||||||
return api.postJson("deals", tradeFile)
|
return api.postJson("deals", tradeFile)
|
||||||
}
|
}
|
||||||
@ -24,7 +24,7 @@ class IRSDemoClientApi(private val hostAndPort: HostAndPort) {
|
|||||||
|
|
||||||
// TODO: Add uploading of files to the HTTP API
|
// TODO: Add uploading of files to the HTTP API
|
||||||
fun runUploadRates() {
|
fun runUploadRates() {
|
||||||
val fileContents = IOUtils.toString(Thread.currentThread().contextClassLoader.getResourceAsStream("example.rates.txt"), Charsets.UTF_8.name())
|
val fileContents = IOUtils.toString(Thread.currentThread().contextClassLoader.getResourceAsStream("net/corda/irs/simulation/example.rates.txt"), Charsets.UTF_8.name())
|
||||||
val url = URL("http://$hostAndPort/upload/interest-rates")
|
val url = URL("http://$hostAndPort/upload/interest-rates")
|
||||||
check(uploadFile(url, fileContents))
|
check(uploadFile(url, fileContents))
|
||||||
}
|
}
|
||||||
|
@ -5,10 +5,11 @@ import net.corda.core.RetryableException
|
|||||||
import net.corda.core.contracts.*
|
import net.corda.core.contracts.*
|
||||||
import net.corda.core.crypto.DigitalSignature
|
import net.corda.core.crypto.DigitalSignature
|
||||||
import net.corda.core.crypto.MerkleTreeException
|
import net.corda.core.crypto.MerkleTreeException
|
||||||
import net.corda.core.identity.Party
|
|
||||||
import net.corda.core.crypto.keys
|
import net.corda.core.crypto.keys
|
||||||
import net.corda.core.crypto.sign
|
import net.corda.core.crypto.sign
|
||||||
|
import net.corda.core.flows.FlowException
|
||||||
import net.corda.core.flows.FlowLogic
|
import net.corda.core.flows.FlowLogic
|
||||||
|
import net.corda.core.identity.Party
|
||||||
import net.corda.core.math.CubicSplineInterpolator
|
import net.corda.core.math.CubicSplineInterpolator
|
||||||
import net.corda.core.math.Interpolator
|
import net.corda.core.math.Interpolator
|
||||||
import net.corda.core.math.InterpolatorFactory
|
import net.corda.core.math.InterpolatorFactory
|
||||||
@ -230,7 +231,7 @@ object NodeInterestRates {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: can we split into two? Fix not available (retryable/transient) and unknown (permanent)
|
// TODO: can we split into two? Fix not available (retryable/transient) and unknown (permanent)
|
||||||
class UnknownFix(val fix: FixOf) : RetryableException("Unknown fix: $fix")
|
class UnknownFix(val fix: FixOf) : FlowException("Unknown fix: $fix")
|
||||||
|
|
||||||
/** Fix container, for every fix name & date pair stores a tenor to interest rate map - [InterpolatingRateMap] */
|
/** Fix container, for every fix name & date pair stores a tenor to interest rate map - [InterpolatingRateMap] */
|
||||||
class FixContainer(val fixes: Set<Fix>, val factory: InterpolatorFactory = CubicSplineInterpolator) {
|
class FixContainer(val fixes: Set<Fix>, val factory: InterpolatorFactory = CubicSplineInterpolator) {
|
||||||
@ -245,10 +246,9 @@ object NodeInterestRates {
|
|||||||
|
|
||||||
private fun buildContainer(fixes: Set<Fix>): Map<Pair<String, LocalDate>, InterpolatingRateMap> {
|
private fun buildContainer(fixes: Set<Fix>): Map<Pair<String, LocalDate>, InterpolatingRateMap> {
|
||||||
val tempContainer = HashMap<Pair<String, LocalDate>, HashMap<Tenor, BigDecimal>>()
|
val tempContainer = HashMap<Pair<String, LocalDate>, HashMap<Tenor, BigDecimal>>()
|
||||||
for (fix in fixes) {
|
for ((fixOf, value) in fixes) {
|
||||||
val fixOf = fix.of
|
|
||||||
val rates = tempContainer.getOrPut(fixOf.name to fixOf.forDay) { HashMap<Tenor, BigDecimal>() }
|
val rates = tempContainer.getOrPut(fixOf.name to fixOf.forDay) { HashMap<Tenor, BigDecimal>() }
|
||||||
rates[fixOf.ofTenor] = fix.value
|
rates[fixOf.ofTenor] = value
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: the calendar data needs to be specified for every fix type in the input string
|
// TODO: the calendar data needs to be specified for every fix type in the input string
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package net.corda.simulation
|
package net.corda.irs.simulation
|
||||||
|
|
||||||
import co.paralleluniverse.fibers.Suspendable
|
import co.paralleluniverse.fibers.Suspendable
|
||||||
import com.fasterxml.jackson.module.kotlin.readValue
|
import com.fasterxml.jackson.module.kotlin.readValue
|
||||||
@ -9,12 +9,11 @@ import com.google.common.util.concurrent.SettableFuture
|
|||||||
import net.corda.core.RunOnCallerThread
|
import net.corda.core.RunOnCallerThread
|
||||||
import net.corda.core.contracts.StateAndRef
|
import net.corda.core.contracts.StateAndRef
|
||||||
import net.corda.core.contracts.UniqueIdentifier
|
import net.corda.core.contracts.UniqueIdentifier
|
||||||
import net.corda.core.identity.AnonymousParty
|
|
||||||
import net.corda.core.identity.Party
|
|
||||||
import net.corda.core.flatMap
|
import net.corda.core.flatMap
|
||||||
import net.corda.core.flows.FlowLogic
|
import net.corda.core.flows.FlowLogic
|
||||||
import net.corda.core.flows.FlowStateMachine
|
import net.corda.core.flows.FlowStateMachine
|
||||||
import net.corda.core.flows.InitiatingFlow
|
import net.corda.core.flows.InitiatingFlow
|
||||||
|
import net.corda.core.identity.Party
|
||||||
import net.corda.core.map
|
import net.corda.core.map
|
||||||
import net.corda.core.node.services.linearHeadsOfType
|
import net.corda.core.node.services.linearHeadsOfType
|
||||||
import net.corda.core.success
|
import net.corda.core.success
|
||||||
@ -121,7 +120,7 @@ class IRSSimulation(networkSendManuallyPumped: Boolean, runAsync: Boolean, laten
|
|||||||
// We load the IRS afresh each time because the leg parts of the structure aren't data classes so they don't
|
// We load the IRS afresh each time because the leg parts of the structure aren't data classes so they don't
|
||||||
// have the convenient copy() method that'd let us make small adjustments. Instead they're partly mutable.
|
// have the convenient copy() method that'd let us make small adjustments. Instead they're partly mutable.
|
||||||
// TODO: We should revisit this in post-Excalibur cleanup and fix, e.g. by introducing an interface.
|
// TODO: We should revisit this in post-Excalibur cleanup and fix, e.g. by introducing an interface.
|
||||||
val irs = om.readValue<InterestRateSwap.State>(javaClass.classLoader.getResource("simulation/trade.json"))
|
val irs = om.readValue<InterestRateSwap.State>(javaClass.classLoader.getResource("net/corda/irs/simulation/trade.json"))
|
||||||
irs.fixedLeg.fixedRatePayer = node1.info.legalIdentity
|
irs.fixedLeg.fixedRatePayer = node1.info.legalIdentity
|
||||||
irs.floatingLeg.floatingRatePayer = node2.info.legalIdentity
|
irs.floatingLeg.floatingRatePayer = node2.info.legalIdentity
|
||||||
|
|
@ -1,8 +1,7 @@
|
|||||||
package net.corda.simulation
|
package net.corda.irs.simulation
|
||||||
|
|
||||||
import com.google.common.util.concurrent.Futures
|
import com.google.common.util.concurrent.Futures
|
||||||
import com.google.common.util.concurrent.ListenableFuture
|
import com.google.common.util.concurrent.ListenableFuture
|
||||||
import net.corda.core.crypto.location
|
|
||||||
import net.corda.core.flatMap
|
import net.corda.core.flatMap
|
||||||
import net.corda.core.flows.FlowLogic
|
import net.corda.core.flows.FlowLogic
|
||||||
import net.corda.core.messaging.SingleMessageRecipient
|
import net.corda.core.messaging.SingleMessageRecipient
|
||||||
@ -10,7 +9,6 @@ import net.corda.core.node.CityDatabase
|
|||||||
import net.corda.core.node.PhysicalLocation
|
import net.corda.core.node.PhysicalLocation
|
||||||
import net.corda.core.node.services.ServiceInfo
|
import net.corda.core.node.services.ServiceInfo
|
||||||
import net.corda.core.node.services.containsType
|
import net.corda.core.node.services.containsType
|
||||||
import net.corda.core.then
|
|
||||||
import net.corda.core.utilities.DUMMY_MAP
|
import net.corda.core.utilities.DUMMY_MAP
|
||||||
import net.corda.core.utilities.DUMMY_NOTARY
|
import net.corda.core.utilities.DUMMY_NOTARY
|
||||||
import net.corda.core.utilities.DUMMY_REGULATOR
|
import net.corda.core.utilities.DUMMY_REGULATOR
|
||||||
@ -128,7 +126,7 @@ abstract class Simulation(val networkSendManuallyPumped: Boolean,
|
|||||||
return object : SimulatedNode(cfg, network, networkMapAddr, advertisedServices, id, overrideServices, entropyRoot) {
|
return object : SimulatedNode(cfg, network, networkMapAddr, advertisedServices, id, overrideServices, entropyRoot) {
|
||||||
override fun start(): MockNetwork.MockNode {
|
override fun start(): MockNetwork.MockNode {
|
||||||
super.start()
|
super.start()
|
||||||
javaClass.classLoader.getResourceAsStream("example.rates.txt").use {
|
javaClass.classLoader.getResourceAsStream("net/corda/irs/simulation/example.rates.txt").use {
|
||||||
database.transaction {
|
database.transaction {
|
||||||
findService<NodeInterestRates.Service>().upload(it)
|
findService<NodeInterestRates.Service>().upload(it)
|
||||||
}
|
}
|
||||||
@ -203,7 +201,7 @@ abstract class Simulation(val networkSendManuallyPumped: Boolean,
|
|||||||
* A place for simulations to stash human meaningful text about what the node is "thinking", which might appear
|
* A place for simulations to stash human meaningful text about what the node is "thinking", which might appear
|
||||||
* in the UI somewhere.
|
* in the UI somewhere.
|
||||||
*/
|
*/
|
||||||
val extraNodeLabels = Collections.synchronizedMap(HashMap<SimulatedNode, String>())
|
val extraNodeLabels: MutableMap<SimulatedNode, String> = Collections.synchronizedMap(HashMap())
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Iterates the simulation by one step.
|
* Iterates the simulation by one step.
|
||||||
@ -216,7 +214,6 @@ abstract class Simulation(val networkSendManuallyPumped: Boolean,
|
|||||||
* @return the message that was processed, or null if no node accepted a message in this round.
|
* @return the message that was processed, or null if no node accepted a message in this round.
|
||||||
*/
|
*/
|
||||||
open fun iterate(): InMemoryMessagingNetwork.MessageTransfer? {
|
open fun iterate(): InMemoryMessagingNetwork.MessageTransfer? {
|
||||||
|
|
||||||
if (networkSendManuallyPumped) {
|
if (networkSendManuallyPumped) {
|
||||||
network.messagingNetwork.pumpSend(false)
|
network.messagingNetwork.pumpSend(false)
|
||||||
}
|
}
|
||||||
@ -288,19 +285,4 @@ abstract class Simulation(val networkSendManuallyPumped: Boolean,
|
|||||||
fun stop() {
|
fun stop() {
|
||||||
network.stopNodes()
|
network.stopNodes()
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Given a function that returns a future, iterates that function with arguments like (0, 1), (1, 2), (2, 3) etc
|
|
||||||
* each time the returned future completes.
|
|
||||||
*/
|
|
||||||
fun startTradingCircle(tradeBetween: (indexA: Int, indexB: Int) -> ListenableFuture<*>) {
|
|
||||||
fun next(i: Int, j: Int) {
|
|
||||||
tradeBetween(i, j).then {
|
|
||||||
val ni = (i + 1) % banks.size
|
|
||||||
val nj = (j + 1) % banks.size
|
|
||||||
next(ni, nj)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
next(0, 1)
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -26,7 +26,7 @@ fun postJson(url: URL, data: String): Boolean {
|
|||||||
fun uploadFile(url: URL, file: String): Boolean {
|
fun uploadFile(url: URL, file: String): Boolean {
|
||||||
val body = MultipartBody.Builder()
|
val body = MultipartBody.Builder()
|
||||||
.setType(MultipartBody.FORM)
|
.setType(MultipartBody.FORM)
|
||||||
.addFormDataPart("rates", "example.rates.txt", RequestBody.create(MediaType.parse("text/plain"), file))
|
.addFormDataPart("rates", "net/corda/irs/simulation/example.rates.txt", RequestBody.create(MediaType.parse("text/plain"), file))
|
||||||
.build()
|
.build()
|
||||||
return makeRequest(Request.Builder().url(url).post(body).build())
|
return makeRequest(Request.Builder().url(url).post(body).build())
|
||||||
}
|
}
|
||||||
|
@ -1,76 +0,0 @@
|
|||||||
package net.corda.simulation
|
|
||||||
|
|
||||||
import com.google.common.util.concurrent.Futures
|
|
||||||
import com.google.common.util.concurrent.ListenableFuture
|
|
||||||
import net.corda.contracts.CommercialPaper
|
|
||||||
import net.corda.contracts.asset.DUMMY_CASH_ISSUER
|
|
||||||
import net.corda.contracts.testing.fillWithSomeTestCash
|
|
||||||
import net.corda.core.contracts.DOLLARS
|
|
||||||
import net.corda.core.contracts.OwnableState
|
|
||||||
import net.corda.core.contracts.`issued by`
|
|
||||||
import net.corda.core.days
|
|
||||||
import net.corda.core.flatMap
|
|
||||||
import net.corda.core.flows.FlowStateMachine
|
|
||||||
import net.corda.core.seconds
|
|
||||||
import net.corda.core.transactions.SignedTransaction
|
|
||||||
import net.corda.flows.TwoPartyTradeFlow.Buyer
|
|
||||||
import net.corda.flows.TwoPartyTradeFlow.Seller
|
|
||||||
import net.corda.testing.initiateSingleShotFlow
|
|
||||||
import net.corda.testing.node.InMemoryMessagingNetwork
|
|
||||||
import java.time.Instant
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Simulates a never ending series of trades that go pair-wise through the banks (e.g. A and B trade with each other,
|
|
||||||
* then B and C trade with each other, then C and A etc).
|
|
||||||
*/
|
|
||||||
class TradeSimulation(runAsync: Boolean, latencyInjector: InMemoryMessagingNetwork.LatencyCalculator?) : Simulation(false, runAsync, latencyInjector) {
|
|
||||||
override fun startMainSimulation(): ListenableFuture<Unit> {
|
|
||||||
startTradingCircle { i, j -> tradeBetween(i, j) }
|
|
||||||
return Futures.immediateFailedFuture(UnsupportedOperationException("This future never completes"))
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun tradeBetween(buyerBankIndex: Int, sellerBankIndex: Int): ListenableFuture<MutableList<SignedTransaction>> {
|
|
||||||
val buyer = banks[buyerBankIndex]
|
|
||||||
val seller = banks[sellerBankIndex]
|
|
||||||
|
|
||||||
buyer.services.fillWithSomeTestCash(1500.DOLLARS, notary.info.notaryIdentity)
|
|
||||||
|
|
||||||
val issuance = run {
|
|
||||||
val tx = CommercialPaper().generateIssue(
|
|
||||||
seller.info.legalIdentity.ref(1, 2, 3),
|
|
||||||
1100.DOLLARS `issued by` DUMMY_CASH_ISSUER,
|
|
||||||
Instant.now() + 10.days,
|
|
||||||
notary.info.notaryIdentity)
|
|
||||||
tx.setTime(Instant.now(), 30.seconds)
|
|
||||||
val notaryKey = notary.services.notaryIdentityKey
|
|
||||||
val sellerKey = seller.services.legalIdentityKey
|
|
||||||
tx.signWith(notaryKey)
|
|
||||||
tx.signWith(sellerKey)
|
|
||||||
tx.toSignedTransaction(true)
|
|
||||||
}
|
|
||||||
seller.services.recordTransactions(issuance)
|
|
||||||
|
|
||||||
val amount = 1000.DOLLARS
|
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
val buyerFuture = buyer.initiateSingleShotFlow(Seller::class) {
|
|
||||||
Buyer(it, notary.info.notaryIdentity, amount, CommercialPaper.State::class.java)
|
|
||||||
}.flatMap { (it.stateMachine as FlowStateMachine<SignedTransaction>).resultFuture }
|
|
||||||
|
|
||||||
val sellerKey = seller.services.legalIdentityKey
|
|
||||||
val sellerFlow = Seller(
|
|
||||||
buyer.info.legalIdentity,
|
|
||||||
notary.info,
|
|
||||||
issuance.tx.outRef<OwnableState>(0),
|
|
||||||
amount,
|
|
||||||
sellerKey)
|
|
||||||
|
|
||||||
showConsensusFor(listOf(buyer, seller, notary))
|
|
||||||
showProgressFor(listOf(buyer, seller))
|
|
||||||
|
|
||||||
val sellerFuture = seller.services.startFlow(sellerFlow).resultFuture
|
|
||||||
|
|
||||||
return Futures.successfulAsList(buyerFuture, sellerFuture)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,228 +0,0 @@
|
|||||||
# Some pretend noddy rate fixes, for the interest rate oracles.
|
|
||||||
|
|
||||||
ICE LIBOR 2016-03-16 1M = 0.678
|
|
||||||
ICE LIBOR 2016-03-16 2M = 0.655
|
|
||||||
EURIBOR 2016-03-15 1M = 0.123
|
|
||||||
EURIBOR 2016-03-15 2M = 0.111
|
|
||||||
|
|
||||||
# Previous fixings
|
|
||||||
ICE LIBOR 2016-03-07 3M = 0.0063516
|
|
||||||
ICE LIBOR 2016-03-07 3M = 0.0063516
|
|
||||||
ICE LIBOR 2016-03-08 3M = 0.0063517
|
|
||||||
ICE LIBOR 2016-03-09 3M = 0.0063518
|
|
||||||
ICE LIBOR 2016-03-10 3M = 0.0063519
|
|
||||||
ICE LIBOR 2016-06-06 3M = 0.0063520
|
|
||||||
ICE LIBOR 2016-06-07 3M = 0.0063521
|
|
||||||
ICE LIBOR 2016-06-08 3M = 0.0063522
|
|
||||||
ICE LIBOR 2016-06-09 3M = 0.0063523
|
|
||||||
ICE LIBOR 2016-06-10 3M = 0.0063524
|
|
||||||
ICE LIBOR 2016-09-06 3M = 0.0063525
|
|
||||||
ICE LIBOR 2016-09-07 3M = 0.0063526
|
|
||||||
ICE LIBOR 2016-09-08 3M = 0.0063527
|
|
||||||
ICE LIBOR 2016-09-09 3M = 0.0063528
|
|
||||||
ICE LIBOR 2016-09-10 3M = 0.0063529
|
|
||||||
ICE LIBOR 2016-12-06 3M = 0.0063530
|
|
||||||
ICE LIBOR 2016-12-07 3M = 0.0063531
|
|
||||||
ICE LIBOR 2016-12-08 3M = 0.0063532
|
|
||||||
ICE LIBOR 2016-12-09 3M = 0.0063533
|
|
||||||
ICE LIBOR 2016-12-10 3M = 0.0063534
|
|
||||||
ICE LIBOR 2017-03-06 3M = 0.0063535
|
|
||||||
ICE LIBOR 2017-03-07 3M = 0.0063536
|
|
||||||
ICE LIBOR 2017-03-08 3M = 0.0063537
|
|
||||||
ICE LIBOR 2017-03-09 3M = 0.0063538
|
|
||||||
ICE LIBOR 2017-03-10 3M = 0.0063539
|
|
||||||
ICE LIBOR 2017-06-06 3M = 0.0063540
|
|
||||||
ICE LIBOR 2017-06-07 3M = 0.0063541
|
|
||||||
ICE LIBOR 2017-06-08 3M = 0.0063542
|
|
||||||
ICE LIBOR 2017-06-09 3M = 0.0063543
|
|
||||||
ICE LIBOR 2017-06-10 3M = 0.0063544
|
|
||||||
ICE LIBOR 2017-09-06 3M = 0.0063545
|
|
||||||
ICE LIBOR 2017-09-07 3M = 0.0063546
|
|
||||||
ICE LIBOR 2017-09-08 3M = 0.0063547
|
|
||||||
ICE LIBOR 2017-09-09 3M = 0.0063548
|
|
||||||
ICE LIBOR 2017-09-10 3M = 0.0063549
|
|
||||||
ICE LIBOR 2017-12-06 3M = 0.0063550
|
|
||||||
ICE LIBOR 2017-12-07 3M = 0.0063551
|
|
||||||
ICE LIBOR 2017-12-08 3M = 0.0063552
|
|
||||||
ICE LIBOR 2017-12-09 3M = 0.0063553
|
|
||||||
ICE LIBOR 2017-12-10 3M = 0.0063554
|
|
||||||
ICE LIBOR 2018-03-06 3M = 0.0063555
|
|
||||||
ICE LIBOR 2018-03-07 3M = 0.0063556
|
|
||||||
ICE LIBOR 2018-03-08 3M = 0.0063557
|
|
||||||
ICE LIBOR 2018-03-09 3M = 0.0063558
|
|
||||||
ICE LIBOR 2018-03-10 3M = 0.0063559
|
|
||||||
ICE LIBOR 2018-06-06 3M = 0.0063560
|
|
||||||
ICE LIBOR 2018-06-07 3M = 0.0063561
|
|
||||||
ICE LIBOR 2018-06-08 3M = 0.0063562
|
|
||||||
ICE LIBOR 2018-06-09 3M = 0.0063563
|
|
||||||
ICE LIBOR 2018-06-10 3M = 0.0063564
|
|
||||||
ICE LIBOR 2018-09-06 3M = 0.0063565
|
|
||||||
ICE LIBOR 2018-09-07 3M = 0.0063566
|
|
||||||
ICE LIBOR 2018-09-08 3M = 0.0063567
|
|
||||||
ICE LIBOR 2018-09-09 3M = 0.0063568
|
|
||||||
ICE LIBOR 2018-09-10 3M = 0.0063569
|
|
||||||
ICE LIBOR 2018-12-06 3M = 0.0063570
|
|
||||||
ICE LIBOR 2018-12-07 3M = 0.0063571
|
|
||||||
ICE LIBOR 2018-12-08 3M = 0.0063572
|
|
||||||
ICE LIBOR 2018-12-09 3M = 0.0063573
|
|
||||||
ICE LIBOR 2018-12-10 3M = 0.0063574
|
|
||||||
ICE LIBOR 2019-03-06 3M = 0.0063575
|
|
||||||
ICE LIBOR 2019-03-07 3M = 0.0063576
|
|
||||||
ICE LIBOR 2019-03-08 3M = 0.0063577
|
|
||||||
ICE LIBOR 2019-03-09 3M = 0.0063578
|
|
||||||
ICE LIBOR 2019-03-10 3M = 0.0063579
|
|
||||||
ICE LIBOR 2019-06-06 3M = 0.0063580
|
|
||||||
ICE LIBOR 2019-06-07 3M = 0.0063581
|
|
||||||
ICE LIBOR 2019-06-08 3M = 0.0063582
|
|
||||||
ICE LIBOR 2019-06-09 3M = 0.0063583
|
|
||||||
ICE LIBOR 2019-06-10 3M = 0.0063584
|
|
||||||
ICE LIBOR 2019-09-06 3M = 0.0063585
|
|
||||||
ICE LIBOR 2019-09-07 3M = 0.0063586
|
|
||||||
ICE LIBOR 2019-09-08 3M = 0.0063587
|
|
||||||
ICE LIBOR 2019-09-09 3M = 0.0063588
|
|
||||||
ICE LIBOR 2019-09-10 3M = 0.0063589
|
|
||||||
ICE LIBOR 2019-12-06 3M = 0.0063590
|
|
||||||
ICE LIBOR 2019-12-07 3M = 0.0063591
|
|
||||||
ICE LIBOR 2019-12-08 3M = 0.0063592
|
|
||||||
ICE LIBOR 2019-12-09 3M = 0.0063593
|
|
||||||
ICE LIBOR 2019-12-10 3M = 0.0063594
|
|
||||||
ICE LIBOR 2020-03-06 3M = 0.0063595
|
|
||||||
ICE LIBOR 2020-03-07 3M = 0.0063596
|
|
||||||
ICE LIBOR 2020-03-08 3M = 0.0063597
|
|
||||||
ICE LIBOR 2020-03-09 3M = 0.0063598
|
|
||||||
ICE LIBOR 2020-03-10 3M = 0.0063599
|
|
||||||
ICE LIBOR 2020-06-06 3M = 0.0063600
|
|
||||||
ICE LIBOR 2020-06-07 3M = 0.0063601
|
|
||||||
ICE LIBOR 2020-06-08 3M = 0.0063602
|
|
||||||
ICE LIBOR 2020-06-09 3M = 0.0063603
|
|
||||||
ICE LIBOR 2020-06-10 3M = 0.0063604
|
|
||||||
ICE LIBOR 2020-09-06 3M = 0.0063605
|
|
||||||
ICE LIBOR 2020-09-07 3M = 0.0063606
|
|
||||||
ICE LIBOR 2020-09-08 3M = 0.0063607
|
|
||||||
ICE LIBOR 2020-09-09 3M = 0.0063608
|
|
||||||
ICE LIBOR 2020-09-10 3M = 0.0063609
|
|
||||||
ICE LIBOR 2020-12-06 3M = 0.0063610
|
|
||||||
ICE LIBOR 2020-12-07 3M = 0.0063611
|
|
||||||
ICE LIBOR 2020-12-08 3M = 0.0063612
|
|
||||||
ICE LIBOR 2020-12-09 3M = 0.0063613
|
|
||||||
ICE LIBOR 2020-12-10 3M = 0.0063614
|
|
||||||
ICE LIBOR 2021-03-06 3M = 0.0063615
|
|
||||||
ICE LIBOR 2021-03-07 3M = 0.0063616
|
|
||||||
ICE LIBOR 2021-03-08 3M = 0.0063617
|
|
||||||
ICE LIBOR 2021-03-09 3M = 0.0063618
|
|
||||||
ICE LIBOR 2021-03-10 3M = 0.0063619
|
|
||||||
ICE LIBOR 2021-06-06 3M = 0.0063620
|
|
||||||
ICE LIBOR 2021-06-07 3M = 0.0063621
|
|
||||||
ICE LIBOR 2021-06-08 3M = 0.0063622
|
|
||||||
ICE LIBOR 2021-06-09 3M = 0.0063623
|
|
||||||
ICE LIBOR 2021-06-10 3M = 0.0063624
|
|
||||||
ICE LIBOR 2021-09-06 3M = 0.0063625
|
|
||||||
ICE LIBOR 2021-09-07 3M = 0.0063626
|
|
||||||
ICE LIBOR 2021-09-08 3M = 0.0063627
|
|
||||||
ICE LIBOR 2021-09-09 3M = 0.0063628
|
|
||||||
ICE LIBOR 2021-09-10 3M = 0.0063629
|
|
||||||
ICE LIBOR 2021-12-06 3M = 0.0063630
|
|
||||||
ICE LIBOR 2021-12-07 3M = 0.0063631
|
|
||||||
ICE LIBOR 2021-12-08 3M = 0.0063632
|
|
||||||
ICE LIBOR 2021-12-09 3M = 0.0063633
|
|
||||||
ICE LIBOR 2021-12-10 3M = 0.0063634
|
|
||||||
ICE LIBOR 2022-03-06 3M = 0.0063635
|
|
||||||
ICE LIBOR 2022-03-07 3M = 0.0063636
|
|
||||||
ICE LIBOR 2022-03-08 3M = 0.0063637
|
|
||||||
ICE LIBOR 2022-03-09 3M = 0.0063638
|
|
||||||
ICE LIBOR 2022-03-10 3M = 0.0063639
|
|
||||||
ICE LIBOR 2022-06-06 3M = 0.0063640
|
|
||||||
ICE LIBOR 2022-06-07 3M = 0.0063641
|
|
||||||
ICE LIBOR 2022-06-08 3M = 0.0063642
|
|
||||||
ICE LIBOR 2022-06-09 3M = 0.0063643
|
|
||||||
ICE LIBOR 2022-06-10 3M = 0.0063644
|
|
||||||
ICE LIBOR 2022-09-06 3M = 0.0063645
|
|
||||||
ICE LIBOR 2022-09-07 3M = 0.0063646
|
|
||||||
ICE LIBOR 2022-09-08 3M = 0.0063647
|
|
||||||
ICE LIBOR 2022-09-09 3M = 0.0063648
|
|
||||||
ICE LIBOR 2022-09-10 3M = 0.0063649
|
|
||||||
ICE LIBOR 2022-12-06 3M = 0.0063650
|
|
||||||
ICE LIBOR 2022-12-07 3M = 0.0063651
|
|
||||||
ICE LIBOR 2022-12-08 3M = 0.0063652
|
|
||||||
ICE LIBOR 2022-12-09 3M = 0.0063653
|
|
||||||
ICE LIBOR 2022-12-10 3M = 0.0063654
|
|
||||||
ICE LIBOR 2023-03-06 3M = 0.0063655
|
|
||||||
ICE LIBOR 2023-03-07 3M = 0.0063656
|
|
||||||
ICE LIBOR 2023-03-08 3M = 0.0063657
|
|
||||||
ICE LIBOR 2023-03-09 3M = 0.0063658
|
|
||||||
ICE LIBOR 2023-03-10 3M = 0.0063659
|
|
||||||
ICE LIBOR 2023-06-06 3M = 0.0063660
|
|
||||||
ICE LIBOR 2023-06-07 3M = 0.0063661
|
|
||||||
ICE LIBOR 2023-06-08 3M = 0.0063662
|
|
||||||
ICE LIBOR 2023-06-09 3M = 0.0063663
|
|
||||||
ICE LIBOR 2023-06-10 3M = 0.0063664
|
|
||||||
ICE LIBOR 2023-09-06 3M = 0.0063665
|
|
||||||
ICE LIBOR 2023-09-07 3M = 0.0063666
|
|
||||||
ICE LIBOR 2023-09-08 3M = 0.0063667
|
|
||||||
ICE LIBOR 2023-09-09 3M = 0.0063668
|
|
||||||
ICE LIBOR 2023-09-10 3M = 0.0063669
|
|
||||||
ICE LIBOR 2023-12-06 3M = 0.0063670
|
|
||||||
ICE LIBOR 2023-12-07 3M = 0.0063671
|
|
||||||
ICE LIBOR 2023-12-08 3M = 0.0063672
|
|
||||||
ICE LIBOR 2023-12-09 3M = 0.0063673
|
|
||||||
ICE LIBOR 2023-12-10 3M = 0.0063674
|
|
||||||
ICE LIBOR 2024-03-06 3M = 0.0063675
|
|
||||||
ICE LIBOR 2024-03-07 3M = 0.0063676
|
|
||||||
ICE LIBOR 2024-03-08 3M = 0.0063677
|
|
||||||
ICE LIBOR 2024-03-09 3M = 0.0063678
|
|
||||||
ICE LIBOR 2024-03-10 3M = 0.0063679
|
|
||||||
ICE LIBOR 2024-06-06 3M = 0.0063680
|
|
||||||
ICE LIBOR 2024-06-07 3M = 0.0063681
|
|
||||||
ICE LIBOR 2024-06-08 3M = 0.0063682
|
|
||||||
ICE LIBOR 2024-06-09 3M = 0.0063683
|
|
||||||
ICE LIBOR 2024-06-10 3M = 0.0063684
|
|
||||||
ICE LIBOR 2024-09-06 3M = 0.0063685
|
|
||||||
ICE LIBOR 2024-09-07 3M = 0.0063686
|
|
||||||
ICE LIBOR 2024-09-08 3M = 0.0063687
|
|
||||||
ICE LIBOR 2024-09-09 3M = 0.0063688
|
|
||||||
ICE LIBOR 2024-09-10 3M = 0.0063689
|
|
||||||
ICE LIBOR 2024-12-06 3M = 0.0063690
|
|
||||||
ICE LIBOR 2024-12-07 3M = 0.0063691
|
|
||||||
ICE LIBOR 2024-12-08 3M = 0.0063692
|
|
||||||
ICE LIBOR 2024-12-09 3M = 0.0063693
|
|
||||||
ICE LIBOR 2024-12-10 3M = 0.0063694
|
|
||||||
ICE LIBOR 2025-03-06 3M = 0.0063695
|
|
||||||
ICE LIBOR 2025-03-07 3M = 0.0063696
|
|
||||||
ICE LIBOR 2025-03-08 3M = 0.0063697
|
|
||||||
ICE LIBOR 2025-03-09 3M = 0.0063698
|
|
||||||
ICE LIBOR 2025-03-10 3M = 0.0063699
|
|
||||||
ICE LIBOR 2025-06-06 3M = 0.0063700
|
|
||||||
ICE LIBOR 2025-06-07 3M = 0.0063701
|
|
||||||
ICE LIBOR 2025-06-08 3M = 0.0063702
|
|
||||||
ICE LIBOR 2025-06-09 3M = 0.0063703
|
|
||||||
ICE LIBOR 2025-06-10 3M = 0.0063704
|
|
||||||
ICE LIBOR 2025-09-06 3M = 0.0063705
|
|
||||||
ICE LIBOR 2025-09-07 3M = 0.0063706
|
|
||||||
ICE LIBOR 2025-09-08 3M = 0.0063707
|
|
||||||
ICE LIBOR 2025-09-09 3M = 0.0063708
|
|
||||||
ICE LIBOR 2025-09-10 3M = 0.0063709
|
|
||||||
ICE LIBOR 2025-12-06 3M = 0.0063710
|
|
||||||
ICE LIBOR 2025-12-07 3M = 0.0063711
|
|
||||||
ICE LIBOR 2025-12-08 3M = 0.0063712
|
|
||||||
ICE LIBOR 2025-12-09 3M = 0.0063713
|
|
||||||
ICE LIBOR 2025-12-10 3M = 0.0063714
|
|
||||||
ICE LIBOR 2026-03-06 3M = 0.0063715
|
|
||||||
ICE LIBOR 2026-03-07 3M = 0.0063716
|
|
||||||
ICE LIBOR 2026-03-08 3M = 0.0063717
|
|
||||||
ICE LIBOR 2026-03-09 3M = 0.0063718
|
|
||||||
ICE LIBOR 2026-03-10 3M = 0.0063719
|
|
||||||
ICE LIBOR 2026-06-06 3M = 0.0063720
|
|
||||||
ICE LIBOR 2026-06-07 3M = 0.0063721
|
|
||||||
ICE LIBOR 2026-06-08 3M = 0.0063722
|
|
||||||
ICE LIBOR 2026-06-09 3M = 0.0063723
|
|
||||||
ICE LIBOR 2026-06-10 3M = 0.0063724
|
|
||||||
ICE LIBOR 2026-09-06 3M = 0.0063725
|
|
||||||
ICE LIBOR 2026-09-07 3M = 0.0063726
|
|
||||||
ICE LIBOR 2026-09-08 3M = 0.0063727
|
|
||||||
ICE LIBOR 2026-09-09 3M = 0.0063728
|
|
||||||
ICE LIBOR 2026-09-10 3M = 0.0063729
|
|
||||||
ICE LIBOR 2026-12-06 3M = 0.0063730
|
|
||||||
ICE LIBOR 2026-12-07 3M = 0.0063731
|
|
||||||
ICE LIBOR 2026-12-08 3M = 0.0063732
|
|
||||||
ICE LIBOR 2026-12-09 3M = 0.0063733
|
|
||||||
ICE LIBOR 2026-12-10 3M = 0.0063734
|
|
@ -2,7 +2,7 @@ package net.corda.irs.testing
|
|||||||
|
|
||||||
import net.corda.core.getOrThrow
|
import net.corda.core.getOrThrow
|
||||||
import net.corda.core.utilities.LogHelper
|
import net.corda.core.utilities.LogHelper
|
||||||
import net.corda.simulation.IRSSimulation
|
import net.corda.irs.simulation.IRSSimulation
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|
||||||
class IRSSimulationTest {
|
class IRSSimulationTest {
|
||||||
|
@ -15,13 +15,13 @@ import net.corda.core.messaging.SingleMessageRecipient
|
|||||||
import net.corda.core.serialization.deserialize
|
import net.corda.core.serialization.deserialize
|
||||||
import net.corda.core.then
|
import net.corda.core.then
|
||||||
import net.corda.core.utilities.ProgressTracker
|
import net.corda.core.utilities.ProgressTracker
|
||||||
|
import net.corda.irs.simulation.IRSSimulation
|
||||||
|
import net.corda.irs.simulation.Simulation
|
||||||
import net.corda.netmap.VisualiserViewModel.Style
|
import net.corda.netmap.VisualiserViewModel.Style
|
||||||
import net.corda.node.services.network.NetworkMapService
|
import net.corda.node.services.network.NetworkMapService
|
||||||
import net.corda.node.services.statemachine.SessionConfirm
|
import net.corda.node.services.statemachine.SessionConfirm
|
||||||
import net.corda.node.services.statemachine.SessionEnd
|
import net.corda.node.services.statemachine.SessionEnd
|
||||||
import net.corda.node.services.statemachine.SessionInit
|
import net.corda.node.services.statemachine.SessionInit
|
||||||
import net.corda.simulation.IRSSimulation
|
|
||||||
import net.corda.simulation.Simulation
|
|
||||||
import net.corda.testing.node.InMemoryMessagingNetwork
|
import net.corda.testing.node.InMemoryMessagingNetwork
|
||||||
import net.corda.testing.node.MockNetwork
|
import net.corda.testing.node.MockNetwork
|
||||||
import rx.Scheduler
|
import rx.Scheduler
|
||||||
@ -81,8 +81,7 @@ class NetworkMapVisualiser : Application() {
|
|||||||
|
|
||||||
val simulation = viewModel.simulation
|
val simulation = viewModel.simulation
|
||||||
// Update the white-backgrounded label indicating what flow step it's up to.
|
// Update the white-backgrounded label indicating what flow step it's up to.
|
||||||
simulation.allFlowSteps.observeOn(uiThread).subscribe { step: Pair<Simulation.SimulatedNode, ProgressTracker.Change> ->
|
simulation.allFlowSteps.observeOn(uiThread).subscribe { (node, change) ->
|
||||||
val (node, change) = step
|
|
||||||
val label = viewModel.nodesToWidgets[node]!!.statusLabel
|
val label = viewModel.nodesToWidgets[node]!!.statusLabel
|
||||||
if (change is ProgressTracker.Change.Position) {
|
if (change is ProgressTracker.Change.Position) {
|
||||||
// Fade in the status label if it's our first step.
|
// Fade in the status label if it's our first step.
|
||||||
@ -219,9 +218,7 @@ class NetworkMapVisualiser : Application() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun bindSidebar() {
|
private fun bindSidebar() {
|
||||||
viewModel.simulation.allFlowSteps.observeOn(uiThread).subscribe { step: Pair<Simulation.SimulatedNode, ProgressTracker.Change> ->
|
viewModel.simulation.allFlowSteps.observeOn(uiThread).subscribe { (node, change) ->
|
||||||
val (node, change) = step
|
|
||||||
|
|
||||||
if (change is ProgressTracker.Change.Position) {
|
if (change is ProgressTracker.Change.Position) {
|
||||||
val tracker = change.tracker.topLevelTracker
|
val tracker = change.tracker.topLevelTracker
|
||||||
if (change.newStep == ProgressTracker.DONE) {
|
if (change.newStep == ProgressTracker.DONE) {
|
||||||
@ -237,7 +234,7 @@ class NetworkMapVisualiser : Application() {
|
|||||||
} else if (!viewModel.trackerBoxes.containsKey(tracker)) {
|
} else if (!viewModel.trackerBoxes.containsKey(tracker)) {
|
||||||
// New flow started up; add.
|
// New flow started up; add.
|
||||||
val extraLabel = viewModel.simulation.extraNodeLabels[node]
|
val extraLabel = viewModel.simulation.extraNodeLabels[node]
|
||||||
val label = if (extraLabel != null) "${node.info.legalIdentity.name.toString()}: $extraLabel" else node.info.legalIdentity.name.toString()
|
val label = if (extraLabel != null) "${node.info.legalIdentity.name}: $extraLabel" else node.info.legalIdentity.name.toString()
|
||||||
val widget = view.buildProgressTrackerWidget(label, tracker.topLevelTracker)
|
val widget = view.buildProgressTrackerWidget(label, tracker.topLevelTracker)
|
||||||
println("Added: $tracker, $widget")
|
println("Added: $tracker, $widget")
|
||||||
viewModel.trackerBoxes[tracker] = widget
|
viewModel.trackerBoxes[tracker] = widget
|
||||||
@ -264,7 +261,7 @@ class NetworkMapVisualiser : Application() {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
timeline.setOnFinished {
|
timeline.setOnFinished {
|
||||||
println("Removed: ${tracker}")
|
println("Removed: $tracker")
|
||||||
val vbox = viewModel.trackerBoxes.remove(tracker)?.vbox
|
val vbox = viewModel.trackerBoxes.remove(tracker)?.vbox
|
||||||
view.sidebar.children.remove(vbox)
|
view.sidebar.children.remove(vbox)
|
||||||
}
|
}
|
||||||
@ -296,7 +293,7 @@ class NetworkMapVisualiser : Application() {
|
|||||||
val tracker: ProgressTracker = step.tracker.topLevelTracker
|
val tracker: ProgressTracker = step.tracker.topLevelTracker
|
||||||
val widget = viewModel.trackerBoxes[tracker] ?: return@runLater
|
val widget = viewModel.trackerBoxes[tracker] ?: return@runLater
|
||||||
val new = view.buildProgressTrackerWidget(widget.label.text, tracker)
|
val new = view.buildProgressTrackerWidget(widget.label.text, tracker)
|
||||||
val prevWidget = viewModel.trackerBoxes[tracker]?.vbox ?: throw AssertionError("No previous widget for tracker: ${tracker}")
|
val prevWidget = viewModel.trackerBoxes[tracker]?.vbox ?: throw AssertionError("No previous widget for tracker: $tracker")
|
||||||
val i = (prevWidget.parent as VBox).children.indexOf(viewModel.trackerBoxes[tracker]?.vbox)
|
val i = (prevWidget.parent as VBox).children.indexOf(viewModel.trackerBoxes[tracker]?.vbox)
|
||||||
(prevWidget.parent as VBox).children[i] = new.vbox
|
(prevWidget.parent as VBox).children[i] = new.vbox
|
||||||
viewModel.trackerBoxes[tracker] = new
|
viewModel.trackerBoxes[tracker] = new
|
||||||
|
@ -8,7 +8,7 @@ import javafx.scene.shape.Circle
|
|||||||
import javafx.scene.shape.Line
|
import javafx.scene.shape.Line
|
||||||
import javafx.util.Duration
|
import javafx.util.Duration
|
||||||
import net.corda.core.utilities.ProgressTracker
|
import net.corda.core.utilities.ProgressTracker
|
||||||
import net.corda.simulation.IRSSimulation
|
import net.corda.irs.simulation.IRSSimulation
|
||||||
import net.corda.testing.node.MockNetwork
|
import net.corda.testing.node.MockNetwork
|
||||||
import org.bouncycastle.asn1.x500.X500Name
|
import org.bouncycastle.asn1.x500.X500Name
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
Reference in New Issue
Block a user