Пример #1
0
        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));
            }
        }
Пример #2
0
        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("----------------------------------------------------------");
        }