/* This file is part of solidity. solidity is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. solidity is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with solidity. If not, see . */ #include #include #include #include #include #include #include using namespace dev; using namespace langutil; using namespace solidity; using namespace dev::solidity::test; using namespace std; using namespace soltest; dev::solidity::test::ParameterList ContractABIUtils::parametersFromJson( Json::Value const& _contractABI, string const& _functionName ) const { ParameterList abiParams; for (auto const& function: _contractABI) if (function["name"] == _functionName) for (auto const& output: function["outputs"]) { auto types = fromTypeName(output["type"].asString()); for (auto const& type: types) abiParams.push_back(Parameter{bytes(), "", type, FormatInfo{}}); } return abiParams; } std::vector ContractABIUtils::fromTypeName(string const& _type) const { static regex s_boolType{"(bool)"}; static regex s_uintType{"(uint\\d*)"}; static regex s_intType{"(int\\d*)"}; static regex s_bytesType{"(bytes\\d+)"}; static regex s_dynBytesType{"(\\bbytes\\b)"}; static regex s_stringType{"(string)"}; vector abiTypes; if (regex_match(_type, s_boolType)) abiTypes.push_back(ABIType{ABIType::Boolean, ABIType::AlignRight, 32}); else if (regex_match(_type, s_uintType)) abiTypes.push_back(ABIType{ABIType::UnsignedDec, ABIType::AlignRight, 32}); else if (regex_match(_type, s_intType)) abiTypes.push_back(ABIType{ABIType::SignedDec, ABIType::AlignRight, 32}); else if (regex_match(_type, s_bytesType)) abiTypes.push_back(ABIType{ABIType::Hex, ABIType::AlignRight, 32}); else if (regex_match(_type, s_dynBytesType)) { abiTypes.push_back(ABIType{ABIType::UnsignedDec, ABIType::AlignRight, 32}); abiTypes.push_back(ABIType{ABIType::UnsignedDec, ABIType::AlignRight, 32}); abiTypes.push_back(ABIType{ABIType::HexString, ABIType::AlignLeft, 32}); } else if (regex_match(_type, s_stringType)) { abiTypes.push_back(ABIType{ABIType::UnsignedDec, ABIType::AlignRight, 32}); abiTypes.push_back(ABIType{ABIType::UnsignedDec, ABIType::AlignRight, 32}); abiTypes.push_back(ABIType{ABIType::String, ABIType::AlignLeft, 32}); } else abiTypes.push_back(ABIType{ABIType::None, ABIType::AlignRight, 0}); return abiTypes; }