Allow marking free functions as suffixes

This commit is contained in:
Kamil Śliwak 2023-02-24 19:35:45 +01:00
parent 8aa57aec24
commit e9197ff30f
103 changed files with 276 additions and 8 deletions

View File

@ -1,6 +1,7 @@
### 0.8.21 (unreleased)
Language Features:
* General: Introduce literal suffix functions. Free functions can now be marked as suffixes and applied to literals using a new suffix call syntax.
Compiler Features:
@ -13,6 +14,8 @@ Bugfixes:
AST Changes:
* AST: Add ``isSuffixCall`` field to ``FunctionCall`` AST node, which is ``true`` for calls resulting from applying a literal suffix.
* AST: Add ``suffix`` field to ``FunctionDefinition`` AST node, which is ``true`` for free function definitions using the ``suffix`` modifier.
* AST: Add the ``experimentalSolidity`` field to the ``SourceUnit`` nodes, which indicate whether the experimental parsing mode has been enabled via ``pragma experimental solidity``.

View File

@ -426,6 +426,104 @@ bool TypeChecker::visit(FunctionDefinition const& _function)
else if (_function.libraryFunction())
m_errorReporter.typeError(7801_error, _function.location(), "Library functions cannot be \"virtual\".");
}
if (_function.usableAsSuffix())
{
if (_function.stateMutability() != StateMutability::Pure)
m_errorReporter.typeError(
1716_error,
_function.location(),
"Only pure functions can be used as literal suffixes"
);
optional<string> parameterCountMessage;
if (_function.parameterList().parameters().size() == 0)
parameterCountMessage = "Functions that take no arguments cannot be used as literal suffixes.";
else if (_function.parameterList().parameters().size() >= 3)
parameterCountMessage = "Functions that take 3 or more arguments cannot be used as literal suffixes.";
if (parameterCountMessage.has_value())
m_errorReporter.typeError(9128_error, _function.parameterList().location(), parameterCountMessage.value());
else if (_function.parameterList().parameters().size() == 2)
{
auto const* mantissaType = dynamic_cast<IntegerType const*>(_function.parameterList().parameters()[0]->type());
auto const* exponentType = dynamic_cast<IntegerType const*>(_function.parameterList().parameters()[1]->type());
vector<string> mantissaOrExponentTypeErrorMessages;
if (!mantissaType)
mantissaOrExponentTypeErrorMessages.emplace_back("The mantissa parameter must be an integer.");
if (!exponentType)
mantissaOrExponentTypeErrorMessages.emplace_back("The exponent parameter must be an unsigned integer.");
if (!mantissaOrExponentTypeErrorMessages.empty())
m_errorReporter.typeError(
1587_error,
_function.parameterList().location(),
"Literal suffix function has invalid parameter types. " +
joinHumanReadable(mantissaOrExponentTypeErrorMessages, " ")
);
if (exponentType && exponentType->isSigned())
m_errorReporter.typeError(
3123_error,
_function.parameterList().parameters()[1]->typeName().location(),
"The exponent parameter of a literal suffix function must be unsigned. "
"Exponent is always either zero or a negative power of 10 but the parameter represents its absolute value."
);
}
else if (_function.parameterList().parameters().size() == 1)
{
auto const* parameterType = _function.parameterList().parameters()[0]->type();
if (dynamic_cast<FixedPointType const*>(parameterType))
m_errorReporter.typeError(
2699_error,
_function.parameterList().parameters()[0]->location(),
"Parameters of fixed-point types are not allowed in literal suffix functions. "
"To support fractional literals the suffix function must accept two integer arguments "
"(mantissa and exponent) that such literals can be decomposed into."
);
if (
!TypeProvider::boolean()->isImplicitlyConvertibleTo(*parameterType) &&
// ASSUMPTION: There are no address payable literals.
!TypeProvider::address()->isImplicitlyConvertibleTo(*parameterType) &&
// ASSUMPTION: Literal 1 is implicitly convertible to any integer type.
!TypeProvider::rationalNumber(1)->isImplicitlyConvertibleTo(*parameterType) &&
// ASSUMPTION: bytes1 is implicitly convertible to any fixed-bytes type.
!TypeProvider::fixedBytes(1)->isImplicitlyConvertibleTo(*parameterType) &&
!TypeProvider::stringLiteral("a")->isImplicitlyConvertibleTo(*parameterType)
)
m_errorReporter.typeError(
2998_error,
_function.parameterList().parameters()[0]->location(),
"This literal suffix function is not usable as a suffix because no literal is "
"implicitly convertible to its parameter type."
);
}
solAssert(_function.returnParameterList());
if (_function.returnParameterList()->parameters().size() != 1)
{
m_errorReporter.typeError(
7848_error,
_function.returnParameterList()->location(),
"Literal suffix functions must return exactly one value."
);
}
for (ASTPointer<VariableDeclaration const> returnParameter: _function.returnParameterList()->parameters())
{
solAssert(returnParameter);
auto referenceType = dynamic_cast<ReferenceType const*>(returnParameter->type());
auto mappingType = dynamic_cast<MappingType const*>(returnParameter->type());
if (mappingType || (referenceType && !referenceType->dataStoredIn(DataLocation::Memory)))
m_errorReporter.typeError(
7251_error,
returnParameter->location(),
"Literal suffix functions can only return value types and reference types stored in memory."
);
}
}
if (_function.overrides() && _function.isFree())
m_errorReporter.syntaxError(1750_error, _function.location(), "Free functions cannot override.");

