diff --git a/.gitignore b/.gitignore
index f729b2bcbc..1fe3f81538 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,8 @@
.*.sw*
# installed platform-specific binaries
/bin
+.DS_Store
+.project
first-network/channel-artifacts/*.tx
first-network/channel-artifacts/*.block
@@ -17,3 +19,7 @@ chaincode-docker-devmode/chaincode/chaincode_example02/chaincode_example02
# fabric sdk node modules
fabcar/node_modules/
+
+# balance transfer sample
+balance-transfer/.DS_Store
+balance-transfer/node_modules/*
diff --git a/balance-transfer/README.md b/balance-transfer/README.md
new file mode 100644
index 0000000000..6fcf23ab6d
--- /dev/null
+++ b/balance-transfer/README.md
@@ -0,0 +1,284 @@
+## Balance transfer
+
+A sample Node.js app to demonstrate **__fabric-client__** & **__fabric-ca-client__** Node.js SDK APIs
+
+### Prerequisites and setup:
+
+* [Docker](https://www.docker.com/products/overview) - v1.12 or higher
+* [Docker Compose](https://docs.docker.com/compose/overview/) - v1.8 or higher
+* [Git client](https://git-scm.com/downloads) - needed for clone commands
+* **Node.js** v6.9.0 - 6.10.0 ( __Node v7+ is not supported__ )
+* Download docker images
+
+```
+cd fabric-sdk-node/examples/balance-transfer/
+docker-compose -f artifacts/docker-compose.yaml pull
+```
+
+Once you have completed the above setup, you will have provisioned a local network with the following docker container configuration:
+
+* 2 CAs
+* A SOLO orderer
+* 4 peers (2 peers per Org)
+
+#### Artifacts
+* Crypto material has been generated using the **cryptogen** tool from Hyperledger Fabric and mounted to all peers, the orderering node and CA containers. More details regarding the cryptogen tool are available [here](http://hyperledger-fabric.readthedocs.io/en/latest/build_network.html#crypto-generator).
+* An Orderer genesis block (genesis.block) and channel configuration transaction (mychannel.tx) has been pre generated using the **configtxgen** tool from Hyperledger Fabric and placed within the artifacts folder. More details regarding the configtxgen tool are available [here](http://hyperledger-fabric.readthedocs.io/en/latest/build_network.html#configuration-transaction-generator).
+
+## Running the sample program
+
+There are two options available for running the balance-transfer sample
+
+### Option 1:
+
+##### Terminal Window 1
+
+* Launch the network using docker-compose
+
+```
+docker-compose -f artifacts/docker-compose.yaml up
+```
+##### Terminal Window 2
+
+* Execute the REST APIs from the section [Sample REST APIs Requests](https://github.com/hyperledger/fabric-sdk-node/tree/master/examples/balance-transfer#running-the-sample-program)
+
+
+### Option 2:
+
+##### Terminal Window 1
+
+```
+cd fabric-sdk-node/examples/balance-transfer
+
+./runApp.sh
+
+```
+
+* This lauches the required network on your local machine
+* Installs the fabric-client and fabric-ca-client node modules
+* And, starts the node app on PORT 4000
+
+##### Terminal Window 2
+
+
+In order for the following shell script to properly parse the JSON, you must install ``jq``:
+
+instructions [https://stedolan.github.io/jq/](https://stedolan.github.io/jq/)
+
+With the application started in terminal 1, next, test the APIs by executing the script - **testAPIs.sh**:
+```
+cd fabric-sdk-node/examples/balance-transfer
+
+./testAPIs.sh
+
+```
+
+## Sample REST APIs Requests
+
+### Login Request
+
+* Register and enroll new users in Organization - **Org1**:
+
+`curl -s -X POST http://localhost:4000/users -H "content-type: application/x-www-form-urlencoded" -d 'username=Jim&orgName=org1'`
+
+**OUTPUT:**
+
+```
+{
+ "success": true,
+ "secret": "RaxhMgevgJcm",
+ "message": "Jim enrolled Successfully",
+ "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI"
+}
+```
+
+The response contains the success/failure status, an **enrollment Secret** and a **JSON Web Token (JWT)** that is a required string in the Request Headers for subsequent requests.
+
+### Create Channel request
+
+```
+curl -s -X POST \
+ http://localhost:4000/channels \
+ -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \
+ -H "content-type: application/json" \
+ -d '{
+ "channelName":"mychannel",
+ "channelConfigPath":"../artifacts/channel/mychannel.tx"
+}'
+```
+
+Please note that the Header **authorization** must contain the JWT returned from the `POST /users` call
+
+### Join Channel request
+
+```
+curl -s -X POST \
+ http://localhost:4000/channels/mychannel/peers \
+ -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \
+ -H "content-type: application/json" \
+ -d '{
+ "peers": ["localhost:7051","localhost:7056"]
+}'
+```
+### Install chaincode
+
+```
+curl -s -X POST \
+ http://localhost:4000/chaincodes \
+ -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \
+ -H "content-type: application/json" \
+ -d '{
+ "peers": ["localhost:7051","localhost:7056"],
+ "chaincodeName":"mycc",
+ "chaincodePath":"github.com/example_cc",
+ "chaincodeVersion":"v0"
+}'
+```
+
+### Instantiate chaincode
+
+```
+curl -s -X POST \
+ http://localhost:4000/channels/mychannel/chaincodes \
+ -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \
+ -H "content-type: application/json" \
+ -d '{
+ "peers": ["localhost:7051"],
+ "chaincodeName":"mycc",
+ "chaincodeVersion":"v0",
+ "functionName":"init",
+ "args":["a","100","b","200"]
+}'
+```
+
+### Invoke request
+
+```
+curl -s -X POST \
+ http://localhost:4000/channels/mychannel/chaincodes/mycc \
+ -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \
+ -H "content-type: application/json" \
+ -d '{
+ "peers": ["localhost:7051", "localhost:7056"],
+ "fcn":"move",
+ "args":["a","b","10"]
+}'
+```
+**NOTE:** Ensure that you save the Transaction ID from the response in order to pass this string in the subsequent query transactions.
+
+### Chaincode Query
+
+```
+curl -s -X GET \
+ "http://localhost:4000/channels/mychannel/chaincodes/mycc?peer=peer1&fcn=query&args=%5B%22a%22%5D" \
+ -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \
+ -H "content-type: application/json"
+```
+
+### Query Block by BlockNumber
+
+```
+curl -s -X GET \
+ "http://localhost:4000/channels/mychannel/blocks/1?peer=peer1" \
+ -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \
+ -H "content-type: application/json"
+```
+
+### Query Transaction by TransactionID
+
+```
+curl -s -X GET http://localhost:4000/channels/mychannel/transactions/TRX_ID?peer=peer1 \
+ -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \
+ -H "content-type: application/json"
+```
+**NOTE**: Here the TRX_ID can be from any previous invoke transaction
+
+
+### Query ChainInfo
+
+```
+curl -s -X GET \
+ "http://localhost:4000/channels/mychannel?peer=peer1" \
+ -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \
+ -H "content-type: application/json"
+```
+
+### Query Installed chaincodes
+
+```
+curl -s -X GET \
+ "http://localhost:4000/chaincodes?peer=peer1&type=installed" \
+ -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \
+ -H "content-type: application/json"
+```
+
+### Query Instantiated chaincodes
+
+```
+curl -s -X GET \
+ "http://localhost:4000/chaincodes?peer=peer1&type=instantiated" \
+ -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \
+ -H "content-type: application/json"
+```
+
+### Query Channels
+
+```
+curl -s -X GET \
+ "http://localhost:4000/channels?peer=peer1" \
+ -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \
+ -H "content-type: application/json"
+```
+
+### Network configuration considerations
+
+You have the ability to change configuration parameters by editing the network-config.json file.
+
+#### IP Address** and PORT information
+
+If you choose to customize your docker-compose yaml file by hardcoding IP Addresses and PORT information for your peers and orderer, then you MUST also add the identical values into the network-config.json file. The paths shown below will need to be adjusted to match your docker-compose yaml file.
+
+```
+ "orderer": {
+ "url": "grpcs://x.x.x.x:7050",
+ "server-hostname": "orderer0",
+ "tls_cacerts": "../artifacts/tls/orderer/ca-cert.pem"
+ },
+ "org1": {
+ "ca": "http://x.x.x.x:7054",
+ "peer1": {
+ "requests": "grpcs://x.x.x.x:7051",
+ "events": "grpcs://x.x.x.x:7053",
+ ...
+ },
+ "peer2": {
+ "requests": "grpcs://x.x.x.x:7056",
+ "events": "grpcs://x.x.x.x:7058",
+ ...
+ }
+ },
+ "org2": {
+ "ca": "http://x.x.x.x:8054",
+ "peer1": {
+ "requests": "grpcs://x.x.x.x:8051",
+ "events": "grpcs://x.x.x.x:8053",
+ ... },
+ "peer2": {
+ "requests": "grpcs://x.x.x.x:8056",
+ "events": "grpcs://x.x.x.x:8058",
+ ...
+ }
+ }
+
+```
+
+#### Discover IP Address
+
+To retrieve the IP Address for one of your network entities, issue the following command:
+
+```
+# this will return the IP Address for peer0
+docker inspect peer0 | grep IPAddress
+```
+
+
This work is licensed under a Creative Commons Attribution 4.0 International License.
diff --git a/balance-transfer/app.js b/balance-transfer/app.js
new file mode 100644
index 0000000000..52224f7499
--- /dev/null
+++ b/balance-transfer/app.js
@@ -0,0 +1,425 @@
+/**
+ * Copyright 2017 IBM All Rights Reserved.
+ *
+ * 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
+ *
+ * http://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.
+ */
+'use strict';
+var log4js = require('log4js');
+var logger = log4js.getLogger('SampleWebApp');
+var express = require('express');
+var session = require('express-session');
+var cookieParser = require('cookie-parser');
+var bodyParser = require('body-parser');
+var http = require('http');
+var util = require('util');
+var app = express();
+var expressJWT = require('express-jwt');
+var jwt = require('jsonwebtoken');
+var bearerToken = require('express-bearer-token');
+var cors = require('cors');
+var config = require('./config.json');
+var helper = require('./app/helper.js');
+var channels = require('./app/create-channel.js');
+var join = require('./app/join-channel.js');
+var install = require('./app/install-chaincode.js');
+var instantiate = require('./app/instantiate-chaincode.js');
+var invoke = require('./app/invoke-transaction.js');
+var query = require('./app/query.js');
+var host = process.env.HOST || config.host;
+var port = process.env.PORT || config.port;
+///////////////////////////////////////////////////////////////////////////////
+//////////////////////////////// SET CONFIGURATONS ////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+app.options('*', cors());
+app.use(cors());
+//support parsing of application/json type post data
+app.use(bodyParser.json());
+//support parsing of application/x-www-form-urlencoded post data
+app.use(bodyParser.urlencoded({
+ extended: false
+}));
+// set secret variable
+app.set('secret', 'thisismysecret');
+app.use(expressJWT({
+ secret: 'thisismysecret'
+}).unless({
+ path: ['/users']
+}));
+app.use(bearerToken());
+app.use(function(req, res, next) {
+ if (req.originalUrl.indexOf('/users') >= 0) {
+ return next();
+ }
+
+ var token = req.token;
+ jwt.verify(token, app.get('secret'), function(err, decoded) {
+ if (err) {
+ res.send({
+ success: false,
+ message: 'Failed to authenticate token. Make sure to include the ' +
+ 'token returned from /users call in the authorization header ' +
+ ' as a Bearer token'
+ });
+ return;
+ } else {
+ // add the decoded user name and org name to the request object
+ // for the downstream code to use
+ req.username = decoded.username;
+ req.orgname = decoded.orgName;
+ logger.debug(util.format('Decoded from JWT token: username - %s, orgname - %s', decoded.username, decoded.orgName));
+ return next();
+ }
+ });
+});
+
+///////////////////////////////////////////////////////////////////////////////
+//////////////////////////////// START SERVER /////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+var server = http.createServer(app).listen(port, function() {});
+logger.info('****************** SERVER STARTED ************************');
+logger.info('************** http://' + host + ':' + port +
+ ' ******************');
+server.timeout = 240000;
+
+function getErrorMessage(field) {
+ var response = {
+ success: false,
+ message: field + ' field is missing or Invalid in the request'
+ };
+ return response;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+///////////////////////// REST ENDPOINTS START HERE ///////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+// Register and enroll user
+app.post('/users', function(req, res) {
+ var username = req.body.username;
+ var orgName = req.body.orgName;
+ logger.debug('End point : /users');
+ logger.debug('User name : ' + username);
+ logger.debug('Org name : ' + orgName);
+ if (!username) {
+ res.json(getErrorMessage('\'username\''));
+ return;
+ }
+ if (!orgName) {
+ res.json(getErrorMessage('\'orgName\''));
+ return;
+ }
+ var token = jwt.sign({
+ exp: Math.floor(Date.now() / 1000) + parseInt(config.jwt_expiretime),
+ username: username,
+ orgName: orgName
+ }, app.get('secret'));
+ helper.getRegisteredUsers(username, orgName, true).then(function(response) {
+ if (response && typeof response !== 'string') {
+ response.token = token;
+ res.json(response);
+ } else {
+ res.json({
+ success: false,
+ message: response
+ });
+ }
+ });
+});
+// Create Channel
+app.post('/channels', function(req, res) {
+ logger.info('<<<<<<<<<<<<<<<<< C R E A T E C H A N N E L >>>>>>>>>>>>>>>>>');
+ logger.debug('End point : /channels');
+ var channelName = req.body.channelName;
+ var channelConfigPath = req.body.channelConfigPath;
+ logger.debug('Channel name : ' + channelName);
+ logger.debug('channelConfigPath : ' + channelConfigPath); //../artifacts/channel/mychannel.tx
+ if (!channelName) {
+ res.json(getErrorMessage('\'channelName\''));
+ return;
+ }
+ if (!channelConfigPath) {
+ res.json(getErrorMessage('\'channelConfigPath\''));
+ return;
+ }
+
+ channels.createChannel(channelName, channelConfigPath, req.username, req.orgname)
+ .then(function(message) {
+ res.send(message);
+ });
+});
+// Join Channel
+app.post('/channels/:channelName/peers', function(req, res) {
+ logger.info('<<<<<<<<<<<<<<<<< J O I N C H A N N E L >>>>>>>>>>>>>>>>>');
+ var channelName = req.params.channelName;
+ var peers = req.body.peers;
+ logger.debug('channelName : ' + channelName);
+ logger.debug('peers : ' + peers);
+ if (!channelName) {
+ res.json(getErrorMessage('\'channelName\''));
+ return;
+ }
+ if (!peers || peers.length == 0) {
+ res.json(getErrorMessage('\'peers\''));
+ return;
+ }
+
+ join.joinChannel(channelName, peers, req.username, req.orgname)
+ .then(function(message) {
+ res.send(message);
+ });
+});
+// Install chaincode on target peers
+app.post('/chaincodes', function(req, res) {
+ logger.debug('==================== INSTALL CHAINCODE ==================');
+ var peers = req.body.peers;
+ var chaincodeName = req.body.chaincodeName;
+ var chaincodePath = req.body.chaincodePath;
+ var chaincodeVersion = req.body.chaincodeVersion;
+ logger.debug('peers : ' + peers); // target peers list
+ logger.debug('chaincodeName : ' + chaincodeName);
+ logger.debug('chaincodePath : ' + chaincodePath);
+ logger.debug('chaincodeVersion : ' + chaincodeVersion);
+ if (!peers || peers.length == 0) {
+ res.json(getErrorMessage('\'peers\''));
+ return;
+ }
+ if (!chaincodeName) {
+ res.json(getErrorMessage('\'chaincodeName\''));
+ return;
+ }
+ if (!chaincodePath) {
+ res.json(getErrorMessage('\'chaincodePath\''));
+ return;
+ }
+ if (!chaincodeVersion) {
+ res.json(getErrorMessage('\'chaincodeVersion\''));
+ return;
+ }
+
+ install.installChaincode(peers, chaincodeName, chaincodePath, chaincodeVersion, req.username, req.orgname)
+ .then(function(message) {
+ res.send(message);
+ });
+});
+// Instantiate chaincode on target peers
+app.post('/channels/:channelName/chaincodes', function(req, res) {
+ logger.debug('==================== INSTANTIATE CHAINCODE ==================');
+ var chaincodeName = req.body.chaincodeName;
+ var chaincodeVersion = req.body.chaincodeVersion;
+ var channelName = req.params.channelName;
+ var functionName = req.body.functionName;
+ var args = req.body.args;
+ logger.debug('channelName : ' + channelName);
+ logger.debug('chaincodeName : ' + chaincodeName);
+ logger.debug('chaincodeVersion : ' + chaincodeVersion);
+ logger.debug('functionName : ' + functionName);
+ logger.debug('args : ' + args);
+ if (!chaincodeName) {
+ res.json(getErrorMessage('\'chaincodeName\''));
+ return;
+ }
+ if (!chaincodeVersion) {
+ res.json(getErrorMessage('\'chaincodeVersion\''));
+ return;
+ }
+ if (!channelName) {
+ res.json(getErrorMessage('\'channelName\''));
+ return;
+ }
+ if (!functionName) {
+ res.json(getErrorMessage('\'functionName\''));
+ return;
+ }
+ if (!args) {
+ res.json(getErrorMessage('\'args\''));
+ return;
+ }
+ instantiate.instantiateChaincode(channelName, chaincodeName, chaincodeVersion, functionName, args, req.username, req.orgname)
+ .then(function(message) {
+ res.send(message);
+ });
+});
+// Invoke transaction on chaincode on target peers
+app.post('/channels/:channelName/chaincodes/:chaincodeName', function(req, res) {
+ logger.debug('==================== INVOKE ON CHAINCODE ==================');
+ var peers = req.body.peers;
+ var chaincodeName = req.params.chaincodeName;
+ var channelName = req.params.channelName;
+ var fcn = req.body.fcn;
+ var args = req.body.args;
+ logger.debug('channelName : ' + channelName);
+ logger.debug('chaincodeName : ' + chaincodeName);
+ logger.debug('fcn : ' + fcn);
+ logger.debug('args : ' + args);
+ if (!peers || peers.length == 0) {
+ res.json(getErrorMessage('\'peers\''));
+ return;
+ }
+ if (!chaincodeName) {
+ res.json(getErrorMessage('\'chaincodeName\''));
+ return;
+ }
+ if (!channelName) {
+ res.json(getErrorMessage('\'channelName\''));
+ return;
+ }
+ if (!fcn) {
+ res.json(getErrorMessage('\'fcn\''));
+ return;
+ }
+ if (!args) {
+ res.json(getErrorMessage('\'args\''));
+ return;
+ }
+
+ invoke.invokeChaincode(peers, channelName, chaincodeName, fcn, args, req.username, req.orgname)
+ .then(function(message) {
+ res.send(message);
+ });
+});
+// Query on chaincode on target peers
+app.get('/channels/:channelName/chaincodes/:chaincodeName', function(req, res) {
+ logger.debug('==================== QUERY BY CHAINCODE ==================');
+ var channelName = req.params.channelName;
+ var chaincodeName = req.params.chaincodeName;
+ let args = req.query.args;
+ let fcn = req.query.fcn;
+ let peer = req.query.peer;
+
+ logger.debug('channelName : ' + channelName);
+ logger.debug('chaincodeName : ' + chaincodeName);
+ logger.debug('fcn : ' + fcn);
+ logger.debug('args : ' + args);
+
+ if (!chaincodeName) {
+ res.json(getErrorMessage('\'chaincodeName\''));
+ return;
+ }
+ if (!channelName) {
+ res.json(getErrorMessage('\'channelName\''));
+ return;
+ }
+ if (!fcn) {
+ res.json(getErrorMessage('\'fcn\''));
+ return;
+ }
+ if (!args) {
+ res.json(getErrorMessage('\'args\''));
+ return;
+ }
+ args = args.replace(/'/g, '"');
+ args = JSON.parse(args);
+ logger.debug(args);
+
+ query.queryChaincode(peer, channelName, chaincodeName, args, fcn, req.username, req.orgname)
+ .then(function(message) {
+ res.send(message);
+ });
+});
+// Query Get Block by BlockNumber
+app.get('/channels/:channelName/blocks/:blockId', function(req, res) {
+ logger.debug('==================== GET BLOCK BY NUMBER ==================');
+ let blockId = req.params.blockId;
+ let peer = req.query.peer;
+ logger.debug('channelName : ' + req.params.channelName);
+ logger.debug('BlockID : ' + blockId);
+ logger.debug('Peer : ' + peer);
+ if (!blockId) {
+ res.json(getErrorMessage('\'blockId\''));
+ return;
+ }
+
+ query.getBlockByNumber(peer, blockId, req.username, req.orgname)
+ .then(function(message) {
+ res.send(message);
+ });
+});
+// Query Get Transaction by Transaction ID
+app.get('/channels/:channelName/transactions/:trxnId', function(req, res) {
+ logger.debug(
+ '================ GET TRANSACTION BY TRANSACTION_ID ======================'
+ );
+ logger.debug('channelName : ' + req.params.channelName);
+ let trxnId = req.params.trxnId;
+ let peer = req.query.peer;
+ if (!trxnId) {
+ res.json(getErrorMessage('\'trxnId\''));
+ return;
+ }
+
+ query.getTransactionByID(peer, trxnId, req.username, req.orgname)
+ .then(function(message) {
+ res.send(message);
+ });
+});
+// Query Get Block by Hash
+app.get('/channels/:channelName/blocks', function(req, res) {
+ logger.debug('================ GET BLOCK BY HASH ======================');
+ logger.debug('channelName : ' + req.params.channelName);
+ let hash = req.query.hash;
+ let peer = req.query.peer;
+ if (!hash) {
+ res.json(getErrorMessage('\'hash\''));
+ return;
+ }
+
+ query.getBlockByHash(peer, hash, req.username, req.orgname).then(
+ function(message) {
+ res.send(message);
+ });
+});
+//Query for Channel Information
+app.get('/channels/:channelName', function(req, res) {
+ logger.debug(
+ '================ GET CHANNEL INFORMATION ======================');
+ logger.debug('channelName : ' + req.params.channelName);
+ let peer = req.query.peer;
+
+ query.getChainInfo(peer, req.username, req.orgname).then(
+ function(message) {
+ res.send(message);
+ });
+});
+// Query to fetch all Installed/instantiated chaincodes
+app.get('/chaincodes', function(req, res) {
+ var peer = req.query.peer;
+ var installType = req.query.type;
+ //TODO: add Constnats
+ if (installType === 'installed') {
+ logger.debug(
+ '================ GET INSTALLED CHAINCODES ======================');
+ } else {
+ logger.debug(
+ '================ GET INSTANTIATED CHAINCODES ======================');
+ }
+
+ query.getInstalledChaincodes(peer, installType, req.username, req.orgname)
+ .then(function(message) {
+ res.send(message);
+ });
+});
+// Query to fetch channels
+app.get('/channels', function(req, res) {
+ logger.debug('================ GET CHANNELS ======================');
+ logger.debug('peer: ' + req.query.peer);
+ var peer = req.query.peer;
+ if (!peer) {
+ res.json(getErrorMessage('\'peer\''));
+ return;
+ }
+
+ query.getChannels(peer, req.username, req.orgname)
+ .then(function(
+ message) {
+ res.send(message);
+ });
+});
diff --git a/balance-transfer/app/create-channel.js b/balance-transfer/app/create-channel.js
new file mode 100644
index 0000000000..ca8680c738
--- /dev/null
+++ b/balance-transfer/app/create-channel.js
@@ -0,0 +1,74 @@
+/**
+ * Copyright 2017 IBM All Rights Reserved.
+ *
+ * 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
+ *
+ * http://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.
+ */
+var util = require('util');
+var fs = require('fs');
+var path = require('path');
+var config = require('../config.json');
+var helper = require('./helper.js');
+var logger = helper.getLogger('Create-Channel');
+//Attempt to send a request to the orderer with the sendCreateChain method
+var createChannel = function(channelName, channelConfigPath, username, orgName) {
+ logger.debug('\n====== Creating Channel \'' + channelName + '\' ======\n');
+ var client = helper.getClientForOrg(orgName);
+ var channel = helper.getChannelForOrg(orgName);
+
+ // read in the envelope for the channel config raw bytes
+ var envelope = fs.readFileSync(path.join(__dirname, channelConfigPath));
+ // extract the channel config bytes from the envelope to be signed
+ var channelConfig = client.extractChannelConfig(envelope);
+
+ //Acting as a client in the given organization provided with "orgName" param
+ return helper.getOrgAdmin(orgName).then((admin) => {
+ logger.debug(util.format('Successfully acquired admin user for the organization "%s"', orgName));
+ // sign the channel config bytes as "endorsement", this is required by
+ // the orderer's channel creation policy
+ let signature = client.signChannelConfig(channelConfig);
+
+ let request = {
+ config: channelConfig,
+ signatures: [signature],
+ name: channelName,
+ orderer: channel.getOrderers()[0],
+ txId: client.newTransactionID()
+ };
+
+ // send to orderer
+ return client.createChannel(request);
+ }, (err) => {
+ logger.error('Failed to enroll user \''+username+'\'. Error: ' + err);
+ throw new Error('Failed to enroll user \''+username+'\'' + err);
+ }).then((response) => {
+ logger.debug(' response ::%j', response);
+ if (response && response.status === 'SUCCESS') {
+ logger.debug('Successfully created the channel.');
+ let response = {
+ success: true,
+ message: 'Channel \'' + channelName + '\' created Successfully'
+ };
+ return response;
+ } else {
+ logger.error('\n!!!!!!!!! Failed to create the channel \'' + channelName +
+ '\' !!!!!!!!!\n\n');
+ throw new Error('Failed to create the channel \'' + channelName + '\'');
+ }
+ }, (err) => {
+ logger.error('Failed to initialize the channel: ' + err.stack ? err.stack :
+ err);
+ throw new Error('Failed to initialize the channel: ' + err.stack ? err.stack : err);
+ });
+};
+
+exports.createChannel = createChannel;
diff --git a/balance-transfer/app/helper.js b/balance-transfer/app/helper.js
new file mode 100644
index 0000000000..5cda95a9f3
--- /dev/null
+++ b/balance-transfer/app/helper.js
@@ -0,0 +1,352 @@
+/**
+ * Copyright 2017 IBM All Rights Reserved.
+ *
+ * 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
+ *
+ * http://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.
+ */
+'use strict';
+var log4js = require('log4js');
+var logger = log4js.getLogger('Helper');
+logger.setLevel('DEBUG');
+
+var path = require('path');
+var util = require('util');
+var fs = require('fs-extra');
+var User = require('fabric-client/lib/User.js');
+var crypto = require('crypto');
+var copService = require('fabric-ca-client');
+var config = require('../config.json');
+
+var hfc = require('fabric-client');
+hfc.addConfigFile(path.join(__dirname, 'network-config.json'));
+hfc.setLogger(logger);
+var ORGS = hfc.getConfigSetting('network-config');
+
+var clients = {};
+var channels = {};
+var caClients = {};
+
+// set up the client and channel objects for each org
+for (let key in ORGS) {
+ if (key.indexOf('org') === 0) {
+ let client = new hfc();
+
+ let cryptoSuite = hfc.newCryptoSuite();
+ cryptoSuite.setCryptoKeyStore(hfc.newCryptoKeyStore({path: getKeyStoreForOrg(ORGS[key].name)}));
+ client.setCryptoSuite(cryptoSuite);
+
+ let channel = client.newChannel(config.channelName);
+ channel.addOrderer(newOrderer(client));
+
+ clients[key] = client;
+ channels[key] = channel;
+
+ setupPeers(channel, key, client);
+
+ let caUrl = ORGS[key].ca;
+ caClients[key] = new copService(caUrl, null /*defautl TLS opts*/, '' /* default CA */, cryptoSuite);
+ }
+}
+
+function setupPeers(channel, org, client) {
+ for (let key in ORGS[org]) {
+ if (key.indexOf('peer') === 0) {
+ let data = fs.readFileSync(path.join(__dirname, ORGS[org][key]['tls_cacerts']));
+ let peer = client.newPeer(
+ ORGS[org][key].requests,
+ {
+ pem: Buffer.from(data).toString(),
+ 'ssl-target-name-override': ORGS[org][key]['server-hostname']
+ }
+ );
+
+ channel.addPeer(peer);
+ }
+ }
+}
+
+function newOrderer(client) {
+ var caRootsPath = ORGS.orderer.tls_cacerts;
+ let data = fs.readFileSync(path.join(__dirname, caRootsPath));
+ let caroots = Buffer.from(data).toString();
+ return client.newOrderer(config.orderer, {
+ 'pem': caroots,
+ 'ssl-target-name-override': ORGS.orderer['server-hostname']
+ });
+}
+
+function readAllFiles(dir) {
+ var files = fs.readdirSync(dir);
+ var certs = [];
+ files.forEach((file_name) => {
+ let file_path = path.join(dir,file_name);
+ let data = fs.readFileSync(file_path);
+ certs.push(data);
+ });
+ return certs;
+}
+
+function getOrgName(org) {
+ return ORGS[org].name;
+}
+
+function getKeyStoreForOrg(org) {
+ return config.keyValueStore + '_' + org;
+}
+
+function newRemotes(urls, forPeers, userOrg) {
+ var targets = [];
+ // find the peer that match the urls
+ outer:
+ for (let index in urls) {
+ let peerUrl = urls[index];
+
+ let found = false;
+ for (let key in ORGS) {
+ if (key.indexOf('org') === 0) {
+ // if looking for event hubs, an app can only connect to
+ // event hubs in its own org
+ if (!forPeers && key !== userOrg) {
+ continue;
+ }
+
+ let org = ORGS[key];
+ let client = getClientForOrg(key);
+
+ for (let prop in org) {
+ if (prop.indexOf('peer') === 0) {
+ if (org[prop]['requests'].indexOf(peerUrl) >= 0) {
+ // found a peer matching the subject url
+ if (forPeers) {
+ let data = fs.readFileSync(path.join(__dirname, org[prop]['tls_cacerts']));
+ targets.push(client.newPeer('grpcs://' + peerUrl, {
+ pem: Buffer.from(data).toString(),
+ 'ssl-target-name-override': org[prop]['server-hostname']
+ }));
+
+ continue outer;
+ } else {
+ let eh = client.newEventHub();
+ let data = fs.readFileSync(path.join(__dirname, org[prop]['tls_cacerts']));
+ eh.setPeerAddr(org[prop]['events'], {
+ pem: Buffer.from(data).toString(),
+ 'ssl-target-name-override': org[prop]['server-hostname']
+ });
+ targets.push(eh);
+
+ continue outer;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (!found) {
+ logger.error(util.format('Failed to find a peer matching the url %s', peerUrl));
+ }
+ }
+
+ return targets;
+}
+
+//-------------------------------------//
+// APIs
+//-------------------------------------//
+var getChannelForOrg = function(org) {
+ return channels[org];
+};
+
+var getClientForOrg = function(org) {
+ return clients[org];
+};
+
+var newPeers = function(urls) {
+ return newRemotes(urls, true);
+};
+
+var newEventHubs = function(urls, org) {
+ return newRemotes(urls, false, org);
+};
+
+var getMspID = function(org) {
+ logger.debug('Msp ID : ' + ORGS[org].mspid);
+ return ORGS[org].mspid;
+};
+
+var getAdminUser = function(userOrg) {
+ var users = config.users;
+ var username = users[0].username;
+ var password = users[0].secret;
+ var member;
+ var client = getClientForOrg(userOrg);
+
+ return hfc.newDefaultKeyValueStore({
+ path: getKeyStoreForOrg(getOrgName(userOrg))
+ }).then((store) => {
+ client.setStateStore(store);
+ // clearing the user context before switching
+ client._userContext = null;
+ return client.getUserContext(username, true).then((user) => {
+ if (user && user.isEnrolled()) {
+ logger.info('Successfully loaded member from persistence');
+ return user;
+ } else {
+ let caClient = caClients[userOrg];
+ // need to enroll it with CA server
+ return caClient.enroll({
+ enrollmentID: username,
+ enrollmentSecret: password
+ }).then((enrollment) => {
+ logger.info('Successfully enrolled user \'' + username + '\'');
+ member = new User(username);
+ member.setCryptoSuite(client.getCryptoSuite());
+ return member.setEnrollment(enrollment.key, enrollment.certificate, getMspID(userOrg));
+ }).then(() => {
+ return client.setUserContext(member);
+ }).then(() => {
+ return member;
+ }).catch((err) => {
+ logger.error('Failed to enroll and persist user. Error: ' + err.stack ?
+ err.stack : err);
+ return null;
+ });
+ }
+ });
+ });
+};
+
+var getRegisteredUsers = function(username, userOrg, isJson) {
+ var member;
+ var client = getClientForOrg(userOrg);
+ var enrollmentSecret = null;
+ return hfc.newDefaultKeyValueStore({
+ path: getKeyStoreForOrg(getOrgName(userOrg))
+ }).then((store) => {
+ client.setStateStore(store);
+ // clearing the user context before switching
+ client._userContext = null;
+ return client.getUserContext(username, true).then((user) => {
+ if (user && user.isEnrolled()) {
+ logger.info('Successfully loaded member from persistence');
+ return user;
+ } else {
+ let caClient = caClients[userOrg];
+ return getAdminUser(userOrg).then(function(adminUserObj) {
+ member = adminUserObj;
+ return caClient.register({
+ enrollmentID: username,
+ affiliation: userOrg + '.department1'
+ }, member);
+ }).then((secret) => {
+ enrollmentSecret = secret;
+ logger.debug(username + ' registered successfully');
+ return caClient.enroll({
+ enrollmentID: username,
+ enrollmentSecret: secret
+ });
+ }, (err) => {
+ logger.debug(username + ' failed to register');
+ return '' + err;
+ //return 'Failed to register '+username+'. Error: ' + err.stack ? err.stack : err;
+ }).then((message) => {
+ if (message && typeof message === 'string' && message.includes(
+ 'Error:')) {
+ logger.error(username + ' enrollment failed');
+ return message;
+ }
+ logger.debug(username + ' enrolled successfully');
+
+ member = new User(username);
+ member._enrollmentSecret = enrollmentSecret;
+ return member.setEnrollment(message.key, message.certificate, getMspID(userOrg));
+ }).then(() => {
+ client.setUserContext(member);
+ return member;
+ }, (err) => {
+ logger.error(util.format('%s enroll failed: %s', username, err.stack ? err.stack : err));
+ return '' + err;
+ });;
+ }
+ });
+ }).then((user) => {
+ if (isJson && isJson === true) {
+ var response = {
+ success: true,
+ secret: user._enrollmentSecret,
+ message: username + ' enrolled Successfully',
+ };
+ return response;
+ }
+ return user;
+ }, (err) => {
+ logger.error(util.format('Failed to get registered user: %s, error: %s', username, err.stack ? err.stack : err));
+ return '' + err;
+ });
+};
+
+var getOrgAdmin = function(userOrg) {
+ var admin = ORGS[userOrg].admin;
+ var keyPath = path.join(__dirname, admin.key);
+ var keyPEM = Buffer.from(readAllFiles(keyPath)[0]).toString();
+ var certPath = path.join(__dirname, admin.cert);
+ var certPEM = readAllFiles(certPath)[0].toString();
+
+ var client = getClientForOrg(userOrg);
+ var cryptoSuite = hfc.newCryptoSuite();
+ if (userOrg) {
+ cryptoSuite.setCryptoKeyStore(hfc.newCryptoKeyStore({path: getKeyStoreForOrg(getOrgName(userOrg))}));
+ client.setCryptoSuite(cryptoSuite);
+ }
+
+ return hfc.newDefaultKeyValueStore({
+ path: getKeyStoreForOrg(getOrgName(userOrg))
+ }).then((store) => {
+ client.setStateStore(store);
+
+ return client.createUser({
+ username: 'peer'+userOrg+'Admin',
+ mspid: getMspID(userOrg),
+ cryptoContent: {
+ privateKeyPEM: keyPEM,
+ signedCertPEM: certPEM
+ }
+ });
+ });
+};
+
+var setupChaincodeDeploy = function() {
+ process.env.GOPATH = path.join(__dirname, config.GOPATH);
+};
+
+var getLogger = function(moduleName) {
+ var logger = log4js.getLogger(moduleName);
+ logger.setLevel('DEBUG');
+ return logger;
+};
+
+var getPeerAddressByName = function(org, peer) {
+ var address = ORGS[org][peer].requests;
+ return address.split('grpcs://')[1];
+};
+
+exports.getChannelForOrg = getChannelForOrg;
+exports.getClientForOrg = getClientForOrg;
+exports.getLogger = getLogger;
+exports.setupChaincodeDeploy = setupChaincodeDeploy;
+exports.getMspID = getMspID;
+exports.ORGS = ORGS;
+exports.newPeers = newPeers;
+exports.newEventHubs = newEventHubs;
+exports.getPeerAddressByName = getPeerAddressByName;
+exports.getRegisteredUsers = getRegisteredUsers;
+exports.getOrgAdmin = getOrgAdmin;
diff --git a/balance-transfer/app/install-chaincode.js b/balance-transfer/app/install-chaincode.js
new file mode 100644
index 0000000000..591b4c7ae8
--- /dev/null
+++ b/balance-transfer/app/install-chaincode.js
@@ -0,0 +1,79 @@
+/**
+ * Copyright 2017 IBM All Rights Reserved.
+ *
+ * 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
+ *
+ * http://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.
+ */
+'use strict';
+var path = require('path');
+var fs = require('fs');
+var util = require('util');
+var config = require('../config.json');
+var helper = require('./helper.js');
+var logger = helper.getLogger('install-chaincode');
+var tx_id = null;
+//function installChaincode(org) {
+var installChaincode = function(peers, chaincodeName, chaincodePath,
+ chaincodeVersion, username, org) {
+ logger.debug(
+ '\n============ Install chaincode on organizations ============\n');
+ helper.setupChaincodeDeploy();
+ var channel = helper.getChannelForOrg(org);
+ var client = helper.getClientForOrg(org);
+
+ return helper.getOrgAdmin(org).then((user) => {
+ var request = {
+ targets: helper.newPeers(peers),
+ chaincodePath: chaincodePath,
+ chaincodeId: chaincodeName,
+ chaincodeVersion: chaincodeVersion
+ };
+ return client.installChaincode(request);
+ }, (err) => {
+ logger.error('Failed to enroll user \'' + username + '\'. ' + err);
+ throw new Error('Failed to enroll user \'' + username + '\'. ' + err);
+ }).then((results) => {
+ var proposalResponses = results[0];
+ var proposal = results[1];
+ var all_good = true;
+ for (var i in proposalResponses) {
+ let one_good = false;
+ if (proposalResponses && proposalResponses[0].response &&
+ proposalResponses[0].response.status === 200) {
+ one_good = true;
+ logger.info('install proposal was good');
+ } else {
+ logger.error('install proposal was bad');
+ }
+ all_good = all_good & one_good;
+ }
+ if (all_good) {
+ logger.info(util.format(
+ 'Successfully sent install Proposal and received ProposalResponse: Status - %s',
+ proposalResponses[0].response.status));
+ logger.debug('\nSuccessfully Installed chaincode on organization ' + org +
+ '\n');
+ return 'Successfully Installed chaincode on organization ' + org;
+ } else {
+ logger.error(
+ 'Failed to send install Proposal or receive valid response. Response null or status is not 200. exiting...'
+ );
+ return 'Failed to send install Proposal or receive valid response. Response null or status is not 200. exiting...';
+ }
+ }, (err) => {
+ logger.error('Failed to send install proposal due to error: ' + err.stack ?
+ err.stack : err);
+ throw new Error('Failed to send install proposal due to error: ' + err.stack ?
+ err.stack : err);
+ });
+};
+exports.installChaincode = installChaincode;
diff --git a/balance-transfer/app/instantiate-chaincode.js b/balance-transfer/app/instantiate-chaincode.js
new file mode 100644
index 0000000000..199f139e34
--- /dev/null
+++ b/balance-transfer/app/instantiate-chaincode.js
@@ -0,0 +1,160 @@
+/**
+ * Copyright 2017 IBM All Rights Reserved.
+ *
+ * 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
+ *
+ * http://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.
+ */
+'use strict';
+var path = require('path');
+var fs = require('fs');
+var util = require('util');
+var hfc = require('fabric-client');
+var Peer = require('fabric-client/lib/Peer.js');
+var EventHub = require('fabric-client/lib/EventHub.js');
+var config = require('../config.json');
+var helper = require('./helper.js');
+var logger = helper.getLogger('instantiate-chaincode');
+hfc.addConfigFile(path.join(__dirname, 'network-config.json'));
+var ORGS = hfc.getConfigSetting('network-config');
+var tx_id = null;
+var eh = null;
+
+var instantiateChaincode = function(channelName, chaincodeName, chaincodeVersion, functionName, args, username, org) {
+ logger.debug('\n============ Instantiate chaincode on organization ' + org +
+ ' ============\n');
+
+ var channel = helper.getChannelForOrg(org);
+ var client = helper.getClientForOrg(org);
+
+ return helper.getOrgAdmin(org).then((user) => {
+ // read the config block from the orderer for the channel
+ // and initialize the verify MSPs based on the participating
+ // organizations
+ return channel.initialize();
+ }, (err) => {
+ logger.error('Failed to enroll user \'' + username + '\'. ' + err);
+ throw new Error('Failed to enroll user \'' + username + '\'. ' + err);
+ }).then((success) => {
+ tx_id = client.newTransactionID();
+ // send proposal to endorser
+ var request = {
+ chaincodeId: chaincodeName,
+ chaincodeVersion: chaincodeVersion,
+ fcn: functionName,
+ args: args,
+ txId: tx_id
+ };
+ return channel.sendInstantiateProposal(request);
+ }, (err) => {
+ logger.error('Failed to initialize the channel');
+ throw new Error('Failed to initialize the channel');
+ }).then((results) => {
+ var proposalResponses = results[0];
+ var proposal = results[1];
+ var all_good = true;
+ for (var i in proposalResponses) {
+ let one_good = false;
+ if (proposalResponses && proposalResponses[0].response &&
+ proposalResponses[0].response.status === 200) {
+ one_good = true;
+ logger.info('instantiate proposal was good');
+ } else {
+ logger.error('instantiate proposal was bad');
+ }
+ all_good = all_good & one_good;
+ }
+ if (all_good) {
+ logger.info(util.format(
+ 'Successfully sent Proposal and received ProposalResponse: Status - %s, message - "%s", metadata - "%s", endorsement signature: %s',
+ proposalResponses[0].response.status, proposalResponses[0].response.message,
+ proposalResponses[0].response.payload, proposalResponses[0].endorsement
+ .signature));
+ var request = {
+ proposalResponses: proposalResponses,
+ proposal: proposal
+ };
+ // set the transaction listener and set a timeout of 30sec
+ // if the transaction did not get committed within the timeout period,
+ // fail the test
+ var deployId = tx_id.getTransactionID();
+
+ eh = client.newEventHub();
+ let data = fs.readFileSync(path.join(__dirname, ORGS[org]['peer1'][
+ 'tls_cacerts'
+ ]));
+ eh.setPeerAddr(ORGS[org]['peer1']['events'], {
+ pem: Buffer.from(data).toString(),
+ 'ssl-target-name-override': ORGS[org]['peer1']['server-hostname']
+ });
+ eh.connect();
+
+ let txPromise = new Promise((resolve, reject) => {
+ let handle = setTimeout(() => {
+ eh.disconnect();
+ reject();
+ }, 30000);
+
+ eh.registerTxEvent(deployId, (tx, code) => {
+ logger.info(
+ 'The chaincode instantiate transaction has been committed on peer ' +
+ eh._ep._endpoint.addr);
+ clearTimeout(handle);
+ eh.unregisterTxEvent(deployId);
+ eh.disconnect();
+
+ if (code !== 'VALID') {
+ logger.error('The chaincode instantiate transaction was invalid, code = ' + code);
+ reject();
+ } else {
+ logger.info('The chaincode instantiate transaction was valid.');
+ resolve();
+ }
+ });
+ });
+
+ var sendPromise = channel.sendTransaction(request);
+ return Promise.all([sendPromise].concat([txPromise])).then((results) => {
+ logger.debug('Event promise all complete and testing complete');
+ return results[0]; // the first returned value is from the 'sendPromise' which is from the 'sendTransaction()' call
+ }).catch((err) => {
+ logger.error(
+ util.format('Failed to send instantiate transaction and get notifications within the timeout period. %s', err)
+ );
+ return 'Failed to send instantiate transaction and get notifications within the timeout period.';
+ });
+ } else {
+ logger.error(
+ 'Failed to send instantiate Proposal or receive valid response. Response null or status is not 200. exiting...'
+ );
+ return 'Failed to send instantiate Proposal or receive valid response. Response null or status is not 200. exiting...';
+ }
+ }, (err) => {
+ logger.error('Failed to send instantiate proposal due to error: ' + err.stack ?
+ err.stack : err);
+ return 'Failed to send instantiate proposal due to error: ' + err.stack ?
+ err.stack : err;
+ }).then((response) => {
+ if (response.status === 'SUCCESS') {
+ logger.info('Successfully sent transaction to the orderer.');
+ return 'Chaincode Instantiateion is SUCCESS';
+ } else {
+ logger.error('Failed to order the transaction. Error code: ' + response.status);
+ return 'Failed to order the transaction. Error code: ' + response.status;
+ }
+ }, (err) => {
+ logger.error('Failed to send instantiate due to error: ' + err.stack ? err
+ .stack : err);
+ return 'Failed to send instantiate due to error: ' + err.stack ? err.stack :
+ err;
+ });
+};
+exports.instantiateChaincode = instantiateChaincode;
diff --git a/balance-transfer/app/invoke-transaction.js b/balance-transfer/app/invoke-transaction.js
new file mode 100644
index 0000000000..fa4202ddd4
--- /dev/null
+++ b/balance-transfer/app/invoke-transaction.js
@@ -0,0 +1,150 @@
+/**
+ * Copyright 2017 IBM All Rights Reserved.
+ *
+ * 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
+ *
+ * http://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.
+ */
+'use strict';
+var path = require('path');
+var fs = require('fs');
+var util = require('util');
+var hfc = require('fabric-client');
+var Peer = require('fabric-client/lib/Peer.js');
+var config = require('../config.json');
+var helper = require('./helper.js');
+var logger = helper.getLogger('invoke-chaincode');
+var EventHub = require('fabric-client/lib/EventHub.js');
+hfc.addConfigFile(path.join(__dirname, 'network-config.json'));
+var ORGS = hfc.getConfigSetting('network-config');
+
+var invokeChaincode = function(peersUrls, channelName, chaincodeName, fcn, args, username, org) {
+ logger.debug(util.format('\n============ invoke transaction on organization %s ============\n', org));
+ var client = helper.getClientForOrg(org);
+ var channel = helper.getChannelForOrg(org);
+ var targets = helper.newPeers(peersUrls);
+ var tx_id = null;
+
+ return helper.getRegisteredUsers(username, org).then((user) => {
+ tx_id = client.newTransactionID();
+ logger.debug(util.format('Sending transaction "%j"', tx_id));
+ // send proposal to endorser
+ var request = {
+ targets: targets,
+ chaincodeId: chaincodeName,
+ fcn: fcn,
+ args: args,
+ chainId: channelName,
+ txId: tx_id
+ };
+ return channel.sendTransactionProposal(request);
+ }, (err) => {
+ logger.error('Failed to enroll user \'' + username + '\'. ' + err);
+ throw new Error('Failed to enroll user \'' + username + '\'. ' + err);
+ }).then((results) => {
+ var proposalResponses = results[0];
+ var proposal = results[1];
+ var all_good = true;
+ for (var i in proposalResponses) {
+ let one_good = false;
+ if (proposalResponses && proposalResponses[0].response &&
+ proposalResponses[0].response.status === 200) {
+ one_good = true;
+ logger.info('transaction proposal was good');
+ } else {
+ logger.error('transaction proposal was bad');
+ }
+ all_good = all_good & one_good;
+ }
+ if (all_good) {
+ logger.debug(util.format(
+ 'Successfully sent Proposal and received ProposalResponse: Status - %s, message - "%s", metadata - "%s", endorsement signature: %s',
+ proposalResponses[0].response.status, proposalResponses[0].response.message,
+ proposalResponses[0].response.payload, proposalResponses[0].endorsement
+ .signature));
+ var request = {
+ proposalResponses: proposalResponses,
+ proposal: proposal
+ };
+ // set the transaction listener and set a timeout of 30sec
+ // if the transaction did not get committed within the timeout period,
+ // fail the test
+ var transactionID = tx_id.getTransactionID();
+ var eventPromises = [];
+
+ var eventhubs = helper.newEventHubs(peersUrls, org);
+ for (let key in eventhubs) {
+ let eh = eventhubs[key];
+ eh.connect();
+
+ let txPromise = new Promise((resolve, reject) => {
+ let handle = setTimeout(() => {
+ eh.disconnect();
+ reject();
+ }, 30000);
+
+ eh.registerTxEvent(transactionID, (tx, code) => {
+ clearTimeout(handle);
+ eh.unregisterTxEvent(transactionID);
+ eh.disconnect();
+
+ if (code !== 'VALID') {
+ logger.error(
+ 'The balance transfer transaction was invalid, code = ' + code);
+ reject();
+ } else {
+ logger.info(
+ 'The balance transfer transaction has been committed on peer ' +
+ eh._ep._endpoint.addr);
+ resolve();
+ }
+ });
+ });
+ eventPromises.push(txPromise);
+ };
+ var sendPromise = channel.sendTransaction(request);
+ return Promise.all([sendPromise].concat(eventPromises)).then((results) => {
+ logger.debug(' event promise all complete and testing complete');
+ return results[0]; // the first returned value is from the 'sendPromise' which is from the 'sendTransaction()' call
+ }).catch((err) => {
+ logger.error(
+ 'Failed to send transaction and get notifications within the timeout period.'
+ );
+ return 'Failed to send transaction and get notifications within the timeout period.';
+ });
+ } else {
+ logger.error(
+ 'Failed to send Proposal or receive valid response. Response null or status is not 200. exiting...'
+ );
+ return 'Failed to send Proposal or receive valid response. Response null or status is not 200. exiting...';
+ }
+ }, (err) => {
+ logger.error('Failed to send proposal due to error: ' + err.stack ? err.stack :
+ err);
+ return 'Failed to send proposal due to error: ' + err.stack ? err.stack :
+ err;
+ }).then((response) => {
+ if (response.status === 'SUCCESS') {
+ logger.info('Successfully sent transaction to the orderer.');
+ return tx_id.getTransactionID();
+ } else {
+ logger.error('Failed to order the transaction. Error code: ' + response.status);
+ return 'Failed to order the transaction. Error code: ' + response.status;
+ }
+ }, (err) => {
+ logger.error('Failed to send transaction due to error: ' + err.stack ? err
+ .stack : err);
+ return 'Failed to send transaction due to error: ' + err.stack ? err.stack :
+ err;
+ });
+};
+
+exports.invokeChaincode = invokeChaincode;
diff --git a/balance-transfer/app/join-channel.js b/balance-transfer/app/join-channel.js
new file mode 100644
index 0000000000..cb86a8e4a4
--- /dev/null
+++ b/balance-transfer/app/join-channel.js
@@ -0,0 +1,150 @@
+/**
+ * Copyright 2017 IBM All Rights Reserved.
+ *
+ * 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
+ *
+ * http://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.
+ */
+var util = require('util');
+var path = require('path');
+var fs = require('fs');
+
+var Peer = require('fabric-client/lib/Peer.js');
+var EventHub = require('fabric-client/lib/EventHub.js');
+var tx_id = null;
+var nonce = null;
+var config = require('../config.json');
+var helper = require('./helper.js');
+var logger = helper.getLogger('Join-Channel');
+//helper.hfc.addConfigFile(path.join(__dirname, 'network-config.json'));
+var ORGS = helper.ORGS;
+var allEventhubs = [];
+
+//
+//Attempt to send a request to the orderer with the sendCreateChain method
+//
+var joinChannel = function(channelName, peers, username, org) {
+ // on process exit, always disconnect the event hub
+ var closeConnections = function(isSuccess) {
+ if (isSuccess) {
+ logger.debug('\n============ Join Channel is SUCCESS ============\n');
+ } else {
+ logger.debug('\n!!!!!!!! ERROR: Join Channel FAILED !!!!!!!!\n');
+ }
+ logger.debug('');
+ for (var key in allEventhubs) {
+ var eventhub = allEventhubs[key];
+ if (eventhub && eventhub.isconnected()) {
+ //logger.debug('Disconnecting the event hub');
+ eventhub.disconnect();
+ }
+ }
+ };
+ //logger.debug('\n============ Join Channel ============\n')
+ logger.info(util.format(
+ 'Calling peers in organization "%s" to join the channel', org));
+
+ var client = helper.getClientForOrg(org);
+ var channel = helper.getChannelForOrg(org);
+ var eventhubs = [];
+
+ return helper.getOrgAdmin(org).then((admin) => {
+ logger.info(util.format('received member object for admin of the organization "%s": ', org));
+ tx_id = client.newTransactionID();
+ let request = {
+ txId : tx_id
+ };
+
+ return channel.getGenesisBlock(request);
+ }).then((genesis_block) => {
+ tx_id = client.newTransactionID();
+ var request = {
+ targets: helper.newPeers(peers),
+ txId: tx_id,
+ block: genesis_block
+ };
+
+ for (let key in ORGS[org]) {
+ if (ORGS[org].hasOwnProperty(key)) {
+ if (key.indexOf('peer') === 0) {
+ let data = fs.readFileSync(path.join(__dirname, ORGS[org][key][
+ 'tls_cacerts'
+ ]));
+ let eh = client.newEventHub();
+ eh.setPeerAddr(ORGS[org][key].events, {
+ pem: Buffer.from(data).toString(),
+ 'ssl-target-name-override': ORGS[org][key]['server-hostname']
+ });
+ eh.connect();
+ eventhubs.push(eh);
+ allEventhubs.push(eh);
+ }
+ }
+ }
+
+ var eventPromises = [];
+ eventhubs.forEach((eh) => {
+ let txPromise = new Promise((resolve, reject) => {
+ let handle = setTimeout(reject, parseInt(config.eventWaitTime));
+ eh.registerBlockEvent((block) => {
+ clearTimeout(handle);
+ // in real-world situations, a peer may have more than one channels so
+ // we must check that this block came from the channel we asked the peer to join
+ if (block.data.data.length === 1) {
+ // Config block must only contain one transaction
+ var channel_header = block.data.data[0].payload.header.channel_header;
+ if (channel_header.channel_id === channelName) {
+ resolve();
+ }
+ else {
+ reject();
+ }
+ }
+ });
+ });
+ eventPromises.push(txPromise);
+ });
+ let sendPromise = channel.joinChannel(request);
+ return Promise.all([sendPromise].concat(eventPromises));
+ }, (err) => {
+ logger.error('Failed to enroll user \'' + username + '\' due to error: ' +
+ err.stack ? err.stack : err);
+ throw new Error('Failed to enroll user \'' + username +
+ '\' due to error: ' + err.stack ? err.stack : err);
+ }).then((results) => {
+ logger.debug(util.format('Join Channel R E S P O N S E : %j', results));
+ if (results[0] && results[0][0] && results[0][0].response && results[0][0]
+ .response.status == 200) {
+ logger.info(util.format(
+ 'Successfully joined peers in organization %s to the channel \'%s\'',
+ org, channelName));
+ closeConnections(true);
+ let response = {
+ success: true,
+ message: util.format(
+ 'Successfully joined peers in organization %s to the channel \'%s\'',
+ org, channelName)
+ };
+ return response;
+ } else {
+ logger.error(' Failed to join channel');
+ closeConnections();
+ throw new Error('Failed to join channel');
+ }
+ }, (err) => {
+ logger.error('Failed to join channel due to error: ' + err.stack ? err.stack :
+ err);
+ closeConnections();
+ throw new Error('Failed to join channel due to error: ' + err.stack ? err.stack :
+ err);
+ });
+};
+exports.joinChannel = joinChannel;
diff --git a/balance-transfer/app/network-config.json b/balance-transfer/app/network-config.json
new file mode 100644
index 0000000000..b305d20a8e
--- /dev/null
+++ b/balance-transfer/app/network-config.json
@@ -0,0 +1,51 @@
+{
+ "network-config": {
+ "orderer": {
+ "url": "grpcs://localhost:7050",
+ "server-hostname": "orderer.example.com",
+ "tls_cacerts": "../artifacts/channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt"
+ },
+ "org1": {
+ "name": "peerOrg1",
+ "mspid": "Org1MSP",
+ "ca": "https://localhost:7054",
+ "peer1": {
+ "requests": "grpcs://localhost:7051",
+ "events": "grpcs://localhost:7053",
+ "server-hostname": "peer0.org1.example.com",
+ "tls_cacerts": "../artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt"
+ },
+ "peer2": {
+ "requests": "grpcs://localhost:7056",
+ "events": "grpcs://localhost:7058",
+ "server-hostname": "peer1.org1.example.com",
+ "tls_cacerts": "../artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/ca.crt"
+ },
+ "admin": {
+ "key": "../artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/keystore",
+ "cert": "../artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts"
+ }
+ },
+ "org2": {
+ "name": "peerOrg2",
+ "mspid": "Org2MSP",
+ "ca": "https://localhost:8054",
+ "peer1": {
+ "requests": "grpcs://localhost:8051",
+ "events": "grpcs://localhost:8053",
+ "server-hostname": "peer0.org2.example.com",
+ "tls_cacerts": "../artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt"
+ },
+ "peer2": {
+ "requests": "grpcs://localhost:8056",
+ "events": "grpcs://localhost:8058",
+ "server-hostname": "peer1.org2.example.com",
+ "tls_cacerts": "../artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/ca.crt"
+ },
+ "admin": {
+ "key": "../artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/keystore",
+ "cert": "../artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/signcerts"
+ }
+ }
+ }
+}
diff --git a/balance-transfer/app/query.js b/balance-transfer/app/query.js
new file mode 100644
index 0000000000..ddf2eddfdb
--- /dev/null
+++ b/balance-transfer/app/query.js
@@ -0,0 +1,277 @@
+/**
+ * Copyright 2017 IBM All Rights Reserved.
+ *
+ * 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
+ *
+ * http://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.
+ */
+var path = require('path');
+var fs = require('fs');
+var util = require('util');
+var hfc = require('fabric-client');
+var Peer = require('fabric-client/lib/Peer.js');
+var EventHub = require('fabric-client/lib/EventHub.js');
+var config = require('../config.json');
+var helper = require('./helper.js');
+var logger = helper.getLogger('Query');
+
+var queryChaincode = function(peer, channelName, chaincodeName, args, fcn, username, org) {
+ var channel = helper.getChannelForOrg(org);
+ var client = helper.getClientForOrg(org);
+ var target = buildTarget(peer, org);
+ return helper.getRegisteredUsers(username, org).then((user) => {
+ tx_id = client.newTransactionID();
+ // send query
+ var request = {
+ chaincodeId: chaincodeName,
+ txId: tx_id,
+ fcn: fcn,
+ args: args
+ };
+ return channel.queryByChaincode(request, target);
+ }, (err) => {
+ logger.info('Failed to get submitter \''+username+'\'');
+ return 'Failed to get submitter \''+username+'\'. Error: ' + err.stack ? err.stack :
+ err;
+ }).then((response_payloads) => {
+ if (response_payloads) {
+ for (let i = 0; i < response_payloads.length; i++) {
+ logger.info(args[0]+' now has ' + response_payloads[i].toString('utf8') +
+ ' after the move');
+ return args[0]+' now has ' + response_payloads[i].toString('utf8') +
+ ' after the move';
+ }
+ } else {
+ logger.error('response_payloads is null');
+ return 'response_payloads is null';
+ }
+ }, (err) => {
+ logger.error('Failed to send query due to error: ' + err.stack ? err.stack :
+ err);
+ return 'Failed to send query due to error: ' + err.stack ? err.stack : err;
+ }).catch((err) => {
+ logger.error('Failed to end to end test with error:' + err.stack ? err.stack :
+ err);
+ return 'Failed to end to end test with error:' + err.stack ? err.stack :
+ err;
+ });
+};
+var getBlockByNumber = function(peer, blockNumber, username, org) {
+ var target = buildTarget(peer, org);
+ var channel = helper.getChannelForOrg(org);
+
+ return helper.getRegisteredUsers(username, org).then((member) => {
+ return channel.queryBlock(parseInt(blockNumber), target);
+ }, (err) => {
+ logger.info('Failed to get submitter "' + username + '"');
+ return 'Failed to get submitter "' + username + '". Error: ' + err.stack ?
+ err.stack : err;
+ }).then((response_payloads) => {
+ if (response_payloads) {
+ //logger.debug(response_payloads);
+ logger.debug(response_payloads);
+ return response_payloads; //response_payloads.data.data[0].buffer;
+ } else {
+ logger.error('response_payloads is null');
+ return 'response_payloads is null';
+ }
+ }, (err) => {
+ logger.error('Failed to send query due to error: ' + err.stack ? err.stack :
+ err);
+ return 'Failed to send query due to error: ' + err.stack ? err.stack : err;
+ }).catch((err) => {
+ logger.error('Failed to query with error:' + err.stack ? err.stack : err);
+ return 'Failed to query with error:' + err.stack ? err.stack : err;
+ });
+};
+var getTransactionByID = function(peer, trxnID, username, org) {
+ var target = buildTarget(peer, org);
+ var channel = helper.getChannelForOrg(org);
+
+ return helper.getRegisteredUsers(username, org).then((member) => {
+ return channel.queryTransaction(trxnID, target);
+ }, (err) => {
+ logger.info('Failed to get submitter "' + username + '"');
+ return 'Failed to get submitter "' + username + '". Error: ' + err.stack ?
+ err.stack : err;
+ }).then((response_payloads) => {
+ if (response_payloads) {
+ logger.debug(response_payloads);
+ return response_payloads;
+ } else {
+ logger.error('response_payloads is null');
+ return 'response_payloads is null';
+ }
+ }, (err) => {
+ logger.error('Failed to send query due to error: ' + err.stack ? err.stack :
+ err);
+ return 'Failed to send query due to error: ' + err.stack ? err.stack : err;
+ }).catch((err) => {
+ logger.error('Failed to query with error:' + err.stack ? err.stack : err);
+ return 'Failed to query with error:' + err.stack ? err.stack : err;
+ });
+};
+var getBlockByHash = function(peer, hash, username, org) {
+ var target = buildTarget(peer, org);
+ var channel = helper.getChannelForOrg(org);
+
+ return helper.getRegisteredUsers(username, org).then((member) => {
+ return channel.queryBlockByHash(Buffer.from(hash), target);
+ }, (err) => {
+ logger.info('Failed to get submitter "' + username + '"');
+ return 'Failed to get submitter "' + username + '". Error: ' + err.stack ?
+ err.stack : err;
+ }).then((response_payloads) => {
+ if (response_payloads) {
+ logger.debug(response_payloads);
+ return response_payloads;
+ } else {
+ logger.error('response_payloads is null');
+ return 'response_payloads is null';
+ }
+ }, (err) => {
+ logger.error('Failed to send query due to error: ' + err.stack ? err.stack :
+ err);
+ return 'Failed to send query due to error: ' + err.stack ? err.stack : err;
+ }).catch((err) => {
+ logger.error('Failed to query with error:' + err.stack ? err.stack : err);
+ return 'Failed to query with error:' + err.stack ? err.stack : err;
+ });
+};
+var getChainInfo = function(peer, username, org) {
+ var target = buildTarget(peer, org);
+ var channel = helper.getChannelForOrg(org);
+
+ return helper.getRegisteredUsers(username, org).then((member) => {
+ return channel.queryInfo(target);
+ }, (err) => {
+ logger.info('Failed to get submitter "' + username + '"');
+ return 'Failed to get submitter "' + username + '". Error: ' + err.stack ?
+ err.stack : err;
+ }).then((blockchainInfo) => {
+ if (blockchainInfo) {
+ // FIXME: Save this for testing 'getBlockByHash' ?
+ logger.debug('===========================================');
+ logger.debug(blockchainInfo.currentBlockHash);
+ logger.debug('===========================================');
+ //logger.debug(blockchainInfo);
+ return blockchainInfo;
+ } else {
+ logger.error('response_payloads is null');
+ return 'response_payloads is null';
+ }
+ }, (err) => {
+ logger.error('Failed to send query due to error: ' + err.stack ? err.stack :
+ err);
+ return 'Failed to send query due to error: ' + err.stack ? err.stack : err;
+ }).catch((err) => {
+ logger.error('Failed to query with error:' + err.stack ? err.stack : err);
+ return 'Failed to query with error:' + err.stack ? err.stack : err;
+ });
+};
+//getInstalledChaincodes
+var getInstalledChaincodes = function(peer, type, username, org) {
+ var target = buildTarget(peer, org);
+ var channel = helper.getChannelForOrg(org);
+ var client = helper.getClientForOrg(org);
+
+ return helper.getOrgAdmin(org).then((member) => {
+ if (type === 'installed') {
+ return client.queryInstalledChaincodes(target);
+ } else {
+ return channel.queryInstantiatedChaincodes(target);
+ }
+ }, (err) => {
+ logger.info('Failed to get submitter "' + username + '"');
+ return 'Failed to get submitter "' + username + '". Error: ' + err.stack ?
+ err.stack : err;
+ }).then((response) => {
+ if (response) {
+ if (type === 'installed') {
+ logger.debug('<<< Installed Chaincodes >>>');
+ } else {
+ logger.debug('<<< Instantiated Chaincodes >>>');
+ }
+ var details = [];
+ for (let i = 0; i < response.chaincodes.length; i++) {
+ logger.debug('name: ' + response.chaincodes[i].name + ', version: ' +
+ response.chaincodes[i].version + ', path: ' + response.chaincodes[i].path
+ );
+ details.push('name: ' + response.chaincodes[i].name + ', version: ' +
+ response.chaincodes[i].version + ', path: ' + response.chaincodes[i].path
+ );
+ }
+ return details;
+ } else {
+ logger.error('response is null');
+ return 'response is null';
+ }
+ }, (err) => {
+ logger.error('Failed to send query due to error: ' + err.stack ? err.stack :
+ err);
+ return 'Failed to send query due to error: ' + err.stack ? err.stack : err;
+ }).catch((err) => {
+ logger.error('Failed to query with error:' + err.stack ? err.stack : err);
+ return 'Failed to query with error:' + err.stack ? err.stack : err;
+ });
+};
+var getChannels = function(peer, username, org) {
+ var target = buildTarget(peer, org);
+ var channel = helper.getChannelForOrg(org);
+ var client = helper.getClientForOrg(org);
+
+ return helper.getRegisteredUsers(username, org).then((member) => {
+ //channel.setPrimaryPeer(targets[0]);
+ return client.queryChannels(target);
+ }, (err) => {
+ logger.info('Failed to get submitter "' + username + '"');
+ return 'Failed to get submitter "' + username + '". Error: ' + err.stack ?
+ err.stack : err;
+ }).then((response) => {
+ if (response) {
+ logger.debug('<<< channels >>>');
+ var channelNames = [];
+ for (let i = 0; i < response.channels.length; i++) {
+ channelNames.push('channel id: ' + response.channels[i].channel_id);
+ }
+ logger.debug(channelNames);
+ return response;
+ } else {
+ logger.error('response_payloads is null');
+ return 'response_payloads is null';
+ }
+ }, (err) => {
+ logger.error('Failed to send query due to error: ' + err.stack ? err.stack :
+ err);
+ return 'Failed to send query due to error: ' + err.stack ? err.stack : err;
+ }).catch((err) => {
+ logger.error('Failed to query with error:' + err.stack ? err.stack : err);
+ return 'Failed to query with error:' + err.stack ? err.stack : err;
+ });
+};
+
+function buildTarget(peer, org) {
+ var target = null;
+ if (typeof peer !== 'undefined') {
+ let targets = helper.newPeers([helper.getPeerAddressByName(org, peer)]);
+ if (targets && targets.length > 0) target = targets[0];
+ }
+
+ return target;
+}
+
+exports.queryChaincode = queryChaincode;
+exports.getBlockByNumber = getBlockByNumber;
+exports.getTransactionByID = getTransactionByID;
+exports.getBlockByHash = getBlockByHash;
+exports.getChainInfo = getChainInfo;
+exports.getInstalledChaincodes = getInstalledChaincodes;
+exports.getChannels = getChannels;
diff --git a/balance-transfer/artifacts/base.yaml b/balance-transfer/artifacts/base.yaml
new file mode 100644
index 0000000000..2fccdaa016
--- /dev/null
+++ b/balance-transfer/artifacts/base.yaml
@@ -0,0 +1,30 @@
+# Copyright IBM Corp. All Rights Reserved.
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+
+version: '2'
+services:
+ peer-base:
+ image: hyperledger/fabric-peer:x86_64-1.0.0-rc1
+ environment:
+ - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
+ # the following setting starts chaincode containers on the same
+ # bridge network as the peers
+ # https://docs.docker.com/compose/networking/
+ - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=artifacts_default
+ - CORE_LOGGING_LEVEL=DEBUG
+ - CORE_PEER_GOSSIP_USELEADERELECTION=true
+ - CORE_PEER_GOSSIP_ORGLEADER=false
+ # The following setting skips the gossip handshake since we are
+ # are not doing mutual TLS
+ - CORE_PEER_GOSSIP_SKIPHANDSHAKE=true
+ - CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/crypto/peer/msp
+ - CORE_PEER_TLS_ENABLED=true
+ - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/crypto/peer/tls/server.key
+ - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/crypto/peer/tls/server.crt
+ - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/crypto/peer/tls/ca.crt
+ working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
+ command: peer node start
+ volumes:
+ - /var/run/:/host/var/run/
diff --git a/balance-transfer/artifacts/channel/configtx.yaml b/balance-transfer/artifacts/channel/configtx.yaml
new file mode 100644
index 0000000000..4cf7ffe98f
--- /dev/null
+++ b/balance-transfer/artifacts/channel/configtx.yaml
@@ -0,0 +1,149 @@
+# Copyright IBM Corp. All Rights Reserved.
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+
+---
+################################################################################
+#
+# Profile
+#
+# - Different configuration profiles may be encoded here to be specified
+# as parameters to the configtxgen tool
+#
+################################################################################
+Profiles:
+
+ TwoOrgsOrdererGenesis:
+ Orderer:
+ <<: *OrdererDefaults
+ Organizations:
+ - *OrdererOrg
+ Consortiums:
+ SampleConsortium:
+ Organizations:
+ - *Org1
+ - *Org2
+ TwoOrgsChannel:
+ Consortium: SampleConsortium
+ Application:
+ <<: *ApplicationDefaults
+ Organizations:
+ - *Org1
+ - *Org2
+
+################################################################################
+#
+# Section: Organizations
+#
+# - This section defines the different organizational identities which will
+# be referenced later in the configuration.
+#
+################################################################################
+Organizations:
+
+ # SampleOrg defines an MSP using the sampleconfig. It should never be used
+ # in production but may be used as a template for other definitions
+ - &OrdererOrg
+ # DefaultOrg defines the organization which is used in the sampleconfig
+ # of the fabric.git development environment
+ Name: OrdererMSP
+
+ # ID to load the MSP definition as
+ ID: OrdererMSP
+
+ # MSPDir is the filesystem path which contains the MSP configuration
+ MSPDir: crypto-config/ordererOrganizations/example.com/msp
+
+ - &Org1
+ # DefaultOrg defines the organization which is used in the sampleconfig
+ # of the fabric.git development environment
+ Name: Org1MSP
+
+ # ID to load the MSP definition as
+ ID: Org1MSP
+
+ MSPDir: crypto-config/peerOrganizations/org1.example.com/msp
+
+ AnchorPeers:
+ # AnchorPeers defines the location of peers which can be used
+ # for cross org gossip communication. Note, this value is only
+ # encoded in the genesis block in the Application section context
+ - Host: peer0.org1.example.com
+ Port: 7051
+
+ - &Org2
+ # DefaultOrg defines the organization which is used in the sampleconfig
+ # of the fabric.git development environment
+ Name: Org2MSP
+
+ # ID to load the MSP definition as
+ ID: Org2MSP
+
+ MSPDir: crypto-config/peerOrganizations/org2.example.com/msp
+
+ AnchorPeers:
+ # AnchorPeers defines the location of peers which can be used
+ # for cross org gossip communication. Note, this value is only
+ # encoded in the genesis block in the Application section context
+ - Host: peer0.org2.example.com
+ Port: 7051
+
+################################################################################
+#
+# SECTION: Orderer
+#
+# - This section defines the values to encode into a config transaction or
+# genesis block for orderer related parameters
+#
+################################################################################
+Orderer: &OrdererDefaults
+
+ # Orderer Type: The orderer implementation to start
+ # Available types are "solo" and "kafka"
+ OrdererType: solo
+
+ Addresses:
+ - orderer.example.com:7050
+
+ # Batch Timeout: The amount of time to wait before creating a batch
+ BatchTimeout: 2s
+
+ # Batch Size: Controls the number of messages batched into a block
+ BatchSize:
+
+ # Max Message Count: The maximum number of messages to permit in a batch
+ MaxMessageCount: 10
+
+ # Absolute Max Bytes: The absolute maximum number of bytes allowed for
+ # the serialized messages in a batch.
+ AbsoluteMaxBytes: 98 MB
+
+ # Preferred Max Bytes: The preferred maximum number of bytes allowed for
+ # the serialized messages in a batch. A message larger than the preferred
+ # max bytes will result in a batch larger than preferred max bytes.
+ PreferredMaxBytes: 512 KB
+
+ Kafka:
+ # Brokers: A list of Kafka brokers to which the orderer connects
+ # NOTE: Use IP:port notation
+ Brokers:
+ - 127.0.0.1:9092
+
+ # Organizations is the list of orgs which are defined as participants on
+ # the orderer side of the network
+ Organizations:
+
+################################################################################
+#
+# SECTION: Application
+#
+# - This section defines the values to encode into a config transaction or
+# genesis block for application related parameters
+#
+################################################################################
+Application: &ApplicationDefaults
+
+ # Organizations is the list of orgs which are defined as participants on
+ # the application side of the network
+ Organizations:
diff --git a/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/ca/0d46ccf0e9436c1bc3b6e2bf80cdb202c4943604f95c72ee0ff839d3ec300719_sk b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/ca/0d46ccf0e9436c1bc3b6e2bf80cdb202c4943604f95c72ee0ff839d3ec300719_sk
new file mode 100755
index 0000000000..6e2c4c3d5b
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/ca/0d46ccf0e9436c1bc3b6e2bf80cdb202c4943604f95c72ee0ff839d3ec300719_sk
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg9pRJ4Y87tn+vE1fU
+uAGVg5OOGwHYlqBuvAOvy0Z+mEChRANCAAQyw4A26b4ouKj0TxbF3mM4I51vDLZ2
+clA+fdrYJwZcI9F/lLmpu+oEd/XXdQn/ELzEsgeCi9xdThVYmeXJ/53K
+-----END PRIVATE KEY-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/ca/ca.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/ca/ca.example.com-cert.pem
new file mode 100644
index 0000000000..e83e629e10
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/ca/ca.example.com-cert.pem
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICLjCCAdWgAwIBAgIQCeSxIA/5bBc/893OreC2kzAKBggqhkjOPQQDAjBpMQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1w
+bGUuY29tMB4XDTE3MDYyMzEyMzMxOVoXDTI3MDYyMTEyMzMxOVowaTELMAkGA1UE
+BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lz
+Y28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFtcGxlLmNv
+bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABDLDgDbpvii4qPRPFsXeYzgjnW8M
+tnZyUD592tgnBlwj0X+Uuam76gR39dd1Cf8QvMSyB4KL3F1OFViZ5cn/ncqjXzBd
+MA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMB
+Af8wKQYDVR0OBCIEIA1GzPDpQ2wbw7biv4DNsgLElDYE+Vxy7g/4OdPsMAcZMAoG
+CCqGSM49BAMCA0cAMEQCICXp7cNAHK6RQOFxE8Gpqy1B/FuLbmtYNqqBo5e1Pgly
+AiAWH23pmnXngcjLHg3nGwa3oUlCyPD64ilFoCMdN9TRVg==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/msp/admincerts/Admin@example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/msp/admincerts/Admin@example.com-cert.pem
new file mode 100644
index 0000000000..4a1dbfa9d2
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/msp/admincerts/Admin@example.com-cert.pem
@@ -0,0 +1,13 @@
+-----BEGIN CERTIFICATE-----
+MIICCjCCAbGgAwIBAgIRANPhTyHWZkTenKfX4eBv0ZUwCgYIKoZIzj0EAwIwaTEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt
+cGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMzMTlaMFYxCzAJBgNV
+BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp
+c2NvMRowGAYDVQQDDBFBZG1pbkBleGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqG
+SM49AwEHA0IABKAyu7N4S2ZPQSzsAVF/mwwCewuu++MtfcMmUdeoIPFRBj1JMCnf
+f88M0wj13gQSJQ6GfnUrT76G/L5fGxCUifWjTTBLMA4GA1UdDwEB/wQEAwIHgDAM
+BgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIA1GzPDpQ2wbw7biv4DNsgLElDYE+Vxy
+7g/4OdPsMAcZMAoGCCqGSM49BAMCA0cAMEQCIEdiGFLzeGMvVNubuZ3iuvRp/Pp6
+im3FmABwIbnMarabAiBIHWzz8Yxh9K5ZNkVNZX3fLZ4LlzsKBinbWH9J2wblDg==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/msp/cacerts/ca.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/msp/cacerts/ca.example.com-cert.pem
new file mode 100644
index 0000000000..e83e629e10
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/msp/cacerts/ca.example.com-cert.pem
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICLjCCAdWgAwIBAgIQCeSxIA/5bBc/893OreC2kzAKBggqhkjOPQQDAjBpMQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1w
+bGUuY29tMB4XDTE3MDYyMzEyMzMxOVoXDTI3MDYyMTEyMzMxOVowaTELMAkGA1UE
+BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lz
+Y28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFtcGxlLmNv
+bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABDLDgDbpvii4qPRPFsXeYzgjnW8M
+tnZyUD592tgnBlwj0X+Uuam76gR39dd1Cf8QvMSyB4KL3F1OFViZ5cn/ncqjXzBd
+MA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMB
+Af8wKQYDVR0OBCIEIA1GzPDpQ2wbw7biv4DNsgLElDYE+Vxy7g/4OdPsMAcZMAoG
+CCqGSM49BAMCA0cAMEQCICXp7cNAHK6RQOFxE8Gpqy1B/FuLbmtYNqqBo5e1Pgly
+AiAWH23pmnXngcjLHg3nGwa3oUlCyPD64ilFoCMdN9TRVg==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/msp/tlscacerts/tlsca.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/msp/tlscacerts/tlsca.example.com-cert.pem
new file mode 100644
index 0000000000..88a1e69db1
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/msp/tlscacerts/tlsca.example.com-cert.pem
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICNTCCAdygAwIBAgIRAN1F77OjzDmyWCzGuLyXHI8wCgYIKoZIzj0EAwIwbDEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5l
+eGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMzMTlaMGwxCzAJ
+BgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJh
+bmNpc2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEaMBgGA1UEAxMRdGxzY2EuZXhh
+bXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQkmbjr/9EK0m/4CpR6
+DiM+Eyke3vxPX+IhL+utTRt/qYz2q0UT9wem0xgRVqyWp4vN35ur7aSI+dALKBFT
+RWPwo18wXTAOBgNVHQ8BAf8EBAMCAaYwDwYDVR0lBAgwBgYEVR0lADAPBgNVHRMB
+Af8EBTADAQH/MCkGA1UdDgQiBCBqIR7RiIC02zhngxyXeAmQJxO44yGlq1XswQTa
+/C7sSTAKBggqhkjOPQQDAgNHADBEAiBSxokO+9hHG+FpYikoNpcma4AK6N1KI2B6
+WqI5xNyF4gIgIQx8Q6p6ynDfUGDJ43uTHPzwlt+o8gQ3A5w07L70ml0=
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/admincerts/Admin@example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/admincerts/Admin@example.com-cert.pem
new file mode 100644
index 0000000000..4a1dbfa9d2
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/admincerts/Admin@example.com-cert.pem
@@ -0,0 +1,13 @@
+-----BEGIN CERTIFICATE-----
+MIICCjCCAbGgAwIBAgIRANPhTyHWZkTenKfX4eBv0ZUwCgYIKoZIzj0EAwIwaTEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt
+cGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMzMTlaMFYxCzAJBgNV
+BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp
+c2NvMRowGAYDVQQDDBFBZG1pbkBleGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqG
+SM49AwEHA0IABKAyu7N4S2ZPQSzsAVF/mwwCewuu++MtfcMmUdeoIPFRBj1JMCnf
+f88M0wj13gQSJQ6GfnUrT76G/L5fGxCUifWjTTBLMA4GA1UdDwEB/wQEAwIHgDAM
+BgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIA1GzPDpQ2wbw7biv4DNsgLElDYE+Vxy
+7g/4OdPsMAcZMAoGCCqGSM49BAMCA0cAMEQCIEdiGFLzeGMvVNubuZ3iuvRp/Pp6
+im3FmABwIbnMarabAiBIHWzz8Yxh9K5ZNkVNZX3fLZ4LlzsKBinbWH9J2wblDg==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem
new file mode 100644
index 0000000000..e83e629e10
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICLjCCAdWgAwIBAgIQCeSxIA/5bBc/893OreC2kzAKBggqhkjOPQQDAjBpMQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1w
+bGUuY29tMB4XDTE3MDYyMzEyMzMxOVoXDTI3MDYyMTEyMzMxOVowaTELMAkGA1UE
+BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lz
+Y28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFtcGxlLmNv
+bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABDLDgDbpvii4qPRPFsXeYzgjnW8M
+tnZyUD592tgnBlwj0X+Uuam76gR39dd1Cf8QvMSyB4KL3F1OFViZ5cn/ncqjXzBd
+MA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMB
+Af8wKQYDVR0OBCIEIA1GzPDpQ2wbw7biv4DNsgLElDYE+Vxy7g/4OdPsMAcZMAoG
+CCqGSM49BAMCA0cAMEQCICXp7cNAHK6RQOFxE8Gpqy1B/FuLbmtYNqqBo5e1Pgly
+AiAWH23pmnXngcjLHg3nGwa3oUlCyPD64ilFoCMdN9TRVg==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/keystore/2fb065725bf1b7e2811c0e8ca8d37f5a951fc4cd1162a47aad8accf9ddd10291_sk b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/keystore/2fb065725bf1b7e2811c0e8ca8d37f5a951fc4cd1162a47aad8accf9ddd10291_sk
new file mode 100755
index 0000000000..403d8e5e42
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/keystore/2fb065725bf1b7e2811c0e8ca8d37f5a951fc4cd1162a47aad8accf9ddd10291_sk
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgc4TjL7yNIkRpowuC
+Y0uEEkzJraTtTM380wlyrRoVs96hRANCAARi2C4soUEstzRVLDI8ccc17vocfvWg
+5crrC6fxj/m+0xrA9n9ZOb+8FVRZ182XNz14DbxpfHrMEAHyJGbXoR5T
+-----END PRIVATE KEY-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/signcerts/orderer.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/signcerts/orderer.example.com-cert.pem
new file mode 100644
index 0000000000..0fb71451b8
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/signcerts/orderer.example.com-cert.pem
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICDTCCAbOgAwIBAgIRALFafJiTFN/47AvAGfvj1ZEwCgYIKoZIzj0EAwIwaTEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt
+cGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMzMTlaMFgxCzAJBgNV
+BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp
+c2NvMRwwGgYDVQQDExNvcmRlcmVyLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYI
+KoZIzj0DAQcDQgAEYtguLKFBLLc0VSwyPHHHNe76HH71oOXK6wun8Y/5vtMawPZ/
+WTm/vBVUWdfNlzc9eA28aXx6zBAB8iRm16EeU6NNMEswDgYDVR0PAQH/BAQDAgeA
+MAwGA1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAgDUbM8OlDbBvDtuK/gM2yAsSUNgT5
+XHLuD/g50+wwBxkwCgYIKoZIzj0EAwIDSAAwRQIhANJuEGHBftrtlWgie9zgc60J
+/XVytPN/D0rPlkMV17n7AiBBbStggGBfFYcQ2LhDhcKut8nScJ2OFrt+dJSdJbod
+7A==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
new file mode 100644
index 0000000000..88a1e69db1
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICNTCCAdygAwIBAgIRAN1F77OjzDmyWCzGuLyXHI8wCgYIKoZIzj0EAwIwbDEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5l
+eGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMzMTlaMGwxCzAJ
+BgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJh
+bmNpc2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEaMBgGA1UEAxMRdGxzY2EuZXhh
+bXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQkmbjr/9EK0m/4CpR6
+DiM+Eyke3vxPX+IhL+utTRt/qYz2q0UT9wem0xgRVqyWp4vN35ur7aSI+dALKBFT
+RWPwo18wXTAOBgNVHQ8BAf8EBAMCAaYwDwYDVR0lBAgwBgYEVR0lADAPBgNVHRMB
+Af8EBTADAQH/MCkGA1UdDgQiBCBqIR7RiIC02zhngxyXeAmQJxO44yGlq1XswQTa
+/C7sSTAKBggqhkjOPQQDAgNHADBEAiBSxokO+9hHG+FpYikoNpcma4AK6N1KI2B6
+WqI5xNyF4gIgIQx8Q6p6ynDfUGDJ43uTHPzwlt+o8gQ3A5w07L70ml0=
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt
new file mode 100644
index 0000000000..88a1e69db1
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICNTCCAdygAwIBAgIRAN1F77OjzDmyWCzGuLyXHI8wCgYIKoZIzj0EAwIwbDEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5l
+eGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMzMTlaMGwxCzAJ
+BgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJh
+bmNpc2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEaMBgGA1UEAxMRdGxzY2EuZXhh
+bXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQkmbjr/9EK0m/4CpR6
+DiM+Eyke3vxPX+IhL+utTRt/qYz2q0UT9wem0xgRVqyWp4vN35ur7aSI+dALKBFT
+RWPwo18wXTAOBgNVHQ8BAf8EBAMCAaYwDwYDVR0lBAgwBgYEVR0lADAPBgNVHRMB
+Af8EBTADAQH/MCkGA1UdDgQiBCBqIR7RiIC02zhngxyXeAmQJxO44yGlq1XswQTa
+/C7sSTAKBggqhkjOPQQDAgNHADBEAiBSxokO+9hHG+FpYikoNpcma4AK6N1KI2B6
+WqI5xNyF4gIgIQx8Q6p6ynDfUGDJ43uTHPzwlt+o8gQ3A5w07L70ml0=
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.crt b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.crt
new file mode 100644
index 0000000000..5f61f509b0
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.crt
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICWjCCAgCgAwIBAgIRAKk85zOKA4NKFQe/AmGxK7EwCgYIKoZIzj0EAwIwbDEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5l
+eGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMzMTlaMFgxCzAJ
+BgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJh
+bmNpc2NvMRwwGgYDVQQDExNvcmRlcmVyLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0C
+AQYIKoZIzj0DAQcDQgAE3Nve7G2pybxbA+S3bvKlP8BAR4kJG96Yd2k9UFc7+Mmd
+XM5/7TeVCbaidnYpODYr2pNlzo8HijwoyvYxnN7U3aOBljCBkzAOBgNVHQ8BAf8E
+BAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQC
+MAAwKwYDVR0jBCQwIoAgaiEe0YiAtNs4Z4Mcl3gJkCcTuOMhpatV7MEE2vwu7Ekw
+JwYDVR0RBCAwHoITb3JkZXJlci5leGFtcGxlLmNvbYIHb3JkZXJlcjAKBggqhkjO
+PQQDAgNIADBFAiEAtW6SunJ0GXR2gZY2yOg4CAOLPqb3YB07/9byOSFYZygCIA77
+iitG1Mkvlc7fyNFcgYKDUpbXQBS5iTmAuo/cISDx
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.key b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.key
new file mode 100755
index 0000000000..9096afb085
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.key
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgUsf4CUpdmdIaax7T
+qjCJaQLCsSU1/xaoETdgCCZ8fDihRANCAATc297sbanJvFsD5Ldu8qU/wEBHiQkb
+3ph3aT1QVzv4yZ1czn/tN5UJtqJ2dik4Nivak2XOjweKPCjK9jGc3tTd
+-----END PRIVATE KEY-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/tlsca/6a211ed18880b4db3867831c977809902713b8e321a5ab55ecc104dafc2eec49_sk b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/tlsca/6a211ed18880b4db3867831c977809902713b8e321a5ab55ecc104dafc2eec49_sk
new file mode 100755
index 0000000000..0fc62a252a
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/tlsca/6a211ed18880b4db3867831c977809902713b8e321a5ab55ecc104dafc2eec49_sk
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQghjZ40AvUeupMV603
+i9pA9S8uNLz5i6TePeBgJZhrY/ihRANCAAQkmbjr/9EK0m/4CpR6DiM+Eyke3vxP
+X+IhL+utTRt/qYz2q0UT9wem0xgRVqyWp4vN35ur7aSI+dALKBFTRWPw
+-----END PRIVATE KEY-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem
new file mode 100644
index 0000000000..88a1e69db1
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICNTCCAdygAwIBAgIRAN1F77OjzDmyWCzGuLyXHI8wCgYIKoZIzj0EAwIwbDEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5l
+eGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMzMTlaMGwxCzAJ
+BgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJh
+bmNpc2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEaMBgGA1UEAxMRdGxzY2EuZXhh
+bXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQkmbjr/9EK0m/4CpR6
+DiM+Eyke3vxPX+IhL+utTRt/qYz2q0UT9wem0xgRVqyWp4vN35ur7aSI+dALKBFT
+RWPwo18wXTAOBgNVHQ8BAf8EBAMCAaYwDwYDVR0lBAgwBgYEVR0lADAPBgNVHRMB
+Af8EBTADAQH/MCkGA1UdDgQiBCBqIR7RiIC02zhngxyXeAmQJxO44yGlq1XswQTa
+/C7sSTAKBggqhkjOPQQDAgNHADBEAiBSxokO+9hHG+FpYikoNpcma4AK6N1KI2B6
+WqI5xNyF4gIgIQx8Q6p6ynDfUGDJ43uTHPzwlt+o8gQ3A5w07L70ml0=
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/admincerts/Admin@example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/admincerts/Admin@example.com-cert.pem
new file mode 100644
index 0000000000..4a1dbfa9d2
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/admincerts/Admin@example.com-cert.pem
@@ -0,0 +1,13 @@
+-----BEGIN CERTIFICATE-----
+MIICCjCCAbGgAwIBAgIRANPhTyHWZkTenKfX4eBv0ZUwCgYIKoZIzj0EAwIwaTEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt
+cGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMzMTlaMFYxCzAJBgNV
+BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp
+c2NvMRowGAYDVQQDDBFBZG1pbkBleGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqG
+SM49AwEHA0IABKAyu7N4S2ZPQSzsAVF/mwwCewuu++MtfcMmUdeoIPFRBj1JMCnf
+f88M0wj13gQSJQ6GfnUrT76G/L5fGxCUifWjTTBLMA4GA1UdDwEB/wQEAwIHgDAM
+BgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIA1GzPDpQ2wbw7biv4DNsgLElDYE+Vxy
+7g/4OdPsMAcZMAoGCCqGSM49BAMCA0cAMEQCIEdiGFLzeGMvVNubuZ3iuvRp/Pp6
+im3FmABwIbnMarabAiBIHWzz8Yxh9K5ZNkVNZX3fLZ4LlzsKBinbWH9J2wblDg==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/cacerts/ca.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/cacerts/ca.example.com-cert.pem
new file mode 100644
index 0000000000..e83e629e10
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/cacerts/ca.example.com-cert.pem
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICLjCCAdWgAwIBAgIQCeSxIA/5bBc/893OreC2kzAKBggqhkjOPQQDAjBpMQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1w
+bGUuY29tMB4XDTE3MDYyMzEyMzMxOVoXDTI3MDYyMTEyMzMxOVowaTELMAkGA1UE
+BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lz
+Y28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFtcGxlLmNv
+bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABDLDgDbpvii4qPRPFsXeYzgjnW8M
+tnZyUD592tgnBlwj0X+Uuam76gR39dd1Cf8QvMSyB4KL3F1OFViZ5cn/ncqjXzBd
+MA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMB
+Af8wKQYDVR0OBCIEIA1GzPDpQ2wbw7biv4DNsgLElDYE+Vxy7g/4OdPsMAcZMAoG
+CCqGSM49BAMCA0cAMEQCICXp7cNAHK6RQOFxE8Gpqy1B/FuLbmtYNqqBo5e1Pgly
+AiAWH23pmnXngcjLHg3nGwa3oUlCyPD64ilFoCMdN9TRVg==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/keystore/db670eed8487a93c35ae448b9f84c2f241a7a8c87df0544fc1dc08baf7832aa0_sk b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/keystore/db670eed8487a93c35ae448b9f84c2f241a7a8c87df0544fc1dc08baf7832aa0_sk
new file mode 100755
index 0000000000..06fdf974f3
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/keystore/db670eed8487a93c35ae448b9f84c2f241a7a8c87df0544fc1dc08baf7832aa0_sk
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg33NMbWc5E80ueSIA
+iWqRlyC2M+1ce4shkkP/CVKOp4uhRANCAASgMruzeEtmT0Es7AFRf5sMAnsLrvvj
+LX3DJlHXqCDxUQY9STAp33/PDNMI9d4EEiUOhn51K0++hvy+XxsQlIn1
+-----END PRIVATE KEY-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/signcerts/Admin@example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/signcerts/Admin@example.com-cert.pem
new file mode 100644
index 0000000000..4a1dbfa9d2
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/signcerts/Admin@example.com-cert.pem
@@ -0,0 +1,13 @@
+-----BEGIN CERTIFICATE-----
+MIICCjCCAbGgAwIBAgIRANPhTyHWZkTenKfX4eBv0ZUwCgYIKoZIzj0EAwIwaTEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt
+cGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMzMTlaMFYxCzAJBgNV
+BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp
+c2NvMRowGAYDVQQDDBFBZG1pbkBleGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqG
+SM49AwEHA0IABKAyu7N4S2ZPQSzsAVF/mwwCewuu++MtfcMmUdeoIPFRBj1JMCnf
+f88M0wj13gQSJQ6GfnUrT76G/L5fGxCUifWjTTBLMA4GA1UdDwEB/wQEAwIHgDAM
+BgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIA1GzPDpQ2wbw7biv4DNsgLElDYE+Vxy
+7g/4OdPsMAcZMAoGCCqGSM49BAMCA0cAMEQCIEdiGFLzeGMvVNubuZ3iuvRp/Pp6
+im3FmABwIbnMarabAiBIHWzz8Yxh9K5ZNkVNZX3fLZ4LlzsKBinbWH9J2wblDg==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/tlscacerts/tlsca.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/tlscacerts/tlsca.example.com-cert.pem
new file mode 100644
index 0000000000..88a1e69db1
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/tlscacerts/tlsca.example.com-cert.pem
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICNTCCAdygAwIBAgIRAN1F77OjzDmyWCzGuLyXHI8wCgYIKoZIzj0EAwIwbDEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5l
+eGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMzMTlaMGwxCzAJ
+BgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJh
+bmNpc2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEaMBgGA1UEAxMRdGxzY2EuZXhh
+bXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQkmbjr/9EK0m/4CpR6
+DiM+Eyke3vxPX+IhL+utTRt/qYz2q0UT9wem0xgRVqyWp4vN35ur7aSI+dALKBFT
+RWPwo18wXTAOBgNVHQ8BAf8EBAMCAaYwDwYDVR0lBAgwBgYEVR0lADAPBgNVHRMB
+Af8EBTADAQH/MCkGA1UdDgQiBCBqIR7RiIC02zhngxyXeAmQJxO44yGlq1XswQTa
+/C7sSTAKBggqhkjOPQQDAgNHADBEAiBSxokO+9hHG+FpYikoNpcma4AK6N1KI2B6
+WqI5xNyF4gIgIQx8Q6p6ynDfUGDJ43uTHPzwlt+o8gQ3A5w07L70ml0=
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/tls/ca.crt b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/tls/ca.crt
new file mode 100644
index 0000000000..88a1e69db1
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/tls/ca.crt
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICNTCCAdygAwIBAgIRAN1F77OjzDmyWCzGuLyXHI8wCgYIKoZIzj0EAwIwbDEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5l
+eGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMzMTlaMGwxCzAJ
+BgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJh
+bmNpc2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEaMBgGA1UEAxMRdGxzY2EuZXhh
+bXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQkmbjr/9EK0m/4CpR6
+DiM+Eyke3vxPX+IhL+utTRt/qYz2q0UT9wem0xgRVqyWp4vN35ur7aSI+dALKBFT
+RWPwo18wXTAOBgNVHQ8BAf8EBAMCAaYwDwYDVR0lBAgwBgYEVR0lADAPBgNVHRMB
+Af8EBTADAQH/MCkGA1UdDgQiBCBqIR7RiIC02zhngxyXeAmQJxO44yGlq1XswQTa
+/C7sSTAKBggqhkjOPQQDAgNHADBEAiBSxokO+9hHG+FpYikoNpcma4AK6N1KI2B6
+WqI5xNyF4gIgIQx8Q6p6ynDfUGDJ43uTHPzwlt+o8gQ3A5w07L70ml0=
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/tls/server.crt b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/tls/server.crt
new file mode 100644
index 0000000000..e920e6e2f7
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/tls/server.crt
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICKzCCAdKgAwIBAgIQF7ZJRSdZJSb9HEWyJaxQuDAKBggqhkjOPQQDAjBsMQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4
+YW1wbGUuY29tMB4XDTE3MDYyMzEyMzMxOVoXDTI3MDYyMTEyMzMxOVowVjELMAkG
+A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu
+Y2lzY28xGjAYBgNVBAMMEUFkbWluQGV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYI
+KoZIzj0DAQcDQgAE+9xJbd39hXJw8Y49mtzzO1P/KaLjzkEAQGG7cnujbytJHRLL
++kHW2E02+ob8hAucwsjR/Sxg0J2yufaDxKWtSqNsMGowDgYDVR0PAQH/BAQDAgWg
+MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMCsG
+A1UdIwQkMCKAIGohHtGIgLTbOGeDHJd4CZAnE7jjIaWrVezBBNr8LuxJMAoGCCqG
+SM49BAMCA0cAMEQCIA5f8O7WfymKaLrJ71f77GGb/6z72Jh7g5svHDZBgKkBAiAg
+fkCIypxeGnU1Vbo3vYauhqU6lQYO6VcVBhk3182wyQ==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/tls/server.key b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/tls/server.key
new file mode 100755
index 0000000000..e8e021d03d
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/tls/server.key
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgixJReeen2sIgyqT6
+F0z2Y9iYIu++FVOGg7ha4FR6G2WhRANCAAT73Elt3f2FcnDxjj2a3PM7U/8pouPO
+QQBAYbtye6NvK0kdEsv6QdbYTTb6hvyEC5zCyNH9LGDQnbK59oPEpa1K
+-----END PRIVATE KEY-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/ca/0e729224e8b3f31784c8a93c5b8ef6f4c1c91d9e6e577c45c33163609fe40011_sk b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/ca/0e729224e8b3f31784c8a93c5b8ef6f4c1c91d9e6e577c45c33163609fe40011_sk
new file mode 100755
index 0000000000..3c356ecbf0
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/ca/0e729224e8b3f31784c8a93c5b8ef6f4c1c91d9e6e577c45c33163609fe40011_sk
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgp4Y9v/Cx/ee3K2mP
+N62ttbG2y1NkppMN6MlycYpqtT2hRANCAAQohXCFPMmsvPN+QiP874DXwHXyTZxI
+oRZ1Jt9ZkikUlJv3LDxCgSxu2TjCP0kkP/A5JrV4MP+lCit6MKbbkKYF
+-----END PRIVATE KEY-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/ca/ca.org1.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/ca/ca.org1.example.com-cert.pem
new file mode 100644
index 0000000000..01ce790d23
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/ca/ca.org1.example.com-cert.pem
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICQjCCAemgAwIBAgIQIR2LR9fa8xs5unnJJ9PFSzAKBggqhkjOPQQDAjBzMQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
+b3JnMS5leGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMzMTla
+MHMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
+YW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMRwwGgYDVQQD
+ExNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
+KIVwhTzJrLzzfkIj/O+A18B18k2cSKEWdSbfWZIpFJSb9yw8QoEsbtk4wj9JJD/w
+OSa1eDD/pQorejCm25CmBaNfMF0wDgYDVR0PAQH/BAQDAgGmMA8GA1UdJQQIMAYG
+BFUdJQAwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQgDnKSJOiz8xeEyKk8W472
+9MHJHZ5uV3xFwzFjYJ/kABEwCgYIKoZIzj0EAwIDRwAwRAIgMIO+yK3Fbwv1EXMc
+tQam42i6ROxSanaAHrbY2oVC1fICICsMpdSS2kbdntUDayi09v4/WRtC59ExCrHl
+rg/GXwkv
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/msp/admincerts/Admin@org1.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/msp/admincerts/Admin@org1.example.com-cert.pem
new file mode 100644
index 0000000000..e716793f48
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/msp/admincerts/Admin@org1.example.com-cert.pem
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICGTCCAb+gAwIBAgIQKKKdQSzsDoUYn/LPAuRWGTAKBggqhkjOPQQDAjBzMQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
+b3JnMS5leGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMzMTla
+MFsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
+YW4gRnJhbmNpc2NvMR8wHQYDVQQDDBZBZG1pbkBvcmcxLmV4YW1wbGUuY29tMFkw
+EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECmbzUDozIrLKjp3OAzItSG7m7Flw76rT
+8VO8E6otlCwxKtBRkPpZL7norC3NsjyE339J5O4pXCqhIApQyRRsRqNNMEswDgYD
+VR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAgDnKSJOiz8xeE
+yKk8W4729MHJHZ5uV3xFwzFjYJ/kABEwCgYIKoZIzj0EAwIDSAAwRQIhALT02pc/
+yfE/4wUJfUBQ32GifUEh8JktAXzL/73S0rjYAiACNSp6zAQBX9SBxTOGMk4cGGAy
+CKqf8052NVUs2CvPzA==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/msp/cacerts/ca.org1.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/msp/cacerts/ca.org1.example.com-cert.pem
new file mode 100644
index 0000000000..01ce790d23
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/msp/cacerts/ca.org1.example.com-cert.pem
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICQjCCAemgAwIBAgIQIR2LR9fa8xs5unnJJ9PFSzAKBggqhkjOPQQDAjBzMQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
+b3JnMS5leGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMzMTla
+MHMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
+YW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMRwwGgYDVQQD
+ExNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
+KIVwhTzJrLzzfkIj/O+A18B18k2cSKEWdSbfWZIpFJSb9yw8QoEsbtk4wj9JJD/w
+OSa1eDD/pQorejCm25CmBaNfMF0wDgYDVR0PAQH/BAQDAgGmMA8GA1UdJQQIMAYG
+BFUdJQAwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQgDnKSJOiz8xeEyKk8W472
+9MHJHZ5uV3xFwzFjYJ/kABEwCgYIKoZIzj0EAwIDRwAwRAIgMIO+yK3Fbwv1EXMc
+tQam42i6ROxSanaAHrbY2oVC1fICICsMpdSS2kbdntUDayi09v4/WRtC59ExCrHl
+rg/GXwkv
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/msp/tlscacerts/tlsca.org1.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/msp/tlscacerts/tlsca.org1.example.com-cert.pem
new file mode 100644
index 0000000000..d4e635366d
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/msp/tlscacerts/tlsca.org1.example.com-cert.pem
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICSTCCAe+gAwIBAgIQZrCrf6SF3Z/w7z3PwCNaaTAKBggqhkjOPQQDAjB2MQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz
+Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMz
+MTlaMHYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
+Ew1TYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMR8wHQYD
+VQQDExZ0bHNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D
+AQcDQgAEq4HHYbyF3O3iX+bt7tATNgdrWW6GYXWfKKJjsriBMhtYr5y/sTjvg64s
+Z517Nx/QNj26yKLdZ9vSBUGhAUfedaNfMF0wDgYDVR0PAQH/BAQDAgGmMA8GA1Ud
+JQQIMAYGBFUdJQAwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQglFCS2Tb1g4xa
+b2SE25dNhXkzcGc30A0Ev2X3Tjl2+fgwCgYIKoZIzj0EAwIDSAAwRQIhANDFPsDw
+14ftcZgQtMQ0yuMg8cCHj246rhsrnjwar7aAAiBwLG+4sKnTOOa+ceK6p+PpKu6F
+qwkrkz69kT1ZsL7SXw==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/admincerts/Admin@org1.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/admincerts/Admin@org1.example.com-cert.pem
new file mode 100644
index 0000000000..e716793f48
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/admincerts/Admin@org1.example.com-cert.pem
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICGTCCAb+gAwIBAgIQKKKdQSzsDoUYn/LPAuRWGTAKBggqhkjOPQQDAjBzMQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
+b3JnMS5leGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMzMTla
+MFsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
+YW4gRnJhbmNpc2NvMR8wHQYDVQQDDBZBZG1pbkBvcmcxLmV4YW1wbGUuY29tMFkw
+EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECmbzUDozIrLKjp3OAzItSG7m7Flw76rT
+8VO8E6otlCwxKtBRkPpZL7norC3NsjyE339J5O4pXCqhIApQyRRsRqNNMEswDgYD
+VR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAgDnKSJOiz8xeE
+yKk8W4729MHJHZ5uV3xFwzFjYJ/kABEwCgYIKoZIzj0EAwIDSAAwRQIhALT02pc/
+yfE/4wUJfUBQ32GifUEh8JktAXzL/73S0rjYAiACNSp6zAQBX9SBxTOGMk4cGGAy
+CKqf8052NVUs2CvPzA==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/cacerts/ca.org1.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/cacerts/ca.org1.example.com-cert.pem
new file mode 100644
index 0000000000..01ce790d23
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/cacerts/ca.org1.example.com-cert.pem
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICQjCCAemgAwIBAgIQIR2LR9fa8xs5unnJJ9PFSzAKBggqhkjOPQQDAjBzMQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
+b3JnMS5leGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMzMTla
+MHMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
+YW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMRwwGgYDVQQD
+ExNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
+KIVwhTzJrLzzfkIj/O+A18B18k2cSKEWdSbfWZIpFJSb9yw8QoEsbtk4wj9JJD/w
+OSa1eDD/pQorejCm25CmBaNfMF0wDgYDVR0PAQH/BAQDAgGmMA8GA1UdJQQIMAYG
+BFUdJQAwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQgDnKSJOiz8xeEyKk8W472
+9MHJHZ5uV3xFwzFjYJ/kABEwCgYIKoZIzj0EAwIDRwAwRAIgMIO+yK3Fbwv1EXMc
+tQam42i6ROxSanaAHrbY2oVC1fICICsMpdSS2kbdntUDayi09v4/WRtC59ExCrHl
+rg/GXwkv
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/keystore/27db82c96b1482480baa1c75f80e5cce249beaab27b70c741bb0e2554355957e_sk b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/keystore/27db82c96b1482480baa1c75f80e5cce249beaab27b70c741bb0e2554355957e_sk
new file mode 100755
index 0000000000..04b22a2db2
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/keystore/27db82c96b1482480baa1c75f80e5cce249beaab27b70c741bb0e2554355957e_sk
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgTEPwtCyJ1jFk2qQs
+oFgHzMo3/MEXG1XJHiTgoRYvnPahRANCAATNL2TaAIodxq3xaPhPacHW7ILxHbOD
+e6bF1MvueaAVanS7IIJtBDEP9VL7xH/cM28QWS/OFyNz01T+dGoyKuku
+-----END PRIVATE KEY-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/signcerts/peer0.org1.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/signcerts/peer0.org1.example.com-cert.pem
new file mode 100644
index 0000000000..53158d458f
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/signcerts/peer0.org1.example.com-cert.pem
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICGDCCAb+gAwIBAgIQPcMFFEB/vq6mEL6vXV7aUTAKBggqhkjOPQQDAjBzMQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
+b3JnMS5leGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMzMTla
+MFsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
+YW4gRnJhbmNpc2NvMR8wHQYDVQQDExZwZWVyMC5vcmcxLmV4YW1wbGUuY29tMFkw
+EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEzS9k2gCKHcat8Wj4T2nB1uyC8R2zg3um
+xdTL7nmgFWp0uyCCbQQxD/VS+8R/3DNvEFkvzhcjc9NU/nRqMirpLqNNMEswDgYD
+VR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAgDnKSJOiz8xeE
+yKk8W4729MHJHZ5uV3xFwzFjYJ/kABEwCgYIKoZIzj0EAwIDRwAwRAIgHBdxbHUG
+rFUzKPX9UmmN3SwigWcRUREUy/GTb3hDIAsCIEF1BxTqv8ilQYE8ql0wJL4mTber
+HE6DFYvvBCUnicUh
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/tlscacerts/tlsca.org1.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/tlscacerts/tlsca.org1.example.com-cert.pem
new file mode 100644
index 0000000000..d4e635366d
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/tlscacerts/tlsca.org1.example.com-cert.pem
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICSTCCAe+gAwIBAgIQZrCrf6SF3Z/w7z3PwCNaaTAKBggqhkjOPQQDAjB2MQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz
+Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMz
+MTlaMHYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
+Ew1TYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMR8wHQYD
+VQQDExZ0bHNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D
+AQcDQgAEq4HHYbyF3O3iX+bt7tATNgdrWW6GYXWfKKJjsriBMhtYr5y/sTjvg64s
+Z517Nx/QNj26yKLdZ9vSBUGhAUfedaNfMF0wDgYDVR0PAQH/BAQDAgGmMA8GA1Ud
+JQQIMAYGBFUdJQAwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQglFCS2Tb1g4xa
+b2SE25dNhXkzcGc30A0Ev2X3Tjl2+fgwCgYIKoZIzj0EAwIDSAAwRQIhANDFPsDw
+14ftcZgQtMQ0yuMg8cCHj246rhsrnjwar7aAAiBwLG+4sKnTOOa+ceK6p+PpKu6F
+qwkrkz69kT1ZsL7SXw==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
new file mode 100644
index 0000000000..d4e635366d
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICSTCCAe+gAwIBAgIQZrCrf6SF3Z/w7z3PwCNaaTAKBggqhkjOPQQDAjB2MQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz
+Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMz
+MTlaMHYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
+Ew1TYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMR8wHQYD
+VQQDExZ0bHNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D
+AQcDQgAEq4HHYbyF3O3iX+bt7tATNgdrWW6GYXWfKKJjsriBMhtYr5y/sTjvg64s
+Z517Nx/QNj26yKLdZ9vSBUGhAUfedaNfMF0wDgYDVR0PAQH/BAQDAgGmMA8GA1Ud
+JQQIMAYGBFUdJQAwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQglFCS2Tb1g4xa
+b2SE25dNhXkzcGc30A0Ev2X3Tjl2+fgwCgYIKoZIzj0EAwIDSAAwRQIhANDFPsDw
+14ftcZgQtMQ0yuMg8cCHj246rhsrnjwar7aAAiBwLG+4sKnTOOa+ceK6p+PpKu6F
+qwkrkz69kT1ZsL7SXw==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt
new file mode 100644
index 0000000000..f34c5be89e
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt
@@ -0,0 +1,16 @@
+-----BEGIN CERTIFICATE-----
+MIICczCCAhmgAwIBAgIRAIKTnLyvyRImVvGtyrD0wH4wCgYIKoZIzj0EAwIwdjEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
+c2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIz
+MzE5WjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
+BxMNU2FuIEZyYW5jaXNjbzEfMB0GA1UEAxMWcGVlcjAub3JnMS5leGFtcGxlLmNv
+bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCZF1/1UYwnRJk2d+3zB0cW9oi8H
+h7g6CaBw6aEI1WwgtKZ+/s28oQVUYBVJsdT3RAGgRRRt12QrqO/xa7/i1UejgaIw
+gZ8wDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcD
+AjAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIJRQktk29YOMWm9khNuXTYV5M3Bn
+N9ANBL9l9045dvn4MDMGA1UdEQQsMCqCFnBlZXIwLm9yZzEuZXhhbXBsZS5jb22C
+BXBlZXIwgglsb2NhbGhvc3QwCgYIKoZIzj0EAwIDSAAwRQIhAPs/YOkkkh2835Vb
+pXtUuQNCi/PlhPhTiFlEdeE56vmmAiBadeHDYBIHkEA10wzr33wS1FpELg18eC5N
+5gtmHzQUBA==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key
new file mode 100755
index 0000000000..d4a96e2d3d
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgCRU1ZAMLxDAlcr5d
+D6ZSprL4Lf0+TkWwN6rCFVWmjDuhRANCAAQmRdf9VGMJ0SZNnft8wdHFvaIvB4e4
+OgmgcOmhCNVsILSmfv7NvKEFVGAVSbHU90QBoEUUbddkK6jv8Wu/4tVH
+-----END PRIVATE KEY-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp/admincerts/Admin@org1.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp/admincerts/Admin@org1.example.com-cert.pem
new file mode 100644
index 0000000000..e716793f48
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp/admincerts/Admin@org1.example.com-cert.pem
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICGTCCAb+gAwIBAgIQKKKdQSzsDoUYn/LPAuRWGTAKBggqhkjOPQQDAjBzMQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
+b3JnMS5leGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMzMTla
+MFsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
+YW4gRnJhbmNpc2NvMR8wHQYDVQQDDBZBZG1pbkBvcmcxLmV4YW1wbGUuY29tMFkw
+EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECmbzUDozIrLKjp3OAzItSG7m7Flw76rT
+8VO8E6otlCwxKtBRkPpZL7norC3NsjyE339J5O4pXCqhIApQyRRsRqNNMEswDgYD
+VR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAgDnKSJOiz8xeE
+yKk8W4729MHJHZ5uV3xFwzFjYJ/kABEwCgYIKoZIzj0EAwIDSAAwRQIhALT02pc/
+yfE/4wUJfUBQ32GifUEh8JktAXzL/73S0rjYAiACNSp6zAQBX9SBxTOGMk4cGGAy
+CKqf8052NVUs2CvPzA==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp/cacerts/ca.org1.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp/cacerts/ca.org1.example.com-cert.pem
new file mode 100644
index 0000000000..01ce790d23
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp/cacerts/ca.org1.example.com-cert.pem
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICQjCCAemgAwIBAgIQIR2LR9fa8xs5unnJJ9PFSzAKBggqhkjOPQQDAjBzMQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
+b3JnMS5leGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMzMTla
+MHMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
+YW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMRwwGgYDVQQD
+ExNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
+KIVwhTzJrLzzfkIj/O+A18B18k2cSKEWdSbfWZIpFJSb9yw8QoEsbtk4wj9JJD/w
+OSa1eDD/pQorejCm25CmBaNfMF0wDgYDVR0PAQH/BAQDAgGmMA8GA1UdJQQIMAYG
+BFUdJQAwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQgDnKSJOiz8xeEyKk8W472
+9MHJHZ5uV3xFwzFjYJ/kABEwCgYIKoZIzj0EAwIDRwAwRAIgMIO+yK3Fbwv1EXMc
+tQam42i6ROxSanaAHrbY2oVC1fICICsMpdSS2kbdntUDayi09v4/WRtC59ExCrHl
+rg/GXwkv
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp/keystore/fdee12a3510fde3155c37128cfec26090ae249bfbca28f884e60c21338493edd_sk b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp/keystore/fdee12a3510fde3155c37128cfec26090ae249bfbca28f884e60c21338493edd_sk
new file mode 100755
index 0000000000..ae23cef091
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp/keystore/fdee12a3510fde3155c37128cfec26090ae249bfbca28f884e60c21338493edd_sk
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgtzNlo4v/qB1j5dJ6
+CRLQb9UAfUMMevXdnbuXUux2K2GhRANCAAQp09OJbb47IImVbghi7EWMxIgkyWZW
+cIdx0/9u9wdzZFgO8K5ciuxXwGpyMnsbkdVCPZuPmCjahRunIGJ3/DLH
+-----END PRIVATE KEY-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp/signcerts/peer1.org1.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp/signcerts/peer1.org1.example.com-cert.pem
new file mode 100644
index 0000000000..35a225be9e
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp/signcerts/peer1.org1.example.com-cert.pem
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICGjCCAcCgAwIBAgIRAI+BBtEBvpOqhfRZZH7eV/YwCgYIKoZIzj0EAwIwczEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh
+Lm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIzMzE5
+WjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
+U2FuIEZyYW5jaXNjbzEfMB0GA1UEAxMWcGVlcjEub3JnMS5leGFtcGxlLmNvbTBZ
+MBMGByqGSM49AgEGCCqGSM49AwEHA0IABCnT04ltvjsgiZVuCGLsRYzEiCTJZlZw
+h3HT/273B3NkWA7wrlyK7FfAanIyexuR1UI9m4+YKNqFG6cgYnf8MsejTTBLMA4G
+A1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIA5ykiTos/MX
+hMipPFuO9vTByR2ebld8RcMxY2Cf5AARMAoGCCqGSM49BAMCA0gAMEUCIQCSRdWm
+i4IgVUajvzWVxyE/wi7n617pVqS4+nJ7gbTRjQIgefzBwS+bkNhPc3/rktySFLRC
+WMnq87KyqMLc6iRaJx0=
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp/tlscacerts/tlsca.org1.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp/tlscacerts/tlsca.org1.example.com-cert.pem
new file mode 100644
index 0000000000..d4e635366d
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp/tlscacerts/tlsca.org1.example.com-cert.pem
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICSTCCAe+gAwIBAgIQZrCrf6SF3Z/w7z3PwCNaaTAKBggqhkjOPQQDAjB2MQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz
+Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMz
+MTlaMHYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
+Ew1TYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMR8wHQYD
+VQQDExZ0bHNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D
+AQcDQgAEq4HHYbyF3O3iX+bt7tATNgdrWW6GYXWfKKJjsriBMhtYr5y/sTjvg64s
+Z517Nx/QNj26yKLdZ9vSBUGhAUfedaNfMF0wDgYDVR0PAQH/BAQDAgGmMA8GA1Ud
+JQQIMAYGBFUdJQAwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQglFCS2Tb1g4xa
+b2SE25dNhXkzcGc30A0Ev2X3Tjl2+fgwCgYIKoZIzj0EAwIDSAAwRQIhANDFPsDw
+14ftcZgQtMQ0yuMg8cCHj246rhsrnjwar7aAAiBwLG+4sKnTOOa+ceK6p+PpKu6F
+qwkrkz69kT1ZsL7SXw==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/ca.crt b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/ca.crt
new file mode 100644
index 0000000000..d4e635366d
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/ca.crt
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICSTCCAe+gAwIBAgIQZrCrf6SF3Z/w7z3PwCNaaTAKBggqhkjOPQQDAjB2MQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz
+Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMz
+MTlaMHYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
+Ew1TYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMR8wHQYD
+VQQDExZ0bHNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D
+AQcDQgAEq4HHYbyF3O3iX+bt7tATNgdrWW6GYXWfKKJjsriBMhtYr5y/sTjvg64s
+Z517Nx/QNj26yKLdZ9vSBUGhAUfedaNfMF0wDgYDVR0PAQH/BAQDAgGmMA8GA1Ud
+JQQIMAYGBFUdJQAwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQglFCS2Tb1g4xa
+b2SE25dNhXkzcGc30A0Ev2X3Tjl2+fgwCgYIKoZIzj0EAwIDSAAwRQIhANDFPsDw
+14ftcZgQtMQ0yuMg8cCHj246rhsrnjwar7aAAiBwLG+4sKnTOOa+ceK6p+PpKu6F
+qwkrkz69kT1ZsL7SXw==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/server.crt b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/server.crt
new file mode 100644
index 0000000000..15158a45a5
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/server.crt
@@ -0,0 +1,16 @@
+-----BEGIN CERTIFICATE-----
+MIICczCCAhmgAwIBAgIRALZ2km4W6KjPQb9rM12Ewb4wCgYIKoZIzj0EAwIwdjEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
+c2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIz
+MzE5WjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
+BxMNU2FuIEZyYW5jaXNjbzEfMB0GA1UEAxMWcGVlcjEub3JnMS5leGFtcGxlLmNv
+bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABKpNWa4jf/Rk5bpSZqFYteLESkd7
+KbrSOoiqLJmYSvM+KjDRPt+/pjLBNKM60tvknTUslU6Jne/7CVx1FpiHjRGjgaIw
+gZ8wDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcD
+AjAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIJRQktk29YOMWm9khNuXTYV5M3Bn
+N9ANBL9l9045dvn4MDMGA1UdEQQsMCqCFnBlZXIxLm9yZzEuZXhhbXBsZS5jb22C
+BXBlZXIxgglsb2NhbGhvc3QwCgYIKoZIzj0EAwIDSAAwRQIhAKjhWT8ZdaYR2Hvx
+hPUl3t6gDJmkVuhy2Mxin04XxrUUAiBmBN83NmGoluPHQnvtGQ1BQP/JpY+UCkMR
+O0xeuEChjA==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/server.key b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/server.key
new file mode 100755
index 0000000000..5fa4ace4cb
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/server.key
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgi4EN3aLIYYJMpLwD
+r3yCKO+EBzcCcTA5QbNZ1SvDFa+hRANCAASqTVmuI3/0ZOW6UmahWLXixEpHeym6
+0jqIqiyZmErzPiow0T7fv6YywTSjOtLb5J01LJVOiZ3v+wlcdRaYh40R
+-----END PRIVATE KEY-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/tlsca/945092d936f5838c5a6f6484db974d857933706737d00d04bf65f74e3976f9f8_sk b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/tlsca/945092d936f5838c5a6f6484db974d857933706737d00d04bf65f74e3976f9f8_sk
new file mode 100755
index 0000000000..9d302e4d12
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/tlsca/945092d936f5838c5a6f6484db974d857933706737d00d04bf65f74e3976f9f8_sk
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg/I1tIO3Xr1ZlsJUm
+FDoUo/CNIJXLPlpUxtB7/LjcNzahRANCAASrgcdhvIXc7eJf5u3u0BM2B2tZboZh
+dZ8oomOyuIEyG1ivnL+xOO+DrixnnXs3H9A2PbrIot1n29IFQaEBR951
+-----END PRIVATE KEY-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/tlsca/tlsca.org1.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/tlsca/tlsca.org1.example.com-cert.pem
new file mode 100644
index 0000000000..d4e635366d
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/tlsca/tlsca.org1.example.com-cert.pem
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICSTCCAe+gAwIBAgIQZrCrf6SF3Z/w7z3PwCNaaTAKBggqhkjOPQQDAjB2MQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz
+Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMz
+MTlaMHYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
+Ew1TYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMR8wHQYD
+VQQDExZ0bHNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D
+AQcDQgAEq4HHYbyF3O3iX+bt7tATNgdrWW6GYXWfKKJjsriBMhtYr5y/sTjvg64s
+Z517Nx/QNj26yKLdZ9vSBUGhAUfedaNfMF0wDgYDVR0PAQH/BAQDAgGmMA8GA1Ud
+JQQIMAYGBFUdJQAwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQglFCS2Tb1g4xa
+b2SE25dNhXkzcGc30A0Ev2X3Tjl2+fgwCgYIKoZIzj0EAwIDSAAwRQIhANDFPsDw
+14ftcZgQtMQ0yuMg8cCHj246rhsrnjwar7aAAiBwLG+4sKnTOOa+ceK6p+PpKu6F
+qwkrkz69kT1ZsL7SXw==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/admincerts/Admin@org1.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/admincerts/Admin@org1.example.com-cert.pem
new file mode 100644
index 0000000000..e716793f48
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/admincerts/Admin@org1.example.com-cert.pem
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICGTCCAb+gAwIBAgIQKKKdQSzsDoUYn/LPAuRWGTAKBggqhkjOPQQDAjBzMQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
+b3JnMS5leGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMzMTla
+MFsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
+YW4gRnJhbmNpc2NvMR8wHQYDVQQDDBZBZG1pbkBvcmcxLmV4YW1wbGUuY29tMFkw
+EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECmbzUDozIrLKjp3OAzItSG7m7Flw76rT
+8VO8E6otlCwxKtBRkPpZL7norC3NsjyE339J5O4pXCqhIApQyRRsRqNNMEswDgYD
+VR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAgDnKSJOiz8xeE
+yKk8W4729MHJHZ5uV3xFwzFjYJ/kABEwCgYIKoZIzj0EAwIDSAAwRQIhALT02pc/
+yfE/4wUJfUBQ32GifUEh8JktAXzL/73S0rjYAiACNSp6zAQBX9SBxTOGMk4cGGAy
+CKqf8052NVUs2CvPzA==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/cacerts/ca.org1.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/cacerts/ca.org1.example.com-cert.pem
new file mode 100644
index 0000000000..01ce790d23
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/cacerts/ca.org1.example.com-cert.pem
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICQjCCAemgAwIBAgIQIR2LR9fa8xs5unnJJ9PFSzAKBggqhkjOPQQDAjBzMQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
+b3JnMS5leGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMzMTla
+MHMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
+YW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMRwwGgYDVQQD
+ExNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
+KIVwhTzJrLzzfkIj/O+A18B18k2cSKEWdSbfWZIpFJSb9yw8QoEsbtk4wj9JJD/w
+OSa1eDD/pQorejCm25CmBaNfMF0wDgYDVR0PAQH/BAQDAgGmMA8GA1UdJQQIMAYG
+BFUdJQAwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQgDnKSJOiz8xeEyKk8W472
+9MHJHZ5uV3xFwzFjYJ/kABEwCgYIKoZIzj0EAwIDRwAwRAIgMIO+yK3Fbwv1EXMc
+tQam42i6ROxSanaAHrbY2oVC1fICICsMpdSS2kbdntUDayi09v4/WRtC59ExCrHl
+rg/GXwkv
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/keystore/5890f0061619c06fb29dea8cb304edecc020fe63f41a6db109f1e227cc1cb2a8_sk b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/keystore/5890f0061619c06fb29dea8cb304edecc020fe63f41a6db109f1e227cc1cb2a8_sk
new file mode 100755
index 0000000000..09b7d469e3
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/keystore/5890f0061619c06fb29dea8cb304edecc020fe63f41a6db109f1e227cc1cb2a8_sk
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgNmsvQQm4nwrxOKFX
+UNfLPgjNm+FtYu3vb6OZ9q/5GbChRANCAAQKZvNQOjMissqOnc4DMi1IbubsWXDv
+qtPxU7wTqi2ULDEq0FGQ+lkvueisLc2yPITff0nk7ilcKqEgClDJFGxG
+-----END PRIVATE KEY-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts/Admin@org1.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts/Admin@org1.example.com-cert.pem
new file mode 100644
index 0000000000..e716793f48
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts/Admin@org1.example.com-cert.pem
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICGTCCAb+gAwIBAgIQKKKdQSzsDoUYn/LPAuRWGTAKBggqhkjOPQQDAjBzMQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
+b3JnMS5leGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMzMTla
+MFsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
+YW4gRnJhbmNpc2NvMR8wHQYDVQQDDBZBZG1pbkBvcmcxLmV4YW1wbGUuY29tMFkw
+EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECmbzUDozIrLKjp3OAzItSG7m7Flw76rT
+8VO8E6otlCwxKtBRkPpZL7norC3NsjyE339J5O4pXCqhIApQyRRsRqNNMEswDgYD
+VR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAgDnKSJOiz8xeE
+yKk8W4729MHJHZ5uV3xFwzFjYJ/kABEwCgYIKoZIzj0EAwIDSAAwRQIhALT02pc/
+yfE/4wUJfUBQ32GifUEh8JktAXzL/73S0rjYAiACNSp6zAQBX9SBxTOGMk4cGGAy
+CKqf8052NVUs2CvPzA==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/tlscacerts/tlsca.org1.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/tlscacerts/tlsca.org1.example.com-cert.pem
new file mode 100644
index 0000000000..d4e635366d
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/tlscacerts/tlsca.org1.example.com-cert.pem
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICSTCCAe+gAwIBAgIQZrCrf6SF3Z/w7z3PwCNaaTAKBggqhkjOPQQDAjB2MQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz
+Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMz
+MTlaMHYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
+Ew1TYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMR8wHQYD
+VQQDExZ0bHNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D
+AQcDQgAEq4HHYbyF3O3iX+bt7tATNgdrWW6GYXWfKKJjsriBMhtYr5y/sTjvg64s
+Z517Nx/QNj26yKLdZ9vSBUGhAUfedaNfMF0wDgYDVR0PAQH/BAQDAgGmMA8GA1Ud
+JQQIMAYGBFUdJQAwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQglFCS2Tb1g4xa
+b2SE25dNhXkzcGc30A0Ev2X3Tjl2+fgwCgYIKoZIzj0EAwIDSAAwRQIhANDFPsDw
+14ftcZgQtMQ0yuMg8cCHj246rhsrnjwar7aAAiBwLG+4sKnTOOa+ceK6p+PpKu6F
+qwkrkz69kT1ZsL7SXw==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/tls/ca.crt b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/tls/ca.crt
new file mode 100644
index 0000000000..d4e635366d
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/tls/ca.crt
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICSTCCAe+gAwIBAgIQZrCrf6SF3Z/w7z3PwCNaaTAKBggqhkjOPQQDAjB2MQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz
+Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMz
+MTlaMHYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
+Ew1TYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMR8wHQYD
+VQQDExZ0bHNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D
+AQcDQgAEq4HHYbyF3O3iX+bt7tATNgdrWW6GYXWfKKJjsriBMhtYr5y/sTjvg64s
+Z517Nx/QNj26yKLdZ9vSBUGhAUfedaNfMF0wDgYDVR0PAQH/BAQDAgGmMA8GA1Ud
+JQQIMAYGBFUdJQAwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQglFCS2Tb1g4xa
+b2SE25dNhXkzcGc30A0Ev2X3Tjl2+fgwCgYIKoZIzj0EAwIDSAAwRQIhANDFPsDw
+14ftcZgQtMQ0yuMg8cCHj246rhsrnjwar7aAAiBwLG+4sKnTOOa+ceK6p+PpKu6F
+qwkrkz69kT1ZsL7SXw==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/tls/server.crt b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/tls/server.crt
new file mode 100644
index 0000000000..54c13d4122
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/tls/server.crt
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICOzCCAeKgAwIBAgIRALvUEE81tMguFRFvx00HyREwCgYIKoZIzj0EAwIwdjEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
+c2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIz
+MzE5WjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
+BxMNU2FuIEZyYW5jaXNjbzEfMB0GA1UEAwwWQWRtaW5Ab3JnMS5leGFtcGxlLmNv
+bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCk0mXNbPIzN+YOJvx/0XnOVdb6G
+RxNetOOuuWq+QBWLJhdlRKrhtI+NTiHKjq7UMmBNdIfBPC1YXHIGdeD2u+CjbDBq
+MA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw
+DAYDVR0TAQH/BAIwADArBgNVHSMEJDAigCCUUJLZNvWDjFpvZITbl02FeTNwZzfQ
+DQS/ZfdOOXb5+DAKBggqhkjOPQQDAgNHADBEAiAp9+XFJ2igUvUlvkFVLeH7sWHf
++Q4m47hVT/81vedY1gIgTSz5CufvmWnI5AgwCuw4D0w0eDPFAc1HkO1rlVo5icY=
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/tls/server.key b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/tls/server.key
new file mode 100755
index 0000000000..2cfab9b413
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/tls/server.key
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgfVrs13ZtxgKp8l5T
+WAq2IXqgd+zF1V6sTh7rbQ104rShRANCAAQpNJlzWzyMzfmDib8f9F5zlXW+hkcT
+XrTjrrlqvkAViyYXZUSq4bSPjU4hyo6u1DJgTXSHwTwtWFxyBnXg9rvg
+-----END PRIVATE KEY-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/admincerts/User1@org1.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/admincerts/User1@org1.example.com-cert.pem
new file mode 100644
index 0000000000..3776258229
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/admincerts/User1@org1.example.com-cert.pem
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICGjCCAcCgAwIBAgIRANfNECvok9C6hT58XJZ/lJAwCgYIKoZIzj0EAwIwczEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh
+Lm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIzMzE5
+WjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
+U2FuIEZyYW5jaXNjbzEfMB0GA1UEAwwWVXNlcjFAb3JnMS5leGFtcGxlLmNvbTBZ
+MBMGByqGSM49AgEGCCqGSM49AwEHA0IABHV6X/kWuQK6xhXe9OenQZKDI7/zax7Y
+jYlRvUlHgCoqKIy8fFAat3glGbVX1oo2oZ7cMJVlFnbuiPdrg4vkyjejTTBLMA4G
+A1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIA5ykiTos/MX
+hMipPFuO9vTByR2ebld8RcMxY2Cf5AARMAoGCCqGSM49BAMCA0gAMEUCIQDbCDrW
+eqZ4yw7vcEhnNExiRZTv0xcVbRF8JgGozLz6qwIgZoXcqxvkJaBdZpwzg4f0RvVQ
+QrjJMURXXchQ1Mnd5+o=
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/cacerts/ca.org1.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/cacerts/ca.org1.example.com-cert.pem
new file mode 100644
index 0000000000..01ce790d23
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/cacerts/ca.org1.example.com-cert.pem
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICQjCCAemgAwIBAgIQIR2LR9fa8xs5unnJJ9PFSzAKBggqhkjOPQQDAjBzMQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
+b3JnMS5leGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMzMTla
+MHMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
+YW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMRwwGgYDVQQD
+ExNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
+KIVwhTzJrLzzfkIj/O+A18B18k2cSKEWdSbfWZIpFJSb9yw8QoEsbtk4wj9JJD/w
+OSa1eDD/pQorejCm25CmBaNfMF0wDgYDVR0PAQH/BAQDAgGmMA8GA1UdJQQIMAYG
+BFUdJQAwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQgDnKSJOiz8xeEyKk8W472
+9MHJHZ5uV3xFwzFjYJ/kABEwCgYIKoZIzj0EAwIDRwAwRAIgMIO+yK3Fbwv1EXMc
+tQam42i6ROxSanaAHrbY2oVC1fICICsMpdSS2kbdntUDayi09v4/WRtC59ExCrHl
+rg/GXwkv
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/keystore/73cdc0072c7203f1ec512232c780fc84acc9752ef30ebc16be1f4666c02b614b_sk b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/keystore/73cdc0072c7203f1ec512232c780fc84acc9752ef30ebc16be1f4666c02b614b_sk
new file mode 100755
index 0000000000..37d8e8df8b
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/keystore/73cdc0072c7203f1ec512232c780fc84acc9752ef30ebc16be1f4666c02b614b_sk
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgaYlbFIz6yVz0SYqh
+nrhdTCb797PBwSwtCw9HtOkbqQGhRANCAAR1el/5FrkCusYV3vTnp0GSgyO/82se
+2I2JUb1JR4AqKiiMvHxQGrd4JRm1V9aKNqGe3DCVZRZ27oj3a4OL5Mo3
+-----END PRIVATE KEY-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/signcerts/User1@org1.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/signcerts/User1@org1.example.com-cert.pem
new file mode 100644
index 0000000000..3776258229
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/signcerts/User1@org1.example.com-cert.pem
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICGjCCAcCgAwIBAgIRANfNECvok9C6hT58XJZ/lJAwCgYIKoZIzj0EAwIwczEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh
+Lm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIzMzE5
+WjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
+U2FuIEZyYW5jaXNjbzEfMB0GA1UEAwwWVXNlcjFAb3JnMS5leGFtcGxlLmNvbTBZ
+MBMGByqGSM49AgEGCCqGSM49AwEHA0IABHV6X/kWuQK6xhXe9OenQZKDI7/zax7Y
+jYlRvUlHgCoqKIy8fFAat3glGbVX1oo2oZ7cMJVlFnbuiPdrg4vkyjejTTBLMA4G
+A1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIA5ykiTos/MX
+hMipPFuO9vTByR2ebld8RcMxY2Cf5AARMAoGCCqGSM49BAMCA0gAMEUCIQDbCDrW
+eqZ4yw7vcEhnNExiRZTv0xcVbRF8JgGozLz6qwIgZoXcqxvkJaBdZpwzg4f0RvVQ
+QrjJMURXXchQ1Mnd5+o=
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/tlscacerts/tlsca.org1.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/tlscacerts/tlsca.org1.example.com-cert.pem
new file mode 100644
index 0000000000..d4e635366d
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/tlscacerts/tlsca.org1.example.com-cert.pem
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICSTCCAe+gAwIBAgIQZrCrf6SF3Z/w7z3PwCNaaTAKBggqhkjOPQQDAjB2MQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz
+Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMz
+MTlaMHYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
+Ew1TYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMR8wHQYD
+VQQDExZ0bHNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D
+AQcDQgAEq4HHYbyF3O3iX+bt7tATNgdrWW6GYXWfKKJjsriBMhtYr5y/sTjvg64s
+Z517Nx/QNj26yKLdZ9vSBUGhAUfedaNfMF0wDgYDVR0PAQH/BAQDAgGmMA8GA1Ud
+JQQIMAYGBFUdJQAwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQglFCS2Tb1g4xa
+b2SE25dNhXkzcGc30A0Ev2X3Tjl2+fgwCgYIKoZIzj0EAwIDSAAwRQIhANDFPsDw
+14ftcZgQtMQ0yuMg8cCHj246rhsrnjwar7aAAiBwLG+4sKnTOOa+ceK6p+PpKu6F
+qwkrkz69kT1ZsL7SXw==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/tls/ca.crt b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/tls/ca.crt
new file mode 100644
index 0000000000..d4e635366d
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/tls/ca.crt
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICSTCCAe+gAwIBAgIQZrCrf6SF3Z/w7z3PwCNaaTAKBggqhkjOPQQDAjB2MQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz
+Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMz
+MTlaMHYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
+Ew1TYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMR8wHQYD
+VQQDExZ0bHNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D
+AQcDQgAEq4HHYbyF3O3iX+bt7tATNgdrWW6GYXWfKKJjsriBMhtYr5y/sTjvg64s
+Z517Nx/QNj26yKLdZ9vSBUGhAUfedaNfMF0wDgYDVR0PAQH/BAQDAgGmMA8GA1Ud
+JQQIMAYGBFUdJQAwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQglFCS2Tb1g4xa
+b2SE25dNhXkzcGc30A0Ev2X3Tjl2+fgwCgYIKoZIzj0EAwIDSAAwRQIhANDFPsDw
+14ftcZgQtMQ0yuMg8cCHj246rhsrnjwar7aAAiBwLG+4sKnTOOa+ceK6p+PpKu6F
+qwkrkz69kT1ZsL7SXw==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/tls/server.crt b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/tls/server.crt
new file mode 100644
index 0000000000..20a1182752
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/tls/server.crt
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICOjCCAeGgAwIBAgIQSEKNVPcBOB7Kgrrzf05rJjAKBggqhkjOPQQDAjB2MQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz
+Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMz
+MTlaMFsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
+Ew1TYW4gRnJhbmNpc2NvMR8wHQYDVQQDDBZVc2VyMUBvcmcxLmV4YW1wbGUuY29t
+MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEyHrGhNgy26huH3hNap1UMtQRBVIx
+xTX0NqIbUMKcBSw9DRF0ndZHd5KQUVrj5t2/QY+YSpqK6ufDk68fWSAZ7KNsMGow
+DgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAM
+BgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIJRQktk29YOMWm9khNuXTYV5M3BnN9AN
+BL9l9045dvn4MAoGCCqGSM49BAMCA0cAMEQCIE6HCTr9in2CqF6S+m/aGCVQrZwK
+/o3oyXdcymDc/PbDAiAHIRDkIw1mU31KNhvPd6f8c/sReVDr3PQLydWh/HJpTQ==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/tls/server.key b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/tls/server.key
new file mode 100755
index 0000000000..f23e877ea9
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/tls/server.key
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgOXZUBNCAmIwJR3bt
+GfoOwtmo3QunwcBnBBUPjot4frihRANCAATIesaE2DLbqG4feE1qnVQy1BEFUjHF
+NfQ2ohtQwpwFLD0NEXSd1kd3kpBRWuPm3b9Bj5hKmorq58OTrx9ZIBns
+-----END PRIVATE KEY-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/ca/a7d47efa46a6ba07730c850fed2c1375df27360d7227f48cdc2f80e505678005_sk b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/ca/a7d47efa46a6ba07730c850fed2c1375df27360d7227f48cdc2f80e505678005_sk
new file mode 100755
index 0000000000..3f732ae44d
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/ca/a7d47efa46a6ba07730c850fed2c1375df27360d7227f48cdc2f80e505678005_sk
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgUgMy/PQKxjfxITFM
+mVPTu4ZwQlhYIh1vJkn3dkjqDBShRANCAARVtStps/F2HsCLFIdah6iJhTW6Vvro
+DQ/HOkGAfPZjzjB4cYpfaRNX19I/9fPnuLqIWxSjj/FEwdeXNX/5hUhH
+-----END PRIVATE KEY-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/ca/ca.org2.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/ca/ca.org2.example.com-cert.pem
new file mode 100644
index 0000000000..a26e1ec29a
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/ca/ca.org2.example.com-cert.pem
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICQzCCAeqgAwIBAgIRAJEAD5YytxsnFjw+liBjOQkwCgYIKoZIzj0EAwIwczEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh
+Lm9yZzIuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIzMzE5
+WjBzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
+U2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEcMBoGA1UE
+AxMTY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA
+BFW1K2mz8XYewIsUh1qHqImFNbpW+ugND8c6QYB89mPOMHhxil9pE1fX0j/18+e4
+uohbFKOP8UTB15c1f/mFSEejXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAG
+BgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIKfUfvpGproHcwyFD+0s
+E3XfJzYNcif0jNwvgOUFZ4AFMAoGCCqGSM49BAMCA0cAMEQCIGrkModOvz6mcUDA
+Zql4YPXU/3ZUbMLw8VuSNHh47lg7AiAPLSKy/v8y8mhebGRCNTYwdkidQCQFrh+2
+BIirBFsT0g==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/msp/admincerts/Admin@org2.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/msp/admincerts/Admin@org2.example.com-cert.pem
new file mode 100644
index 0000000000..93086ac949
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/msp/admincerts/Admin@org2.example.com-cert.pem
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICGjCCAcCgAwIBAgIRAIUbkOONvaq2DLJr9qZbDKwwCgYIKoZIzj0EAwIwczEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh
+Lm9yZzIuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIzMzE5
+WjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
+U2FuIEZyYW5jaXNjbzEfMB0GA1UEAwwWQWRtaW5Ab3JnMi5leGFtcGxlLmNvbTBZ
+MBMGByqGSM49AgEGCCqGSM49AwEHA0IABMLKHXm1xN7Tk4YzaWg4GYhLoyNjrjs5
+302o37m12U8LorR7IL5fdFgYILeL4XUPjC/QG4E2o6hPl3uZPUVErbajTTBLMA4G
+A1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIKfUfvpGproH
+cwyFD+0sE3XfJzYNcif0jNwvgOUFZ4AFMAoGCCqGSM49BAMCA0gAMEUCIQDa1k6R
++luypvng6JMSKIyibptkwICToEAZlDqLeD+k1gIgGFXm1+p1QqxViOa+c1dUvjl0
+m1UCqGDwNTHDm5mO+es=
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/msp/cacerts/ca.org2.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/msp/cacerts/ca.org2.example.com-cert.pem
new file mode 100644
index 0000000000..a26e1ec29a
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/msp/cacerts/ca.org2.example.com-cert.pem
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICQzCCAeqgAwIBAgIRAJEAD5YytxsnFjw+liBjOQkwCgYIKoZIzj0EAwIwczEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh
+Lm9yZzIuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIzMzE5
+WjBzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
+U2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEcMBoGA1UE
+AxMTY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA
+BFW1K2mz8XYewIsUh1qHqImFNbpW+ugND8c6QYB89mPOMHhxil9pE1fX0j/18+e4
+uohbFKOP8UTB15c1f/mFSEejXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAG
+BgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIKfUfvpGproHcwyFD+0s
+E3XfJzYNcif0jNwvgOUFZ4AFMAoGCCqGSM49BAMCA0cAMEQCIGrkModOvz6mcUDA
+Zql4YPXU/3ZUbMLw8VuSNHh47lg7AiAPLSKy/v8y8mhebGRCNTYwdkidQCQFrh+2
+BIirBFsT0g==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/msp/tlscacerts/tlsca.org2.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/msp/tlscacerts/tlsca.org2.example.com-cert.pem
new file mode 100644
index 0000000000..6d01d67c3e
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/msp/tlscacerts/tlsca.org2.example.com-cert.pem
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICSTCCAfCgAwIBAgIRANX86HJQn/543CANoioLOegwCgYIKoZIzj0EAwIwdjEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
+c2NhLm9yZzIuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIz
+MzE5WjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
+BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEfMB0G
+A1UEAxMWdGxzY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49
+AwEHA0IABBp+58H8VypXHB9Hf/1ExZTmNdcBlTUgAmHH5sb9DizHXwljo6zdyXfZ
+cLvTCpoLybJ/rnp4PKJ7NKUDmrQymLWjXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNV
+HSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIHu4uj/xHTyM
+9ZK9QyYGLnfQasSWPHt65FkoTfvT61qsMAoGCCqGSM49BAMCA0cAMEQCIBJ9N4PD
+mB+2gAPeDWYteAZ5Q2KR/E0zMQ13pDSunHNcAiBwWRzwscXxCPOJp1sjBMVp5Z1a
+nfIdbwvBbsl1XV/j0g==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp/admincerts/Admin@org2.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp/admincerts/Admin@org2.example.com-cert.pem
new file mode 100644
index 0000000000..93086ac949
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp/admincerts/Admin@org2.example.com-cert.pem
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICGjCCAcCgAwIBAgIRAIUbkOONvaq2DLJr9qZbDKwwCgYIKoZIzj0EAwIwczEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh
+Lm9yZzIuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIzMzE5
+WjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
+U2FuIEZyYW5jaXNjbzEfMB0GA1UEAwwWQWRtaW5Ab3JnMi5leGFtcGxlLmNvbTBZ
+MBMGByqGSM49AgEGCCqGSM49AwEHA0IABMLKHXm1xN7Tk4YzaWg4GYhLoyNjrjs5
+302o37m12U8LorR7IL5fdFgYILeL4XUPjC/QG4E2o6hPl3uZPUVErbajTTBLMA4G
+A1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIKfUfvpGproH
+cwyFD+0sE3XfJzYNcif0jNwvgOUFZ4AFMAoGCCqGSM49BAMCA0gAMEUCIQDa1k6R
++luypvng6JMSKIyibptkwICToEAZlDqLeD+k1gIgGFXm1+p1QqxViOa+c1dUvjl0
+m1UCqGDwNTHDm5mO+es=
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp/cacerts/ca.org2.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp/cacerts/ca.org2.example.com-cert.pem
new file mode 100644
index 0000000000..a26e1ec29a
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp/cacerts/ca.org2.example.com-cert.pem
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICQzCCAeqgAwIBAgIRAJEAD5YytxsnFjw+liBjOQkwCgYIKoZIzj0EAwIwczEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh
+Lm9yZzIuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIzMzE5
+WjBzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
+U2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEcMBoGA1UE
+AxMTY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA
+BFW1K2mz8XYewIsUh1qHqImFNbpW+ugND8c6QYB89mPOMHhxil9pE1fX0j/18+e4
+uohbFKOP8UTB15c1f/mFSEejXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAG
+BgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIKfUfvpGproHcwyFD+0s
+E3XfJzYNcif0jNwvgOUFZ4AFMAoGCCqGSM49BAMCA0cAMEQCIGrkModOvz6mcUDA
+Zql4YPXU/3ZUbMLw8VuSNHh47lg7AiAPLSKy/v8y8mhebGRCNTYwdkidQCQFrh+2
+BIirBFsT0g==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp/keystore/0d9f72608133ee627b570b6af6877666bc8f365746f9329d6dd8a5f54e53e2ab_sk b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp/keystore/0d9f72608133ee627b570b6af6877666bc8f365746f9329d6dd8a5f54e53e2ab_sk
new file mode 100755
index 0000000000..d9e2dfdfc8
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp/keystore/0d9f72608133ee627b570b6af6877666bc8f365746f9329d6dd8a5f54e53e2ab_sk
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgNYZ86CFF4Iz0K+sE
+HMg3lSS+mo5lRIFFLUOGrfseqhOhRANCAAT/Dd/SwXAdKicm97/WPViD32Bzn1j5
+2k/FslsxorK2Lx1Rfhi3wyxa40LNLjfED7E7KmJZ1w7PzI7+7WWhPTbq
+-----END PRIVATE KEY-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp/signcerts/peer0.org2.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp/signcerts/peer0.org2.example.com-cert.pem
new file mode 100644
index 0000000000..511295cac5
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp/signcerts/peer0.org2.example.com-cert.pem
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICGjCCAcCgAwIBAgIRANDlqX1daKI2aN0Qm7vrfKAwCgYIKoZIzj0EAwIwczEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh
+Lm9yZzIuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIzMzE5
+WjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
+U2FuIEZyYW5jaXNjbzEfMB0GA1UEAxMWcGVlcjAub3JnMi5leGFtcGxlLmNvbTBZ
+MBMGByqGSM49AgEGCCqGSM49AwEHA0IABP8N39LBcB0qJyb3v9Y9WIPfYHOfWPna
+T8WyWzGisrYvHVF+GLfDLFrjQs0uN8QPsTsqYlnXDs/Mjv7tZaE9NuqjTTBLMA4G
+A1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIKfUfvpGproH
+cwyFD+0sE3XfJzYNcif0jNwvgOUFZ4AFMAoGCCqGSM49BAMCA0gAMEUCIQDa1gKe
+PRVRN/i8hUptACw02V7V9Yeo7kKlbQ6vWU5fqAIgXg2xAQ4TjwXOHlKbIyYZ7fox
+cekBJ+E8yAFm8XQrfy0=
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp/tlscacerts/tlsca.org2.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp/tlscacerts/tlsca.org2.example.com-cert.pem
new file mode 100644
index 0000000000..6d01d67c3e
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp/tlscacerts/tlsca.org2.example.com-cert.pem
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICSTCCAfCgAwIBAgIRANX86HJQn/543CANoioLOegwCgYIKoZIzj0EAwIwdjEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
+c2NhLm9yZzIuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIz
+MzE5WjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
+BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEfMB0G
+A1UEAxMWdGxzY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49
+AwEHA0IABBp+58H8VypXHB9Hf/1ExZTmNdcBlTUgAmHH5sb9DizHXwljo6zdyXfZ
+cLvTCpoLybJ/rnp4PKJ7NKUDmrQymLWjXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNV
+HSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIHu4uj/xHTyM
+9ZK9QyYGLnfQasSWPHt65FkoTfvT61qsMAoGCCqGSM49BAMCA0cAMEQCIBJ9N4PD
+mB+2gAPeDWYteAZ5Q2KR/E0zMQ13pDSunHNcAiBwWRzwscXxCPOJp1sjBMVp5Z1a
+nfIdbwvBbsl1XV/j0g==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
new file mode 100644
index 0000000000..6d01d67c3e
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICSTCCAfCgAwIBAgIRANX86HJQn/543CANoioLOegwCgYIKoZIzj0EAwIwdjEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
+c2NhLm9yZzIuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIz
+MzE5WjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
+BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEfMB0G
+A1UEAxMWdGxzY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49
+AwEHA0IABBp+58H8VypXHB9Hf/1ExZTmNdcBlTUgAmHH5sb9DizHXwljo6zdyXfZ
+cLvTCpoLybJ/rnp4PKJ7NKUDmrQymLWjXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNV
+HSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIHu4uj/xHTyM
+9ZK9QyYGLnfQasSWPHt65FkoTfvT61qsMAoGCCqGSM49BAMCA0cAMEQCIBJ9N4PD
+mB+2gAPeDWYteAZ5Q2KR/E0zMQ13pDSunHNcAiBwWRzwscXxCPOJp1sjBMVp5Z1a
+nfIdbwvBbsl1XV/j0g==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/server.crt b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/server.crt
new file mode 100644
index 0000000000..0ab47140a0
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/server.crt
@@ -0,0 +1,16 @@
+-----BEGIN CERTIFICATE-----
+MIICcjCCAhmgAwIBAgIRAKTjFkKbLMrbEP10dpOEqz4wCgYIKoZIzj0EAwIwdjEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
+c2NhLm9yZzIuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIz
+MzE5WjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
+BxMNU2FuIEZyYW5jaXNjbzEfMB0GA1UEAxMWcGVlcjAub3JnMi5leGFtcGxlLmNv
+bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABMDiCfhksPZRhxpGyowvLu8lQjC6
+H4y/SiQuTbhG+ZXK99VRyDDoKzkyzDpUxMco1xvD3gafSDvrXrKlZObN9bOjgaIw
+gZ8wDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcD
+AjAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIHu4uj/xHTyM9ZK9QyYGLnfQasSW
+PHt65FkoTfvT61qsMDMGA1UdEQQsMCqCFnBlZXIwLm9yZzIuZXhhbXBsZS5jb22C
+BXBlZXIwgglsb2NhbGhvc3QwCgYIKoZIzj0EAwIDRwAwRAIgf1MZC8BVgrxO76J+
+aCGntiQsicgU1DPMt5l45jXiEeECIAHHYsIZcV8GW7iyKQevvdXSQ3JC7XgyuPrm
+eDhWmPcO
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/server.key b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/server.key
new file mode 100755
index 0000000000..babe991b50
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/server.key
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgVlcwZfAKBQZ+W/JX
+w64rHF3JiaddhBcUfxk7WuyZxrChRANCAATA4gn4ZLD2UYcaRsqMLy7vJUIwuh+M
+v0okLk24RvmVyvfVUcgw6Cs5Msw6VMTHKNcbw94Gn0g7616ypWTmzfWz
+-----END PRIVATE KEY-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp/admincerts/Admin@org2.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp/admincerts/Admin@org2.example.com-cert.pem
new file mode 100644
index 0000000000..93086ac949
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp/admincerts/Admin@org2.example.com-cert.pem
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICGjCCAcCgAwIBAgIRAIUbkOONvaq2DLJr9qZbDKwwCgYIKoZIzj0EAwIwczEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh
+Lm9yZzIuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIzMzE5
+WjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
+U2FuIEZyYW5jaXNjbzEfMB0GA1UEAwwWQWRtaW5Ab3JnMi5leGFtcGxlLmNvbTBZ
+MBMGByqGSM49AgEGCCqGSM49AwEHA0IABMLKHXm1xN7Tk4YzaWg4GYhLoyNjrjs5
+302o37m12U8LorR7IL5fdFgYILeL4XUPjC/QG4E2o6hPl3uZPUVErbajTTBLMA4G
+A1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIKfUfvpGproH
+cwyFD+0sE3XfJzYNcif0jNwvgOUFZ4AFMAoGCCqGSM49BAMCA0gAMEUCIQDa1k6R
++luypvng6JMSKIyibptkwICToEAZlDqLeD+k1gIgGFXm1+p1QqxViOa+c1dUvjl0
+m1UCqGDwNTHDm5mO+es=
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp/cacerts/ca.org2.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp/cacerts/ca.org2.example.com-cert.pem
new file mode 100644
index 0000000000..a26e1ec29a
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp/cacerts/ca.org2.example.com-cert.pem
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICQzCCAeqgAwIBAgIRAJEAD5YytxsnFjw+liBjOQkwCgYIKoZIzj0EAwIwczEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh
+Lm9yZzIuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIzMzE5
+WjBzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
+U2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEcMBoGA1UE
+AxMTY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA
+BFW1K2mz8XYewIsUh1qHqImFNbpW+ugND8c6QYB89mPOMHhxil9pE1fX0j/18+e4
+uohbFKOP8UTB15c1f/mFSEejXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAG
+BgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIKfUfvpGproHcwyFD+0s
+E3XfJzYNcif0jNwvgOUFZ4AFMAoGCCqGSM49BAMCA0cAMEQCIGrkModOvz6mcUDA
+Zql4YPXU/3ZUbMLw8VuSNHh47lg7AiAPLSKy/v8y8mhebGRCNTYwdkidQCQFrh+2
+BIirBFsT0g==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp/keystore/27ccb54a06020260c66c65bec91f91e1c9043e3076d3d6128692e7271c4c7a2c_sk b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp/keystore/27ccb54a06020260c66c65bec91f91e1c9043e3076d3d6128692e7271c4c7a2c_sk
new file mode 100755
index 0000000000..fdd7fa73d1
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp/keystore/27ccb54a06020260c66c65bec91f91e1c9043e3076d3d6128692e7271c4c7a2c_sk
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgtRT9fcsCMexhHlCO
+dfzBqkDIfC88UFE51dYxRHDSrMShRANCAAS4r7MB6WDw96YKpJIzOvqhXs1dQ3XQ
+5QMMX4aOwVLT1vZHOkPghRr2wMhJeQs1vVY+5RcnOWy6OyB/oYCCIPka
+-----END PRIVATE KEY-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp/signcerts/peer1.org2.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp/signcerts/peer1.org2.example.com-cert.pem
new file mode 100644
index 0000000000..19868dd50c
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp/signcerts/peer1.org2.example.com-cert.pem
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICGTCCAb+gAwIBAgIQKeRyEPaHSUPvshfEtmg9tzAKBggqhkjOPQQDAjBzMQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu
+b3JnMi5leGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMzMTla
+MFsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
+YW4gRnJhbmNpc2NvMR8wHQYDVQQDExZwZWVyMS5vcmcyLmV4YW1wbGUuY29tMFkw
+EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuK+zAelg8PemCqSSMzr6oV7NXUN10OUD
+DF+GjsFS09b2RzpD4IUa9sDISXkLNb1WPuUXJzlsujsgf6GAgiD5GqNNMEswDgYD
+VR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAgp9R++kamugdz
+DIUP7SwTdd8nNg1yJ/SM3C+A5QVngAUwCgYIKoZIzj0EAwIDSAAwRQIhAMIQLWEv
+wpaNibkXEGJlT0IzSIBsCjMJD7VaqZLKm5h9AiAlYmNBB8siyLLxFawvEB/4F26x
+e1jgyza7Yg+ardDzlw==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp/tlscacerts/tlsca.org2.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp/tlscacerts/tlsca.org2.example.com-cert.pem
new file mode 100644
index 0000000000..6d01d67c3e
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp/tlscacerts/tlsca.org2.example.com-cert.pem
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICSTCCAfCgAwIBAgIRANX86HJQn/543CANoioLOegwCgYIKoZIzj0EAwIwdjEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
+c2NhLm9yZzIuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIz
+MzE5WjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
+BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEfMB0G
+A1UEAxMWdGxzY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49
+AwEHA0IABBp+58H8VypXHB9Hf/1ExZTmNdcBlTUgAmHH5sb9DizHXwljo6zdyXfZ
+cLvTCpoLybJ/rnp4PKJ7NKUDmrQymLWjXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNV
+HSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIHu4uj/xHTyM
+9ZK9QyYGLnfQasSWPHt65FkoTfvT61qsMAoGCCqGSM49BAMCA0cAMEQCIBJ9N4PD
+mB+2gAPeDWYteAZ5Q2KR/E0zMQ13pDSunHNcAiBwWRzwscXxCPOJp1sjBMVp5Z1a
+nfIdbwvBbsl1XV/j0g==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/ca.crt b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/ca.crt
new file mode 100644
index 0000000000..6d01d67c3e
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/ca.crt
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICSTCCAfCgAwIBAgIRANX86HJQn/543CANoioLOegwCgYIKoZIzj0EAwIwdjEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
+c2NhLm9yZzIuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIz
+MzE5WjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
+BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEfMB0G
+A1UEAxMWdGxzY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49
+AwEHA0IABBp+58H8VypXHB9Hf/1ExZTmNdcBlTUgAmHH5sb9DizHXwljo6zdyXfZ
+cLvTCpoLybJ/rnp4PKJ7NKUDmrQymLWjXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNV
+HSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIHu4uj/xHTyM
+9ZK9QyYGLnfQasSWPHt65FkoTfvT61qsMAoGCCqGSM49BAMCA0cAMEQCIBJ9N4PD
+mB+2gAPeDWYteAZ5Q2KR/E0zMQ13pDSunHNcAiBwWRzwscXxCPOJp1sjBMVp5Z1a
+nfIdbwvBbsl1XV/j0g==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/server.crt b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/server.crt
new file mode 100644
index 0000000000..f75611a09b
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/server.crt
@@ -0,0 +1,16 @@
+-----BEGIN CERTIFICATE-----
+MIICcjCCAhigAwIBAgIQEV3hkn7yJpdb29dDQvTKWDAKBggqhkjOPQQDAjB2MQsw
+CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy
+YW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz
+Y2Eub3JnMi5leGFtcGxlLmNvbTAeFw0xNzA2MjMxMjMzMTlaFw0yNzA2MjExMjMz
+MTlaMFsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
+Ew1TYW4gRnJhbmNpc2NvMR8wHQYDVQQDExZwZWVyMS5vcmcyLmV4YW1wbGUuY29t
+MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEpXRG2CwqI+F0UoMSImo3In9R7lze
+S+DuL1pLOjF5s05kVAcH604/9FRI61ujvWp4mYXornB+R1pcQwtolYNzPKOBojCB
+nzAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC
+MAwGA1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAge7i6P/EdPIz1kr1DJgYud9BqxJY8
+e3rkWShN+9PrWqwwMwYDVR0RBCwwKoIWcGVlcjEub3JnMi5leGFtcGxlLmNvbYIF
+cGVlcjGCCWxvY2FsaG9zdDAKBggqhkjOPQQDAgNIADBFAiEAmzFD5Dd4yR5lKy44
+Jdz4hy5AtRLQAmhlmLhli46z0r8CIDXFZJ7EwiD3F/jBT6906IFizjr9CD/DtOC9
+bxT5JhIN
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/server.key b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/server.key
new file mode 100755
index 0000000000..8901783971
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/server.key
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgxFdgRfevcXrABROv
+sV6HvrpoN5PHW6qXIFj71CAwtzyhRANCAASldEbYLCoj4XRSgxIiajcif1HuXN5L
+4O4vWks6MXmzTmRUBwfrTj/0VEjrW6O9aniZheiucH5HWlxDC2iVg3M8
+-----END PRIVATE KEY-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/tlsca/7bb8ba3ff11d3c8cf592bd4326062e77d06ac4963c7b7ae459284dfbd3eb5aac_sk b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/tlsca/7bb8ba3ff11d3c8cf592bd4326062e77d06ac4963c7b7ae459284dfbd3eb5aac_sk
new file mode 100755
index 0000000000..e4f49a0d98
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/tlsca/7bb8ba3ff11d3c8cf592bd4326062e77d06ac4963c7b7ae459284dfbd3eb5aac_sk
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgXu7VBLhnEUi4mu4d
+tU1nT4lcMR9aoG29s5hLPmIKH/mhRANCAAQafufB/FcqVxwfR3/9RMWU5jXXAZU1
+IAJhx+bG/Q4sx18JY6Os3cl32XC70wqaC8myf656eDyiezSlA5q0Mpi1
+-----END PRIVATE KEY-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/tlsca/tlsca.org2.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/tlsca/tlsca.org2.example.com-cert.pem
new file mode 100644
index 0000000000..6d01d67c3e
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/tlsca/tlsca.org2.example.com-cert.pem
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICSTCCAfCgAwIBAgIRANX86HJQn/543CANoioLOegwCgYIKoZIzj0EAwIwdjEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
+c2NhLm9yZzIuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIz
+MzE5WjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
+BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEfMB0G
+A1UEAxMWdGxzY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49
+AwEHA0IABBp+58H8VypXHB9Hf/1ExZTmNdcBlTUgAmHH5sb9DizHXwljo6zdyXfZ
+cLvTCpoLybJ/rnp4PKJ7NKUDmrQymLWjXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNV
+HSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIHu4uj/xHTyM
+9ZK9QyYGLnfQasSWPHt65FkoTfvT61qsMAoGCCqGSM49BAMCA0cAMEQCIBJ9N4PD
+mB+2gAPeDWYteAZ5Q2KR/E0zMQ13pDSunHNcAiBwWRzwscXxCPOJp1sjBMVp5Z1a
+nfIdbwvBbsl1XV/j0g==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/admincerts/Admin@org2.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/admincerts/Admin@org2.example.com-cert.pem
new file mode 100644
index 0000000000..93086ac949
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/admincerts/Admin@org2.example.com-cert.pem
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICGjCCAcCgAwIBAgIRAIUbkOONvaq2DLJr9qZbDKwwCgYIKoZIzj0EAwIwczEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh
+Lm9yZzIuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIzMzE5
+WjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
+U2FuIEZyYW5jaXNjbzEfMB0GA1UEAwwWQWRtaW5Ab3JnMi5leGFtcGxlLmNvbTBZ
+MBMGByqGSM49AgEGCCqGSM49AwEHA0IABMLKHXm1xN7Tk4YzaWg4GYhLoyNjrjs5
+302o37m12U8LorR7IL5fdFgYILeL4XUPjC/QG4E2o6hPl3uZPUVErbajTTBLMA4G
+A1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIKfUfvpGproH
+cwyFD+0sE3XfJzYNcif0jNwvgOUFZ4AFMAoGCCqGSM49BAMCA0gAMEUCIQDa1k6R
++luypvng6JMSKIyibptkwICToEAZlDqLeD+k1gIgGFXm1+p1QqxViOa+c1dUvjl0
+m1UCqGDwNTHDm5mO+es=
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/cacerts/ca.org2.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/cacerts/ca.org2.example.com-cert.pem
new file mode 100644
index 0000000000..a26e1ec29a
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/cacerts/ca.org2.example.com-cert.pem
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICQzCCAeqgAwIBAgIRAJEAD5YytxsnFjw+liBjOQkwCgYIKoZIzj0EAwIwczEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh
+Lm9yZzIuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIzMzE5
+WjBzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
+U2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEcMBoGA1UE
+AxMTY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA
+BFW1K2mz8XYewIsUh1qHqImFNbpW+ugND8c6QYB89mPOMHhxil9pE1fX0j/18+e4
+uohbFKOP8UTB15c1f/mFSEejXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAG
+BgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIKfUfvpGproHcwyFD+0s
+E3XfJzYNcif0jNwvgOUFZ4AFMAoGCCqGSM49BAMCA0cAMEQCIGrkModOvz6mcUDA
+Zql4YPXU/3ZUbMLw8VuSNHh47lg7AiAPLSKy/v8y8mhebGRCNTYwdkidQCQFrh+2
+BIirBFsT0g==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/keystore/1995b11d6573ed3be52fcd7a5fa477bc0f183e1f5f398c8281d0ce7c2c75a076_sk b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/keystore/1995b11d6573ed3be52fcd7a5fa477bc0f183e1f5f398c8281d0ce7c2c75a076_sk
new file mode 100755
index 0000000000..09b1c6a7e3
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/keystore/1995b11d6573ed3be52fcd7a5fa477bc0f183e1f5f398c8281d0ce7c2c75a076_sk
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgHa4xvmGVQJV5wrMj
+KttcA0hh/Yz0dezmXlRLjNk9HyahRANCAATCyh15tcTe05OGM2loOBmIS6MjY647
+Od9NqN+5tdlPC6K0eyC+X3RYGCC3i+F1D4wv0BuBNqOoT5d7mT1FRK22
+-----END PRIVATE KEY-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/signcerts/Admin@org2.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/signcerts/Admin@org2.example.com-cert.pem
new file mode 100644
index 0000000000..93086ac949
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/signcerts/Admin@org2.example.com-cert.pem
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICGjCCAcCgAwIBAgIRAIUbkOONvaq2DLJr9qZbDKwwCgYIKoZIzj0EAwIwczEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh
+Lm9yZzIuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIzMzE5
+WjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
+U2FuIEZyYW5jaXNjbzEfMB0GA1UEAwwWQWRtaW5Ab3JnMi5leGFtcGxlLmNvbTBZ
+MBMGByqGSM49AgEGCCqGSM49AwEHA0IABMLKHXm1xN7Tk4YzaWg4GYhLoyNjrjs5
+302o37m12U8LorR7IL5fdFgYILeL4XUPjC/QG4E2o6hPl3uZPUVErbajTTBLMA4G
+A1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIKfUfvpGproH
+cwyFD+0sE3XfJzYNcif0jNwvgOUFZ4AFMAoGCCqGSM49BAMCA0gAMEUCIQDa1k6R
++luypvng6JMSKIyibptkwICToEAZlDqLeD+k1gIgGFXm1+p1QqxViOa+c1dUvjl0
+m1UCqGDwNTHDm5mO+es=
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/tlscacerts/tlsca.org2.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/tlscacerts/tlsca.org2.example.com-cert.pem
new file mode 100644
index 0000000000..6d01d67c3e
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/tlscacerts/tlsca.org2.example.com-cert.pem
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICSTCCAfCgAwIBAgIRANX86HJQn/543CANoioLOegwCgYIKoZIzj0EAwIwdjEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
+c2NhLm9yZzIuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIz
+MzE5WjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
+BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEfMB0G
+A1UEAxMWdGxzY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49
+AwEHA0IABBp+58H8VypXHB9Hf/1ExZTmNdcBlTUgAmHH5sb9DizHXwljo6zdyXfZ
+cLvTCpoLybJ/rnp4PKJ7NKUDmrQymLWjXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNV
+HSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIHu4uj/xHTyM
+9ZK9QyYGLnfQasSWPHt65FkoTfvT61qsMAoGCCqGSM49BAMCA0cAMEQCIBJ9N4PD
+mB+2gAPeDWYteAZ5Q2KR/E0zMQ13pDSunHNcAiBwWRzwscXxCPOJp1sjBMVp5Z1a
+nfIdbwvBbsl1XV/j0g==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/tls/ca.crt b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/tls/ca.crt
new file mode 100644
index 0000000000..6d01d67c3e
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/tls/ca.crt
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICSTCCAfCgAwIBAgIRANX86HJQn/543CANoioLOegwCgYIKoZIzj0EAwIwdjEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
+c2NhLm9yZzIuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIz
+MzE5WjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
+BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEfMB0G
+A1UEAxMWdGxzY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49
+AwEHA0IABBp+58H8VypXHB9Hf/1ExZTmNdcBlTUgAmHH5sb9DizHXwljo6zdyXfZ
+cLvTCpoLybJ/rnp4PKJ7NKUDmrQymLWjXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNV
+HSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIHu4uj/xHTyM
+9ZK9QyYGLnfQasSWPHt65FkoTfvT61qsMAoGCCqGSM49BAMCA0cAMEQCIBJ9N4PD
+mB+2gAPeDWYteAZ5Q2KR/E0zMQ13pDSunHNcAiBwWRzwscXxCPOJp1sjBMVp5Z1a
+nfIdbwvBbsl1XV/j0g==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/tls/server.crt b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/tls/server.crt
new file mode 100644
index 0000000000..bc9e1ed06f
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/tls/server.crt
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICPDCCAeKgAwIBAgIRAJyMPO3I72b3mbPNKpVYYLMwCgYIKoZIzj0EAwIwdjEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
+c2NhLm9yZzIuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIz
+MzE5WjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
+BxMNU2FuIEZyYW5jaXNjbzEfMB0GA1UEAwwWQWRtaW5Ab3JnMi5leGFtcGxlLmNv
+bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABMFNcSoYN82cQnSGoxBiWhzlYi9N
+nVbrfOCNdsxMOjhYIfvptjVgBhc87ZqUsQp4sSYVHV1qxAJ7PD50CJRC+4SjbDBq
+MA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw
+DAYDVR0TAQH/BAIwADArBgNVHSMEJDAigCB7uLo/8R08jPWSvUMmBi530GrEljx7
+euRZKE370+tarDAKBggqhkjOPQQDAgNIADBFAiEAkPjfzaF3Dxz5n39QChNSfWwC
+lpxiBCgw8DMP2D91UFICIC640slBiPu2zx3U7izA6Zu00IIaEt8xGtt4pbhwwqWj
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/tls/server.key b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/tls/server.key
new file mode 100755
index 0000000000..1b542d8a87
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/tls/server.key
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgOa1azVZZkkb3rRW1
+y3z1TCvqOzftqGI3eELPG2TWK6WhRANCAATBTXEqGDfNnEJ0hqMQYloc5WIvTZ1W
+63zgjXbMTDo4WCH76bY1YAYXPO2alLEKeLEmFR1dasQCezw+dAiUQvuE
+-----END PRIVATE KEY-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/User1@org2.example.com/msp/admincerts/User1@org2.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/User1@org2.example.com/msp/admincerts/User1@org2.example.com-cert.pem
new file mode 100644
index 0000000000..008d255575
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/User1@org2.example.com/msp/admincerts/User1@org2.example.com-cert.pem
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICGjCCAcCgAwIBAgIRAIPRwJHVLhHK47XK0BbFZJswCgYIKoZIzj0EAwIwczEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh
+Lm9yZzIuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIzMzE5
+WjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
+U2FuIEZyYW5jaXNjbzEfMB0GA1UEAwwWVXNlcjFAb3JnMi5leGFtcGxlLmNvbTBZ
+MBMGByqGSM49AgEGCCqGSM49AwEHA0IABBd9SsEiFH1/JIb3qMEPLR2dygokFVKW
+eINcB0Ni4TBRkfIWWUJeCANTUY11Pm/+5gs+fBTqBz8M2UzpJDVX7+2jTTBLMA4G
+A1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIKfUfvpGproH
+cwyFD+0sE3XfJzYNcif0jNwvgOUFZ4AFMAoGCCqGSM49BAMCA0gAMEUCIQC8NIMw
+e4ym/QRwCJb5umbONNLSVQuEpnPsJrM/ssBPvgIgQpe2oYa3yO3USro9nBHjpM3L
+KsFQrpVnF8O6hoHOYZQ=
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/User1@org2.example.com/msp/cacerts/ca.org2.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/User1@org2.example.com/msp/cacerts/ca.org2.example.com-cert.pem
new file mode 100644
index 0000000000..a26e1ec29a
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/User1@org2.example.com/msp/cacerts/ca.org2.example.com-cert.pem
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICQzCCAeqgAwIBAgIRAJEAD5YytxsnFjw+liBjOQkwCgYIKoZIzj0EAwIwczEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh
+Lm9yZzIuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIzMzE5
+WjBzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
+U2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEcMBoGA1UE
+AxMTY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA
+BFW1K2mz8XYewIsUh1qHqImFNbpW+ugND8c6QYB89mPOMHhxil9pE1fX0j/18+e4
+uohbFKOP8UTB15c1f/mFSEejXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAG
+BgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIKfUfvpGproHcwyFD+0s
+E3XfJzYNcif0jNwvgOUFZ4AFMAoGCCqGSM49BAMCA0cAMEQCIGrkModOvz6mcUDA
+Zql4YPXU/3ZUbMLw8VuSNHh47lg7AiAPLSKy/v8y8mhebGRCNTYwdkidQCQFrh+2
+BIirBFsT0g==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/User1@org2.example.com/msp/keystore/585175c83bac91fc0c1ce8f9d0ff9aefa47c565678f100ca8673db249ee785ac_sk b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/User1@org2.example.com/msp/keystore/585175c83bac91fc0c1ce8f9d0ff9aefa47c565678f100ca8673db249ee785ac_sk
new file mode 100755
index 0000000000..d1ac0c7a49
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/User1@org2.example.com/msp/keystore/585175c83bac91fc0c1ce8f9d0ff9aefa47c565678f100ca8673db249ee785ac_sk
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgmHG6n4ZvwUeV4jCp
+kvAmGSQKZ+vOYsyzRZgYwORO+vChRANCAAQXfUrBIhR9fySG96jBDy0dncoKJBVS
+lniDXAdDYuEwUZHyFllCXggDU1GNdT5v/uYLPnwU6gc/DNlM6SQ1V+/t
+-----END PRIVATE KEY-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/User1@org2.example.com/msp/signcerts/User1@org2.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/User1@org2.example.com/msp/signcerts/User1@org2.example.com-cert.pem
new file mode 100644
index 0000000000..008d255575
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/User1@org2.example.com/msp/signcerts/User1@org2.example.com-cert.pem
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICGjCCAcCgAwIBAgIRAIPRwJHVLhHK47XK0BbFZJswCgYIKoZIzj0EAwIwczEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh
+Lm9yZzIuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIzMzE5
+WjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
+U2FuIEZyYW5jaXNjbzEfMB0GA1UEAwwWVXNlcjFAb3JnMi5leGFtcGxlLmNvbTBZ
+MBMGByqGSM49AgEGCCqGSM49AwEHA0IABBd9SsEiFH1/JIb3qMEPLR2dygokFVKW
+eINcB0Ni4TBRkfIWWUJeCANTUY11Pm/+5gs+fBTqBz8M2UzpJDVX7+2jTTBLMA4G
+A1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIKfUfvpGproH
+cwyFD+0sE3XfJzYNcif0jNwvgOUFZ4AFMAoGCCqGSM49BAMCA0gAMEUCIQC8NIMw
+e4ym/QRwCJb5umbONNLSVQuEpnPsJrM/ssBPvgIgQpe2oYa3yO3USro9nBHjpM3L
+KsFQrpVnF8O6hoHOYZQ=
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/User1@org2.example.com/msp/tlscacerts/tlsca.org2.example.com-cert.pem b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/User1@org2.example.com/msp/tlscacerts/tlsca.org2.example.com-cert.pem
new file mode 100644
index 0000000000..6d01d67c3e
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/User1@org2.example.com/msp/tlscacerts/tlsca.org2.example.com-cert.pem
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICSTCCAfCgAwIBAgIRANX86HJQn/543CANoioLOegwCgYIKoZIzj0EAwIwdjEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
+c2NhLm9yZzIuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIz
+MzE5WjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
+BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEfMB0G
+A1UEAxMWdGxzY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49
+AwEHA0IABBp+58H8VypXHB9Hf/1ExZTmNdcBlTUgAmHH5sb9DizHXwljo6zdyXfZ
+cLvTCpoLybJ/rnp4PKJ7NKUDmrQymLWjXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNV
+HSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIHu4uj/xHTyM
+9ZK9QyYGLnfQasSWPHt65FkoTfvT61qsMAoGCCqGSM49BAMCA0cAMEQCIBJ9N4PD
+mB+2gAPeDWYteAZ5Q2KR/E0zMQ13pDSunHNcAiBwWRzwscXxCPOJp1sjBMVp5Z1a
+nfIdbwvBbsl1XV/j0g==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/User1@org2.example.com/tls/ca.crt b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/User1@org2.example.com/tls/ca.crt
new file mode 100644
index 0000000000..6d01d67c3e
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/User1@org2.example.com/tls/ca.crt
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICSTCCAfCgAwIBAgIRANX86HJQn/543CANoioLOegwCgYIKoZIzj0EAwIwdjEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
+c2NhLm9yZzIuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIz
+MzE5WjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
+BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEfMB0G
+A1UEAxMWdGxzY2Eub3JnMi5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49
+AwEHA0IABBp+58H8VypXHB9Hf/1ExZTmNdcBlTUgAmHH5sb9DizHXwljo6zdyXfZ
+cLvTCpoLybJ/rnp4PKJ7NKUDmrQymLWjXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNV
+HSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIHu4uj/xHTyM
+9ZK9QyYGLnfQasSWPHt65FkoTfvT61qsMAoGCCqGSM49BAMCA0cAMEQCIBJ9N4PD
+mB+2gAPeDWYteAZ5Q2KR/E0zMQ13pDSunHNcAiBwWRzwscXxCPOJp1sjBMVp5Z1a
+nfIdbwvBbsl1XV/j0g==
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/User1@org2.example.com/tls/server.crt b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/User1@org2.example.com/tls/server.crt
new file mode 100644
index 0000000000..b81ee15ca7
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/User1@org2.example.com/tls/server.crt
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICOzCCAeKgAwIBAgIRAPD3UPMtRDq5GhVZUuS25LUwCgYIKoZIzj0EAwIwdjEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
+cmFuY2lzY28xGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs
+c2NhLm9yZzIuZXhhbXBsZS5jb20wHhcNMTcwNjIzMTIzMzE5WhcNMjcwNjIxMTIz
+MzE5WjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
+BxMNU2FuIEZyYW5jaXNjbzEfMB0GA1UEAwwWVXNlcjFAb3JnMi5leGFtcGxlLmNv
+bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABLM/EP7l2gwX4RGxW9gX78CTINQ6
+3RRcU01F91HSpT3l+e1H0HACgJWTGkf5ZnwCnUcdZ/z2YD15zfVFHF2fvwejbDBq
+MA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw
+DAYDVR0TAQH/BAIwADArBgNVHSMEJDAigCB7uLo/8R08jPWSvUMmBi530GrEljx7
+euRZKE370+tarDAKBggqhkjOPQQDAgNHADBEAiBo0H6ZNg1XJladWoGNnFsdRm3I
+u4dLlJBwe9gTrscPAAIgXfsHfA8qVvyK2Pnlca2cwUHvRrJ4cAvaYrWNTMG1t7Q=
+-----END CERTIFICATE-----
diff --git a/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/User1@org2.example.com/tls/server.key b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/User1@org2.example.com/tls/server.key
new file mode 100755
index 0000000000..505f5b3336
--- /dev/null
+++ b/balance-transfer/artifacts/channel/crypto-config/peerOrganizations/org2.example.com/users/User1@org2.example.com/tls/server.key
@@ -0,0 +1,5 @@
+-----BEGIN PRIVATE KEY-----
+MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgftZDPdCM6QMMv8ZO
+eXbUFGQqnFhEUAiChttdWcSp6QOhRANCAASzPxD+5doMF+ERsVvYF+/AkyDUOt0U
+XFNNRfdR0qU95fntR9BwAoCVkxpH+WZ8Ap1HHWf89mA9ec31RRxdn78H
+-----END PRIVATE KEY-----
diff --git a/balance-transfer/artifacts/channel/cryptogen.yaml b/balance-transfer/artifacts/channel/cryptogen.yaml
new file mode 100644
index 0000000000..be2a9f8604
--- /dev/null
+++ b/balance-transfer/artifacts/channel/cryptogen.yaml
@@ -0,0 +1,113 @@
+#
+# Copyright IBM Corp. All Rights Reserved.
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+# ---------------------------------------------------------------------------
+# "OrdererOrgs" - Definition of organizations managing orderer nodes
+# ---------------------------------------------------------------------------
+OrdererOrgs:
+ # ---------------------------------------------------------------------------
+ # Orderer
+ # ---------------------------------------------------------------------------
+ - Name: Orderer
+ Domain: example.com
+
+ # ---------------------------------------------------------------------------
+ # "Specs" - See PeerOrgs below for complete description
+ # ---------------------------------------------------------------------------
+ Specs:
+ - Hostname: orderer
+
+# ---------------------------------------------------------------------------
+# "PeerOrgs" - Definition of organizations managing peer nodes
+# ---------------------------------------------------------------------------
+PeerOrgs:
+ # ---------------------------------------------------------------------------
+ # Org1
+ # ---------------------------------------------------------------------------
+ - Name: Org1
+ Domain: org1.example.com
+
+ # ---------------------------------------------------------------------------
+ # "CA"
+ # ---------------------------------------------------------------------------
+ # Uncomment this section to enable the explicit definition of the CA for this
+ # organization. This entry is a Spec. See "Specs" section below for details.
+ # ---------------------------------------------------------------------------
+ CA:
+ Hostname: ca # implicitly ca.org1.example.com
+
+ # ---------------------------------------------------------------------------
+ # "Specs"
+ # ---------------------------------------------------------------------------
+ # Uncomment this section to enable the explicit definition of hosts in your
+ # configuration. Most users will want to use Template, below
+ #
+ # Specs is an array of Spec entries. Each Spec entry consists of two fields:
+ # - Hostname: (Required) The desired hostname, sans the domain.
+ # - CommonName: (Optional) Specifies the template or explicit override for
+ # the CN. By default, this is the template:
+ #
+ # "{{.Hostname}}.{{.Domain}}"
+ #
+ # which obtains its values from the Spec.Hostname and
+ # Org.Domain, respectively.
+ # - SANS: (Optional) Specifies one or more Subject Alternative Names
+ # the be set in the resulting x509. Accepts template
+ # variables {{.Hostname}}, {{.Domain}}, {{.CommonName}}
+ # NOTE: Two implicit entries are created for you:
+ # - {{ .CommonName }}
+ # - {{ .Hostname }}
+ # ---------------------------------------------------------------------------
+ # Specs:
+ # - Hostname: foo # implicitly "foo.org1.example.com"
+ # CommonName: foo27.org5.example.com # overrides Hostname-based FQDN set above
+ # SANS:
+ # - "bar.{{.Domain}}"
+ # - "altfoo.{{.Domain}}"
+ # - "{{.Hostname}}.org6.net"
+ # - Hostname: bar
+ # - Hostname: baz
+
+ # ---------------------------------------------------------------------------
+ # "Template"
+ # ---------------------------------------------------------------------------
+ # Allows for the definition of 1 or more hosts that are created sequentially
+ # from a template. By default, this looks like "peer%d" from 0 to Count-1.
+ # You may override the number of nodes (Count), the starting index (Start)
+ # or the template used to construct the name (Hostname).
+ #
+ # Note: Template and Specs are not mutually exclusive. You may define both
+ # sections and the aggregate nodes will be created for you. Take care with
+ # name collisions
+ # ---------------------------------------------------------------------------
+ Template:
+ Count: 2
+ # Start: 5
+ # Hostname: {{.Prefix}}{{.Index}} # default
+ SANS:
+ - "localhost"
+
+ # ---------------------------------------------------------------------------
+ # "Users"
+ # ---------------------------------------------------------------------------
+ # Count: The number of user accounts _in addition_ to Admin
+ # ---------------------------------------------------------------------------
+ Users:
+ Count: 1
+
+ # ---------------------------------------------------------------------------
+ # Org2: See "Org1" for full specification
+ # ---------------------------------------------------------------------------
+ - Name: Org2
+ Domain: org2.example.com
+ CA:
+ Hostname: ca # implicitly ca.org1.example.com
+
+ Template:
+ Count: 2
+ SANS:
+ - "localhost"
+ Users:
+ Count: 1
diff --git a/balance-transfer/artifacts/channel/genesis.block b/balance-transfer/artifacts/channel/genesis.block
new file mode 100644
index 0000000000..c818a28b82
Binary files /dev/null and b/balance-transfer/artifacts/channel/genesis.block differ
diff --git a/balance-transfer/artifacts/channel/mychannel.tx b/balance-transfer/artifacts/channel/mychannel.tx
new file mode 100644
index 0000000000..5c45e1fe63
Binary files /dev/null and b/balance-transfer/artifacts/channel/mychannel.tx differ
diff --git a/balance-transfer/artifacts/docker-compose.yaml b/balance-transfer/artifacts/docker-compose.yaml
new file mode 100644
index 0000000000..aead5bb657
--- /dev/null
+++ b/balance-transfer/artifacts/docker-compose.yaml
@@ -0,0 +1,132 @@
+#
+# Copyright IBM Corp. All Rights Reserved.
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+version: '2'
+
+services:
+
+ ca.org1.example.com:
+ image: hyperledger/fabric-ca:x86_64-1.0.0-rc1
+ environment:
+ - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
+ - FABRIC_CA_SERVER_CA_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem
+ - FABRIC_CA_SERVER_CA_KEYFILE=/etc/hyperledger/fabric-ca-server-config/0e729224e8b3f31784c8a93c5b8ef6f4c1c91d9e6e577c45c33163609fe40011_sk
+ - FABRIC_CA_SERVER_TLS_ENABLED=true
+ - FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem
+ - FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/0e729224e8b3f31784c8a93c5b8ef6f4c1c91d9e6e577c45c33163609fe40011_sk
+ ports:
+ - "7054:7054"
+ command: sh -c 'fabric-ca-server start -b admin:adminpw -d'
+ volumes:
+ - ./channel/crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
+ container_name: ca_peerOrg1
+
+ ca.org2.example.com:
+ image: hyperledger/fabric-ca:x86_64-1.0.0-rc1
+ environment:
+ - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
+ - FABRIC_CA_SERVER_CA_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org2.example.com-cert.pem
+ - FABRIC_CA_SERVER_CA_KEYFILE=/etc/hyperledger/fabric-ca-server-config/a7d47efa46a6ba07730c850fed2c1375df27360d7227f48cdc2f80e505678005_sk
+ - FABRIC_CA_SERVER_TLS_ENABLED=true
+ - FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org2.example.com-cert.pem
+ - FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/a7d47efa46a6ba07730c850fed2c1375df27360d7227f48cdc2f80e505678005_sk
+ ports:
+ - "8054:7054"
+ command: sh -c 'fabric-ca-server start -b admin:adminpw -d'
+ volumes:
+ - ./channel/crypto-config/peerOrganizations/org2.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
+ container_name: ca_peerOrg2
+
+ orderer.example.com:
+ container_name: orderer.example.com
+ image: hyperledger/fabric-orderer:x86_64-1.0.0-rc1
+ environment:
+ - ORDERER_GENERAL_LOGLEVEL=debug
+ - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
+ - ORDERER_GENERAL_GENESISMETHOD=file
+ - ORDERER_GENERAL_GENESISFILE=/etc/hyperledger/configtx/genesis.block
+ - ORDERER_GENERAL_LOCALMSPID=OrdererMSP
+ - ORDERER_GENERAL_LOCALMSPDIR=/etc/hyperledger/crypto/orderer/msp
+ - ORDERER_GENERAL_TLS_ENABLED=true
+ - ORDERER_GENERAL_TLS_PRIVATEKEY=/etc/hyperledger/crypto/orderer/tls/server.key
+ - ORDERER_GENERAL_TLS_CERTIFICATE=/etc/hyperledger/crypto/orderer/tls/server.crt
+ - ORDERER_GENERAL_TLS_ROOTCAS=[/etc/hyperledger/crypto/orderer/tls/ca.crt, /etc/hyperledger/crypto/peerOrg1/tls/ca.crt, /etc/hyperledger/crypto/peerOrg2/tls/ca.crt]
+ working_dir: /opt/gopath/src/github.com/hyperledger/fabric/orderers
+ command: orderer
+ ports:
+ - 7050:7050
+ volumes:
+ - ./channel:/etc/hyperledger/configtx
+ - ./channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/:/etc/hyperledger/crypto/orderer
+ - ./channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/:/etc/hyperledger/crypto/peerOrg1
+ - ./channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/:/etc/hyperledger/crypto/peerOrg2
+
+ peer0.org1.example.com:
+ container_name: peer0.org1.example.com
+ extends:
+ file: base.yaml
+ service: peer-base
+ environment:
+ - CORE_PEER_ID=peer0.org1.example.com
+ - CORE_PEER_LOCALMSPID=Org1MSP
+ - CORE_PEER_ADDRESS=peer0.org1.example.com:7051
+ ports:
+ - 7051:7051
+ - 7053:7053
+ volumes:
+ - ./channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/:/etc/hyperledger/crypto/peer
+ depends_on:
+ - orderer.example.com
+
+ peer1.org1.example.com:
+ container_name: peer1.org1.example.com
+ extends:
+ file: base.yaml
+ service: peer-base
+ environment:
+ - CORE_PEER_ID=peer1.org1.example.com
+ - CORE_PEER_LOCALMSPID=Org1MSP
+ - CORE_PEER_ADDRESS=peer1.org1.example.com:7051
+ ports:
+ - 7056:7051
+ - 7058:7053
+ volumes:
+ - ./channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/:/etc/hyperledger/crypto/peer
+ depends_on:
+ - orderer.example.com
+
+ peer0.org2.example.com:
+ container_name: peer0.org2.example.com
+ extends:
+ file: base.yaml
+ service: peer-base
+ environment:
+ - CORE_PEER_ID=peer0.org2.example.com
+ - CORE_PEER_LOCALMSPID=Org2MSP
+ - CORE_PEER_ADDRESS=peer0.org2.example.com:7051
+ ports:
+ - 8051:7051
+ - 8053:7053
+ volumes:
+ - ./channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/:/etc/hyperledger/crypto/peer
+ depends_on:
+ - orderer.example.com
+
+ peer1.org2.example.com:
+ container_name: peer1.org2.example.com
+ extends:
+ file: base.yaml
+ service: peer-base
+ environment:
+ - CORE_PEER_ID=peer1.org2.example.com
+ - CORE_PEER_LOCALMSPID=Org2MSP
+ - CORE_PEER_ADDRESS=peer1.org2.example.com:7051
+ ports:
+ - 8056:7051
+ - 8058:7053
+ volumes:
+ - ./channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/:/etc/hyperledger/crypto/peer
+ depends_on:
+ - orderer.example.com
diff --git a/balance-transfer/artifacts/src/github.com/example_cc/example_cc.go b/balance-transfer/artifacts/src/github.com/example_cc/example_cc.go
new file mode 100644
index 0000000000..06fd76b965
--- /dev/null
+++ b/balance-transfer/artifacts/src/github.com/example_cc/example_cc.go
@@ -0,0 +1,203 @@
+/*
+Copyright IBM Corp. 2016 All Rights Reserved.
+
+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
+
+ http://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.
+*/
+
+package main
+
+
+import (
+ "fmt"
+ "strconv"
+
+ "github.com/hyperledger/fabric/core/chaincode/shim"
+ pb "github.com/hyperledger/fabric/protos/peer"
+)
+
+var logger = shim.NewLogger("example_cc0")
+
+// SimpleChaincode example simple Chaincode implementation
+type SimpleChaincode struct {
+}
+
+func (t *SimpleChaincode) Init(stub shim.ChaincodeStubInterface) pb.Response {
+ logger.Info("########### example_cc0 Init ###########")
+
+ _, args := stub.GetFunctionAndParameters()
+ var A, B string // Entities
+ var Aval, Bval int // Asset holdings
+ var err error
+
+ // Initialize the chaincode
+ A = args[0]
+ Aval, err = strconv.Atoi(args[1])
+ if err != nil {
+ return shim.Error("Expecting integer value for asset holding")
+ }
+ B = args[2]
+ Bval, err = strconv.Atoi(args[3])
+ if err != nil {
+ return shim.Error("Expecting integer value for asset holding")
+ }
+ logger.Info("Aval = %d, Bval = %d\n", Aval, Bval)
+
+ // Write the state to the ledger
+ err = stub.PutState(A, []byte(strconv.Itoa(Aval)))
+ if err != nil {
+ return shim.Error(err.Error())
+ }
+
+ err = stub.PutState(B, []byte(strconv.Itoa(Bval)))
+ if err != nil {
+ return shim.Error(err.Error())
+ }
+
+ return shim.Success(nil)
+
+
+}
+
+// Transaction makes payment of X units from A to B
+func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) pb.Response {
+ logger.Info("########### example_cc0 Invoke ###########")
+
+ function, args := stub.GetFunctionAndParameters()
+
+ if function == "delete" {
+ // Deletes an entity from its state
+ return t.delete(stub, args)
+ }
+
+ if function == "query" {
+ // queries an entity state
+ return t.query(stub, args)
+ }
+ if function == "move" {
+ // Deletes an entity from its state
+ return t.move(stub, args)
+ }
+
+ logger.Errorf("Unknown action, check the first argument, must be one of 'delete', 'query', or 'move'. But got: %v", args[0])
+ return shim.Error(fmt.Sprintf("Unknown action, check the first argument, must be one of 'delete', 'query', or 'move'. But got: %v", args[0]))
+}
+
+func (t *SimpleChaincode) move(stub shim.ChaincodeStubInterface, args []string) pb.Response {
+ // must be an invoke
+ var A, B string // Entities
+ var Aval, Bval int // Asset holdings
+ var X int // Transaction value
+ var err error
+
+ if len(args) != 3 {
+ return shim.Error("Incorrect number of arguments. Expecting 4, function followed by 2 names and 1 value")
+ }
+
+ A = args[0]
+ B = args[1]
+
+ // Get the state from the ledger
+ // TODO: will be nice to have a GetAllState call to ledger
+ Avalbytes, err := stub.GetState(A)
+ if err != nil {
+ return shim.Error("Failed to get state")
+ }
+ if Avalbytes == nil {
+ return shim.Error("Entity not found")
+ }
+ Aval, _ = strconv.Atoi(string(Avalbytes))
+
+ Bvalbytes, err := stub.GetState(B)
+ if err != nil {
+ return shim.Error("Failed to get state")
+ }
+ if Bvalbytes == nil {
+ return shim.Error("Entity not found")
+ }
+ Bval, _ = strconv.Atoi(string(Bvalbytes))
+
+ // Perform the execution
+ X, err = strconv.Atoi(args[2])
+ if err != nil {
+ return shim.Error("Invalid transaction amount, expecting a integer value")
+ }
+ Aval = Aval - X
+ Bval = Bval + X
+ logger.Infof("Aval = %d, Bval = %d\n", Aval, Bval)
+
+ // Write the state back to the ledger
+ err = stub.PutState(A, []byte(strconv.Itoa(Aval)))
+ if err != nil {
+ return shim.Error(err.Error())
+ }
+
+ err = stub.PutState(B, []byte(strconv.Itoa(Bval)))
+ if err != nil {
+ return shim.Error(err.Error())
+ }
+
+ return shim.Success(nil);
+}
+
+// Deletes an entity from state
+func (t *SimpleChaincode) delete(stub shim.ChaincodeStubInterface, args []string) pb.Response {
+ if len(args) != 1 {
+ return shim.Error("Incorrect number of arguments. Expecting 1")
+ }
+
+ A := args[0]
+
+ // Delete the key from the state in ledger
+ err := stub.DelState(A)
+ if err != nil {
+ return shim.Error("Failed to delete state")
+ }
+
+ return shim.Success(nil)
+}
+
+// Query callback representing the query of a chaincode
+func (t *SimpleChaincode) query(stub shim.ChaincodeStubInterface, args []string) pb.Response {
+
+ var A string // Entities
+ var err error
+
+ if len(args) != 1 {
+ return shim.Error("Incorrect number of arguments. Expecting name of the person to query")
+ }
+
+ A = args[0]
+
+ // Get the state from the ledger
+ Avalbytes, err := stub.GetState(A)
+ if err != nil {
+ jsonResp := "{\"Error\":\"Failed to get state for " + A + "\"}"
+ return shim.Error(jsonResp)
+ }
+
+ if Avalbytes == nil {
+ jsonResp := "{\"Error\":\"Nil amount for " + A + "\"}"
+ return shim.Error(jsonResp)
+ }
+
+ jsonResp := "{\"Name\":\"" + A + "\",\"Amount\":\"" + string(Avalbytes) + "\"}"
+ logger.Infof("Query Response:%s\n", jsonResp)
+ return shim.Success(Avalbytes)
+}
+
+func main() {
+ err := shim.Start(new(SimpleChaincode))
+ if err != nil {
+ logger.Errorf("Error starting Simple chaincode: %s", err)
+ }
+}
diff --git a/balance-transfer/config.json b/balance-transfer/config.json
new file mode 100644
index 0000000000..e490a04fe4
--- /dev/null
+++ b/balance-transfer/config.json
@@ -0,0 +1,16 @@
+{
+ "host":"localhost",
+ "port":"4000",
+ "jwt_expiretime": "36000",
+ "channelName":"mychannel",
+ "GOPATH":"../artifacts",
+ "keyValueStore":"/tmp/fabric-client-kvs",
+ "eventWaitTime":"30000",
+ "orderer":"grpcs://localhost:7050",
+ "users":[
+ {
+ "username":"admin",
+ "secret":"adminpw"
+ }
+ ]
+}
diff --git a/balance-transfer/package.json b/balance-transfer/package.json
new file mode 100644
index 0000000000..4f15ffe1cb
--- /dev/null
+++ b/balance-transfer/package.json
@@ -0,0 +1,30 @@
+{
+ "name": "balance-transfer",
+ "version": "1.0.0-snapshot",
+ "description": "A balance-transfer example node program to demonstrate using node.js SDK APIs",
+ "main": "app/app.js",
+ "keywords": [
+ "fabric-client sample app",
+ "balance-transfer node sample",
+ "v1.0 fabric nodesdk sample"
+ ],
+ "engines": {
+ "node": ">=6.9.5",
+ "npm": ">=3.10.10"
+ },
+ "license": "Apache-2.0",
+ "dependencies": {
+ "body-parser": "^1.17.1",
+ "cookie-parser": "^1.4.3",
+ "cors": "^2.8.3",
+ "express": "^4.15.2",
+ "express-bearer-token": "^2.1.0",
+ "express-jwt": "^5.1.0",
+ "express-session": "^1.15.2",
+ "fabric-ca-client": ">=1.0.0-rc1 <1.0.0-rc1.10",
+ "fabric-client": ">=1.0.0-rc1 <1.0.0-rc1.10",
+ "fs-extra": "^2.0.0",
+ "jsonwebtoken": "^7.3.0",
+ "log4js": "^0.6.38"
+ }
+}
diff --git a/balance-transfer/runApp.sh b/balance-transfer/runApp.sh
new file mode 100755
index 0000000000..7357d60743
--- /dev/null
+++ b/balance-transfer/runApp.sh
@@ -0,0 +1,64 @@
+#!/bin/bash
+#
+# Copyright IBM Corp. All Rights Reserved.
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+
+function dkcl(){
+ CONTAINER_IDS=$(docker ps -aq)
+ echo
+ if [ -z "$CONTAINER_IDS" -o "$CONTAINER_IDS" = " " ]; then
+ echo "========== No containers available for deletion =========="
+ else
+ docker rm -f $CONTAINER_IDS
+ fi
+ echo
+}
+
+function dkrm(){
+ DOCKER_IMAGE_IDS=$(docker images | grep "dev\|none\|test-vp\|peer[0-9]-" | awk '{print $3}')
+ echo
+ if [ -z "$DOCKER_IMAGE_IDS" -o "$DOCKER_IMAGE_IDS" = " " ]; then
+ echo "========== No images available for deletion ==========="
+ else
+ docker rmi -f $DOCKER_IMAGE_IDS
+ fi
+ echo
+}
+
+function restartNetwork() {
+ echo
+
+ #teardown the network and clean the containers and intermediate images
+ cd artifacts
+ docker-compose down
+ dkcl
+ dkrm
+
+ #Cleanup the material
+ rm -rf /tmp/hfc-test-kvs_peerOrg* $HOME/.hfc-key-store/ /tmp/fabric-client-kvs_peerOrg*
+
+ #Start the network
+ docker-compose up -d
+ cd -
+ echo
+}
+
+function installNodeModules() {
+ echo
+ if [ -d node_modules ]; then
+ echo "============== node modules installed already ============="
+ else
+ echo "============== Installing node modules ============="
+ npm install
+ fi
+ echo
+}
+
+
+restartNetwork
+
+installNodeModules
+
+PORT=4000 node app
diff --git a/balance-transfer/testAPIs.sh b/balance-transfer/testAPIs.sh
new file mode 100755
index 0000000000..737238f0f9
--- /dev/null
+++ b/balance-transfer/testAPIs.sh
@@ -0,0 +1,215 @@
+#!/bin/bash
+#
+# Copyright IBM Corp. All Rights Reserved.
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+
+jq --version > /dev/null 2>&1
+if [ $? -ne 0 ]; then
+ echo "Please Install 'jq' https://stedolan.github.io/jq/ to execute this script"
+ echo
+ exit 1
+fi
+starttime=$(date +%s)
+
+echo "POST request Enroll on Org1 ..."
+echo
+ORG1_TOKEN=$(curl -s -X POST \
+ http://localhost:4000/users \
+ -H "content-type: application/x-www-form-urlencoded" \
+ -d 'username=Jim&orgName=org1')
+echo $ORG1_TOKEN
+ORG1_TOKEN=$(echo $ORG1_TOKEN | jq ".token" | sed "s/\"//g")
+echo
+echo "ORG1 token is $ORG1_TOKEN"
+echo
+echo "POST request Enroll on Org2 ..."
+echo
+ORG2_TOKEN=$(curl -s -X POST \
+ http://localhost:4000/users \
+ -H "content-type: application/x-www-form-urlencoded" \
+ -d 'username=Barry&orgName=org2')
+echo $ORG2_TOKEN
+ORG2_TOKEN=$(echo $ORG2_TOKEN | jq ".token" | sed "s/\"//g")
+echo
+echo "ORG2 token is $ORG2_TOKEN"
+echo
+echo
+echo "POST request Create channel ..."
+echo
+curl -s -X POST \
+ http://localhost:4000/channels \
+ -H "authorization: Bearer $ORG1_TOKEN" \
+ -H "content-type: application/json" \
+ -d '{
+ "channelName":"mychannel",
+ "channelConfigPath":"../artifacts/channel/mychannel.tx"
+}'
+echo
+echo
+sleep 5
+echo "POST request Join channel on Org1"
+echo
+curl -s -X POST \
+ http://localhost:4000/channels/mychannel/peers \
+ -H "authorization: Bearer $ORG1_TOKEN" \
+ -H "content-type: application/json" \
+ -d '{
+ "peers": ["localhost:7051","localhost:7056"]
+}'
+echo
+echo
+
+echo "POST request Join channel on Org2"
+echo
+curl -s -X POST \
+ http://localhost:4000/channels/mychannel/peers \
+ -H "authorization: Bearer $ORG2_TOKEN" \
+ -H "content-type: application/json" \
+ -d '{
+ "peers": ["localhost:8051","localhost:8056"]
+}'
+echo
+echo
+
+echo "POST Install chaincode on Org1"
+echo
+curl -s -X POST \
+ http://localhost:4000/chaincodes \
+ -H "authorization: Bearer $ORG1_TOKEN" \
+ -H "content-type: application/json" \
+ -d '{
+ "peers": ["localhost:7051","localhost:7056"],
+ "chaincodeName":"mycc",
+ "chaincodePath":"github.com/example_cc",
+ "chaincodeVersion":"v0"
+}'
+echo
+echo
+
+
+echo "POST Install chaincode on Org2"
+echo
+curl -s -X POST \
+ http://localhost:4000/chaincodes \
+ -H "authorization: Bearer $ORG2_TOKEN" \
+ -H "content-type: application/json" \
+ -d '{
+ "peers": ["localhost:8051","localhost:8056"],
+ "chaincodeName":"mycc",
+ "chaincodePath":"github.com/example_cc",
+ "chaincodeVersion":"v0"
+}'
+echo
+echo
+
+echo "POST instantiate chaincode on peer1 of Org1"
+echo
+curl -s -X POST \
+ http://localhost:4000/channels/mychannel/chaincodes \
+ -H "authorization: Bearer $ORG1_TOKEN" \
+ -H "content-type: application/json" \
+ -d '{
+ "chaincodeName":"mycc",
+ "chaincodeVersion":"v0",
+ "functionName":"init",
+ "args":["a","100","b","200"]
+}'
+echo
+echo
+
+echo "POST invoke chaincode on peers of Org1 and Org2"
+echo
+TRX_ID=$(curl -s -X POST \
+ http://localhost:4000/channels/mychannel/chaincodes/mycc \
+ -H "authorization: Bearer $ORG1_TOKEN" \
+ -H "content-type: application/json" \
+ -d '{
+ "peers": ["localhost:7051", "localhost:8051"],
+ "fcn":"move",
+ "args":["a","b","10"]
+}')
+echo "Transacton ID is $TRX_ID"
+echo
+echo
+
+echo "GET query chaincode on peer1 of Org1"
+echo
+curl -s -X GET \
+ "http://localhost:4000/channels/mychannel/chaincodes/mycc?peer=peer1&fcn=query&args=%5B%22a%22%5D" \
+ -H "authorization: Bearer $ORG1_TOKEN" \
+ -H "content-type: application/json"
+echo
+echo
+
+echo "GET query Block by blockNumber"
+echo
+curl -s -X GET \
+ "http://localhost:4000/channels/mychannel/blocks/1?peer=peer1" \
+ -H "authorization: Bearer $ORG1_TOKEN" \
+ -H "content-type: application/json"
+echo
+echo
+
+echo "GET query Transaction by TransactionID"
+echo
+curl -s -X GET http://localhost:4000/channels/mychannel/transactions/$TRX_ID?peer=peer1 \
+ -H "authorization: Bearer $ORG1_TOKEN" \
+ -H "content-type: application/json"
+echo
+echo
+
+############################################################################
+### TODO: What to pass to fetch the Block information
+############################################################################
+#echo "GET query Block by Hash"
+#echo
+#hash=????
+#curl -s -X GET \
+# "http://localhost:4000/channels/mychannel/blocks?hash=$hash&peer=peer1" \
+# -H "authorization: Bearer $ORG1_TOKEN" \
+# -H "cache-control: no-cache" \
+# -H "content-type: application/json" \
+# -H "x-access-token: $ORG1_TOKEN"
+#echo
+#echo
+
+echo "GET query ChainInfo"
+echo
+curl -s -X GET \
+ "http://localhost:4000/channels/mychannel?peer=peer1" \
+ -H "authorization: Bearer $ORG1_TOKEN" \
+ -H "content-type: application/json"
+echo
+echo
+
+echo "GET query Installed chaincodes"
+echo
+curl -s -X GET \
+ "http://localhost:4000/chaincodes?peer=peer1&type=installed" \
+ -H "authorization: Bearer $ORG1_TOKEN" \
+ -H "content-type: application/json"
+echo
+echo
+
+echo "GET query Instantiated chaincodes"
+echo
+curl -s -X GET \
+ "http://localhost:4000/chaincodes?peer=peer1&type=instantiated" \
+ -H "authorization: Bearer $ORG1_TOKEN" \
+ -H "content-type: application/json"
+echo
+echo
+
+echo "GET query Channels"
+echo
+curl -s -X GET \
+ "http://localhost:4000/channels?peer=peer1" \
+ -H "authorization: Bearer $ORG1_TOKEN" \
+ -H "content-type: application/json"
+echo
+echo
+
+
+echo "Total execution time : $(($(date +%s)-starttime)) secs ..."