WalletTx AddOutgoingTx(string from, TransferTransaction signedTx, WalletTag tagFor) { var date = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); var address = db.AddrGet(from); var amount = asset.AmountToLong(signedTx.Amount); var fee = asset.AmountToLong(signedTx.Fee); logger.LogDebug("outgoing tx: amount: {0}, fee: {1}", amount, fee); // create chain tx var ctx = new ChainTx(signedTx.GenerateId(), date, fee, -1, 0); ctx.NetworkStatus = new ChainTxNetworkStatus(ctx, ChainTxStatus.Unconfirmed, date, signedTx.GetBytes()); db.ChainTxs.Add(ctx); db.ChainTxNetworkStatus.Add(ctx.NetworkStatus); // create tx inputs var i = new TxInput(signedTx.GenerateId(), from /*signedTx.Sender is null*/, 0, amount); i.ChainTx = ctx; i.WalletAddr = address; db.TxInputs.Add(i); i = new TxInput(signedTx.GenerateId(), from /*signedTx.Sender is null*/, 1, fee); i.ChainTx = ctx; i.WalletAddr = address; db.TxInputs.Add(i); // create tx output var o = new TxOutput(signedTx.GenerateId(), signedTx.Recipient, 0, amount); o.ChainTx = ctx; db.TxOutputs.Add(o); if (tagFor != null) { db.TxOutputsForTag.Add(new TxOutputForTag { TxOutput = o, Tag = tagFor }); } // create wallet tx var wtx = new WalletTx { ChainTx = ctx, Address = address, Direction = WalletDirection.Outgoing }; db.WalletTxs.Add(wtx); return(wtx); }
public static (string, bool, List <string>) SendWavesFunds(bool mainnet, string privKey, string addr1, string addr2, string assetId = null) { var sentTxIds = new List <string>(); var chainId = Node.TestNetChainId; var nodeAddr = "https://testnodes.wavesnodes.com"; if (mainnet) { chainId = Node.MainNetChainId; nodeAddr = "https://nodes.wavesnodes.com/"; } var node = new Node(nodeAddr, chainId); var asset = Assets.WAVES; if (assetId != null) { asset = node.GetAsset(assetId); } Console.WriteLine($"::send {asset.Name} funds"); var seed = xchwallet.Utils.ParseHexString(privKey); var key = PrivateKeyAccount.CreateFromSeed(seed, chainId, 0); var addr = key.Address; Console.WriteLine($" ::privkey: {privKey}"); Console.WriteLine($" ::addr: {addr}"); var balance = node.GetBalance(addr, asset); Console.WriteLine($" ::balance: {balance} {asset.Name}"); if (balance > 0) { var numTxs = 6; var txFee = 0.001M; var massTxFee = txFee + 0.0005M * 2; var feeTotal = txFee * (numTxs - 2) + massTxFee; var balanceAfterFees = balance - feeTotal; if (!asset.Equals(Assets.WAVES)) // if the asset is not waves then we ignore the fees because we are paying fees in WAVES { balanceAfterFees = balance; } Console.WriteLine($" ::fees: {feeTotal} {asset.Name}"); Console.WriteLine($" ::balance - fees: {balanceAfterFees} {asset.Name}"); var amount = balanceAfterFees / numTxs; amount = Math.Round(amount, asset.Decimals); var remainder = balanceAfterFees - amount * numTxs; Console.WriteLine($" ::amount per tx: {amount} (x {numTxs} = {amount * numTxs}, remainder: {remainder})"); var txs = new List <TransferTransaction>(); for (var i = 0; i < numTxs - 2; i++) { var tx = new TransferTransaction(chainId, key.PublicKey, addr1, asset, amount, txFee); tx.Sign(key); txs.Add(tx); System.Threading.Thread.Sleep(100); // sleep to ensure new timestamp } var transfers = new List <MassTransferItem> { new MassTransferItem(addr1, amount + remainder), new MassTransferItem(addr2, amount), }; var massTx = new MassTransferTransaction(chainId, key.PublicKey, asset, transfers, "Shut up & take my money"); System.Diagnostics.Debug.Assert(massTx.Fee == massTxFee); massTx.Sign(key); // send the raw signed transactions and get the txids try { string output = null; foreach (var tx in txs) { output = node.BroadcastAndWait(tx); Console.WriteLine($" {output}"); sentTxIds.Add(tx.GenerateId()); } output = node.BroadcastAndWait(massTx); Console.WriteLine($" {output}"); sentTxIds.Add(massTx.GenerateId()); } catch (System.Net.WebException ex) { var resp = new System.IO.StreamReader(ex.Response.GetResponseStream()).ReadToEnd(); dynamic obj = JsonConvert.DeserializeObject(resp); if (obj != null) { Console.WriteLine($" ERROR: {obj.message}"); } else { Console.WriteLine($" ERROR: {ex}"); } return(addr, false, sentTxIds); } } return(addr, true, sentTxIds); }