diff --git a/core/src/main/kotlin/net/corda/core/contracts/Structures.kt b/core/src/main/kotlin/net/corda/core/contracts/Structures.kt index d18e33ec80..b609101b8a 100644 --- a/core/src/main/kotlin/net/corda/core/contracts/Structures.kt +++ b/core/src/main/kotlin/net/corda/core/contracts/Structures.kt @@ -284,14 +284,13 @@ abstract class TypeOnlyCommandData : CommandData { /** Command data/content plus pubkey pair: the signature is stored at the end of the serialized bytes */ @CordaSerializable -// DOCSTART 9 -data class Command(val value: CommandData, val signers: List) { -// DOCEND 9 +data class Command(val value: T, val signers: List) { + // TODO Introduce NonEmptyList? init { require(signers.isNotEmpty()) } - constructor(data: CommandData, key: PublicKey) : this(data, listOf(key)) + constructor(data: T, key: PublicKey) : this(data, listOf(key)) private fun commandDataToString() = value.toString().let { if (it.contains("@")) it.replace('$', '.').split("@")[0] else it } override fun toString() = "${commandDataToString()} with pubkeys ${signers.joinToString()}" diff --git a/core/src/main/kotlin/net/corda/core/flows/ContractUpgradeFlow.kt b/core/src/main/kotlin/net/corda/core/flows/ContractUpgradeFlow.kt index 81b9657ff3..38b24bd5b1 100644 --- a/core/src/main/kotlin/net/corda/core/flows/ContractUpgradeFlow.kt +++ b/core/src/main/kotlin/net/corda/core/flows/ContractUpgradeFlow.kt @@ -24,12 +24,15 @@ class ContractUpgradeFlow().single()) } @JvmStatic - fun verify(input: ContractState, output: ContractState, commandData: Command) { - val command = commandData.value as UpgradeCommand + fun verify(input: ContractState, output: ContractState, commandData: Command) { + val command = commandData.value val participantKeys: Set = input.participants.map { it.owningKey }.toSet() val keysThatSigned: Set = commandData.signers.toSet() @Suppress("UNCHECKED_CAST") diff --git a/core/src/main/kotlin/net/corda/core/serialization/Kryo.kt b/core/src/main/kotlin/net/corda/core/serialization/Kryo.kt index e98ef6161a..0c2d7dbe22 100644 --- a/core/src/main/kotlin/net/corda/core/serialization/Kryo.kt +++ b/core/src/main/kotlin/net/corda/core/serialization/Kryo.kt @@ -265,7 +265,7 @@ object WireTransactionSerializer : Serializer() { // Otherwise we just assume the code we need is on the classpath already. kryo.useClassLoader(attachmentsClassLoader(kryo, attachmentHashes) ?: javaClass.classLoader) { val outputs = kryo.readClassAndObject(input) as List> - val commands = kryo.readClassAndObject(input) as List + val commands = kryo.readClassAndObject(input) as List> val notary = kryo.readClassAndObject(input) as Party? val signers = kryo.readClassAndObject(input) as List val transactionType = kryo.readClassAndObject(input) as TransactionType diff --git a/core/src/main/kotlin/net/corda/core/transactions/LedgerTransaction.kt b/core/src/main/kotlin/net/corda/core/transactions/LedgerTransaction.kt index 7745e7162c..2d2225a8ad 100644 --- a/core/src/main/kotlin/net/corda/core/transactions/LedgerTransaction.kt +++ b/core/src/main/kotlin/net/corda/core/transactions/LedgerTransaction.kt @@ -247,7 +247,8 @@ class LedgerTransaction( * @param index the position of the item in the commands. * @return The Command at the requested index */ - fun getCommand(index: Int): Command = Command(commands[index].value, commands[index].signers) + @Suppress("UNCHECKED_CAST") + fun getCommand(index: Int): Command = Command(commands[index].value as T, commands[index].signers) /** * Helper to simplify getting all [Command] items with a [CommandData] of a particular class, interface, or base class. @@ -255,11 +256,11 @@ class LedgerTransaction( * [clazz] must be an extension of [CommandData]. * @return the possibly empty list of commands with [CommandData] values matching the clazz restriction. */ - fun commandsOfType(clazz: Class): List { + fun commandsOfType(clazz: Class): List> { return commands.mapNotNull { (signers, _, value) -> clazz.castIfPossible(value)?.let { Command(it, signers) } } } - inline fun commandsOfType(): List = commandsOfType(T::class.java) + inline fun commandsOfType(): List> = commandsOfType(T::class.java) /** * Helper to simplify filtering [Command] items according to a [Predicate]. @@ -269,12 +270,11 @@ class LedgerTransaction( * The class filtering is applied before the predicate. * @return the possibly empty list of [Command] items with [CommandData] values matching the predicate and clazz restrictions. */ - fun filterCommands(clazz: Class, predicate: Predicate): List { - @Suppress("UNCHECKED_CAST") - return commandsOfType(clazz).filter { predicate.test(it.value as T) } + fun filterCommands(clazz: Class, predicate: Predicate): List> { + return commandsOfType(clazz).filter { predicate.test(it.value) } } - inline fun filterCommands(crossinline predicate: (T) -> Boolean): List { + inline fun filterCommands(crossinline predicate: (T) -> Boolean): List> { return filterCommands(T::class.java, Predicate { predicate(it) }) } @@ -287,12 +287,11 @@ class LedgerTransaction( * @return the [Command] item with [CommandData] values matching the predicate and clazz restrictions. * @throws IllegalArgumentException if no items, or multiple items matched the requirements. */ - fun findCommand(clazz: Class, predicate: Predicate): Command { - @Suppress("UNCHECKED_CAST") - return commandsOfType(clazz).single { predicate.test(it.value as T) } + fun findCommand(clazz: Class, predicate: Predicate): Command { + return commandsOfType(clazz).single { predicate.test(it.value) } } - inline fun findCommand(crossinline predicate: (T) -> Boolean): Command { + inline fun findCommand(crossinline predicate: (T) -> Boolean): Command { return findCommand(T::class.java, Predicate { predicate(it) }) } diff --git a/core/src/main/kotlin/net/corda/core/transactions/MerkleTransaction.kt b/core/src/main/kotlin/net/corda/core/transactions/MerkleTransaction.kt index 29f1c3d38b..bdef4417ba 100644 --- a/core/src/main/kotlin/net/corda/core/transactions/MerkleTransaction.kt +++ b/core/src/main/kotlin/net/corda/core/transactions/MerkleTransaction.kt @@ -29,7 +29,7 @@ interface TraversableTransaction { val inputs: List val attachments: List val outputs: List> - val commands: List + val commands: List> val notary: Party? val mustSign: List val type: TransactionType? @@ -77,7 +77,7 @@ class FilteredLeaves( override val inputs: List, override val attachments: List, override val outputs: List>, - override val commands: List, + override val commands: List>, override val notary: Party?, override val mustSign: List, override val type: TransactionType?, diff --git a/core/src/main/kotlin/net/corda/core/transactions/TransactionBuilder.kt b/core/src/main/kotlin/net/corda/core/transactions/TransactionBuilder.kt index bfeaa9a81d..a802c61cd0 100644 --- a/core/src/main/kotlin/net/corda/core/transactions/TransactionBuilder.kt +++ b/core/src/main/kotlin/net/corda/core/transactions/TransactionBuilder.kt @@ -37,7 +37,7 @@ open class TransactionBuilder( protected val inputs: MutableList = arrayListOf(), protected val attachments: MutableList = arrayListOf(), protected val outputs: MutableList> = arrayListOf(), - protected val commands: MutableList = arrayListOf(), + protected val commands: MutableList> = arrayListOf(), protected val signers: MutableSet = mutableSetOf(), protected var window: TimeWindow? = null) { constructor(type: TransactionType, notary: Party) : this(type, notary, (Strand.currentStrand() as? FlowStateMachine<*>)?.id?.uuid ?: UUID.randomUUID()) @@ -65,7 +65,7 @@ open class TransactionBuilder( is SecureHash -> addAttachment(t) is TransactionState<*> -> addOutputState(t) is ContractState -> addOutputState(t) - is Command -> addCommand(t) + is Command<*> -> addCommand(t) is CommandData -> throw IllegalArgumentException("You passed an instance of CommandData, but that lacks the pubkey. You need to wrap it in a Command object first.") is TimeWindow -> setTimeWindow(t) else -> throw IllegalArgumentException("Wrong argument type: ${t.javaClass}") @@ -105,7 +105,9 @@ open class TransactionBuilder( } @JvmOverloads - fun addOutputState(state: ContractState, notary: Party, encumbrance: Int? = null) = addOutputState(TransactionState(state, notary, encumbrance)) + fun addOutputState(state: ContractState, notary: Party, encumbrance: Int? = null): TransactionBuilder { + return addOutputState(TransactionState(state, notary, encumbrance)) + } /** A default notary must be specified during builder construction to use this method */ fun addOutputState(state: ContractState): TransactionBuilder { @@ -114,7 +116,7 @@ open class TransactionBuilder( return this } - fun addCommand(arg: Command): TransactionBuilder { + fun addCommand(arg: Command<*>): TransactionBuilder { // TODO: replace pubkeys in commands with 'pointers' to keys in signers signers.addAll(arg.signers) commands.add(arg) @@ -149,7 +151,7 @@ open class TransactionBuilder( fun inputStates(): List = ArrayList(inputs) fun attachments(): List = ArrayList(attachments) fun outputStates(): List> = ArrayList(outputs) - fun commands(): List = ArrayList(commands) + fun commands(): List> = ArrayList(commands) /** The signatures that have been collected so far - might be incomplete! */ @Deprecated("Signatures should be gathered on a SignedTransaction instead.") diff --git a/core/src/main/kotlin/net/corda/core/transactions/WireTransaction.kt b/core/src/main/kotlin/net/corda/core/transactions/WireTransaction.kt index 7d7177f011..836bab6b6e 100644 --- a/core/src/main/kotlin/net/corda/core/transactions/WireTransaction.kt +++ b/core/src/main/kotlin/net/corda/core/transactions/WireTransaction.kt @@ -24,7 +24,7 @@ class WireTransaction( override val attachments: List, outputs: List>, /** Ordered list of ([CommandData], [PublicKey]) pairs that instruct the contracts what to do. */ - override val commands: List, + override val commands: List>, notary: Party?, signers: List, type: TransactionType, @@ -125,7 +125,7 @@ class WireTransaction( val buf = StringBuilder() buf.appendln("Transaction:") for (input in inputs) buf.appendln("${Emoji.rightArrow}INPUT: $input") - for (output in outputs) buf.appendln("${Emoji.leftArrow}OUTPUT: ${output.data}") + for ((data) in outputs) buf.appendln("${Emoji.leftArrow}OUTPUT: $data") for (command in commands) buf.appendln("${Emoji.diamond}COMMAND: $command") for (attachment in attachments) buf.appendln("${Emoji.paperclip}ATTACHMENT: $attachment") return buf.toString() diff --git a/core/src/test/kotlin/net/corda/core/contracts/LedgerTransactionQueryTests.kt b/core/src/test/kotlin/net/corda/core/contracts/LedgerTransactionQueryTests.kt index 752b0c9c02..0c1540d089 100644 --- a/core/src/test/kotlin/net/corda/core/contracts/LedgerTransactionQueryTests.kt +++ b/core/src/test/kotlin/net/corda/core/contracts/LedgerTransactionQueryTests.kt @@ -112,10 +112,10 @@ class LedgerTransactionQueryTests : TestDependencyInjectionBase() { @Test fun `Simple Command Indexer tests`() { val ltx = makeDummyTransaction() - assertEquals(0, (ltx.getCommand(0).value as Commands.Cmd1).id) - assertEquals(0, (ltx.getCommand(1).value as Commands.Cmd2).id) - assertEquals(3, (ltx.getCommand(6).value as Commands.Cmd1).id) - assertEquals(3, (ltx.getCommand(7).value as Commands.Cmd2).id) + assertEquals(0, ltx.getCommand(0).value.id) + assertEquals(0, ltx.getCommand(1).value.id) + assertEquals(3, ltx.getCommand(6).value.id) + assertEquals(3, ltx.getCommand(7).value.id) assertFailsWith { ltx.getOutput(10) } } @@ -178,10 +178,10 @@ class LedgerTransactionQueryTests : TestDependencyInjectionBase() { val ltx = makeDummyTransaction() val intCmd1 = ltx.commandsOfType(Commands.Cmd1::class.java) assertEquals(5, intCmd1.size) - assertEquals(listOf(0, 1, 2, 3, 4), intCmd1.map { (it.value as Commands.Cmd1).id }) + assertEquals(listOf(0, 1, 2, 3, 4), intCmd1.map { it.value.id }) val intCmd2 = ltx.commandsOfType() assertEquals(5, intCmd2.size) - assertEquals(listOf(0, 1, 2, 3, 4), intCmd2.map { (it.value as Commands.Cmd2).id }) + assertEquals(listOf(0, 1, 2, 3, 4), intCmd2.map { it.value.id }) val notPresentQuery = ltx.commandsOfType(FungibleAsset.Commands.Exit::class.java) assertEquals(emptyList(), notPresentQuery) } @@ -237,9 +237,9 @@ class LedgerTransactionQueryTests : TestDependencyInjectionBase() { val ltx = makeDummyTransaction() val intCmds1 = ltx.filterCommands(Commands.Cmd1::class.java, Predicate { it.id.rem(2) == 0 }) assertEquals(3, intCmds1.size) - assertEquals(listOf(0, 2, 4), intCmds1.map { (it.value as Commands.Cmd1).id }) + assertEquals(listOf(0, 2, 4), intCmds1.map { it.value.id }) val intCmds2 = ltx.filterCommands { it.id == 3 } - assertEquals(3, (intCmds2.single().value as Commands.Cmd2).id) + assertEquals(3, intCmds2.single().value.id) } @Test diff --git a/core/src/test/kotlin/net/corda/core/crypto/PartialMerkleTreeTest.kt b/core/src/test/kotlin/net/corda/core/crypto/PartialMerkleTreeTest.kt index 482ba7ca3a..a7a1b18265 100644 --- a/core/src/test/kotlin/net/corda/core/crypto/PartialMerkleTreeTest.kt +++ b/core/src/test/kotlin/net/corda/core/crypto/PartialMerkleTreeTest.kt @@ -102,7 +102,7 @@ class PartialMerkleTreeTest : TestDependencyInjectionBase() { return when (elem) { is StateRef -> true is TransactionState<*> -> elem.data.participants[0].owningKey.keys == MINI_CORP_PUBKEY.keys - is Command -> MEGA_CORP_PUBKEY in elem.signers + is Command<*> -> MEGA_CORP_PUBKEY in elem.signers is TimeWindow -> true is PublicKey -> elem == MEGA_CORP_PUBKEY else -> false diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst index 6faaf0b64f..84eb64d112 100644 --- a/docs/source/changelog.rst +++ b/docs/source/changelog.rst @@ -43,7 +43,9 @@ UNRELEASED ``LedgerTransaction`` as passed in parameter. The prinicpal consequence of this is that the types of the input and output collections on the transaction object have changed, so it may be necessary to ``map`` down to the ``ContractState`` sub-properties in existing code. - It is intended that new helper methods will be added shortly to the API to reduce the impact of these changes. + +* Added various query methods to ``LedgerTransaction`` to simplify querying of states and commands. In the same vain + ``Command`` is now parameterised on the ``CommandData`` field. Milestone 13 ------------ diff --git a/docs/source/example-code/src/main/java/net/corda/docs/FlowCookbookJava.java b/docs/source/example-code/src/main/java/net/corda/docs/FlowCookbookJava.java index 4b5b2b7e41..ef4f13dc2c 100644 --- a/docs/source/example-code/src/main/java/net/corda/docs/FlowCookbookJava.java +++ b/docs/source/example-code/src/main/java/net/corda/docs/FlowCookbookJava.java @@ -263,11 +263,11 @@ public class FlowCookbookJava { // public keys. To be valid, the transaction requires a signature // matching every public key in all of the transaction's commands. // DOCSTART 24 - CommandData commandData = new DummyContract.Commands.Create(); + DummyContract.Commands.Create commandData = new DummyContract.Commands.Create(); PublicKey ourPubKey = getServiceHub().getLegalIdentityKey(); PublicKey counterpartyPubKey = counterparty.getOwningKey(); List requiredSigners = ImmutableList.of(ourPubKey, counterpartyPubKey); - Command ourCommand = new Command(commandData, requiredSigners); + Command ourCommand = new Command<>(commandData, requiredSigners); // DOCEND 24 // ``CommandData`` can either be: diff --git a/docs/source/example-code/src/main/kotlin/net/corda/docs/FlowCookbook.kt b/docs/source/example-code/src/main/kotlin/net/corda/docs/FlowCookbook.kt index 46550b3c15..570881cb2d 100644 --- a/docs/source/example-code/src/main/kotlin/net/corda/docs/FlowCookbook.kt +++ b/docs/source/example-code/src/main/kotlin/net/corda/docs/FlowCookbook.kt @@ -12,7 +12,10 @@ import net.corda.core.node.services.ServiceType import net.corda.core.node.services.Vault.Page import net.corda.core.node.services.queryBy import net.corda.core.node.services.vault.QueryCriteria.VaultQueryCriteria -import net.corda.core.transactions.* +import net.corda.core.transactions.LedgerTransaction +import net.corda.core.transactions.SignedTransaction +import net.corda.core.transactions.TransactionBuilder +import net.corda.core.transactions.WireTransaction import net.corda.core.utilities.ProgressTracker import net.corda.core.utilities.ProgressTracker.Step import net.corda.core.utilities.UntrustworthyData @@ -243,11 +246,11 @@ object FlowCookbook { // public keys. To be valid, the transaction requires a signature // matching every public key in all of the transaction's commands. // DOCSTART 24 - val commandData: CommandData = DummyContract.Commands.Create() + val commandData: DummyContract.Commands.Create = DummyContract.Commands.Create() val ourPubKey: PublicKey = serviceHub.legalIdentityKey val counterpartyPubKey: PublicKey = counterparty.owningKey val requiredSigners: List = listOf(ourPubKey, counterpartyPubKey) - val ourCommand: Command = Command(commandData, requiredSigners) + val ourCommand: Command = Command(commandData, requiredSigners) // DOCEND 24 // ``CommandData`` can either be: diff --git a/finance/isolated/src/main/kotlin/net/corda/contracts/AnotherDummyContract.kt b/finance/isolated/src/main/kotlin/net/corda/contracts/AnotherDummyContract.kt index 9d5e4d8bdd..76cd7f9091 100644 --- a/finance/isolated/src/main/kotlin/net/corda/contracts/AnotherDummyContract.kt +++ b/finance/isolated/src/main/kotlin/net/corda/contracts/AnotherDummyContract.kt @@ -1,4 +1,4 @@ -package net.corda.contracts.isolated +package net.corda.contracts import net.corda.core.contracts.* import net.corda.core.crypto.SecureHash diff --git a/finance/src/test/kotlin/net/corda/contracts/testing/Generators.kt b/finance/src/test/kotlin/net/corda/contracts/testing/Generators.kt index de19f715ef..dcc1793ed5 100644 --- a/finance/src/test/kotlin/net/corda/contracts/testing/Generators.kt +++ b/finance/src/test/kotlin/net/corda/contracts/testing/Generators.kt @@ -56,8 +56,8 @@ class CommandDataGenerator : Generator(CommandData::class.java) { } } -class CommandGenerator : Generator(Command::class.java) { - override fun generate(random: SourceOfRandomness, status: GenerationStatus): Command { +class CommandGenerator : Generator>(Command::class.java) { + override fun generate(random: SourceOfRandomness, status: GenerationStatus): Command<*> { val signersGenerator = ArrayListGenerator() signersGenerator.addComponentGenerators(listOf(PublicKeyGenerator())) return Command(CommandDataGenerator().generate(random, status), PublicKeyGenerator().generate(random, status)) diff --git a/node/src/main/kotlin/net/corda/node/services/CoreFlowHandlers.kt b/node/src/main/kotlin/net/corda/node/services/CoreFlowHandlers.kt index ce50c1e021..84c8011334 100644 --- a/node/src/main/kotlin/net/corda/node/services/CoreFlowHandlers.kt +++ b/node/src/main/kotlin/net/corda/node/services/CoreFlowHandlers.kt @@ -1,10 +1,7 @@ package net.corda.node.services import co.paralleluniverse.fibers.Suspendable -import net.corda.core.contracts.ContractState -import net.corda.core.contracts.TransactionType -import net.corda.core.contracts.UpgradedContract -import net.corda.core.contracts.requireThat +import net.corda.core.contracts.* import net.corda.core.crypto.SecureHash import net.corda.core.flows.* import net.corda.core.identity.AnonymousPartyAndPath @@ -121,7 +118,10 @@ class ContractUpgradeHandler(otherSide: Party) : AbstractStateReplacementFlow.Ac "The proposed upgrade ${proposal.modification.javaClass} is a trusted upgrade path" using (proposal.modification == authorisedUpgrade) "The proposed tx matches the expected tx for this upgrade" using (proposedTx == expectedTx) } - ContractUpgradeFlow.verify(oldStateAndRef.state.data, expectedTx.outRef(0).state.data, expectedTx.commands.single()) + ContractUpgradeFlow.verify( + oldStateAndRef.state.data, + expectedTx.outRef(0).state.data, + expectedTx.toLedgerTransaction(serviceHub).commandsOfType().single()) } } diff --git a/samples/irs-demo/src/main/kotlin/net/corda/irs/api/NodeInterestRates.kt b/samples/irs-demo/src/main/kotlin/net/corda/irs/api/NodeInterestRates.kt index d75ab5f5c8..80dea68879 100644 --- a/samples/irs-demo/src/main/kotlin/net/corda/irs/api/NodeInterestRates.kt +++ b/samples/irs-demo/src/main/kotlin/net/corda/irs/api/NodeInterestRates.kt @@ -8,7 +8,6 @@ import net.corda.contracts.Tenor import net.corda.contracts.math.CubicSplineInterpolator import net.corda.contracts.math.Interpolator import net.corda.contracts.math.InterpolatorFactory -import net.corda.core.internal.ThreadBox import net.corda.core.contracts.Command import net.corda.core.crypto.DigitalSignature import net.corda.core.crypto.MerkleTreeException @@ -18,6 +17,7 @@ import net.corda.core.flows.FlowLogic import net.corda.core.flows.InitiatedBy import net.corda.core.flows.StartableByRPC import net.corda.core.identity.Party +import net.corda.core.internal.ThreadBox import net.corda.core.node.PluginServiceHub import net.corda.core.node.ServiceHub import net.corda.core.node.services.CordaService @@ -151,7 +151,7 @@ object NodeInterestRates { throw MerkleTreeException("Rate Fix Oracle: Couldn't verify partial Merkle tree.") } // Performing validation of obtained FilteredLeaves. - fun commandValidator(elem: Command): Boolean { + fun commandValidator(elem: Command<*>): Boolean { if (!(identity.owningKey in elem.signers && elem.value is Fix)) throw IllegalArgumentException("Oracle received unknown command (not in signers or not Fix).") val fix = elem.value as Fix @@ -163,7 +163,7 @@ object NodeInterestRates { fun check(elem: Any): Boolean { return when (elem) { - is Command -> commandValidator(elem) + is Command<*> -> commandValidator(elem) else -> throw IllegalArgumentException("Oracle received data of different type than expected.") } } diff --git a/samples/irs-demo/src/main/kotlin/net/corda/irs/flows/FixingFlow.kt b/samples/irs-demo/src/main/kotlin/net/corda/irs/flows/FixingFlow.kt index 1a0f55c814..e43e0ddc36 100644 --- a/samples/irs-demo/src/main/kotlin/net/corda/irs/flows/FixingFlow.kt +++ b/samples/irs-demo/src/main/kotlin/net/corda/irs/flows/FixingFlow.kt @@ -80,7 +80,7 @@ object FixingFlow { @Suspendable override fun filtering(elem: Any): Boolean { return when (elem) { - is Command -> oracleParty.owningKey in elem.signers && elem.value is Fix + is Command<*> -> oracleParty.owningKey in elem.signers && elem.value is Fix else -> false } } diff --git a/samples/irs-demo/src/test/kotlin/net/corda/irs/api/NodeInterestRatesTest.kt b/samples/irs-demo/src/test/kotlin/net/corda/irs/api/NodeInterestRatesTest.kt index ac2ee52fc1..79d5d36e30 100644 --- a/samples/irs-demo/src/test/kotlin/net/corda/irs/api/NodeInterestRatesTest.kt +++ b/samples/irs-demo/src/test/kotlin/net/corda/irs/api/NodeInterestRatesTest.kt @@ -51,12 +51,12 @@ class NodeInterestRatesTest : TestDependencyInjectionBase() { fun fixCmdFilter(elem: Any): Boolean { return when (elem) { - is Command -> oracle.identity.owningKey in elem.signers && elem.value is Fix + is Command<*> -> oracle.identity.owningKey in elem.signers && elem.value is Fix else -> false } } - fun filterCmds(elem: Any): Boolean = elem is Command + fun filterCmds(elem: Any): Boolean = elem is Command<*> @Before fun setUp() { @@ -179,7 +179,7 @@ class NodeInterestRatesTest : TestDependencyInjectionBase() { val fix = oracle.query(listOf(NodeInterestRates.parseFixOf("LIBOR 2016-03-16 1M"))).first() fun filtering(elem: Any): Boolean { return when (elem) { - is Command -> oracle.identity.owningKey in elem.signers && elem.value is Fix + is Command<*> -> oracle.identity.owningKey in elem.signers && elem.value is Fix is TransactionState -> true else -> false } @@ -234,7 +234,7 @@ class NodeInterestRatesTest : TestDependencyInjectionBase() { : RatesFixFlow(tx, oracle, fixOf, expectedRate, rateTolerance, progressTracker) { override fun filtering(elem: Any): Boolean { return when (elem) { - is Command -> oracle.owningKey in elem.signers && elem.value is Fix + is Command<*> -> oracle.owningKey in elem.signers && elem.value is Fix else -> false } } diff --git a/verifier/src/integration-test/kotlin/net/corda/verifier/GeneratedLedger.kt b/verifier/src/integration-test/kotlin/net/corda/verifier/GeneratedLedger.kt index 3c0ccd7460..eb24c1994b 100644 --- a/verifier/src/integration-test/kotlin/net/corda/verifier/GeneratedLedger.kt +++ b/verifier/src/integration-test/kotlin/net/corda/verifier/GeneratedLedger.kt @@ -2,7 +2,6 @@ package net.corda.verifier import net.corda.client.mock.* import net.corda.core.contracts.* -import net.corda.testing.contracts.DummyContract import net.corda.core.crypto.SecureHash import net.corda.core.crypto.X509Utilities import net.corda.core.crypto.entropyToKeyPair @@ -12,6 +11,7 @@ import net.corda.core.identity.AnonymousParty import net.corda.core.identity.Party import net.corda.core.transactions.LedgerTransaction import net.corda.core.transactions.WireTransaction +import net.corda.testing.contracts.DummyContract import java.io.ByteArrayInputStream import java.math.BigInteger import java.security.PublicKey @@ -49,7 +49,7 @@ data class GeneratedLedger( Generator.replicatePoisson(1.0, pickOneOrMaybeNew(attachments, attachmentGenerator)) } - val commandsGenerator: Generator>> by lazy { + val commandsGenerator: Generator, Party>>> by lazy { Generator.replicatePoisson(4.0, commandGenerator(identities)) } @@ -214,7 +214,7 @@ val stateGenerator: Generator = GeneratedState(nonce, participants.map { AnonymousParty(it) }) } -fun commandGenerator(partiesToPickFrom: Collection): Generator> { +fun commandGenerator(partiesToPickFrom: Collection): Generator, Party>> { return pickOneOrMaybeNew(partiesToPickFrom, partyGenerator).combine(Generator.long()) { signer, nonce -> Pair( Command(GeneratedCommandData(nonce), signer.owningKey),