View File

@ -951,6 +951,7 @@ public:
bool _free,
Token _kind,
bool _isVirtual,
bool _usableAsSuffix,
ASTPointer<OverrideSpecifier> const& _overrides,
ASTPointer<StructuredDocumentation> const& _documentation,
ASTPointer<ParameterList> const& _parameters,
@ -964,11 +965,14 @@ public:
m_stateMutability(_stateMutability),
m_free(_free),
m_kind(_kind),
m_usableAsSuffix(_usableAsSuffix),
m_functionModifiers(std::move(_modifiers)),
m_body(_body)
{
solAssert(_kind == Token::Constructor || _kind == Token::Function || _kind == Token::Fallback || _kind == Token::Receive, "");
solAssert(isOrdinary() == !name().empty(), "");
if (_usableAsSuffix)
solAssert(_free);
}
void accept(ASTVisitor& _visitor) override;
@ -981,6 +985,7 @@ public:
bool isFallback() const { return m_kind == Token::Fallback; }
bool isReceive() const { return m_kind == Token::Receive; }
bool isFree() const { return m_free; }
bool usableAsSuffix() const { return m_usableAsSuffix; }
Token kind() const { return m_kind; }
bool isPayable() const { return m_stateMutability == StateMutability::Payable; }
std::vector<ASTPointer<ModifierInvocation>> const& modifiers() const { return m_functionModifiers; }
@ -1027,9 +1032,10 @@ public:
) const override;
private:
StateMutability m_stateMutability;
bool m_free;
Token const m_kind;
StateMutability m_stateMutability{};
bool m_free{};
Token const m_kind{};
bool m_usableAsSuffix{};
std::vector<ASTPointer<ModifierInvocation>> m_functionModifiers;
ASTPointer<Block> m_body;
};

View File

@ -458,6 +458,7 @@ bool ASTJsonExporter::visit(FunctionDefinition const& _node)
make_pair("kind", _node.isFree() ? "freeFunction" : TokenTraits::toString(_node.kind())),
make_pair("stateMutability", stateMutabilityToString(_node.stateMutability())),
make_pair("virtual", _node.markedVirtual()),
make_pair("suffix", _node.usableAsSuffix()),
make_pair("overrides", _node.overrides() ? toJson(*_node.overrides()) : Json::nullValue),
make_pair("parameters", toJson(_node.parameterList())),
make_pair("returnParameters", toJson(*_node.returnParameterList())),

View File

