diff --git a/constants.properties b/constants.properties index 7ee707fd23..cb32304d74 100644 --- a/constants.properties +++ b/constants.properties @@ -1,6 +1,6 @@ gradlePluginsVersion=3.0.0 kotlinVersion=1.1.60 -platformVersion=2 +platformVersion=1 guavaVersion=21.0 bouncycastleVersion=1.57 typesafeConfigVersion=1.3.1 diff --git a/finance/src/main/kotlin/net/corda/finance/contracts/asset/cash/selection/CashSelectionSQLServerImpl.kt b/finance/src/main/kotlin/net/corda/finance/contracts/asset/cash/selection/CashSelectionSQLServerImpl.kt index c0f6591e2f..4f89016fca 100644 --- a/finance/src/main/kotlin/net/corda/finance/contracts/asset/cash/selection/CashSelectionSQLServerImpl.kt +++ b/finance/src/main/kotlin/net/corda/finance/contracts/asset/cash/selection/CashSelectionSQLServerImpl.kt @@ -28,7 +28,7 @@ class CashSelectionSQLServerImpl : AbstractCashSelection() { override fun toString() = "${this::class.java} for $JDBC_DRIVER_NAME" override fun executeQuery(connection: Connection, amount: Amount, lockId: UUID, notary: Party?, - onlyFromIssuerParties: Set, withIssuerRefs: Set) : ResultSet { + onlyFromIssuerParties: Set, withIssuerRefs: Set, withResultSet: (ResultSet) -> Boolean): Boolean { val selectJoin = """ WITH row(transaction_id, output_index, pennies, total, lock_id) AS @@ -51,19 +51,22 @@ class CashSelectionSQLServerImpl : AbstractCashSelection() { FROM row where row.total <= ? + row.pennies""" // Use prepared statement for protection against SQL Injection - val psSelectJoin = connection.prepareStatement(selectJoin) - var pIndex = 0 - psSelectJoin.setString(++pIndex, amount.token.currencyCode) - psSelectJoin.setString(++pIndex, lockId.toString()) - if (notary != null) - psSelectJoin.setString(++pIndex, notary.name.toString()) - if (onlyFromIssuerParties.isNotEmpty()) - psSelectJoin.setObject(++pIndex, onlyFromIssuerParties.map { it.owningKey.toBase58String() as Any}.toTypedArray() ) - if (withIssuerRefs.isNotEmpty()) - psSelectJoin.setObject(++pIndex, withIssuerRefs.map { it.bytes as Any }.toTypedArray()) - psSelectJoin.setLong(++pIndex, amount.quantity) - log.debug(selectJoin) + connection.prepareStatement(selectJoin).use { statement -> + var pIndex = 0 + statement.setString(++pIndex, amount.token.currencyCode) + statement.setString(++pIndex, lockId.toString()) + if (notary != null) + statement.setString(++pIndex, notary.name.toString()) + if (onlyFromIssuerParties.isNotEmpty()) + statement.setObject(++pIndex, onlyFromIssuerParties.map { it.owningKey.toBase58String() as Any }.toTypedArray()) + if (withIssuerRefs.isNotEmpty()) + statement.setObject(++pIndex, withIssuerRefs.map { it.bytes as Any }.toTypedArray()) + statement.setLong(++pIndex, amount.quantity) + log.debug(selectJoin) - return psSelectJoin.executeQuery() + statement.executeQuery().use { rs -> + return withResultSet(rs) + } + } } } \ No newline at end of file diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/persistence/CordaPersistence.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/persistence/CordaPersistence.kt index 30c2817fad..cce28ec508 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/persistence/CordaPersistence.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/persistence/CordaPersistence.kt @@ -20,7 +20,8 @@ const val NODE_DATABASE_PREFIX = "node_" data class DatabaseConfig( val initialiseSchema: Boolean = true, val serverNameTablePrefix: String = "", - val transactionIsolationLevel: TransactionIsolationLevel = TransactionIsolationLevel.REPEATABLE_READ + val transactionIsolationLevel: TransactionIsolationLevel = TransactionIsolationLevel.REPEATABLE_READ, + val schema: String? = null ) // This class forms part of the node config and so any changes to it must be handled with care diff --git a/perftestcordapp/src/test/kotlin/com/r3/corda/enterprise/perftestcordapp/contracts/CommercialPaperTests.kt b/perftestcordapp/src/test/kotlin/com/r3/corda/enterprise/perftestcordapp/contracts/CommercialPaperTests.kt index e337b1c56b..e94ec7e72f 100644 --- a/perftestcordapp/src/test/kotlin/com/r3/corda/enterprise/perftestcordapp/contracts/CommercialPaperTests.kt +++ b/perftestcordapp/src/test/kotlin/com/r3/corda/enterprise/perftestcordapp/contracts/CommercialPaperTests.kt @@ -89,8 +89,8 @@ class CommercialPaperTestsGeneric { // Some CP is issued onto the ledger by MegaCorp. transaction("Issuance") { attachments(CP_PROGRAM_ID, CommercialPaper.CP_PROGRAM_ID) - output(thisTest.getContract(), "paper") { thisTest.getPaper() } - command(MEGA_CORP_PUBKEY) { thisTest.getIssueCommand(DUMMY_NOTARY) } + output(thisTest.getContract(), "paper", thisTest.getPaper()) + command(MEGA_CORP_PUBKEY, thisTest.getIssueCommand(DUMMY_NOTARY)) timeWindow(TEST_TX_TIME) this.verifies() } @@ -101,10 +101,10 @@ class CommercialPaperTestsGeneric { attachments(Cash.PROGRAM_ID, CommercialPaper.CP_PROGRAM_ID) input("paper") input("alice's $900") - output(Cash.PROGRAM_ID, "borrowed $900") { 900.DOLLARS.CASH issuedBy issuer ownedBy MEGA_CORP } - output(thisTest.getContract(), "alice's paper") { "paper".output().withOwner(ALICE) } - command(ALICE_PUBKEY) { Cash.Commands.Move() } - command(MEGA_CORP_PUBKEY) { thisTest.getMoveCommand() } + output(Cash.PROGRAM_ID, "borrowed $900", 900.DOLLARS.CASH issuedBy issuer ownedBy MEGA_CORP) + output(thisTest.getContract(), "alice's paper", "paper".output().withOwner(ALICE)) + command(ALICE_PUBKEY, Cash.Commands.Move()) + command(MEGA_CORP_PUBKEY, thisTest.getMoveCommand()) this.verifies() } @@ -116,12 +116,12 @@ class CommercialPaperTestsGeneric { input("some profits") fun TransactionDSL.outputs(aliceGetsBack: Amount>) { - output(Cash.PROGRAM_ID, "Alice's profit") { aliceGetsBack.STATE ownedBy ALICE } - output(Cash.PROGRAM_ID, "Change") { (someProfits - aliceGetsBack).STATE ownedBy MEGA_CORP } + output(Cash.PROGRAM_ID, "Alice's profit", aliceGetsBack.STATE ownedBy ALICE) + output(Cash.PROGRAM_ID, "Change", (someProfits - aliceGetsBack).STATE ownedBy MEGA_CORP) } - command(MEGA_CORP_PUBKEY) { Cash.Commands.Move() } - command(ALICE_PUBKEY) { thisTest.getRedeemCommand(DUMMY_NOTARY) } + command(MEGA_CORP_PUBKEY, Cash.Commands.Move()) + command(ALICE_PUBKEY, thisTest.getRedeemCommand(DUMMY_NOTARY)) tweak { outputs(700.DOLLARS `issued by` issuer) @@ -138,7 +138,7 @@ class CommercialPaperTestsGeneric { timeWindow(TEST_TX_TIME + 8.days) tweak { - output(thisTest.getContract()) { "paper".output() } + output(thisTest.getContract(), "paper".output()) this `fails with` "must be destroyed" } @@ -152,8 +152,8 @@ class CommercialPaperTestsGeneric { transaction { attachment(CP_PROGRAM_ID) attachment(CP_PROGRAM_ID) - output(thisTest.getContract()) { thisTest.getPaper() } - command(MINI_CORP_PUBKEY) { thisTest.getIssueCommand(DUMMY_NOTARY) } + output(thisTest.getContract(), thisTest.getPaper()) + command(MINI_CORP_PUBKEY, thisTest.getIssueCommand(DUMMY_NOTARY)) timeWindow(TEST_TX_TIME) this `fails with` "output states are issued by a command signer" } @@ -164,8 +164,8 @@ class CommercialPaperTestsGeneric { transaction { attachment(CP_PROGRAM_ID) attachment(CP_PROGRAM_ID) - output(thisTest.getContract()) { thisTest.getPaper().withFaceValue(0.DOLLARS `issued by` issuer) } - command(MEGA_CORP_PUBKEY) { thisTest.getIssueCommand(DUMMY_NOTARY) } + output(thisTest.getContract(), thisTest.getPaper().withFaceValue(0.DOLLARS `issued by` issuer)) + command(MEGA_CORP_PUBKEY, thisTest.getIssueCommand(DUMMY_NOTARY)) timeWindow(TEST_TX_TIME) this `fails with` "output values sum to more than the inputs" } @@ -176,8 +176,8 @@ class CommercialPaperTestsGeneric { transaction { attachment(CP_PROGRAM_ID) attachment(CP_PROGRAM_ID) - output(thisTest.getContract()) { thisTest.getPaper().withMaturityDate(TEST_TX_TIME - 10.days) } - command(MEGA_CORP_PUBKEY) { thisTest.getIssueCommand(DUMMY_NOTARY) } + output(thisTest.getContract(), thisTest.getPaper().withMaturityDate(TEST_TX_TIME - 10.days)) + command(MEGA_CORP_PUBKEY, thisTest.getIssueCommand(DUMMY_NOTARY)) timeWindow(TEST_TX_TIME) this `fails with` "maturity date is not in the past" } @@ -189,8 +189,8 @@ class CommercialPaperTestsGeneric { attachment(CP_PROGRAM_ID) attachment(CP_PROGRAM_ID) input(thisTest.getContract(), thisTest.getPaper()) - output(thisTest.getContract()) { thisTest.getPaper() } - command(MEGA_CORP_PUBKEY) { thisTest.getIssueCommand(DUMMY_NOTARY) } + output(thisTest.getContract(), thisTest.getPaper()) + command(MEGA_CORP_PUBKEY, thisTest.getIssueCommand(DUMMY_NOTARY)) timeWindow(TEST_TX_TIME) this `fails with` "output values sum to more than the inputs" } diff --git a/perftestcordapp/src/test/kotlin/com/r3/corda/enterprise/perftestcordapp/contracts/asset/CashTests.kt b/perftestcordapp/src/test/kotlin/com/r3/corda/enterprise/perftestcordapp/contracts/asset/CashTests.kt index 241560ae4d..bdef97ea64 100644 --- a/perftestcordapp/src/test/kotlin/com/r3/corda/enterprise/perftestcordapp/contracts/asset/CashTests.kt +++ b/perftestcordapp/src/test/kotlin/com/r3/corda/enterprise/perftestcordapp/contracts/asset/CashTests.kt @@ -22,10 +22,10 @@ import net.corda.core.transactions.TransactionBuilder import net.corda.core.transactions.WireTransaction import net.corda.core.utilities.OpaqueBytes import net.corda.node.services.vault.NodeVaultService -import net.corda.node.utilities.CordaPersistence +import net.corda.nodeapi.internal.persistence.CordaPersistence import net.corda.testing.* import net.corda.testing.contracts.DummyState -import net.corda.testing.contracts.calculateRandomlySizedAmounts +import net.corda.testing.contracts.VaultFiller.Companion.calculateRandomlySizedAmounts import net.corda.testing.node.MockServices import net.corda.testing.node.MockServices.Companion.makeTestDatabaseAndMockServices import org.junit.After @@ -133,34 +133,34 @@ class CashTests { fun trivial() = withTestSerialization { transaction { attachment(Cash.PROGRAM_ID) - input(Cash.PROGRAM_ID) { inState } + input(Cash.PROGRAM_ID, inState) tweak { - output(Cash.PROGRAM_ID) { outState.copy(amount = 2000.DOLLARS `issued by` defaultIssuer) } - command(ALICE_PUBKEY) { Cash.Commands.Move() } + output(Cash.PROGRAM_ID, outState.copy(amount = 2000.DOLLARS `issued by` defaultIssuer)) + command(ALICE_PUBKEY, Cash.Commands.Move()) this `fails with` "the amounts balance" } tweak { - output(Cash.PROGRAM_ID) { outState } - command(ALICE_PUBKEY) { DummyCommandData } + output(Cash.PROGRAM_ID, outState) + command(ALICE_PUBKEY, DummyCommandData) // Invalid command this `fails with` "required com.r3.corda.enterprise.perftestcordapp.contracts.asset.Cash.Commands.Move command" } tweak { - output(Cash.PROGRAM_ID) { outState } - command(BOB_PUBKEY) { Cash.Commands.Move() } + output(Cash.PROGRAM_ID, outState) + command(BOB_PUBKEY, Cash.Commands.Move()) this `fails with` "the owning keys are a subset of the signing keys" } tweak { - output(Cash.PROGRAM_ID) { outState } - output(Cash.PROGRAM_ID) { outState issuedBy MINI_CORP } - command(ALICE_PUBKEY) { Cash.Commands.Move() } + output(Cash.PROGRAM_ID, outState) + output(Cash.PROGRAM_ID, outState issuedBy MINI_CORP) + command(ALICE_PUBKEY, Cash.Commands.Move()) this `fails with` "at least one cash input" } // Simple reallocation works. tweak { - output(Cash.PROGRAM_ID) { outState } - command(ALICE_PUBKEY) { Cash.Commands.Move() } + output(Cash.PROGRAM_ID, outState) + command(ALICE_PUBKEY, Cash.Commands.Move()) this.verifies() } } @@ -172,9 +172,9 @@ class CashTests { // Check we can't "move" money into existence. transaction { attachment(Cash.PROGRAM_ID) - input(Cash.PROGRAM_ID) { DummyState() } - output(Cash.PROGRAM_ID) { outState } - command(MINI_CORP_PUBKEY) { Cash.Commands.Move() } + input(Cash.PROGRAM_ID, DummyState()) + output(Cash.PROGRAM_ID, outState) + command(MINI_CORP_PUBKEY, Cash.Commands.Move()) this `fails with` "there is at least one cash input for this group" } @@ -187,19 +187,19 @@ class CashTests { // institution is allowed to issue as much cash as they want. transaction { attachment(Cash.PROGRAM_ID) - output(Cash.PROGRAM_ID) { outState } - command(ALICE_PUBKEY) { Cash.Commands.Issue() } + output(Cash.PROGRAM_ID, outState) + command(ALICE_PUBKEY, Cash.Commands.Issue()) this `fails with` "output states are issued by a command signer" } transaction { attachment(Cash.PROGRAM_ID) - output(Cash.PROGRAM_ID) { + output(Cash.PROGRAM_ID, Cash.State( amount = 1000.DOLLARS `issued by` MINI_CORP.ref(12, 34), owner = AnonymousParty(ALICE_PUBKEY) ) - } - command(MINI_CORP_PUBKEY) { Cash.Commands.Issue() } + ) + command(MINI_CORP_PUBKEY, Cash.Commands.Issue()) this.verifies() } Unit @@ -236,18 +236,18 @@ class CashTests { // We can consume $1000 in a transaction and output $2000 as long as it's signed by an issuer. transaction { attachment(Cash.PROGRAM_ID) - input(Cash.PROGRAM_ID) { issuerInState } - output(Cash.PROGRAM_ID) { inState.copy(amount = inState.amount * 2) } + input(Cash.PROGRAM_ID, issuerInState) + output(Cash.PROGRAM_ID, inState.copy(amount = inState.amount * 2)) // Move fails: not allowed to summon money. tweak { - command(ALICE_PUBKEY) { Cash.Commands.Move() } + command(ALICE_PUBKEY, Cash.Commands.Move()) this `fails with` "the amounts balance" } // Issue works. tweak { - command(MEGA_CORP_PUBKEY) { Cash.Commands.Issue() } + command(MEGA_CORP_PUBKEY, Cash.Commands.Issue()) this.verifies() } } @@ -255,29 +255,29 @@ class CashTests { // Can't use an issue command to lower the amount. transaction { attachment(Cash.PROGRAM_ID) - input(Cash.PROGRAM_ID) { inState } - output(Cash.PROGRAM_ID) { inState.copy(amount = inState.amount.splitEvenly(2).first()) } - command(MEGA_CORP_PUBKEY) { Cash.Commands.Issue() } + input(Cash.PROGRAM_ID, inState) + output(Cash.PROGRAM_ID, inState.copy(amount = inState.amount.splitEvenly(2).first())) + command(MEGA_CORP_PUBKEY, Cash.Commands.Issue()) this `fails with` "output values sum to more than the inputs" } // Can't have an issue command that doesn't actually issue money. transaction { attachment(Cash.PROGRAM_ID) - input(Cash.PROGRAM_ID) { inState } - output(Cash.PROGRAM_ID) { inState } - command(MEGA_CORP_PUBKEY) { Cash.Commands.Issue() } + input(Cash.PROGRAM_ID, inState) + output(Cash.PROGRAM_ID, inState) + command(MEGA_CORP_PUBKEY, Cash.Commands.Issue()) this `fails with` "output values sum to more than the inputs" } // Can't have any other commands if we have an issue command (because the issue command overrules them) transaction { attachment(Cash.PROGRAM_ID) - input(Cash.PROGRAM_ID) { inState } - output(Cash.PROGRAM_ID) { inState.copy(amount = inState.amount * 2) } - command(MEGA_CORP_PUBKEY) { Cash.Commands.Issue() } + input(Cash.PROGRAM_ID, inState) + output(Cash.PROGRAM_ID, inState.copy(amount = inState.amount * 2)) + command(MEGA_CORP_PUBKEY, Cash.Commands.Issue()) tweak { - command(MEGA_CORP_PUBKEY) { Cash.Commands.Issue() } + command(MEGA_CORP_PUBKEY, Cash.Commands.Issue()) this `fails with` "there is only a single issue command" } this.verifies() @@ -309,26 +309,26 @@ class CashTests { // Splitting value works. transaction { attachment(Cash.PROGRAM_ID) - command(ALICE_PUBKEY) { Cash.Commands.Move() } + command(ALICE_PUBKEY, Cash.Commands.Move()) tweak { - input(Cash.PROGRAM_ID) { inState } + input(Cash.PROGRAM_ID, inState) val splits4 = inState.amount.splitEvenly(4) - for (i in 0..3) output(Cash.PROGRAM_ID) { inState.copy(amount = splits4[i]) } + for (i in 0..3) output(Cash.PROGRAM_ID, inState.copy(amount = splits4[i])) this.verifies() } // Merging 4 inputs into 2 outputs works. tweak { val splits2 = inState.amount.splitEvenly(2) val splits4 = inState.amount.splitEvenly(4) - for (i in 0..3) input(Cash.PROGRAM_ID) { inState.copy(amount = splits4[i]) } - for (i in 0..1) output(Cash.PROGRAM_ID) { inState.copy(amount = splits2[i]) } + for (i in 0..3) input(Cash.PROGRAM_ID, inState.copy(amount = splits4[i])) + for (i in 0..1) output(Cash.PROGRAM_ID, inState.copy(amount = splits2[i])) this.verifies() } // Merging 2 inputs into 1 works. tweak { val splits2 = inState.amount.splitEvenly(2) - for (i in 0..1) input(Cash.PROGRAM_ID) { inState.copy(amount = splits2[i]) } - output(Cash.PROGRAM_ID) { inState } + for (i in 0..1) input(Cash.PROGRAM_ID, inState.copy(amount = splits2[i])) + output(Cash.PROGRAM_ID, inState) this.verifies() } } @@ -339,17 +339,17 @@ class CashTests { fun zeroSizedValues() = withTestSerialization { transaction { attachment(Cash.PROGRAM_ID) - input(Cash.PROGRAM_ID) { inState } - input(Cash.PROGRAM_ID) { inState.copy(amount = 0.DOLLARS `issued by` defaultIssuer) } - command(ALICE_PUBKEY) { Cash.Commands.Move() } + input(Cash.PROGRAM_ID, inState) + input(Cash.PROGRAM_ID, inState.copy(amount = 0.DOLLARS `issued by` defaultIssuer)) + command(ALICE_PUBKEY, Cash.Commands.Move()) this `fails with` "zero sized inputs" } transaction { attachment(Cash.PROGRAM_ID) - input(Cash.PROGRAM_ID) { inState } - output(Cash.PROGRAM_ID) { inState } - output(Cash.PROGRAM_ID) { inState.copy(amount = 0.DOLLARS `issued by` defaultIssuer) } - command(ALICE_PUBKEY) { Cash.Commands.Move() } + input(Cash.PROGRAM_ID, inState) + output(Cash.PROGRAM_ID, inState) + output(Cash.PROGRAM_ID, inState.copy(amount = 0.DOLLARS `issued by` defaultIssuer)) + command(ALICE_PUBKEY, Cash.Commands.Move()) this `fails with` "zero sized outputs" } Unit @@ -360,58 +360,58 @@ class CashTests { // Can't change issuer. transaction { attachment(Cash.PROGRAM_ID) - input(Cash.PROGRAM_ID) { inState } - output(Cash.PROGRAM_ID) { outState issuedBy MINI_CORP } - command(ALICE_PUBKEY) { Cash.Commands.Move() } + input(Cash.PROGRAM_ID, inState) + output(Cash.PROGRAM_ID, outState issuedBy MINI_CORP) + command(ALICE_PUBKEY, Cash.Commands.Move()) this `fails with` "the amounts balance" } // Can't change deposit reference when splitting. transaction { attachment(Cash.PROGRAM_ID) val splits2 = inState.amount.splitEvenly(2) - input(Cash.PROGRAM_ID) { inState } - for (i in 0..1) output(Cash.PROGRAM_ID) { outState.copy(amount = splits2[i]).editDepositRef(i.toByte()) } - command(ALICE_PUBKEY) { Cash.Commands.Move() } + input(Cash.PROGRAM_ID, inState) + for (i in 0..1) output(Cash.PROGRAM_ID, outState.copy(amount = splits2[i]).editDepositRef(i.toByte())) + command(ALICE_PUBKEY, Cash.Commands.Move()) this `fails with` "the amounts balance" } // Can't mix currencies. transaction { attachment(Cash.PROGRAM_ID) - input(Cash.PROGRAM_ID) { inState } - output(Cash.PROGRAM_ID) { outState.copy(amount = 800.DOLLARS `issued by` defaultIssuer) } - output(Cash.PROGRAM_ID) { outState.copy(amount = 200.POUNDS `issued by` defaultIssuer) } - command(ALICE_PUBKEY) { Cash.Commands.Move() } + input(Cash.PROGRAM_ID, inState) + output(Cash.PROGRAM_ID, outState.copy(amount = 800.DOLLARS `issued by` defaultIssuer)) + output(Cash.PROGRAM_ID, outState.copy(amount = 200.POUNDS `issued by` defaultIssuer)) + command(ALICE_PUBKEY, Cash.Commands.Move()) this `fails with` "the amounts balance" } transaction { attachment(Cash.PROGRAM_ID) - input(Cash.PROGRAM_ID) { inState } - input(Cash.PROGRAM_ID) { + input(Cash.PROGRAM_ID, inState) + input(Cash.PROGRAM_ID, inState.copy( amount = 150.POUNDS `issued by` defaultIssuer, owner = AnonymousParty(BOB_PUBKEY) ) - } - output(Cash.PROGRAM_ID) { outState.copy(amount = 1150.DOLLARS `issued by` defaultIssuer) } - command(ALICE_PUBKEY) { Cash.Commands.Move() } + ) + output(Cash.PROGRAM_ID, outState.copy(amount = 1150.DOLLARS `issued by` defaultIssuer)) + command(ALICE_PUBKEY, Cash.Commands.Move()) this `fails with` "the amounts balance" } // Can't have superfluous input states from different issuers. transaction { attachment(Cash.PROGRAM_ID) - input(Cash.PROGRAM_ID) { inState } - input(Cash.PROGRAM_ID) { inState issuedBy MINI_CORP } - output(Cash.PROGRAM_ID) { outState } - command(ALICE_PUBKEY) { Cash.Commands.Move() } + input(Cash.PROGRAM_ID, inState) + input(Cash.PROGRAM_ID, inState issuedBy MINI_CORP) + output(Cash.PROGRAM_ID, outState) + command(ALICE_PUBKEY, Cash.Commands.Move()) this `fails with` "the amounts balance" } // Can't combine two different deposits at the same issuer. transaction { attachment(Cash.PROGRAM_ID) - input(Cash.PROGRAM_ID) { inState } - input(Cash.PROGRAM_ID) { inState.editDepositRef(3) } - output(Cash.PROGRAM_ID) { outState.copy(amount = inState.amount * 2).editDepositRef(3) } - command(ALICE_PUBKEY) { Cash.Commands.Move() } + input(Cash.PROGRAM_ID, inState) + input(Cash.PROGRAM_ID, inState.editDepositRef(3)) + output(Cash.PROGRAM_ID, outState.copy(amount = inState.amount * 2).editDepositRef(3)) + command(ALICE_PUBKEY, Cash.Commands.Move()) this `fails with` "for reference [01]" } Unit @@ -422,21 +422,21 @@ class CashTests { // Single input/output straightforward case. transaction { attachment(Cash.PROGRAM_ID) - input(Cash.PROGRAM_ID) { issuerInState } - output(Cash.PROGRAM_ID) { issuerInState.copy(amount = issuerInState.amount - (200.DOLLARS `issued by` defaultIssuer)) } + input(Cash.PROGRAM_ID, issuerInState) + output(Cash.PROGRAM_ID, issuerInState.copy(amount = issuerInState.amount - (200.DOLLARS `issued by` defaultIssuer))) tweak { - command(MEGA_CORP_PUBKEY) { Cash.Commands.Exit(100.DOLLARS `issued by` defaultIssuer) } - command(MEGA_CORP_PUBKEY) { Cash.Commands.Move() } + command(MEGA_CORP_PUBKEY, Cash.Commands.Exit(100.DOLLARS `issued by` defaultIssuer)) + command(MEGA_CORP_PUBKEY, Cash.Commands.Move()) this `fails with` "the amounts balance" } tweak { - command(MEGA_CORP_PUBKEY) { Cash.Commands.Exit(200.DOLLARS `issued by` defaultIssuer) } + command(MEGA_CORP_PUBKEY, Cash.Commands.Exit(200.DOLLARS `issued by` defaultIssuer)) this `fails with` "required com.r3.corda.enterprise.perftestcordapp.contracts.asset.Cash.Commands.Move command" tweak { - command(MEGA_CORP_PUBKEY) { Cash.Commands.Move() } + command(MEGA_CORP_PUBKEY, Cash.Commands.Move()) this.verifies() } } @@ -449,20 +449,20 @@ class CashTests { // Multi-issuer case. transaction { attachment(Cash.PROGRAM_ID) - input(Cash.PROGRAM_ID) { issuerInState } - input(Cash.PROGRAM_ID) { issuerInState.copy(owner = MINI_CORP) issuedBy MINI_CORP } + input(Cash.PROGRAM_ID, issuerInState) + input(Cash.PROGRAM_ID, issuerInState.copy(owner = MINI_CORP) issuedBy MINI_CORP) - output(Cash.PROGRAM_ID) { issuerInState.copy(amount = issuerInState.amount - (200.DOLLARS `issued by` defaultIssuer)) issuedBy MINI_CORP } - output(Cash.PROGRAM_ID) { issuerInState.copy(owner = MINI_CORP, amount = issuerInState.amount - (200.DOLLARS `issued by` defaultIssuer)) } + output(Cash.PROGRAM_ID, issuerInState.copy(amount = issuerInState.amount - (200.DOLLARS `issued by` defaultIssuer)) issuedBy MINI_CORP) + output(Cash.PROGRAM_ID, issuerInState.copy(owner = MINI_CORP, amount = issuerInState.amount - (200.DOLLARS `issued by` defaultIssuer))) - command(MEGA_CORP_PUBKEY, MINI_CORP_PUBKEY) { Cash.Commands.Move() } + command(listOf(MEGA_CORP_PUBKEY, MINI_CORP_PUBKEY), Cash.Commands.Move()) this `fails with` "the amounts balance" - command(MEGA_CORP_PUBKEY) { Cash.Commands.Exit(200.DOLLARS `issued by` defaultIssuer) } + command(MEGA_CORP_PUBKEY, Cash.Commands.Exit(200.DOLLARS `issued by` defaultIssuer)) this `fails with` "the amounts balance" - command(MINI_CORP_PUBKEY) { Cash.Commands.Exit(200.DOLLARS `issued by` MINI_CORP.ref(defaultRef)) } + command(MINI_CORP_PUBKEY, Cash.Commands.Exit(200.DOLLARS `issued by` MINI_CORP.ref(defaultRef))) this.verifies() } Unit @@ -473,10 +473,10 @@ class CashTests { // Single input/output straightforward case. transaction { attachment(Cash.PROGRAM_ID) - input(Cash.PROGRAM_ID) { inState } - output(Cash.PROGRAM_ID) { outState.copy(amount = inState.amount - (200.DOLLARS `issued by` defaultIssuer)) } - command(MEGA_CORP_PUBKEY) { Cash.Commands.Exit(200.DOLLARS `issued by` defaultIssuer) } - command(ALICE_PUBKEY) { Cash.Commands.Move() } + input(Cash.PROGRAM_ID, inState) + output(Cash.PROGRAM_ID, outState.copy(amount = inState.amount - (200.DOLLARS `issued by` defaultIssuer))) + command(MEGA_CORP_PUBKEY, Cash.Commands.Exit(200.DOLLARS `issued by` defaultIssuer)) + command(ALICE_PUBKEY, Cash.Commands.Move()) this `fails with` "the amounts balance" } Unit @@ -487,25 +487,25 @@ class CashTests { transaction { attachment(Cash.PROGRAM_ID) // Gather 2000 dollars from two different issuers. - input(Cash.PROGRAM_ID) { inState } - input(Cash.PROGRAM_ID) { inState issuedBy MINI_CORP } - command(ALICE_PUBKEY) { Cash.Commands.Move() } + input(Cash.PROGRAM_ID, inState) + input(Cash.PROGRAM_ID, inState issuedBy MINI_CORP) + command(ALICE_PUBKEY, Cash.Commands.Move()) // Can't merge them together. tweak { - output(Cash.PROGRAM_ID) { inState.copy(owner = AnonymousParty(BOB_PUBKEY), amount = 2000.DOLLARS `issued by` defaultIssuer) } + output(Cash.PROGRAM_ID, inState.copy(owner = AnonymousParty(BOB_PUBKEY), amount = 2000.DOLLARS `issued by` defaultIssuer)) this `fails with` "the amounts balance" } // Missing MiniCorp deposit tweak { - output(Cash.PROGRAM_ID) { inState.copy(owner = AnonymousParty(BOB_PUBKEY)) } - output(Cash.PROGRAM_ID) { inState.copy(owner = AnonymousParty(BOB_PUBKEY)) } + output(Cash.PROGRAM_ID, inState.copy(owner = AnonymousParty(BOB_PUBKEY))) + output(Cash.PROGRAM_ID, inState.copy(owner = AnonymousParty(BOB_PUBKEY))) this `fails with` "the amounts balance" } // This works. - output(Cash.PROGRAM_ID) { inState.copy(owner = AnonymousParty(BOB_PUBKEY)) } - output(Cash.PROGRAM_ID) { inState.copy(owner = AnonymousParty(BOB_PUBKEY)) issuedBy MINI_CORP } + output(Cash.PROGRAM_ID, inState.copy(owner = AnonymousParty(BOB_PUBKEY))) + output(Cash.PROGRAM_ID, inState.copy(owner = AnonymousParty(BOB_PUBKEY)) issuedBy MINI_CORP) this.verifies() } Unit @@ -517,11 +517,11 @@ class CashTests { transaction { attachment(Cash.PROGRAM_ID) val pounds = Cash.State(658.POUNDS `issued by` MINI_CORP.ref(3, 4, 5), AnonymousParty(BOB_PUBKEY)) - input(Cash.PROGRAM_ID) { inState ownedBy AnonymousParty(ALICE_PUBKEY) } - input(Cash.PROGRAM_ID) { pounds } - output(Cash.PROGRAM_ID) { inState ownedBy AnonymousParty(BOB_PUBKEY) } - output(Cash.PROGRAM_ID) { pounds ownedBy AnonymousParty(ALICE_PUBKEY) } - command(ALICE_PUBKEY, BOB_PUBKEY) { Cash.Commands.Move() } + input(Cash.PROGRAM_ID, inState ownedBy AnonymousParty(ALICE_PUBKEY)) + input(Cash.PROGRAM_ID, pounds) + output(Cash.PROGRAM_ID, inState ownedBy AnonymousParty(BOB_PUBKEY)) + output(Cash.PROGRAM_ID, pounds ownedBy AnonymousParty(ALICE_PUBKEY)) + command(listOf(ALICE_PUBKEY, BOB_PUBKEY), Cash.Commands.Move()) this.verifies() } @@ -844,19 +844,19 @@ class CashTests { ledger(mockService) { unverifiedTransaction { attachment(Cash.PROGRAM_ID) - output(Cash.PROGRAM_ID, "MEGA_CORP cash") { + output(Cash.PROGRAM_ID, "MEGA_CORP cash", Cash.State( amount = 1000.DOLLARS `issued by` MEGA_CORP.ref(1, 1), owner = MEGA_CORP ) - } + ) } transaction { attachment(Cash.PROGRAM_ID) input("MEGA_CORP cash") output(Cash.PROGRAM_ID, "MEGA_CORP cash 2", "MEGA_CORP cash".output().copy(owner = AnonymousParty(ALICE_PUBKEY))) - command(MEGA_CORP_PUBKEY) { Cash.Commands.Move() } + command(MEGA_CORP_PUBKEY, Cash.Commands.Move()) this.verifies() } @@ -866,7 +866,7 @@ class CashTests { input("MEGA_CORP cash") // We send it to another pubkey so that the transaction is not identical to the previous one output(Cash.PROGRAM_ID, "MEGA_CORP cash 3", "MEGA_CORP cash".output().copy(owner = ALICE)) - command(MEGA_CORP_PUBKEY) { Cash.Commands.Move() } + command(MEGA_CORP_PUBKEY, Cash.Commands.Move()) this.verifies() } this.fails() diff --git a/perftestcordapp/src/test/kotlin/com/r3/corda/enterprise/perftestcordapp/flows/TwoPartyTradeFlowTest.kt b/perftestcordapp/src/test/kotlin/com/r3/corda/enterprise/perftestcordapp/flows/TwoPartyTradeFlowTest.kt index a144bd2f03..bc8b247fd2 100644 --- a/perftestcordapp/src/test/kotlin/com/r3/corda/enterprise/perftestcordapp/flows/TwoPartyTradeFlowTest.kt +++ b/perftestcordapp/src/test/kotlin/com/r3/corda/enterprise/perftestcordapp/flows/TwoPartyTradeFlowTest.kt @@ -41,7 +41,7 @@ import net.corda.node.services.api.Checkpoint import net.corda.node.services.api.CheckpointStorage import net.corda.node.services.api.WritableTransactionStorage import net.corda.node.services.persistence.DBTransactionStorage -import net.corda.node.utilities.CordaPersistence +import net.corda.nodeapi.internal.persistence.CordaPersistence import net.corda.testing.* import net.corda.testing.node.* import org.assertj.core.api.Assertions.assertThat @@ -536,7 +536,7 @@ class TwoPartyTradeFlowTests(private val anonymous: Boolean) { sellerNode: StartedNode, buyerNode: StartedNode, assetToSell: StateAndRef): RunResult { - val buyerFlows: Observable> = buyerNode.internals.registerInitiatedFlow(BuyerAcceptor::class.java) + val buyerFlows: Observable> = buyerNode.registerInitiatedFlow(BuyerAcceptor::class.java) val firstBuyerFiber = buyerFlows.toFuture().map { it.stateMachine } val seller = SellerInitiator(buyer, notary, assetToSell, 1000.DOLLARS, anonymous) val sellerResult = sellerNode.services.startFlow(seller).resultFuture @@ -673,13 +673,13 @@ class TwoPartyTradeFlowTests(private val anonymous: Boolean) { // wants to sell to Bob. val eb1 = transaction(transactionBuilder = TransactionBuilder(notary = notary)) { // Issued money to itself. - output(Cash.PROGRAM_ID, "elbonian money 1", notary = notary) { 800.DOLLARS.CASH issuedBy issuer ownedBy interimOwner } - output(Cash.PROGRAM_ID, "elbonian money 2", notary = notary) { 1000.DOLLARS.CASH issuedBy issuer ownedBy interimOwner } + output(Cash.PROGRAM_ID, "elbonian money 1", notary = notary, contractState = 800.DOLLARS.CASH issuedBy issuer ownedBy interimOwner) + output(Cash.PROGRAM_ID, "elbonian money 2", notary = notary, contractState = 1000.DOLLARS.CASH issuedBy issuer ownedBy interimOwner) if (!withError) { - command(issuer.party.owningKey) { Cash.Commands.Issue() } + command(issuer.party.owningKey, Cash.Commands.Issue()) } else { // Put a broken command on so at least a signature is created - command(issuer.party.owningKey) { Cash.Commands.Move() } + command(issuer.party.owningKey, Cash.Commands.Move()) } timeWindow(TEST_TX_TIME) if (withError) { @@ -692,16 +692,16 @@ class TwoPartyTradeFlowTests(private val anonymous: Boolean) { // Bob gets some cash onto the ledger from BoE val bc1 = transaction(transactionBuilder = TransactionBuilder(notary = notary)) { input("elbonian money 1") - output(Cash.PROGRAM_ID, "bob cash 1", notary = notary) { 800.DOLLARS.CASH issuedBy issuer ownedBy owner } - command(interimOwner.owningKey) { Cash.Commands.Move() } + output(Cash.PROGRAM_ID, "bob cash 1", notary = notary, contractState = 800.DOLLARS.CASH issuedBy issuer ownedBy owner) + command(interimOwner.owningKey, Cash.Commands.Move()) this.verifies() } val bc2 = transaction(transactionBuilder = TransactionBuilder(notary = notary)) { input("elbonian money 2") - output(Cash.PROGRAM_ID, "bob cash 2", notary = notary) { 300.DOLLARS.CASH issuedBy issuer ownedBy owner } - output(Cash.PROGRAM_ID, notary = notary) { 700.DOLLARS.CASH issuedBy issuer ownedBy interimOwner } // Change output. - command(interimOwner.owningKey) { Cash.Commands.Move() } + output(Cash.PROGRAM_ID, "bob cash 2", notary = notary, contractState = 300.DOLLARS.CASH issuedBy issuer ownedBy owner) + output(Cash.PROGRAM_ID, notary = notary, contractState = 700.DOLLARS.CASH issuedBy issuer ownedBy interimOwner) // Change output. + command(interimOwner.owningKey, Cash.Commands.Move()) this.verifies() } @@ -717,10 +717,9 @@ class TwoPartyTradeFlowTests(private val anonymous: Boolean) { attachmentID: SecureHash?, notary: Party): Pair, List> { val ap = transaction(transactionBuilder = TransactionBuilder(notary = notary)) { - output(CommercialPaper.CP_PROGRAM_ID, "alice's paper", notary = notary) { - CommercialPaper.State(issuer, owner, amount, TEST_TX_TIME + 7.days) - } - command(issuer.party.owningKey) { CommercialPaper.Commands.Issue() } + output(CommercialPaper.CP_PROGRAM_ID, "alice's paper", notary = notary, + contractState = CommercialPaper.State(issuer, owner, amount, TEST_TX_TIME + 7.days)) + command(issuer.party.owningKey, CommercialPaper.Commands.Issue()) if (!withError) timeWindow(time = TEST_TX_TIME) if (attachmentID != null) diff --git a/samples/bank-of-corda-demo/src/main/kotlin/net/corda/bank/api/BankOfCordaClientApi.kt b/samples/bank-of-corda-demo/src/main/kotlin/net/corda/bank/api/BankOfCordaClientApi.kt index ac0a136f7c..85fe095d19 100644 --- a/samples/bank-of-corda-demo/src/main/kotlin/net/corda/bank/api/BankOfCordaClientApi.kt +++ b/samples/bank-of-corda-demo/src/main/kotlin/net/corda/bank/api/BankOfCordaClientApi.kt @@ -10,7 +10,6 @@ import net.corda.core.utilities.OpaqueBytes import net.corda.core.utilities.getOrThrow import net.corda.finance.flows.CashIssueAndPaymentFlow import net.corda.testing.http.HttpApi -import java.util.* /** * Interface for communicating with Bank of Corda node diff --git a/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/RaftNotaryCordform.kt b/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/RaftNotaryCordform.kt index e6c6f54595..7ba39a8dea 100644 --- a/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/RaftNotaryCordform.kt +++ b/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/RaftNotaryCordform.kt @@ -4,7 +4,6 @@ import net.corda.cordform.CordformContext import net.corda.cordform.CordformDefinition import net.corda.cordform.CordformNode import net.corda.core.identity.CordaX500Name -import net.corda.core.internal.div import net.corda.core.utilities.NetworkHostAndPort import net.corda.node.services.config.NotaryConfig import net.corda.node.services.config.RaftConfig diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockServices.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockServices.kt index 56a07cf6c5..13ccd7432c 100644 --- a/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockServices.kt +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockServices.kt @@ -26,7 +26,6 @@ import net.corda.node.services.api.StateMachineRecordedTransactionMappingStorage import net.corda.node.services.api.VaultServiceInternal import net.corda.node.services.api.WritableTransactionStorage import net.corda.node.services.config.configOf -import net.corda.node.services.config.DatabaseConfig import net.corda.node.services.identity.InMemoryIdentityService import net.corda.node.services.keys.freshCertificate import net.corda.node.services.keys.getSigner