Skip to content

Commit

Permalink
Test for legacy getters/view functions
Browse files Browse the repository at this point in the history
  • Loading branch information
Dinonard committed Dec 15, 2023
1 parent ff0d6cd commit 578d0e2
Show file tree
Hide file tree
Showing 3 changed files with 195 additions and 15 deletions.
8 changes: 5 additions & 3 deletions precompiles/dapps-staking-v3/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ use pallet_dapp_staking_v3::{
pub const STAKER_BYTES_LIMIT: u32 = 32;
type GetStakerBytesLimit = ConstU32<STAKER_BYTES_LIMIT>;

pub type DynamicAddress = BoundedBytes<GetStakerBytesLimit>;

#[cfg(test)]
mod mock;
#[cfg(test)]
Expand All @@ -62,7 +64,7 @@ pub struct PrecompileProtocolState {
#[derive(Debug, Clone, solidity::Codec)]
pub struct SmartContractV2 {
contract_type: u8,
address: BoundedBytes<GetStakerBytesLimit>,
address: DynamicAddress,
}

pub struct DappStakingV3Precompile<R>(PhantomData<R>);
Expand Down Expand Up @@ -180,7 +182,7 @@ where
#[precompile::view]
fn read_staked_amount(
handle: &mut impl PrecompileHandle,
staker: BoundedBytes<GetStakerBytesLimit>,
staker: DynamicAddress,
) -> EvmResult<u128> {
// TODO: benchmark this function so we can measure ref time & PoV correctly
// Storage item: ActiveProtocolState:
Expand Down Expand Up @@ -211,7 +213,7 @@ where
fn read_staked_amount_on_contract(
handle: &mut impl PrecompileHandle,
contract_h160: Address,
staker: BoundedBytes<GetStakerBytesLimit>,
staker: DynamicAddress,
) -> EvmResult<u128> {
// TODO: benchmark this function so we can measure ref time & PoV correctly
// Storage item: ActiveProtocolState:
Expand Down
28 changes: 17 additions & 11 deletions precompiles/dapps-staking-v3/src/mock.rs
Original file line number Diff line number Diff line change
Expand Up @@ -290,16 +290,12 @@ pub const ALICE: H160 = H160::repeat_byte(0xAA);

/// Used to register a smart contract, and stake some funds on it.
///
/// Returns `(staker H160 address, smart contract, staked amount)`.
pub fn register_and_stake() -> (
H160,
<Test as pallet_dapp_staking_v3::Config>::SmartContract,
Balance,
) {
let smart_contract =
<Test as pallet_dapp_staking_v3::Config>::SmartContract::evm(H160::repeat_byte(0xFA));

let alice_native = AddressMapper::into_account_id(ALICE);
/// Returns staked amount.
pub fn register_and_stake(
account: H160,
smart_contract: <Test as pallet_dapp_staking_v3::Config>::SmartContract,
) -> Balance {
let alice_native = AddressMapper::into_account_id(account);

// 1. Register smart contract
assert_ok!(DappStaking::register(
Expand Down Expand Up @@ -328,7 +324,17 @@ pub fn register_and_stake() -> (
amount,
));

(ALICE, smart_contract, amount)
amount
}

/// TODO
pub fn into_dynamic_addresses(address: H160) -> [DynamicAddress; 2] {
[
address.as_bytes().try_into().unwrap(),
<AccountId as AsRef<[u8]>>::as_ref(&AddressMapper::into_account_id(address))
.try_into()
.unwrap(),
]
}

/// Initialize first block.
Expand Down
174 changes: 173 additions & 1 deletion precompiles/dapps-staking-v3/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,11 @@ fn read_era_staked_is_ok() {
ExternalityBuilder::build().execute_with(|| {
initialize();

let (staker_h160, smart_contract, amount) = register_and_stake();
let staker_h160 = ALICE;
let smart_contract_h160 = H160::repeat_byte(0xFA);
let smart_contract =
<Test as pallet_dapp_staking_v3::Config>::SmartContract::evm(smart_contract_h160);
let amount = register_and_stake(staker_h160, smart_contract.clone());
let anchor_era = ActiveProtocolState::<Test>::get().era;

// 1. Current era stake must be zero, since stake is only valid from the next era.
Expand Down Expand Up @@ -171,6 +175,174 @@ fn read_era_staked_is_ok() {
});
}

#[test]
fn read_staked_amount_is_ok() {
ExternalityBuilder::build().execute_with(|| {
initialize();

let staker_h160 = ALICE;
let dynamic_addresses = into_dynamic_addresses(staker_h160);

// 1. Sanity checks - must be zero before anything is staked.
for staker in &dynamic_addresses {
precompiles()
.prepare_test(
staker_h160,
precompile_address(),
PrecompileCall::read_staked_amount {
staker: staker.clone(),
},
)
.expect_no_logs()
.execute_returns(Balance::zero());
}

// 2. Stake some amount and check again
let smart_contract_h160 = H160::repeat_byte(0xFA);
let smart_contract =
<Test as pallet_dapp_staking_v3::Config>::SmartContract::evm(smart_contract_h160);
let amount = register_and_stake(staker_h160, smart_contract.clone());
for staker in &dynamic_addresses {
precompiles()
.prepare_test(
staker_h160,
precompile_address(),
PrecompileCall::read_staked_amount {
staker: staker.clone(),
},
)
.expect_no_logs()
.execute_returns(amount);
}

// 3. Advance into next period, it should be reset back to zero
advance_to_next_period();
for staker in &dynamic_addresses {
precompiles()
.prepare_test(
staker_h160,
precompile_address(),
PrecompileCall::read_staked_amount {
staker: staker.clone(),
},
)
.expect_no_logs()
.execute_returns(Balance::zero());
}
});
}

#[test]
fn read_staked_amount_on_contract_is_ok() {
ExternalityBuilder::build().execute_with(|| {
initialize();

let staker_h160 = ALICE;
let smart_contract_h160 = H160::repeat_byte(0xFA);
let smart_contract =
<Test as pallet_dapp_staking_v3::Config>::SmartContract::evm(smart_contract_h160);
let dynamic_addresses = into_dynamic_addresses(staker_h160);

// 1. Sanity checks - must be zero before anything is staked.
for staker in &dynamic_addresses {
precompiles()
.prepare_test(
staker_h160,
precompile_address(),
PrecompileCall::read_staked_amount_on_contract {
contract_h160: smart_contract_h160.into(),
staker: staker.clone(),
},
)
.expect_no_logs()
.execute_returns(Balance::zero());
}

// 2. Stake some amount and check again
let amount = register_and_stake(staker_h160, smart_contract.clone());
for staker in &dynamic_addresses {
precompiles()
.prepare_test(
staker_h160,
precompile_address(),
PrecompileCall::read_staked_amount_on_contract {
contract_h160: smart_contract_h160.into(),
staker: staker.clone(),
},
)
.expect_no_logs()
.execute_returns(amount);
}

// 3. Advance into next period, it should be reset back to zero
advance_to_next_period();
for staker in &dynamic_addresses {
precompiles()
.prepare_test(
staker_h160,
precompile_address(),
PrecompileCall::read_staked_amount_on_contract {
contract_h160: smart_contract_h160.into(),
staker: staker.clone(),
},
)
.expect_no_logs()
.execute_returns(Balance::zero());
}
});
}

#[test]
fn read_contract_stake_is_ok() {
ExternalityBuilder::build().execute_with(|| {
initialize();

let staker_h160 = ALICE;
let smart_contract_h160 = H160::repeat_byte(0xFA);

// 1. Sanity checks - must be zero before anything is staked.
precompiles()
.prepare_test(
staker_h160,
precompile_address(),
PrecompileCall::read_contract_stake {
contract_h160: smart_contract_h160.into(),
},
)
.expect_no_logs()
.execute_returns(Balance::zero());

// 2. Stake some amount and check again
let smart_contract =
<Test as pallet_dapp_staking_v3::Config>::SmartContract::evm(smart_contract_h160);
let amount = register_and_stake(staker_h160, smart_contract.clone());

precompiles()
.prepare_test(
staker_h160,
precompile_address(),
PrecompileCall::read_contract_stake {
contract_h160: smart_contract_h160.into(),
},
)
.expect_no_logs()
.execute_returns(amount);

// 3. Advance into next period, it should be reset back to zero
advance_to_next_period();
precompiles()
.prepare_test(
staker_h160,
precompile_address(),
PrecompileCall::read_contract_stake {
contract_h160: smart_contract_h160.into(),
},
)
.expect_no_logs()
.execute_returns(Balance::zero());
});
}

// #[test]
// fn register_via_precompile_fails() {
// ExternalityBuilder::default()
Expand Down

0 comments on commit 578d0e2

Please sign in to comment.