@ -557,6 +557,7 @@ ASTPointer<FunctionDefinition> ASTJsonImporter::createFunctionDefinition(Json::V
freeFunction,
kind,
memberAsBool(_node, "virtual"),
memberAsBool(_node, "suffix"),
_node["overrides"].isNull() ? nullptr : createOverrideSpecifier(member(_node, "overrides")),
_node["documentation"].isNull() ? nullptr : createDocumentation(member(_node, "documentation")),
createParameterList(member(_node, "parameters")),

View File

@ -540,7 +540,7 @@ StateMutability Parser::parseStateMutability()
return stateMutability;
}
Parser::FunctionHeaderParserResult Parser::parseFunctionHeader(bool _isStateVariable)
Parser::FunctionHeaderParserResult Parser::parseFunctionHeader(bool _isStateVariable, bool _freeFunction)
{
RecursionGuard recursionGuard(*this);
FunctionHeaderParserResult result;
@ -552,7 +552,18 @@ Parser::FunctionHeaderParserResult Parser::parseFunctionHeader(bool _isStateVari
{
Token token = m_scanner->currentToken();
if (!_isStateVariable && token == Token::Identifier)
result.modifiers.push_back(parseModifierInvocation());
{
if (_freeFunction && currentLiteral() == "suffix")
{
if (result.usableAsSuffix)
parserError(2878_error, "Suffix already specified.");
else
result.usableAsSuffix = true;
advance();
}
else
result.modifiers.push_back(parseModifierInvocation());
}
else if (TokenTraits::isVisibilitySpecifier(token))
{
if (result.visibility != Visibility::Default)
@ -662,7 +673,7 @@ ASTPointer<ASTNode> Parser::parseFunctionDefinition(bool _freeFunction)
name = make_shared<ASTString>();
}
FunctionHeaderParserResult header = parseFunctionHeader(false);
FunctionHeaderParserResult header = parseFunctionHeader(false /* _isStateVariable */, _freeFunction);
ASTPointer<Block> block;
nodeFactory.markEndPosition();
@ -681,6 +692,7 @@ ASTPointer<ASTNode> Parser::parseFunctionDefinition(bool _freeFunction)
_freeFunction,
kind,
header.isVirtual,
header.usableAsSuffix,
header.overrides,
documentation,
header.parameters,
@ -1207,7 +1219,7 @@ ASTPointer<FunctionTypeName> Parser::parseFunctionType()
RecursionGuard recursionGuard(*this);
ASTNodeFactory nodeFactory(*this);
expectToken(Token::Function);
FunctionHeaderParserResult header = parseFunctionHeader(true);
FunctionHeaderParserResult header = parseFunctionHeader(true /* _isStateVariable */, false /* _freeFunction */);
return nodeFactory.createNode<FunctionTypeName>(
header.parameters,
header.returnParameters,

View File

@ -69,6 +69,7 @@ private:
struct FunctionHeaderParserResult
{
bool isVirtual = false;
bool usableAsSuffix = false;
ASTPointer<OverrideSpecifier> overrides;
ASTPointer<ParameterList> parameters;
ASTPointer<ParameterList> returnParameters;
@ -99,7 +100,7 @@ private:
Visibility parseVisibilitySpecifier();
ASTPointer<OverrideSpecifier> parseOverrideSpecifier();
StateMutability parseStateMutability();
FunctionHeaderParserResult parseFunctionHeader(bool _isStateVariable);
FunctionHeaderParserResult parseFunctionHeader(bool _isStateVariable, bool _freeFunction);
ASTPointer<ASTNode> parseFunctionDefinition(bool _freeFunction = false);
ASTPointer<StructDefinition> parseStructDefinition();
ASTPointer<EnumDefinition> parseEnumDefinition();

View File

@ -103,6 +103,7 @@
"scope": 7,
"src": "40:46:0",
"stateMutability": "pure",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -80,6 +80,7 @@ JSON AST (compact format):
"scope": 18,
"src": "82:63:0",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
},
@ -174,6 +175,7 @@ JSON AST (compact format):
"scope": 18,
"src": "398:61:0",
"stateMutability": "view",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -68,6 +68,7 @@
"scope": 6,
"src": "72:27:0",
"stateMutability": "pure",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -79,6 +79,7 @@
"scope": 6,
"src": "72:27:0",
"stateMutability": "pure",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -79,6 +79,7 @@
"scope": 6,
"src": "72:27:0",
"stateMutability": "pure",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -60,6 +60,7 @@
"scope": 5,
"src": "23:18:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "internal"
}

View File

@ -46,6 +46,7 @@
},
"src": "23:18:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false
}
],

View File

