From 944c23d8a1c070e36171634b4c42da7c462fba6a Mon Sep 17 00:00:00 2001 From: Francesco Vlacancich Date: Thu, 12 Aug 2021 11:57:29 +0200 Subject: [PATCH] Revert "final draft for JSON determinm task, using Genson instead of object mapper" This reverts commit cc0f8c7bbba3ef1a0be1a9291e6c0a594b281933. revert wrong commit cc0f8c7bbba3ef1a0be1a9291e6c0a594b281933 Signed-off-by: fraVlaca --- asset-transfer-abac/chaincode-java/.classpath | 19 - .../org.eclipse.buildship.core.prefs | 13 - .../.settings/org.eclipse.jdt.core.prefs | 4 - .../bin/main/org/example/Asset.class | Bin 2052 -> 0 bytes .../AssetTransfer$AssetTransferErrors.class | Bin 3978 -> 0 bytes .../bin/main/org/example/AssetTransfer.class | Bin 7869 -> 0 bytes .../dist/asset-contract.d.ts | 11 - .../dist/asset-contract.js | 186 ------- .../dist/asset-contract.js.map | 1 - .../chaincode-typescript/dist/asset.d.ts | 8 - .../chaincode-typescript/dist/asset.js | 47 -- .../chaincode-typescript/dist/asset.js.map | 1 - .../dist/assetTransfer.d.ts | 11 - .../dist/assetTransfer.js | 186 ------- .../dist/assetTransfer.js.map | 1 - .../chaincode-typescript/dist/index.d.ts | 2 - .../chaincode-typescript/dist/index.js | 11 - .../chaincode-typescript/dist/index.js.map | 1 - .../chaincode-go/chaincode/smartcontract.go | 5 +- .../chaincode-java/.classpath | 2 +- .../chaincode-java/.gitattributes | 6 + .../samples/assettransfer/AssetTransfer.class | Bin 7323 -> 7676 bytes .../chaincode-java/build.gradle | 87 +++- .../config/checkstyle/checkstyle.xml | 171 +++++++ .../config/checkstyle/suppressions.xml | 9 + .../gradle/wrapper/gradle-wrapper.jar | Bin 54329 -> 55616 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- asset-transfer-basic/chaincode-java/gradlew | 22 +- .../chaincode-java/gradlew.bat | 18 +- .../chaincode-java/settings.gradle | 2 +- .../fabric/samples/assettransfer/Asset.java | 1 - .../samples/assettransfer/AssetTransfer.java | 54 ++- .../samples/assettransfer/AssetTest.java | 2 +- .../assettransfer/AssetTransferTest.java | 2 +- .../{chaincode-java => java}/.fabricignore | 0 .../{chaincode-java => java}/.gitignore | 0 asset-transfer-basic/java/build.gradle | 52 ++ .../java/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + asset-transfer-basic/java/gradlew | 172 +++++++ asset-transfer-basic/java/gradlew.bat | 84 ++++ asset-transfer-basic/java/settings.gradle | 5 + .../java/src/main/java/org/example/Asset.java | 94 ++++ .../main/java/org/example/AssetTransfer.java | 252 ++++++++++ .../my-asset-transactions.txdata | 0 .../chaincode-java/.classpath | 12 - .../org.eclipse.buildship.core.prefs | 13 - .../fabric/samples/events/Asset.class | Bin 4839 -> 0 bytes .../AssetTransfer$AssetTransferErrors.class | Bin 1610 -> 0 bytes .../fabric/samples/events/AssetTransfer.class | Bin 8785 -> 0 bytes .../dist/asset-contract.d.ts | 8 - .../dist/asset-contract.js | 144 ------ .../dist/asset-contract.js.map | 1 - .../chaincode-typescript/dist/asset.d.ts | 8 - .../chaincode-typescript/dist/asset.js | 47 -- .../chaincode-typescript/dist/asset.js.map | 1 - .../chaincode-typescript/dist/index.d.ts | 2 - .../chaincode-typescript/dist/index.js | 11 - .../chaincode-typescript/dist/index.js.map | 1 - .../application-java/.classpath | 18 - .../org.eclipse.buildship.core.prefs | 13 - .../bin/main/application/java/App.class | Bin 1274 -> 0 bytes .../main/application/java/EnrollAdmin.class | Bin 948 -> 0 bytes .../main/application/java/RegisterUser.class | Bin 1965 -> 0 bytes .../bin/main/log4j.properties | 19 - .../chaincode-java/.classpath | 19 - .../org.eclipse.buildship.core.prefs | 13 - .../.settings/org.eclipse.jdt.core.prefs | 4 - .../bin/main/org/example/Asset.class | Bin 2839 -> 0 bytes .../main/org/example/AssetContract$1$1.class | Bin 624 -> 0 bytes .../main/org/example/AssetContract$1.class | Bin 780 -> 0 bytes .../main/org/example/AssetContract$2.class | Bin 1398 -> 0 bytes .../main/org/example/AssetContract$3.class | Bin 1375 -> 0 bytes .../main/org/example/AssetContract$4.class | Bin 811 -> 0 bytes .../main/org/example/AssetContract$5.class | Bin 948 -> 0 bytes .../AssetContract$AssetTransferErrors.class | Bin 1228 -> 0 bytes .../bin/main/org/example/AssetContract.class | Bin 12330 -> 0 bytes .../dist/asset-contract.d.ts | 19 - .../dist/asset-contract.js | 452 ------------------ .../dist/asset-contract.js.map | 1 - .../chaincode-typescript/dist/asset.d.ts | 8 - .../chaincode-typescript/dist/asset.js | 47 -- .../chaincode-typescript/dist/asset.js.map | 1 - .../chaincode-typescript/dist/index.d.ts | 2 - .../chaincode-typescript/dist/index.js | 11 - .../chaincode-typescript/dist/index.js.map | 1 - .../chaincode-java/.classpath | 26 - .../org.eclipse.buildship.core.prefs | 13 - .../fabric/samples/privatedata/Asset.class | Bin 4023 -> 0 bytes .../privatedata/AssetPrivateDetails.class | Bin 2134 -> 0 bytes .../AssetTransfer$AssetTransferErrors.class | Bin 1588 -> 0 bytes .../samples/privatedata/AssetTransfer.class | Bin 18132 -> 0 bytes .../privatedata/TransferAgreement.class | Bin 2037 -> 0 bytes .../org.mockito.plugins.MockMaker | 1 - ...tTransferTest$InvokeWriteTransaction.class | Bin 7674 -> 0 bytes ...ansferTest$QueryReadAssetTransaction.class | Bin 4732 -> 0 bytes .../privatedata/AssetTransferTest.class | Bin 1420 -> 0 bytes .../chaincode-javascript/.editorconfig | 16 - .../chaincode-javascript/.eslintignore | 5 - .../chaincode-javascript/.eslintrc.js | 36 -- .../chaincode-javascript/.gitignore | 77 --- .../chaincode-javascript/.npmignore | 20 - .../chaincode-javascript/index.js | 10 - .../lib/asset-contract.js | 156 ------ .../chaincode-javascript/package.json | 50 -- .../test/asset-contract.js | 108 ----- .../asset-transactions.txdata | 44 -- .../chaincode-go/asset-contract.go | 198 -------- asset-transfer-sbe/chaincode-go/asset.go | 9 - asset-transfer-sbe/chaincode-go/go.mod | 9 - asset-transfer-sbe/chaincode-go/go.sum | 138 ------ asset-transfer-sbe/chaincode-go/main.go | 34 -- .../transaction_data/my-transactions.txdata | 44 -- .../chaincode-javascript/.editorconfig | 16 - .../chaincode-javascript/.eslintignore | 5 - .../chaincode-javascript/.eslintrc.js | 36 -- .../chaincode-javascript/.gitignore | 77 --- .../chaincode-javascript/.npmignore | 20 - .../chaincode-javascript/index.js | 10 - .../lib/asset-contract.js | 149 ------ .../chaincode-javascript/package.json | 50 -- .../test/asset-contract.js | 108 ----- .../asset-transactions.txdata | 44 -- .../magnetocorp/application-java/.classpath | 36 -- .../.settings/org.eclipse.jdt.apt.core.prefs | 2 - .../magnetocorp/contract-java/.classpath | 12 - .../.settings/org.eclipse.jdt.core.prefs | 4 - .../main/org/example/CommercialPaper.class | Bin 4587 -> 0 bytes .../org/example/CommercialPaperContext.class | Bin 605 -> 0 bytes .../org/example/CommercialPaperContract.class | Bin 4935 -> 0 bytes .../bin/main/org/example/PaperList.class | Bin 2019 -> 0 bytes .../main/org/example/ledgerapi/State.class | Bin 1778 -> 0 bytes .../example/ledgerapi/StateDeserializer.class | Bin 269 -> 0 bytes .../org/example/ledgerapi/StateList.class | Bin 898 -> 0 bytes .../ledgerapi/impl/StateListImpl.class | Bin 3071 -> 0 bytes 135 files changed, 989 insertions(+), 2999 deletions(-) delete mode 100644 asset-transfer-abac/chaincode-java/.classpath delete mode 100644 asset-transfer-abac/chaincode-java/.settings/org.eclipse.buildship.core.prefs delete mode 100644 asset-transfer-abac/chaincode-java/.settings/org.eclipse.jdt.core.prefs delete mode 100644 asset-transfer-abac/chaincode-java/bin/main/org/example/Asset.class delete mode 100644 asset-transfer-abac/chaincode-java/bin/main/org/example/AssetTransfer$AssetTransferErrors.class delete mode 100644 asset-transfer-abac/chaincode-java/bin/main/org/example/AssetTransfer.class delete mode 100644 asset-transfer-abac/chaincode-typescript/dist/asset-contract.d.ts delete mode 100644 asset-transfer-abac/chaincode-typescript/dist/asset-contract.js delete mode 100644 asset-transfer-abac/chaincode-typescript/dist/asset-contract.js.map delete mode 100644 asset-transfer-abac/chaincode-typescript/dist/asset.d.ts delete mode 100644 asset-transfer-abac/chaincode-typescript/dist/asset.js delete mode 100644 asset-transfer-abac/chaincode-typescript/dist/asset.js.map delete mode 100644 asset-transfer-abac/chaincode-typescript/dist/assetTransfer.d.ts delete mode 100644 asset-transfer-abac/chaincode-typescript/dist/assetTransfer.js delete mode 100644 asset-transfer-abac/chaincode-typescript/dist/assetTransfer.js.map delete mode 100644 asset-transfer-abac/chaincode-typescript/dist/index.d.ts delete mode 100644 asset-transfer-abac/chaincode-typescript/dist/index.js delete mode 100644 asset-transfer-abac/chaincode-typescript/dist/index.js.map create mode 100644 asset-transfer-basic/chaincode-java/.gitattributes create mode 100644 asset-transfer-basic/chaincode-java/config/checkstyle/checkstyle.xml create mode 100644 asset-transfer-basic/chaincode-java/config/checkstyle/suppressions.xml rename asset-transfer-basic/{chaincode-java => java}/.fabricignore (100%) rename asset-transfer-basic/{chaincode-java => java}/.gitignore (100%) create mode 100644 asset-transfer-basic/java/build.gradle create mode 100644 asset-transfer-basic/java/gradle/wrapper/gradle-wrapper.jar create mode 100644 asset-transfer-basic/java/gradle/wrapper/gradle-wrapper.properties create mode 100755 asset-transfer-basic/java/gradlew create mode 100644 asset-transfer-basic/java/gradlew.bat create mode 100644 asset-transfer-basic/java/settings.gradle create mode 100644 asset-transfer-basic/java/src/main/java/org/example/Asset.java create mode 100644 asset-transfer-basic/java/src/main/java/org/example/AssetTransfer.java rename asset-transfer-basic/{chaincode-java => java}/transaction_data/my-asset-transactions.txdata (100%) delete mode 100644 asset-transfer-events/chaincode-java/.classpath delete mode 100644 asset-transfer-events/chaincode-java/.settings/org.eclipse.buildship.core.prefs delete mode 100644 asset-transfer-events/chaincode-java/bin/main/org/hyperledger/fabric/samples/events/Asset.class delete mode 100644 asset-transfer-events/chaincode-java/bin/main/org/hyperledger/fabric/samples/events/AssetTransfer$AssetTransferErrors.class delete mode 100644 asset-transfer-events/chaincode-java/bin/main/org/hyperledger/fabric/samples/events/AssetTransfer.class delete mode 100644 asset-transfer-events/chaincode-typescript/dist/asset-contract.d.ts delete mode 100644 asset-transfer-events/chaincode-typescript/dist/asset-contract.js delete mode 100644 asset-transfer-events/chaincode-typescript/dist/asset-contract.js.map delete mode 100644 asset-transfer-events/chaincode-typescript/dist/asset.d.ts delete mode 100644 asset-transfer-events/chaincode-typescript/dist/asset.js delete mode 100644 asset-transfer-events/chaincode-typescript/dist/asset.js.map delete mode 100644 asset-transfer-events/chaincode-typescript/dist/index.d.ts delete mode 100644 asset-transfer-events/chaincode-typescript/dist/index.js delete mode 100644 asset-transfer-events/chaincode-typescript/dist/index.js.map delete mode 100644 asset-transfer-ledger-queries/application-java/.classpath delete mode 100644 asset-transfer-ledger-queries/application-java/.settings/org.eclipse.buildship.core.prefs delete mode 100644 asset-transfer-ledger-queries/application-java/bin/main/application/java/App.class delete mode 100644 asset-transfer-ledger-queries/application-java/bin/main/application/java/EnrollAdmin.class delete mode 100644 asset-transfer-ledger-queries/application-java/bin/main/application/java/RegisterUser.class delete mode 100644 asset-transfer-ledger-queries/application-java/bin/main/log4j.properties delete mode 100644 asset-transfer-ledger-queries/chaincode-java/.classpath delete mode 100644 asset-transfer-ledger-queries/chaincode-java/.settings/org.eclipse.buildship.core.prefs delete mode 100644 asset-transfer-ledger-queries/chaincode-java/.settings/org.eclipse.jdt.core.prefs delete mode 100644 asset-transfer-ledger-queries/chaincode-java/bin/main/org/example/Asset.class delete mode 100644 asset-transfer-ledger-queries/chaincode-java/bin/main/org/example/AssetContract$1$1.class delete mode 100644 asset-transfer-ledger-queries/chaincode-java/bin/main/org/example/AssetContract$1.class delete mode 100644 asset-transfer-ledger-queries/chaincode-java/bin/main/org/example/AssetContract$2.class delete mode 100644 asset-transfer-ledger-queries/chaincode-java/bin/main/org/example/AssetContract$3.class delete mode 100644 asset-transfer-ledger-queries/chaincode-java/bin/main/org/example/AssetContract$4.class delete mode 100644 asset-transfer-ledger-queries/chaincode-java/bin/main/org/example/AssetContract$5.class delete mode 100644 asset-transfer-ledger-queries/chaincode-java/bin/main/org/example/AssetContract$AssetTransferErrors.class delete mode 100644 asset-transfer-ledger-queries/chaincode-java/bin/main/org/example/AssetContract.class delete mode 100644 asset-transfer-ledger-queries/chaincode-typescript/dist/asset-contract.d.ts delete mode 100644 asset-transfer-ledger-queries/chaincode-typescript/dist/asset-contract.js delete mode 100644 asset-transfer-ledger-queries/chaincode-typescript/dist/asset-contract.js.map delete mode 100644 asset-transfer-ledger-queries/chaincode-typescript/dist/asset.d.ts delete mode 100644 asset-transfer-ledger-queries/chaincode-typescript/dist/asset.js delete mode 100644 asset-transfer-ledger-queries/chaincode-typescript/dist/asset.js.map delete mode 100644 asset-transfer-ledger-queries/chaincode-typescript/dist/index.d.ts delete mode 100644 asset-transfer-ledger-queries/chaincode-typescript/dist/index.js delete mode 100644 asset-transfer-ledger-queries/chaincode-typescript/dist/index.js.map delete mode 100644 asset-transfer-private-data/chaincode-java/.classpath delete mode 100644 asset-transfer-private-data/chaincode-java/.settings/org.eclipse.buildship.core.prefs delete mode 100644 asset-transfer-private-data/chaincode-java/bin/main/org/hyperledger/fabric/samples/privatedata/Asset.class delete mode 100644 asset-transfer-private-data/chaincode-java/bin/main/org/hyperledger/fabric/samples/privatedata/AssetPrivateDetails.class delete mode 100644 asset-transfer-private-data/chaincode-java/bin/main/org/hyperledger/fabric/samples/privatedata/AssetTransfer$AssetTransferErrors.class delete mode 100644 asset-transfer-private-data/chaincode-java/bin/main/org/hyperledger/fabric/samples/privatedata/AssetTransfer.class delete mode 100644 asset-transfer-private-data/chaincode-java/bin/main/org/hyperledger/fabric/samples/privatedata/TransferAgreement.class delete mode 100644 asset-transfer-private-data/chaincode-java/bin/test/mockito-extensions/org.mockito.plugins.MockMaker delete mode 100644 asset-transfer-private-data/chaincode-java/bin/test/org/hyperledger/fabric/samples/privatedata/AssetTransferTest$InvokeWriteTransaction.class delete mode 100644 asset-transfer-private-data/chaincode-java/bin/test/org/hyperledger/fabric/samples/privatedata/AssetTransferTest$QueryReadAssetTransaction.class delete mode 100644 asset-transfer-private-data/chaincode-java/bin/test/org/hyperledger/fabric/samples/privatedata/AssetTransferTest.class delete mode 100755 asset-transfer-private-data/chaincode-javascript/.editorconfig delete mode 100644 asset-transfer-private-data/chaincode-javascript/.eslintignore delete mode 100644 asset-transfer-private-data/chaincode-javascript/.eslintrc.js delete mode 100644 asset-transfer-private-data/chaincode-javascript/.gitignore delete mode 100644 asset-transfer-private-data/chaincode-javascript/.npmignore delete mode 100644 asset-transfer-private-data/chaincode-javascript/index.js delete mode 100644 asset-transfer-private-data/chaincode-javascript/lib/asset-contract.js delete mode 100644 asset-transfer-private-data/chaincode-javascript/package.json delete mode 100644 asset-transfer-private-data/chaincode-javascript/test/asset-contract.js delete mode 100644 asset-transfer-private-data/chaincode-javascript/transaction_data/asset-transactions.txdata delete mode 100644 asset-transfer-sbe/chaincode-go/asset-contract.go delete mode 100644 asset-transfer-sbe/chaincode-go/asset.go delete mode 100644 asset-transfer-sbe/chaincode-go/go.mod delete mode 100644 asset-transfer-sbe/chaincode-go/go.sum delete mode 100644 asset-transfer-sbe/chaincode-go/main.go delete mode 100644 asset-transfer-sbe/chaincode-go/transaction_data/my-transactions.txdata delete mode 100755 asset-transfer-sbe/chaincode-javascript/.editorconfig delete mode 100644 asset-transfer-sbe/chaincode-javascript/.eslintignore delete mode 100644 asset-transfer-sbe/chaincode-javascript/.eslintrc.js delete mode 100644 asset-transfer-sbe/chaincode-javascript/.gitignore delete mode 100644 asset-transfer-sbe/chaincode-javascript/.npmignore delete mode 100644 asset-transfer-sbe/chaincode-javascript/index.js delete mode 100644 asset-transfer-sbe/chaincode-javascript/lib/asset-contract.js delete mode 100644 asset-transfer-sbe/chaincode-javascript/package.json delete mode 100644 asset-transfer-sbe/chaincode-javascript/test/asset-contract.js delete mode 100644 asset-transfer-sbe/chaincode-javascript/transaction_data/asset-transactions.txdata delete mode 100644 commercial-paper/organization/magnetocorp/application-java/.classpath delete mode 100644 commercial-paper/organization/magnetocorp/application-java/.settings/org.eclipse.jdt.apt.core.prefs delete mode 100644 commercial-paper/organization/magnetocorp/contract-java/.classpath delete mode 100644 commercial-paper/organization/magnetocorp/contract-java/.settings/org.eclipse.jdt.core.prefs delete mode 100644 commercial-paper/organization/magnetocorp/contract-java/bin/main/org/example/CommercialPaper.class delete mode 100644 commercial-paper/organization/magnetocorp/contract-java/bin/main/org/example/CommercialPaperContext.class delete mode 100644 commercial-paper/organization/magnetocorp/contract-java/bin/main/org/example/CommercialPaperContract.class delete mode 100644 commercial-paper/organization/magnetocorp/contract-java/bin/main/org/example/PaperList.class delete mode 100644 commercial-paper/organization/magnetocorp/contract-java/bin/main/org/example/ledgerapi/State.class delete mode 100644 commercial-paper/organization/magnetocorp/contract-java/bin/main/org/example/ledgerapi/StateDeserializer.class delete mode 100644 commercial-paper/organization/magnetocorp/contract-java/bin/main/org/example/ledgerapi/StateList.class delete mode 100644 commercial-paper/organization/magnetocorp/contract-java/bin/main/org/example/ledgerapi/impl/StateListImpl.class diff --git a/asset-transfer-abac/chaincode-java/.classpath b/asset-transfer-abac/chaincode-java/.classpath deleted file mode 100644 index 7a7f31fe..00000000 --- a/asset-transfer-abac/chaincode-java/.classpath +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/asset-transfer-abac/chaincode-java/.settings/org.eclipse.buildship.core.prefs b/asset-transfer-abac/chaincode-java/.settings/org.eclipse.buildship.core.prefs deleted file mode 100644 index 98515123..00000000 --- a/asset-transfer-abac/chaincode-java/.settings/org.eclipse.buildship.core.prefs +++ /dev/null @@ -1,13 +0,0 @@ -arguments= -auto.sync=false -build.scans.enabled=false -connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) -connection.project.dir= -eclipse.preferences.version=1 -gradle.user.home= -java.home=/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home -jvm.arguments= -offline.mode=false -override.workspace.settings=true -show.console.view=true -show.executions.view=true diff --git a/asset-transfer-abac/chaincode-java/.settings/org.eclipse.jdt.core.prefs b/asset-transfer-abac/chaincode-java/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 35068d95..00000000 --- a/asset-transfer-abac/chaincode-java/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/asset-transfer-abac/chaincode-java/bin/main/org/example/Asset.class b/asset-transfer-abac/chaincode-java/bin/main/org/example/Asset.class deleted file mode 100644 index 38f6ef82d34f1c2447e4e3aaacb82c88d43c20d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2052 zcmdT^T~8B16unbQKUM@+H0Mf6PP^ zefLKh@3aDiPSnOH9y&Ysqi4=Ncjo^1`Q;k`Jc0EzBpBqBZkO?+2qGWL8*z*#4M_&G z2cjp+z6jgp?ZyE%4TH3>(drh1eC;f{YqSj86$VRhyP=T*R>Pi*Wy8mfFjPhuslu3n zSKHAlLT!#Ib+V~^r5Pk+`3V`YD!J5Ah~%0UQKW^8v9%}sE(N_dnm#Ri@O+`@Iy$+j zT9}4BgPAj8FSS-W1M>`4-h~=t<@d0~n<|K;-)F@mt%zpulzSfJ;Mx={!gU6zXEK!L zIfI45=vl=*I-@2-eA5jYsOy3NtRAW<{5_$iwSPO4rX#8Fx!Q=pq(FwM+8l_GrtNND zhlxUwl(3=gffzYk`vpBJ4pyT)s}7gtzIw4qJ3@;94eE2>&TPGdTn3TShEw&W&M|e~$5tCPZwh-Ycmw%KPyQ#J+F4RZzC1)H@Rl&5PKP^! z+$b)%p`e#NDfAMj4fpFWWn7|E2Fn*OtZnDHyPCoeUE$M9JNI4(L#tAJPYDI=MC#cnl0CXj)D}o_;B^(q!3hhQ4{oI(!~n z8OfV+O9f0>0a{KwY&#>^FtOVSk)iMC!aFf=lK^82*EwUKg z9s^<3iEsy&3FqH96r2cr3=V5fgq1NktUD1F;qFisDbi-3)eBb~F8V;OjRW(Xnu&`25yH(4j+BlnJ!P$-0>(c%* zB#_|F@8OIXJE@w8fSp67R_(>($LDVzyR(|_=kKrI0pJxp$-@+Z7gDv$?1XlE0V`L+ zkZDg*5w@6mI`U*GB~_S*X##T}=`k$_RJ6;Mh`I#kE3RvKNA(@=XnSX`UL#O;CZb&@ zu-NCQIJ;J*c6ekR*skXiSgJaeQ9n5TS!SyDAxQpQqu_Oz$-6zN zw2A4gbxwOs1+3X-%JiuaQkxBCp0V7(Zz|Iq*#x+)*5v1ae_~^|OH~T3sISL-G_^FT zsd2v<1zWUa3dG?)6X7^7!$h&abayq@qEV0*)LHDd&`hz@C` zY?zB-&C-qi11}5m8uabN%aEmRm!ra0C(?-*A=8m`F|1dos_!GFPIp;|b4F<60711J zH&GAI2JhJEJ`JL@IU^%1(<)^GU6P__95D1W^y+@z&}e D?|4v5 diff --git a/asset-transfer-abac/chaincode-java/bin/main/org/example/AssetTransfer.class b/asset-transfer-abac/chaincode-java/bin/main/org/example/AssetTransfer.class deleted file mode 100644 index 1b2142ff2a965b81548b321dded8d47ae25d18c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7869 zcmeHMTXWk)6h51}k*v6+7s{o9R@D)jvsxSb zo&Ufa@B9L0UWe_o0w1j>0ypxHkk}rwZ^0yP$44aR+u|LIq80)nd&|#K(|_qz6<%c zOzSSCNGM4IrTNoUkxN~L{^sO8u^nY}@p*tjpqphcP%>ZkbgOKew!$o-2C{oXF}Y2H zthswZnz0O{PHASqWhAjW9E5wtwFGPPqs$v6NM-k}-d2(08p9 zu%>~)BM+E#g-!bU$Kx>LK{biSUcxi!IRSAyvKdVD_H=0Y=tw%U5sXsOcuI}nfMpiQF^pq&wu*7h{f!P9BaF)Qud4HD| zm6hb8wv_OuS)U8`d8<)jax*E72%Pt$fQDQBQmOwkr|LW=Fy|l0-H?*alq92yrIe1q z>b&2tvX+LY9)9C_3&Y?DI=9ghiZ_@i+C1hc;YvcqQuc-do$>dWBw>Xd>pG!qm?NZY z!ub;Bc~W1d)WakK2wZv69-BCLpH1=`j8^+jaPu%H&>7qYmyoNIZ8UO2rNLzPw2g+}Ad|N#L*JWH{V$(+w9t*7h^}-NSr$c$?Sf{30Qpxm9U!rLe>=g&eD4uZlOWx;DH|;P0bj zI>S^?z$r&98L)di#R&0)V6qfaJgtf?xI^H^fkf!~zWLK5C=99#nzt5|2v~iRWWgGN zbIC&@<<6IO3)Yd<^foh;<1-$|XxF6Xj^S;<(=R+&L(T@LVH#U`Y+GRCJ)a)9ox&D? z^D8)CoiF?h&-{*0Q*aLN)4hLiBtW6xz5vhS6KVmTL)_>4yA|N6$81iYOvb|*w^7z)SONyyK=v#!TwQ$O<*1t zGPUrA2JH_G+LIc73vL{Mo!imyq6YgP1MHjVb9&F1+QEKDgZ; - ReadAsset(ctx: Context, id: string): Promise; - UpdateAsset(ctx: Context, id: string, color: string, size: number, appraisedValue: number): Promise; - DeleteAsset(ctx: Context, id: string): Promise; - AssetExists(ctx: Context, id: string): Promise; - TransferAsset(ctx: Context, id: string, newOwner: string): Promise; - GetAllAssets(ctx: Context): Promise; - GetSubmittingClientIdentity(ctx: Context): Promise; -} diff --git a/asset-transfer-abac/chaincode-typescript/dist/asset-contract.js b/asset-transfer-abac/chaincode-typescript/dist/asset-contract.js deleted file mode 100644 index 798e1431..00000000 --- a/asset-transfer-abac/chaincode-typescript/dist/asset-contract.js +++ /dev/null @@ -1,186 +0,0 @@ -"use strict"; -/* - * SPDX-License-Identifier: Apache-2.0 - */ -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (this && this.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AssetTransferContract = void 0; -const fabric_contract_api_1 = require("fabric-contract-api"); -const fabric_shim_1 = require("fabric-shim"); -let AssetTransferContract = class AssetTransferContract extends fabric_contract_api_1.Contract { - // CreateAsset issues a new asset to the world state with given details. - async CreateAsset(ctx, id, color, size, appraisedValue) { - let err = new fabric_shim_1.ClientIdentity(ctx.stub).assertAttributeValue("abac.creator", "true"); // "stub" is the ChaincodeStub object passed to Init() and Invoke() methods - if (!err) { - throw new Error("Client not autorized, set abac.creature=true"); - } - const exists = await this.AssetExists(ctx, id); - if (exists) { - throw new Error(`The asset ${id} already exists`); - } - const clientID = this.GetSubmittingClientIdentity(ctx); - const asset = { - ID: id, - Color: color, - Size: size, - Owner: clientID, - AppraisedValue: appraisedValue, - }; - await ctx.stub.putState(id, Buffer.from(JSON.stringify(asset))); - } - // ReadAsset returns the asset stored in the world state with given id. - async ReadAsset(ctx, id) { - const assetJSON = await ctx.stub.getState(id); // get the asset from chaincode state - if (!assetJSON || assetJSON.length === 0) { - throw new Error(`The asset ${id} does not exist`); - } - return assetJSON.toString(); - } - // UpdateAsset updates an existing asset in the world state with provided parameters. - async UpdateAsset(ctx, id, color, size, appraisedValue) { - const exists = await this.AssetExists(ctx, id); - if (!exists) { - throw new Error(`The asset ${id} does not exist`); - } - const clientID = this.GetSubmittingClientIdentity(ctx); - const assetString = await this.ReadAsset(ctx, id); - const asset = JSON.parse(assetString); - if (clientID != asset.getOwner()) { - throw new Error("Client not autorized, set abac.creature=true"); - } - // overwriting original asset with new asset - const updatedAsset = { - ID: id, - Color: color, - Size: size, - Owner: clientID, - AppraisedValue: appraisedValue, - }; - return ctx.stub.putState(id, Buffer.from(JSON.stringify(updatedAsset))); - } - // DeleteAsset deletes an given asset from the world state. - async DeleteAsset(ctx, id) { - const exists = await this.AssetExists(ctx, id); - if (!exists) { - throw new Error(`The asset ${id} does not exist`); - } - const clientID = this.GetSubmittingClientIdentity(ctx); - const assetString = await this.ReadAsset(ctx, id); - const asset = JSON.parse(assetString); - if (clientID != asset.getOwner()) { - throw new Error("Client not autorized, set abac.creature=true"); - } - return ctx.stub.deleteState(id); - } - // AssetExists returns true when asset with given ID exists in world state. - async AssetExists(ctx, id) { - const assetJSON = await ctx.stub.getState(id); - return assetJSON && assetJSON.length > 0; - } - // TransferAsset updates the owner field of asset with given id in the world state. - async TransferAsset(ctx, id, newOwner) { - const assetString = await this.ReadAsset(ctx, id); - const asset = JSON.parse(assetString); - const clientID = this.GetSubmittingClientIdentity(ctx); - if (clientID != asset.getOwner()) { - throw new Error("Client not autorized, set abac.creature=true"); - } - asset.Owner = newOwner; - await ctx.stub.putState(id, Buffer.from(JSON.stringify(asset))); - } - // GetAllAssets returns all assets found in the world state. - async GetAllAssets(ctx) { - const allResults = []; - // range query with empty string for startKey and endKey does an open-ended query of all assets in the chaincode namespace. - const iterator = await ctx.stub.getStateByRange('', ''); - let result = await iterator.next(); - while (!result.done) { - const strValue = Buffer.from(result.value.value.toString()).toString('utf8'); - let record; - try { - record = JSON.parse(strValue); - } - catch (err) { - console.log(err); - record = strValue; - } - allResults.push({ Key: result.value.key, Record: record }); - result = await iterator.next(); - } - return JSON.stringify(allResults); - } - // GetSubmittingClientIdentity returns the name and issuer of the identity that - // invokes the smart contract. This function base64 decodes the identity string - // before returning the value to the client or smart contract. - async GetSubmittingClientIdentity(ctx) { - const b64ID = new fabric_shim_1.ClientIdentity(ctx.stub).getID(); - if (b64ID == null) { - throw new Error("failed to retrieve Client ID"); - } - const decodeID = atob(b64ID); - return String(decodeID); - } -}; -__decorate([ - fabric_contract_api_1.Transaction(), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String, String, Number, Number]), - __metadata("design:returntype", Promise) -], AssetTransferContract.prototype, "CreateAsset", null); -__decorate([ - fabric_contract_api_1.Transaction(false), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String]), - __metadata("design:returntype", Promise) -], AssetTransferContract.prototype, "ReadAsset", null); -__decorate([ - fabric_contract_api_1.Transaction(), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String, String, Number, Number]), - __metadata("design:returntype", Promise) -], AssetTransferContract.prototype, "UpdateAsset", null); -__decorate([ - fabric_contract_api_1.Transaction(), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String]), - __metadata("design:returntype", Promise) -], AssetTransferContract.prototype, "DeleteAsset", null); -__decorate([ - fabric_contract_api_1.Transaction(false), - fabric_contract_api_1.Returns('boolean'), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String]), - __metadata("design:returntype", Promise) -], AssetTransferContract.prototype, "AssetExists", null); -__decorate([ - fabric_contract_api_1.Transaction(), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String, String]), - __metadata("design:returntype", Promise) -], AssetTransferContract.prototype, "TransferAsset", null); -__decorate([ - fabric_contract_api_1.Transaction(false), - fabric_contract_api_1.Returns('string'), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context]), - __metadata("design:returntype", Promise) -], AssetTransferContract.prototype, "GetAllAssets", null); -__decorate([ - fabric_contract_api_1.Transaction(false), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context]), - __metadata("design:returntype", Promise) -], AssetTransferContract.prototype, "GetSubmittingClientIdentity", null); -AssetTransferContract = __decorate([ - fabric_contract_api_1.Info({ title: 'AssetTransfer', description: 'Smart contract for trading assets' }) -], AssetTransferContract); -exports.AssetTransferContract = AssetTransferContract; -//# sourceMappingURL=asset-contract.js.map \ No newline at end of file diff --git a/asset-transfer-abac/chaincode-typescript/dist/asset-contract.js.map b/asset-transfer-abac/chaincode-typescript/dist/asset-contract.js.map deleted file mode 100644 index f2439eec..00000000 --- a/asset-transfer-abac/chaincode-typescript/dist/asset-contract.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"asset-contract.js","sourceRoot":"","sources":["../src/asset-contract.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/asset-transfer-abac/chaincode-typescript/dist/asset.d.ts b/asset-transfer-abac/chaincode-typescript/dist/asset.d.ts deleted file mode 100644 index 76258663..00000000 --- a/asset-transfer-abac/chaincode-typescript/dist/asset.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -export declare class Asset { - docType?: string; - ID: string; - Color: string; - Size: number; - Owner: string; - AppraisedValue: number; -} diff --git a/asset-transfer-abac/chaincode-typescript/dist/asset.js b/asset-transfer-abac/chaincode-typescript/dist/asset.js deleted file mode 100644 index 959731c8..00000000 --- a/asset-transfer-abac/chaincode-typescript/dist/asset.js +++ /dev/null @@ -1,47 +0,0 @@ -"use strict"; -/* - SPDX-License-Identifier: Apache-2.0 -*/ -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (this && this.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Asset = void 0; -const fabric_contract_api_1 = require("fabric-contract-api"); -let Asset = class Asset { -}; -__decorate([ - fabric_contract_api_1.Property(), - __metadata("design:type", String) -], Asset.prototype, "docType", void 0); -__decorate([ - fabric_contract_api_1.Property(), - __metadata("design:type", String) -], Asset.prototype, "ID", void 0); -__decorate([ - fabric_contract_api_1.Property(), - __metadata("design:type", String) -], Asset.prototype, "Color", void 0); -__decorate([ - fabric_contract_api_1.Property(), - __metadata("design:type", Number) -], Asset.prototype, "Size", void 0); -__decorate([ - fabric_contract_api_1.Property(), - __metadata("design:type", String) -], Asset.prototype, "Owner", void 0); -__decorate([ - fabric_contract_api_1.Property(), - __metadata("design:type", Number) -], Asset.prototype, "AppraisedValue", void 0); -Asset = __decorate([ - fabric_contract_api_1.Object() -], Asset); -exports.Asset = Asset; -//# sourceMappingURL=asset.js.map \ No newline at end of file diff --git a/asset-transfer-abac/chaincode-typescript/dist/asset.js.map b/asset-transfer-abac/chaincode-typescript/dist/asset.js.map deleted file mode 100644 index 4ea75c0b..00000000 --- a/asset-transfer-abac/chaincode-typescript/dist/asset.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"asset.js","sourceRoot":"","sources":["../src/asset.ts"],"names":[],"mappings":";AAAA;;EAEE;;;;;;;;;;;;AAEF,6DAAqD;AAGrD,IAAa,KAAK,GAAlB,MAAa,KAAK;CAkBjB,CAAA;AAhBG;IADC,8BAAQ,EAAE;;sCACa;AAGxB;IADC,8BAAQ,EAAE;;iCACO;AAGlB;IADC,8BAAQ,EAAE;;oCACU;AAGrB;IADC,8BAAQ,EAAE;;mCACS;AAGpB;IADC,8BAAQ,EAAE;;oCACU;AAGrB;IADC,8BAAQ,EAAE;;6CACmB;AAjBrB,KAAK;IADjB,4BAAM,EAAE;GACI,KAAK,CAkBjB;AAlBY,sBAAK"} \ No newline at end of file diff --git a/asset-transfer-abac/chaincode-typescript/dist/assetTransfer.d.ts b/asset-transfer-abac/chaincode-typescript/dist/assetTransfer.d.ts deleted file mode 100644 index 0476f4e5..00000000 --- a/asset-transfer-abac/chaincode-typescript/dist/assetTransfer.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Context, Contract } from 'fabric-contract-api'; -export declare class AssetTransferContract extends Contract { - CreateAsset(ctx: Context, id: string, color: string, size: number, appraisedValue: number): Promise; - ReadAsset(ctx: Context, id: string): Promise; - UpdateAsset(ctx: Context, id: string, color: string, size: number, appraisedValue: number): Promise; - DeleteAsset(ctx: Context, id: string): Promise; - AssetExists(ctx: Context, id: string): Promise; - TransferAsset(ctx: Context, id: string, newOwner: string): Promise; - GetAllAssets(ctx: Context): Promise; - GetSubmittingClientIdentity(ctx: Context): Promise; -} diff --git a/asset-transfer-abac/chaincode-typescript/dist/assetTransfer.js b/asset-transfer-abac/chaincode-typescript/dist/assetTransfer.js deleted file mode 100644 index ac1b3891..00000000 --- a/asset-transfer-abac/chaincode-typescript/dist/assetTransfer.js +++ /dev/null @@ -1,186 +0,0 @@ -"use strict"; -/* - * SPDX-License-Identifier: Apache-2.0 - */ -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (this && this.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AssetTransferContract = void 0; -const fabric_contract_api_1 = require("fabric-contract-api"); -const fabric_shim_1 = require("fabric-shim"); -let AssetTransferContract = class AssetTransferContract extends fabric_contract_api_1.Contract { - // CreateAsset issues a new asset to the world state with given details. - async CreateAsset(ctx, id, color, size, appraisedValue) { - let err = new fabric_shim_1.ClientIdentity(ctx.stub).assertAttributeValue("abac.creator", "true"); // "stub" is the ChaincodeStub object passed to Init() and Invoke() methods - if (!err) { - throw new Error("Client not autorized, set abac.creature=true"); - } - const exists = await this.AssetExists(ctx, id); - if (exists) { - throw new Error(`The asset ${id} already exists`); - } - const clientID = this.GetSubmittingClientIdentity(ctx); - const asset = { - ID: id, - Color: color, - Size: size, - Owner: clientID, - AppraisedValue: appraisedValue, - }; - await ctx.stub.putState(id, Buffer.from(JSON.stringify(asset))); - } - // ReadAsset returns the asset stored in the world state with given id. - async ReadAsset(ctx, id) { - const assetJSON = await ctx.stub.getState(id); // get the asset from chaincode state - if (!assetJSON || assetJSON.length === 0) { - throw new Error(`The asset ${id} does not exist`); - } - return assetJSON.toString(); - } - // UpdateAsset updates an existing asset in the world state with provided parameters. - async UpdateAsset(ctx, id, color, size, appraisedValue) { - const exists = await this.AssetExists(ctx, id); - if (!exists) { - throw new Error(`The asset ${id} does not exist`); - } - const clientID = this.GetSubmittingClientIdentity(ctx); - const assetString = await this.ReadAsset(ctx, id); - const asset = JSON.parse(assetString); - if (clientID != asset.getOwner()) { - throw new Error("Client not autorized, set abac.creature=true"); - } - // overwriting original asset with new asset - const updatedAsset = { - ID: id, - Color: color, - Size: size, - Owner: clientID, - AppraisedValue: appraisedValue, - }; - return ctx.stub.putState(id, Buffer.from(JSON.stringify(updatedAsset))); - } - // DeleteAsset deletes an given asset from the world state. - async DeleteAsset(ctx, id) { - const exists = await this.AssetExists(ctx, id); - if (!exists) { - throw new Error(`The asset ${id} does not exist`); - } - const clientID = this.GetSubmittingClientIdentity(ctx); - const assetString = await this.ReadAsset(ctx, id); - const asset = JSON.parse(assetString); - if (clientID != asset.getOwner()) { - throw new Error("Client not autorized, set abac.creature=true"); - } - return ctx.stub.deleteState(id); - } - // AssetExists returns true when asset with given ID exists in world state. - async AssetExists(ctx, id) { - const assetJSON = await ctx.stub.getState(id); - return assetJSON && assetJSON.length > 0; - } - // TransferAsset updates the owner field of asset with given id in the world state. - async TransferAsset(ctx, id, newOwner) { - const assetString = await this.ReadAsset(ctx, id); - const asset = JSON.parse(assetString); - const clientID = this.GetSubmittingClientIdentity(ctx); - if (clientID != asset.getOwner()) { - throw new Error("Client not autorized, set abac.creature=true"); - } - asset.Owner = newOwner; - await ctx.stub.putState(id, Buffer.from(JSON.stringify(asset))); - } - // GetAllAssets returns all assets found in the world state. - async GetAllAssets(ctx) { - const allResults = []; - // range query with empty string for startKey and endKey does an open-ended query of all assets in the chaincode namespace. - const iterator = await ctx.stub.getStateByRange('', ''); - let result = await iterator.next(); - while (!result.done) { - const strValue = Buffer.from(result.value.value.toString()).toString('utf8'); - let record; - try { - record = JSON.parse(strValue); - } - catch (err) { - console.log(err); - record = strValue; - } - allResults.push({ Key: result.value.key, Record: record }); - result = await iterator.next(); - } - return JSON.stringify(allResults); - } - // GetSubmittingClientIdentity returns the name and issuer of the identity that - // invokes the smart contract. This function base64 decodes the identity string - // before returning the value to the client or smart contract. - async GetSubmittingClientIdentity(ctx) { - const b64ID = new fabric_shim_1.ClientIdentity(ctx.stub).getID(); - if (b64ID == null) { - throw new Error("failed to retrieve Client ID"); - } - const decodeID = atob(b64ID); - return String(decodeID); - } -}; -__decorate([ - fabric_contract_api_1.Transaction(), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String, String, Number, Number]), - __metadata("design:returntype", Promise) -], AssetTransferContract.prototype, "CreateAsset", null); -__decorate([ - fabric_contract_api_1.Transaction(false), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String]), - __metadata("design:returntype", Promise) -], AssetTransferContract.prototype, "ReadAsset", null); -__decorate([ - fabric_contract_api_1.Transaction(), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String, String, Number, Number]), - __metadata("design:returntype", Promise) -], AssetTransferContract.prototype, "UpdateAsset", null); -__decorate([ - fabric_contract_api_1.Transaction(), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String]), - __metadata("design:returntype", Promise) -], AssetTransferContract.prototype, "DeleteAsset", null); -__decorate([ - fabric_contract_api_1.Transaction(false), - fabric_contract_api_1.Returns('boolean'), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String]), - __metadata("design:returntype", Promise) -], AssetTransferContract.prototype, "AssetExists", null); -__decorate([ - fabric_contract_api_1.Transaction(), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String, String]), - __metadata("design:returntype", Promise) -], AssetTransferContract.prototype, "TransferAsset", null); -__decorate([ - fabric_contract_api_1.Transaction(false), - fabric_contract_api_1.Returns('string'), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context]), - __metadata("design:returntype", Promise) -], AssetTransferContract.prototype, "GetAllAssets", null); -__decorate([ - fabric_contract_api_1.Transaction(false), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context]), - __metadata("design:returntype", Promise) -], AssetTransferContract.prototype, "GetSubmittingClientIdentity", null); -AssetTransferContract = __decorate([ - fabric_contract_api_1.Info({ title: 'AssetTransfer', description: 'Smart contract for trading assets' }) -], AssetTransferContract); -exports.AssetTransferContract = AssetTransferContract; -//# sourceMappingURL=assetTransfer.js.map \ No newline at end of file diff --git a/asset-transfer-abac/chaincode-typescript/dist/assetTransfer.js.map b/asset-transfer-abac/chaincode-typescript/dist/assetTransfer.js.map deleted file mode 100644 index 4b44feb5..00000000 --- a/asset-transfer-abac/chaincode-typescript/dist/assetTransfer.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"assetTransfer.js","sourceRoot":"","sources":["../src/assetTransfer.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/asset-transfer-abac/chaincode-typescript/dist/index.d.ts b/asset-transfer-abac/chaincode-typescript/dist/index.d.ts deleted file mode 100644 index 277788eb..00000000 --- a/asset-transfer-abac/chaincode-typescript/dist/index.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { AssetTransferContract } from './assetTransfer'; -export declare const contracts: any[]; diff --git a/asset-transfer-abac/chaincode-typescript/dist/index.js b/asset-transfer-abac/chaincode-typescript/dist/index.js deleted file mode 100644 index 6d2f6aab..00000000 --- a/asset-transfer-abac/chaincode-typescript/dist/index.js +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; -/* - * SPDX-License-Identifier: Apache-2.0 - */ -Object.defineProperty(exports, "__esModule", { value: true }); -exports.contracts = void 0; -const assetTransfer_1 = require("./assetTransfer"); -var assetTransfer_2 = require("./assetTransfer"); -Object.defineProperty(exports, "AssetTransferContract", { enumerable: true, get: function () { return assetTransfer_2.AssetTransferContract; } }); -exports.contracts = [assetTransfer_1.AssetTransferContract]; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/asset-transfer-abac/chaincode-typescript/dist/index.js.map b/asset-transfer-abac/chaincode-typescript/dist/index.js.map deleted file mode 100644 index 611c4a00..00000000 --- a/asset-transfer-abac/chaincode-typescript/dist/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,mDAAwD;AACxD,iDAAwD;AAA/C,sHAAA,qBAAqB,OAAA;AAEjB,QAAA,SAAS,GAAU,CAAE,qCAAqB,CAAE,CAAC"} \ No newline at end of file diff --git a/asset-transfer-basic/chaincode-go/chaincode/smartcontract.go b/asset-transfer-basic/chaincode-go/chaincode/smartcontract.go index 8b3f725f..ced42c4c 100644 --- a/asset-transfer-basic/chaincode-go/chaincode/smartcontract.go +++ b/asset-transfer-basic/chaincode-go/chaincode/smartcontract.go @@ -16,7 +16,6 @@ type SmartContract struct { // Insert struct field in alphabetic order => to achieve determinism accross languages // golang keeps the order when marshal to json but doesn't order automatically -// The encoding/json package marshals maps in sorted key order and structs in the order that the fields are declared. type Asset struct { AppraisedValue int `json:"AppraisedValue"` Color string `json:"Color"` @@ -60,7 +59,7 @@ func (s *SmartContract) CreateAsset(ctx contractapi.TransactionContextInterface, if exists { return fmt.Errorf("the asset %s already exists", id) } - + asset := Asset{ ID: id, Color: color, @@ -186,4 +185,4 @@ func (s *SmartContract) GetAllAssets(ctx contractapi.TransactionContextInterface } return assets, nil -} +} \ No newline at end of file diff --git a/asset-transfer-basic/chaincode-java/.classpath b/asset-transfer-basic/chaincode-java/.classpath index 7a7f31fe..9f9cc9f1 100644 --- a/asset-transfer-basic/chaincode-java/.classpath +++ b/asset-transfer-basic/chaincode-java/.classpath @@ -13,7 +13,7 @@ - + diff --git a/asset-transfer-basic/chaincode-java/.gitattributes b/asset-transfer-basic/chaincode-java/.gitattributes new file mode 100644 index 00000000..00a51aff --- /dev/null +++ b/asset-transfer-basic/chaincode-java/.gitattributes @@ -0,0 +1,6 @@ +# +# https://help.github.com/articles/dealing-with-line-endings/ +# +# These are explicitly windows files and should use crlf +*.bat text eol=crlf + diff --git a/asset-transfer-basic/chaincode-java/bin/main/org/hyperledger/fabric/samples/assettransfer/AssetTransfer.class b/asset-transfer-basic/chaincode-java/bin/main/org/hyperledger/fabric/samples/assettransfer/AssetTransfer.class index 670bc35634d2637556496509b5bc201fb13fe02e..58279bfcb9fb4cb5a74a48cdac50000a96e94151 100644 GIT binary patch delta 2642 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 diff --git a/asset-transfer-basic/chaincode-java/build.gradle b/asset-transfer-basic/chaincode-java/build.gradle index aebae462..73c92a5c 100644 --- a/asset-transfer-basic/chaincode-java/build.gradle +++ b/asset-transfer-basic/chaincode-java/build.gradle @@ -1,32 +1,80 @@ /* * SPDX-License-Identifier: Apache-2.0 */ + plugins { - id 'com.github.johnrengelman.shadow' version '5.2.0' - id 'java' + id 'com.github.johnrengelman.shadow' version '5.1.0' + id 'application' + id 'checkstyle' + id 'jacoco' } -version '0.0.1' - -sourceCompatibility = 1.8 - -repositories { - mavenLocal() - mavenCentral() - maven { - url 'https://jitpack.io' - } -} +group 'org.hyperledger.fabric.samples' +version '1.0-SNAPSHOT' dependencies { implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.2.0' implementation 'com.owlike:genson:1.6' + implementation 'com.google.code.gson:gson:2.8.7' + implementation 'com.fasterxml.jackson.core:jackson-databind:2.8.9' implementation 'io.vertx:vertx-core:3.5.3' testImplementation 'org.junit.jupiter:junit-jupiter:5.4.2' testImplementation 'org.assertj:assertj-core:3.11.1' testImplementation 'org.mockito:mockito-core:2.+' } +repositories { + maven { + url "https://hyperledger.jfrog.io/hyperledger/fabric-maven" + } + jcenter() + maven { + url 'https://jitpack.io' + } +} + +application { + mainClass = 'org.hyperledger.fabric.contract.ContractRouter' +} + +checkstyle { + toolVersion '8.21' + configFile file("config/checkstyle/checkstyle.xml") +} + +checkstyleMain { + source ='src/main/java' +} + +checkstyleTest { + source ='src/test/java' +} + +jacocoTestReport { + dependsOn test +} + +jacocoTestCoverageVerification { + violationRules { + rule { + limit { + minimum = 0.9 + } + } + } + + finalizedBy jacocoTestReport +} + +test { + useJUnitPlatform() + testLogging { + events "passed", "skipped", "failed" + } +} + +mainClassName = 'org.hyperledger.fabric.contract.ContractRouter' + shadowJar { baseName = 'chaincode' version = null @@ -37,14 +85,5 @@ shadowJar { } } -test { - useJUnitPlatform() - testLogging { - events "passed", "skipped", "failed" - } -} - - -tasks.withType(JavaCompile) { - options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" << "-parameters" -} +check.dependsOn jacocoTestCoverageVerification +installDist.dependsOn check diff --git a/asset-transfer-basic/chaincode-java/config/checkstyle/checkstyle.xml b/asset-transfer-basic/chaincode-java/config/checkstyle/checkstyle.xml new file mode 100644 index 00000000..acd5df44 --- /dev/null +++ b/asset-transfer-basic/chaincode-java/config/checkstyle/checkstyle.xml @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/asset-transfer-basic/chaincode-java/config/checkstyle/suppressions.xml b/asset-transfer-basic/chaincode-java/config/checkstyle/suppressions.xml new file mode 100644 index 00000000..8c44b0a0 --- /dev/null +++ b/asset-transfer-basic/chaincode-java/config/checkstyle/suppressions.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/asset-transfer-basic/chaincode-java/gradle/wrapper/gradle-wrapper.jar b/asset-transfer-basic/chaincode-java/gradle/wrapper/gradle-wrapper.jar index f6b961fd5a86aa5fbfe90f707c3138408be7c718..5c2d1cf016b3885f6930543d57b744ea8c220a1a 100644 GIT binary patch literal 55616 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

