예제 #1
0
        private async Task <EventABI[]> GetEventAbisAsync(IEventSubscriptionDto eventSubscription)
        {
            if (eventSubscription.ContractId == null)
            {
                return(null);
            }

            if (!eventSubscription.CatchAllContractEvents && eventSubscription.EventSignatures.Count == 0)
            {
                return(null);
            }

            var contractDto = await SubscriberContractRepository.GetAsync(eventSubscription.SubscriberId, eventSubscription.ContractId.Value).ConfigureAwait(false);

            ContractABI contractAbi = contractDto.Abi == null ? null : _abiDeserializer.DeserialiseContract(contractDto.Abi);

            if (contractAbi == null)
            {
                return(null);
            }

            if (eventSubscription.CatchAllContractEvents)
            {
                return(contractAbi.Events);
            }

            return(contractAbi.Events.Where(e => eventSubscription.EventSignatures.Contains(e.Sha3Signature)).ToArray());
        }
예제 #2
0
        static ServiceGenerator CreateGenerator()
        {
            var contractABI = new ContractABI
            {
                Constructor = new ConstructorABI
                {
                    InputParameters = new[] { new ParameterABI("byte32", "owner") }
                },
            };

            contractABI.Functions = new[]
            {
                new FunctionABI("addAdministrator", false, contractABI)
                {
                    InputParameters  = new[] { new ParameterABI("bytes32", "administratorId", 1) },
                    OutputParameters = new[] { new ParameterABI("bool", 1) }
                }
            };
            contractABI.Events = new[]
            {
                new EventABI("AdministratorAdded", contractABI)
                {
                    InputParameters = new[] { new ParameterABI("bytes32", "administratorId", 1) }
                }
            };


            return(new ServiceGenerator(contractABI, "StandardContract", "0x123456", "DefaultNamespace", "CQS", "Functions", CodeGenLanguage.CSharp));
        }
예제 #3
0
 public ConsoleGenerator(ContractABI contractABI, string contractName, string byteCode, string @namespace, string cqsNamespace, string functionOutputNamespace, CodeGenLanguage codeGenLanguage)
 {
     ContractABI = contractABI;
     ClassModel  = new ConsoleModel(contractABI, contractName, byteCode, @namespace, cqsNamespace, functionOutputNamespace);
     ClassModel.CodeGenLanguage = codeGenLanguage;
     InitialiseTemplate(codeGenLanguage);
 }
예제 #4
0
        private ContractABI DeserialiseContractBody(List <IDictionary <string, object> > contract)
        {
            var            functions   = new List <FunctionABI>();
            var            events      = new List <EventABI>();
            ConstructorABI constructor = null;

            foreach (IDictionary <string, object> element in contract)
            {
                if ((string)element["type"] == "function")
                {
                    functions.Add(BuildFunction(element));
                }
                if ((string)element["type"] == "event")
                {
                    events.Add(BuildEvent(element));
                }
                if ((string)element["type"] == "constructor")
                {
                    constructor = BuildConstructor(element);
                }
            }

            var contractABI = new ContractABI();

            contractABI.Functions   = functions.ToArray();
            contractABI.Constructor = constructor;
            contractABI.Events      = events.ToArray();

            return(contractABI);
        }
 public FunctionMockupMethodCSharpTemplate(ContractABI contractAbi)
 {
     _contractAbi      = contractAbi;
     _typeConvertor    = new ABITypeToCSharpType();
     _commonGenerators = new CommonGenerators();
     _parameterAbiFunctionDtocSharpTemplate = new ParameterABIFunctionDTOCSharpTemplate();
 }
