static void Main(string[] args) { BitcoinSecret secret = new BitcoinSecret("cTfANynUR2MCPC8uBpfo2yUfAzX5PucDNuXaJ8jXT8CpQDgvfUNr", Network); BitcoinAddress address = new BitcoinAddress("n2upyU7axtvHHhAPTMvdaRSkP5Mjufoffx", Network); BlockrTransactionRepository blockr = new BlockrTransactionRepository(Network); List<Coin> unspentCoins = blockr.GetUnspentAsync(secret.GetAddress().ToString(), true).Result; TransactionBuilder builder = new TransactionBuilder(); builder.AddKeys(secret); builder.AddCoins(unspentCoins); builder.Send(address, Money.Coins(0.005m)); builder.SendFees(Money.Coins(0.00001m)); builder.SetChange(secret.ScriptPubKey); Transaction tx = builder.BuildTransaction(true); if (builder.Verify(tx)) SendTransaction(tx); }
/// <summary> /// Records a database anchor. /// </summary> /// <param name="anchor">The anchor to be recorded.</param> /// <returns>The task object representing the asynchronous operation.</returns> public async Task RecordAnchor(LedgerAnchor anchor) { byte[] anchorPayload = anchorMarker .Concat(BitConverter.GetBytes((ulong)anchor.TransactionCount).Reverse()) .Concat(anchor.FullStoreHash.ToByteArray()) .ToArray(); using (HttpClient client = new HttpClient()) { BitcoinAddress address = this.publishingAddress.ScriptPubKey.GetDestinationAddress(this.network); HttpResponseMessage response = await client.GetAsync(new Uri(url, $"addresses/{address.ToString()}/unspents")); response.EnsureSuccessStatusCode(); string body = await response.Content.ReadAsStringAsync(); JArray outputs = JArray.Parse(body); TransactionBuilder builder = new TransactionBuilder(); builder.AddKeys(publishingAddress.GetBitcoinSecret(network)); foreach (JObject output in outputs) { string transactionHash = (string)output["transaction_hash"]; uint outputIndex = (uint)output["output_index"]; long amount = (long)output["value"]; builder.AddCoins(new Coin(uint256.Parse(transactionHash), outputIndex, new Money(amount), publishingAddress.ScriptPubKey)); } Script opReturn = new Script(OpcodeType.OP_RETURN, Op.GetPushOp(anchorPayload)); builder.Send(opReturn, 0); builder.SendFees(satoshiFees); builder.SetChange(this.publishingAddress.ScriptPubKey, ChangeType.All); ByteString seriazliedTransaction = new ByteString(builder.BuildTransaction(true).ToBytes()); await SubmitTransaction(seriazliedTransaction); } }
public async Task<ByteString> IssueWithdrawal(IList<OutboundTransaction> transactions) { HttpClient client = new HttpClient(); BitcoinAddress address = storageKey.ScriptPubKey.GetDestinationAddress(this.Network); HttpResponseMessage response = await client.GetAsync(new Uri(url, $"addresses/{address.ToString()}/unspents")); string body = await response.Content.ReadAsStringAsync(); JArray outputs = JArray.Parse(body); TransactionBuilder builder = new TransactionBuilder(); builder.AddKeys(storageKey.GetBitcoinSecret(Network)); foreach (JObject output in outputs) { string transactionHash = (string)output["transaction_hash"]; uint outputIndex = (uint)output["output_index"]; long amount = (long)output["value"]; builder.AddCoins(new Coin(uint256.Parse(transactionHash), outputIndex, new Money(amount), storageKey.ScriptPubKey)); } foreach (OutboundTransaction outboundTransaction in transactions) { builder.Send(BitcoinAddress.Create(outboundTransaction.Target, Network).ScriptPubKey, new Money(outboundTransaction.Amount)); } builder.SendFees(defaultFees); builder.SetChange(storageKey.ScriptPubKey, ChangeType.All); NBitcoin.Transaction transaction = builder.BuildTransaction(true); return new ByteString(transaction.ToBytes()); }