import Foundation func makeCommand(method: String, param: Any, completionHandler: @escaping (Any?) -> Void) -> Void { // 1. Build a URL let testnetRpcPort = "18332" let nodeIp = "127.0.0.1:\(testnetRpcPort)" let rpcusername = "oIjA53JC2u" let rpcpassword = "ebVCeSyyM0LurvgQyi0exWTqm4oU0rZU" let walletName = "" let walletUrl = "http://\(rpcusername):\(rpcpassword)@\(nodeIp)/\(walletName)" let url = URL(string: walletUrl) // 2. Build a Request var request = URLRequest(url: url!) request.httpMethod = "POST" request.setValue("text/plain", forHTTPHeaderField: "Content-Type") request.httpBody = "{\"jsonrpc\":\"1.0\",\"id\":\"curltest\",\"method\":\"\(method)\",\"params\":[\(param)]}".data(using: .utf8) // 3. Build a Session let session = URLSession(configuration: .default) let task = session.dataTask(with: request as URLRequest) { data, response, error in do { if error != nil { //Handle the error } else { if let urlContent = data { do { let json = try JSONSerialization.jsonObject(with: urlContent, options: JSONSerialization.ReadingOptions.mutableLeaves) as! NSDictionary if let errorCheck = json["error"] as? NSDictionary { if let errorMessage = errorCheck["message"] as? String { print("FAILED") print(errorMessage) } } else { let result = json["result"] completionHandler(result) } } catch { //Handle error here } } } } } task.resume() } // Test getblockchaininfo var method = "getblockchaininfo" var param = "" makeCommand(method: method,param: param) { result in print(result!) let blockinfo = result as! NSDictionary let block = blockinfo["blocks"] as! NSNumber // Test getblockchash method = "getblockhash" makeCommand(method: method,param: block) { result in print("Blockhash for \(block) is \(result!)") } }