diff --git a/AST.cpp b/AST.cpp index d7bfb0d34..10464726e 100644 --- a/AST.cpp +++ b/AST.cpp @@ -152,6 +152,23 @@ void ContractDefinition::checkIllegalOverrides() const } } +std::vector> const& ContractDefinition::getInterfaceEvents() const +{ + if (!m_interfaceEvents) + { + set eventsSeen; + m_interfaceEvents.reset(new std::vector>()); + for (ContractDefinition const* contract: getLinearizedBaseContracts()) + for (ASTPointer const& e: contract->getEvents()) + if (eventsSeen.count(e->getName()) == 0) + { + eventsSeen.insert(e->getName()); + m_interfaceEvents->push_back(e); + } + } + return *m_interfaceEvents; +} + vector, FunctionTypePointer>> const& ContractDefinition::getInterfaceFunctionList() const { if (!m_interfaceFunctionList) diff --git a/AST.h b/AST.h index 113daf72e..fefd0e947 100755 --- a/AST.h +++ b/AST.h @@ -222,6 +222,7 @@ public: std::vector> const& getFunctionModifiers() const { return m_functionModifiers; } std::vector> const& getDefinedFunctions() const { return m_definedFunctions; } std::vector> const& getEvents() const { return m_events; } + std::vector> const& getInterfaceEvents() const; virtual TypePointer getType(ContractDefinition const* m_currentContract) const override; @@ -257,6 +258,7 @@ private: std::vector m_linearizedBaseContracts; mutable std::unique_ptr, FunctionTypePointer>>> m_interfaceFunctionList; + mutable std::unique_ptr>> m_interfaceEvents; }; class InheritanceSpecifier: public ASTNode diff --git a/InterfaceHandler.cpp b/InterfaceHandler.cpp index c4bed99f7..e9c74fb8a 100644 --- a/InterfaceHandler.cpp +++ b/InterfaceHandler.cpp @@ -37,16 +37,11 @@ std::unique_ptr InterfaceHandler::getDocumentation(ContractDefiniti std::unique_ptr InterfaceHandler::getABIInterface(ContractDefinition const& _contractDef) { - Json::Value methods(Json::arrayValue); - + Json::Value abi(Json::arrayValue); for (auto const& it: _contractDef.getInterfaceFunctions()) { Json::Value method; - Json::Value inputs(Json::arrayValue); - Json::Value outputs(Json::arrayValue); - - auto populateParameters = [](vector const& _paramNames, - vector const& _paramTypes) + auto populateParameters = [](vector const& _paramNames, vector const& _paramTypes) { Json::Value params(Json::arrayValue); solAssert(_paramNames.size() == _paramTypes.size(), "Names and types vector size does not match"); @@ -66,9 +61,28 @@ std::unique_ptr InterfaceHandler::getABIInterface(ContractDefinitio it.second->getParameterTypeNames()); method["outputs"] = populateParameters(it.second->getReturnParameterNames(), it.second->getReturnParameterTypeNames()); - methods.append(method); + abi.append(method); } - return std::unique_ptr(new std::string(m_writer.write(methods))); + + for (auto const& it: _contractDef.getInterfaceEvents()) + { + Json::Value event; + event["type"] = "event"; + event["name"] = it->getName(); + Json::Value params(Json::arrayValue); + for (auto const& p: it->getParameters()) + { + Json::Value input; + input["name"] = p->getName(); + input["type"] = p->getType()->toString(); + input["indexed"] = p->isIndexed(); + params.append(input); + } + event["inputs"] = params; + abi.append(event); + } + + return std::unique_ptr(new std::string(m_writer.write(abi))); } unique_ptr InterfaceHandler::getABISolidityInterface(ContractDefinition const& _contractDef) @@ -94,6 +108,17 @@ unique_ptr InterfaceHandler::getABISolidityInterface(ContractDefinition ret.pop_back(); ret += "{}"; } + for (auto const& it: _contractDef.getInterfaceEvents()) + { + std::string params; + for (auto const& p: it->getParameters()) + params += (params.empty() ? "(" : ",") + p->getType()->toString() + (p->isIndexed() ? " indexed " : " ") + p->getName(); + if (!params.empty()) + params += ")"; + + ret += "event " + it->getName() + params + ";"; + } + return unique_ptr(new string(ret + "}")); }