@ -565,6 +565,7 @@
"scope": 39,
"src": "67:189:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -373,6 +373,7 @@
},
"src": "67:189:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -158,6 +158,7 @@
"scope": 6,
"src": "17:79:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -143,6 +143,7 @@
},
"src": "17:79:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -83,6 +83,7 @@
"scope": 6,
"src": "17:56:1",
"stateMutability": "view",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -68,6 +68,7 @@
},
"src": "17:56:1",
"stateMutability": "view",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -145,6 +145,7 @@
"scope": 6,
"src": "17:93:1",
"stateMutability": "view",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -130,6 +130,7 @@
},
"src": "17:93:1",
"stateMutability": "view",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -95,6 +95,7 @@
"scope": 6,
"src": "17:71:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -80,6 +80,7 @@
},
"src": "17:71:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -158,6 +158,7 @@
"scope": 6,
"src": "17:99:1",
"stateMutability": "view",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -143,6 +143,7 @@
},
"src": "17:99:1",
"stateMutability": "view",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -163,6 +163,7 @@
"scope": 8,
"src": "15:137:1",
"stateMutability": "pure",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -130,6 +130,7 @@
},
"src": "15:137:1",
"stateMutability": "pure",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -239,6 +239,7 @@
"scope": 12,
"src": "51:95:1",
"stateMutability": "pure",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -184,6 +184,7 @@
},
"src": "51:95:1",
"stateMutability": "pure",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -100,6 +100,7 @@
"scope": 6,
"src": "17:63:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -85,6 +85,7 @@
},
"src": "17:63:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -191,6 +191,7 @@
"scope": 6,
"src": "17:179:1",
"stateMutability": "pure",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -122,6 +122,7 @@
"scope": 6,
"src": "17:83:1",
"stateMutability": "view",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -107,6 +107,7 @@
},
"src": "17:83:1",
"stateMutability": "view",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -176,6 +176,7 @@
},
"src": "17:179:1",
"stateMutability": "pure",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -149,6 +149,7 @@
"scope": 9,
"src": "17:76:1",
"stateMutability": "pure",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -116,6 +116,7 @@
},
"src": "17:76:1",
"stateMutability": "pure",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -52,6 +52,7 @@
"scope": 79,
"src": "0:19:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "internal"
},
@ -87,6 +88,7 @@
"scope": 79,
"src": "20:19:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "internal"
},
@ -139,6 +141,7 @@
"scope": 78,
"src": "56:24:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "internal"
},
@ -174,6 +177,7 @@
"scope": 78,
"src": "85:24:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "internal"
}
@ -495,6 +499,7 @@
"scope": 22,
"src": "29:80:2",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}
@ -695,6 +700,7 @@
"scope": 37,
"src": "129:63:2",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}
@ -1012,6 +1018,7 @@
"scope": 60,
"src": "29:80:3",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -63,6 +63,7 @@
"scope": 142,
"src": "0:19:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "internal"
},
@ -98,6 +99,7 @@
"scope": 142,
"src": "20:19:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "internal"
},
@ -133,6 +135,7 @@
"scope": 142,
"src": "40:19:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "internal"
},
@ -193,6 +196,7 @@
"scope": 53,
"src": "76:26:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "external"
},
@ -228,6 +232,7 @@
"scope": 53,
"src": "107:27:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "internal"
},
@ -263,6 +268,7 @@
"scope": 53,
"src": "139:27:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "internal"
},
@ -298,6 +304,7 @@
"scope": 53,
"src": "171:27:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "internal"
},
@ -411,6 +418,7 @@
"scope": 53,
"src": "203:76:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
},
@ -565,6 +573,7 @@
"scope": 53,
"src": "284:73:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}
@ -633,6 +642,7 @@
"scope": 128,
"src": "377:27:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "external"
},
@ -669,6 +679,7 @@
"scope": 128,
"src": "409:27:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "external"
},
@ -705,6 +716,7 @@
"scope": 128,
"src": "441:27:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "external"
},
@ -740,6 +752,7 @@
"scope": 128,
"src": "473:27:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "internal"
},
@ -775,6 +788,7 @@
"scope": 128,
"src": "505:27:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "internal"
},
@ -810,6 +824,7 @@
"scope": 128,
"src": "537:27:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "internal"
},
@ -997,6 +1012,7 @@
"scope": 128,
"src": "569:111:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
},
@ -1379,6 +1395,7 @@
"scope": 128,
"src": "685:135:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}
@ -1548,6 +1565,7 @@
"scope": 141,
"src": "845:61:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -96,6 +96,7 @@
"scope": 7,
"src": "13:20:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}
@ -214,6 +215,7 @@
"scope": 17,
"src": "54:21:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -69,6 +69,7 @@
},
"src": "13:20:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false
}
],
@ -166,6 +167,7 @@
},
"src": "54:21:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false
}
],

