SolidityModifier CreateAddressGuard() { //Initialize the modifier using the generated name SolidityModifier addressGuard = new SolidityModifier(ConversionTemplates.AddressGuardModifierName(GetElementCallName())); addressGuard.AddParameters(processConverter.GetIdentifiersAsParameters()); //Address is force assigned if (userTaskElement.Assignee.Address != null) { SolidityStatement requireStatement = new SolidityStatement($"require(msg.sender=={GetAssigneeAddress()})"); addressGuard.AddToBody(requireStatement); } //Address is not force assigned, it will be assigned to the first caller of the first task method containing this assignee else if (userTaskElement.Assignee.Name != null) { var addressPosition = $"{ConverterConfig.ADDRESS_MAPPING_VAR_NAME}[\"{userTaskElement.Assignee.Name}\"]"; var ifElseBlock = new SolidityIfElse(); //Assigns the address, if address has not been been yet assigned to the assignee ifElseBlock.AddConditionBlock($"{addressPosition} == address(0x0)", new SolidityStatement($"{addressPosition} = msg.sender")); //Checks whether the sender has the required address SolidityStatement requireStatement = new SolidityStatement($"require(msg.sender=={addressPosition})"); addressGuard.AddToBody(ifElseBlock); addressGuard.AddToBody(requireStatement); } return(addressGuard); }
SolidityFunction CreateElementMainFunction() { SolidityFunction function = new SolidityFunction(GetElementCallName(), SolidityVisibility.Public); function.AddModifier($"{ConversionTemplates.StateGuardModifierName(GetElementCallName())}({processConverter.GetIdentifierNames()})"); function.AddParameters(processConverter.GetIdentifiersAsParameters()); if (IsAddressGuardRequired()) { function.AddModifier($"{ConversionTemplates.AddressGuardModifierName(GetElementCallName())}({processConverter.GetIdentifierNames()})"); } boundaryEventCalls.ForEach(c => function.AddToBody(c)); function.AddToBody(new SolidityStatement(userTaskElement.ValidationScript, false)); if (userTaskElement.Form.Fields != null) { foreach (var field in userTaskElement.Form.Fields) { //TODO: throw exception if no property has been found var propertyAndEntity = processConverter.GetPropertyAndEntity(field.PropertyExpression); var property = propertyAndEntity.Item1; var entity = propertyAndEntity.Item2; var formPropertyDisplayName = Helpers.ToLowerCamelCase(field.DisplayName); function.AddParameter(new SolidityParameter(Helpers.PropertyTypeToString(property, processConverter.ContractConverter), formPropertyDisplayName)); } } function.AddToBody(CreateCallNextBody()); return(function); }