                 :data           (proto->clj (.getData this) data)
                 :metadata       (proto->clj (.getMetadata this) metadata)))
 
-  ;; ProposalResponsePackage$Response
-  ;; (proto->clj [this opts]
-  ;;   (make-response :status (proto->clj)
-  ;;                  :message (proto->clj)
-  ;;                  :payload (proto->clj)))
+  ProposalResponsePackage$Response
+  (proto->clj [this opts]
+    (make-response :status (.getStatus this)
+                   :message (.getMessage this)
+                   :payload (.getPayload this)))
+
+  Chaincode$ChaincodeID
+  (proto->clj [this opts]
+    (make-chaincode-id :path (.getPath this)
+                       :name (.getName this)
+                       :version (.getVersion this)))
   
   ProposalResponsePackage$ProposalResponsePayload
   (proto->clj [this {:keys [extension]}]

(defmacro maybe-applying-proto->clj-transform [[tx-map data-call]]
  `(let [data# ~data-call]
     (if-let [tx-fn# (:fn ~tx-map)]
       (proto->clj (tx-fn# data#) (:next ~tx-map))
       data#)))



  
  TransactionPackage$ChaincodeEndorsedAction
  (proto->clj [this {:keys [proposal-response-payload]}]
    (make-chaincode-endorsed-action :proposal-response-payload
                                    (maybe-applying-proto->clj-transform [proposal-response-payload
                                                                          (.getProposalResponsePayload this)])
                                    :endorsements (.getEndorsementsList this)))

  Chaincode$ChaincodeInput
  (proto->clj [this ignore]
    (make-chaincode-input :args (.getArgsList this)
                          :decorations (utils/map-vals #(proto->clj % nil)
                                                       (.getDecorations this))))
  
  Chaincode$ChaincodeSpec
  (proto->clj [this ignore]
    (make-chaincode-spec :type (.getTypeValue this)
                         :chaincode-id (proto->clj (.getChaincodeId this) ignore)
                         :chaincode-input (proto->clj (.getInput this) ignore)
                         :timeout (.getTimeout this)))
  
  Chaincode$ChaincodeInvocationSpec
  (proto->clj [this ignore]
    (make-chaincode-invocation-spec :chaincode-spec (proto->clj (.getChaincodeSpec this) ignore)
                                    :id-generation-alg (.getIdGenerationAlg this)))
  
  ProposalPackage$ChaincodeProposalPayload
  (proto->clj [this {:keys [input]}]
    (make-chaincode-proposal-payload :input
                                     (maybe-applying-proto->clj-transform [input (.getInput this)])
                                   
                                     :transiten-map (utils/map-vals #(proto->clj % nil) (.getTransientMap this))))
  
  TransactionPackage$ChaincodeActionPayload
  (proto->clj [this {:keys [action chaincode-proposal-payload]}]
    (make-chaincode-action-payload :chaincode-proposal-payload
                                   (maybe-applying-proto->clj-transform [chaincode-proposal-payload
                                                                         (.getChaincodeProposalPayload this)])
                                   
                                   :action (proto->clj (.getAction this) action)))

