예제 #1
0
 public static Tuple <string, string> TransData(string contractabi, string contractAddress, string funcName, object[] args,
                                                BigInteger groupId, BigInteger blockLimit, byte[] extraData, bool smcrypto, ECKeyPair key)
 {
     try
     {
         if (string.IsNullOrEmpty(funcName))
         {
             return(new Tuple <string, string>("", "contract not has function"));
         }
         Nethereum.ABI.JsonDeserialisation.ABIDeserialiser abijson = new Nethereum.ABI.JsonDeserialisation.ABIDeserialiser();
         var         abi      = abijson.DeserialiseContract(contractabi);
         var         funcData = Pack(abi, funcName, args, smcrypto);
         FunctionABI method   = null;
         foreach (var item in abi.Functions)
         {
             if (item.Name == funcName)
             {
                 method = item;
             }
         }
         if (method.Constant)
         {
             return(new Tuple <string, string>(Hex.ToHexString(funcData), ""));
         }
         var toAddress = Hex.Decode(contractAddress.Replace("0x", ""));
         var nonce     = RandomHelper.GetRandomBytes(32);
         var tx        = NewTransaction(nonce, toAddress, null, GAS_LIMIT, GAS_PRICE, blockLimit, funcData, ChainId, groupId, extraData, smcrypto);
         var dataByte  = SignData(tx, key);
         return(new Tuple <string, string>(Hex.ToHexString(dataByte), string.Empty));
     }
     catch (Exception ex)
     {
         throw ex;
     }
 }