<5G2M1WZP5 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 F{|7XC?P&l2 diff --git a/asset-transfer-basic/chaincode-java/gradle/wrapper/gradle-wrapper.properties b/asset-transfer-basic/chaincode-java/gradle/wrapper/gradle-wrapper.properties index 7c4388a9..bb8b2fc2 100644 --- a/asset-transfer-basic/chaincode-java/gradle/wrapper/gradle-wrapper.properties +++ b/asset-transfer-basic/chaincode-java/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/asset-transfer-basic/chaincode-java/gradlew b/asset-transfer-basic/chaincode-java/gradlew index cccdd3d5..83f2acfd 100755 --- a/asset-transfer-basic/chaincode-java/gradlew +++ b/asset-transfer-basic/chaincode-java/gradlew @@ -1,5 +1,21 @@ #!/usr/bin/env sh +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + ############################################################################## ## ## Gradle start up script for UN*X @@ -28,7 +44,7 @@ APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" @@ -109,8 +125,8 @@ if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` JAVACMD=`cygpath --unix "$JAVACMD"` diff --git a/asset-transfer-basic/chaincode-java/gradlew.bat b/asset-transfer-basic/chaincode-java/gradlew.bat index f9553162..9618d8d9 100644 --- a/asset-transfer-basic/chaincode-java/gradlew.bat +++ b/asset-transfer-basic/chaincode-java/gradlew.bat @@ -1,3 +1,19 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @@ -14,7 +30,7 @@ set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome diff --git a/asset-transfer-basic/chaincode-java/settings.gradle b/asset-transfer-basic/chaincode-java/settings.gradle index 2182e899..2633c4b9 100644 --- a/asset-transfer-basic/chaincode-java/settings.gradle +++ b/asset-transfer-basic/chaincode-java/settings.gradle @@ -1,5 +1,5 @@ /* * SPDX-License-Identifier: Apache-2.0 */ -rootProject.name = 'java' +rootProject.name = 'basic' diff --git a/asset-transfer-basic/chaincode-java/src/main/java/org/hyperledger/fabric/samples/assettransfer/Asset.java b/asset-transfer-basic/chaincode-java/src/main/java/org/hyperledger/fabric/samples/assettransfer/Asset.java index fb850f61..803f22fb 100644 --- a/asset-transfer-basic/chaincode-java/src/main/java/org/hyperledger/fabric/samples/assettransfer/Asset.java +++ b/asset-transfer-basic/chaincode-java/src/main/java/org/hyperledger/fabric/samples/assettransfer/Asset.java @@ -91,4 +91,3 @@ public final class Asset { + color + ", size=" + size + ", owner=" + owner + ", appraisedValue=" + appraisedValue + "]"; } } - diff --git a/asset-transfer-basic/chaincode-java/src/main/java/org/hyperledger/fabric/samples/assettransfer/AssetTransfer.java b/asset-transfer-basic/chaincode-java/src/main/java/org/hyperledger/fabric/samples/assettransfer/AssetTransfer.java index d115e993..798cfde5 100644 --- a/asset-transfer-basic/chaincode-java/src/main/java/org/hyperledger/fabric/samples/assettransfer/AssetTransfer.java +++ b/asset-transfer-basic/chaincode-java/src/main/java/org/hyperledger/fabric/samples/assettransfer/AssetTransfer.java @@ -6,6 +6,12 @@ package org.hyperledger.fabric.samples.assettransfer; import java.util.ArrayList; import java.util.List; +import java.util.TreeMap; +import java.util.Map; +import java.util.HashMap; + +import com.fasterxml.jackson.core.JsonProcessingException; +import java.io.IOException; import org.hyperledger.fabric.contract.Context; import org.hyperledger.fabric.contract.ContractInterface; @@ -18,8 +24,11 @@ import org.hyperledger.fabric.contract.annotation.Transaction; import org.hyperledger.fabric.shim.ChaincodeException; import org.hyperledger.fabric.shim.ChaincodeStub; import org.hyperledger.fabric.shim.ledger.KeyValue; -import org.hyperledger.fabric.shim.ledger.QueryResultsIterator; +import org.hyperledger.fabric.shim.ledger.QueryResultsIterator; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; import com.owlike.genson.Genson; @Contract( @@ -38,8 +47,8 @@ import com.owlike.genson.Genson; @Default public final class AssetTransfer implements ContractInterface { - //Genson library is a good tool for achieving JSON determinsm as it produces consistent JSON in alphabetic oreder. private final Genson genson = new Genson(); + private ObjectMapper om = new ObjectMapper().configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true);; private enum AssetTransferErrors { ASSET_NOT_FOUND, @@ -52,7 +61,7 @@ public final class AssetTransfer implements ContractInterface { * @param ctx the transaction context */ @Transaction(intent = Transaction.TYPE.SUBMIT) - public void InitLedger(final Context ctx) { + public void InitLedger(final Context ctx) throws JsonProcessingException{ ChaincodeStub stub = ctx.getStub(); CreateAsset(ctx, "asset1", "blue", 5, "Tomoko", 300); @@ -77,7 +86,7 @@ public final class AssetTransfer implements ContractInterface { */ @Transaction(intent = Transaction.TYPE.SUBMIT) public Asset CreateAsset(final Context ctx, final String assetID, final String color, final int size, - final String owner, final int appraisedValue) { + final String owner, final int appraisedValue) throws JsonProcessingException{ ChaincodeStub stub = ctx.getStub(); if (AssetExists(ctx, assetID)) { @@ -87,9 +96,10 @@ public final class AssetTransfer implements ContractInterface { } Asset asset = new Asset(assetID, color, size, owner, appraisedValue); - //Genson order automatically the JSON string alphabetically - String assetJSON = genson.serialize(asset); - stub.putStringState(assetID, assetJSON); + + //Use a Jackson ObjectMapper to conver the Asset into string, sort it alphabetically and serialize it into a json string + String sortedJson = om.writeValueAsString(asset); + stub.putStringState(assetID, sortedJson); return asset; } @@ -102,7 +112,7 @@ public final class AssetTransfer implements ContractInterface { * @return the asset found on the ledger if there was one */ @Transaction(intent = Transaction.TYPE.EVALUATE) - public Asset ReadAsset(final Context ctx, final String assetID) { + public Asset ReadAsset(final Context ctx, final String assetID) throws JsonProcessingException,IOException{ ChaincodeStub stub = ctx.getStub(); String assetJSON = stub.getStringState(assetID); @@ -111,7 +121,7 @@ public final class AssetTransfer implements ContractInterface { System.out.println(errorMessage); throw new ChaincodeException(errorMessage, AssetTransferErrors.ASSET_NOT_FOUND.toString()); } - + Asset asset = genson.deserialize(assetJSON, Asset.class); return asset; } @@ -129,7 +139,7 @@ public final class AssetTransfer implements ContractInterface { */ @Transaction(intent = Transaction.TYPE.SUBMIT) public Asset UpdateAsset(final Context ctx, final String assetID, final String color, final int size, - final String owner, final int appraisedValue) { + final String owner, final int appraisedValue) throws JsonProcessingException{ ChaincodeStub stub = ctx.getStub(); if (!AssetExists(ctx, assetID)) { @@ -139,9 +149,10 @@ public final class AssetTransfer implements ContractInterface { } Asset newAsset = new Asset(assetID, color, size, owner, appraisedValue); - //Genson order automatically the JSON string alphabetically - String newAssetJSON = genson.serialize(newAsset); - stub.putStringState(assetID, newAssetJSON); + + //Use a Jackson ObjectMapper to conver the Asset into string, sort it alphabetically and serialize it into a json string + String sortedJson = om.writeValueAsString(newAsset); + stub.putStringState(assetID, sortedJson); return newAsset; } @@ -189,7 +200,7 @@ public final class AssetTransfer implements ContractInterface { * @return the updated asset */ @Transaction(intent = Transaction.TYPE.SUBMIT) - public Asset TransferAsset(final Context ctx, final String assetID, final String newOwner) { + public Asset TransferAsset(final Context ctx, final String assetID, final String newOwner) throws JsonProcessingException{ ChaincodeStub stub = ctx.getStub(); String assetJSON = stub.getStringState(assetID); @@ -199,12 +210,13 @@ public final class AssetTransfer implements ContractInterface { throw new ChaincodeException(errorMessage, AssetTransferErrors.ASSET_NOT_FOUND.toString()); } + //Asset asset = gson.fromJson(assetJSON, Asset.class); Asset asset = genson.deserialize(assetJSON, Asset.class); - Asset newAsset = new Asset(asset.getAssetID(), asset.getColor(), asset.getSize(), newOwner, asset.getAppraisedValue()); - //Genson order automatically the JSON string alphabetically - String newAssetJSON = genson.serialize(newAsset); - stub.putStringState(assetID, newAssetJSON); + + //Use a Jackson ObjectMapper to conver the Asset into string, sort it alphabetically and serialize it into a json string + String sortedJson = om.writeValueAsString(newAsset); + stub.putStringState(assetID, sortedJson); return newAsset; } @@ -216,7 +228,7 @@ public final class AssetTransfer implements ContractInterface { * @return array of assets found on the ledger */ @Transaction(intent = Transaction.TYPE.EVALUATE) - public String GetAllAssets(final Context ctx) { + public String GetAllAssets(final Context ctx) throws JsonProcessingException,IOException{ ChaincodeStub stub = ctx.getStub(); List queryResults = new ArrayList(); @@ -229,12 +241,12 @@ public final class AssetTransfer implements ContractInterface { for (KeyValue result: results) { Asset asset = genson.deserialize(result.getStringValue(), Asset.class); + System.out.println(asset); queryResults.add(asset); - System.out.println(asset.toString()); } + //Set pretty printing of json final String response = genson.serialize(queryResults); - return response; } } \ No newline at end of file diff --git a/asset-transfer-basic/chaincode-java/src/test/java/org/hyperledger/fabric/samples/assettransfer/AssetTest.java b/asset-transfer-basic/chaincode-java/src/test/java/org/hyperledger/fabric/samples/assettransfer/AssetTest.java index 7bcaa8ae..7da94caa 100644 --- a/asset-transfer-basic/chaincode-java/src/test/java/org/hyperledger/fabric/samples/assettransfer/AssetTest.java +++ b/asset-transfer-basic/chaincode-java/src/test/java/org/hyperledger/fabric/samples/assettransfer/AssetTest.java @@ -71,4 +71,4 @@ public final class AssetTest { assertThat(asset.toString()).isEqualTo("Asset@e04f6c53 [assetID=asset1, color=Blue, size=20, owner=Guy, appraisedValue=100]"); } -} \ No newline at end of file +} diff --git a/asset-transfer-basic/chaincode-java/src/test/java/org/hyperledger/fabric/samples/assettransfer/AssetTransferTest.java b/asset-transfer-basic/chaincode-java/src/test/java/org/hyperledger/fabric/samples/assettransfer/AssetTransferTest.java index 7fecfff3..cbbb172f 100644 --- a/asset-transfer-basic/chaincode-java/src/test/java/org/hyperledger/fabric/samples/assettransfer/AssetTransferTest.java +++ b/asset-transfer-basic/chaincode-java/src/test/java/org/hyperledger/fabric/samples/assettransfer/AssetTransferTest.java @@ -302,4 +302,4 @@ public final class AssetTransferTest { assertThat(((ChaincodeException) thrown).getPayload()).isEqualTo("ASSET_NOT_FOUND".getBytes()); } } -} \ No newline at end of file +} diff --git a/asset-transfer-basic/chaincode-java/.fabricignore b/asset-transfer-basic/java/.fabricignore similarity index 100% rename from asset-transfer-basic/chaincode-java/.fabricignore rename to asset-transfer-basic/java/.fabricignore diff --git a/asset-transfer-basic/chaincode-java/.gitignore b/asset-transfer-basic/java/.gitignore similarity index 100% rename from asset-transfer-basic/chaincode-java/.gitignore rename to asset-transfer-basic/java/.gitignore diff --git a/asset-transfer-basic/java/build.gradle b/asset-transfer-basic/java/build.gradle new file mode 100644 index 00000000..a02eb79a --- /dev/null +++ b/asset-transfer-basic/java/build.gradle @@ -0,0 +1,52 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + */ +plugins { + id 'com.github.johnrengelman.shadow' version '5.2.0' + id 'java' +} + +version '0.0.1' + +sourceCompatibility = 1.8 + +repositories { + mavenLocal() + mavenCentral() + maven { + url 'https://jitpack.io' + } +} + +dependencies { + implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.2.0' + implementation 'com.owlike:genson:1.6' + implementation 'com.google.code.gson:gson:2.8.7' + implementation 'com.fasterxml.jackson.core:jackson-databind:2.8.9' + implementation 'io.vertx:vertx-core:3.5.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.4.2' + testImplementation 'org.assertj:assertj-core:3.11.1' + testImplementation 'org.mockito:mockito-core:2.+' +} + +shadowJar { + baseName = 'chaincode' + version = null + classifier = null + + manifest { + attributes 'Main-Class': 'org.hyperledger.fabric.contract.ContractRouter' + } +} + +test { + useJUnitPlatform() + testLogging { + events "passed", "skipped", "failed" + } +} + + +tasks.withType(JavaCompile) { + options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" << "-parameters" +} diff --git a/asset-transfer-basic/java/gradle/wrapper/gradle-wrapper.jar b/asset-transfer-basic/java/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..f6b961fd5a86aa5fbfe90f707c3138408be7c718 GIT binary patch literal 54329 zcmagFV|ZrKvM!pAZQHhO+qP}9lTNj?q^^Y^VFp)SH8qbSJ)2BQ2giqr}t zFG7D6)c?v~^Z#E_K}1nTQbJ9gQ9<%vVRAxVj)8FwL5_iTdUB>&m3fhE=kRWl;g`&m z!W5kh{WsV%fO*%je&j+Lv4xxK~zsEYQls$Q-p&dwID|A)!7uWtJF-=Tm1{V@#x*+kUI$=%KUuf2ka zjiZ{oiL1MXE2EjciJM!jrjFNwCh`~hL>iemrqwqnX?T*MX;U>>8yRcZb{Oy+VKZos zLiFKYPw=LcaaQt8tj=eoo3-@bG_342HQ%?jpgAE?KCLEHC+DmjxAfJ%Og^$dpC8Xw zAcp-)tfJm}BPNq_+6m4gBgBm3+CvmL>4|$2N$^Bz7W(}fz1?U-u;nE`+9`KCLuqg} zwNstNM!J4Uw|78&Y9~9>MLf56to!@qGkJw5Thx%zkzj%Ek9Nn1QA@8NBXbwyWC>9H z#EPwjMNYPigE>*Ofz)HfTF&%PFj$U6mCe-AFw$U%-L?~-+nSXHHKkdgC5KJRTF}`G zE_HNdrE}S0zf4j{r_f-V2imSqW?}3w-4=f@o@-q+cZgaAbZ((hn))@|eWWhcT2pLpTpL!;_5*vM=sRL8 zqU##{U#lJKuyqW^X$ETU5ETeEVzhU|1m1750#f}38_5N9)B_2|v@1hUu=Kt7-@dhA zq_`OMgW01n`%1dB*}C)qxC8q;?zPeF_r;>}%JYmlER_1CUbKa07+=TV45~symC*g8 zW-8(gag#cAOuM0B1xG8eTp5HGVLE}+gYTmK=`XVVV*U!>H`~j4+ROIQ+NkN$LY>h4 zqpwdeE_@AX@PL};e5vTn`Ro(EjHVf$;^oiA%@IBQq>R7_D>m2D4OwwEepkg}R_k*M zM-o;+P27087eb+%*+6vWFCo9UEGw>t&WI17Pe7QVuoAoGHdJ(TEQNlJOqnjZ8adCb zI`}op16D@v7UOEo%8E-~m?c8FL1utPYlg@m$q@q7%mQ4?OK1h%ODjTjFvqd!C z-PI?8qX8{a@6d&Lb_X+hKxCImb*3GFemm?W_du5_&EqRq!+H?5#xiX#w$eLti-?E$;Dhu`{R(o>LzM4CjO>ICf z&DMfES#FW7npnbcuqREgjPQM#gs6h>`av_oEWwOJZ2i2|D|0~pYd#WazE2Bbsa}X@ zu;(9fi~%!VcjK6)?_wMAW-YXJAR{QHxrD5g(ou9mR6LPSA4BRG1QSZT6A?kelP_g- zH(JQjLc!`H4N=oLw=f3{+WmPA*s8QEeEUf6Vg}@!xwnsnR0bl~^2GSa5vb!Yl&4!> zWb|KQUsC$lT=3A|7vM9+d;mq=@L%uWKwXiO9}a~gP4s_4Yohc!fKEgV7WbVo>2ITbE*i`a|V!^p@~^<={#?Gz57 zyPWeM2@p>D*FW#W5Q`1`#5NW62XduP1XNO(bhg&cX`-LYZa|m-**bu|>}S;3)eP8_ zpNTnTfm8 ze+7wDH3KJ95p)5tlwk`S7mbD`SqHnYD*6`;gpp8VdHDz%RR_~I_Ar>5)vE-Pgu7^Y z|9Px+>pi3!DV%E%4N;ii0U3VBd2ZJNUY1YC^-e+{DYq+l@cGtmu(H#Oh%ibUBOd?C z{y5jW3v=0eV0r@qMLgv1JjZC|cZ9l9Q)k1lLgm))UR@#FrJd>w^`+iy$c9F@ic-|q zVHe@S2UAnc5VY_U4253QJxm&Ip!XKP8WNcnx9^cQ;KH6PlW8%pSihSH2(@{2m_o+m zr((MvBja2ctg0d0&U5XTD;5?d?h%JcRJp{_1BQW1xu&BrA3(a4Fh9hon-ly$pyeHq zG&;6q?m%NJ36K1Sq_=fdP(4f{Hop;_G_(i?sPzvB zDM}>*(uOsY0I1j^{$yn3#U(;B*g4cy$-1DTOkh3P!LQ;lJlP%jY8}Nya=h8$XD~%Y zbV&HJ%eCD9nui-0cw!+n`V~p6VCRqh5fRX z8`GbdZ@73r7~myQLBW%db;+BI?c-a>Y)m-FW~M=1^|<21_Sh9RT3iGbO{o-hpN%d6 z7%++#WekoBOP^d0$$|5npPe>u3PLvX_gjH2x(?{&z{jJ2tAOWTznPxv-pAv<*V7r$ z6&glt>7CAClWz6FEi3bToz-soY^{ScrjwVPV51=>n->c(NJngMj6TyHty`bfkF1hc zkJS%A@cL~QV0-aK4>Id!9dh7>0IV;1J9(myDO+gv76L3NLMUm9XyPauvNu$S<)-|F zZS}(kK_WnB)Cl`U?jsdYfAV4nrgzIF@+%1U8$poW&h^c6>kCx3;||fS1_7JvQT~CV zQ8Js+!p)3oW>Df(-}uqC`Tcd%E7GdJ0p}kYj5j8NKMp(KUs9u7?jQ94C)}0rba($~ zqyBx$(1ae^HEDG`Zc@-rXk1cqc7v0wibOR4qpgRDt#>-*8N3P;uKV0CgJE2SP>#8h z=+;i_CGlv+B^+$5a}SicVaSeaNn29K`C&=}`=#Nj&WJP9Xhz4mVa<+yP6hkrq1vo= z1rX4qg8dc4pmEvq%NAkpMK>mf2g?tg_1k2%v}<3`$6~Wlq@ItJ*PhHPoEh1Yi>v57 z4k0JMO)*=S`tKvR5gb-(VTEo>5Y>DZJZzgR+j6{Y`kd|jCVrg!>2hVjz({kZR z`dLlKhoqT!aI8=S+fVp(5*Dn6RrbpyO~0+?fy;bm$0jmTN|t5i6rxqr4=O}dY+ROd zo9Et|x}!u*xi~>-y>!M^+f&jc;IAsGiM_^}+4|pHRn{LThFFpD{bZ|TA*wcGm}XV^ zr*C6~@^5X-*R%FrHIgo-hJTBcyQ|3QEj+cSqp#>&t`ZzB?cXM6S(lRQw$I2?m5=wd z78ki`R?%;o%VUhXH?Z#(uwAn9$m`npJ=cA+lHGk@T7qq_M6Zoy1Lm9E0UUysN)I_x zW__OAqvku^>`J&CB=ie@yNWsaFmem}#L3T(x?a`oZ+$;3O-icj2(5z72Hnj=9Z0w% z<2#q-R=>hig*(t0^v)eGq2DHC%GymE-_j1WwBVGoU=GORGjtaqr0BNigOCqyt;O(S zKG+DoBsZU~okF<7ahjS}bzwXxbAxFfQAk&O@>LsZMsZ`?N?|CDWM(vOm%B3CBPC3o z%2t@%H$fwur}SSnckUm0-k)mOtht`?nwsDz=2#v=RBPGg39i#%odKq{K^;bTD!6A9 zskz$}t)sU^=a#jLZP@I=bPo?f-L}wpMs{Tc!m7-bi!Ldqj3EA~V;4(dltJmTXqH0r z%HAWKGutEc9vOo3P6Q;JdC^YTnby->VZ6&X8f{obffZ??1(cm&L2h7q)*w**+sE6dG*;(H|_Q!WxU{g)CeoT z(KY&bv!Usc|m+Fqfmk;h&RNF|LWuNZ!+DdX*L=s-=_iH=@i` z?Z+Okq^cFO4}_n|G*!)Wl_i%qiMBaH8(WuXtgI7EO=M>=i_+;MDjf3aY~6S9w0K zUuDO7O5Ta6+k40~xh~)D{=L&?Y0?c$s9cw*Ufe18)zzk%#ZY>Tr^|e%8KPb0ht`b( zuP@8#Ox@nQIqz9}AbW0RzE`Cf>39bOWz5N3qzS}ocxI=o$W|(nD~@EhW13Rj5nAp; zu2obEJa=kGC*#3=MkdkWy_%RKcN=?g$7!AZ8vBYKr$ePY(8aIQ&yRPlQ=mudv#q$q z4%WzAx=B{i)UdLFx4os?rZp6poShD7Vc&mSD@RdBJ=_m^&OlkEE1DFU@csgKcBifJ zz4N7+XEJhYzzO=86 z#%eBQZ$Nsf2+X0XPHUNmg#(sNt^NW1Y0|M(${e<0kW6f2q5M!2YE|hSEQ*X-%qo(V zHaFwyGZ0on=I{=fhe<=zo{=Og-_(to3?cvL4m6PymtNsdDINsBh8m>a%!5o3s(en) z=1I z6O+YNertC|OFNqd6P=$gMyvmfa`w~p9*gKDESFqNBy(~Zw3TFDYh}$iudn)9HxPBi zdokK@o~nu?%imcURr5Y~?6oo_JBe}t|pU5qjai|#JDyG=i^V~7+a{dEnO<(y>ahND#_X_fcEBNiZ)uc&%1HVtx8Ts z*H_Btvx^IhkfOB#{szN*n6;y05A>3eARDXslaE>tnLa>+`V&cgho?ED+&vv5KJszf zG4@G;7i;4_bVvZ>!mli3j7~tPgybF5|J6=Lt`u$D%X0l}#iY9nOXH@(%FFJLtzb%p zzHfABnSs;v-9(&nzbZytLiqqDIWzn>JQDk#JULcE5CyPq_m#4QV!}3421haQ+LcfO*>r;rg6K|r#5Sh|y@h1ao%Cl)t*u`4 zMTP!deC?aL7uTxm5^nUv#q2vS-5QbBKP|drbDXS%erB>fYM84Kpk^au99-BQBZR z7CDynflrIAi&ahza+kUryju5LR_}-Z27g)jqOc(!Lx9y)e z{cYc&_r947s9pteaa4}dc|!$$N9+M38sUr7h(%@Ehq`4HJtTpA>B8CLNO__@%(F5d z`SmX5jbux6i#qc}xOhumzbAELh*Mfr2SW99=WNOZRZgoCU4A2|4i|ZVFQt6qEhH#B zK_9G;&h*LO6tB`5dXRSBF0hq0tk{2q__aCKXYkP#9n^)@cq}`&Lo)1KM{W+>5mSed zKp~=}$p7>~nK@va`vN{mYzWN1(tE=u2BZhga5(VtPKk(*TvE&zmn5vSbjo zZLVobTl%;t@6;4SsZ>5+U-XEGUZGG;+~|V(pE&qqrp_f~{_1h@5ZrNETqe{bt9ioZ z#Qn~gWCH!t#Ha^n&fT2?{`}D@s4?9kXj;E;lWV9Zw8_4yM0Qg-6YSsKgvQ*fF{#Pq z{=(nyV>#*`RloBVCs;Lp*R1PBIQOY=EK4CQa*BD0MsYcg=opP?8;xYQDSAJBeJpw5 zPBc_Ft9?;<0?pBhCmOtWU*pN*;CkjJ_}qVic`}V@$TwFi15!mF1*m2wVX+>5p%(+R zQ~JUW*zWkalde{90@2v+oVlkxOZFihE&ZJ){c?hX3L2@R7jk*xjYtHi=}qb+4B(XJ z$gYcNudR~4Kz_WRq8eS((>ALWCO)&R-MXE+YxDn9V#X{_H@j616<|P(8h(7z?q*r+ zmpqR#7+g$cT@e&(%_|ipI&A%9+47%30TLY(yuf&*knx1wNx|%*H^;YB%ftt%5>QM= z^i;*6_KTSRzQm%qz*>cK&EISvF^ovbS4|R%)zKhTH_2K>jP3mBGn5{95&G9^a#4|K zv+!>fIsR8z{^x4)FIr*cYT@Q4Z{y}};rLHL+atCgHbfX*;+k&37DIgENn&=k(*lKD zG;uL-KAdLn*JQ?@r6Q!0V$xXP=J2i~;_+i3|F;_En;oAMG|I-RX#FwnmU&G}w`7R{ z788CrR-g1DW4h_`&$Z`ctN~{A)Hv_-Bl!%+pfif8wN32rMD zJDs$eVWBYQx1&2sCdB0!vU5~uf)=vy*{}t{2VBpcz<+~h0wb7F3?V^44*&83Z2#F` z32!rd4>uc63rQP$3lTH3zb-47IGR}f)8kZ4JvX#toIpXH`L%NnPDE~$QI1)0)|HS4 zVcITo$$oWWwCN@E-5h>N?Hua!N9CYb6f8vTFd>h3q5Jg-lCI6y%vu{Z_Uf z$MU{{^o~;nD_@m2|E{J)q;|BK7rx%`m``+OqZAqAVj-Dy+pD4-S3xK?($>wn5bi90CFAQ+ACd;&m6DQB8_o zjAq^=eUYc1o{#+p+ zn;K<)Pn*4u742P!;H^E3^Qu%2dM{2slouc$AN_3V^M7H_KY3H)#n7qd5_p~Za7zAj|s9{l)RdbV9e||_67`#Tu*c<8!I=zb@ z(MSvQ9;Wrkq6d)!9afh+G`!f$Ip!F<4ADdc*OY-y7BZMsau%y?EN6*hW4mOF%Q~bw z2==Z3^~?q<1GTeS>xGN-?CHZ7a#M4kDL zQxQr~1ZMzCSKFK5+32C%+C1kE#(2L=15AR!er7GKbp?Xd1qkkGipx5Q~FI-6zt< z*PTpeVI)Ngnnyaz5noIIgNZtb4bQdKG{Bs~&tf)?nM$a;7>r36djllw%hQxeCXeW^ z(i6@TEIuxD<2ulwLTt|&gZP%Ei+l!(%p5Yij6U(H#HMkqM8U$@OKB|5@vUiuY^d6X zW}fP3;Kps6051OEO(|JzmVU6SX(8q>*yf*x5QoxDK={PH^F?!VCzES_Qs>()_y|jg6LJlJWp;L zKM*g5DK7>W_*uv}{0WUB0>MHZ#oJZmO!b3MjEc}VhsLD~;E-qNNd?x7Q6~v zR=0$u>Zc2Xr}>x_5$-s#l!oz6I>W?lw;m9Ae{Tf9eMX;TI-Wf_mZ6sVrMnY#F}cDd z%CV*}fDsXUF7Vbw>PuDaGhu631+3|{xp<@Kl|%WxU+vuLlcrklMC!Aq+7n~I3cmQ! z`e3cA!XUEGdEPSu``&lZEKD1IKO(-VGvcnSc153m(i!8ohi`)N2n>U_BemYJ`uY>8B*Epj!oXRLV}XK}>D*^DHQ7?NY*&LJ9VSo`Ogi9J zGa;clWI8vIQqkngv2>xKd91K>?0`Sw;E&TMg&6dcd20|FcTsnUT7Yn{oI5V4@Ow~m zz#k~8TM!A9L7T!|colrC0P2WKZW7PNj_X4MfESbt<-soq*0LzShZ}fyUx!(xIIDwx zRHt^_GAWe0-Vm~bDZ(}XG%E+`XhKpPlMBo*5q_z$BGxYef8O!ToS8aT8pmjbPq)nV z%x*PF5ZuSHRJqJ!`5<4xC*xb2vC?7u1iljB_*iUGl6+yPyjn?F?GOF2_KW&gOkJ?w z3e^qc-te;zez`H$rsUCE0<@7PKGW?7sT1SPYWId|FJ8H`uEdNu4YJjre`8F*D}6Wh z|FQ`xf7yiphHIAkU&OYCn}w^ilY@o4larl?^M7&8YI;hzBIsX|i3UrLsx{QDKwCX< zy;a>yjfJ6!sz`NcVi+a!Fqk^VE^{6G53L?@Tif|j!3QZ0fk9QeUq8CWI;OmO-Hs+F zuZ4sHLA3{}LR2Qlyo+{d@?;`tpp6YB^BMoJt?&MHFY!JQwoa0nTSD+#Ku^4b{5SZVFwU9<~APYbaLO zu~Z)nS#dxI-5lmS-Bnw!(u15by(80LlC@|ynj{TzW)XcspC*}z0~8VRZq>#Z49G`I zgl|C#H&=}n-ajxfo{=pxPV(L*7g}gHET9b*s=cGV7VFa<;Htgjk>KyW@S!|z`lR1( zGSYkEl&@-bZ*d2WQ~hw3NpP=YNHF^XC{TMG$Gn+{b6pZn+5=<()>C!N^jncl0w6BJ zdHdnmSEGK5BlMeZD!v4t5m7ct7{k~$1Ie3GLFoHjAH*b?++s<|=yTF+^I&jT#zuMx z)MLhU+;LFk8bse|_{j+d*a=&cm2}M?*arjBPnfPgLwv)86D$6L zLJ0wPul7IenMvVAK$z^q5<^!)7aI|<&GGEbOr=E;UmGOIa}yO~EIr5xWU_(ol$&fa zR5E(2vB?S3EvJglTXdU#@qfDbCYs#82Yo^aZN6`{Ex#M)easBTe_J8utXu(fY1j|R z9o(sQbj$bKU{IjyhosYahY{63>}$9_+hWxB3j}VQkJ@2$D@vpeRSldU?&7I;qd2MF zSYmJ>zA(@N_iK}m*AMPIJG#Y&1KR)6`LJ83qg~`Do3v^B0>fU&wUx(qefuTgzFED{sJ65!iw{F2}1fQ3= ziFIP{kezQxmlx-!yo+sC4PEtG#K=5VM9YIN0z9~c4XTX?*4e@m;hFM!zVo>A`#566 z>f&3g94lJ{r)QJ5m7Xe3SLau_lOpL;A($wsjHR`;xTXgIiZ#o&vt~ zGR6KdU$FFbLfZCC3AEu$b`tj!9XgOGLSV=QPIYW zjI!hSP#?8pn0@ezuenOzoka8!8~jXTbiJ6+ZuItsWW03uzASFyn*zV2kIgPFR$Yzm zE<$cZlF>R8?Nr2_i?KiripBc+TGgJvG@vRTY2o?(_Di}D30!k&CT`>+7ry2!!iC*X z<@=U0_C#16=PN7bB39w+zPwDOHX}h20Ap);dx}kjXX0-QkRk=cr};GYsjSvyLZa-t zzHONWddi*)RDUH@RTAsGB_#&O+QJaaL+H<<9LLSE+nB@eGF1fALwjVOl8X_sdOYme z0lk!X=S(@25=TZHR7LlPp}fY~yNeThMIjD}pd9+q=j<_inh0$>mIzWVY+Z9p<{D^#0Xk+b_@eNSiR8;KzSZ#7lUsk~NGMcB8C2c=m2l5paHPq`q{S(kdA7Z1a zyfk2Y;w?^t`?@yC5Pz9&pzo}Hc#}mLgDmhKV|PJ3lKOY(Km@Fi2AV~CuET*YfUi}u zfInZnqDX(<#vaS<^fszuR=l)AbqG{}9{rnyx?PbZz3Pyu!eSJK`uwkJU!ORQXy4x83r!PNgOyD33}}L=>xX_93l6njNTuqL8J{l%*3FVn3MG4&Fv*`lBXZ z?=;kn6HTT^#SrPX-N)4EZiIZI!0ByXTWy;;J-Tht{jq1mjh`DSy7yGjHxIaY%*sTx zuy9#9CqE#qi>1misx=KRWm=qx4rk|}vd+LMY3M`ow8)}m$3Ggv&)Ri*ON+}<^P%T5 z_7JPVPfdM=Pv-oH<tecoE}(0O7|YZc*d8`Uv_M*3Rzv7$yZnJE6N_W=AQ3_BgU_TjA_T?a)U1csCmJ&YqMp-lJe`y6>N zt++Bi;ZMOD%%1c&-Q;bKsYg!SmS^#J@8UFY|G3!rtyaTFb!5@e(@l?1t(87ln8rG? z--$1)YC~vWnXiW3GXm`FNSyzu!m$qT=Eldf$sMl#PEfGmzQs^oUd=GIQfj(X=}dw+ zT*oa0*oS%@cLgvB&PKIQ=Ok?>x#c#dC#sQifgMwtAG^l3D9nIg(Zqi;D%807TtUUCL3_;kjyte#cAg?S%e4S2W>9^A(uy8Ss0Tc++ZTjJw1 z&Em2g!3lo@LlDyri(P^I8BPpn$RE7n*q9Q-c^>rfOMM6Pd5671I=ZBjAvpj8oIi$! zl0exNl(>NIiQpX~FRS9UgK|0l#s@#)p4?^?XAz}Gjb1?4Qe4?j&cL$C8u}n)?A@YC zfmbSM`Hl5pQFwv$CQBF=_$Sq zxsV?BHI5bGZTk?B6B&KLdIN-40S426X3j_|ceLla*M3}3gx3(_7MVY1++4mzhH#7# zD>2gTHy*%i$~}mqc#gK83288SKp@y3wz1L_e8fF$Rb}ex+`(h)j}%~Ld^3DUZkgez zOUNy^%>>HHE|-y$V@B}-M|_{h!vXpk01xaD%{l{oQ|~+^>rR*rv9iQen5t?{BHg|% zR`;S|KtUb!X<22RTBA4AAUM6#M?=w5VY-hEV)b`!y1^mPNEoy2K)a>OyA?Q~Q*&(O zRzQI~y_W=IPi?-OJX*&&8dvY0zWM2%yXdFI!D-n@6FsG)pEYdJbuA`g4yy;qrgR?G z8Mj7gv1oiWq)+_$GqqQ$(ZM@#|0j7})=#$S&hZwdoijFI4aCFLVI3tMH5fLreZ;KD zqA`)0l~D2tuIBYOy+LGw&hJ5OyE+@cnZ0L5+;yo2pIMdt@4$r^5Y!x7nHs{@>|W(MzJjATyWGNwZ^4j+EPU0RpAl-oTM@u{lx*i0^yyWPfHt6QwPvYpk9xFMWfBFt!+Gu6TlAmr zeQ#PX71vzN*_-xh&__N`IXv6`>CgV#eA_%e@7wjgkj8jlKzO~Ic6g$cT`^W{R{606 zCDP~+NVZ6DMO$jhL~#+!g*$T!XW63#(ngDn#Qwy71yj^gazS{e;3jGRM0HedGD@pt z?(ln3pCUA(ekqAvvnKy0G@?-|-dh=eS%4Civ&c}s%wF@0K5Bltaq^2Os1n6Z3%?-Q zAlC4goQ&vK6TpgtzkHVt*1!tBYt-`|5HLV1V7*#45Vb+GACuU+QB&hZ=N_flPy0TY zR^HIrdskB#<$aU;HY(K{a3(OQa$0<9qH(oa)lg@Uf>M5g2W0U5 zk!JSlhrw8quBx9A>RJ6}=;W&wt@2E$7J=9SVHsdC?K(L(KACb#z)@C$xXD8^!7|uv zZh$6fkq)aoD}^79VqdJ!Nz-8$IrU(_-&^cHBI;4 z^$B+1aPe|LG)C55LjP;jab{dTf$0~xbXS9!!QdcmDYLbL^jvxu2y*qnx2%jbL%rB z{aP85qBJe#(&O~Prk%IJARcdEypZ)vah%ZZ%;Zk{eW(U)Bx7VlzgOi8)x z`rh4l`@l_Ada7z&yUK>ZF;i6YLGwI*Sg#Fk#Qr0Jg&VLax(nNN$u-XJ5=MsP3|(lEdIOJ7|(x3iY;ea)5#BW*mDV%^=8qOeYO&gIdJVuLLN3cFaN=xZtFB=b zH{l)PZl_j^u+qx@89}gAQW7ofb+k)QwX=aegihossZq*+@PlCpb$rpp>Cbk9UJO<~ zDjlXQ_Ig#W0zdD3&*ei(FwlN#3b%FSR%&M^ywF@Fr>d~do@-kIS$e%wkIVfJ|Ohh=zc zF&Rnic^|>@R%v?@jO}a9;nY3Qrg_!xC=ZWUcYiA5R+|2nsM*$+c$TOs6pm!}Z}dfM zGeBhMGWw3$6KZXav^>YNA=r6Es>p<6HRYcZY)z{>yasbC81A*G-le8~QoV;rtKnkx z;+os8BvEe?0A6W*a#dOudsv3aWs?d% z0oNngyVMjavLjtjiG`!007#?62ClTqqU$@kIY`=x^$2e>iqIy1>o|@Tw@)P)B8_1$r#6>DB_5 zmaOaoE~^9TolgDgooKFuEFB#klSF%9-~d2~_|kQ0Y{Ek=HH5yq9s zDq#1S551c`kSiWPZbweN^A4kWiP#Qg6er1}HcKv{fxb1*BULboD0fwfaNM_<55>qM zETZ8TJDO4V)=aPp_eQjX%||Ud<>wkIzvDlpNjqW>I}W!-j7M^TNe5JIFh#-}zAV!$ICOju8Kx)N z0vLtzDdy*rQN!7r>Xz7rLw8J-(GzQlYYVH$WK#F`i_i^qVlzTNAh>gBWKV@XC$T-` z3|kj#iCquDhiO7NKum07i|<-NuVsX}Q}mIP$jBJDMfUiaWR3c|F_kWBMw0_Sr|6h4 zk`_r5=0&rCR^*tOy$A8K;@|NqwncjZ>Y-75vlpxq%Cl3EgH`}^^~=u zoll6xxY@a>0f%Ddpi;=cY}fyG!K2N-dEyXXmUP5u){4VnyS^T4?pjN@Ot4zjL(Puw z_U#wMH2Z#8Pts{olG5Dy0tZj;N@;fHheu>YKYQU=4Bk|wcD9MbA`3O4bj$hNRHwzb zSLcG0SLV%zywdbuwl(^E_!@&)TdXge4O{MRWk2RKOt@!8E{$BU-AH(@4{gxs=YAz9LIob|Hzto0}9cWoz6Tp2x0&xi#$ zHh$dwO&UCR1Ob2w00-2eG7d4=cN(Y>0R#$q8?||q@iTi+7-w-xR%uMr&StFIthC<# zvK(aPduwuNB}oJUV8+Zl)%cnfsHI%4`;x6XW^UF^e4s3Z@S<&EV8?56Wya;HNs0E> z`$0dgRdiUz9RO9Au3RmYq>K#G=X%*_dUbSJHP`lSfBaN8t-~@F>)BL1RT*9I851A3 z<-+Gb#_QRX>~av#Ni<#zLswtu-c6{jGHR>wflhKLzC4P@b%8&~u)fosoNjk4r#GvC zlU#UU9&0Hv;d%g72Wq?Ym<&&vtA3AB##L}=ZjiTR4hh7J)e>ei} zt*u+>h%MwN`%3}b4wYpV=QwbY!jwfIj#{me)TDOG`?tI!%l=AwL2G@9I~}?_dA5g6 zCKgK(;6Q0&P&K21Tx~k=o6jwV{dI_G+Ba*Zts|Tl6q1zeC?iYJTb{hel*x>^wb|2RkHkU$!+S4OU4ZOKPZjV>9OVsqNnv5jK8TRAE$A&^yRwK zj-MJ3Pl?)KA~fq#*K~W0l4$0=8GRx^9+?w z!QT8*-)w|S^B0)ZeY5gZPI2G(QtQf?DjuK(s^$rMA!C%P22vynZY4SuOE=wX2f8$R z)A}mzJi4WJnZ`!bHG1=$lwaxm!GOnRbR15F$nRC-M*H<*VfF|pQw(;tbSfp({>9^5 zw_M1-SJ9eGF~m(0dvp*P8uaA0Yw+EkP-SWqu zqal$hK8SmM7#Mrs0@OD+%_J%H*bMyZiWAZdsIBj#lkZ!l2c&IpLu(5^T0Ge5PHzR} zn;TXs$+IQ_&;O~u=Jz+XE0wbOy`=6>m9JVG} zJ~Kp1e5m?K3x@@>!D)piw^eMIHjD4RebtR`|IlckplP1;r21wTi8v((KqNqn%2CB< zifaQc&T}*M&0i|LW^LgdjIaX|o~I$`owHolRqeH_CFrqCUCleN130&vH}dK|^kC>) z-r2P~mApHotL4dRX$25lIcRh_*kJaxi^%ZN5-GAAMOxfB!6flLPY-p&QzL9TE%ho( zRwftE3sy5<*^)qYzKkL|rE>n@hyr;xPqncY6QJ8125!MWr`UCWuC~A#G1AqF1@V$kv>@NBvN&2ygy*{QvxolkRRb%Ui zsmKROR%{*g*WjUUod@@cS^4eF^}yQ1>;WlGwOli z+Y$(8I`0(^d|w>{eaf!_BBM;NpCoeem2>J}82*!em=}}ymoXk>QEfJ>G(3LNA2-46 z5PGvjr)Xh9>aSe>vEzM*>xp{tJyZox1ZRl}QjcvX2TEgNc^(_-hir@Es>NySoa1g^ zFow_twnHdx(j?Q_3q51t3XI7YlJ4_q&(0#)&a+RUy{IcBq?)eaWo*=H2UUVIqtp&lW9JTJiP&u zw8+4vo~_IJXZIJb_U^&=GI1nSD%e;P!c{kZALNCm5c%%oF+I3DrA63_@4)(v4(t~JiddILp7jmoy+>cD~ivwoctFfEL zP*#2Rx?_&bCpX26MBgp^4G>@h`Hxc(lnqyj!*t>9sOBcXN(hTwEDpn^X{x!!gPX?1 z*uM$}cYRwHXuf+gYTB}gDTcw{TXSOUU$S?8BeP&sc!Lc{{pEv}x#ELX>6*ipI1#>8 zKes$bHjiJ1OygZge_ak^Hz#k;=od1wZ=o71ba7oClBMq>Uk6hVq|ePPt)@FM5bW$I z;d2Or@wBjbTyZj|;+iHp%Bo!Vy(X3YM-}lasMItEV_QrP-Kk_J4C>)L&I3Xxj=E?| zsAF(IfVQ4w+dRRnJ>)}o^3_012YYgFWE)5TT=l2657*L8_u1KC>Y-R{7w^S&A^X^U}h20jpS zQsdeaA#WIE*<8KG*oXc~$izYilTc#z{5xhpXmdT-YUnGh9v4c#lrHG6X82F2-t35} zB`jo$HjKe~E*W$=g|j&P>70_cI`GnOQ;Jp*JK#CT zuEGCn{8A@bC)~0%wsEv?O^hSZF*iqjO~_h|>xv>PO+?525Nw2472(yqS>(#R)D7O( zg)Zrj9n9$}=~b00=Wjf?E418qP-@8%MQ%PBiCTX=$B)e5cHFDu$LnOeJ~NC;xmOk# z>z&TbsK>Qzk)!88lNI8fOE2$Uxso^j*1fz>6Ot49y@=po)j4hbTIcVR`ePHpuJSfp zxaD^Dn3X}Na3@<_Pc>a;-|^Pon(>|ytG_+U^8j_JxP=_d>L$Hj?|0lz>_qQ#a|$+( z(x=Lipuc8p4^}1EQhI|TubffZvB~lu$zz9ao%T?%ZLyV5S9}cLeT?c} z>yCN9<04NRi~1oR)CiBakoNhY9BPnv)kw%*iv8vdr&&VgLGIs(-FbJ?d_gfbL2={- zBk4lkdPk~7+jIxd4{M(-W1AC_WcN&Oza@jZoj zaE*9Y;g83#m(OhA!w~LNfUJNUuRz*H-=$s*z+q+;snKPRm9EptejugC-@7-a-}Tz0 z@KHra#Y@OXK+KsaSN9WiGf?&jlZ!V7L||%KHP;SLksMFfjkeIMf<1e~t?!G3{n)H8 zQAlFY#QwfKuj;l@<$YDATAk;%PtD%B(0<|8>rXU< zJ66rkAVW_~Dj!7JGdGGi4NFuE?7ZafdMxIh65Sz7yQoA7fBZCE@WwysB=+`kT^LFX zz8#FlSA5)6FG9(qL3~A24mpzL@@2D#>0J7mMS1T*9UJ zvOq!!a(%IYY69+h45CE?(&v9H4FCr>gK0>mK~F}5RdOuH2{4|}k@5XpsX7+LZo^Qa4sH5`eUj>iffoBVm+ zz4Mtf`h?NW$*q1yr|}E&eNl)J``SZvTf6Qr*&S%tVv_OBpbjnA0&Vz#(;QmGiq-k! zgS0br4I&+^2mgA15*~Cd00cXLYOLA#Ep}_)eED>m+K@JTPr_|lSN}(OzFXQSBc6fM z@f-%2;1@BzhZa*LFV z-LrLmkmB%<<&jEURBEW>soaZ*rSIJNwaV%-RSaCZi4X)qYy^PxZ=oL?6N-5OGOMD2 z;q_JK?zkwQ@b3~ln&sDtT5SpW9a0q+5Gm|fpVY2|zqlNYBR}E5+ahgdj!CvK$Tlk0 z9g$5N;aar=CqMsudQV>yb4l@hN(9Jcc=1(|OHsqH6|g=K-WBd8GxZ`AkT?OO z-z_Ued-??Z*R4~L7jwJ%-`s~FK|qNAJ;EmIVDVpk{Lr7T4l{}vL)|GuUuswe9c5F| zv*5%u01hlv08?00Vpwyk*Q&&fY8k6MjOfpZfKa@F-^6d=Zv|0@&4_544RP5(s|4VPVP-f>%u(J@23BHqo2=zJ#v9g=F!cP((h zpt0|(s++ej?|$;2PE%+kc6JMmJjDW)3BXvBK!h!E`8Y&*7hS{c_Z?4SFP&Y<3evqf z9-ke+bSj$%Pk{CJlJbWwlBg^mEC^@%Ou?o>*|O)rl&`KIbHrjcpqsc$Zqt0^^F-gU2O=BusO+(Op}!jNzLMc zT;0YT%$@ClS%V+6lMTfhuzzxomoat=1H?1$5Ei7&M|gxo`~{UiV5w64Np6xV zVK^nL$)#^tjhCpTQMspXI({TW^U5h&Wi1Jl8g?P1YCV4=%ZYyjSo#5$SX&`r&1PyC zzc;uzCd)VTIih|8eNqFNeBMe#j_FS6rq81b>5?aXg+E#&$m++Gz9<+2)h=K(xtn}F ziV{rmu+Y>A)qvF}ms}4X^Isy!M&1%$E!rTO~5(p+8{U6#hWu>(Ll1}eD64Xa>~73A*538wry?v$vW z>^O#FRdbj(k0Nr&)U`Tl(4PI*%IV~;ZcI2z&rmq=(k^}zGOYZF3b2~Klpzd2eZJl> zB=MOLwI1{$RxQ7Y4e30&yOx?BvAvDkTBvWPpl4V8B7o>4SJn*+h1Ms&fHso%XLN5j z-zEwT%dTefp~)J_C8;Q6i$t!dnlh-!%haR1X_NuYUuP-)`IGWjwzAvp!9@h`kPZhf zwLwFk{m3arCdx8rD~K2`42mIN4}m%OQ|f)4kf%pL?Af5Ul<3M2fv>;nlhEPR8b)u} zIV*2-wyyD%%) zl$G@KrC#cUwoL?YdQyf9WH)@gWB{jd5w4evI& zOFF)p_D8>;3-N1z6mES!OPe>B^<;9xsh)){Cw$Vs-ez5nXS95NOr3s$IU;>VZSzKn zBvub8_J~I%(DozZW@{)Vp37-zevxMRZ8$8iRfwHmYvyjOxIOAF2FUngKj289!(uxY zaClWm!%x&teKmr^ABrvZ(ikx{{I-lEzw5&4t3P0eX%M~>$wG0ZjA4Mb&op+0$#SO_ z--R`>X!aqFu^F|a!{Up-iF(K+alKB{MNMs>e(i@Tpy+7Z-dK%IEjQFO(G+2mOb@BO zP>WHlS#fSQm0et)bG8^ZDScGnh-qRKIFz zfUdnk=m){ej0i(VBd@RLtRq3Ep=>&2zZ2%&vvf?Iex01hx1X!8U+?>ER;yJlR-2q4 z;Y@hzhEC=d+Le%=esE>OQ!Q|E%6yG3V_2*uh&_nguPcZ{q?DNq8h_2ahaP6=pP-+x zK!(ve(yfoYC+n(_+chiJ6N(ZaN+XSZ{|H{TR1J_s8x4jpis-Z-rlRvRK#U%SMJ(`C z?T2 zF(NNfO_&W%2roEC2j#v*(nRgl1X)V-USp-H|CwFNs?n@&vpRcj@W@xCJwR6@T!jt377?XjZ06=`d*MFyTdyvW!`mQm~t3luzYzvh^F zM|V}rO>IlBjZc}9Z zd$&!tthvr>5)m;5;96LWiAV0?t)7suqdh0cZis`^Pyg@?t>Ms~7{nCU;z`Xl+raSr zXpp=W1oHB*98s!Tpw=R5C)O{{Inl>9l7M*kq%#w9a$6N~v?BY2GKOVRkXYCgg*d

<5G2M1WZP5 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 F{|7XC?P&l2 literal 0 HcmV?d00001 diff --git a/asset-transfer-basic/java/gradle/wrapper/gradle-wrapper.properties b/asset-transfer-basic/java/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..7c4388a9 --- /dev/null +++ b/asset-transfer-basic/java/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/asset-transfer-basic/java/gradlew b/asset-transfer-basic/java/gradlew new file mode 100755 index 00000000..cccdd3d5 --- /dev/null +++ b/asset-transfer-basic/java/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/asset-transfer-basic/java/gradlew.bat b/asset-transfer-basic/java/gradlew.bat new file mode 100644 index 00000000..e95643d6 --- /dev/null +++ b/asset-transfer-basic/java/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/asset-transfer-basic/java/settings.gradle b/asset-transfer-basic/java/settings.gradle new file mode 100644 index 00000000..2182e899 --- /dev/null +++ b/asset-transfer-basic/java/settings.gradle @@ -0,0 +1,5 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + */ +rootProject.name = 'java' + diff --git a/asset-transfer-basic/java/src/main/java/org/example/Asset.java b/asset-transfer-basic/java/src/main/java/org/example/Asset.java new file mode 100644 index 00000000..fb850f61 --- /dev/null +++ b/asset-transfer-basic/java/src/main/java/org/example/Asset.java @@ -0,0 +1,94 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.hyperledger.fabric.samples.assettransfer; + +import java.util.Objects; + +import org.hyperledger.fabric.contract.annotation.DataType; +import org.hyperledger.fabric.contract.annotation.Property; + +import com.owlike.genson.annotation.JsonProperty; + +@DataType() +public final class Asset { + + @Property() + private final String assetID; + + @Property() + private final String color; + + @Property() + private final int size; + + @Property() + private final String owner; + + @Property() + private final int appraisedValue; + + public String getAssetID() { + return assetID; + } + + public String getColor() { + return color; + } + + public int getSize() { + return size; + } + + public String getOwner() { + return owner; + } + + public int getAppraisedValue() { + return appraisedValue; + } + + public Asset(@JsonProperty("assetID") final String assetID, @JsonProperty("color") final String color, + @JsonProperty("size") final int size, @JsonProperty("owner") final String owner, + @JsonProperty("appraisedValue") final int appraisedValue) { + this.assetID = assetID; + this.color = color; + this.size = size; + this.owner = owner; + this.appraisedValue = appraisedValue; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + + if ((obj == null) || (getClass() != obj.getClass())) { + return false; + } + + Asset other = (Asset) obj; + + return Objects.deepEquals( + new String[] {getAssetID(), getColor(), getOwner()}, + new String[] {other.getAssetID(), other.getColor(), other.getOwner()}) + && + Objects.deepEquals( + new int[] {getSize(), getAppraisedValue()}, + new int[] {other.getSize(), other.getAppraisedValue()}); + } + + @Override + public int hashCode() { + return Objects.hash(getAssetID(), getColor(), getSize(), getOwner(), getAppraisedValue()); + } + + @Override + public String toString() { + return this.getClass().getSimpleName() + "@" + Integer.toHexString(hashCode()) + " [assetID=" + assetID + ", color=" + + color + ", size=" + size + ", owner=" + owner + ", appraisedValue=" + appraisedValue + "]"; + } +} + diff --git a/asset-transfer-basic/java/src/main/java/org/example/AssetTransfer.java b/asset-transfer-basic/java/src/main/java/org/example/AssetTransfer.java new file mode 100644 index 00000000..798cfde5 --- /dev/null +++ b/asset-transfer-basic/java/src/main/java/org/example/AssetTransfer.java @@ -0,0 +1,252 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.hyperledger.fabric.samples.assettransfer; + +import java.util.ArrayList; +import java.util.List; +import java.util.TreeMap; +import java.util.Map; +import java.util.HashMap; + +import com.fasterxml.jackson.core.JsonProcessingException; +import java.io.IOException; + +import org.hyperledger.fabric.contract.Context; +import org.hyperledger.fabric.contract.ContractInterface; +import org.hyperledger.fabric.contract.annotation.Contact; +import org.hyperledger.fabric.contract.annotation.Contract; +import org.hyperledger.fabric.contract.annotation.Default; +import org.hyperledger.fabric.contract.annotation.Info; +import org.hyperledger.fabric.contract.annotation.License; +import org.hyperledger.fabric.contract.annotation.Transaction; +import org.hyperledger.fabric.shim.ChaincodeException; +import org.hyperledger.fabric.shim.ChaincodeStub; +import org.hyperledger.fabric.shim.ledger.KeyValue; +import org.hyperledger.fabric.shim.ledger.QueryResultsIterator; +import com.fasterxml.jackson.core.type.TypeReference; + +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.owlike.genson.Genson; + +@Contract( + name = "basic", + info = @Info( + title = "Asset Transfer", + description = "The hyperlegendary asset transfer", + version = "0.0.1-SNAPSHOT", + license = @License( + name = "Apache 2.0 License", + url = "http://www.apache.org/licenses/LICENSE-2.0.html"), + contact = @Contact( + email = "a.transfer@example.com", + name = "Adrian Transfer", + url = "https://hyperledger.example.com"))) +@Default +public final class AssetTransfer implements ContractInterface { + + private final Genson genson = new Genson(); + private ObjectMapper om = new ObjectMapper().configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true);; + + private enum AssetTransferErrors { + ASSET_NOT_FOUND, + ASSET_ALREADY_EXISTS + } + + /** + * Creates some initial assets on the ledger. + * + * @param ctx the transaction context + */ + @Transaction(intent = Transaction.TYPE.SUBMIT) + public void InitLedger(final Context ctx) throws JsonProcessingException{ + ChaincodeStub stub = ctx.getStub(); + + CreateAsset(ctx, "asset1", "blue", 5, "Tomoko", 300); + CreateAsset(ctx, "asset2", "red", 5, "Brad", 400); + CreateAsset(ctx, "asset3", "green", 10, "Jin Soo", 500); + CreateAsset(ctx, "asset4", "yellow", 10, "Max", 600); + CreateAsset(ctx, "asset5", "black", 15, "Adrian", 700); + CreateAsset(ctx, "asset6", "white", 15, "Michel", 700); + + } + + /** + * Creates a new asset on the ledger. + * + * @param ctx the transaction context + * @param assetID the ID of the new asset + * @param color the color of the new asset + * @param size the size for the new asset + * @param owner the owner of the new asset + * @param appraisedValue the appraisedValue of the new asset + * @return the created asset + */ + @Transaction(intent = Transaction.TYPE.SUBMIT) + public Asset CreateAsset(final Context ctx, final String assetID, final String color, final int size, + final String owner, final int appraisedValue) throws JsonProcessingException{ + ChaincodeStub stub = ctx.getStub(); + + if (AssetExists(ctx, assetID)) { + String errorMessage = String.format("Asset %s already exists", assetID); + System.out.println(errorMessage); + throw new ChaincodeException(errorMessage, AssetTransferErrors.ASSET_ALREADY_EXISTS.toString()); + } + + Asset asset = new Asset(assetID, color, size, owner, appraisedValue); + + //Use a Jackson ObjectMapper to conver the Asset into string, sort it alphabetically and serialize it into a json string + String sortedJson = om.writeValueAsString(asset); + stub.putStringState(assetID, sortedJson); + + return asset; + } + + /** + * Retrieves an asset with the specified ID from the ledger. + * + * @param ctx the transaction context + * @param assetID the ID of the asset + * @return the asset found on the ledger if there was one + */ + @Transaction(intent = Transaction.TYPE.EVALUATE) + public Asset ReadAsset(final Context ctx, final String assetID) throws JsonProcessingException,IOException{ + ChaincodeStub stub = ctx.getStub(); + String assetJSON = stub.getStringState(assetID); + + if (assetJSON == null || assetJSON.isEmpty()) { + String errorMessage = String.format("Asset %s does not exist", assetID); + System.out.println(errorMessage); + throw new ChaincodeException(errorMessage, AssetTransferErrors.ASSET_NOT_FOUND.toString()); + } + + Asset asset = genson.deserialize(assetJSON, Asset.class); + return asset; + } + + /** + * Updates the properties of an asset on the ledger. + * + * @param ctx the transaction context + * @param assetID the ID of the asset being updated + * @param color the color of the asset being updated + * @param size the size of the asset being updated + * @param owner the owner of the asset being updated + * @param appraisedValue the appraisedValue of the asset being updated + * @return the transferred asset + */ + @Transaction(intent = Transaction.TYPE.SUBMIT) + public Asset UpdateAsset(final Context ctx, final String assetID, final String color, final int size, + final String owner, final int appraisedValue) throws JsonProcessingException{ + ChaincodeStub stub = ctx.getStub(); + + if (!AssetExists(ctx, assetID)) { + String errorMessage = String.format("Asset %s does not exist", assetID); + System.out.println(errorMessage); + throw new ChaincodeException(errorMessage, AssetTransferErrors.ASSET_NOT_FOUND.toString()); + } + + Asset newAsset = new Asset(assetID, color, size, owner, appraisedValue); + + //Use a Jackson ObjectMapper to conver the Asset into string, sort it alphabetically and serialize it into a json string + String sortedJson = om.writeValueAsString(newAsset); + stub.putStringState(assetID, sortedJson); + + return newAsset; + } + + /** + * Deletes asset on the ledger. + * + * @param ctx the transaction context + * @param assetID the ID of the asset being deleted + */ + @Transaction(intent = Transaction.TYPE.SUBMIT) + public void DeleteAsset(final Context ctx, final String assetID) { + ChaincodeStub stub = ctx.getStub(); + + if (!AssetExists(ctx, assetID)) { + String errorMessage = String.format("Asset %s does not exist", assetID); + System.out.println(errorMessage); + throw new ChaincodeException(errorMessage, AssetTransferErrors.ASSET_NOT_FOUND.toString()); + } + + stub.delState(assetID); + } + + /** + * Checks the existence of the asset on the ledger + * + * @param ctx the transaction context + * @param assetID the ID of the asset + * @return boolean indicating the existence of the asset + */ + @Transaction(intent = Transaction.TYPE.EVALUATE) + public boolean AssetExists(final Context ctx, final String assetID) { + ChaincodeStub stub = ctx.getStub(); + String assetJSON = stub.getStringState(assetID); + + return (assetJSON != null && !assetJSON.isEmpty()); + } + + /** + * Changes the owner of a asset on the ledger. + * + * @param ctx the transaction context + * @param assetID the ID of the asset being transferred + * @param newOwner the new owner + * @return the updated asset + */ + @Transaction(intent = Transaction.TYPE.SUBMIT) + public Asset TransferAsset(final Context ctx, final String assetID, final String newOwner) throws JsonProcessingException{ + ChaincodeStub stub = ctx.getStub(); + String assetJSON = stub.getStringState(assetID); + + if (assetJSON == null || assetJSON.isEmpty()) { + String errorMessage = String.format("Asset %s does not exist", assetID); + System.out.println(errorMessage); + throw new ChaincodeException(errorMessage, AssetTransferErrors.ASSET_NOT_FOUND.toString()); + } + + //Asset asset = gson.fromJson(assetJSON, Asset.class); + Asset asset = genson.deserialize(assetJSON, Asset.class); + Asset newAsset = new Asset(asset.getAssetID(), asset.getColor(), asset.getSize(), newOwner, asset.getAppraisedValue()); + + //Use a Jackson ObjectMapper to conver the Asset into string, sort it alphabetically and serialize it into a json string + String sortedJson = om.writeValueAsString(newAsset); + stub.putStringState(assetID, sortedJson); + + return newAsset; + } + + /** + * Retrieves all assets from the ledger. + * + * @param ctx the transaction context + * @return array of assets found on the ledger + */ + @Transaction(intent = Transaction.TYPE.EVALUATE) + public String GetAllAssets(final Context ctx) throws JsonProcessingException,IOException{ + ChaincodeStub stub = ctx.getStub(); + + List queryResults = new ArrayList(); + + // To retrieve all assets from the ledger use getStateByRange with empty startKey & endKey. + // Giving empty startKey & endKey is interpreted as all the keys from beginning to end. + // As another example, if you use startKey = 'asset0', endKey = 'asset9' , + // then getStateByRange will retrieve asset with keys between asset0 (inclusive) and asset9 (exclusive) in lexical order. + QueryResultsIterator results = stub.getStateByRange("", ""); + + for (KeyValue result: results) { + Asset asset = genson.deserialize(result.getStringValue(), Asset.class); + System.out.println(asset); + queryResults.add(asset); + } + + //Set pretty printing of json + final String response = genson.serialize(queryResults); + return response; + } +} \ No newline at end of file diff --git a/asset-transfer-basic/chaincode-java/transaction_data/my-asset-transactions.txdata b/asset-transfer-basic/java/transaction_data/my-asset-transactions.txdata similarity index 100% rename from asset-transfer-basic/chaincode-java/transaction_data/my-asset-transactions.txdata rename to asset-transfer-basic/java/transaction_data/my-asset-transactions.txdata diff --git a/asset-transfer-events/chaincode-java/.classpath b/asset-transfer-events/chaincode-java/.classpath deleted file mode 100644 index e16509f7..00000000 --- a/asset-transfer-events/chaincode-java/.classpath +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/asset-transfer-events/chaincode-java/.settings/org.eclipse.buildship.core.prefs b/asset-transfer-events/chaincode-java/.settings/org.eclipse.buildship.core.prefs deleted file mode 100644 index 98515123..00000000 --- a/asset-transfer-events/chaincode-java/.settings/org.eclipse.buildship.core.prefs +++ /dev/null @@ -1,13 +0,0 @@ -arguments= -auto.sync=false -build.scans.enabled=false -connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) -connection.project.dir= -eclipse.preferences.version=1 -gradle.user.home= -java.home=/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home -jvm.arguments= -offline.mode=false -override.workspace.settings=true -show.console.view=true -show.executions.view=true diff --git a/asset-transfer-events/chaincode-java/bin/main/org/hyperledger/fabric/samples/events/Asset.class b/asset-transfer-events/chaincode-java/bin/main/org/hyperledger/fabric/samples/events/Asset.class deleted file mode 100644 index ef76e16b945067d59aeae9c4427e37e1e5e3d94a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4839 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 B_}~Bl diff --git a/asset-transfer-events/chaincode-typescript/dist/asset-contract.d.ts b/asset-transfer-events/chaincode-typescript/dist/asset-contract.d.ts deleted file mode 100644 index a93041eb..00000000 --- a/asset-transfer-events/chaincode-typescript/dist/asset-contract.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Context, Contract } from 'fabric-contract-api'; -export declare class AssetTransferEvents extends Contract { - CreateAsset(ctx: Context, id: string, color: string, size: number, owner: string, appraisedValue: number): Promise; - TransferAsset(ctx: any, id: any, newOwner: any): Promise; - ReadAsset(ctx: Context, id: string): Promise; - UpdateAsset(ctx: Context, id: string, color: string, size: number, owner: string, appraisedValue: number): Promise; - DeleteAsset(ctx: Context, assetId: string): Promise; -} diff --git a/asset-transfer-events/chaincode-typescript/dist/asset-contract.js b/asset-transfer-events/chaincode-typescript/dist/asset-contract.js deleted file mode 100644 index a3a901c0..00000000 --- a/asset-transfer-events/chaincode-typescript/dist/asset-contract.js +++ /dev/null @@ -1,144 +0,0 @@ -"use strict"; -/* - * SPDX-License-Identifier: Apache-2.0 - */ -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (this && this.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AssetTransferEvents = void 0; -const fabric_contract_api_1 = require("fabric-contract-api"); -async function savePrivateData(ctx, assetKey) { - const clientOrg = ctx.clientIdentity.getMSPID(); - const peerOrg = ctx.stub.getMspID(); - const collection = '_implicit_org_' + peerOrg; - if (clientOrg === peerOrg) { - const transientMap = ctx.stub.getTransient(); - if (transientMap) { - const properties = transientMap.get('asset_properties'); - if (properties) { - await ctx.stub.putPrivateData(collection, assetKey, properties); - } - } - } -} -async function removePrivateData(ctx, assetKey) { - const clientOrg = ctx.clientIdentity.getMSPID(); - const peerOrg = ctx.stub.getMspID(); - const collection = '_implicit_org_' + peerOrg; - if (clientOrg === peerOrg) { - const propertiesBuffer = await ctx.stub.getPrivateData(collection, assetKey); - if (propertiesBuffer && propertiesBuffer.length > 0) { - await ctx.stub.deletePrivateData(collection, assetKey); - } - } -} -async function addPrivateData(ctx, assetKey, asset) { - const clientOrg = ctx.clientIdentity.getMSPID(); - const peerOrg = ctx.stub.getMspID(); - const collection = '_implicit_org_' + peerOrg; - if (clientOrg === peerOrg) { - const propertiesBuffer = await ctx.stub.getPrivateData(collection, assetKey); - if (propertiesBuffer && propertiesBuffer.length > 0) { - const properties = JSON.parse(propertiesBuffer.toString()); - asset.asset_properties = properties; - } - } -} -async function readState(ctx, id) { - const assetBuffer = await ctx.stub.getState(id); // get the asset from chaincode state - if (!assetBuffer || assetBuffer.length === 0) { - throw new Error(`The asset ${id} does not exist`); - } - const assetString = assetBuffer.toString(); - const asset = JSON.parse(assetString); - return asset; -} -let AssetTransferEvents = class AssetTransferEvents extends fabric_contract_api_1.Contract { - // CreateAsset issues a new asset to the world state with given details. - async CreateAsset(ctx, id, color, size, owner, appraisedValue) { - const asset = { - ID: id, - Color: color, - Size: size, - Owner: owner, - AppraisedValue: appraisedValue, - }; - await savePrivateData(ctx, id); - const assetBuffer = Buffer.from(JSON.stringify(asset)); - ctx.stub.setEvent('CreateAsset', assetBuffer); - return ctx.stub.putState(id, assetBuffer); - } - // TransferAsset updates the owner field of an asset with the given id in - // the world state. - async TransferAsset(ctx, id, newOwner) { - const asset = await readState(ctx, id); - asset.Owner = newOwner; - const assetBuffer = Buffer.from(JSON.stringify(asset)); - await savePrivateData(ctx, id); - ctx.stub.setEvent('TransferAsset', assetBuffer); - return ctx.stub.putState(id, assetBuffer); - } - // ReadAsset returns the asset stored in the world state with given id. - async ReadAsset(ctx, id) { - const asset = await readState(ctx, id); - await addPrivateData(ctx, asset.ID, asset); - return JSON.stringify(asset); - } - // UpdateAsset updates an existing asset in the world state with provided parameters. - async UpdateAsset(ctx, id, color, size, owner, appraisedValue) { - const asset = await readState(ctx, id); - asset.Color = color; - asset.Size = size; - asset.Owner = owner; - asset.AppraisedValue = appraisedValue; - const assetBuffer = Buffer.from(JSON.stringify(asset)); - await savePrivateData(ctx, id); - ctx.stub.setEvent('UpdateAsset', assetBuffer); - return ctx.stub.putState(id, assetBuffer); - } - // DeleteAsset deletes an given asset from the world state. - async DeleteAsset(ctx, assetId) { - const asset = await readState(ctx, assetId); - const assetBuffer = Buffer.from(JSON.stringify(asset)); - await removePrivateData(ctx, assetId); - ctx.stub.setEvent('DeleteAsset', assetBuffer); - return ctx.stub.deleteState(assetId); - } -}; -__decorate([ - fabric_contract_api_1.Transaction(), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String, String, Number, String, Number]), - __metadata("design:returntype", Promise) -], AssetTransferEvents.prototype, "CreateAsset", null); -__decorate([ - fabric_contract_api_1.Transaction(false), - fabric_contract_api_1.Returns('String'), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String]), - __metadata("design:returntype", Promise) -], AssetTransferEvents.prototype, "ReadAsset", null); -__decorate([ - fabric_contract_api_1.Transaction(), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String, String, Number, String, Number]), - __metadata("design:returntype", Promise) -], AssetTransferEvents.prototype, "UpdateAsset", null); -__decorate([ - fabric_contract_api_1.Transaction(), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String]), - __metadata("design:returntype", Promise) -], AssetTransferEvents.prototype, "DeleteAsset", null); -AssetTransferEvents = __decorate([ - fabric_contract_api_1.Info({ title: 'AssetTransferEvents', description: 'Smart Contract for trading assets and generate events' }) -], AssetTransferEvents); -exports.AssetTransferEvents = AssetTransferEvents; -//# sourceMappingURL=asset-contract.js.map \ No newline at end of file diff --git a/asset-transfer-events/chaincode-typescript/dist/asset-contract.js.map b/asset-transfer-events/chaincode-typescript/dist/asset-contract.js.map deleted file mode 100644 index 2bde6b52..00000000 --- a/asset-transfer-events/chaincode-typescript/dist/asset-contract.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"asset-contract.js","sourceRoot":"","sources":["../src/asset-contract.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/asset-transfer-events/chaincode-typescript/dist/asset.d.ts b/asset-transfer-events/chaincode-typescript/dist/asset.d.ts deleted file mode 100644 index 76258663..00000000 --- a/asset-transfer-events/chaincode-typescript/dist/asset.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -export declare class Asset { - docType?: string; - ID: string; - Color: string; - Size: number; - Owner: string; - AppraisedValue: number; -} diff --git a/asset-transfer-events/chaincode-typescript/dist/asset.js b/asset-transfer-events/chaincode-typescript/dist/asset.js deleted file mode 100644 index 959731c8..00000000 --- a/asset-transfer-events/chaincode-typescript/dist/asset.js +++ /dev/null @@ -1,47 +0,0 @@ -"use strict"; -/* - SPDX-License-Identifier: Apache-2.0 -*/ -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (this && this.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Asset = void 0; -const fabric_contract_api_1 = require("fabric-contract-api"); -let Asset = class Asset { -}; -__decorate([ - fabric_contract_api_1.Property(), - __metadata("design:type", String) -], Asset.prototype, "docType", void 0); -__decorate([ - fabric_contract_api_1.Property(), - __metadata("design:type", String) -], Asset.prototype, "ID", void 0); -__decorate([ - fabric_contract_api_1.Property(), - __metadata("design:type", String) -], Asset.prototype, "Color", void 0); -__decorate([ - fabric_contract_api_1.Property(), - __metadata("design:type", Number) -], Asset.prototype, "Size", void 0); -__decorate([ - fabric_contract_api_1.Property(), - __metadata("design:type", String) -], Asset.prototype, "Owner", void 0); -__decorate([ - fabric_contract_api_1.Property(), - __metadata("design:type", Number) -], Asset.prototype, "AppraisedValue", void 0); -Asset = __decorate([ - fabric_contract_api_1.Object() -], Asset); -exports.Asset = Asset; -//# sourceMappingURL=asset.js.map \ No newline at end of file diff --git a/asset-transfer-events/chaincode-typescript/dist/asset.js.map b/asset-transfer-events/chaincode-typescript/dist/asset.js.map deleted file mode 100644 index 4ea75c0b..00000000 --- a/asset-transfer-events/chaincode-typescript/dist/asset.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"asset.js","sourceRoot":"","sources":["../src/asset.ts"],"names":[],"mappings":";AAAA;;EAEE;;;;;;;;;;;;AAEF,6DAAqD;AAGrD,IAAa,KAAK,GAAlB,MAAa,KAAK;CAkBjB,CAAA;AAhBG;IADC,8BAAQ,EAAE;;sCACa;AAGxB;IADC,8BAAQ,EAAE;;iCACO;AAGlB;IADC,8BAAQ,EAAE;;oCACU;AAGrB;IADC,8BAAQ,EAAE;;mCACS;AAGpB;IADC,8BAAQ,EAAE;;oCACU;AAGrB;IADC,8BAAQ,EAAE;;6CACmB;AAjBrB,KAAK;IADjB,4BAAM,EAAE;GACI,KAAK,CAkBjB;AAlBY,sBAAK"} \ No newline at end of file diff --git a/asset-transfer-events/chaincode-typescript/dist/index.d.ts b/asset-transfer-events/chaincode-typescript/dist/index.d.ts deleted file mode 100644 index 35e4999b..00000000 --- a/asset-transfer-events/chaincode-typescript/dist/index.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { AssetTransferEvents } from './asset-contract'; -export declare const contracts: any[]; diff --git a/asset-transfer-events/chaincode-typescript/dist/index.js b/asset-transfer-events/chaincode-typescript/dist/index.js deleted file mode 100644 index c80d3b40..00000000 --- a/asset-transfer-events/chaincode-typescript/dist/index.js +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; -/* - * SPDX-License-Identifier: Apache-2.0 - */ -Object.defineProperty(exports, "__esModule", { value: true }); -exports.contracts = void 0; -const asset_contract_1 = require("./asset-contract"); -var asset_contract_2 = require("./asset-contract"); -Object.defineProperty(exports, "AssetTransferEvents", { enumerable: true, get: function () { return asset_contract_2.AssetTransferEvents; } }); -exports.contracts = [asset_contract_1.AssetTransferEvents]; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/asset-transfer-events/chaincode-typescript/dist/index.js.map b/asset-transfer-events/chaincode-typescript/dist/index.js.map deleted file mode 100644 index 93647a7b..00000000 --- a/asset-transfer-events/chaincode-typescript/dist/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,qDAAuD;AACvD,mDAAuD;AAA9C,qHAAA,mBAAmB,OAAA;AAEf,QAAA,SAAS,GAAU,CAAE,oCAAmB,CAAE,CAAC"} \ No newline at end of file diff --git a/asset-transfer-ledger-queries/application-java/.classpath b/asset-transfer-ledger-queries/application-java/.classpath deleted file mode 100644 index 6d924d76..00000000 --- a/asset-transfer-ledger-queries/application-java/.classpath +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/asset-transfer-ledger-queries/application-java/.settings/org.eclipse.buildship.core.prefs b/asset-transfer-ledger-queries/application-java/.settings/org.eclipse.buildship.core.prefs deleted file mode 100644 index 98515123..00000000 --- a/asset-transfer-ledger-queries/application-java/.settings/org.eclipse.buildship.core.prefs +++ /dev/null @@ -1,13 +0,0 @@ -arguments= -auto.sync=false -build.scans.enabled=false -connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) -connection.project.dir= -eclipse.preferences.version=1 -gradle.user.home= -java.home=/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home -jvm.arguments= -offline.mode=false -override.workspace.settings=true -show.console.view=true -show.executions.view=true diff --git a/asset-transfer-ledger-queries/application-java/bin/main/application/java/App.class b/asset-transfer-ledger-queries/application-java/bin/main/application/java/App.class deleted file mode 100644 index 0a6f753ab994def48ca76f8f7703768a6c31042b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1274 zcmb_bT~8B16g^W4yIrba`4AOx@v}v36JPv*m>8nIR5U3x09CsY9sJIYuWlSE|of$(q!Qx4Al(Yw(zRzyWi;~c}J z5%!f<)W!A~9+d0H8XH#2xV?H3shorurs^^l8wXKS=uO@X1w*Nx3fkgYrtturSj(>K zVGQ#{%wi%{+L4A~zCOyhRR$+eah$m|S+3Ndb1M#ck8tnlyFetV&BnoHhM8mO!;FI~ zB<;6^)=IlrX886x*21W;D_VY_qC|$-#Qa1nQX82^zE>FZ@&g{n%KA;=4@<1_xo>GY zUSXSup|GbqWJa7iZJWP~@jNWyTI%L?hPe?V%oZ!+GA5VHZ%`1r~Z=8ntKG%%Ny6#EBo z9t(sOi0C4bUZVeb$}DCIRtCDfPgr_W@{e%!3+4L~`do{{_66L)&5;ag&pyMg5e)Z+ P3^`OX_7%E$U&Za8P$WtH diff --git a/asset-transfer-ledger-queries/application-java/bin/main/application/java/EnrollAdmin.class b/asset-transfer-ledger-queries/application-java/bin/main/application/java/EnrollAdmin.class deleted file mode 100644 index 261f90327f4cbb771810d978e3b66c7ce2bf7762..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 948 zcmbVLO-~y!5Pc4TWw*411kx|mnp@yNj!1wip@^uJqE>2Js;VbvV}X&^Uc3$>KdUFC zB9(jlpAfT~isZ0uq+Vt`GjE<}yl;Qq{rCxB51Roh44WcNwTgvT*0j&XrDz`;XSF^W zCdve;GSrH!7Us15VQ?;E&#-i;jPh?77FydU4AqVu$_NVxSFngBhSi=j^8F|oNcTw$ zv}CCFY%KJNa4L`gB&+^RWel%+|C-@|_!FTFL$md*H=U*Loie8f`Tf!HRV>qdgDgOu zp)o~0R06EiTr&mdtXoEtvEQGKlbO|*a>!$wq)Hc$!Bb~x)Fj*IQTVpoIqGO7jpwm2 z#(F-G{GrQRF1R13at<&GJ8qnM+aD<}=Mc>xyCU}1jY}G$@Qct|&Kqh1%1Q|)Upt}A zKFW)c%;s_ZKfdI8KJ#+#hBSlnWowqelq_8*LIclo5k6FW&&*5!}f^hQVDChD!RvNu$e$q9w{( z*pQJ!yBnd+L6*Txx~+t6lwZ{j(RU0co=Pp1d)1*NRwzIqq-HQ*dRy(0*>+ay#!5oKTl?T+ zn4BTXL4iTBXLYQ}!F3|mr?A%8NtkEjKX$dn$fy?9xo?6{sx%!uw1&6_(G%|FpRZR| zD@vkv+!tCK$7{%sy`15KyLN~p4845CwnJyOW9e`NP@mKPEOAMFe#J5A&Px~8e~2D(iVU}=e)gEZA#<9nW9 zl$Jhz;z1laZdz!qtRpv;%OIq?OYTeXC=Ssk*V6^_@+X0}jKb(rkXL=*#M)gB_Q8Qv zGA-2$!e7(YD3vB{c#)q>U(fCT@_2#mQv~{%{cDj_sDv&QzWeAT4t|#>bNn(2H|nRt z|84Piet4T!&KAClk)F=*`#!%%FY_ay&-nEWPnHKoSV(%$O$KwNKlF%g6I&nGWzvpj z`@7uzq$$86P&=c}2#}!_wJ{oVB$a7qG>+Z_GPsrMZvO_g;(0d! diff --git a/asset-transfer-ledger-queries/application-java/bin/main/log4j.properties b/asset-transfer-ledger-queries/application-java/bin/main/log4j.properties deleted file mode 100644 index f1f841fe..00000000 --- a/asset-transfer-ledger-queries/application-java/bin/main/log4j.properties +++ /dev/null @@ -1,19 +0,0 @@ -# initialize root logger with level ERROR for stdout and fout -log4j.rootLogger=ERROR,stdout,fout -# set the log level for these components -log4j.logger.com.endeca=INFO -log4j.logger.com.endeca.itl.web.metrics=INFO - -# add a ConsoleAppender to the logger stdout to write to the console -log4j.appender.stdout=org.apache.log4j.ConsoleAppender -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout -# use a simple message format -log4j.appender.stdout.layout.ConversionPattern=%m%n - -# add a FileAppender to the logger fout -log4j.appender.fout=org.apache.log4j.FileAppender -# create a log file -log4j.appender.fout.File=crawl.log -log4j.appender.fout.layout=org.apache.log4j.PatternLayout -# use a more detailed message pattern -log4j.appender.fout.layout.ConversionPattern=%p\t%d{ISO8601}\t%r\t%c\t[%t]\t%m%n diff --git a/asset-transfer-ledger-queries/chaincode-java/.classpath b/asset-transfer-ledger-queries/chaincode-java/.classpath deleted file mode 100644 index 7a7f31fe..00000000 --- a/asset-transfer-ledger-queries/chaincode-java/.classpath +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/asset-transfer-ledger-queries/chaincode-java/.settings/org.eclipse.buildship.core.prefs b/asset-transfer-ledger-queries/chaincode-java/.settings/org.eclipse.buildship.core.prefs deleted file mode 100644 index 98515123..00000000 --- a/asset-transfer-ledger-queries/chaincode-java/.settings/org.eclipse.buildship.core.prefs +++ /dev/null @@ -1,13 +0,0 @@ -arguments= -auto.sync=false -build.scans.enabled=false -connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) -connection.project.dir= -eclipse.preferences.version=1 -gradle.user.home= -java.home=/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home -jvm.arguments= -offline.mode=false -override.workspace.settings=true -show.console.view=true -show.executions.view=true diff --git a/asset-transfer-ledger-queries/chaincode-java/.settings/org.eclipse.jdt.core.prefs b/asset-transfer-ledger-queries/chaincode-java/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 35068d95..00000000 --- a/asset-transfer-ledger-queries/chaincode-java/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/asset-transfer-ledger-queries/chaincode-java/bin/main/org/example/Asset.class b/asset-transfer-ledger-queries/chaincode-java/bin/main/org/example/Asset.class deleted file mode 100644 index 70f6c39e3a9868609df9b842accf7d773cc3ef18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2839 zcmb7FTXz#x6#k~Uk`4s|1*=pdm(r#!p~^)Gl}lSB*fvO@7%Jd2Ic=w;Ghs5JfTE)Q z2bVuUmk&JXTDEklxP0=#-{f-n?U|uX(md!x=Ipc2zVC1E{PoW-zXLdduVd)Yu*-H9 zGU}nRT&<|gg<4IyF@!bjTrwUQnTla8Wb$)Ms^n^jmF?2?M^&XEIl1{-a2?ZH$ZF`h zR<~SpSL`MsMPtGSWvE)i74*r zA7~eCc+4)VZP2h=$2LSY?3gqyHCFx9^`tN+5uZ57H5%xE~++`X%YV=OCIIZbUGoGjVP8GEH--cy+cWz}q}v2j;; zZ)jfRfwUum5C(M|!H@Q!pz2SstL0`DiieewvHXxDbyJqulUqi9S4MZ7w2O*$C`U^uDfO>0DDcx1zaSO z%1Tuyf*_B!39_M@4Pk2-*YO(mi`Pp!4q`uZx966cCnr!4AiIkK}wtNi*>V7R!#!9@KFr2oSjVxuN^vWV<+?RkS~j6nqW%cB<@PI zA8Y7qQ_9AmgQb$dP0R^)N-Yox-UnvlkY#XQ1Q&EH!X&7;4wO~aFx=?mrA9--J}XFu z_0e!o$NSQ?DJ<)-U~A}f?aS(+FDWrJl{T;$$9*CtH5=@z(Kraw_)yB*SiIHQouQQM ztx<_{MdEy@VShVgFQbX$v1h|uakTL%TR)U)UUX!C#^i5{(Jyq&NXZigyY7_KB~uny z!drsJq&fd{1&w@ot8#x^WlnJ$ z<=$ts+~|3ztumKP8|751=i_aaxi#7-A8Pe{qOI}~^fA7pjB-p$)6d^PjWyXIrK$l} zkROnpo8Tyf?@K>NIz70G;q=fdlIh`9^rXAPtLRPlL{^bXcSl!o=%pZ8L@>{}1oMn3`Ggc6i>h;R8z_3+pyf1$J~ zJi$@KqXa#YZwANtWy`fNUj)BT(}Uk55`H%LC%V#W7#Za6J48ay2LFII6@7t|#SrO?r!rTvZh7@suRYy8R(%(7}SAS3Y?2(?LiY#oz@V$@5&7~?S^jCEXV zMP9K1c_SOs#x)c;`i60eBlRn87HMZ>4aIfbc@864Uc)>&OY5kRN>=5{c^2C7=^mk7 zpYC15gXANhP6_`LpFSk~C#2W#`Q}V@dF8po&2<+B?lc6cf*?Ealwoz?%Z*+374R>@ C!$67v diff --git a/asset-transfer-ledger-queries/chaincode-java/bin/main/org/example/AssetContract$1$1.class b/asset-transfer-ledger-queries/chaincode-java/bin/main/org/example/AssetContract$1$1.class deleted file mode 100644 index 33330faef4ee2dec3d248aaa773e268ee70f7950..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 624 zcmaJ;TT22#6#kB`ZrWDcmfftZ@IfsSqqiamD~PNf3g5?d(3N#3cGoUHs|N{s=m+$p zqBBbn5jb$poHOV8ee?PC{sG_+J0?vWYd|5w@A{jST5QoBz%Z+lwgh8+e z;!)In5%lV}oq=>?g4tE>{mX+SIIZ94T^xEr?})?dDUjji86g|@y{O#aIjsqUxFmb* z1zvnYIH*j_{6DVRCKyfCl{pY*EleSoM;f+;Jmv}MO0_+O1wuw>bULYEA%m>8mMxgb z66RW7Aa6#)jtuWb$4_u6SNLradfNYaG&CAQY0`$}2BXQ}sZr?43omK)ht_?~7f(D7 zTwg`Z*R_oMs%v74P@KRK!MY5X)uyj;MA+i>)BKTI7!7M^EP!om3fLo-Jf``!*t$Y0 z$t~1&$C#6zlUNWq2{glH&Az>k~Dn4FwC$7Qi-EEu;iyBh_)~Ql6a$6Sm`rzWye#wf0Wj zvjm4)`C+HJ-W15xqBdnAFk-{Pa1LpV*~lU_%otj@tijE4E`i)()Keb) z^b?>LBl%*;=6pXwFNk91VxM$3YFk(om>Jlujb*HGO}~1i`UzhAz2Ep963?&k*m<{q zPAZ^whm?CFTgvxb?`aKOvk!Es-(ul^Vg&5HkdbSFl#rDc^`0YwB+tG4B_h;NG|(1@w2FKY1fbUU^K+nr{1YUt1M0~-C{ z5Aa7B@3ciAv?jz&c4qF(ea|`b>-UeJ03P7EgCT|)rE8wp=Z$6{yp1Rlrl3Njxo^^| z4q^<+UH+MS0S{~5+sdx+4TGbFuXHtHm@IWpTSf-nhSt1Yl995ZGN5X-0iOCf@*~nh!q(|HF~u;P$?n*bD=yAqWDHkv&A|*q!PfMjv0cn! zj$y1O%wakVuQJ&|bv3mzD)O3wN-fm641G$wOvR=Tt8A(;5{JI>3C!cBgBuK61F}7% zM;Et{W|*Rcw}kQQqIwb*)U2Xy)*TmdBy9MMi!5^88jtWYK{Xzsw}%*OxaeXGF2i_9 zhT=`DQ4#tBuLK0vR7v?f*x_1Qxwjd!5M!7f44m{TK`c>LE$xdf*>QA&OUpJ5iuWS) z0~HZ)sd;r(b?}g3dLV3FJjN4-xtGFpyhWSsZQ`M@z3*EvDW2Zy(?=p}F${$+1e{)t$N_a=<*fHlFGycZ(UlS>=$VSqPlO=Jq16yZ zX{0-+5%vm!WYSWJBu4)@k~CkWl~20XHk(^GKq~hQ6S>6$T+S_h$27xNTtC3=zrx)E zEPNs5AuQ22MFGJU5NC_Hz?O)G%gB(tOlNKnwL z1N>3OGi?zFtqF0HotZOpZr_>j%&*@+egb%i7Y>FPW|XdZVxKpff$-L&NSJ~Ojpn{d zuQ-S?BzO5|?gc!od2cJb!Z!?#7QWKeh+(qSIc*skcZ77W>b zI;-8yV{Y?nWan;oJr`6fq(H35FtVZ4UW4mBhSV{mve7cEk;!>emr;6|kdy{Ov1+R_ zlxB@#Kl2a0eyQd=`t^gR(1EDdg!Vr1ik7|?)n&u$ZM|;^eXuQ}R$!u{5thYeF^(yQ;Y@bNo?LNp4(CU471tchFcd7N|BUTo z7S|a@Yr-6+!|*DT9fYf?l~Iw`6a=+U=Q8vu?J|K)AEIokFcOEp@(Il0mV=uNTLZE^ zqemCFk!F~pgtvt8>!Ny+7F4XFE!JHZaU^W`jEgLCU5rP3nIMcu?Cmke8ZNjPh08Er zlA(ChYE*>&z$*cfHC0kR4|cegR_<-aEX5dR2NNf~LKI7sRZII~OLiQc=%po_2F2S9 z{Xj)TTq<5&RUJHHm>x)57fhf7Hnx2ZjTRG@qCPDv`UdDn~weF@Eog{ F{sRNlgkt~z diff --git a/asset-transfer-ledger-queries/chaincode-java/bin/main/org/example/AssetContract$4.class b/asset-transfer-ledger-queries/chaincode-java/bin/main/org/example/AssetContract$4.class deleted file mode 100644 index fd0f8fc3d946891cc75ce87a11ab72c646f36077..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 811 zcma)4+invv5Is&pLblsBq~%%?S_qI!#qyB1AfzY)R5gIqR(Yg2n_=V1*{!?|BA>-W zh2Vh?;G+=ZB@!SMgeBWEAlvW=6Ek7MPF31?%ms!kD>(cU z6)XEx;IR1*Ty`{FoRiTsiO2-+u(8M(VIRlq3DY2__*!vZ1A0* z8f6?EsP3bLqQK@*#q?@E8z1=>9~qg$9bT&_aEdo5i&Jcgx2Unb%W*%;TgM*mvX{p_ WUUO*RKJNuQKocFdJVv?tJbnN@W5-?q diff --git a/asset-transfer-ledger-queries/chaincode-java/bin/main/org/example/AssetContract$5.class b/asset-transfer-ledger-queries/chaincode-java/bin/main/org/example/AssetContract$5.class deleted file mode 100644 index 095a2f3065920f2db8faabf57301133e62d6e281..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 948 zcmb7CU2hUW6g>kJgpMszTCEkWigtn8t+jo^n2^Q~QmRQycpsK2Otb9b>|n~z@}V*M z;1BRe8SgBZ+89jSWai$vbI#nm=iVPbzkLU=kNpf13>%^DyYfN|N4|6$Q6$Y_7#J-) zQ$ENb#gIQ2pM>j+pznU@o=eX#q}mtF9z&sZb#-dA3i@@1Y+DUwWavGHl_|hb#BBx? z3=AO_I>H}IhO`-|sJu%hwC2`8@bpU+DD#Tp#Q6sJ`vJ%IAJYe9Kbfx6#Z{{^EE%hNs1~)AAF-O_vTO#VT z9kI|B^pqouG{bUB1@irP*p<31x;{0b&*T2}8~K zL%gPu+E!ejDLOXFcN%Eih#K_)4e5{?IW`(QsQgt6 z51>{>eeOq9y<<{vrScF<_RRI%d+s?i$Nu&E+ZBM-dtl{ly?^NbY!tLYAd;rKcmpFm}XGc-H1lCtG%UU54?ZX_g!NwR&TJyS`W3V#rnp zg3U8bUSkxi@5;rk)_(bY#cY@iBjwuO?qai8-78a+`!FzWtkAYC$MQEAv{bsu5GlDI zMGV6U5OD(&xW^DJ^i!r&)mw3fWm-` zH>jggaU3B7ih@j^W0<|u&}5DOd?}kbGKWSVnzlKsj04a}o&hH2lw)WmLSq6WlxI-X zq*z_6-@#hRQSAa_=ST*@WF!cthJVnKc7~+cikxA}Jjcvesu;p7J;#D>YZ%2k=8&UX zt*DzU-tVzSIf|2>Sz5Tj{B3cR63{O)g1L?bMV5#@#G`)sTN0wmr_V6c+R-vst%72- ztIc2H@$wg1xu$ZB#%?IY>G)svF*1~+dL@!9bBR|!!S1fpkO?rCupEplSXGr&Pk$J! HZO;7x^++eV diff --git a/asset-transfer-ledger-queries/chaincode-java/bin/main/org/example/AssetContract.class b/asset-transfer-ledger-queries/chaincode-java/bin/main/org/example/AssetContract.class deleted file mode 100644 index 899947908f2850259ad7ac4227948be4c1380f82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12330 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 diff --git a/asset-transfer-ledger-queries/chaincode-typescript/dist/asset-contract.d.ts b/asset-transfer-ledger-queries/chaincode-typescript/dist/asset-contract.d.ts deleted file mode 100644 index a239cf90..00000000 --- a/asset-transfer-ledger-queries/chaincode-typescript/dist/asset-contract.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Context, Contract } from 'fabric-contract-api'; -import { Iterators } from 'fabric-shim-api'; -export declare class AssetContract extends Contract { - CreateAsset(ctx: Context, assetID: string, color: string, size: number, owner: string, appraisedValue: number): Promise; - ReadAsset(ctx: Context, id: string): Promise; - DeleteAsset(ctx: Context, id: string): Promise; - TransferAsset(ctx: Context, assetName: string, newOwner: string): Promise; - GetAssetsByRange(ctx: Context, startKey: string, endKey: string): Promise; - TransferAssetByColor(ctx: Context, color: string, newOwner: string): Promise; - QueryAssetsByOwner(ctx: Context, owner: string): Promise; - QueryAssets(ctx: Context, queryString: string): Promise; - GetQueryResultForQueryString(ctx: Context, queryString: string): Promise; - GetAssetsByRangeWithPagination(ctx: Context, startKey: string, endKey: string, pageSize: number, bookmark: string): Promise; - QueryAssetsWithPagination(ctx: Context, queryString: string, pageSize: number, bookmark: string): Promise; - GetAssetHistory(ctx: Context, assetName: string): Promise; - AssetExists(ctx: Context, assetName: string): Promise; - GetAllResults(iterator: Iterators.CommonIterator, isHistory: boolean): Promise; - InitLedger(ctx: Context): Promise; -} diff --git a/asset-transfer-ledger-queries/chaincode-typescript/dist/asset-contract.js b/asset-transfer-ledger-queries/chaincode-typescript/dist/asset-contract.js deleted file mode 100644 index 9919ee64..00000000 --- a/asset-transfer-ledger-queries/chaincode-typescript/dist/asset-contract.js +++ /dev/null @@ -1,452 +0,0 @@ -"use strict"; -/* - * Copyright IBM Corp. All Rights Reserved. - * - * SPDX-License-Identifier: Apache-2.0 -*/ -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (this && this.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AssetContract = void 0; -// ====CHAINCODE EXECUTION SAMPLES (CLI) ================== -// ==== Invoke assets ==== -// peer chaincode invoke -C CHANNEL_NAME -n asset_transfer -c '{"Args":["CreateAsset","asset1","blue","35","Tom","100"]}' -// peer chaincode invoke -C CHANNEL_NAME -n asset_transfer -c '{"Args":["CreateAsset","asset2","red","50","Tom","150"]}' -// peer chaincode invoke -C CHANNEL_NAME -n asset_transfer -c '{"Args":["CreateAsset","asset3","blue","70","Tom","200"]}' -// peer chaincode invoke -C CHANNEL_NAME -n asset_transfer -c '{"Args":["TransferAsset","asset2","jerry"]}' -// peer chaincode invoke -C CHANNEL_NAME -n asset_transfer -c '{"Args":["TransferAssetsBasedOnColor","blue","jerry"]}' -// peer chaincode invoke -C CHANNEL_NAME -n asset_transfer -c '{"Args":["DeleteAsset","asset1"]}' -// ==== Query assets ==== -// peer chaincode query -C CHANNEL_NAME -n asset_transfer -c '{"Args":["ReadAsset","asset1"]}' -// peer chaincode query -C CHANNEL_NAME -n asset_transfer -c '{"Args":["GetAssetsByRange","asset1","asset3"]}' -// peer chaincode query -C CHANNEL_NAME -n asset_transfer -c '{"Args":["GetAssetHistory","asset1"]}' -// Rich Query (Only supported if CouchDB is used as state database): -// peer chaincode query -C CHANNEL_NAME -n asset_transfer -c '{"Args":["QueryAssetsByOwner","Tom"]}' output issue -// peer chaincode query -C CHANNEL_NAME -n asset_transfer -c '{"Args":["QueryAssets","{\"selector\":{\"owner\":\"Tom\"}}"]}' -// Rich Query with Pagination (Only supported if CouchDB is used as state database): -// peer chaincode query -C CHANNEL_NAME -n asset_transfer -c '{"Args":["QueryAssetsWithPagination","{\"selector\":{\"owner\":\"Tom\"}}","3",""]}' -// INDEXES TO SUPPORT COUCHDB RICH QUERIES -// -// Indexes in CouchDB are required in order to make JSON queries efficient and are required for -// any JSON query with a sort. Indexes may be packaged alongside -// chaincode in a META-INF/statedb/couchdb/indexes directory. Each index must be defined in its own -// text file with extension *.json with the index definition formatted in JSON following the -// CouchDB index JSON syntax as documented at: -// http://docs.couchdb.org/en/2.3.1/api/database/find.html#db-index -// -// This asset transfer ledger example chaincode demonstrates a packaged -// index which you can find in META-INF/statedb/couchdb/indexes/indexOwner.json. -// -// If you have access to the your peer's CouchDB state database in a development environment, -// you may want to iteratively test various indexes in support of your chaincode queries. You -// can use the CouchDB Fauxton interface or a command line curl utility to create and update -// indexes. Then once you finalize an index, include the index definition alongside your -// chaincode in the META-INF/statedb/couchdb/indexes directory, for packaging and deployment -// to managed environments. -// -// In the examples below you can find index definitions that support asset transfer ledger -// chaincode queries, along with the syntax that you can use in development environments -// to create the indexes in the CouchDB Fauxton interface or a curl command line utility. -// -// Index for docType, owner. -// -// Example curl command line to define index in the CouchDB channel_chaincode database -// curl -i -X POST -H "Content-Type: application/json" -d "{\"index\":{\"fields\":[\"docType\",\"owner\"]},\"name\":\"indexOwner\",\"ddoc\":\"indexOwnerDoc\",\"type\":\"json\"}" http://hostname:port/myc1_assets/_index -// -// Index for docType, owner, size (descending order). -// -// Example curl command line to define index in the CouchDB channel_chaincode database -// curl -i -X POST -H "Content-Type: application/json" -d "{\"index\":{\"fields\":[{\"size\":\"desc\"},{\"docType\":\"desc\"},{\"owner\":\"desc\"}]},\"ddoc\":\"indexSizeSortDoc\", \"name\":\"indexSizeSortDesc\",\"type\":\"json\"}" http://hostname:port/myc1_assets/_index -// Rich Query with index design doc and index name specified (Only supported if CouchDB is used as state database): -// peer chaincode query -C CHANNEL_NAME -n asset_transfer -c '{"Args":["QueryAssets","{\"selector\":{\"docType\":\"asset\",\"owner\":\"Tom\"}, \"use_index\":[\"_design/indexOwnerDoc\", \"indexOwner\"]}"]}' -// Rich Query with index design doc specified only (Only supported if CouchDB is used as state database): -// peer chaincode query -C CHANNEL_NAME -n asset_transfer -c '{"Args":["QueryAssets","{\"selector\":{\"docType\":{\"$eq\":\"asset\"},\"owner\":{\"$eq\":\"Tom\"},\"size\":{\"$gt\":0}},\"fields\":[\"docType\",\"owner\",\"size\"],\"sort\":[{\"size\":\"desc\"}],\"use_index\":\"_design/indexSizeSortDoc\"}"]}' -const fabric_contract_api_1 = require("fabric-contract-api"); -let AssetContract = class AssetContract extends fabric_contract_api_1.Contract { - // CreateAsset - create a new asset, store into chaincode state - async CreateAsset(ctx, assetID, color, size, owner, appraisedValue) { - const exists = await this.AssetExists(ctx, assetID); - if (exists) { - throw new Error(`The asset ${assetID} already exists`); - } - // ==== Create asset object and marshal to JSON ==== - const asset = { - docType: 'asset', - ID: assetID, - Color: color, - Size: size, - Owner: owner, - AppraisedValue: appraisedValue, - }; - // === Save asset to state === - await ctx.stub.putState(assetID, Buffer.from(JSON.stringify(asset))); - let indexName = 'color~name'; - let colorNameIndexKey = await ctx.stub.createCompositeKey(indexName, [asset.Color, asset.ID]); - // Save index entry to state. Only the key name is needed, no need to store a duplicate copy of the marble. - // Note - passing a 'nil' value will effectively delete the key from state, therefore we pass null character as value - await ctx.stub.putState(colorNameIndexKey, Buffer.from('\u0000')); - } - // ReadAsset returns the asset stored in the world state with given id. - async ReadAsset(ctx, id) { - const assetJSON = await ctx.stub.getState(id); // get the asset from chaincode state - if (!assetJSON || assetJSON.length === 0) { - throw new Error(`Asset ${id} does not exist`); - } - return assetJSON.toString(); - } - // delete - remove a asset key/value pair from state - async DeleteAsset(ctx, id) { - if (!id) { - throw new Error('Asset name must not be empty'); - } - let exists = await this.AssetExists(ctx, id); - if (!exists) { - throw new Error(`Asset ${id} does not exist`); - } - // to maintain the color~name index, we need to read the asset first and get its color - let valAsbytes = await ctx.stub.getState(id); // get the asset from chaincode state - let jsonResp = {}; - if (!valAsbytes) { - jsonResp.error = `Asset does not exist: ${id}`; - throw new Error(jsonResp); - } - let assetJSON; - try { - assetJSON = JSON.parse(valAsbytes.toString()); - } - catch (err) { - jsonResp = {}; - jsonResp.error = `Failed to decode JSON of: ${id}`; - throw new Error(jsonResp); - } - await ctx.stub.deleteState(id); //remove the asset from chaincode state - // delete the index - let indexName = 'color~name'; - let colorNameIndexKey = ctx.stub.createCompositeKey(indexName, [assetJSON.color, assetJSON.assetID]); - if (!colorNameIndexKey) { - throw new Error(' Failed to create the createCompositeKey'); - } - // Delete index entry to state. - await ctx.stub.deleteState(colorNameIndexKey); - } - // TransferAsset transfers a asset by setting a new owner name on the asset - async TransferAsset(ctx, assetName, newOwner) { - let assetAsBytes = await ctx.stub.getState(assetName); - if (!assetAsBytes || !assetAsBytes.toString()) { - throw new Error(`Asset ${assetName} does not exist`); - } - let assetToTransfer = {}; - try { - assetToTransfer = JSON.parse(assetAsBytes.toString()); //unmarshal - } - catch (err) { - let jsonResp = {}; - jsonResp.error = 'Failed to decode JSON of: ' + assetName; - throw new Error(jsonResp); - } - assetToTransfer.owner = newOwner; //change the owner - let assetJSONasBytes = Buffer.from(JSON.stringify(assetToTransfer)); - await ctx.stub.putState(assetName, assetJSONasBytes); //rewrite the asset - } - // GetAssetsByRange performs a range query based on the start and end keys provided. - // Read-only function results are not typically submitted to ordering. If the read-only - // results are submitted to ordering, or if the query is used in an update transaction - // and submitted to ordering, then the committing peers will re-execute to guarantee that - // result sets are stable between endorsement time and commit time. The transaction is - // invalidated by the committing peers if the result set has changed between endorsement - // time and commit time. - // Therefore, range queries are a safe option for performing update transactions based on query results. - async GetAssetsByRange(ctx, startKey, endKey) { - let resultsIterator = await ctx.stub.getStateByRange(startKey, endKey); - let results = await this.GetAllResults(resultsIterator, false); - return JSON.stringify(results); - } - // TransferAssetBasedOnColor will transfer assets of a given color to a certain new owner. - // Uses a GetStateByPartialCompositeKey (range query) against color~name 'index'. - // Committing peers will re-execute range queries to guarantee that result sets are stable - // between endorsement time and commit time. The transaction is invalidated by the - // committing peers if the result set has changed between endorsement time and commit time. - // Therefore, range queries are a safe option for performing update transactions based on query results. - // Example: GetStateByPartialCompositeKey/RangeQuery - async TransferAssetByColor(ctx, color, newOwner) { - // Query the color~name index by color - // This will execute a key range query on all keys starting with 'color' - let coloredAssetResultsIterator = await ctx.stub.getStateByPartialCompositeKey('color~name', [color]); - // Iterate through result set and for each asset found, transfer to newOwner - let responseRange = await coloredAssetResultsIterator.next(); - while (!responseRange.done) { - if (!responseRange || !responseRange.value || !responseRange.value.key) { - return; - } - let objectType; - let attributes; - ({ objectType, attributes } = await ctx.stub.splitCompositeKey(responseRange.value.key)); - console.log(objectType); - let returnedAssetName = attributes[1]; - // Now call the transfer function for the found asset. - // Re-use the same function that is used to transfer individual assets - await this.TransferAsset(ctx, returnedAssetName, newOwner); - responseRange = await coloredAssetResultsIterator.next(); - } - } - // QueryAssetsByOwner queries for assets based on a passed in owner. - // This is an example of a parameterized query where the query logic is baked into the chaincode, - // and accepting a single query parameter (owner). - // Only available on state databases that support rich query (e.g. CouchDB) - // Example: Parameterized rich query - async QueryAssetsByOwner(ctx, owner) { - let queryString = {}; - queryString.selector = {}; - queryString.selector.docType = 'asset'; - queryString.selector.owner = owner; - return await this.GetQueryResultForQueryString(ctx, JSON.stringify(queryString)); //shim.success(queryResults); - } - // Example: Ad hoc rich query - // QueryAssets uses a query string to perform a query for assets. - // Query string matching state database syntax is passed in and executed as is. - // Supports ad hoc queries that can be defined at runtime by the client. - // If this is not desired, follow the QueryAssetsForOwner example for parameterized queries. - // Only available on state databases that support rich query (e.g. CouchDB) - async QueryAssets(ctx, queryString) { - return await this.GetQueryResultForQueryString(ctx, queryString); - } - // GetQueryResultForQueryString executes the passed in query string. - // Result set is built and returned as a byte array containing the JSON results. - async GetQueryResultForQueryString(ctx, queryString) { - let resultsIterator = await ctx.stub.getQueryResult(queryString); - let results = await this.GetAllResults(resultsIterator, false); - return JSON.stringify(results); - } - // Example: Pagination with Range Query - // GetAssetsByRangeWithPagination performs a range query based on the start & end key, - // page size and a bookmark. - // The number of fetched records will be equal to or lesser than the page size. - // Paginated range queries are only valid for read only transactions. - async GetAssetsByRangeWithPagination(ctx, startKey, endKey, pageSize, bookmark) { - const { iterator, metadata } = await ctx.stub.getStateByRangeWithPagination(startKey, endKey, pageSize, bookmark); - const records = await this.GetAllResults(iterator, false); - var results = { - Records: records, - RecordsCount: metadata.fetchedRecordsCount, - Bookmark: metadata.bookmark, - }; - return JSON.stringify(results); - } - // Example: Pagination with Ad hoc Rich Query - // QueryAssetsWithPagination uses a query string, page size and a bookmark to perform a query - // for assets. Query string matching state database syntax is passed in and executed as is. - // The number of fetched records would be equal to or lesser than the specified page size. - // Supports ad hoc queries that can be defined at runtime by the client. - // If this is not desired, follow the QueryAssetsForOwner example for parameterized queries. - // Only available on state databases that support rich query (e.g. CouchDB) - // Paginated queries are only valid for read only transactions. - async QueryAssetsWithPagination(ctx, queryString, pageSize, bookmark) { - const { iterator, metadata } = await ctx.stub.getQueryResultWithPagination(queryString, pageSize, bookmark); - const records = await this.GetAllResults(iterator, false); - var results = { - Records: records, - RecordsCount: metadata.fetchedRecordsCount, - Bookmark: metadata.bookmark, - }; - return JSON.stringify(results); - } - // GetAssetHistory returns the chain of custody for an asset since issuance. - async GetAssetHistory(ctx, assetName) { - let resultsIterator = await ctx.stub.getHistoryForKey(assetName); - let results = await this.GetAllResults(resultsIterator, true); - return JSON.stringify(results); - } - // AssetExists returns true when asset with given ID exists in world state - async AssetExists(ctx, assetName) { - // ==== Check if asset already exists ==== - let assetState = await ctx.stub.getState(assetName); - return assetState && assetState.length > 0; - } - // This is JavaScript so without Funcation Decorators, all functions are assumed - // to be transaction functions - // - // For internal functions... prefix them with _ - async GetAllResults(iterator, isHistory) { - let allResults = []; - let res = await iterator.next(); - while (!res.done) { - if (res.value && res.value.value.toString()) { - let jsonRes = {}; - console.log(res.value.value.toString('utf8')); - if (isHistory) { - jsonRes.TxId = res.value.txId; - jsonRes.Timestamp = res.value.timestamp; - try { - jsonRes.Value = JSON.parse(res.value.value.toString('utf8')); - } - catch (err) { - console.log(err); - jsonRes.Value = res.value.value.toString('utf8'); - } - } - else { - jsonRes.Key = res.value.key; - try { - jsonRes.Record = JSON.parse(res.value.value.toString('utf8')); - } - catch (err) { - console.log(err); - jsonRes.Record = res.value.value.toString('utf8'); - } - } - allResults.push(jsonRes); - } - res = await iterator.next(); - } - return allResults; - } - // InitLedger creates sample assets in the ledger - async InitLedger(ctx) { - const assets = [ - { - ID: 'asset1', - Color: 'blue', - Size: 5, - Owner: 'Tomoko', - AppraisedValue: 300, - }, - { - ID: 'asset2', - Color: 'red', - Size: 5, - Owner: 'Brad', - AppraisedValue: 400, - }, - { - ID: 'asset3', - Color: 'green', - Size: 10, - Owner: 'Jin Soo', - AppraisedValue: 500, - }, - { - ID: 'asset4', - Color: 'yellow', - Size: 10, - Owner: 'Max', - AppraisedValue: 600, - }, - { - ID: 'asset5', - Color: 'black', - Size: 15, - Owner: 'Adriana', - AppraisedValue: 700, - }, - { - ID: 'asset6', - Color: 'white', - Size: 15, - Owner: 'Michel', - AppraisedValue: 800, - }, - ]; - for (const asset of assets) { - asset.docType = 'asset'; - await ctx.stub.putState(asset.ID, Buffer.from(JSON.stringify(asset))); - console.info(`Asset ${asset.ID} initialized`); - } - } -}; -__decorate([ - fabric_contract_api_1.Transaction(), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String, String, Number, String, Number]), - __metadata("design:returntype", Promise) -], AssetContract.prototype, "CreateAsset", null); -__decorate([ - fabric_contract_api_1.Transaction(false), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String]), - __metadata("design:returntype", Promise) -], AssetContract.prototype, "ReadAsset", null); -__decorate([ - fabric_contract_api_1.Transaction(), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String]), - __metadata("design:returntype", Promise) -], AssetContract.prototype, "DeleteAsset", null); -__decorate([ - fabric_contract_api_1.Transaction(), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String, String]), - __metadata("design:returntype", Promise) -], AssetContract.prototype, "TransferAsset", null); -__decorate([ - fabric_contract_api_1.Transaction(), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String, String]), - __metadata("design:returntype", Promise) -], AssetContract.prototype, "GetAssetsByRange", null); -__decorate([ - fabric_contract_api_1.Transaction(), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String, String]), - __metadata("design:returntype", Promise) -], AssetContract.prototype, "TransferAssetByColor", null); -__decorate([ - fabric_contract_api_1.Transaction(false), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String]), - __metadata("design:returntype", Promise) -], AssetContract.prototype, "QueryAssetsByOwner", null); -__decorate([ - fabric_contract_api_1.Transaction(false), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String]), - __metadata("design:returntype", Promise) -], AssetContract.prototype, "QueryAssets", null); -__decorate([ - fabric_contract_api_1.Transaction(false), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String]), - __metadata("design:returntype", Promise) -], AssetContract.prototype, "GetQueryResultForQueryString", null); -__decorate([ - fabric_contract_api_1.Transaction(false), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String, String, Number, String]), - __metadata("design:returntype", Promise) -], AssetContract.prototype, "GetAssetsByRangeWithPagination", null); -__decorate([ - fabric_contract_api_1.Transaction(false), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String, Number, String]), - __metadata("design:returntype", Promise) -], AssetContract.prototype, "QueryAssetsWithPagination", null); -__decorate([ - fabric_contract_api_1.Transaction(), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String]), - __metadata("design:returntype", Promise) -], AssetContract.prototype, "GetAssetHistory", null); -__decorate([ - fabric_contract_api_1.Transaction(false), - fabric_contract_api_1.Returns('boolean'), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context, String]), - __metadata("design:returntype", Promise) -], AssetContract.prototype, "AssetExists", null); -__decorate([ - fabric_contract_api_1.Transaction(), - __metadata("design:type", Function), - __metadata("design:paramtypes", [fabric_contract_api_1.Context]), - __metadata("design:returntype", Promise) -], AssetContract.prototype, "InitLedger", null); -AssetContract = __decorate([ - fabric_contract_api_1.Info({ title: 'AssetContract', description: 'My Smart Contract' }) -], AssetContract); -exports.AssetContract = AssetContract; -//# sourceMappingURL=asset-contract.js.map \ No newline at end of file diff --git a/asset-transfer-ledger-queries/chaincode-typescript/dist/asset-contract.js.map b/asset-transfer-ledger-queries/chaincode-typescript/dist/asset-contract.js.map deleted file mode 100644 index c4566538..00000000 --- a/asset-transfer-ledger-queries/chaincode-typescript/dist/asset-contract.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"asset-contract.js","sourceRoot":"","sources":["../src/asset-contract.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/asset-transfer-ledger-queries/chaincode-typescript/dist/asset.d.ts b/asset-transfer-ledger-queries/chaincode-typescript/dist/asset.d.ts deleted file mode 100644 index 76258663..00000000 --- a/asset-transfer-ledger-queries/chaincode-typescript/dist/asset.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -export declare class Asset { - docType?: string; - ID: string; - Color: string; - Size: number; - Owner: string; - AppraisedValue: number; -} diff --git a/asset-transfer-ledger-queries/chaincode-typescript/dist/asset.js b/asset-transfer-ledger-queries/chaincode-typescript/dist/asset.js deleted file mode 100644 index 959731c8..00000000 --- a/asset-transfer-ledger-queries/chaincode-typescript/dist/asset.js +++ /dev/null @@ -1,47 +0,0 @@ -"use strict"; -/* - SPDX-License-Identifier: Apache-2.0 -*/ -var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (this && this.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Asset = void 0; -const fabric_contract_api_1 = require("fabric-contract-api"); -let Asset = class Asset { -}; -__decorate([ - fabric_contract_api_1.Property(), - __metadata("design:type", String) -], Asset.prototype, "docType", void 0); -__decorate([ - fabric_contract_api_1.Property(), - __metadata("design:type", String) -], Asset.prototype, "ID", void 0); -__decorate([ - fabric_contract_api_1.Property(), - __metadata("design:type", String) -], Asset.prototype, "Color", void 0); -__decorate([ - fabric_contract_api_1.Property(), - __metadata("design:type", Number) -], Asset.prototype, "Size", void 0); -__decorate([ - fabric_contract_api_1.Property(), - __metadata("design:type", String) -], Asset.prototype, "Owner", void 0); -__decorate([ - fabric_contract_api_1.Property(), - __metadata("design:type", Number) -], Asset.prototype, "AppraisedValue", void 0); -Asset = __decorate([ - fabric_contract_api_1.Object() -], Asset); -exports.Asset = Asset; -//# sourceMappingURL=asset.js.map \ No newline at end of file diff --git a/asset-transfer-ledger-queries/chaincode-typescript/dist/asset.js.map b/asset-transfer-ledger-queries/chaincode-typescript/dist/asset.js.map deleted file mode 100644 index 4ea75c0b..00000000 --- a/asset-transfer-ledger-queries/chaincode-typescript/dist/asset.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"asset.js","sourceRoot":"","sources":["../src/asset.ts"],"names":[],"mappings":";AAAA;;EAEE;;;;;;;;;;;;AAEF,6DAAqD;AAGrD,IAAa,KAAK,GAAlB,MAAa,KAAK;CAkBjB,CAAA;AAhBG;IADC,8BAAQ,EAAE;;sCACa;AAGxB;IADC,8BAAQ,EAAE;;iCACO;AAGlB;IADC,8BAAQ,EAAE;;oCACU;AAGrB;IADC,8BAAQ,EAAE;;mCACS;AAGpB;IADC,8BAAQ,EAAE;;oCACU;AAGrB;IADC,8BAAQ,EAAE;;6CACmB;AAjBrB,KAAK;IADjB,4BAAM,EAAE;GACI,KAAK,CAkBjB;AAlBY,sBAAK"} \ No newline at end of file diff --git a/asset-transfer-ledger-queries/chaincode-typescript/dist/index.d.ts b/asset-transfer-ledger-queries/chaincode-typescript/dist/index.d.ts deleted file mode 100644 index a6682c7a..00000000 --- a/asset-transfer-ledger-queries/chaincode-typescript/dist/index.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { AssetContract } from './asset-contract'; -export declare const contracts: any[]; diff --git a/asset-transfer-ledger-queries/chaincode-typescript/dist/index.js b/asset-transfer-ledger-queries/chaincode-typescript/dist/index.js deleted file mode 100644 index 449966d9..00000000 --- a/asset-transfer-ledger-queries/chaincode-typescript/dist/index.js +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; -/* - * SPDX-License-Identifier: Apache-2.0 - */ -Object.defineProperty(exports, "__esModule", { value: true }); -exports.contracts = void 0; -const asset_contract_1 = require("./asset-contract"); -var asset_contract_2 = require("./asset-contract"); -Object.defineProperty(exports, "AssetContract", { enumerable: true, get: function () { return asset_contract_2.AssetContract; } }); -exports.contracts = [asset_contract_1.AssetContract]; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/asset-transfer-ledger-queries/chaincode-typescript/dist/index.js.map b/asset-transfer-ledger-queries/chaincode-typescript/dist/index.js.map deleted file mode 100644 index 2e429a9c..00000000 --- a/asset-transfer-ledger-queries/chaincode-typescript/dist/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,qDAAiD;AACjD,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AAET,QAAA,SAAS,GAAU,CAAE,8BAAa,CAAE,CAAC"} \ No newline at end of file diff --git a/asset-transfer-private-data/chaincode-java/.classpath b/asset-transfer-private-data/chaincode-java/.classpath deleted file mode 100644 index c1735d38..00000000 --- a/asset-transfer-private-data/chaincode-java/.classpath +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/asset-transfer-private-data/chaincode-java/.settings/org.eclipse.buildship.core.prefs b/asset-transfer-private-data/chaincode-java/.settings/org.eclipse.buildship.core.prefs deleted file mode 100644 index 98515123..00000000 --- a/asset-transfer-private-data/chaincode-java/.settings/org.eclipse.buildship.core.prefs +++ /dev/null @@ -1,13 +0,0 @@ -arguments= -auto.sync=false -build.scans.enabled=false -connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) -connection.project.dir= -eclipse.preferences.version=1 -gradle.user.home= -java.home=/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home -jvm.arguments= -offline.mode=false -override.workspace.settings=true -show.console.view=true -show.executions.view=true diff --git a/asset-transfer-private-data/chaincode-java/bin/main/org/hyperledger/fabric/samples/privatedata/Asset.class b/asset-transfer-private-data/chaincode-java/bin/main/org/hyperledger/fabric/samples/privatedata/Asset.class deleted file mode 100644 index 3a89a6953fec63582961022602d91e177638a099..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4023 zcmbVP`Bz-!8Gb&PjmagLF~p!r7*kD#8Nx(sViF97B`5}%$Pf(DNH4<;TpaG;%q5F$ zYB#I4O;@{EySLgcZKIWeimCRO{?I?DKlSwVdB1ysVHnP-J#)_e*7tp%cmL*}|9Ss! z03OBP!>Cg@S}4w>XRj|<#k@5=V-?ev&8ecDOP9>~g}hZtFBI)7rfW@`u9@yGl`J=m zfWlpK<`pxYH=UVuW@^sLxe8%ZP6zrFVuKr}S+{6AGo1=8Ba4n}&s$@5$)3tv-Huam zP1i0sC52;y+knUw9JgrZ+_brVJ$=4dAXxW0c}5Fb_9)RS1apOap{Nij*)MXb2DnwY z>R8;0&RDL-F6eeA+G^no^cJSA1`xf0AVLaFgSKN0FV0U{#Zi-pMXy56%#WExTh{(& zz@4?J!o%CCu&o`5KSEr+f?DLZ7>J78FgLSWh5AI>fSl|%umgs7JtG>)X52udTyNxc z&jn%zIr)Tv204k)9s0ULb7HH?ZDYLRSXX@;g&wmV+wD>qtZ{cM_12w%ty^tlQPd-8 z;4o4OREHu1uJ%?#$)XwaTF*eDZK5ZPqY8IR9L$vpPWq{AX4q3JiZmV;7N4xr!#nO2 zA!!^la2!q4$Srsw*MJi^6~;-0`*k!rb|IacHH$P#I_sLwv{{_)_0}Z=op_Ala$&T8 z@`S>@o+gzP{>{!Px^O0p$2VnwC(uAQdORofTz4(T!~x%uwHQ%jx>{5vwZe{RtHL11 z6B9jcA3vZ3+!JD{Cly-BVtX~jW(rRk=)*aM{u&dHh5x-;v&w~*J zWietPi&5T_5Z8r4;ZRNCTM9@74G}~mXpCTouzJ?O1U{t@BC7$1<)>zd4~Ux234}x# zpH}GDrp}aR?fEo)Y&$ttfwR|g)`FC#Fs2mlsm9W?Xy>P`Vg%C+*uD+F#jRqoP&^fn z!bB#D8Q5XW^2!GNI%5NK60A~}hOAP_oUw!`Z(tq{but$gEQj2W{7<&=@h~<`9E;!u z^6l#$?Vdb4GLjjIViJt+!=Q-{*I-vGX_=%Fn6#;m!K!>@-Kw(*PO&03SCFqO#|w?j zu-x-Q=7L`&L)Ht6W}Ydr$xCYq{H#=o&lz|LpZD^oH_t$#B6 z1NV5duNXKWvsdxeFkVyGrLDf`+Ihc0(Fk9|*J+z+%UU?=!`WmJA5Miz6#x~!Vc=fe z$1+x!n%mst{A<#0+*#>2ky*1eEB!<;zHZ=tLH2$8FpM9pA=9msforkl8h8UgVl}v8 z<`=EZWraP7fyy4`U!(4?;>QMlf}heuB0_FX)WFNI|2cjc#xK~#Hlj}((7>-G@}z5I zZRzmC<~(6`;VnV&c2z#E8K6Rjm$#h}{FWhbMil(Lf$!ixQSg?5KjKfUW^Un0>)Kj| zH*eNvoxyE7BR=838cs*>E=|xLm-fKLd$eMET(@+t%KAte`)P^t6-ku8D(tJpc`Y3x zSk*jqeQ!A(*Q=+Njyfce&d$LYv3^j9}p(1TX=YRO$5&vnUhv}?(f zqr*$k$K|D{gDx&FL-Lb736>z(HPFGYIBAe~84VRO}fUgQ?iXGRBXGR-wj^w6_GBLoLB& zT)I8DiplX+nB%eBGOSb?m&5j?@Y5qk8i2JQEh?`!*$ZWNKQ1+OJO2X_zXU)`2qi;|D=?ZlBu^54BSfn13Qyt+@L}?-a@ecR_Y_D zq0k-Lyq^1C$c_g%d?`B~(v}aj R4)O=R4j<~=kWBgr_%Hi{a2x;t diff --git a/asset-transfer-private-data/chaincode-java/bin/main/org/hyperledger/fabric/samples/privatedata/AssetPrivateDetails.class b/asset-transfer-private-data/chaincode-java/bin/main/org/hyperledger/fabric/samples/privatedata/AssetPrivateDetails.class deleted file mode 100644 index c281e587245d09ee4111dc71c36788411f40bc4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2134 zcmbtVYf~Fl7=BI&&81t~hJpoY0ei~@STC(rs8}FigW)33Xhg+BavGL~-OTRN5r2~( zs$-KGnb8k^^G7*8XEy?cFjL1b=j5Dy-{(B<^Ir1T-@pA1;32FSA_CKnTQheK8p^G! zYE8N3Gr8?r71NV@jk@y8hHJf$zN$)JnlqlK{MGOxuY76My%?ebS9awKY1XA(Ggr2E zRmB&GNo`xm3#5w2U)O!tvTIWU18e)XZ|$j)ZO+v^-TU$@;z$5Cwr`P5A+BP32lT(}_%U&Z(*d1TGus#s%(0 z%T~+#d)vz0kff)Ba4NE1lCGuC?aQdYW0CLU^Z34@grt5|vpmJVE1fB5Qg0bZASrO+ zk!4%{v_OCQY!HP^DTyw;ZQweF1n655NO+2T>(-A9Aezo>&c-kz(5uzm^&Hz=TwhrZ z^OeLf-qF6d1o}?Gho7f3`Y`SoxC=ud?mJ;36G$T)Lq=dU$gyoXW@SgZ%)GhoOS>xF z>RfpC4CF8-(EW5{Ve2D-!7zrC9&O91Bqs1~4CZTf6+UR-J-kl>lxz0DR}}wdn{6i` zM$AIgq0(F6VpW|GB%j`#&HUfYX{rykZj5M{faeDlDmbZaneW#$ZZ}1y6i2s~dD_6I zc+B)M%J7@O-IGcA*Wqj##F5Yla|ZI5XUPzuV6z)LzE?=Hx<1p424Y~VOq|np-j20r zGC7uAVV}(ZP*DxtsWE)c;ym5kv-?)Ps@yo1SZVoV!AF$qI_~615{sBjVijvKd_j|A z|07@n>$=Kx=PoJFlQpHCo*F3OOUA@5S9Vok{EZ}O^I=gf;!Yf26E{DzF|#$lwzjgC z#1nj@1^8CrUI)0d0tamsj5ggo0ufzeQC(sbIjE*noyBBFEV32s!M+oCN72&Y5__fc zd`ULib0xX%?7J1UVCl(oy~EI*(5n5%L7C?O-{6>^VheFV@E;(8lpc3H#dy+tJhQS%od-HP zvp(C-Wm;?Im$NMlW^=F5lO1}6{-2LvQi$^R5Z9X=n#1V9NB}t!y0!TbpdGmWrNfQz zfgAJ*ITmRhA3ERs4aZh!pFs2>QNJ)Eag%&P0UUoLX^jDw6O59c!(#oT`Z@HEiC7n zSZQLTiLX-S7B>GNFp%YJT_tI)ZJFTbF}@SQGoB)-9o5Ya@DDM@{09I4 diff --git a/asset-transfer-private-data/chaincode-java/bin/main/org/hyperledger/fabric/samples/privatedata/AssetTransfer$AssetTransferErrors.class b/asset-transfer-private-data/chaincode-java/bin/main/org/hyperledger/fabric/samples/privatedata/AssetTransfer$AssetTransferErrors.class deleted file mode 100644 index 6733823f21b9aa8a0f5863311e755ce757e95c38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1588 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 diff --git a/asset-transfer-private-data/chaincode-java/bin/main/org/hyperledger/fabric/samples/privatedata/TransferAgreement.class b/asset-transfer-private-data/chaincode-java/bin/main/org/hyperledger/fabric/samples/privatedata/TransferAgreement.class deleted file mode 100644 index 761998371ce895db545fe98be9fb16b8e4eab00c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2037 zcmbtUYf~Fl7=BI&-6SlfhD!^!Tr9S^0Bg0i7Z6P#C^bNZG>WLWNlwGku$$RkI^wUY zj!kCDjDGN&Kg#hryD1=-nL2(sXV2O9@|@>=-uJJ+U;hr^J}Md_0&|XAH+Bx1(rw6E zUAo3Iv*KD+!!!4q4e1$8*Lq?4vS#|GQF2Y&dnVmn-Ia1r+P;RUz?EI|g=sWQyKbyi zc4gHU&`i&h{_>(gvUvP=!*?yaJ}WT1zHj^1o-A9QRcXkaZ9Bf{TaN7s+$&xHsOs3h zYgT>3JTf<)xDJ8)2aKsz_79}1QYPxs&%Mb%kV>D2AiChxWE=vQb#&vBKwr_a2JI@*2hj`W3mmo?{!2H`Z3eawRZ| z2^Hf#0y&vC{5`9(jABy9`{)sf`A%5JIBp}YAtf*ol-RZ$qq<|dEWEMdn|94~YYXAo z(~&`z*q)Y_wjT(Lgikr?(XpIOU>b&onSaSDOsL}n+#vu(-GMJzhS3h%^8)e36oq;! zy#;z|@&qCI)K)(I|7xg!eymu#FEGY%7e6WF@1e4Nbc*3lN2JR!bSsiS(J_xtSvAH^lXgq-e9wzW5Rx}i8a_oN;SjQ?T93}Y`>3L>dDyJtpzQQ^s zZ#J9Kt_e)P)jK_{_@C2<#@M+LXJy)Nvn9a@YEBHDnTj)tg#S3n7CB!_oWirX z!zy-hKu3^NqlqVtC$-0dTMmj-cilWE(8E=yg~45L@6P;&-j{((A6MlB4B`q`Jv6{O zOaXrPpX)qu+Ijd~XUdHsROU@$R>=D@ZCuM_U!gZM^$G*O@G1g@A&Ds0>s&`U@5XQ$ z<3Y&r(5-`q0Xh#?U+)rmgbA+WMkh^?))B@TIK=2CQ;oN9vzYxAw_2DwhMWj&ZW7pJ zkYgzH>EzH!=7#|%aeRckoydRkMj>2QkqMFt?ITe#UL}5Mpy` zx{ch+;vp7jTi8r~-o|pag~u(dwXl&awNd_qfuUv}8>B0sV1y}vG%3$ug!dDe;yTTB zCV+XDPbUC;jc>U3;~H80mQh9sd@G=0g0)r}=%UXJe24G(_Xpatz|S@2iC~+j2!1@$ HjS2h%-k9I` diff --git a/asset-transfer-private-data/chaincode-java/bin/test/mockito-extensions/org.mockito.plugins.MockMaker b/asset-transfer-private-data/chaincode-java/bin/test/mockito-extensions/org.mockito.plugins.MockMaker deleted file mode 100644 index 1f0955d4..00000000 --- a/asset-transfer-private-data/chaincode-java/bin/test/mockito-extensions/org.mockito.plugins.MockMaker +++ /dev/null @@ -1 +0,0 @@ -mock-maker-inline diff --git a/asset-transfer-private-data/chaincode-java/bin/test/org/hyperledger/fabric/samples/privatedata/AssetTransferTest$InvokeWriteTransaction.class b/asset-transfer-private-data/chaincode-java/bin/test/org/hyperledger/fabric/samples/privatedata/AssetTransferTest$InvokeWriteTransaction.class deleted file mode 100644 index d290d5482c1586b8351cf3eee06c28963c1b9b2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7674 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 AlK=n! diff --git a/asset-transfer-private-data/chaincode-java/bin/test/org/hyperledger/fabric/samples/privatedata/AssetTransferTest$QueryReadAssetTransaction.class b/asset-transfer-private-data/chaincode-java/bin/test/org/hyperledger/fabric/samples/privatedata/AssetTransferTest$QueryReadAssetTransaction.class deleted file mode 100644 index 2c77c4095cb31783b965fccb5e4073cb70eeb6c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4732 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 0; - } - - // TransferAsset updates the owner field of asset with given id in the world state. - async TransferAsset(ctx, id, newOwner) { - const assetString = await this.ReadAsset(ctx, id); - const asset = JSON.parse(assetString); - asset.Owner = newOwner; - return ctx.stub.putState(id, Buffer.from(JSON.stringify(asset))); - } - - // GetAllAssets returns all assets found in the world state. - async GetAllAssets(ctx) { - const allResults = []; - // range query with empty string for startKey and endKey does an open-ended query of all assets in the chaincode namespace. - const iterator = await ctx.stub.getStateByRange('', ''); - let result = await iterator.next(); - while (!result.done) { - const strValue = Buffer.from(result.value.value.toString()).toString('utf8'); - let record; - try { - record = JSON.parse(strValue); - } catch (err) { - console.log(err); - record = strValue; - } - allResults.push({ Key: result.value.key, Record: record }); - result = await iterator.next(); - } - return JSON.stringify(allResults); - } -} - -module.exports = AssetContract; diff --git a/asset-transfer-private-data/chaincode-javascript/package.json b/asset-transfer-private-data/chaincode-javascript/package.json deleted file mode 100644 index 372ab15c..00000000 --- a/asset-transfer-private-data/chaincode-javascript/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "chaincode-javascript", - "version": "0.0.1", - "description": "My Smart Contract", - "main": "index.js", - "engines": { - "node": ">=8", - "npm": ">=5" - }, - "scripts": { - "lint": "eslint .", - "pretest": "npm run lint", - "test": "nyc mocha --recursive", - "start": "fabric-chaincode-node start" - }, - "engineStrict": true, - "author": "John Doe", - "license": "Apache-2.0", - "dependencies": { - "fabric-contract-api": "^2.2.0", - "fabric-shim": "^2.2.0" - }, - "devDependencies": { - "chai": "^4.2.0", - "chai-as-promised": "^7.1.1", - "eslint": "^6.8.0", - "mocha": "^7.1.1", - "nyc": "^15.0.0", - "sinon": "^9.0.1", - "sinon-chai": "^3.5.0", - "winston": "^3.2.1" - }, - "nyc": { - "exclude": [ - ".eslintrc.js", - "coverage/**", - "test/**" - ], - "reporter": [ - "text-summary", - "html" - ], - "all": true, - "check-coverage": true, - "statements": 100, - "branches": 100, - "functions": 100, - "lines": 100 - } -} diff --git a/asset-transfer-private-data/chaincode-javascript/test/asset-contract.js b/asset-transfer-private-data/chaincode-javascript/test/asset-contract.js deleted file mode 100644 index d522b702..00000000 --- a/asset-transfer-private-data/chaincode-javascript/test/asset-contract.js +++ /dev/null @@ -1,108 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - */ - -'use strict'; - -const { ChaincodeStub, ClientIdentity } = require('fabric-shim'); -const { AssetContract } = require('..'); -const winston = require('winston'); - -const chai = require('chai'); -const chaiAsPromised = require('chai-as-promised'); -const sinon = require('sinon'); -const sinonChai = require('sinon-chai'); - -chai.should(); -chai.use(chaiAsPromised); -chai.use(sinonChai); - -class TestContext { - - constructor() { - this.stub = sinon.createStubInstance(ChaincodeStub); - this.clientIdentity = sinon.createStubInstance(ClientIdentity); - this.logger = { - getLogger: sinon.stub().returns(sinon.createStubInstance(winston.createLogger().constructor)), - setLevel: sinon.stub(), - }; - } - -} - -describe('AssetContract', () => { - - let contract; - let ctx; - - beforeEach(() => { - contract = new AssetContract(); - ctx = new TestContext(); - ctx.stub.getState.withArgs('1001').resolves(Buffer.from('{"value":"asset 1001 value"}')); - ctx.stub.getState.withArgs('1002').resolves(Buffer.from('{"value":"asset 1002 value"}')); - }); - - describe('#assetExists', () => { - - it('should return true for a asset', async () => { - await contract.assetExists(ctx, '1001').should.eventually.be.true; - }); - - it('should return false for a asset that does not exist', async () => { - await contract.assetExists(ctx, '1003').should.eventually.be.false; - }); - - }); - - describe('#createAsset', () => { - - it('should create a asset', async () => { - await contract.createAsset(ctx, '1003', 'asset 1003 value'); - ctx.stub.putState.should.have.been.calledOnceWithExactly('1003', Buffer.from('{"value":"asset 1003 value"}')); - }); - - it('should throw an error for a asset that already exists', async () => { - await contract.createAsset(ctx, '1001', 'myvalue').should.be.rejectedWith(/The asset 1001 already exists/); - }); - - }); - - describe('#readAsset', () => { - - it('should return a asset', async () => { - await contract.readAsset(ctx, '1001').should.eventually.deep.equal({ value: 'asset 1001 value' }); - }); - - it('should throw an error for a asset that does not exist', async () => { - await contract.readAsset(ctx, '1003').should.be.rejectedWith(/The asset 1003 does not exist/); - }); - - }); - - describe('#updateAsset', () => { - - it('should update a asset', async () => { - await contract.updateAsset(ctx, '1001', 'asset 1001 new value'); - ctx.stub.putState.should.have.been.calledOnceWithExactly('1001', Buffer.from('{"value":"asset 1001 new value"}')); - }); - - it('should throw an error for a asset that does not exist', async () => { - await contract.updateAsset(ctx, '1003', 'asset 1003 new value').should.be.rejectedWith(/The asset 1003 does not exist/); - }); - - }); - - describe('#deleteAsset', () => { - - it('should delete a asset', async () => { - await contract.deleteAsset(ctx, '1001'); - ctx.stub.deleteState.should.have.been.calledOnceWithExactly('1001'); - }); - - it('should throw an error for a asset that does not exist', async () => { - await contract.deleteAsset(ctx, '1003').should.be.rejectedWith(/The asset 1003 does not exist/); - }); - - }); - -}); diff --git a/asset-transfer-private-data/chaincode-javascript/transaction_data/asset-transactions.txdata b/asset-transfer-private-data/chaincode-javascript/transaction_data/asset-transactions.txdata deleted file mode 100644 index 79e48107..00000000 --- a/asset-transfer-private-data/chaincode-javascript/transaction_data/asset-transactions.txdata +++ /dev/null @@ -1,44 +0,0 @@ -[ - { - "transactionName": "assetExists", - "transactionLabel": "A test assetExists transaction", - "arguments": [ - "001" - ], - "transientData": {} - }, - { - "transactionName": "createAsset", - "transactionLabel": "A test createAsset transaction", - "arguments": [ - "001", - "some value" - ], - "transientData": {} - }, - { - "transactionName": "readAsset", - "transactionLabel": "A test readAsset transaction", - "arguments": [ - "001" - ], - "transientData": {} - }, - { - "transactionName": "updateAsset", - "transactionLabel": "A test updateAsset transaction", - "arguments": [ - "001", - "some other value" - ], - "transientData": {} - }, - { - "transactionName": "deleteAsset", - "transactionLabel": "A test deleteAsset transaction", - "arguments": [ - "001" - ], - "transientData": {} - } -] diff --git a/asset-transfer-sbe/chaincode-go/asset-contract.go b/asset-transfer-sbe/chaincode-go/asset-contract.go deleted file mode 100644 index 0d077504..00000000 --- a/asset-transfer-sbe/chaincode-go/asset-contract.go +++ /dev/null @@ -1,198 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - */ - -package main - -import ( - "encoding/json" - "fmt" - "sort" - - "github.com/hyperledger/fabric-contract-api-go/contractapi" -) - -// SmartContract provides functions for managing an Asset -type SmartContract struct { - contractapi.Contract -} - -// CreateAsset issues a new asset to the world state with given details. -func (s *SmartContract) CreateAsset(ctx contractapi.TransactionContextInterface, id string, value string, owner string) error { - exists, err := s.AssetExists(ctx, id) - if err != nil { - return err - } - if exists { - return fmt.Errorf("the asset %s already exists", id) - } - ownerOrg, err := s.getClientOrgId(ctx) - if err != nil { - return err - } - - asset := Asset{ - ID: id, - Value: value, - Owner: owner, - OwnerOrg: ownerOrg, - } - assetJSON, err := json.Marshal(asset) - if err != nil { - return err - } // Set the endorsement policy of the assetId Key, such that current owner Org is required to endorse future updates - setStateBasedEndorsement(ctx, id, ownerOrg) - - // Optionally, set the endorsement policy of the assetId Key, such that any 1 Org (N) out of the specified Orgs can endorse future updates - // setStateBasedEndorsementNOutOf(ctx, assetId, 1, new String[]{"Org1MSP", "Org2MSP"}); - - return ctx.GetStub().PutState(id, assetJSON) -} - -// ReadAsset returns the asset stored in the world state with given id. -func (s *SmartContract) ReadAsset(ctx contractapi.TransactionContextInterface, id string) (*Asset, error) { - assetJSON, err := ctx.GetStub().GetState(id) - if err != nil { - return nil, fmt.Errorf("failed to read from world state: %v", err) - } - if assetJSON == nil { - return nil, fmt.Errorf("the asset %s does not exist", id) - } - - var asset Asset - err = json.Unmarshal(assetJSON, &asset) - if err != nil { - return nil, err - } - - return &asset, nil -} - -// UpdateAsset updates an existing asset in the world state with provided parameters. -// Needs an endorsement of current owner Org Peer. -func (s *SmartContract) UpdateAsset(ctx contractapi.TransactionContextInterface, id string, value string, owner string) error { - exists, err := s.AssetExists(ctx, id) - if err != nil { - return err - } - if !exists { - return fmt.Errorf("the asset %s does not exist", id) - } - ownerOrg, err := s.getClientOrgId(ctx) - if err != nil { - return err - } - // overwriting original asset with new asset - asset := Asset{ - ID: id, - Value: value, - Owner: owner, - OwnerOrg: ownerOrg, - } - assetJSON, err := json.Marshal(asset) - if err != nil { - return err - } - - return ctx.GetStub().PutState(id, assetJSON) -} - -// DeleteAsset deletes an given asset from the world state. -//Needs an endorsement of current owner Org Peer. -func (s *SmartContract) DeleteAsset(ctx contractapi.TransactionContextInterface, id string) error { - exists, err := s.AssetExists(ctx, id) - if err != nil { - return err - } - if !exists { - return fmt.Errorf("the asset %s does not exist", id) - } - - return ctx.GetStub().DelState(id) -} - -// AssetExists returns true when asset with given ID exists in world state -func (s *SmartContract) AssetExists(ctx contractapi.TransactionContextInterface, id string) (bool, error) { - assetJSON, err := ctx.GetStub().GetState(id) - if err != nil { - return false, fmt.Errorf("failed to read from world state: %v", err) - } - - return assetJSON != nil, nil -} - -// TransferAsset updates the owner field of asset with given id in world state. -// Needs an endorsement of current owner Org Peer. -// Re-sets the endorsement policy of the assetId Key, such that new owner Org Peer is required to endorse future updates. -func (s *SmartContract) TransferAsset(ctx contractapi.TransactionContextInterface, id string, newOwner string, newOwnerOrg string) error { - asset, err := s.ReadAsset(ctx, id) - if err != nil { - return err - } - - asset.Owner = newOwner - asset.OwnerOrg = newOwnerOrg - assetJSON, err := json.Marshal(asset) - if err != nil { - return err - } - // Re-Set the endorsement policy of the assetId Key, such that a new owner Org Peer is required to endorse future updates - setStateBasedEndorsement(ctx, id, newOwnerOrg) - - // Optionally, set the endorsement policy of the assetId Key, such that any 1 Org (N) out of the specified Orgs can endorse future updates - // setStateBasedEndorsementNOutOf(ctx, assetId, 1, new String[]{"Org1MSP", "Org2MSP"}); - - return ctx.GetStub().PutState(id, assetJSON) -} - -// Retrieves the client's OrgId (MSPID) -func (s *SmartContract) getClientOrgId(ctx contractapi.TransactionContextInterface) (string, error) { - return ctx.GetClientIdentity().GetMSPID() -} - -// Sets an endorsement policy to the assetId Key. -// Enforces that the owner Org must endorse future update transactions for the specified assetId Key. -func setStateBasedEndorsement(ctx contractapi.TransactionContextInterface, assetId string, ownerOrgs string) { - var ep KeyEndorsementPolicy - ep.AddOrgs("MEMBER", ownerOrgs) - ctx.GetStub().SetStateValidationParameter(assetId, ep.getPolicy()) -} - -// Sets an endorsement policy to the assetId Key. -// Enforces that a given number of Orgs (N) out of the specified Orgs must endorse future update transactions for the specified assetId Key. -func setStateBasedEndorsementNOutOf(ctx contractapi.TransactionContextInterface, assetId string, nOrgs int, ownerOrgs []string) { - ctx.GetStub().SetStateValidationParameter(assetId, policy(nOrgs, ownerOrgs)) -} - -// Create a policy that requires a given number (N) of Org principals signatures out of the provided list of Orgs -func policy(nOrgs int, mspids []string) []byte { - sort.Strings(mspids) - var principals []string - var signPolicy []string - for i := 0; i < len(mspids); i++ { - mspid := mspids[i] - var mspRole MSPRole - mspRole := MSPRole{ - mspId, - MSPRole.MSPRoleType.MEMBER} - var MSPPrincipal principals - principal := MSPPrincipal{ - fabprotos.common.MSPPrincipal.Classification.ROLE, - fabprotos.common.MSPRole.encode(mspRole).finish()} - principals = append(principals, MspPrincipal.MSPPrincipal.newBuilder().setPrincipalClassification(MspPrincipal.MSPPrincipal.Classification.ROLE).setPrincipal(MspPrincipal.MSPRole.newBuilder().setMspIdentifier(mspid).setRole(MspPrincipal.MSPRole.MSPRoleType.MEMBER).build().toByteString()).build()) - var signedBy SignaturePolicy_SignedBy - signedBy := SignaturePolicy_SignedBy{i} - signPolicy = append(signPolicy, signedBy) - } - // create the policy such that it requires any N signature's from all of the principals provided - var allOf SignaturePolicy_NOutOf - allOf := SignaturePolicy_NOutOf{nOrgs, signPolicies} - var nOutof SignaturePolicy_NOutOf_ - noutof := SignaturePolicy_NOutOf_{allOf} - var spe SignaturePolicyEnvelope - spe := SignaturePolicyEnvelope{ - version: 0, - rule: noutof, - identities: principals} - return -} diff --git a/asset-transfer-sbe/chaincode-go/asset.go b/asset-transfer-sbe/chaincode-go/asset.go deleted file mode 100644 index a97fd910..00000000 --- a/asset-transfer-sbe/chaincode-go/asset.go +++ /dev/null @@ -1,9 +0,0 @@ -package main - -// Asset describes basic details of what makes up a simple asset -type Asset struct { - ID string `json:"ID"` - Value string `json:"color"` - Owner string `json:"owner"` - OwnerOrg string `json:"appraisedValue"` -} diff --git a/asset-transfer-sbe/chaincode-go/go.mod b/asset-transfer-sbe/chaincode-go/go.mod deleted file mode 100644 index 4595bdae..00000000 --- a/asset-transfer-sbe/chaincode-go/go.mod +++ /dev/null @@ -1,9 +0,0 @@ -module chaincode-go - -go 1.13 - -require ( - github.com/hyperledger/fabric-chaincode-go v0.0.0-20200424173110-d7076418f212 - github.com/hyperledger/fabric-contract-api-go v1.1.0 - github.com/stretchr/testify v1.5.1 -) diff --git a/asset-transfer-sbe/chaincode-go/go.sum b/asset-transfer-sbe/chaincode-go/go.sum deleted file mode 100644 index 94a66455..00000000 --- a/asset-transfer-sbe/chaincode-go/go.sum +++ /dev/null @@ -1,138 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/DATA-DOG/go-txdb v0.1.3/go.mod h1:DhAhxMXZpUJVGnT+p9IbzJoRKvlArO2pkHjnGX7o0n0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cucumber/godog v0.8.0/go.mod h1:Cp3tEV1LRAyH/RuCThcxHS/+9ORZ+FMzPva2AZ5Ki+A= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/spec v0.19.4 h1:ixzUSnHTd6hCemgtAJgluaTSGYpLNpJY4mA2DIkdOAo= -github.com/go-openapi/spec v0.19.4/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/gobuffalo/envy v1.7.0 h1:GlXgaiBkmrYMHco6t4j7SacKO4XUjvh5pwXh0f4uxXU= -github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/logger v1.0.0/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs= -github.com/gobuffalo/packd v0.3.0 h1:eMwymTkA1uXsqxS0Tpoop3Lc0u3kTfiMBE6nKtQU4g4= -github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= -github.com/gobuffalo/packr v1.30.1 h1:hu1fuVR3fXEZR7rXNW3h8rqSML8EVAf6KNm0NKO/wKg= -github.com/gobuffalo/packr v1.30.1/go.mod h1:ljMyFO2EcrnzsHsN99cvbq055Y9OhRrIaviy289eRuk= -github.com/gobuffalo/packr/v2 v2.5.1/go.mod h1:8f9c96ITobJlPzI44jj+4tHnEKNt0xXWSVlXRN9X1Iw= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hyperledger/fabric-chaincode-go v0.0.0-20200424173110-d7076418f212 h1:1i4lnpV8BDgKOLi1hgElfBqdHXjXieSuj8629mwBZ8o= -github.com/hyperledger/fabric-chaincode-go v0.0.0-20200424173110-d7076418f212/go.mod h1:N7H3sA7Tx4k/YzFq7U0EPdqJtqvM4Kild0JoCc7C0Dc= -github.com/hyperledger/fabric-contract-api-go v1.1.0 h1:K9uucl/6eX3NF0/b+CGIiO1IPm1VYQxBkpnVGJur2S4= -github.com/hyperledger/fabric-contract-api-go v1.1.0/go.mod h1:nHWt0B45fK53owcFpLtAe8DH0Q5P068mnzkNXMPSL7E= -github.com/hyperledger/fabric-protos-go v0.0.0-20190919234611-2a87503ac7c9/go.mod h1:xVYTjK4DtZRBxZ2D9aE4y6AbLaPwue2o/criQyQbVD0= -github.com/hyperledger/fabric-protos-go v0.0.0-20200424173316-dd554ba3746e h1:9PS5iezHk/j7XriSlNuSQILyCOfcZ9wZ3/PiucmSE8E= -github.com/hyperledger/fabric-protos-go v0.0.0-20200424173316-dd554ba3746e/go.mod h1:xVYTjK4DtZRBxZ2D9aE4y6AbLaPwue2o/criQyQbVD0= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.3.0 h1:RR9dF3JtopPvtkroDZuVD7qquD0bnHlKSqaQhgwt8yk= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190710143415-6ec70d6a5542 h1:6ZQFf1D2YYDDI7eSwW8adlkkavTB9sw5I24FVtEvNUQ= -golang.org/x/sys v0.0.0-20190710143415-6ec70d6a5542/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624180213-70d37148ca0c/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b h1:lohp5blsw53GBXtLyLNaTXPXS9pJ1tiTw61ZHUoE9Qw= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/grpc v1.23.0 h1:AzbTB6ux+okLTzP8Ru1Xs41C303zdcfEht7MQnYJt5A= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/asset-transfer-sbe/chaincode-go/main.go b/asset-transfer-sbe/chaincode-go/main.go deleted file mode 100644 index 8a94fdc9..00000000 --- a/asset-transfer-sbe/chaincode-go/main.go +++ /dev/null @@ -1,34 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - */ - -package main - -import ( - "github.com/hyperledger/fabric-contract-api-go/contractapi" - "github.com/hyperledger/fabric-contract-api-go/metadata" -) - -func main() { - assetContract := new(AssetContract) - assetContract.Info.Version = "0.0.1" - assetContract.Info.Description = "My Smart Contract" - assetContract.Info.License = new(metadata.LicenseMetadata) - assetContract.Info.License.Name = "Apache-2.0" - assetContract.Info.Contact = new(metadata.ContactMetadata) - assetContract.Info.Contact.Name = "John Doe" - - chaincode, err := contractapi.NewChaincode(assetContract) - chaincode.Info.Title = "chaincode-go chaincode" - chaincode.Info.Version = "0.0.1" - - if err != nil { - panic("Could not create chaincode from AssetContract." + err.Error()) - } - - err = chaincode.Start() - - if err != nil { - panic("Failed to start chaincode. " + err.Error()) - } -} diff --git a/asset-transfer-sbe/chaincode-go/transaction_data/my-transactions.txdata b/asset-transfer-sbe/chaincode-go/transaction_data/my-transactions.txdata deleted file mode 100644 index b6eba614..00000000 --- a/asset-transfer-sbe/chaincode-go/transaction_data/my-transactions.txdata +++ /dev/null @@ -1,44 +0,0 @@ -[ - { - "transactionName": "AssetExists", - "transactionLabel": "A test AssetExists transaction", - "arguments": [ - "001" - ], - "transientData": {} - }, - { - "transactionName": "CreateAsset", - "transactionLabel": "A test CreateAsset transaction", - "arguments": [ - "001", - "some value" - ], - "transientData": {} - }, - { - "transactionName": "ReadAsset", - "transactionLabel": "A test ReadAsset transaction", - "arguments": [ - "001" - ], - "transientData": {} - }, - { - "transactionName": "UpdateAsset", - "transactionLabel": "A test UpdateAsset transaction", - "arguments": [ - "001", - "some other value" - ], - "transientData": {} - }, - { - "transactionName": "DeleteAsset", - "transactionLabel": "A test DeleteAsset transaction", - "arguments": [ - "001" - ], - "transientData": {} - } -] diff --git a/asset-transfer-sbe/chaincode-javascript/.editorconfig b/asset-transfer-sbe/chaincode-javascript/.editorconfig deleted file mode 100755 index 75a13be2..00000000 --- a/asset-transfer-sbe/chaincode-javascript/.editorconfig +++ /dev/null @@ -1,16 +0,0 @@ -# -# SPDX-License-Identifier: Apache-2.0 -# - -root = true - -[*] -indent_style = space -indent_size = 4 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.md] -trim_trailing_whitespace = false diff --git a/asset-transfer-sbe/chaincode-javascript/.eslintignore b/asset-transfer-sbe/chaincode-javascript/.eslintignore deleted file mode 100644 index 15958470..00000000 --- a/asset-transfer-sbe/chaincode-javascript/.eslintignore +++ /dev/null @@ -1,5 +0,0 @@ -# -# SPDX-License-Identifier: Apache-2.0 -# - -coverage diff --git a/asset-transfer-sbe/chaincode-javascript/.eslintrc.js b/asset-transfer-sbe/chaincode-javascript/.eslintrc.js deleted file mode 100644 index dce49042..00000000 --- a/asset-transfer-sbe/chaincode-javascript/.eslintrc.js +++ /dev/null @@ -1,36 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - */ - -module.exports = { - env: { - node: true, - mocha: true - }, - parserOptions: { - ecmaVersion: 8, - sourceType: 'script' - }, - extends: "eslint:recommended", - rules: { - indent: ['error', 4], - quotes: ['error', 'single'], - semi: ['error', 'always'], - 'no-unused-vars': ['error', { args: 'none' }], - 'no-console': 'off', - curly: 'error', - eqeqeq: 'error', - 'no-throw-literal': 'error', - strict: 'error', - 'no-var': 'error', - 'dot-notation': 'error', - 'no-tabs': 'error', - 'no-trailing-spaces': 'error', - 'no-use-before-define': 'error', - 'no-useless-call': 'error', - 'no-with': 'error', - 'operator-linebreak': 'error', - yoda: 'error', - 'quote-props': ['error', 'as-needed'] - } -}; diff --git a/asset-transfer-sbe/chaincode-javascript/.gitignore b/asset-transfer-sbe/chaincode-javascript/.gitignore deleted file mode 100644 index a00ca941..00000000 --- a/asset-transfer-sbe/chaincode-javascript/.gitignore +++ /dev/null @@ -1,77 +0,0 @@ -# -# SPDX-License-Identifier: Apache-2.0 -# - -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env - -# parcel-bundler cache (https://parceljs.org/) -.cache - -# next.js build output -.next - -# nuxt.js build output -.nuxt - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless diff --git a/asset-transfer-sbe/chaincode-javascript/.npmignore b/asset-transfer-sbe/chaincode-javascript/.npmignore deleted file mode 100644 index 9f5fab92..00000000 --- a/asset-transfer-sbe/chaincode-javascript/.npmignore +++ /dev/null @@ -1,20 +0,0 @@ -# -# SPDX-License-Identifier: Apache-2.0 -# - -# don't package the connection details -local_fabric - -# don't package the tests -test -functionalTests - -# don't package config files -.vscode -.editorconfig -.eslintignore -.eslintrc.js -.gitignore -.npmignore -.nyc_output -coverage diff --git a/asset-transfer-sbe/chaincode-javascript/index.js b/asset-transfer-sbe/chaincode-javascript/index.js deleted file mode 100644 index 85198ba8..00000000 --- a/asset-transfer-sbe/chaincode-javascript/index.js +++ /dev/null @@ -1,10 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - */ - -'use strict'; - -const AssetContract = require('./lib/asset-contract'); - -module.exports.AssetContract = AssetContract; -module.exports.contracts = [ AssetContract ]; diff --git a/asset-transfer-sbe/chaincode-javascript/lib/asset-contract.js b/asset-transfer-sbe/chaincode-javascript/lib/asset-contract.js deleted file mode 100644 index 2c2cd003..00000000 --- a/asset-transfer-sbe/chaincode-javascript/lib/asset-contract.js +++ /dev/null @@ -1,149 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - */ - -'use strict'; - -const { Context } = require('fabric-contract-api'); -const { KeyEndorsementPolicy } = require('fabric-shim'); -import * as fabprotos from 'fabric-shim/bundle'; - -class AssetContract extends Contract { - - // CreateAsset creates a new asset - // CreateAsset sets the endorsement policy of the assetId Key, such that current owner Org Peer is required to endorse future updates - async CreateAsset(ctx, assetId, value, owner) { - const exists = await this.AssetExists(ctx, assetId); - if (exists) { - throw new Error(`The asset ${assetId} already exists`); - } - const ownerOrg = AssetContract.getClientOrgId(ctx); - const asset = new Asset(); - asset.ID = assetId; - asset.Value = value; - asset.Owner = owner; - asset.OwnerOrg = ownerOrg; - const buffer = Buffer.from(JSON.stringify(asset)); - // Create the asset - await ctx.stub.putState(assetId, buffer); - - // Set the endorsement policy of the assetId Key, such that current owner Org is required to endorse future updates - await AssetContract.setStateBasedEndorsement(ctx, assetId, [ownerOrg]); - - // Optionally, set the endorsement policy of the assetId Key, such that any 1 Org (N) out of the specified Orgs can endorse future updates - // await AssetContract.setStateBasedEndorsementNOutOf(ctx, assetId, 1, ["Org1MSP", "Org2MSP"]); - } - - // ReadAsset returns asset with given assetId - async ReadAsset(ctx, assetId) { - const exists = await this.AssetExists(ctx, assetId); - if (!exists) { - throw new Error(`The asset ${assetId} does not exist`); - } - // Read the asset - const assetJSON = await ctx.stub.getState(assetId); - return assetJSON.toString(); - } - - // UpdateAsset updates an existing asset - // UpdateAsset needs an endorsement of current owner Org Peer - async UpdateAsset(ctx, assetId, newValue) { - const assetString = await this.ReadAsset(ctx, assetId); - const asset = JSON.parse(assetString); - asset.Value = newValue; - const buffer = Buffer.from(JSON.stringify(asset)); - // Update the asset - await ctx.stub.putState(assetId, buffer); - } - - // DeleteAsset deletes an given asset - // DeleteAsset needs an endorsement of current owner Org Peer - async DeleteAsset(ctx, assetId) { - const exists = await this.AssetExists(ctx, assetId); - if (!exists) { - throw new Error(`The asset ${assetId} does not exist`); - } - // Delete the asset - await ctx.stub.deleteState(assetId); - } - - // TransferAsset updates the Owner & OwnerOrg field of asset with given assetId, OwnerOrg must be a valid Org MSP Id - // TransferAsset needs an endorsement of current owner Org Peer - // TransferAsset re-sets the endorsement policy of the assetId Key, such that new owner Org Peer is required to endorse future updates - async TransferAsset(ctx, assetId, newOwner, newOwnerOrg) { - const assetString = await this.ReadAsset(ctx, assetId); - const asset = JSON.parse(assetString); - asset.Owner = newOwner; - asset.OwnerOrg = newOwnerOrg; - // Update the asset - await ctx.stub.putState(assetId, Buffer.from(JSON.stringify(asset))); - // Re-Set the endorsement policy of the assetId Key, such that a new owner Org Peer is required to endorse future updates - await AssetContract.setStateBasedEndorsement(ctx, asset.ID, [newOwnerOrg]); - - // Optionally, set the endorsement policy of the assetId Key, such that any 1 Org (N) out of the specified Orgs can endorse future updates - // await AssetContract.setStateBasedEndorsementNOutOf(ctx, assetId, 1, ["Org1MSP", "Org2MSP"]); - } - - // AssetExists returns true when asset with given ID exists - async AssetExists(ctx, assetId){ - const buffer = await ctx.stub.getState(assetId); - return (!!buffer && buffer.length > 0); - } - - // getClientOrgId gets the client's OrgId (MSPID) - static getClientOrgId(ctx){ - return ctx.clientIdentity.getMSPID(); - } - - // setStateBasedEndorsement sets an endorsement policy to the assetId Key - // setStateBasedEndorsement enforces that the owner Org must endorse future update transactions for the specified assetId Key - static async setStateBasedEndorsement(ctx, assetId, ownerOrgs){ - const ep = new KeyEndorsementPolicy(); - ep.addOrgs('MEMBER', ...ownerOrgs); - await ctx.stub.setStateValidationParameter(assetId, ep.getPolicy()); - } - - // setStateBasedEndorsementNOutOf sets an endorsement policy to the assetId Key - // setStateBasedEndorsementNOutOf enforces that a given number of Orgs (N) out of the specified Orgs must endorse future update transactions for the specified assetId Key. - async setStateBasedEndorsementNOutOf(ctx, assetId, nOrgs, ownerOrgs) { - await ctx.stub.setStateValidationParameter(assetId, AssetContract.policy(nOrgs, ownerOrgs)); - } - - // Create a policy that requires a given number (N) of Org principals signatures out of the provided list of Orgs - static policy(nOrgs, mspIds) { - const principals = []; - const sigsPolicies = []; - mspIds.forEach((mspId, i) => { - const mspRole = { - role: fabprotos.common.MSPRole.MSPRoleType.MEMBER, - mspIdentifier: mspId - }; - const principal = { - principalClassification: fabprotos.common.MSPPrincipal.Classification.ROLE, - principal: fabprotos.common.MSPRole.encode(mspRole).finish() - }; - principals.push(principal); - const signedBy = { - signedBy: i, - }; - sigsPolicies.push(signedBy); - }); - - // create the policy such that it requires any N signature's from all of the principals provided - const allOf = { - n: nOrgs, - rules: sigsPolicies - }; - const noutof = { - nOutOf: allOf - }; - const spe = { - version: 0, - rule: noutof, - identities: principals - }; - return fabprotos.common.SignaturePolicyEnvelope.encode(spe).finish(); - } -} - -module.exports = AssetContract; diff --git a/asset-transfer-sbe/chaincode-javascript/package.json b/asset-transfer-sbe/chaincode-javascript/package.json deleted file mode 100644 index 372ab15c..00000000 --- a/asset-transfer-sbe/chaincode-javascript/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "chaincode-javascript", - "version": "0.0.1", - "description": "My Smart Contract", - "main": "index.js", - "engines": { - "node": ">=8", - "npm": ">=5" - }, - "scripts": { - "lint": "eslint .", - "pretest": "npm run lint", - "test": "nyc mocha --recursive", - "start": "fabric-chaincode-node start" - }, - "engineStrict": true, - "author": "John Doe", - "license": "Apache-2.0", - "dependencies": { - "fabric-contract-api": "^2.2.0", - "fabric-shim": "^2.2.0" - }, - "devDependencies": { - "chai": "^4.2.0", - "chai-as-promised": "^7.1.1", - "eslint": "^6.8.0", - "mocha": "^7.1.1", - "nyc": "^15.0.0", - "sinon": "^9.0.1", - "sinon-chai": "^3.5.0", - "winston": "^3.2.1" - }, - "nyc": { - "exclude": [ - ".eslintrc.js", - "coverage/**", - "test/**" - ], - "reporter": [ - "text-summary", - "html" - ], - "all": true, - "check-coverage": true, - "statements": 100, - "branches": 100, - "functions": 100, - "lines": 100 - } -} diff --git a/asset-transfer-sbe/chaincode-javascript/test/asset-contract.js b/asset-transfer-sbe/chaincode-javascript/test/asset-contract.js deleted file mode 100644 index d522b702..00000000 --- a/asset-transfer-sbe/chaincode-javascript/test/asset-contract.js +++ /dev/null @@ -1,108 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - */ - -'use strict'; - -const { ChaincodeStub, ClientIdentity } = require('fabric-shim'); -const { AssetContract } = require('..'); -const winston = require('winston'); - -const chai = require('chai'); -const chaiAsPromised = require('chai-as-promised'); -const sinon = require('sinon'); -const sinonChai = require('sinon-chai'); - -chai.should(); -chai.use(chaiAsPromised); -chai.use(sinonChai); - -class TestContext { - - constructor() { - this.stub = sinon.createStubInstance(ChaincodeStub); - this.clientIdentity = sinon.createStubInstance(ClientIdentity); - this.logger = { - getLogger: sinon.stub().returns(sinon.createStubInstance(winston.createLogger().constructor)), - setLevel: sinon.stub(), - }; - } - -} - -describe('AssetContract', () => { - - let contract; - let ctx; - - beforeEach(() => { - contract = new AssetContract(); - ctx = new TestContext(); - ctx.stub.getState.withArgs('1001').resolves(Buffer.from('{"value":"asset 1001 value"}')); - ctx.stub.getState.withArgs('1002').resolves(Buffer.from('{"value":"asset 1002 value"}')); - }); - - describe('#assetExists', () => { - - it('should return true for a asset', async () => { - await contract.assetExists(ctx, '1001').should.eventually.be.true; - }); - - it('should return false for a asset that does not exist', async () => { - await contract.assetExists(ctx, '1003').should.eventually.be.false; - }); - - }); - - describe('#createAsset', () => { - - it('should create a asset', async () => { - await contract.createAsset(ctx, '1003', 'asset 1003 value'); - ctx.stub.putState.should.have.been.calledOnceWithExactly('1003', Buffer.from('{"value":"asset 1003 value"}')); - }); - - it('should throw an error for a asset that already exists', async () => { - await contract.createAsset(ctx, '1001', 'myvalue').should.be.rejectedWith(/The asset 1001 already exists/); - }); - - }); - - describe('#readAsset', () => { - - it('should return a asset', async () => { - await contract.readAsset(ctx, '1001').should.eventually.deep.equal({ value: 'asset 1001 value' }); - }); - - it('should throw an error for a asset that does not exist', async () => { - await contract.readAsset(ctx, '1003').should.be.rejectedWith(/The asset 1003 does not exist/); - }); - - }); - - describe('#updateAsset', () => { - - it('should update a asset', async () => { - await contract.updateAsset(ctx, '1001', 'asset 1001 new value'); - ctx.stub.putState.should.have.been.calledOnceWithExactly('1001', Buffer.from('{"value":"asset 1001 new value"}')); - }); - - it('should throw an error for a asset that does not exist', async () => { - await contract.updateAsset(ctx, '1003', 'asset 1003 new value').should.be.rejectedWith(/The asset 1003 does not exist/); - }); - - }); - - describe('#deleteAsset', () => { - - it('should delete a asset', async () => { - await contract.deleteAsset(ctx, '1001'); - ctx.stub.deleteState.should.have.been.calledOnceWithExactly('1001'); - }); - - it('should throw an error for a asset that does not exist', async () => { - await contract.deleteAsset(ctx, '1003').should.be.rejectedWith(/The asset 1003 does not exist/); - }); - - }); - -}); diff --git a/asset-transfer-sbe/chaincode-javascript/transaction_data/asset-transactions.txdata b/asset-transfer-sbe/chaincode-javascript/transaction_data/asset-transactions.txdata deleted file mode 100644 index 79e48107..00000000 --- a/asset-transfer-sbe/chaincode-javascript/transaction_data/asset-transactions.txdata +++ /dev/null @@ -1,44 +0,0 @@ -[ - { - "transactionName": "assetExists", - "transactionLabel": "A test assetExists transaction", - "arguments": [ - "001" - ], - "transientData": {} - }, - { - "transactionName": "createAsset", - "transactionLabel": "A test createAsset transaction", - "arguments": [ - "001", - "some value" - ], - "transientData": {} - }, - { - "transactionName": "readAsset", - "transactionLabel": "A test readAsset transaction", - "arguments": [ - "001" - ], - "transientData": {} - }, - { - "transactionName": "updateAsset", - "transactionLabel": "A test updateAsset transaction", - "arguments": [ - "001", - "some other value" - ], - "transientData": {} - }, - { - "transactionName": "deleteAsset", - "transactionLabel": "A test deleteAsset transaction", - "arguments": [ - "001" - ], - "transientData": {} - } -] diff --git a/commercial-paper/organization/magnetocorp/application-java/.classpath b/commercial-paper/organization/magnetocorp/application-java/.classpath deleted file mode 100644 index c0837943..00000000 --- a/commercial-paper/organization/magnetocorp/application-java/.classpath +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/commercial-paper/organization/magnetocorp/application-java/.settings/org.eclipse.jdt.apt.core.prefs b/commercial-paper/organization/magnetocorp/application-java/.settings/org.eclipse.jdt.apt.core.prefs deleted file mode 100644 index d4313d4b..00000000 --- a/commercial-paper/organization/magnetocorp/application-java/.settings/org.eclipse.jdt.apt.core.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.apt.aptEnabled=false diff --git a/commercial-paper/organization/magnetocorp/contract-java/.classpath b/commercial-paper/organization/magnetocorp/contract-java/.classpath deleted file mode 100644 index 4857be40..00000000 --- a/commercial-paper/organization/magnetocorp/contract-java/.classpath +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/commercial-paper/organization/magnetocorp/contract-java/.settings/org.eclipse.jdt.core.prefs b/commercial-paper/organization/magnetocorp/contract-java/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 35068d95..00000000 --- a/commercial-paper/organization/magnetocorp/contract-java/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/commercial-paper/organization/magnetocorp/contract-java/bin/main/org/example/CommercialPaper.class b/commercial-paper/organization/magnetocorp/contract-java/bin/main/org/example/CommercialPaper.class deleted file mode 100644 index 41b49dff88e5bb34c0bc4f26bea64246915d44ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4587 zcmb7I`+FQ!8Ga|(%j{-a!X_z63N}><$!^=FP-@z=#pY7FkftR`BT0Zd*`217?j_95 zmIgsY1r-szpyCC&qat1?cGJf``Um*$_`8qqH#2)-XST#2vUARv@A7`{`M&R*$-n>m zkADF;gioXBP_VmXt)-2tdSN4Pq$f*-f?;J%J%3K$Fsvv-EdqHXw`N%ShMAtXb=y!7 z$;{86pPo{Xm|54a=;^#(T;n^-EUt|!*fCiumTkRgFY5VQny-6fp8xqiLrLbyPL~WMK6&dVs22*sqK!*xq7xk>+fK{Mm z6m%DKyJDI4WY8DDB=nAq21Os5Eai+CNTG%uh$y&i#w;2xh6SCG32UXS zo?p~0Q|8`c$i8GU)VrKe+iVR(QpV40et7=u zY>m9kTCrpq<8cgQB#L{;N$W;y7)6q#8c$X9Jc0K$qdB{}Ze;CoaS$`h3znW^YAA@C z0h=@F>;j1{w#4YHT4Zc-y&&Wy;-L15Yi=9ag zQv#y%vS{ukKBuy3iMW#wqFpD5dDmT&sHLR1Iin#Vg59*|sMlU9 z&?tYZk=5MmjA+bh=s_=EQ={qi&`9R<`0t^?Gc9Ey7Qd#UPcZb*V(WYEf?aakLKG_s z?r0@zqGINAhNa>OGVL&O^k^K*xF8$!^_HCS`pYP{a2cx_vS1QL^oR^s9;b zHq3K4uHqthXJ}|B&JZqXm`1;fbymN#kk{}K`sGzo!&#gYha2MXDFt^5Rc+#6xh$is zVF~^0JvpOnu)_1^Gc5VNBP$cPrZ|eH$)XfNy%^mpieVGqh~gOL(z|H4+3}2u9kLrg)$lXC&VtHX z2Ag-rIc2hB_muzuzD*k6&PrxGLbu*X1)-d7>k2wnCODSeWL!>rYuQ=0HP(1jj@+^b zj;>5dXZo#%U*Sy!yP9LJ^;_{6b`Cw^YfOIL(eN<#%IG}}r`*v88Xj{;zt=F21$p~N z4dXZIG3}4CCFIB9pamti)theRna6t0&|2(bPvh)QW?Bm!= z*PXnh#4&&{BAi7z>wwC6tZ6RqyPD=2Wq8n1ekbMSd7GohPVQS{U-hlAh5FXmBzGPCU%(#D6rq{FqWmBO z>)(El$uoe%nmJGDEZyVOM0Bh+$Yx{A)qwTO4otjLjLA>2h`VTePQ0wuf zgKWfuY>d&ykw6>w2HDVpY#gVJ6M;4k2IkLwjRbJ>XQ4?sTn~Z;8O*fVzAW3?-}g|8$NM;Os3^`zP96z&rU5qKO=HsR{3<6?91Oij?Sq+f3` z^iK>gbutT&&ELR@>zMF?)Oo{MZL-%}x5p#fv)5c?$686c*rePbiG9#h{!Eb_^Z8#V z*2`^3avO{ycZC2Xr(2Pf0+Fyc2O&A_LsBLZyA2YzttogU5Xnp{lBO=A(k-XFfiQB>zoDbw=v6YjT1Cj8Q z^dVt0Ui2Y(l}KJ|gTy^J6uB09##UJ`QUPN(vAmRcd<##q1}3V|69#{hRjkR_bjO#Q z#)T?MRamXyUvC0G=2b|H*;4WR{f9?FjQ*Bx;tKzUmy*|Tbqn9z!V5F0#J8*X&Y4u= zdwk5M65r?JXegEVfjq;h#LM!Gq!K@@;+4bERN}`nSNH872n~e$q63iu^#*>@05t44 zdXt|SZ($H`lfQTPq4+Ki;yrfE_i+**AcGGbz>mA2@N@iv;CgsF`6b>UDnhIM@?pa;GnALx0RPj#d(y8x0vavi27c23 z>-N!)n%E2Dcg{H+lbfce{04!@RU~;6%F-6z;{Lpys^Z=KRlMI9s^Y^c{;;o#j|Re3 zd^`}T;x7#kZfCqkaGx@SYmTSWt~Dn_nnltHQSu?_geYfz(g{(nLrEvFkTa5C!_G)T P6oOn&pVW`|Yry{iD^@dO diff --git a/commercial-paper/organization/magnetocorp/contract-java/bin/main/org/example/CommercialPaperContext.class b/commercial-paper/organization/magnetocorp/contract-java/bin/main/org/example/CommercialPaperContext.class deleted file mode 100644 index 34b318f702a233778e4fb83021d15be64246fdf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 605 zcmb7BO;5r=6r6=hZK)tAqH;0DLnoou5$5A2{ zi4Kk7IOX||lnumqB9wi{T_ru+BaY%;LbVy0!I-ACj+`Y7P3OCOCYm1f7)lp1lF21Q z_ax)wNY8v3+I^qP$cx8fn9SYY>4-t=6Eaam*@BLB9UBad+%_gGR8!I>!`Yv0emkHh z1{mrV)=*-oIx-T2dFTpt!`(p8i4%J~7;z<2yh>_`FJ}x#KMd!;C%M;Vqjt$gk7J%8Xhp!*l;lNn7iv5M%i2pfb3&`_Yg-tH`6wqIf0wwI_pqxMAE j0=8(aWC{k=o2a3TZOZL@RiQyqI_hX*H|w%TsDS-XTF0O> diff --git a/commercial-paper/organization/magnetocorp/contract-java/bin/main/org/example/CommercialPaperContract.class b/commercial-paper/organization/magnetocorp/contract-java/bin/main/org/example/CommercialPaperContract.class deleted file mode 100644 index e857e2241b0d5166849247780f493dcc2a3463f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4935 zcmcgv`+pSG75`rH*awq{Q4A|6gPU<2-kI!@Cx#!Id}im)nRCuP=X+jvKKSq3 z?*iC?|3t7tU}M1@P04X9U(Cr=Pa&U|ZpOB9hpnP?dkT*4S{XlrYJpX!t+Q4tXE~#( zL&K+~qSgv*RpMh4WX{R#sB}{!*05`5QkhVcDgzyTjxXI2Do0>+ajnJxUFJLPtNi@1FLYmKx9<< z{Z^iP+}YF|=+_1h_%79V#&HK$M{uXWn#J}ua2FZ{VpJ3uBam#GuPIc%knu4HBn(6l zrI~5lk^QCouyl`F!#Ud3kS=7b+@R&!>NzCVWn5|bQb8rheSyKI^dhi&V|G5(GiKRN zhIkD4rQy!z#dv3hfOROJ+TA^rX6e)pq{RJ~?`IectM_sMb^a~~nWu)NdRVHpV zunpVkx$TS;1XeGUX0)&>2*`*dEZwna=UT_@})w?^svC}K-v zs$4l}pdW|WtUT%Wskmna*0b*|;TzHH#itA$!2p{qf$h*JDJz;KoBZ8Nmrg=tld>3dgk%JRKeomnTBi<_7sR1@g zX`p~2YcFq|kq0Dw-Q09?zS#@T;UTyNJe`D`v^sbyGfM`}syQAdQDU*q3K@%9#>B5y2BYR8%T7Z0!5TGqR|>T<+k&OCh+d9@=LK#zZO`OjF$=7=tT{ZP_jtj;q;}RX z1h&NSIG#~3ylmjB_!?oby_ve^Dd>cH^>qW^P&FTC?Q-N~d8|?73kJTWBx1G~Qlt2` zz=oNPd5lx6NwcTqy3+AY4ohE}duT{6E*bdF4C*?ts#d>e;5Ai{D@#RAF{z;uFfxIB z*fye$JQpr&*nw4-TvaT&nK8?gl>&jttMn$KEYi0|woF%4)j6*2cfJ`CGA)x|pe4s$Ufl7T zM}*9oqZI+mN-yKux^~%Q&Pvx~6;otOa!Yb6DLLkw<576WayCu}Qrvsvz~Ozz+rsCz zzAVea9N-fLdeR9Mq<@`=;;Fn1iuNq!=s}B@@2CCl}4@ShBPp!PG zKchiR!?=cqH?igoKCd7@P^;gXSgR@E(>mM}O75ZN6{N?m8K`;iDw-<0$F=BYRHIp|GRQ`zP?f-gXdy={Y0Azv-jzq) zq-ndZU`<1E8e8Tn+(iJ|7qM*z9@4h##K#s;{eB2x`xWeJna1AMwnTNJW_4|A!@g^H zq$84uOe1|P5ow*q;bY`c&wE?m!cnz2&KDJk9v~1v9~GwgiF*(Yyf@-7(H)?FkJ78- z*ol+c%p*E(?PUnt`6;i=1l{;7PHAu3@j0%lG|l3wTCaw=s?n_Q9X@wm(YA2j}KkPlS2(pUBwsZ z^|Nif8otaQ#qsPkzH${WzNbW9x(F@$$}#oy&5Ni{#1b_Mr^{$vSk0?S4Vf=iG-*3X z`YyF7EUR>ucA%bXhd36n1}+oL!vUNllH(j}Pr%|(w{e~)oTpI4(|CpV3wRFS=bTrW zJra0a#&@cW?^GGzsWQG(lnd~k!Vf}xr|?6KFLC4lDdJnl9e%`Bloq|9F^}QL+^Zhd zAL2j+b_Bh34NZ*0Pw>+P;;@r(P}MqFiNocNTJ3+Wii6IzpIyYJg|Yi(1v8a`5MegZN?C{7WC zVY+{wu04;-Hze_78RW?_$dhG|C(9sD;&;@dl6Vr+T-9)|^BT}v?&yU{tN^V;)rab9 zQ2}bMC6ZT3T!Cx4FQmEpJ+HStT*tO9{DF$z@$fF*^ROR(^zbMAxeI>@IR1*iDeB+5 V@DC=|KRvv!FSi}GT diff --git a/commercial-paper/organization/magnetocorp/contract-java/bin/main/org/example/PaperList.class b/commercial-paper/organization/magnetocorp/contract-java/bin/main/org/example/PaperList.class deleted file mode 100644 index a4ce98858c8c7b1e10ee1ed855642267e706e6da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2019 zcma)6TT|0O6#lkF0wpboT)d&6sHLD0?;0;iK}8CvW$?kLZL^d}nsk!jfPcWhqch$g z9G@M3ljGSW&^E=&%O-pFobP<+JG?OBN~8UvSFYTH_=U?IUA{zhQa|!%ZyqZVoj)S@yRX!rTXGI71gVi~xb* zMkvhgjm$gMs&LEHqTpO_uBe_>_9Lre0=W<^keXqp87+26V`#C{Kp%!fHTftQMw;r4 z^P;TO;HZY_Y-`V&iO0hw{mUw*aU}$b=>H!m##vWzjp0P&m5ik#{Ggyku_OE2@;vBK zY}E{Uoi>of-(cSpr6@|3VzH!=Kf6g7$r!Jly3u!J{WaGcGp zn%-JdgQY2Om8Man`@s*xlbyosErXZR(3$`uXU^)sD5o9KU)DrlKt98sy@&mn#QCdTanLWG=uH#04ck`bVZ|z6%BvBk`fNZ6hgdUW2 b7x(C^Qj$5+>=B+~5e2fO$g+eLJjb!WEM_1! diff --git a/commercial-paper/organization/magnetocorp/contract-java/bin/main/org/example/ledgerapi/State.class b/commercial-paper/organization/magnetocorp/contract-java/bin/main/org/example/ledgerapi/State.class deleted file mode 100644 index e318ab7c66d333d26d3718f93f0fdb9b59148ec3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1778 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 MrBuHofB?S#51|e#LjV8(