View File

@ -60,6 +60,7 @@
"scope": 5,
"src": "14:18:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -46,6 +46,7 @@
},
"src": "14:18:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false
}
],

View File

@ -255,6 +255,7 @@
"scope": 23,
"src": "188:23:3",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -350,6 +350,7 @@
"scope": 41,
"src": "17:355:1",
"stateMutability": "pure",
"suffix": false,
"virtual": false,
"visibility": "public"
},
@ -478,6 +479,7 @@
"scope": 41,
"src": "377:287:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -246,6 +246,7 @@
},
"src": "17:355:1",
"stateMutability": "pure",
"suffix": false,
"virtual": false,
"visibility": "public"
},
@ -345,6 +346,7 @@
},
"src": "377:287:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -363,6 +363,7 @@
"scope": 27,
"src": "57:271:1",
"stateMutability": "pure",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -248,6 +248,7 @@
},
"src": "57:271:1",
"stateMutability": "pure",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -194,6 +194,7 @@
},
"src": "188:23:3",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -373,6 +373,7 @@
"scope": 28,
"src": "42:223:1",
"stateMutability": "pure",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -251,6 +251,7 @@
},
"src": "42:223:1",
"stateMutability": "pure",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -156,6 +156,7 @@
"scope": 14,
"src": "16:45:1",
"stateMutability": "pure",
"suffix": false,
"virtual": false,
"visibility": "internal"
}

View File

@ -117,6 +117,7 @@
},
"src": "16:45:1",
"stateMutability": "pure",
"suffix": false,
"virtual": false,
"visibility": "internal"
}

View File

@ -123,6 +123,7 @@
"scope": 10,
"src": "32:45:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}
@ -384,6 +385,7 @@
"scope": 30,
"src": "106:57:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -228,6 +228,7 @@
"scope": 16,
"src": "49:42:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -28,6 +28,7 @@
},
"src": "0:20:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
},
@ -284,6 +285,7 @@
},
"src": "61:112:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -60,6 +60,7 @@
"scope": 5,
"src": "15:33:1",
"stateMutability": "payable",
"suffix": false,
"virtual": false,
"visibility": "external"
}

View File

@ -60,6 +60,7 @@
"scope": 9,
"src": "15:32:1",
"stateMutability": "payable",
"suffix": false,
"virtual": false,
"visibility": "external"
},
@ -95,6 +96,7 @@
"scope": 9,
"src": "50:33:1",
"stateMutability": "payable",
"suffix": false,
"virtual": false,
"visibility": "external"
}

View File

@ -46,6 +46,7 @@
},
"src": "15:32:1",
"stateMutability": "payable",
"suffix": false,
"virtual": false,
"visibility": "external"
},
@ -80,6 +81,7 @@
},
"src": "50:33:1",
"stateMutability": "payable",
"suffix": false,
"virtual": false,
"visibility": "external"
}

View File

@ -46,6 +46,7 @@
},
"src": "15:33:1",
"stateMutability": "payable",
"suffix": false,
"virtual": false,
"visibility": "external"
}

View File

@ -60,6 +60,7 @@
"scope": 5,
"src": "14:22:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "external"
}

View File

@ -46,6 +46,7 @@
},
"src": "14:22:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "external"
}

View File

@ -219,6 +219,7 @@
"scope": 17,
"src": "13:116:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -168,6 +168,7 @@
},
"src": "13:116:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -123,6 +123,7 @@
"scope": 10,
"src": "67:35:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "internal"
}
@ -301,6 +302,7 @@
"scope": 25,
"src": "137:40:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -89,6 +89,7 @@
},
"src": "67:35:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "internal"
}
@ -215,6 +216,7 @@
},
"src": "137:40:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -162,6 +162,7 @@
"scope": 11,
"src": "13:39:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -110,6 +110,7 @@
},
"src": "13:39:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -171,6 +171,7 @@
"scope": 15,
"src": "23:45:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -125,6 +125,7 @@
},
"src": "23:45:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -163,6 +163,7 @@
"scope": 14,
"src": "39:27:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -129,6 +129,7 @@
},
"src": "39:27:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -163,6 +163,7 @@
"scope": 14,
"src": "39:27:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -129,6 +129,7 @@
},
"src": "39:27:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -224,6 +224,7 @@
"scope": 15,
"src": "13:65:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -144,6 +144,7 @@
},
"src": "13:65:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -107,6 +107,7 @@
},
"src": "113:16:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false
}
],