예제 #2
0
 protected FunctionBuilderBase(ContractBuilder contract, FunctionABI functionAbi)
 {
     FunctionABI         = functionAbi;
     _contract           = contract;
     FunctionCallDecoder = new FunctionCallDecoder();
     FunctionCallEncoder = new FunctionCallEncoder();
 }
        public string GenerateClass(FunctionABI functionABI)
        {
            var header = "";

            if (_functionABIModel.IsMultipleOutput(functionABI))
            {
                header = $@"{SpaceUtils.OneTab}[Function(""{functionABI.Name}"", typeof({_functionOutputDTOModel.GetFunctionOutputTypeName(functionABI)}))]";
            }

            if (_functionABIModel.IsSingleOutput(functionABI))
            {
                header = $@"{SpaceUtils.OneTab}[Function(""{functionABI.Name}"", ""{_functionABIModel.GetSingleAbiReturnType(functionABI)}""))]";
            }

            if (_functionABIModel.HasNoReturn(functionABI))
            {
                header = $@"{SpaceUtils.OneTab}[Function(""{functionABI.Name}""]";
            }

            return($@"{header}
{SpaceUtils.OneTab}public class {_functionCQSMessageModel.GetFunctionMessageTypeName(functionABI)}:ContractMessage
{SpaceUtils.OneTab}{{
{_parameterABIFunctionDTOTemplate.GenerateAllProperties(functionABI.InputParameters)}
{SpaceUtils.OneTab}}}");
        }
예제 #4
0
        private FunctionABI GetNethFunctionABI(IAbiFunctionDefinition definition)
        {
            var functionABI = new FunctionABI(definition.Name, definition.Constant);

            functionABI.InputParameters  = this.GetNethParameters(definition.inputs);
            functionABI.OutputParameters = this.GetNethParameters(definition.outputs);
            return(functionABI);
        }
        private string GetFunctionDisplay(FunctionABI functionAbi)
        {
            return($@"
{SpaceUtils.ThreeTabs}/** Function: {functionAbi.Name}**/
{SpaceUtils.ThreeTabs}/*
{GenerateMethod(functionAbi)}
{SpaceUtils.ThreeTabs}*/");
        }
예제 #6
0
 public string GetSingleOutputReturnType(FunctionABI functionABI)
 {
     if (functionABI.OutputParameters != null && functionABI.OutputParameters.Length == 1)
     {
         return(abiTypeToCSharpType.GetTypeMap(functionABI.OutputParameters[0].Type, true));
     }
     return(null);
 }
예제 #7
0
 public FunctionOutputDTOGenerator(FunctionABI functionABI, string @namespace, CodeGenLanguage codeGenLanguage)
 {
     ClassModel = new FunctionOutputDTOModel(functionABI, @namespace)
     {
         CodeGenLanguage = codeGenLanguage
     };
     InitialiseTemplate(codeGenLanguage);
 }
예제 #8
0
 public string GetSingleOutputGenericReturnType(FunctionABI item)
 {
     if (item == null)
     {
         return(String.Empty);
     }
     return($"<{GetSingleOutputReturnType(item)}>");
 }
예제 #9
0
 public string GetSingleAbiReturnType(FunctionABI functionABI)
 {
     if (functionABI.OutputParameters != null && functionABI.OutputParameters.Length == 1)
     {
         return(functionABI.OutputParameters[0].Type);
     }
     return(null);
 }
예제 #10
0
 public string GetReturnType(FunctionABI functionABI)
 {
     if (functionABI.OutputParameters != null && functionABI.OutputParameters.Length == 1)
     {
         return(GetTypeMap(functionABI.OutputParameters[0].Type, true));
     }
     return(null);
 }
예제 #11
0
        public string GenerateMethod(FunctionABI functionABI)
        {
            var functionCQSMessageModel = new FunctionCQSMessageModel(functionABI, _model.CQSNamespace);
            var functionOutputDTOModel  = new FunctionOutputDTOModel(functionABI, _model.FunctionOutputNamespace);
            var functionABIModel        = new FunctionABIModel(functionABI, _typeConvertor);

            var messageType         = functionCQSMessageModel.GetTypeName();
            var messageVariableName = functionCQSMessageModel.GetVariableName();
            var functionNameUpper   = _commonGenerators.GenerateClassName(functionABI.Name);

            if (functionABIModel.IsMultipleOutput() && !functionABIModel.IsTransaction())
            {
                var functionOutputDTOType = functionOutputDTOModel.GetTypeName();
                return
                    ($@"{SpaceUtils.TwoTabs}Public Function {functionNameUpper}QueryAsync(ByVal {messageVariableName} As {messageType}, ByVal Optional blockParameter As BlockParameter = Nothing) As Task(Of {functionOutputDTOType})
{SpaceUtils.TwoTabs}
{SpaceUtils.ThreeTabs}Return ContractHandler.QueryDeserializingToObjectAsync(Of {messageType}, {functionOutputDTOType})({messageVariableName}, blockParameter)
{SpaceUtils.TwoTabs}
{SpaceUtils.TwoTabs}End Function");
            }

            if (functionABIModel.IsSingleOutput() && !functionABIModel.IsTransaction())
            {
                if (functionABI.OutputParameters != null && functionABI.OutputParameters.Length == 1 &&
                    functionABI.Constant)
                {
                    var type = functionABIModel.GetSingleOutputReturnType();

                    return
                        ($@"{SpaceUtils.TwoTabs}Public Function {functionNameUpper}QueryAsync(ByVal {messageVariableName} As {messageType}, ByVal Optional blockParameter As BlockParameter = Nothing) As Task(Of {type})
{SpaceUtils.TwoTabs}
{SpaceUtils.ThreeTabs}Return ContractHandler.QueryAsync(Of {messageType}, {type})({messageVariableName}, blockParameter)
{SpaceUtils.TwoTabs}
{SpaceUtils.TwoTabs}End Function");
                }
            }

            if (functionABIModel.IsTransaction())
            {
                var transactionRequest =
                    $@"{SpaceUtils.TwoTabs}Public Function {functionNameUpper}RequestAsync(ByVal {messageVariableName} As {messageType}) As Task(Of String)
{SpaceUtils.TwoTabs}            
{SpaceUtils.ThreeTabs}Return ContractHandler.SendRequestAsync({messageVariableName})
{SpaceUtils.TwoTabs}
{SpaceUtils.TwoTabs}End Function";

                var transactionRequestAndReceipt =
                    $@"{SpaceUtils.TwoTabs}Public Function {functionNameUpper}RequestAndWaitForReceiptAsync(ByVal {messageVariableName} As {messageType}, ByVal Optional cancellationToken As CancellationTokenSource = Nothing) As Task(Of TransactionReceipt)
{SpaceUtils.TwoTabs}
{SpaceUtils.ThreeTabs}Return ContractHandler.SendRequestAndWaitForReceiptAsync({messageVariableName}, cancellationToken)
{SpaceUtils.TwoTabs}
{SpaceUtils.TwoTabs}End Function";

                return(transactionRequest + Environment.NewLine + transactionRequestAndReceipt);
            }

            return(null);
        }
예제 #12
0
        public FunctionABI BuildFunction(IDictionary <string, object> function)
        {
            var functionABI = new FunctionABI((string)function["name"], (bool)function["constant"],
                                              TryGetSerpentValue(function));

            functionABI.InputParameters  = BuildFunctionParameters((List <object>)function["inputs"]);
            functionABI.OutputParameters = BuildFunctionParameters((List <object>)function["outputs"]);
            return(functionABI);
        }
예제 #13
0
        static FunctionOutputDTOGenerator CreateGenerator()
        {
            var functionAbi = new FunctionABI("GetCar", true)
            {
                OutputParameters = new[] { new ParameterABI("uint32", "id", 1), new ParameterABI("string", "name", 2) }
            };

            return(new FunctionOutputDTOGenerator(functionAbi, "DefaultNamespace", CodeGenLanguage.CSharp));
        }
예제 #14
0
        public FunctionPrinter()
        {
            _functionAbi = ABITypedRegistry.GetFunctionABI <TFunctionInput>();

            if (_functionAbi == null)
            {
                throw new ArgumentException("Function for TFunctionInput not found in contract");
            }
        }
예제 #15
0
        public string GetGenericReturnType(FunctionABI item)
        {
            if (item == null)
            {
                return(String.Empty);
            }
            var returnType = GetReturnType(item);

            return("<" + returnType + ">");
        }
        public FunctionCQSMessageGenerator(FunctionABI functionABI, string @namespace, string namespaceFunctionOutput, CodeGenLanguage codeGenLanguage)
        {
            FunctionABI = functionABI;
            ClassModel  = new FunctionCQSMessageModel(FunctionABI, @namespace);
            ClassModel.NamespaceDependencies.Add(namespaceFunctionOutput);
            ClassModel.CodeGenLanguage = codeGenLanguage;
            var functionOutputDTOModel = new FunctionOutputDTOModel(functionABI, namespaceFunctionOutput);

            InitialiseTemplate(codeGenLanguage, functionOutputDTOModel);
        }
        public void GeneratesExpectedFileName()
        {
            var abi = new FunctionABI("recordHousePurchase", false)
            {
            };

            var generator      = new FunctionABIToProtoGenerator(abi);
            var actualFileName = generator.GetFileName();

            Assert.Equal("RecordHousePurchaseMessages.proto", actualFileName);
        }
        public string GenerateMethod(FunctionABI functionABI)
        {
            var functionCQSMessageModel = new FunctionCQSMessageModel(functionABI, _model.CQSNamespace);
            var functionOutputDTOModel  = new FunctionOutputDTOModel(functionABI, _model.FunctionOutputNamespace);
            var functionABIModel        = new FunctionABIModel(functionABI, _typeConvertor);

            var messageType         = functionCQSMessageModel.GetTypeName();
            var messageVariableName = functionCQSMessageModel.GetVariableName();
            var functionNameUpper   = _commonGenerators.GenerateClassName(functionABI.Name);

            if (functionABIModel.IsMultipleOutput() && !functionABIModel.IsTransaction())
            {
                var functionOutputDTOType = functionOutputDTOModel.GetTypeName();

                return
                    ($@"{SpaceUtils.TwoTabs}member this.{functionNameUpper}QueryAsync({messageVariableName}: {messageType}, ?blockParameter: BlockParameter): Task<{functionOutputDTOType}> =
{SpaceUtils.ThreeTabs}let blockParameterVal = defaultArg blockParameter null
{SpaceUtils.ThreeTabs}this.ContractHandler.QueryDeserializingToObjectAsync<{messageType}, {functionOutputDTOType}>({messageVariableName}, blockParameterVal)
{SpaceUtils.ThreeTabs}");
            }

            if (functionABIModel.IsSingleOutput() && !functionABIModel.IsTransaction())
            {
                if (functionABI.OutputParameters != null && functionABI.OutputParameters.Length == 1 &&
                    functionABI.Constant)
                {
                    var type = functionABIModel.GetSingleOutputReturnType();

                    return
                        ($@"{SpaceUtils.TwoTabs}member this.{functionNameUpper}QueryAsync({messageVariableName}: {messageType}, ?blockParameter: BlockParameter): Task<{type}> =
{SpaceUtils.ThreeTabs}let blockParameterVal = defaultArg blockParameter null
{SpaceUtils.ThreeTabs}this.ContractHandler.QueryAsync<{messageType}, {type}>({messageVariableName}, blockParameterVal)
{SpaceUtils.ThreeTabs}");
                }
            }

            if (functionABIModel.IsTransaction())
            {
                var transactionRequest =
                    $@"{SpaceUtils.TwoTabs}member this.{functionNameUpper}RequestAsync({messageVariableName}: {messageType}): Task<string> =
{SpaceUtils.ThreeTabs}this.ContractHandler.SendRequestAsync({messageVariableName});
{SpaceUtils.TwoTabs}";

                var transactionRequestAndReceipt =
                    $@"{SpaceUtils.TwoTabs}member this.{functionNameUpper}RequestAndWaitForReceiptAsync({messageVariableName}: {messageType}, ?cancellationTokenSource : CancellationTokenSource): Task<TransactionReceipt> =
{SpaceUtils.ThreeTabs}let cancellationTokenSourceVal = defaultArg cancellationTokenSource null
{SpaceUtils.ThreeTabs}this.ContractHandler.SendRequestAndWaitForReceiptAsync({messageVariableName}, cancellationTokenSourceVal);
{SpaceUtils.TwoTabs}";

                return(transactionRequest + Environment.NewLine + transactionRequestAndReceipt);
            }

            return(null);
        }
예제 #19
0
        protected FunctionBase(IClient rpcClient, Contract contract, FunctionABI functionABI)
        {
            FunctionABI             = functionABI;
            this.rpcClient          = rpcClient;
            this.contract           = contract;
            this.ethCall            = new EthCall(rpcClient);
            this.ethSendTransaction = new EthSendTransaction(rpcClient);

            this.FunctionCallDecoder = new FunctionCallDecoder();
            this.FunctionCallEncoder = new FunctionCallEncoder();
        }
예제 #20
0
        public static byte[] GetMethodId(FunctionABI func)
        {
            List <Parameter> list = new List <Parameter>(func.InputParameters);

            byte[] hash = DigestUtilities.CalculateDigest
                              ("SM3", System.Text.Encoding.UTF8.GetBytes(string.Format("{0}({1})", func.Name,
                                                                                       string.Join(',', list.ConvertAll(a => a.Type)))));
            byte[] id = new byte[4];
            Array.Copy(hash, id, 4);
            return(id);
        }
예제 #21
0
 protected FunctionBase(IClient rpcClient, Contract contract, FunctionABI functionABI)
 {
     FunctionABI                    = functionABI;
     this.rpcClient                 = rpcClient;
     this.contract                  = contract;
     ethCall                        = new EthCall(rpcClient);
     ethSendTransaction             = new EthSendTransaction(rpcClient);
     ethEstimateGas                 = new EthEstimateGas(rpcClient);
     personalSignAndSendTransaction = new PersonalSignAndSendTransaction(rpcClient);
     FunctionCallDecoder            = new FunctionCallDecoder();
     FunctionCallEncoder            = new FunctionCallEncoder();
 }
예제 #22
0
        public string FunctionGen(FunctionABI function)
        {
            var functionGet         = FunctionGet(function.Name);
            var functionCall        = FunctionCall(function);
            var functionTransaction = FunctionTransaction(function);
            var builder             = new StringBuilder();

            builder.AppendLine(functionGet);
            builder.AppendLine(functionCall);
            builder.AppendLine(functionTransaction);
            return(builder.ToString());
        }
예제 #23
0
        public string GenerateClass(FunctionABI functionABI)
        {
            if (_functionOutputDTOModel.CanGenerateOutputDTO(functionABI))
            {
                return
                    ($@"{SpaceUtils.OneTab}[FunctionOutput]
{SpaceUtils.OneTab}public class {_functionOutputDTOModel.GetFunctionOutputTypeName(functionABI)}
{SpaceUtils.OneTab}{{
{_parameterABIFunctionDTOTemplate.GenerateAllProperties(functionABI.OutputParameters)}
{SpaceUtils.OneTab}}}");
            }
            return(null);
        }
예제 #24
0
     public string GenerateClass(FunctionABI functionABI)
     {
         if (functionABIFunctionOutputDtoModel.CanGenerateOutputDTO(functionABI))
         {
             return
                 ($@"[FunctionOutput]
 public class {functionABIFunctionOutputDtoModel.GetFunctionOutputTypeName(functionABI)}
 {{
     {parameterABIFunctionDtoClassTemplate.GenerateAllProperties(functionABI.OutputParameters)}
 }}");
         }
         return(null);
     }
예제 #25
0
        public void GeneratesExpectedProtoBufferContent()
        {
            var constructorAbi = new ConstructorABI()
            {
                InputParameters = new[]
                {
                    new ParameterABI("bytes32", "ownerId", 1)
                }
            };

            var functionAbi1 = new FunctionABI("recordHousePurchase", false)
            {
                InputParameters = new[]
                {
                    new ParameterABI("bytes32", "propertyId", 1),
                    new ParameterABI("bytes32", "buyerId", 2),
                    new ParameterABI("uint32", "date", 3),
                    new ParameterABI("uint32", "price", 4),
                },
                OutputParameters = new[]
                {
                    new ParameterABI("uint"),
                }
            };

            var eventAbi1 = new EventABI("HousePurchased")
            {
                InputParameters = new[]
                {
                    new ParameterABI("int32", "purchaseId", 1),
                    new ParameterABI("bytes32", "propertyId", 2),
                    new ParameterABI("bytes32", "buyerId", 3),
                    new ParameterABI("uint32", "date", 4),
                    new ParameterABI("uint32", "price", 5),
                }
            };

            var contractABI = new ContractABI
            {
                Constructor = constructorAbi,
                Functions   = new[] { functionAbi1 },
                Events      = new[] { eventAbi1 }
            };

            var generator = new ContractABIToProtoGenerator(contractABI, "Proxy.Ethereum.Samples.HousePurchase", "HousePurchase");
            var actualProtoFileContent = generator.GenerateFileContent();

            var expectedContent = GetExpectedProtoContent("ContractABIToProto.01.proto");

            Assert.Equal(expectedContent, actualProtoFileContent);
        }
예제 #26
0
        public string GenerateFullClass(FunctionABI functionABI, string namespaceName)
        {
            return
                ($@"using System;
using System.Threading.Tasks;
using System.Numerics;
using Nethereum.Hex.HexTypes;
using Nethereum.ABI.FunctionEncoding.Attributes;
namespace {namespaceName}
{{
{GenerateClass(functionABI)}
}}
");
        }
예제 #27
0
        public string FunctionCall(FunctionABI function)
        {
            var functionNameUpper = MakeFirstCharUpper(function.Name);
            var parameters        = GetFunctionParameters(function.InputParameters);
            var callParameters    = GetFunctionCallParameters(function.InputParameters);
            var returnType        = "";

            if (function.OutputParameters != null && function.OutputParameters.Length > 0)
            {
                returnType = GetTypeMap(function.OutputParameters.FirstOrDefault().ABIType.Name);
            }

            return(string.Format(FunctionCallTemplate, functionNameUpper, parameters, callParameters, "<" + returnType + ">"));
        }
        static FunctionOutputDTOGenerator CreateGenerator()
        {
            var contractAbi = new ContractABI();
            var functionAbi = new FunctionABI("GetCar", true, contractAbi)
            {
                OutputParameters = new[] {
                    new ParameterABI("uint", order: 1),
                    new ParameterABI("string", order: 2)
                }
            };

            contractAbi.Functions = new FunctionABI[] { functionAbi };

            return(new FunctionOutputDTOGenerator(functionAbi, "DefaultNamespace", CodeGenLanguage.CSharp));
        }
예제 #29
0
        public string FunctionTransaction(FunctionABI function)
        {
            if (!function.Constant)
            {
                var functionNameUpper = MakeFirstCharUpper(function.Name);
                var parameters        = GetFunctionParameters(function.InputParameters);
                var callParameters    = GetFunctionCallParameters(function.InputParameters);
                if (!string.IsNullOrEmpty(callParameters))
                {
                    callParameters = callParameters + ",";
                }
                return(string.Format(FunctionTransactionTemplate, functionNameUpper, parameters, callParameters));
            }

            return("");
        }
예제 #30
0
        public string GenerateMethod(FunctionABI functionABI)
        {
            var messageType         = _functionCQSMessageModel.GetFunctionMessageTypeName(functionABI);
            var messageVariableName = _functionCQSMessageModel.GetFunctionMessageVariableName(functionABI);

            if (_functionOutputDTOModel.CanGenerateOutputDTO(functionABI))
            {
                var functionOutputDTOType = _functionOutputDTOModel.GetFunctionOutputTypeName(functionABI);
                return
                    ($@"{SpaceUtils.TwoTabs}public Task<{functionOutputDTOType}> {_commonGenerators.GenerateClassName(functionABI.Name)}QueryAsync({messageType} {messageVariableName}, BlockParameter blockParameter = null)
{SpaceUtils.TwoTabs}{{
{SpaceUtils.ThreeTabs}return ContractHandler.QueryDeserializingToObjectAsync<{messageType}, {functionOutputDTOType}>({messageVariableName}, blockParameter);
{SpaceUtils.TwoTabs}}}");
            }

            if (functionABI.OutputParameters != null && functionABI.OutputParameters.Length == 1 &&
                functionABI.Constant)
            {
                var type = _abiTypeToCSharpType.GetTypeMap(functionABI.OutputParameters[0].Type);

                return
                    ($@"{SpaceUtils.TwoTabs}public Task<{type}> {_commonGenerators.GenerateClassName(functionABI.Name)}QueryAsync({messageType} {messageVariableName}, BlockParameter blockParameter = null)
{SpaceUtils.TwoTabs}{{
{SpaceUtils.ThreeTabs}return ContractHandler.QueryAsync<{messageType}, {type}>({messageVariableName}, blockParameter);
{SpaceUtils.TwoTabs}}}");
            }

            if (functionABI.Constant == false || (functionABI.OutputParameters == null || functionABI.OutputParameters.Length == 0))
            {
                var transactionRequest =
                    $@"{SpaceUtils.TwoTabs}public Task<string> {_commonGenerators.GenerateClassName(functionABI.Name)}RequestAsync({messageType} {messageVariableName})
{SpaceUtils.TwoTabs}{{
{SpaceUtils.ThreeTabs} return ContractHandler.SendRequestAsync({messageVariableName});
{SpaceUtils.TwoTabs}}}";

                var transactionRequestAndReceipt =
                    $@"{SpaceUtils.TwoTabs}public Task<TransactionReceipt> {_commonGenerators.GenerateClassName(functionABI.Name)}RequestAndWaitForReceiptAsync({messageType} {messageVariableName}, CancellationTokenSource cancellationToken = null)
{SpaceUtils.TwoTabs}{{
{SpaceUtils.ThreeTabs} return ContractHandler.SendRequestAndWaitForReceiptAsync({messageVariableName}, cancellationToken);
{SpaceUtils.TwoTabs}}}";

                return(transactionRequest + Environment.NewLine + transactionRequestAndReceipt);
            }

            return(null);
        }