     }
 
     // [String:String] does not handle ["addresses":[...]]
-    internal func dbMakeRequest (path: String, query: [String:String]?, completion: @escaping (Result<[JSON], QueryError>) -> Void) {
+    internal func dbMakeRequest (path: String,
+                                 query: Zip2Sequence<[String],[String]>?,
+                                 completion: @escaping (Result<[JSON], QueryError>) -> Void) {
         guard var urlBuilder = URLComponents (string: dbBaseURL)
             else { completion (Result.failure(QueryError.Foo)); return }
 

    }

    public func getBlockchains (mainnet: Bool? = nil, completion: @escaping (Result<[Model.Blockchain],QueryError>) -> Void) {
        dbMakeRequest (path: "blockchains", query: mainnet.map { ["testnet":($0 ? "false" : "true")] }) {
            (res: Result<[JSON], BlockChainDB.QueryError>) in

            // How to handle an error?

    }

    public func getTransfers (blockchainId: String, addresses: [String], completion: @escaping (Result<[Model.Transfer], QueryError>) -> Void) {
        let queryKeys = ["blockchain_id"] + Array (repeating: "address", count: addresses.count)
        let queryVals = [blockchainId]    + addresses

        dbMakeRequest (path: "transfers", query: zip (queryKeys, queryVals)) {
            (res: Result<[BlockChainDB.JSON], BlockChainDB.QueryError>) in
            completion (res.flatMap {
                let transfers = $0.map { Model.asTransfer(json: $0) }
