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); }
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); }
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)); }
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)); }