Allow marking free functions as suffixes

This commit is contained in:
Kamil Śliwak 2023-02-24 19:35:45 +01:00
parent 9b000cc5d2
commit 9af3439ff7
95 changed files with 242 additions and 5 deletions

View File

@ -1,6 +1,7 @@
## 0.8.20 (unreleased) ## 0.8.20 (unreleased)
Language Features: 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: Compiler Features:
@ -18,6 +19,11 @@ Bugfixes:
* Antlr Grammar: Stricter rules for function definitions. The grammar will no longer accept as valid free functions having specifiers which are exclusive to contract functions. * Antlr Grammar: Stricter rules for function definitions. The grammar will no longer accept as valid free functions having specifiers which are exclusive to contract functions.
AST Changes:
* AST: Add ``suffix`` field to ``FunctionDefinition`` AST node, which is ``true`` for free function definitions using the ``suffix`` modifier.
* AST: Add ``isSuffixCall`` field to ``FunctionCall`` AST node, which is ``true`` for calls resulting from applying a literal suffix.
### 0.8.19 (2023-02-22) ### 0.8.19 (2023-02-22)
Language Features: Language Features:

View File

@ -426,6 +426,104 @@ bool TypeChecker::visit(FunctionDefinition const& _function)
else if (_function.libraryFunction()) else if (_function.libraryFunction())
m_errorReporter.typeError(7801_error, _function.location(), "Library functions cannot be \"virtual\"."); 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()) if (_function.overrides() && _function.isFree())
m_errorReporter.syntaxError(1750_error, _function.location(), "Free functions cannot override."); m_errorReporter.syntaxError(1750_error, _function.location(), "Free functions cannot override.");

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -69,6 +69,7 @@
"scope": 5, "scope": 5,
"src": "14:32:1", "src": "14:32:1",
"stateMutability": "nonpayable", "stateMutability": "nonpayable",
"suffix": false,
"virtual": true, "virtual": true,
"visibility": "public" "visibility": "public"
} }
@ -140,6 +141,7 @@
"scope": 16, "scope": 16,
"src": "77:30:1", "src": "77:30:1",
"stateMutability": "nonpayable", "stateMutability": "nonpayable",
"suffix": false,
"virtual": true, "virtual": true,
"visibility": "public" "visibility": "public"
}, },
@ -187,6 +189,7 @@
"scope": 16, "scope": 16,
"src": "109:41:1", "src": "109:41:1",
"stateMutability": "nonpayable", "stateMutability": "nonpayable",
"suffix": false,
"virtual": true, "virtual": true,
"visibility": "public" "visibility": "public"
} }
@ -277,6 +280,7 @@
"scope": 29, "scope": 29,
"src": "172:34:1", "src": "172:34:1",
"stateMutability": "nonpayable", "stateMutability": "nonpayable",
"suffix": false,
"virtual": false, "virtual": false,
"visibility": "public" "visibility": "public"
}, },
@ -324,6 +328,7 @@
"scope": 29, "scope": 29,
"src": "208:34:1", "src": "208:34:1",
"stateMutability": "nonpayable", "stateMutability": "nonpayable",
"suffix": false,
"virtual": false, "virtual": false,
"visibility": "public" "visibility": "public"
} }

View File

@ -46,6 +46,7 @@
}, },
"src": "14:32:1", "src": "14:32:1",
"stateMutability": "nonpayable", "stateMutability": "nonpayable",
"suffix": false,
"virtual": true, "virtual": true,
"visibility": "public" "visibility": "public"
} }
@ -106,6 +107,7 @@
}, },
"src": "77:30:1", "src": "77:30:1",
"stateMutability": "nonpayable", "stateMutability": "nonpayable",
"suffix": false,
"virtual": true, "virtual": true,
"visibility": "public" "visibility": "public"
}, },
@ -147,6 +149,7 @@
}, },
"src": "109:41:1", "src": "109:41:1",
"stateMutability": "nonpayable", "stateMutability": "nonpayable",
"suffix": false,
"virtual": true, "virtual": true,
"visibility": "public" "visibility": "public"
} }
@ -221,6 +224,7 @@
}, },
"src": "172:34:1", "src": "172:34:1",
"stateMutability": "nonpayable", "stateMutability": "nonpayable",
"suffix": false,
"virtual": false, "virtual": false,
"visibility": "public" "visibility": "public"
}, },
@ -262,6 +266,7 @@
}, },
"src": "208:34:1", "src": "208:34:1",
"stateMutability": "nonpayable", "stateMutability": "nonpayable",
"suffix": false,
"virtual": false, "virtual": false,
"visibility": "public" "visibility": "public"
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -142,6 +142,7 @@
"scope": 6, "scope": 6,
"src": "22:192:1", "src": "22:192:1",
"stateMutability": "pure", "stateMutability": "pure",
"suffix": false,
"virtual": false, "virtual": false,
"visibility": "public" "visibility": "public"
} }

View File

@ -127,6 +127,7 @@
}, },
"src": "22:192:1", "src": "22:192:1",
"stateMutability": "pure", "stateMutability": "pure",
"suffix": false,
"virtual": false, "virtual": false,
"visibility": "public" "visibility": "public"
} }