public static string DoSignVTHOTx(List <string[]> transactions, string privateKey, bool isSend, int?gasLimit) { byte chainTag = 0; byte[] blockRef = null; var clauses = new List <ToClause>(); foreach (var transaction in transactions) { var amount = Amount.VTHO(); amount.SetDecimalAmount(transaction[1]); clauses.Add( ERC20Contract.BuildTranferToClause(ERC20Token.VTHO, Address.FromHexString(transaction[0]), amount)); chainTag = ByteUtils.ToByteArray(transaction[2])[0]; blockRef = transaction[3] == null?BlockchainClient.GetBlockRef(null).ToByteArray() : ByteUtils.ToByteArray(transaction[3]); } int gas = clauses.Count * gasLimit ?? 80000; var rawTransaction = RawTransactionFactory.Instance.CreateRawTransaction(chainTag, blockRef, 720, gas, (byte)0x0, CryptoUtils.GenerateTxNonce(), clauses.ToArray()); if (isSend) { var result = TransactionClient.SignThenTransfer(rawTransaction, ECKeyPair.Create(privateKey)); return(JsonConvert.SerializeObject(result)); } else { var result = TransactionClient.Sign(rawTransaction, ECKeyPair.Create(privateKey)); return(ByteUtils.ToHexString(result.Encode(), Prefix.ZeroLowerX)); } }
private static void ParseERC20(string hexRawTxn) { var rawTransaction = RLPUtils.Decode(hexRawTxn); var rawClauses = rawTransaction.Clauses; int index = 1; WriteLine("----------------------------------------------------------"); WriteLine("ChainTag:" + rawTransaction.ChainTag); WriteLine("BlockRef:" + ByteUtils.ToHexString(rawTransaction.BlockRef, Prefix.ZeroLowerX)); WriteLine("Expiration:" + ByteUtils.BytesToBigInt(rawTransaction.Expiration)); WriteLine("Gas:" + ByteUtils.BytesToBigInt(rawTransaction.Gas)); foreach (var rawClause in rawClauses) { WriteLine("No." + index); var addressBytes = rawClause.To; var dataBytes = rawClause.Data; if (dataBytes.Length != 68) { throw new Exception("The data length is not 68 bytes"); } var methodId = new byte[4]; var address = new byte[20]; var value = new byte[32]; Array.Copy(dataBytes, 0, methodId, 0, 4); Array.Copy(dataBytes, 16, address, 0, 20); Array.Copy(dataBytes, 36, value, 0, 32); string methodIdHex = ByteUtils.ToHexString(methodId, Prefix.ZeroLowerX); var contract = new ERC20Contract(); var abiDefinition = contract.FindAbiDefinition("transfer"); String transferMethodId = "0x" + abiDefinition.GetHexMethodCodeNoPrefix(); if (!methodIdHex.Equals(transferMethodId, StringComparison.OrdinalIgnoreCase)) { throw new Exception("the method id is not transfer"); } var erc2Amount = Amount.VTHO(); erc2Amount.SetHexAmount(ByteUtils.ToHexString(value, Prefix.ZeroLowerX)); WriteLine("ERC20 Contract:" + ByteUtils.ToHexString(addressBytes, Prefix.ZeroLowerX)); WriteLine("To Address:" + ByteUtils.ToHexString(address, Prefix.ZeroLowerX)); WriteLine("To Value:" + erc2Amount.Value); WriteLine("-----"); index++; } WriteLine("----------------------------------------------------------"); }