예제 #6
0
 public ContractProjectGenerator(ContractABI contractABI,
                                 string contractName,
                                 string byteCode,
                                 string baseNamespace,
                                 string serviceNamespace,
                                 string cqsNamespace,
                                 string dtoNamespace,
                                 string baseOutputPath,
                                 string pathDelimiter,
                                 CodeGenLanguage codeGenLanguage)
 {
     ContractABI      = contractABI;
     ContractName     = contractName;
     ByteCode         = byteCode;
     BaseNamespace    = baseNamespace;
     ServiceNamespace = serviceNamespace;
     CQSNamespace     = cqsNamespace;
     DTONamespace     = dtoNamespace;
     BaseOutputPath   = baseOutputPath?.TrimEnd(pathDelimiter.ToCharArray());
     PathDelimiter    = pathDelimiter;
     CodeGenLanguage  = codeGenLanguage;
     if (BaseOutputPath != null)
     {
         if (BaseOutputPath.LastIndexOf(PathDelimiter) > 0)
         {
             ProjectName = BaseOutputPath.Substring(
                 BaseOutputPath.LastIndexOf(PathDelimiter) + PathDelimiter.Length);
         }
     }
 }
        public ContractABI ExtractContractABI(params Type[] contractMessagesTypes)
        {
            var contractABI = new ContractABI();
            var functions   = new List <FunctionABI>();
            var events      = new List <EventABI>();
            var errors      = new List <ErrorABI>();

            foreach (var contractMessageType in contractMessagesTypes)
            {
                if (FunctionAttribute.IsFunctionType(contractMessageType))
                {
                    functions.Add(ExtractFunctionABI(contractMessageType));
                }

                if (EventAttribute.IsEventType(contractMessageType))
                {
                    events.Add(ExtractEventABI(contractMessageType));
                }

                if (ErrorAttribute.IsErrorType(contractMessageType))
                {
                    errors.Add(ExtractErrorABI(contractMessageType));
                }
            }

            contractABI.Functions = functions.ToArray();
            contractABI.Events    = events.ToArray();
            contractABI.Errors    = errors.ToArray();
            return(contractABI);
        }
 public ContractDefinition(string abi, string runtimeByteCode, string byteCode)
 {
     Abi             = abi;
     RuntimeByteCode = runtimeByteCode;
     ByteCode        = byteCode;
     ContractAbi     = new ABIDeserialiser().DeserialiseContract(abi);
 }
 public EventABI BuildEvent(IDictionary <string, object> eventobject, ContractABI contractAbi)
 {
     return(new EventABI((string)eventobject["name"], contractAbi)
     {
         InputParameters = this.BuildEventParameters((List <object>)eventobject["inputs"])
     });
 }
예제 #10
0
        public ContractABI DeserialiseContract(string abi)
        {
            var            convertor   = new ExpandoObjectConverter();
            var            contract    = JsonConvert.DeserializeObject <List <Dictionary <string, object> > >(abi, convertor);
            var            functions   = new List <FunctionABI>();
            var            events      = new List <EventABI>();
            ConstructorABI constructor = null;

            foreach (IDictionary <string, object> element in contract)
            {
                if ((string)element["type"] == "function")
                {
                    functions.Add(BuildFunction(element));
                }
                if ((string)element["type"] == "event")
                {
                    events.Add(BuildEvent(element));
                }
                if ((string)element["type"] == "constructor")
                {
                    constructor = BuildConstructor(element);
                }
            }

            var contractABI = new ContractABI();

            contractABI.Functions   = functions.ToArray();
            contractABI.Constructor = constructor;
            contractABI.Events      = events.ToArray();

            return(contractABI);
        }
        public ContractABIToProtoGenerator(ContractABI contractABI, string @namespace, string name)
        {
            var constructorAbiToProtoGenerator = new ConstructorABIToProtoGenerator(contractABI.Constructor, name);
            var functionAbiToProtoGenerators   = contractABI.Functions.Select(f => new FunctionABIToProtoGenerator(f)).ToArray();
            var eventAbiToProtoGenerators      = contractABI.Events.Select(e => new EventABIToProtoGenerator(e)).ToArray();

            ClassModel    = new ContractABIToProtoModel(name, "", constructorAbiToProtoGenerator, functionAbiToProtoGenerators, eventAbiToProtoGenerators);
            ClassTemplate = new ContractABIToProtoTemplate(ClassModel, @namespace);
        }
예제 #12
0
        public string FunctionsGen(ContractABI contract)
        {
            var builder = new StringBuilder();

            foreach (var function in contract.Functions)
            {
                builder.AppendLine(FunctionGen(function));
            }
            return(builder.ToString());
        }
예제 #13
0
        public string EventsGen(ContractABI contract)
        {
            var builder = new StringBuilder();

            foreach (var eventAbi in contract.Events)
            {
                builder.AppendLine(EventGet(eventAbi.Name));
            }
            return(builder.ToString());
        }
예제 #14
0
        public ServiceModel(string abi, string byteCode, string contractName = DEFAULT_CONTRACTNAME,
                            string namespaceName = DEFAULT_NAMESPACE)
        {
            ContractName = CapitaliseFirstChar(contractName);
            Namespace    = CapitaliseFirstChar(namespaceName);
            Abi          = abi;
            ByteCode     = byteCode;
            var des = new ABIDeserialiser();

            Contract = des.DeserialiseContract(abi);
        }
