public static byte[] BuildSendOneMessage(string toAddress, string coin, decimal amount, Wallet wallet, string memo = "")
        {
            string hrpFrom;

            byte[] addrFromDec;
            Bech32.Bech32Engine.Decode(wallet.Address, out hrpFrom, out addrFromDec);
            string hrpTo;

            byte[] addrToDec;
            Bech32.Bech32Engine.Decode(toAddress, out hrpTo, out addrToDec);
            if (hrpFrom != hrpTo)
            {
                throw new BlockchainNetworkMismatchException(string.Format("Environment mismatch between from address ({0}) and to address ({1})", hrpFrom, hrpTo));
            }

            Send send  = new Send();
            var  input = new Send.Types.Input();

            input.Address = ByteString.CopyFrom(addrFromDec);
            var coinToSend = new Send.Types.Token {
                Amount = (long)Decimal.Round(amount * 100000000), Denom = coin
            };

            input.Coins.Add(coinToSend);
            var output = new Send.Types.Output();

            output.Address = ByteString.CopyFrom(addrToDec);
            output.Coins.Add(coinToSend);
            send.Inputs.Add(input);
            send.Outputs.Add(output);

            var aminoMessage = AminoBuilder.buildAminoMessage(send.ToByteArray(), AminoBuilder.AminoType.Send);
            StdSignBytesConverter signatureBytesConverter = new StdSignBytesConverter(send, wallet, memo);

            byte[] messageBytesForSign   = signatureBytesConverter.GetCanonicalBytesForSignature();
            var    signatureBytes        = wallet.Sign(messageBytesForSign);
            var    signatureBytesMessage = AminoBuilder.buildAminoSignature(signatureBytes, wallet);
            var    stdMsg = AminoBuilder.buildStandardTransaction(aminoMessage, signatureBytesMessage, memo);

            return(stdMsg);
        }
        public static byte[] BuildSendMultipleMessage(List <MultipleSendDestination> destinations, Wallet wallet, string memo = "")
        {
            string hrpFrom;

            byte[] addrFromDec;
            Bech32.Bech32Engine.Decode(wallet.Address, out hrpFrom, out addrFromDec);

            Dictionary <string, decimal> coinInputs = new Dictionary <string, decimal>();

            foreach (var destination in destinations)
            {
                if (coinInputs.ContainsKey(destination.coin))
                {
                    coinInputs[destination.coin] += destination.Amount;
                }
                else
                {
                    coinInputs[destination.coin] = destination.Amount;
                }
            }
            Send send  = new Send();
            var  input = new Send.Types.Input();

            input.Address = ByteString.CopyFrom(addrFromDec);
            foreach (var coin in coinInputs)
            {
                var coinToSend = new Send.Types.Token {
                    Amount = (long)Decimal.Round(coin.Value * 100000000), Denom = coin.Key
                };
                input.Coins.Add(coinToSend);
            }
            send.Inputs.Add(input);
            var outAddresses = destinations.Select(X => X.Address).ToList().Distinct();

            foreach (var outAddress in outAddresses)
            {
                var    output = new Send.Types.Output();
                byte[] outAddrDec;
                string hrpTo;
                Bech32.Bech32Engine.Decode(outAddress, out hrpTo, out outAddrDec);
                if (hrpFrom != hrpTo)
                {
                    throw new BlockchainNetworkMismatchException(string.Format("Environment mismatch between from address ({0}) and to address ({1})", hrpFrom, hrpTo));
                }
                output.Address = ByteString.CopyFrom(outAddrDec);
                var outCoins = destinations.Where(X => X.Address == outAddress);
                foreach (var coin in outCoins)
                {
                    var coinToSend = new Send.Types.Token {
                        Amount = (long)Decimal.Round(coin.Amount * 100000000), Denom = coin.coin
                    };
                    output.Coins.Add(coinToSend);
                }
                send.Outputs.Add(output);
            }

            var aminoMessage = AminoBuilder.buildAminoMessage(send.ToByteArray(), AminoBuilder.AminoType.Send);
            StdSignBytesConverter signatureBytesConverter = new StdSignBytesConverter(send, wallet, memo);

            byte[] messageBytesForSign   = signatureBytesConverter.GetCanonicalBytesForSignature();
            var    signatureBytes        = wallet.Sign(messageBytesForSign);
            var    signatureBytesMessage = AminoBuilder.buildAminoSignature(signatureBytes, wallet);
            var    stdMsg = AminoBuilder.buildStandardTransaction(aminoMessage, signatureBytesMessage, memo);

            return(stdMsg);
        }