예제 #1
0
        private TransferMessage CreateTransferMessage(Transfer transfer)
        {
            Token token = new Token();

            token.Denom  = transfer.Coin;
            token.Amount = DoubleToLong(transfer.Amount);
            List <Token> coins = new List <Token> {
                token
            };

            InputOutput input = new InputOutput();

            input.Address = transfer.FromAddress;
            input.Coins   = coins;
            InputOutput output = new InputOutput();

            output.Address = transfer.ToAddress;
            output.Coins   = coins;

            TransferMessage msgBean = new TransferMessage();

            msgBean.Inputs = new List <InputOutput> {
                input
            };
            msgBean.Outputs = new List <InputOutput> {
                output
            };
            return(msgBean);
        }
예제 #2
0
        private TransferMessage CreateMultiTransferMessage(MultiTransfer multiTransfer)
        {
            Dictionary <string, long> inputsCoins = new Dictionary <string, long>();
            List <InputOutput>        outputs     = new List <InputOutput>();

            foreach (Output output in multiTransfer.Outputs)
            {
                InputOutput inputOutput = new InputOutput
                {
                    Address = output.Address
                };
                List <Token> tokens = new List <Token>(output.Tokens.Count);
                foreach (OutputToken outputToken in output.Tokens)
                {
                    Token token = new Token
                    {
                        Denom  = outputToken.Coin,
                        Amount = DoubleToLong(outputToken.Amount)
                    };
                    tokens.Add(token);

                    inputsCoins.TryGetValue(outputToken.Coin, out long inputSum);

                    long newSum = inputSum + token.Amount;
                    if (newSum < 0L)
                    {
                        throw new ArgumentException("Transfer amount overflow");
                    }
                    inputsCoins.Add(outputToken.Coin, newSum);
                }
                tokens.Sort((x, y) => (x.Denom.CompareTo(y.Denom)));
                inputOutput.Coins = tokens;
                outputs.Add(inputOutput);
            }

            InputOutput input = new InputOutput()
            {
                Address = multiTransfer.FromAddress
            };
            List <Token> inputTokens = new List <Token>(inputsCoins.Count);

            foreach (string coin in inputsCoins.Keys)
            {
                Token token = new Token()
                {
                    Denom  = coin,
                    Amount = inputsCoins[coin]
                };
                inputTokens.Add(token);
            }
            input.Coins = inputTokens;

            TransferMessage transferMessage = new TransferMessage();

            transferMessage.Inputs = new List <InputOutput> {
                input
            };
            transferMessage.Outputs = outputs;
            return(transferMessage);
        }
예제 #3
0
        public string BuildMultiTransfer(MultiTransfer multiTransfer)
        {
            Wallet.EnsureWalletIsReady();
            TransferMessage msgBean = CreateMultiTransferMessage(multiTransfer);

            byte[] msg       = EncodeTransferMessage(msgBean);
            byte[] signature = EncodeSignature(Sign(msgBean));
            byte[] stdTx     = EncodeStdTx(msg, signature);
            return(EncodeUtils.ByteArrayToHex(stdTx));
        }
예제 #4
0
 private byte[] EncodeTransferMessage(TransferMessage transferMessage)
 {
     proto.Send send = new proto.Send();
     foreach (InputOutput input in transferMessage.Inputs)
     {
         send.Inputs.Add(toProtoInput(input));
     }
     foreach (InputOutput output in transferMessage.Outputs)
     {
         send.Outputs.Add(toProtoOutput(output));
     }
     return(EncodeUtils.AminoWrap(send.ToByteArray(), MessageType.GetTransactionType(EMessageType.Send), false));
 }