예제 #15
0
        static EventDTOGenerator CreateGenerator()
        {
            var contractAbi = new ContractABI();
            var eventAbi    = new EventABI("ItemAdded", contractAbi)
            {
                InputParameters = new[] { new ParameterABI("uint256", "itemId") }
            };

            contractAbi.Events = new EventABI[] { eventAbi };
            return(new EventDTOGenerator(eventAbi, "DefaultNamespace", CodeGenLanguage.CSharp));
        }
예제 #16
0
        public static byte[] Pack(ContractABI abi, string funcName, object[] args, bool sm)
        {
            if (sm)
            {
                Nethereum.ABI.FunctionEncoding.ParametersEncoder pe = new Nethereum.ABI.FunctionEncoding.ParametersEncoder();

                if (string.IsNullOrEmpty(funcName))
                {
                    return(pe.EncodeParameters(abi.Constructor.InputParameters, args));
                }
                else
                {
                    byte[] arguments = null, id = null;
                    foreach (var item in abi.Functions)
                    {
                        if (item.Name == funcName)
                        {
                            id        = GetMethodId(item);
                            arguments = pe.EncodeParameters(item.InputParameters, args);
                        }
                    }
                    byte[] hash = new byte[arguments.Length + id.Length];
                    Array.Copy(id, 0, hash, 0, id.Length);
                    Array.Copy(arguments, 0, hash, id.Length, arguments.Length);
                    return(hash);
                }
            }
            else
            {
                Nethereum.ABI.FunctionEncoding.ParametersEncoder pe = new Nethereum.ABI.FunctionEncoding.ParametersEncoder();

                if (string.IsNullOrEmpty(funcName))
                {
                    return(pe.EncodeParameters(abi.Constructor.InputParameters, args));
                }
                else
                {
                    byte[] arguments = null, id = null;
                    foreach (var item in abi.Functions)
                    {
                        if (item.Name == funcName)
                        {
                            id        = Hex.Decode(item.Sha3Signature);
                            arguments = pe.EncodeParameters(item.InputParameters, args);
                        }
                    }
                    byte[] hash = new byte[arguments.Length + id.Length];
                    Array.Copy(id, 0, hash, 0, id.Length);
                    Array.Copy(arguments, 0, hash, id.Length, arguments.Length);
                    return(hash);
                }
            }
        }
 private static ConstructorABI GetConstructor(ContractABI baseContractABI)
 {
     if (baseContractABI.Constructor == null)
     {
         return(new ConstructorABI());
     }
     return(new ConstructorABI
     {
         InputParameters = baseContractABI.Constructor.InputParameters
                           .Select(p => new ParameterABI(p.Type, p.Name, p.Order)).ToArray()
     });
 }
 public SimpleTestModel(ContractABI contractABI, string contractName,
                        string @namespace,
                        string cqsNamespace, string functionOutputNamespace) :
     base(@namespace, contractName, "Test")
 {
     ContractABI             = contractABI;
     CQSNamespace            = cqsNamespace;
     FunctionOutputNamespace = functionOutputNamespace;
     InitisialiseNamespaceDependencies();
     NamespaceDependencies.Add(cqsNamespace);
     NamespaceDependencies.Add(functionOutputNamespace);
 }
예제 #19
0
 public ServiceModel(ContractABI contractABI, string contractName,
                     string byteCode, string @namespace,
                     string cqsNamespace, string functionOutputNamespace) :
     base(@namespace, contractName, "Service")
 {
     ContractABI                       = contractABI;
     CQSNamespace                      = cqsNamespace;
     FunctionOutputNamespace           = functionOutputNamespace;
     ContractDeploymentCQSMessageModel = new ContractDeploymentCQSMessageModel(contractABI.Constructor, cqsNamespace, byteCode, contractName);
     InitisialiseNamespaceDependencies();
     NamespaceDependencies.Add(cqsNamespace);
     NamespaceDependencies.Add(functionOutputNamespace);
 }
        static FunctionCQSMessageGenerator CreateGenerator()
        {
            var contractAbi = new ContractABI();
            var functionAbi = new FunctionABI("BaseStats", constant: true, contractAbi)
            {
                InputParameters  = new[] { new ParameterABI("uint256", "_number") },
                OutputParameters = new[] { new ParameterABI("uint256") }
            };

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

            return(new FunctionCQSMessageGenerator(functionAbi, "DefaultNamespace", "FunctionOutput", CodeGenLanguage.CSharp));
        }
