mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #5125 from ethereum/fix_address_with_underscores
Fixes #5051 (introduced in #4684), effectively allowing underscores in address literals.
This commit is contained in:
commit
23773bbb1f
@ -2398,11 +2398,11 @@ void TypeChecker::endVisit(Literal const& _literal)
|
||||
_literal.annotation().type = make_shared<AddressType>(StateMutability::Payable);
|
||||
|
||||
string msg;
|
||||
if (_literal.value().length() != 42) // "0x" + 40 hex digits
|
||||
if (_literal.valueWithoutUnderscores().length() != 42) // "0x" + 40 hex digits
|
||||
// looksLikeAddress enforces that it is a hex literal starting with "0x"
|
||||
msg =
|
||||
"This looks like an address but is not exactly 40 hex digits. It is " +
|
||||
to_string(_literal.value().length() - 2) +
|
||||
to_string(_literal.valueWithoutUnderscores().length() - 2) +
|
||||
" hex digits.";
|
||||
else if (!_literal.passesAddressChecksum())
|
||||
{
|
||||
|
@ -633,6 +633,11 @@ IdentifierAnnotation& Identifier::annotation() const
|
||||
return dynamic_cast<IdentifierAnnotation&>(*m_annotation);
|
||||
}
|
||||
|
||||
ASTString Literal::valueWithoutUnderscores() const
|
||||
{
|
||||
return boost::erase_all_copy(value(), "_");
|
||||
}
|
||||
|
||||
bool Literal::isHexNumber() const
|
||||
{
|
||||
if (token() != Token::Number)
|
||||
@ -648,20 +653,20 @@ bool Literal::looksLikeAddress() const
|
||||
if (!isHexNumber())
|
||||
return false;
|
||||
|
||||
return abs(int(value().length()) - 42) <= 1;
|
||||
return abs(int(valueWithoutUnderscores().length()) - 42) <= 1;
|
||||
}
|
||||
|
||||
bool Literal::passesAddressChecksum() const
|
||||
{
|
||||
solAssert(isHexNumber(), "Expected hex number");
|
||||
return dev::passesAddressChecksum(value(), true);
|
||||
return dev::passesAddressChecksum(valueWithoutUnderscores(), true);
|
||||
}
|
||||
|
||||
string Literal::getChecksummedAddress() const
|
||||
{
|
||||
solAssert(isHexNumber(), "Expected hex number");
|
||||
/// Pad literal to be a proper hex address.
|
||||
string address = value().substr(2);
|
||||
string address = valueWithoutUnderscores().substr(2);
|
||||
if (address.length() > 40)
|
||||
return string();
|
||||
address.insert(address.begin(), 40 - address.size(), '0');
|
||||
|
@ -1679,6 +1679,8 @@ public:
|
||||
/// @returns the non-parsed value of the literal
|
||||
ASTString const& value() const { return *m_value; }
|
||||
|
||||
ASTString valueWithoutUnderscores() const;
|
||||
|
||||
SubDenomination subDenomination() const { return m_subDenomination; }
|
||||
|
||||
/// @returns true if this is a number with a hex prefix.
|
||||
|
@ -499,7 +499,7 @@ u256 AddressType::literalValue(Literal const* _literal) const
|
||||
{
|
||||
solAssert(_literal, "");
|
||||
solAssert(_literal->value().substr(0, 2) == "0x", "");
|
||||
return u256(_literal->value());
|
||||
return u256(_literal->valueWithoutUnderscores());
|
||||
}
|
||||
|
||||
TypePointer AddressType::unaryOperatorResult(Token::Value _operator) const
|
||||
|
@ -4,5 +4,6 @@ contract C {
|
||||
a = address(1);
|
||||
address b = 0x0123456789012345678901234567890123456789;
|
||||
b = 0x9876543210987654321098765432109876543210;
|
||||
b = 0x9876_5432_1098_7654_3210_9876_5432_1098_7654_3210;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user