예제 #1
0
        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);
        }
예제 #2
0
        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);
        }