예제 #21
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);
        }
예제 #22
0
        public void GeneratesExpectedFileName()
        {
            var abi = new ContractABI
            {
                Constructor = new ConstructorABI(),
                Functions   = new FunctionABI[0],
                Events      = new EventABI[0]
            };

            var generator      = new ContractABIToProtoGenerator(abi, "DefaultNamespace", "RecordHousePurchaseMessages");
            var actualFileName = generator.GetFileName();

            Assert.Equal("RecordHousePurchaseMessages.proto", actualFileName);
        }
        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));
        }
        //Workaround when we don't have the internal type
        public void SetTupleTypeSameAsNameIfRequired(ContractABI contract)
        {
            foreach (var function in contract.Functions)
            {
                SetTupleTypeSameAsNameIfRequired(function.InputParameters);
                SetTupleTypeSameAsNameIfRequired(function.OutputParameters);
            }

            foreach (var eventItem in contract.Events)
            {
                SetTupleTypeSameAsNameIfRequired(eventItem.InputParameters);
            }

            if (contract.Constructor != null)
            {
                SetTupleTypeSameAsNameIfRequired(contract.Constructor.InputParameters);
            }
        }
        public ContractABI DeserialiseABI(string abi)
        {
            var expandoObjectConverter = new ExpandoObjectConverter();
            var dictionaryList         = JsonConvert.DeserializeObject <List <IDictionary <string, object> > >(abi, expandoObjectConverter);
            var functionAbiList        = new List <FunctionABI>();
            var eventAbiList           = new List <EventABI>();
            var errorAbiList           = new List <ErrorABI>();
            var constructorAbi         = new ConstructorABI();
            var contractAbi            = new ContractABI();

            foreach (IDictionary <string, object> dictionary in dictionaryList)
            {
                if ((string)dictionary["type"] == "function")
                {
                    functionAbiList.Add(this.BuildFunction(dictionary, contractAbi));
                }
                if ((string)dictionary["type"] == "event")
                {
                    eventAbiList.Add(this.BuildEvent(dictionary, contractAbi));
                }
                if ((string)dictionary["type"] == "error")
                {
                    errorAbiList.Add(this.BuildError(dictionary, contractAbi));
                }
                if ((string)dictionary["type"] == "constructor")
                {
                    constructorAbi = this.BuildConstructor(dictionary);
                }
            }

            contractAbi.Functions   = functionAbiList.ToArray();
            contractAbi.Constructor = constructorAbi;
            contractAbi.Events      = eventAbiList.ToArray();
            contractAbi.Errors      = errorAbiList.ToArray();



            var structs = _structDeserialiser.GetStructsFromAbi(abi);

            contractAbi.Structs = structs;
            _structDeserialiser.SetTupleTypeSameAsNameIfRequired(contractAbi);

            return(contractAbi);
        }
        public ContractABI DeserialiseABI(string abi)
        {
            var abiDeserialiser = new ABIDeserialiser();

            var baseContractABI = abiDeserialiser.DeserialiseContract(abi);

            var contractABI = new ContractABI
            {
                Constructor = GetConstructor(baseContractABI),
                Functions   = baseContractABI.Functions.Select(f =>
                {
                    return(new FunctionABI(f.Name, f.Constant, f.Serpent)
                    {
                        InputParameters =
                            f.InputParameters.Select(p => new ParameterABI(p.Type, p.Name, p.Order))
                            .ToArray(),
                        OutputParameters =
                            f.OutputParameters.Select(p => new ParameterABI(p.Type, p.Name, p.Order))
                            .ToArray()
                    });
                }).ToArray(),
                Events = baseContractABI.Events.Select(e =>
                {
                    return(new EventABI(e.Name)
                    {
                        InputParameters =
                            e.InputParameters.Select(p => new ParameterABI(p.Type, p.Name, p.Order)
                        {
                            Indexed = p.Indexed
                        })
                            .ToArray()
                    });
                }).ToArray()
            };

            var structDeserialiser = new StructABIDeserialiser();
            var structs            = structDeserialiser.GetStructsFromAbi(abi);

            contractABI.Structs = structs;
            structDeserialiser.SetTupleTypeSameAsName(contractABI);

            return(contractABI);
        }
        public ContractABI DeserialiseABI(string abi)
        {
            var abiDeserialiser = new ABIDeserialiser();

            var baseContractABI = abiDeserialiser.DeserialiseContract(abi);

            var contractABI = new ContractABI
            {
                Constructor = new ConstructorABI
                {
                    InputParameters = baseContractABI.Constructor.InputParameters
                                      .Select(p => new ParameterABI(p.Type, p.Name, p.Order)).ToArray()
                },
                Functions = baseContractABI.Functions.Select(f =>
                {
                    return(new FunctionABI(f.Name, f.Constant, f.Serpent)
                    {
                        InputParameters =
                            f.InputParameters.Select(p => new ParameterABI(p.Type, p.Name, p.Order))
                            .ToArray(),
                        OutputParameters =
                            f.OutputParameters.Select(p => new ParameterABI(p.Type, p.Name, p.Order))
                            .ToArray()
                    });
                }).ToArray(),
                Events = baseContractABI.Events.Select(e =>
                {
                    return(new EventABI(e.Name)
                    {
                        InputParameters =
                            e.InputParameters.Select(p => new ParameterABI(p.Type, p.Name, p.Order)
                        {
                            Indexed = p.Indexed
                        })
                            .ToArray()
                    });
                }).ToArray()
            };

            return(contractABI);
        }
