Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ static_assert(PrecompileSelector::DIPPED_INTO_RESERVE == 0x3a61584e);

constexpr uint64_t DIPPED_INTO_RESERVE_OP_COST = 100; // warm sload coast

constexpr uint64_t FALLBACK_COST = 40'000;
constexpr uint64_t FALLBACK_COST = 100;

MONAD_ANONYMOUS_NAMESPACE_END

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -364,10 +364,74 @@ EXPLICIT_MONAD_TRAITS(run_dipped_into_reserve_test);

TEST_F(ReserveBalanceEvm, precompile_fallback)
{
auto input = std::array<uint8_t, 4>{};
{
auto input = std::array<uint8_t, 4>{};

auto const m = evmc_message{
.gas = 100,
.recipient = RESERVE_BALANCE_CA,
.sender = account_a,
.input_data = input.data(),
.input_size = input.size(),
.code_address = RESERVE_BALANCE_CA,
};

init_reserve_balance_context<MonadTraits<MONAD_NEXT>>(
state,
Address{m.sender},
empty_tx,
h.base_fee_per_gas_,
h.i_,
h.chain_ctx_);

auto const result = h.call(m);
EXPECT_EQ(result.status_code, EVMC_REVERT);
EXPECT_EQ(result.gas_left, 0);
EXPECT_EQ(result.gas_refund, 0);
EXPECT_EQ(result.output_size, 20);

auto const message = std::string_view{
reinterpret_cast<char const *>(result.output_data), 20};
EXPECT_EQ(message, "method not supported");
}

// Not enough gas to execute fallback, should fail with OOG and not REVERT
{
auto input = std::array<uint8_t, 4>{};

auto const m = evmc_message{
.gas = 99,
.recipient = RESERVE_BALANCE_CA,
.sender = account_a,
.input_data = input.data(),
.input_size = input.size(),
.code_address = RESERVE_BALANCE_CA,
};

init_reserve_balance_context<MonadTraits<MONAD_NEXT>>(
state,
Address{m.sender},
empty_tx,
h.base_fee_per_gas_,
h.i_,
h.chain_ctx_);

auto const result = h.call(m);
EXPECT_EQ(result.status_code, EVMC_OUT_OF_GAS);
EXPECT_EQ(result.gas_left, 0);
EXPECT_EQ(result.gas_refund, 0);
EXPECT_EQ(result.output_size, 0);
}
}

TEST_F(ReserveBalanceEvm, precompile_dipped_into_reserve_present)
{
u32_be selector = abi_encode_selector("dippedIntoReserve()");
auto const *s = selector.bytes;
auto input = std::array<uint8_t, 4>{s[0], s[1], s[2], s[3]};

auto const m = evmc_message{
.gas = 40'000,
.gas = 100,
.recipient = RESERVE_BALANCE_CA,
.sender = account_a,
.input_data = input.data(),
Expand All @@ -384,24 +448,20 @@ TEST_F(ReserveBalanceEvm, precompile_fallback)
h.chain_ctx_);

auto const result = h.call(m);
EXPECT_EQ(result.status_code, EVMC_REVERT);
EXPECT_EQ(result.status_code, EVMC_SUCCESS);
EXPECT_EQ(result.gas_left, 0);
EXPECT_EQ(result.gas_refund, 0);
EXPECT_EQ(result.output_size, 20);

auto const message = std::string_view{
reinterpret_cast<char const *>(result.output_data), 20};
EXPECT_EQ(message, "method not supported");
EXPECT_EQ(result.output_size, 32);
}

TEST_F(ReserveBalanceEvm, precompile_dipped_into_reserve_present)
TEST_F(ReserveBalanceEvm, precompile_dipped_into_reserve_oog)
{
u32_be selector = abi_encode_selector("dippedIntoReserve()");
auto const *s = selector.bytes;
auto input = std::array<uint8_t, 4>{s[0], s[1], s[2], s[3]};

auto const m = evmc_message{
.gas = 100,
.gas = 99,
.recipient = RESERVE_BALANCE_CA,
.sender = account_a,
.input_data = input.data(),
Expand All @@ -418,10 +478,10 @@ TEST_F(ReserveBalanceEvm, precompile_dipped_into_reserve_present)
h.chain_ctx_);

auto const result = h.call(m);
EXPECT_EQ(result.status_code, EVMC_SUCCESS);
EXPECT_EQ(result.status_code, EVMC_OUT_OF_GAS);
EXPECT_EQ(result.gas_left, 0);
EXPECT_EQ(result.gas_refund, 0);
EXPECT_EQ(result.output_size, 32);
EXPECT_EQ(result.output_size, 0);
}

TEST_F(ReserveBalanceEvm, precompile_dipped_into_reserve_with_argument)
Expand Down
Loading