mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
fixed EIP-712 encoding type.
This commit is contained in:
parent
78981fac52
commit
145dfcf6da
@ -395,12 +395,33 @@ void StructDefinition::insertEip712EncodedSubtypes(std::set<std::string>& subtyp
|
|||||||
{
|
{
|
||||||
for (size_t i = 0; i < m_members.size(); i++)
|
for (size_t i = 0; i < m_members.size(); i++)
|
||||||
{
|
{
|
||||||
if (m_members[i]->type()->category() == Type::Category::Struct)
|
Declaration const* declaration = nullptr;
|
||||||
{
|
|
||||||
Declaration const* declaration = m_members[i]->type()->typeDefinition();
|
|
||||||
StructDefinition const* structDef = dynamic_cast<StructDefinition const*>(declaration);
|
|
||||||
solAssert(structDef != nullptr);
|
|
||||||
|
|
||||||
|
switch (m_members[i]->type()->category())
|
||||||
|
{
|
||||||
|
case Type::Category::Struct:
|
||||||
|
declaration = m_members[i]->type()->typeDefinition();
|
||||||
|
break;
|
||||||
|
case Type::Category::Array:
|
||||||
|
{
|
||||||
|
auto const* arrayType = dynamic_cast<ArrayType const*>(m_members[i]->type());
|
||||||
|
solAssert(!!arrayType);
|
||||||
|
if (auto finalyBaseType = dynamic_cast<StructType const*>(arrayType->finalBaseType(false)))
|
||||||
|
{
|
||||||
|
declaration = finalyBaseType->typeDefinition();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!declaration) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (auto const* structDef = dynamic_cast<StructDefinition const*>(declaration))
|
||||||
|
{
|
||||||
subtypes.insert(structDef->eip712EncodeTypeWithoutSubtypes());
|
subtypes.insert(structDef->eip712EncodeTypeWithoutSubtypes());
|
||||||
structDef->insertEip712EncodedSubtypes(subtypes);
|
structDef->insertEip712EncodedSubtypes(subtypes);
|
||||||
}
|
}
|
||||||
@ -413,16 +434,13 @@ std::string StructDefinition::eip712EncodeTypeWithoutSubtypes() const
|
|||||||
for (size_t i = 0; i < m_members.size(); i++)
|
for (size_t i = 0; i < m_members.size(); i++)
|
||||||
{
|
{
|
||||||
str += i == 0 ? "" : ",";
|
str += i == 0 ? "" : ",";
|
||||||
str += m_members[i]->type()->canonicalName() + " " + m_members[i]->name();
|
str += m_members[i]->type()->eip712TypeName() + " " + m_members[i]->name();
|
||||||
}
|
}
|
||||||
return str + ")";
|
return str + ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string StructDefinition::eip712EncodeType() const
|
std::string StructDefinition::eip712EncodeType() const
|
||||||
{
|
{
|
||||||
// EIP-712 supports recurvie structs, but not containing nested mappings
|
|
||||||
solAssert(!annotation().containsNestedMapping.has_value() || !annotation().containsNestedMapping.value(), "Struct containing mapping cannot be used in EIP-712.");
|
|
||||||
|
|
||||||
// std::set enables duplicates elimination and ordered enumeration
|
// std::set enables duplicates elimination and ordered enumeration
|
||||||
std::set<std::string> subtypes;
|
std::set<std::string> subtypes;
|
||||||
insertEip712EncodedSubtypes(subtypes);
|
insertEip712EncodedSubtypes(subtypes);
|
||||||
|
@ -1887,6 +1887,23 @@ string ArrayType::canonicalName() const
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string ArrayType::eip712TypeName() const
|
||||||
|
{
|
||||||
|
string ret;
|
||||||
|
if (isString())
|
||||||
|
ret = "string";
|
||||||
|
else if (isByteArrayOrString())
|
||||||
|
ret = "bytes";
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret = baseType()->eip712TypeName() + "[";
|
||||||
|
if (!isDynamicallySized())
|
||||||
|
ret += length().str();
|
||||||
|
ret += "]";
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
string ArrayType::signatureInExternalFunction(bool _structsByName) const
|
string ArrayType::signatureInExternalFunction(bool _structsByName) const
|
||||||
{
|
{
|
||||||
if (isByteArrayOrString())
|
if (isByteArrayOrString())
|
||||||
@ -2511,6 +2528,11 @@ string StructType::canonicalName() const
|
|||||||
return *m_struct.annotation().canonicalName;
|
return *m_struct.annotation().canonicalName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string StructType::eip712TypeName() const
|
||||||
|
{
|
||||||
|
return this->typeDefinition()->name();
|
||||||
|
}
|
||||||
|
|
||||||
FunctionTypePointer StructType::constructorType() const
|
FunctionTypePointer StructType::constructorType() const
|
||||||
{
|
{
|
||||||
TypePointers paramTypes;
|
TypePointers paramTypes;
|
||||||
|
@ -357,6 +357,7 @@ public:
|
|||||||
/// @returns the canonical name of this type for use in library function signatures.
|
/// @returns the canonical name of this type for use in library function signatures.
|
||||||
virtual std::string canonicalName() const { return toString(true); }
|
virtual std::string canonicalName() const { return toString(true); }
|
||||||
virtual std::string humanReadableName() const { return toString(); }
|
virtual std::string humanReadableName() const { return toString(); }
|
||||||
|
virtual std::string eip712TypeName() const { return encodingType()->toString(true); }
|
||||||
/// @returns the signature of this type in external functions, i.e. `uint256` for integers
|
/// @returns the signature of this type in external functions, i.e. `uint256` for integers
|
||||||
/// or `(uint256,bytes8)[2]` for an array of structs. If @a _structsByName,
|
/// or `(uint256,bytes8)[2]` for an array of structs. If @a _structsByName,
|
||||||
/// structs are given by canonical name like `ContractName.StructName[2]`.
|
/// structs are given by canonical name like `ContractName.StructName[2]`.
|
||||||
@ -551,6 +552,7 @@ public:
|
|||||||
bool nameable() const override { return true; }
|
bool nameable() const override { return true; }
|
||||||
|
|
||||||
std::string toString(bool _withoutDataLocation) const override;
|
std::string toString(bool _withoutDataLocation) const override;
|
||||||
|
std::string eip712TypeName() const override{ solAssert(false, "EIP-712 is not supported for struct members of fixed point type"); }
|
||||||
|
|
||||||
Type const* encodingType() const override { return this; }
|
Type const* encodingType() const override { return this; }
|
||||||
TypeResult interfaceType(bool) const override { return this; }
|
TypeResult interfaceType(bool) const override { return this; }
|
||||||
@ -867,6 +869,7 @@ public:
|
|||||||
std::string toString(bool _withoutDataLocation) const override;
|
std::string toString(bool _withoutDataLocation) const override;
|
||||||
std::string humanReadableName() const override;
|
std::string humanReadableName() const override;
|
||||||
std::string canonicalName() const override;
|
std::string canonicalName() const override;
|
||||||
|
std::string eip712TypeName() const override;
|
||||||
std::string signatureInExternalFunction(bool _structsByName) const override;
|
std::string signatureInExternalFunction(bool _structsByName) const override;
|
||||||
MemberList::MemberMap nativeMembers(ASTNode const* _currentScope) const override;
|
MemberList::MemberMap nativeMembers(ASTNode const* _currentScope) const override;
|
||||||
Type const* encodingType() const override;
|
Type const* encodingType() const override;
|
||||||
@ -924,6 +927,7 @@ public:
|
|||||||
BoolResult isImplicitlyConvertibleTo(Type const& _other) const override;
|
BoolResult isImplicitlyConvertibleTo(Type const& _other) const override;
|
||||||
BoolResult isExplicitlyConvertibleTo(Type const& _convertTo) const override;
|
BoolResult isExplicitlyConvertibleTo(Type const& _convertTo) const override;
|
||||||
std::string richIdentifier() const override;
|
std::string richIdentifier() const override;
|
||||||
|
std::string eip712TypeName() const override { solAssert(false, "EIP-712 is not supported for struct members of array slice type"); }
|
||||||
bool operator==(Type const& _other) const override;
|
bool operator==(Type const& _other) const override;
|
||||||
unsigned calldataEncodedSize(bool) const override { solAssert(false, ""); }
|
unsigned calldataEncodedSize(bool) const override { solAssert(false, ""); }
|
||||||
unsigned calldataEncodedTailSize() const override { return 32; }
|
unsigned calldataEncodedTailSize() const override { return 32; }
|
||||||
@ -1052,6 +1056,7 @@ public:
|
|||||||
std::unique_ptr<ReferenceType> copyForLocation(DataLocation _location, bool _isPointer) const override;
|
std::unique_ptr<ReferenceType> copyForLocation(DataLocation _location, bool _isPointer) const override;
|
||||||
|
|
||||||
std::string canonicalName() const override;
|
std::string canonicalName() const override;
|
||||||
|
std::string eip712TypeName() const override;
|
||||||
std::string signatureInExternalFunction(bool _structsByName) const override;
|
std::string signatureInExternalFunction(bool _structsByName) const override;
|
||||||
|
|
||||||
/// @returns a function that performs the type conversion between a list of struct members
|
/// @returns a function that performs the type conversion between a list of struct members
|
||||||
@ -1100,6 +1105,7 @@ public:
|
|||||||
bool leftAligned() const override { return false; }
|
bool leftAligned() const override { return false; }
|
||||||
std::string toString(bool _withoutDataLocation) const override;
|
std::string toString(bool _withoutDataLocation) const override;
|
||||||
std::string canonicalName() const override;
|
std::string canonicalName() const override;
|
||||||
|
std::string eip712TypeName() const override { solAssert(false, "EIP-712 is not supported for struct members of Enum type"); }
|
||||||
bool isValueType() const override { return true; }
|
bool isValueType() const override { return true; }
|
||||||
bool nameable() const override { return true; }
|
bool nameable() const override { return true; }
|
||||||
|
|
||||||
@ -1187,6 +1193,7 @@ public:
|
|||||||
|
|
||||||
std::string toString(bool _withoutDataLocation) const override;
|
std::string toString(bool _withoutDataLocation) const override;
|
||||||
std::string canonicalName() const override;
|
std::string canonicalName() const override;
|
||||||
|
std::string eip712TypeName() const override { solAssert(false, "EIP-712 is not supported for struct members of user defined value type"); }
|
||||||
std::string signatureInExternalFunction(bool) const override { solAssert(false, ""); }
|
std::string signatureInExternalFunction(bool) const override { solAssert(false, ""); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -1218,6 +1225,8 @@ public:
|
|||||||
bool hasSimpleZeroValueInMemory() const override { return false; }
|
bool hasSimpleZeroValueInMemory() const override { return false; }
|
||||||
Type const* mobileType() const override;
|
Type const* mobileType() const override;
|
||||||
|
|
||||||
|
std::string eip712TypeName() const override { solAssert(false, "EIP-712 is not supported for struct members of tuple type"); }
|
||||||
|
|
||||||
std::vector<Type const*> const& components() const { return m_components; }
|
std::vector<Type const*> const& components() const { return m_components; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -1415,6 +1424,7 @@ public:
|
|||||||
TypeResult binaryOperatorResult(Token, Type const*) const override;
|
TypeResult binaryOperatorResult(Token, Type const*) const override;
|
||||||
std::string canonicalName() const override;
|
std::string canonicalName() const override;
|
||||||
std::string humanReadableName() const override;
|
std::string humanReadableName() const override;
|
||||||
|
std::string eip712TypeName() const override { solAssert(false, "EIP-712 is not supported for struct members of function type"); }
|
||||||
std::string toString(bool _withoutDataLocation) const override;
|
std::string toString(bool _withoutDataLocation) const override;
|
||||||
unsigned calldataEncodedSize(bool _padded) const override;
|
unsigned calldataEncodedSize(bool _padded) const override;
|
||||||
bool canBeStored() const override { return m_kind == Kind::Internal || m_kind == Kind::External; }
|
bool canBeStored() const override { return m_kind == Kind::Internal || m_kind == Kind::External; }
|
||||||
@ -1551,6 +1561,7 @@ public:
|
|||||||
bool operator==(Type const& _other) const override;
|
bool operator==(Type const& _other) const override;
|
||||||
std::string toString(bool _withoutDataLocation) const override;
|
std::string toString(bool _withoutDataLocation) const override;
|
||||||
std::string canonicalName() const override;
|
std::string canonicalName() const override;
|
||||||
|
std::string eip712TypeName() const override { solAssert(false, "EIP-712 is not supported for struct members of mapping type"); }
|
||||||
bool containsNestedMapping() const override { return true; }
|
bool containsNestedMapping() const override { return true; }
|
||||||
TypeResult binaryOperatorResult(Token, Type const*) const override { return nullptr; }
|
TypeResult binaryOperatorResult(Token, Type const*) const override { return nullptr; }
|
||||||
Type const* encodingType() const override;
|
Type const* encodingType() const override;
|
||||||
@ -1595,6 +1606,7 @@ public:
|
|||||||
bool operator==(Type const& _other) const override;
|
bool operator==(Type const& _other) const override;
|
||||||
bool canBeStored() const override { return false; }
|
bool canBeStored() const override { return false; }
|
||||||
u256 storageSize() const override;
|
u256 storageSize() const override;
|
||||||
|
std::string eip712TypeName() const override { solAssert(false, "EIP-712 is not supported for struct members of type type"); }
|
||||||
bool hasSimpleZeroValueInMemory() const override { solAssert(false, ""); }
|
bool hasSimpleZeroValueInMemory() const override { solAssert(false, ""); }
|
||||||
std::string toString(bool _withoutDataLocation) const override { return "type(" + m_actualType->toString(_withoutDataLocation) + ")"; }
|
std::string toString(bool _withoutDataLocation) const override { return "type(" + m_actualType->toString(_withoutDataLocation) + ")"; }
|
||||||
MemberList::MemberMap nativeMembers(ASTNode const* _currentScope) const override;
|
MemberList::MemberMap nativeMembers(ASTNode const* _currentScope) const override;
|
||||||
@ -1622,6 +1634,7 @@ public:
|
|||||||
u256 storageSize() const override;
|
u256 storageSize() const override;
|
||||||
bool hasSimpleZeroValueInMemory() const override { solAssert(false, ""); }
|
bool hasSimpleZeroValueInMemory() const override { solAssert(false, ""); }
|
||||||
std::string richIdentifier() const override;
|
std::string richIdentifier() const override;
|
||||||
|
std::string eip712TypeName() const override { solAssert(false, "EIP-712 is not supported for struct members of modfier type"); }
|
||||||
bool operator==(Type const& _other) const override;
|
bool operator==(Type const& _other) const override;
|
||||||
std::string toString(bool _withoutDataLocation) const override;
|
std::string toString(bool _withoutDataLocation) const override;
|
||||||
protected:
|
protected:
|
||||||
@ -1646,6 +1659,7 @@ public:
|
|||||||
std::string richIdentifier() const override;
|
std::string richIdentifier() const override;
|
||||||
bool operator==(Type const& _other) const override;
|
bool operator==(Type const& _other) const override;
|
||||||
bool canBeStored() const override { return false; }
|
bool canBeStored() const override { return false; }
|
||||||
|
std::string eip712TypeName() const override { solAssert(false, "EIP-712 is not supported for struct members of module type"); }
|
||||||
bool hasSimpleZeroValueInMemory() const override { solAssert(false, ""); }
|
bool hasSimpleZeroValueInMemory() const override { solAssert(false, ""); }
|
||||||
MemberList::MemberMap nativeMembers(ASTNode const*) const override;
|
MemberList::MemberMap nativeMembers(ASTNode const*) const override;
|
||||||
|
|
||||||
@ -1685,6 +1699,7 @@ public:
|
|||||||
std::string richIdentifier() const override;
|
std::string richIdentifier() const override;
|
||||||
bool operator==(Type const& _other) const override;
|
bool operator==(Type const& _other) const override;
|
||||||
bool canBeStored() const override { return false; }
|
bool canBeStored() const override { return false; }
|
||||||
|
std::string eip712TypeName() const override { solAssert(false, "EIP-712 is not supported for struct members of magic type"); }
|
||||||
bool hasSimpleZeroValueInMemory() const override { solAssert(false, ""); }
|
bool hasSimpleZeroValueInMemory() const override { solAssert(false, ""); }
|
||||||
MemberList::MemberMap nativeMembers(ASTNode const*) const override;
|
MemberList::MemberMap nativeMembers(ASTNode const*) const override;
|
||||||
|
|
||||||
@ -1718,6 +1733,7 @@ public:
|
|||||||
unsigned calldataEncodedSize(bool) const override { return 32; }
|
unsigned calldataEncodedSize(bool) const override { return 32; }
|
||||||
bool canBeStored() const override { return false; }
|
bool canBeStored() const override { return false; }
|
||||||
bool isValueType() const override { return true; }
|
bool isValueType() const override { return true; }
|
||||||
|
std::string eip712TypeName() const override { solAssert(false, "EIP-712 is not supported for struct members of inaccessible dynamic type"); }
|
||||||
bool hasSimpleZeroValueInMemory() const override { solAssert(false, ""); }
|
bool hasSimpleZeroValueInMemory() const override { solAssert(false, ""); }
|
||||||
std::string toString(bool) const override { return "inaccessible dynamic type"; }
|
std::string toString(bool) const override { return "inaccessible dynamic type"; }
|
||||||
Type const* decodingType() const override;
|
Type const* decodingType() const override;
|
||||||
|
Loading…
Reference in New Issue
Block a user