/// <summary> /// Implements brfc 759684b1a19a, paymentDestination: bsvalias Payment Addressing (Basic Address Resolution) /// </summary> /// <param name="key">Private key with which to sign this request. If null, signature will be blank. Else, must match public key returned by GetPubKey(senderHandle).</param> /// <param name="receiverHandle"></param> /// <param name="senderHandle"></param> /// <param name="senderName"></param> /// <param name="amount"></param> /// <param name="purpose"></param> /// <returns></returns> public async Task <Script> GetOutputScript(PrivateKey key, string receiverHandle, string senderHandle, string senderName = null, Amount?amount = null, string purpose = "") { amount ??= Amount.Zero; var dt = DateTime.UtcNow.ToString("o"); var message = $"{senderHandle}{amount.Value.Satoshis}{dt}{purpose}"; var signature = key?.SignMessageToBase64(message) ?? ""; // var ok = key.GetPubKey().VerifyMessage(message, signature); var request = new GetOutputScriptRequest { SenderHandle = senderHandle, Amount = amount.Value.Satoshis, Timestamp = dt, Purpose = purpose ?? "", SenderName = senderName ?? "", Signature = signature }; var url = await GetAddressUrl(receiverHandle); var json = JObject.FromObject(request); var response = await PostAsync(url, json); // e.g. {"output":"76a914bdfbe8a16162ba467746e382a081a1857831811088ac"} var outputScript = JsonConvert.DeserializeObject <GetOutputScriptResponse>(response); return(new Script(outputScript.Output)); }
/// <summary> /// Implements brfc 759684b1a19a, paymentDestination: bsvalias Payment Addressing (Basic Address Resolution) /// /// </summary> /// <param name="key">Private key with which to sign this request. If null, signature will be blank. Else, must match public key returned by GetPubKey(senderHandle).</param> /// <param name="receiverHandle"></param> /// <param name="senderHandle"></param> /// <param name="senderName"></param> /// <param name="amount"></param> /// <param name="purpose"></param> /// <returns></returns> public async Task <KzScript> GetOutputScript(KzPrivKey key, string receiverHandle, string senderHandle, string senderName = null, KzAmount?amount = null, string purpose = null) { if (!amount.HasValue) { amount = KzAmount.Zero; } var dt = DateTime.UtcNow.ToString("o"); var message = $"{senderHandle}{amount.Value.Satoshis}{dt}{purpose}"; var signature = key?.SignMessageToB64(message); // var ok = key.GetPubKey().VerifyMessage(message, signature); var request = new GetOutputScriptRequest { senderHandle = senderHandle, amount = amount.Value.Satoshis, dt = dt, purpose = purpose ?? "", senderName = senderName ?? "", signature = signature ?? "" }; var jsonContent = JsonConvert.SerializeObject(request); var httpContent = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var uri = await GetAddressUrl(receiverHandle); var rm = await _HttpClient.PostAsync(uri, httpContent); if (rm.StatusCode == HttpStatusCode.OK) { var response = await rm.Content.ReadAsStringAsync(); // e.g. {"output":"76a914bdfbe8a16162ba467746e382a081a1857831811088ac"} var r = JsonConvert.DeserializeObject <GetOutputScriptResponse>(response); var s = new KzScript(r.output); return(s); } if (rm.StatusCode == HttpStatusCode.NotFound) { throw new ArgumentException($"Paymail \"{receiverHandle}\" was not found by this service."); } throw new Exception($"Unhandled HTTP Post StatusCode {rm.StatusCode}."); }