View File

@ -69,6 +69,7 @@
"scope": 5,
"src": "14:32:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": true,
"visibility": "public"
}
@ -141,6 +142,7 @@
"scope": 16,
"src": "77:30:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": true,
"visibility": "public"
},
@ -188,6 +190,7 @@
"scope": 16,
"src": "109:41:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": true,
"visibility": "public"
}
@ -279,6 +282,7 @@
"scope": 29,
"src": "172:34:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
},
@ -326,6 +330,7 @@
"scope": 29,
"src": "208:34:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -46,6 +46,7 @@
},
"src": "14:32:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": true,
"visibility": "public"
}
@ -107,6 +108,7 @@
},
"src": "77:30:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": true,
"visibility": "public"
},
@ -148,6 +150,7 @@
},
"src": "109:41:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": true,
"visibility": "public"
}
@ -223,6 +226,7 @@
},
"src": "172:34:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
},
@ -264,6 +268,7 @@
},
"src": "208:34:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -60,6 +60,7 @@
"scope": 5,
"src": "15:32:1",
"stateMutability": "payable",
"suffix": false,
"virtual": false,
"visibility": "external"
}

View File

@ -46,6 +46,7 @@
},
"src": "15:32:1",
"stateMutability": "payable",
"suffix": false,
"virtual": false,
"visibility": "external"
}

View File

@ -116,6 +116,7 @@
"scope": 11,
"src": "13:40:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -88,6 +88,7 @@
},
"src": "13:40:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -127,6 +127,7 @@
"scope": 12,
"src": "13:45:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -95,6 +95,7 @@
},
"src": "13:45:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -159,6 +159,7 @@
"scope": 12,
"src": "13:40:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -114,6 +114,7 @@
},
"src": "13:40:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -123,6 +123,7 @@
"scope": 9,
"src": "13:56:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -91,6 +91,7 @@
},
"src": "13:56:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -69,6 +69,7 @@
"scope": 5,
"src": "17:30:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": true,
"visibility": "public"
}
@ -128,6 +129,7 @@
"scope": 10,
"src": "67:30:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": true,
"visibility": "public"
}
@ -261,6 +263,7 @@
"scope": 22,
"src": "125:37:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -46,6 +46,7 @@
},
"src": "17:30:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": true,
"visibility": "public"
}
@ -96,6 +97,7 @@
},
"src": "67:30:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": true,
"visibility": "public"
}
@ -209,6 +211,7 @@
},
"src": "125:37:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -123,6 +123,7 @@
"scope": 9,
"src": "13:62:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -91,6 +91,7 @@
},
"src": "13:62:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -108,6 +108,7 @@
"scope": 20,
"src": "11:33:1",
"stateMutability": "pure",
"suffix": false,
"virtual": false,
"visibility": "internal"
},
@ -218,6 +219,7 @@
"scope": 19,
"src": "77:28:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -76,6 +76,7 @@
},
"src": "11:33:1",
"stateMutability": "pure",
"suffix": false,
"virtual": false,
"visibility": "internal"
},
@ -162,6 +163,7 @@
},
"src": "77:28:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -206,6 +206,7 @@
"scope": 28,
"src": "48:47:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "internal"
},

View File

@ -154,6 +154,7 @@
},
"src": "48:47:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "internal"
},

View File

@ -268,6 +268,7 @@
"scope": 50,
"src": "61:41:1",
"stateMutability": "pure",
"suffix": false,
"virtual": false,
"visibility": "internal"
},
@ -391,6 +392,7 @@
"scope": 50,
"src": "103:39:1",
"stateMutability": "pure",
"suffix": false,
"virtual": false,
"visibility": "internal"
},
@ -650,6 +652,7 @@
"scope": 49,
"src": "160:78:1",
"stateMutability": "pure",
"suffix": false,
"virtual": false,
"visibility": "public"
}

View File

@ -139,6 +139,7 @@
"scope": 14,
"src": "33:19:1",
"stateMutability": "nonpayable",
"suffix": false,
"virtual": false,
"visibility": "internal"
},

Some files were not shown because too many files have changed in this diff Show More