diff --git a/constants.properties b/constants.properties index d472994d01..5bc1a09cd5 100644 --- a/constants.properties +++ b/constants.properties @@ -1,4 +1,4 @@ -gradlePluginsVersion=4.0.29 +gradlePluginsVersion=4.0.32 kotlinVersion=1.2.51 # ***************************************************************# # When incrementing platformVersion make sure to update # diff --git a/docs/source/cordapp-build-systems.rst b/docs/source/cordapp-build-systems.rst index af785ae777..7ca31b2b1a 100644 --- a/docs/source/cordapp-build-systems.rst +++ b/docs/source/cordapp-build-systems.rst @@ -198,11 +198,23 @@ CorDapps can advertise their minimum and target platform version. The minimum pl .. sourcecode:: groovy - 'Min-Platform-Version': 3 + 'Min-Platform-Version': 4 'Target-Platform-Version': 4 +Using the `cordapp` Gradle plugin, this can be achieved by putting this in your CorDapp's `build.gradle`: -In gradle, this can be achieved by modifying the jar task as shown in this example: +.. container:: codeset + + .. sourcecode:: groovy + + cordapp { + info { + targetPlatformVersion 4 + minimumPlatformVersion 4 + } + } + +Without using the `cordapp` plugin, you can achieve the same by modifying the jar task as shown in this example: .. container:: codeset @@ -211,7 +223,7 @@ In gradle, this can be achieved by modifying the jar task as shown in this examp jar { manifest { attributes( - 'Min-Platform-Version': 3 + 'Min-Platform-Version': 4 'Target-Platform-Version': 4 ) } diff --git a/experimental/notary-bft-smart/build.gradle b/experimental/notary-bft-smart/build.gradle index b4ff48b444..bcd0614686 100644 --- a/experimental/notary-bft-smart/build.gradle +++ b/experimental/notary-bft-smart/build.gradle @@ -33,3 +33,13 @@ idea { publish { name 'corda-notary-bft-smart' } + + +cordapp { + info { + name "net/corda/experimental/notary-bft-smart" + vendor "Corda Open Source" + targetPlatformVersion corda_platform_version.toInteger() + minimumPlatformVersion 1 + } +} diff --git a/experimental/notary-raft/build.gradle b/experimental/notary-raft/build.gradle index b07659ef2f..fc6a1894da 100644 --- a/experimental/notary-raft/build.gradle +++ b/experimental/notary-raft/build.gradle @@ -33,3 +33,12 @@ idea { publish { name 'corda-notary-raft' } + +cordapp { + info { + name "net/corda/experimental/notary-raft" + vendor "Corda Open Source" + targetPlatformVersion corda_platform_version.toInteger() + minimumPlatformVersion 1 + } +} diff --git a/finance/build.gradle b/finance/build.gradle index b55819f201..be028830eb 100644 --- a/finance/build.gradle +++ b/finance/build.gradle @@ -87,6 +87,8 @@ cordapp { info { name "net/corda/finance" vendor "Corda Open Source" + targetPlatformVersion corda_platform_version.toInteger() + minimumPlatformVersion 1 } } diff --git a/samples/attachment-demo/build.gradle b/samples/attachment-demo/build.gradle index 71fbfe48d7..7629c833fa 100644 --- a/samples/attachment-demo/build.gradle +++ b/samples/attachment-demo/build.gradle @@ -1,11 +1,8 @@ -apply plugin: 'java' apply plugin: 'kotlin' apply plugin: 'idea' apply plugin: 'net.corda.plugins.quasar-utils' -apply plugin: 'net.corda.plugins.publish-utils' apply plugin: 'net.corda.plugins.cordapp' apply plugin: 'net.corda.plugins.cordformation' -apply plugin: 'maven-publish' sourceSets { integrationTest { @@ -27,14 +24,16 @@ dependencies { testCompile "junit:junit:$junit_version" // Corda integration dependencies - cordaCompile project(path: ":node:capsule", configuration: 'runtimeArtifacts') - cordaCompile project(path: ":webserver:webcapsule", configuration: 'runtimeArtifacts') + cordaRuntime project(path: ":node:capsule", configuration: 'runtimeArtifacts') + cordaRuntime project(path: ":webserver:webcapsule", configuration: 'runtimeArtifacts') cordaCompile project(':core') cordaCompile project(':webserver') cordaCompile project(':node-driver') } -task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { +def nodeTask = tasks.getByPath(':node:capsule:assemble') +def webTask = tasks.getByPath(':webserver:webcapsule:assemble') +task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar', nodeTask, webTask]) { ext.rpcUsers = [['username': "demo", 'password': "demo", 'permissions': ["StartFlow.net.corda.attachmentdemo.AttachmentDemoFlow", "InvokeRpc.wellKnownPartyFromX500Name", "InvokeRpc.attachmentExists", @@ -92,18 +91,6 @@ idea { } } -publishing { - publications { - jarAndSources(MavenPublication) { - from components.java - artifactId 'attachmentdemo' - - artifact sourceJar - artifact javadocJar - } - } -} - task runSender(type: JavaExec) { classpath = sourceSets.main.runtimeClasspath main = 'net.corda.attachmentdemo.AttachmentDemoKt' @@ -125,3 +112,12 @@ jar { ) } } + +cordapp { + info { + name "net/corda/samples/attachment-demo" + vendor "Corda Open Source" + targetPlatformVersion corda_platform_version.toInteger() + minimumPlatformVersion 1 + } +} diff --git a/samples/bank-of-corda-demo/build.gradle b/samples/bank-of-corda-demo/build.gradle index c05f0172e3..0990cc5987 100644 --- a/samples/bank-of-corda-demo/build.gradle +++ b/samples/bank-of-corda-demo/build.gradle @@ -2,10 +2,8 @@ apply plugin: 'java' apply plugin: 'kotlin' apply plugin: 'idea' apply plugin: 'net.corda.plugins.quasar-utils' -apply plugin: 'net.corda.plugins.publish-utils' apply plugin: 'net.corda.plugins.cordapp' apply plugin: 'net.corda.plugins.cordformation' -apply plugin: 'maven-publish' dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" @@ -14,8 +12,8 @@ dependencies { cordapp project(':finance') // Corda integration dependencies - cordaCompile project(path: ":node:capsule", configuration: 'runtimeArtifacts') - cordaCompile project(path: ":webserver:webcapsule", configuration: 'runtimeArtifacts') + cordaRuntime project(path: ":node:capsule", configuration: 'runtimeArtifacts') + cordaRuntime project(path: ":webserver:webcapsule", configuration: 'runtimeArtifacts') cordaCompile project(':core') cordaCompile project(':client:jfx') cordaCompile project(':client:rpc') @@ -32,7 +30,9 @@ dependencies { testCompile "junit:junit:$junit_version" } -task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { +def nodeTask = tasks.getByPath(':node:capsule:assemble') +def webTask = tasks.getByPath(':webserver:webcapsule:assemble') +task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar', nodeTask, webTask]) { nodeDefaults { cordapp project(':finance') } @@ -82,18 +82,6 @@ idea { } } -publishing { - publications { - jarAndSources(MavenPublication) { - from components.java - artifactId 'bankofcorda' - - artifact sourceJar - artifact javadocJar - } - } -} - task runRPCCashIssue(type: JavaExec) { classpath = sourceSets.main.runtimeClasspath main = 'net.corda.bank.IssueCash' @@ -123,3 +111,12 @@ jar { ) } } + +cordapp { + info { + name "net/corda/samples/bank-of-corda-demo" + vendor "Corda Open Source" + targetPlatformVersion corda_platform_version.toInteger() + minimumPlatformVersion 1 + } +} diff --git a/samples/cordapp-configuration/build.gradle b/samples/cordapp-configuration/build.gradle index b1f121b9d1..2203482080 100644 --- a/samples/cordapp-configuration/build.gradle +++ b/samples/cordapp-configuration/build.gradle @@ -1,17 +1,20 @@ apply plugin: 'kotlin' -apply plugin: 'java' +apply plugin: 'idea' apply plugin: 'net.corda.plugins.cordapp' apply plugin: 'net.corda.plugins.cordformation' dependencies { - cordaCompile project(":core") - cordaCompile project(":node-api") - cordaRuntime project(path: ":node:capsule", configuration: 'runtimeArtifacts') - cordaRuntime project(path: ":webserver:webcapsule", configuration: 'runtimeArtifacts') + cordaCompile project(':core') + cordaCompile project(':node-api') runtimeOnly "org.apache.logging.log4j:log4j-slf4j-impl:$log4j_version" + + // Corda integration dependencies + cordaRuntime project(path: ":node:capsule", configuration: 'runtimeArtifacts') } -task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { +def nodeTask = tasks.getByPath(':node:capsule:assemble') +def webTask = tasks.getByPath(':webserver:webcapsule:assemble') +task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar', nodeTask, webTask]) { directory file("$buildDir/nodes") nodeDefaults { cordapps = [] @@ -25,7 +28,6 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { port 10003 adminPort 10004 } - rpcUsers = [] extraConfig = ['h2Settings.address' : 'localhost:10005'] } node { @@ -54,4 +56,13 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { } extraConfig = ['h2Settings.address' : 'localhost:10013'] } -} \ No newline at end of file +} + +cordapp { + info { + name "net/corda/samples/cordapp-configuration" + vendor "Corda Open Source" + targetPlatformVersion corda_platform_version.toInteger() + minimumPlatformVersion 1 + } +} diff --git a/samples/cordapp-configuration/src/main/kotlin/net/corda/configsample/GetStringConfigFlow.kt b/samples/cordapp-configuration/src/main/kotlin/net/corda/configsample/GetStringConfigFlow.kt index 7fbbaeff77..87cafce820 100644 --- a/samples/cordapp-configuration/src/main/kotlin/net/corda/configsample/GetStringConfigFlow.kt +++ b/samples/cordapp-configuration/src/main/kotlin/net/corda/configsample/GetStringConfigFlow.kt @@ -1,8 +1,14 @@ package net.corda.configsample import co.paralleluniverse.fibers.Suspendable +import net.corda.core.contracts.CommandData +import net.corda.core.contracts.Contract +import net.corda.core.contracts.ContractState import net.corda.core.flows.FlowLogic import net.corda.core.flows.StartableByRPC +import net.corda.core.identity.AbstractParty +import net.corda.core.serialization.CordaSerializable +import net.corda.core.transactions.LedgerTransaction import net.corda.core.utilities.ProgressTracker @StartableByRPC @@ -17,3 +23,22 @@ class GetStringConfigFlow(private val configKey: String) : FlowLogic() { return config.getString(configKey) } } + + + +@CordaSerializable +data class GetStringTestState(val responses: List, val issuer: AbstractParty) : ContractState { + override val participants: List + get() = listOf(issuer) + +} + + +@CordaSerializable +object GetStringTestCommand : CommandData + + +class GetStringTestContract : Contract { + override fun verify(tx: LedgerTransaction) { + } +} \ No newline at end of file diff --git a/samples/irs-demo/build.gradle b/samples/irs-demo/build.gradle index f1fb1ef397..74bb3241a3 100644 --- a/samples/irs-demo/build.gradle +++ b/samples/irs-demo/build.gradle @@ -21,7 +21,6 @@ ext['jackson.version'] = "$jackson_version" ext['dropwizard-metrics.version'] = "$metrics_version" ext['mockito.version'] = "$mockito_version" -apply plugin: 'java' apply plugin: 'kotlin' apply plugin: 'idea' apply plugin: 'org.springframework.boot' diff --git a/samples/irs-demo/cordapp/build.gradle b/samples/irs-demo/cordapp/build.gradle index fba2b8f523..0359cc52d1 100644 --- a/samples/irs-demo/cordapp/build.gradle +++ b/samples/irs-demo/cordapp/build.gradle @@ -1,11 +1,8 @@ -apply plugin: 'java' apply plugin: 'kotlin' apply plugin: 'idea' apply plugin: 'net.corda.plugins.quasar-utils' -apply plugin: 'net.corda.plugins.publish-utils' apply plugin: 'net.corda.plugins.cordformation' apply plugin: 'net.corda.plugins.cordapp' -apply plugin: 'maven-publish' apply plugin: 'application' mainClassName = 'net.corda.irs.IRSDemo' @@ -31,7 +28,7 @@ dependencies { cordapp project(':finance') // Corda integration dependencies - cordaCompile project(path: ":node:capsule", configuration: 'runtimeArtifacts') + cordaRuntime project(path: ":node:capsule", configuration: 'runtimeArtifacts') cordaCompile project(':core') // Cordapp dependencies @@ -57,7 +54,8 @@ def rpcUsersList = [ ]] ] -task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { +def nodeTask = tasks.getByPath(':node:capsule:assemble') +task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar', nodeTask]) { node { name "O=Notary Service,L=Zurich,C=CH" @@ -112,7 +110,7 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { } -task prepareDockerNodes(type: net.corda.plugins.Dockerform, dependsOn: ['jar']) { +task prepareDockerNodes(type: net.corda.plugins.Dockerform, dependsOn: ['jar', nodeTask]) { node { name "O=Notary Service,L=Zurich,C=CH" @@ -159,15 +157,25 @@ tasks.withType(CreateStartScripts).each { task -> idea { module { - downloadJavadoc = true // defaults to false + downloadJavadoc = true downloadSources = true } } jar { from sourceSets.test.output + duplicatesStrategy = DuplicatesStrategy.EXCLUDE } artifacts { demoArtifacts jar -} \ No newline at end of file +} + +cordapp { + info { + name "net/corda/irs-demo" + vendor "Corda Open Source" + targetPlatformVersion corda_platform_version.toInteger() + minimumPlatformVersion 1 + } +} diff --git a/samples/network-verifier/build.gradle b/samples/network-verifier/build.gradle index 0245d6027f..eea17b8ae2 100644 --- a/samples/network-verifier/build.gradle +++ b/samples/network-verifier/build.gradle @@ -1,18 +1,20 @@ apply plugin: 'kotlin' -apply plugin: 'java' apply plugin: 'net.corda.plugins.cordapp' apply plugin: 'net.corda.plugins.cordformation' dependencies { - cordaCompile project(":core") - cordaCompile project(":node-api") - cordaCompile project(path: ":node:capsule", configuration: 'runtimeArtifacts') + cordaCompile project(':core') + cordaCompile project(':node-api') testCompile project(":test-utils") testCompile "junit:junit:$junit_version" + + // Corda integration dependencies + cordaRuntime project(path: ":node:capsule", configuration: 'runtimeArtifacts') } -task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { +def nodeTask = tasks.getByPath(':node:capsule:assemble') +task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar', nodeTask]) { ext.rpcUsers = [['username': "default", 'password': "default", 'permissions': [ 'ALL' ]]] directory "./build/nodes" @@ -48,4 +50,13 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { } extraConfig = ['h2Settings.address' : 'localhost:0'] } -} \ No newline at end of file +} + +cordapp { + info { + name "net/corda/samples/network-verifier" + vendor "Corda Open Source" + targetPlatformVersion corda_platform_version.toInteger() + minimumPlatformVersion 1 + } +} diff --git a/samples/notary-demo/build.gradle b/samples/notary-demo/build.gradle index acf513708c..ad7f9110e1 100644 --- a/samples/notary-demo/build.gradle +++ b/samples/notary-demo/build.gradle @@ -16,8 +16,8 @@ dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" // Corda integration dependencies - cordaCompile project(path: ":node:capsule", configuration: 'runtimeArtifacts') - cordaCompile project(path: ":webserver:webcapsule", configuration: 'runtimeArtifacts') + cordaRuntime project(path: ":node:capsule", configuration: 'runtimeArtifacts') + cordaRuntime project(path: ":webserver:webcapsule", configuration: 'runtimeArtifacts') cordaCompile project(':core') cordaCompile project(':client:jfx') cordaCompile project(':client:rpc') @@ -28,9 +28,12 @@ dependencies { cordapp project(':experimental:notary-bft-smart') } +def nodeTask = tasks.getByPath(':node:capsule:assemble') +def webTask = tasks.getByPath(':webserver:webcapsule:assemble') + task deployNodes(dependsOn: ['deployNodesSingle', 'deployNodesRaft', 'deployNodesBFT', 'deployNodesCustom']) -task deployNodesSingle(type: Cordform, dependsOn: 'jar') { +task deployNodesSingle(type: Cordform, dependsOn: ['jar', nodeTask, webTask]) { directory file("$buildDir/nodes/nodesSingle") nodeDefaults { extraConfig = [h2Settings: [address: "localhost:0"]] @@ -55,7 +58,7 @@ task deployNodesSingle(type: Cordform, dependsOn: 'jar') { } } -task deployNodesCustom(type: Cordform, dependsOn: 'jar') { +task deployNodesCustom(type: Cordform, dependsOn: ['jar', nodeTask, webTask]) { directory file("$buildDir/nodes/nodesCustom") nodeDefaults { extraConfig = [h2Settings: [address: "localhost:0"]] @@ -83,7 +86,7 @@ task deployNodesCustom(type: Cordform, dependsOn: 'jar') { } } -task deployNodesRaft(type: Cordform, dependsOn: 'jar') { +task deployNodesRaft(type: Cordform, dependsOn: ['jar', nodeTask, webTask]) { def className = "net.corda.notary.raft.RaftNotaryService" directory file("$buildDir/nodes/nodesRaft") nodeDefaults { @@ -151,7 +154,7 @@ task deployNodesRaft(type: Cordform, dependsOn: 'jar') { } } -task deployNodesBFT(type: Cordform, dependsOn: 'jar') { +task deployNodesBFT(type: Cordform, dependsOn: ['jar', nodeTask, webTask]) { def clusterAddresses = ["localhost:11000", "localhost:11010", "localhost:11020", "localhost:11030"] def className = "net.corda.notary.bftsmart.BftSmartNotaryService" directory file("$buildDir/nodes/nodesBFT") @@ -250,3 +253,12 @@ jar { ) } } + +cordapp { + info { + name "net/corda/samples/notary-demo" + vendor "Corda Open Source" + targetPlatformVersion corda_platform_version.toInteger() + minimumPlatformVersion 1 + } +} diff --git a/samples/simm-valuation-demo/build.gradle b/samples/simm-valuation-demo/build.gradle index 8fc1e65c05..27a7b83e1b 100644 --- a/samples/simm-valuation-demo/build.gradle +++ b/samples/simm-valuation-demo/build.gradle @@ -4,7 +4,6 @@ allprojects { } } -apply plugin: 'java' apply plugin: 'kotlin' apply plugin: 'idea' apply plugin: 'net.corda.plugins.quasar-utils' @@ -27,7 +26,7 @@ configurations { } dependencies { - compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" + cordaCompile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" // The SIMM demo CorDapp depends upon Cash CorDapp features cordapp project(':finance') @@ -62,7 +61,9 @@ dependencies { testCompile "org.assertj:assertj-core:$assertj_version" } -task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { +def nodeTask = tasks.getByPath(':node:capsule:assemble') +def webTask = tasks.getByPath(':webserver:webcapsule:assemble') +task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar', nodeTask, webTask]) { directory file("$buildDir/nodes") nodeDefaults { cordapp project(':finance') @@ -70,6 +71,9 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { cordapp project(':samples:simm-valuation-demo:flows') rpcUsers = [['username': "default", 'password': "default", 'permissions': [ 'ALL' ]]] } + signing { + enabled false + } node { name "O=Notary Service,L=Zurich,C=CH" notary = [validating : true] @@ -137,3 +141,10 @@ task integrationTest(type: Test, dependsOn: []) { testClassesDirs = sourceSets.integrationTest.output.classesDirs classpath = sourceSets.integrationTest.runtimeClasspath } + +cordapp { + info { + vendor = 'R3' + targetPlatformVersion = corda_platform_version.toInteger() + } +} diff --git a/samples/simm-valuation-demo/contracts-states/build.gradle b/samples/simm-valuation-demo/contracts-states/build.gradle index 146966bbee..2849ad30ff 100644 --- a/samples/simm-valuation-demo/contracts-states/build.gradle +++ b/samples/simm-valuation-demo/contracts-states/build.gradle @@ -6,6 +6,12 @@ def shrinkJar = file("$buildDir/libs/${project.name}-${project.version}-tiny.jar cordapp { info { vendor = 'R3' + targetPlatformVersion = corda_platform_version.toInteger() + } + signing { + // We need to sign the output of the "shrink" task, + // but the jar signer doesn't support that yet. + enabled false } } diff --git a/samples/simm-valuation-demo/flows/build.gradle b/samples/simm-valuation-demo/flows/build.gradle index fd3b512fab..4520f321dd 100644 --- a/samples/simm-valuation-demo/flows/build.gradle +++ b/samples/simm-valuation-demo/flows/build.gradle @@ -4,6 +4,10 @@ apply plugin: 'net.corda.plugins.cordapp' cordapp { info { vendor = 'R3' + targetPlatformVersion = corda_platform_version.toInteger() + } + signing { + enabled false } } diff --git a/samples/trader-demo/build.gradle b/samples/trader-demo/build.gradle index afd027fdbc..f8ffd4edf3 100644 --- a/samples/trader-demo/build.gradle +++ b/samples/trader-demo/build.gradle @@ -1,11 +1,8 @@ -apply plugin: 'java' apply plugin: 'kotlin' apply plugin: 'idea' apply plugin: 'net.corda.plugins.quasar-utils' -apply plugin: 'net.corda.plugins.publish-utils' apply plugin: 'net.corda.plugins.cordapp' apply plugin: 'net.corda.plugins.cordformation' -apply plugin: 'maven-publish' sourceSets { integrationTest { @@ -29,8 +26,8 @@ dependencies { cordapp project(':finance') // Corda integration dependencies - cordaCompile project(path: ":node:capsule", configuration: 'runtimeArtifacts') - cordaCompile project(path: ":webserver:webcapsule", configuration: 'runtimeArtifacts') + cordaRuntime project(path: ":node:capsule", configuration: 'runtimeArtifacts') + cordaRuntime project(path: ":webserver:webcapsule", configuration: 'runtimeArtifacts') cordaCompile project(':core') // Corda Plugins: dependent flows and services @@ -41,7 +38,9 @@ dependencies { testCompile "org.assertj:assertj-core:${assertj_version}" } -task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { +def nodeTask = tasks.getByPath(':node:capsule:assemble') +def webTask = tasks.getByPath(':webserver:webcapsule:assemble') +task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar', nodeTask, webTask]) { ext.rpcUsers = [['username': "demo", 'password': "demo", 'permissions': ["ALL"]]] directory "./build/nodes" @@ -104,18 +103,6 @@ idea { } } -publishing { - publications { - jarAndSources(MavenPublication) { - from components.java - artifactId 'traderdemo' - - artifact sourceJar - artifact javadocJar - } - } -} - task runBank(type: JavaExec) { classpath = sourceSets.main.runtimeClasspath main = 'net.corda.traderdemo.TraderDemoKt' @@ -136,4 +123,13 @@ jar { 'Automatic-Module-Name': 'net.corda.samples.demos.trader' ) } -} \ No newline at end of file +} + +cordapp { + info { + name "net/corda/samples/trader-demo" + vendor "Corda Open Source" + targetPlatformVersion corda_platform_version.toInteger() + minimumPlatformVersion 1 + } +}