Implemented block.basefee in Solidilty and basefee() in Yul.

Also added basefee to Yul grammar.
This commit is contained in:
hrkrshnn 2021-07-12 16:49:05 +02:00
parent d92b211a2f
commit 95091f6b58
6 changed files with 16 additions and 2 deletions

View File

@ -284,7 +284,8 @@ YulEVMBuiltin:
| 'returndatacopy' | 'extcodehash' | 'create' | 'create2' | 'call' | 'callcode' | 'returndatacopy' | 'extcodehash' | 'create' | 'create2' | 'call' | 'callcode'
| 'delegatecall' | 'staticcall' | 'return' | 'revert' | 'selfdestruct' | 'invalid' | 'delegatecall' | 'staticcall' | 'return' | 'revert' | 'selfdestruct' | 'invalid'
| 'log0' | 'log1' | 'log2' | 'log3' | 'log4' | 'chainid' | 'origin' | 'gasprice' | 'log0' | 'log1' | 'log2' | 'log3' | 'log4' | 'chainid' | 'origin' | 'gasprice'
| 'blockhash' | 'coinbase' | 'timestamp' | 'number' | 'difficulty' | 'gaslimit'; | 'blockhash' | 'coinbase' | 'timestamp' | 'number' | 'difficulty' | 'gaslimit'
| 'basefee';
YulLBrace: '{' -> pushMode(YulMode); YulLBrace: '{' -> pushMode(YulMode);
YulRBrace: '}' -> popMode; YulRBrace: '}' -> popMode;

View File

@ -2947,6 +2947,12 @@ bool TypeChecker::visit(MemberAccess const& _memberAccess)
_memberAccess.location(), _memberAccess.location(),
"\"chainid\" is not supported by the VM version." "\"chainid\" is not supported by the VM version."
); );
else if (magicType->kind() == MagicType::Kind::Block && memberName == "basefee" && !m_evmVersion.hasBaseFee())
m_errorReporter.typeError(
5921_error,
_memberAccess.location(),
"\"basefee\" is not supported by the VM version."
);
} }
if ( if (

View File

@ -3892,7 +3892,8 @@ MemberList::MemberMap MagicType::nativeMembers(ASTNode const*) const
{"difficulty", TypeProvider::uint256()}, {"difficulty", TypeProvider::uint256()},
{"number", TypeProvider::uint256()}, {"number", TypeProvider::uint256()},
{"gaslimit", TypeProvider::uint256()}, {"gaslimit", TypeProvider::uint256()},
{"chainid", TypeProvider::uint256()} {"chainid", TypeProvider::uint256()},
{"basefee", TypeProvider::uint256()}
}); });
case Kind::Message: case Kind::Message:
return MemberList::MemberMap({ return MemberList::MemberMap({

View File

@ -1731,6 +1731,8 @@ bool ExpressionCompiler::visit(MemberAccess const& _memberAccess)
m_context << Instruction::GASPRICE; m_context << Instruction::GASPRICE;
else if (member == "chainid") else if (member == "chainid")
m_context << Instruction::CHAINID; m_context << Instruction::CHAINID;
else if (member == "basefee")
m_context << Instruction::BASEFEE;
else if (member == "data") else if (member == "data")
m_context << u256(0) << Instruction::CALLDATASIZE; m_context << u256(0) << Instruction::CALLDATASIZE;
else if (member == "sig") else if (member == "sig")

View File

@ -1733,6 +1733,8 @@ void IRGeneratorForStatements::endVisit(MemberAccess const& _memberAccess)
define(_memberAccess) << "gasprice()\n"; define(_memberAccess) << "gasprice()\n";
else if (member == "chainid") else if (member == "chainid")
define(_memberAccess) << "chainid()\n"; define(_memberAccess) << "chainid()\n";
else if (member == "basefee")
define(_memberAccess) << "basefee()\n";
else if (member == "data") else if (member == "data")
{ {
IRVariable var(_memberAccess); IRVariable var(_memberAccess);

View File

@ -695,6 +695,8 @@ bool AsmAnalyzer::validateInstructions(evmasm::Instruction _instr, SourceLocatio
errorForVM(1561_error, "only available for Istanbul-compatible"); errorForVM(1561_error, "only available for Istanbul-compatible");
else if (_instr == evmasm::Instruction::SELFBALANCE && !m_evmVersion.hasSelfBalance()) else if (_instr == evmasm::Instruction::SELFBALANCE && !m_evmVersion.hasSelfBalance())
errorForVM(7721_error, "only available for Istanbul-compatible"); errorForVM(7721_error, "only available for Istanbul-compatible");
else if (_instr == evmasm::Instruction::BASEFEE && !m_evmVersion.hasBaseFee())
errorForVM(5430_error, "only available for London-compatible");
else if (_instr == evmasm::Instruction::PC) else if (_instr == evmasm::Instruction::PC)
m_errorReporter.error( m_errorReporter.error(
2450_error, 2450_error,