예제 #1
0
        public ColdStakingTransactionResponse BuildTransaction(string sourceMultiSigAddress, List <Recipient> recipients, bool sign, string passphrase = null, List <Burn> burns = null)
        {
            var builder = new TransactionBuilder(this.network);

            foreach (var r in recipients)
            {
                Script scriptPubKey = r.Address.GetScriptPubKey();
                builder.Send(scriptPubKey, r.Amount);
            }

            if (burns != null)
            {
                foreach (Burn burn in burns)
                {
                    builder.Send(TxNullDataTemplate.Instance.GenerateScriptPubKey(burn.Data), burn.Amount);
                }
            }

            var scriptCoins = GetAllCoinsForMultiSigAccount(sourceMultiSigAddress, passphrase, out Script scriptPubKeyForChange, out Key ownPrivateKey);

            builder.AddCoins(scriptCoins);
            builder.AddKeys(ownPrivateKey);
            builder.SetChange(scriptPubKeyForChange);

            var estimatedFee = builder.EstimateFees(new FeeRate(this.feePer1000VBytes)) * 5;  // TODO

            builder.SendFees(estimatedFee);

            var transaction = builder.BuildTransaction(sign);

            if (sign)
            {
                transaction = builder.CombineSignatures(transaction);
            }


            bool isVerifyPassing = builder.Verify(transaction, out var errors);

            foreach (var err in errors)
            {
                this.logger.LogError(err.ToString());
            }

            this.logger.LogInformation($"isVerifyPassing: {isVerifyPassing}");
            this.logger.LogInformation(transaction.ToString());


            var response = new ColdStakingTransactionResponse
            {
                Transaction    = transaction,
                Hex            = transaction.ToHex(),
                Fee            = estimatedFee,
                VirtualSize    = transaction.GetVirtualSize(),
                SerializedSize = transaction.GetSerializedSize(),
                TransactionId  = transaction.GetHash(),
                BroadcastState = BroadcastState.NotSet
            };

            return(response);
        }
예제 #2
0
        public ColdStakingTransactionResponse BuildColdStakingTransaction(ColdStakingTransactionRequest request)
        {
            WaitForWallet();

            ColdStakingTransactionResponse response = GetColdStakingTransactionService().BuildTransaction(null, request.Recipients, request.Sign, request.Passphrase, request.Burns);

            response.BroadcastState = request.Send
                ? BroadCast(response.Transaction)
                : BroadcastState.NotRequested;

            return(response);
        }