예제 #28
0
        public ConsoleModel(ContractABI contractABI, string contractName,
                            string byteCode, string @namespace,
                            string cqsNamespace, string functionOutputNamespace) :
            base(@namespace, contractName, "Console")
        {
            ContractABI                       = contractABI;
            CQSNamespace                      = cqsNamespace;
            FunctionOutputNamespace           = functionOutputNamespace;
            ContractDeploymentCQSMessageModel = new ContractDeploymentCQSMessageModel(contractABI.Constructor, cqsNamespace, byteCode, contractName);
            InitialiseNamespaceDependencies();

            if (!string.IsNullOrEmpty(cqsNamespace))
            {
                NamespaceDependencies.Add(cqsNamespace);
            }

            if (!string.IsNullOrEmpty(functionOutputNamespace))
            {
                NamespaceDependencies.Add(functionOutputNamespace);
            }
        }
예제 #29
0
        public ContractABI ExtractContractABI(params string[] signatures)
        {
            var contractABI = new ContractABI();
            var functions   = new List <FunctionABI>();
            var events      = new List <EventABI>();
            var errors      = new List <ErrorABI>();

            foreach (var signature in signatures)
            {
                var match      = Regex.Match(signature.Trim(), @"(?<scope>\w*)\s*(?<name>\w*)\s*" + paramsRegPattern);
                var scope      = match.Groups["scope"].Value;
                var name       = match.Groups["name"].Value;
                var parameters = match.Groups["params"].Value;

                if (scope == "function")
                {
                    functions.Add(ExtractFunctionABI(signature.Trim(), name, parameters));
                }

                if (scope == "event")
                {
                    events.Add(ExtractEventABI(signature.Trim(), name, parameters));
                }

                if (scope == "error")
                {
                    errors.Add(ExtractErrorABI(signature.Trim(), name, parameters));
                }

                if (scope == "constructor")
                {
                    contractABI.Constructor = ExtractConstructorABI(signature.Trim(), name, parameters);
                }
            }

            contractABI.Functions = functions.ToArray();
            contractABI.Events    = events.ToArray();
            contractABI.Errors    = errors.ToArray();
            return(contractABI);
        }
예제 #30
0
 public ContractProjectGenerator(ContractABI contractABI,
                                 string contractName,
                                 string byteCode,
                                 string baseNamespace,
                                 string serviceNamespace,
                                 string cqsNamespace,
                                 string dtoNamespace,
                                 string baseOutputPath,
                                 string pathDelimiter,
                                 CodeGenLanguage codeGenLanguage)
 {
     ContractABI      = contractABI;
     ContractName     = contractName;
     ByteCode         = byteCode;
     BaseNamespace    = baseNamespace;
     ServiceNamespace = serviceNamespace;
     CQSNamespace     = cqsNamespace;
     DTONamespace     = dtoNamespace;
     BaseOutputPath   = baseOutputPath?.TrimEnd(pathDelimiter.ToCharArray());
     PathDelimiter    = pathDelimiter;
     CodeGenLanguage  = codeGenLanguage;
 }