forked from ghostchain/ghost-node
697 lines
25 KiB
Rust
697 lines
25 KiB
Rust
|
#![cfg(test)]
|
||
|
|
||
|
use super::*;
|
||
|
use crate::mock::*;
|
||
|
use frame_support::{assert_err, assert_ok};
|
||
|
use sp_core::offchain::{
|
||
|
testing,
|
||
|
testing::TestOffchainExt, OffchainWorkerExt,
|
||
|
// OffchainDbExt, TransactionPoolExt,
|
||
|
};
|
||
|
// use sp_runtime::testing::UintAuthorityId;
|
||
|
|
||
|
fn prepare_networks() -> (u32, u32) {
|
||
|
let network = NetworkData {
|
||
|
chain_name: "Ethereum".into(),
|
||
|
default_endpoint: get_rpc_endpoint(),
|
||
|
finality_delay: Some(69),
|
||
|
release_delay: Some(69),
|
||
|
network_type: ghost_networks::NetworkType::Evm,
|
||
|
gatekeeper: get_gatekeeper(),
|
||
|
topic_name: get_topic_name(),
|
||
|
incoming_fee: 0,
|
||
|
outgoing_fee: 0,
|
||
|
};
|
||
|
|
||
|
assert_ok!(Networks::register_network(
|
||
|
RuntimeOrigin::root(),
|
||
|
get_network_id(),
|
||
|
network));
|
||
|
|
||
|
(1, 69)
|
||
|
}
|
||
|
|
||
|
fn prepare_companion(amount: u64) -> Companion<NetworkIdOf<Runtime>, BalanceOf<Runtime>> {
|
||
|
Companion {
|
||
|
network_id: 1,
|
||
|
receiver: H160::from_low_u64_ne(1337),
|
||
|
fee: H256::from_low_u64_ne(40_000),
|
||
|
amount: amount,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn test_throttling_slash_function() {
|
||
|
let dummy_offence = ThrottlingOffence {
|
||
|
session_index: 0,
|
||
|
validator_set_count: 50,
|
||
|
offenders: vec![()],
|
||
|
};
|
||
|
|
||
|
assert_eq!(dummy_offence.slash_fraction(1), Perbill::zero());
|
||
|
assert_eq!(dummy_offence.slash_fraction(5), Perbill::zero());
|
||
|
assert_eq!(dummy_offence.slash_fraction(7), Perbill::from_parts(4200000));
|
||
|
assert_eq!(dummy_offence.slash_fraction(17), Perbill::from_parts(46200000));
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn propose_companion_works_as_expected() {
|
||
|
new_test_ext().execute_with(|| {
|
||
|
let actor = alice_account_id();
|
||
|
let companion_id = SlowClap::current_companion_id();
|
||
|
let (valid_network_id, _) = prepare_networks();
|
||
|
let companion = prepare_companion(100);
|
||
|
|
||
|
assert_eq!(Balances::balance(&actor), 100);
|
||
|
assert_eq!(Balances::total_issuance(), 100);
|
||
|
assert_eq!(SlowClap::companions(valid_network_id, companion_id), None);
|
||
|
assert_eq!(SlowClap::companion_details(companion_id), None);
|
||
|
assert_eq!(SlowClap::current_companion_id(), companion_id);
|
||
|
|
||
|
assert_ok!(SlowClap::propose_companion(RuntimeOrigin::signed(actor), valid_network_id, companion.clone()));
|
||
|
|
||
|
assert_eq!(Balances::balance(&actor), 0);
|
||
|
assert_eq!(Balances::total_issuance(), 0);
|
||
|
assert_eq!(SlowClap::companions(valid_network_id, companion_id), Some(actor));
|
||
|
assert_eq!(SlowClap::companion_details(companion_id), Some(companion));
|
||
|
assert_eq!(SlowClap::current_companion_id(), companion_id + 1);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn propose_companion_emits_event() {
|
||
|
new_test_ext().execute_with(|| {
|
||
|
let actor = alice_account_id();
|
||
|
let companion_id = SlowClap::current_companion_id();
|
||
|
let (valid_network_id, _) = prepare_networks();
|
||
|
let companion = prepare_companion(100);
|
||
|
|
||
|
System::reset_events();
|
||
|
assert_ok!(SlowClap::propose_companion(
|
||
|
RuntimeOrigin::signed(actor),
|
||
|
valid_network_id, companion.clone()));
|
||
|
System::assert_has_event(RuntimeEvent::SlowClap(
|
||
|
crate::Event::CompanionCreated {
|
||
|
companion_id,
|
||
|
owner: actor,
|
||
|
companion,
|
||
|
}));
|
||
|
});
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn could_not_propose_if_not_enough_funds() {
|
||
|
new_test_ext().execute_with(|| {
|
||
|
let actor = alice_account_id();
|
||
|
let (valid_network_id, _) = prepare_networks();
|
||
|
let companion = prepare_companion(1_000);
|
||
|
assert_err!(SlowClap::propose_companion(
|
||
|
RuntimeOrigin::signed(actor),
|
||
|
valid_network_id, companion.clone()),
|
||
|
sp_runtime::TokenError::FundsUnavailable);
|
||
|
|
||
|
let companion = prepare_companion(100 / 2);
|
||
|
let prev_balance = Balances::balance(&actor);
|
||
|
assert_ok!(SlowClap::propose_companion(
|
||
|
RuntimeOrigin::signed(actor),
|
||
|
valid_network_id, companion.clone()));
|
||
|
assert_eq!(Balances::balance(&actor), prev_balance / 2);
|
||
|
|
||
|
});
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn companion_amount_should_be_existent() {
|
||
|
new_test_ext().execute_with(|| {
|
||
|
let actor = alice_account_id();
|
||
|
let (valid_network_id, _) = prepare_networks();
|
||
|
let companion = prepare_companion(1);
|
||
|
|
||
|
assert_err!(SlowClap::propose_companion(
|
||
|
RuntimeOrigin::signed(actor),
|
||
|
valid_network_id, companion.clone()),
|
||
|
crate::Error::<Runtime>::CompanionAmountNotExistent);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn could_not_register_companion_if_network_not_registered() {
|
||
|
new_test_ext().execute_with(|| {
|
||
|
let actor = alice_account_id();
|
||
|
let (_, invalid_network_id) = prepare_networks();
|
||
|
let companion = prepare_companion(100);
|
||
|
|
||
|
assert_err!(SlowClap::propose_companion(
|
||
|
RuntimeOrigin::signed(actor),
|
||
|
invalid_network_id,
|
||
|
companion.clone()),
|
||
|
crate::Error::<Runtime>::NonRegisteredNetwork);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn release_companion_works() {
|
||
|
new_test_ext().execute_with(|| {
|
||
|
let actor = alice_account_id();
|
||
|
let companion_id = SlowClap::current_companion_id();
|
||
|
let (valid_network_id, _) = prepare_networks();
|
||
|
let companion = prepare_companion(50);
|
||
|
assert_ok!(SlowClap::propose_companion(
|
||
|
RuntimeOrigin::signed(actor),
|
||
|
valid_network_id,
|
||
|
companion.clone()));
|
||
|
|
||
|
assert_eq!(SlowClap::release_blocks(companion_id), 0);
|
||
|
assert_ok!(SlowClap::release_companion(
|
||
|
RuntimeOrigin::signed(actor),
|
||
|
valid_network_id, companion_id));
|
||
|
assert_eq!(SlowClap::release_blocks(companion_id), 69 + 1);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn release_companion_emits_event() {
|
||
|
new_test_ext().execute_with(|| {
|
||
|
let actor = alice_account_id();
|
||
|
let companion_id = SlowClap::current_companion_id();
|
||
|
let (valid_network_id, _) = prepare_networks();
|
||
|
let companion = prepare_companion(50);
|
||
|
assert_ok!(SlowClap::propose_companion(
|
||
|
RuntimeOrigin::signed(actor),
|
||
|
valid_network_id, companion.clone()));
|
||
|
|
||
|
System::reset_events();
|
||
|
assert_ok!(SlowClap::release_companion(
|
||
|
RuntimeOrigin::signed(actor),
|
||
|
valid_network_id, companion_id));
|
||
|
System::assert_has_event(RuntimeEvent::SlowClap(
|
||
|
crate::Event::CompanionReleased {
|
||
|
companion_id,
|
||
|
network_id: valid_network_id,
|
||
|
who: actor,
|
||
|
release_block: 69 + 1 }));
|
||
|
});
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn could_not_release_from_random_account() {
|
||
|
new_test_ext().execute_with(|| {
|
||
|
let actor = alice_account_id();
|
||
|
let companion_id = SlowClap::current_companion_id();
|
||
|
let (valid_network_id, _) = prepare_networks();
|
||
|
let companion = prepare_companion(50);
|
||
|
assert_ok!(SlowClap::propose_companion(
|
||
|
RuntimeOrigin::signed(actor),
|
||
|
valid_network_id, companion.clone()));
|
||
|
|
||
|
assert_err!(SlowClap::release_companion(
|
||
|
RuntimeOrigin::signed(eve_account_id()),
|
||
|
valid_network_id, companion_id),
|
||
|
crate::Error::<Runtime>::NotValidCompanion);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn kill_companion_works() {
|
||
|
new_test_ext().execute_with(|| {
|
||
|
let actor = alice_account_id();
|
||
|
let companion_id = SlowClap::current_companion_id();
|
||
|
let (valid_network_id, _) = prepare_networks();
|
||
|
let companion = prepare_companion(50);
|
||
|
assert_ok!(SlowClap::propose_companion(
|
||
|
RuntimeOrigin::signed(actor),
|
||
|
valid_network_id, companion.clone()));
|
||
|
|
||
|
assert_ok!(SlowClap::release_companion(
|
||
|
RuntimeOrigin::signed(actor),
|
||
|
valid_network_id, companion_id));
|
||
|
let release_block = ReleaseBlocks::<Runtime>::get(companion_id);
|
||
|
|
||
|
assert_eq!(SlowClap::companions(valid_network_id, companion_id), Some(actor));
|
||
|
assert_eq!(SlowClap::companion_details(companion_id), Some(companion));
|
||
|
assert_eq!(Balances::balance(&actor), 50);
|
||
|
assert_eq!(Balances::total_issuance(), 50);
|
||
|
|
||
|
System::set_block_number(release_block + 1);
|
||
|
assert_ok!(SlowClap::kill_companion(
|
||
|
RuntimeOrigin::signed(actor),
|
||
|
valid_network_id, companion_id));
|
||
|
|
||
|
assert_eq!(SlowClap::companions(valid_network_id, companion_id), None);
|
||
|
assert_eq!(SlowClap::companion_details(companion_id), None);
|
||
|
assert_eq!(Balances::balance(&actor), 100);
|
||
|
assert_eq!(Balances::total_issuance(), 100);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn kill_companion_emits_event() {
|
||
|
new_test_ext().execute_with(|| {
|
||
|
let actor = alice_account_id();
|
||
|
let companion_id = SlowClap::current_companion_id();
|
||
|
let (valid_network_id, _) = prepare_networks();
|
||
|
let companion = prepare_companion(50);
|
||
|
|
||
|
assert_ok!(SlowClap::propose_companion(
|
||
|
RuntimeOrigin::signed(actor),
|
||
|
valid_network_id, companion.clone()));
|
||
|
assert_ok!(SlowClap::release_companion(
|
||
|
RuntimeOrigin::signed(actor),
|
||
|
valid_network_id, companion_id));
|
||
|
System::set_block_number(
|
||
|
ReleaseBlocks::<Runtime>::get(companion_id) + 1);
|
||
|
|
||
|
System::reset_events();
|
||
|
assert_ok!(SlowClap::kill_companion(
|
||
|
RuntimeOrigin::signed(actor),
|
||
|
valid_network_id, companion_id));
|
||
|
System::assert_has_event(RuntimeEvent::SlowClap(
|
||
|
crate::Event::CompanionKilled {
|
||
|
network_id: valid_network_id,
|
||
|
who: actor,
|
||
|
companion_id,
|
||
|
freed_balance: 50,
|
||
|
}));
|
||
|
});
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn could_not_kill_companion_that_was_not_released() {
|
||
|
new_test_ext().execute_with(|| {
|
||
|
let actor = alice_account_id();
|
||
|
let companion_id = SlowClap::current_companion_id();
|
||
|
let (valid_network_id, _) = prepare_networks();
|
||
|
let companion = prepare_companion(50);
|
||
|
|
||
|
assert_ok!(SlowClap::propose_companion(
|
||
|
RuntimeOrigin::signed(actor),
|
||
|
valid_network_id, companion.clone()));
|
||
|
assert_ok!(SlowClap::release_companion(
|
||
|
RuntimeOrigin::signed(actor),
|
||
|
valid_network_id, companion_id));
|
||
|
let release_block = ReleaseBlocks::<Runtime>::get(companion_id);
|
||
|
|
||
|
assert_eq!(SlowClap::companions(valid_network_id, companion_id), Some(actor));
|
||
|
assert_eq!(SlowClap::companion_details(companion_id), Some(companion.clone()));
|
||
|
assert_eq!(Balances::balance(&actor), 50);
|
||
|
assert_eq!(Balances::total_issuance(), 50);
|
||
|
|
||
|
System::set_block_number(release_block / 2);
|
||
|
assert_err!(SlowClap::kill_companion(
|
||
|
RuntimeOrigin::signed(actor),
|
||
|
valid_network_id, companion_id),
|
||
|
crate::Error::<Runtime>::ReleaseTimeHasNotCome);
|
||
|
|
||
|
assert_eq!(SlowClap::companions(valid_network_id, companion_id), Some(actor));
|
||
|
assert_eq!(SlowClap::companion_details(companion_id), Some(companion));
|
||
|
assert_eq!(Balances::balance(&actor), 50);
|
||
|
assert_eq!(Balances::total_issuance(), 50);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn could_not_kill_companion_from_random_account() {
|
||
|
new_test_ext().execute_with(|| {
|
||
|
let actor = alice_account_id();
|
||
|
let companion_id = SlowClap::current_companion_id();
|
||
|
let (valid_network_id, _) = prepare_networks();
|
||
|
let companion = prepare_companion(50);
|
||
|
|
||
|
assert_ok!(SlowClap::propose_companion(
|
||
|
RuntimeOrigin::signed(actor),
|
||
|
valid_network_id, companion.clone()));
|
||
|
assert_ok!(SlowClap::release_companion(
|
||
|
RuntimeOrigin::signed(actor),
|
||
|
valid_network_id, companion_id));
|
||
|
let release_block = ReleaseBlocks::<Runtime>::get(companion_id);
|
||
|
|
||
|
assert_eq!(SlowClap::companions(valid_network_id, companion_id), Some(actor));
|
||
|
assert_eq!(SlowClap::companion_details(companion_id), Some(companion.clone()));
|
||
|
assert_eq!(Balances::balance(&actor), 50);
|
||
|
assert_eq!(Balances::total_issuance(), 50);
|
||
|
|
||
|
System::set_block_number(release_block + 1);
|
||
|
assert_err!(SlowClap::kill_companion(
|
||
|
RuntimeOrigin::signed(eve_account_id()),
|
||
|
valid_network_id, companion_id),
|
||
|
crate::Error::<Runtime>::NotValidCompanion);
|
||
|
|
||
|
assert_eq!(SlowClap::companions(valid_network_id, companion_id), Some(actor));
|
||
|
assert_eq!(SlowClap::companion_details(companion_id), Some(companion));
|
||
|
assert_eq!(Balances::balance(&actor), 50);
|
||
|
assert_eq!(Balances::total_issuance(), 50);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn request_body_is_correct_for_get_block_number() {
|
||
|
let (offchain, _) = TestOffchainExt::new();
|
||
|
let mut t = sp_io::TestExternalities::default();
|
||
|
t.register_extension(OffchainWorkerExt::new(offchain));
|
||
|
|
||
|
t.execute_with(|| {
|
||
|
let request_body = SlowClap::prepare_request_body(
|
||
|
None, 0, Vec::new(), Vec::new());
|
||
|
assert_eq!(core::str::from_utf8(&request_body).unwrap(),
|
||
|
r#"{"id":0,"jsonrpc":"2.0","method":"eth_blockNumber"}"#);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn request_body_is_correct_for_get_logs() {
|
||
|
let (offchain, _) = TestOffchainExt::new();
|
||
|
let mut t = sp_io::TestExternalities::default();
|
||
|
t.register_extension(OffchainWorkerExt::new(offchain));
|
||
|
|
||
|
t.execute_with(|| {
|
||
|
let request_body = SlowClap::prepare_request_body(
|
||
|
Some(1337), 69, get_gatekeeper(), get_topic_name());
|
||
|
assert_eq!(
|
||
|
core::str::from_utf8(&request_body).unwrap(),
|
||
|
r#"{"id":0,"jsonrpc":"2.0","method":"eth_getLogs","params":[{"fromBlock":1268,"toBlock":1337,"address":"0x4d224452801ACEd8B2F0aebE155379bb5D594381","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"]}]}"#,
|
||
|
);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn should_make_http_call_for_block_number() {
|
||
|
let (offchain, state) = TestOffchainExt::new();
|
||
|
let mut t = sp_io::TestExternalities::default();
|
||
|
t.register_extension(OffchainWorkerExt::new(offchain));
|
||
|
|
||
|
evm_block_response(&mut state.write());
|
||
|
|
||
|
t.execute_with(|| {
|
||
|
let request_body = SlowClap::prepare_request_body(
|
||
|
None, 0, Vec::new(), Vec::new());
|
||
|
let raw_response = SlowClap::fetch_from_remote(
|
||
|
get_rpc_endpoint(), request_body).unwrap();
|
||
|
assert_eq!(raw_response.len(), 45usize); // precalculated
|
||
|
});
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn should_make_http_call_for_logs() {
|
||
|
let (offchain, state) = TestOffchainExt::new();
|
||
|
let mut t = sp_io::TestExternalities::default();
|
||
|
t.register_extension(OffchainWorkerExt::new(offchain));
|
||
|
|
||
|
evm_logs_response(&mut state.write());
|
||
|
|
||
|
t.execute_with(|| {
|
||
|
let request_body = SlowClap::prepare_request_body(
|
||
|
Some(20335857), 84, get_gatekeeper(), get_topic_name());
|
||
|
let raw_response = SlowClap::fetch_from_remote(
|
||
|
get_rpc_endpoint(), request_body).unwrap();
|
||
|
assert_eq!(raw_response.len(), 1805); // precalculated
|
||
|
});
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn should_make_http_call_and_parse_block_number() {
|
||
|
let (offchain, state) = TestOffchainExt::new();
|
||
|
let mut t = sp_io::TestExternalities::default();
|
||
|
t.register_extension(OffchainWorkerExt::new(offchain));
|
||
|
|
||
|
evm_block_response(&mut state.write());
|
||
|
|
||
|
t.execute_with(|| {
|
||
|
let evm_response = SlowClap::fetch_and_parse(
|
||
|
None, 0, Vec::<u8>::new(),
|
||
|
Vec::<u8>::new(), get_rpc_endpoint()).unwrap();
|
||
|
let evm_block_number = match evm_response {
|
||
|
EvmResponseType::BlockNumber(evm_block) => Some(evm_block),
|
||
|
_ => None,
|
||
|
};
|
||
|
assert_eq!(evm_block_number.unwrap_or_default(), 20335745);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn should_make_http_call_and_parse_logs() {
|
||
|
let (offchain, state) = TestOffchainExt::new();
|
||
|
let mut t = sp_io::TestExternalities::default();
|
||
|
t.register_extension(OffchainWorkerExt::new(offchain));
|
||
|
|
||
|
evm_logs_response(&mut state.write());
|
||
|
let expected_logs = get_expected_logs();
|
||
|
|
||
|
t.execute_with(|| {
|
||
|
let evm_response = SlowClap::fetch_and_parse(
|
||
|
Some(20335857), 84, get_gatekeeper(),
|
||
|
get_topic_name(), get_rpc_endpoint()
|
||
|
).unwrap();
|
||
|
let evm_logs = match evm_response {
|
||
|
EvmResponseType::TransactionLogs(logs) => Some(logs),
|
||
|
_ => None,
|
||
|
};
|
||
|
assert!(evm_logs.is_some());
|
||
|
let evm_logs = evm_logs.unwrap();
|
||
|
assert_eq!(evm_logs, expected_logs);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn should_catch_error_in_json_response() {
|
||
|
let (offchain, state) = TestOffchainExt::new();
|
||
|
let mut t = sp_io::TestExternalities::default();
|
||
|
t.register_extension(OffchainWorkerExt::new(offchain));
|
||
|
|
||
|
evm_error_response(&mut state.write());
|
||
|
|
||
|
t.execute_with(|| {
|
||
|
assert_err!(SlowClap::fetch_and_parse(
|
||
|
None, 0, Vec::<u8>::new(),
|
||
|
Vec::<u8>::new(), get_rpc_endpoint()),
|
||
|
OffchainErr::ErrorInEvmResponse);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// #[test]
|
||
|
// fn conversion_to_claps_is_correct() {
|
||
|
// todo!();
|
||
|
// }
|
||
|
//
|
||
|
// #[test]
|
||
|
// fn evm_block_storage_is_empty_by_default() {
|
||
|
// todo!();
|
||
|
// }
|
||
|
//
|
||
|
// #[test]
|
||
|
// fn evm_block_is_stored_locally_after_first_response() {
|
||
|
// todo!();
|
||
|
// }
|
||
|
//
|
||
|
// #[test]
|
||
|
// fn evm_block_storage_is_none_after_logs() {
|
||
|
// todo!();
|
||
|
// }
|
||
|
//
|
||
|
// #[test]
|
||
|
// fn send_evm_usigned_transaction_from_authority() {
|
||
|
// todo!();
|
||
|
// }
|
||
|
|
||
|
// #[test]
|
||
|
// fn should_report_offline_validators() {
|
||
|
// new_test_ext().execute_with(|| {
|
||
|
// let block = 1;
|
||
|
// System::set_block_number(block);
|
||
|
// advance_session();
|
||
|
// let validators = vec![1, 2, 3, 4, 5, 6];
|
||
|
// Validators::mutate(|l| *l = Some(validators.clone()));
|
||
|
// advance_session();
|
||
|
//
|
||
|
// advance_session();
|
||
|
//
|
||
|
// let offences = Offences::take();
|
||
|
// assert_eq!(
|
||
|
// offences,
|
||
|
// vec![(
|
||
|
// vec![],
|
||
|
// ThrottlingOffence {
|
||
|
// session_index: 2,
|
||
|
// validator_set_count: 3,
|
||
|
// offenders: vec![(1, 1), (2, 2), (3, 3)],
|
||
|
// }
|
||
|
// )]
|
||
|
// );
|
||
|
//
|
||
|
// for (idx, v) in validators.into_iter().take(4).enumerate() {
|
||
|
// let _ = clap();
|
||
|
// }
|
||
|
//
|
||
|
// advance_session();
|
||
|
//
|
||
|
// let offences = Offences::take();
|
||
|
// assert_eq!(
|
||
|
// offences,
|
||
|
// vec![(
|
||
|
// vec![],
|
||
|
// ThrottlingOffence {
|
||
|
// session_index: 3,
|
||
|
// validator_set_count: 6,
|
||
|
// offenders: vec![(5, 5), (6, 6)],
|
||
|
// }
|
||
|
// )]
|
||
|
// );
|
||
|
// });
|
||
|
// }
|
||
|
//
|
||
|
// #[test]
|
||
|
// fn should_increase_actions_of_validators_when_clap_is_received() {
|
||
|
// }
|
||
|
//
|
||
|
// #[test]
|
||
|
// fn same_claps_should_not_increase_actions() {
|
||
|
// }
|
||
|
//
|
||
|
// #[test]
|
||
|
// fn should_cleanup_received_claps_on_session_end() {
|
||
|
// }
|
||
|
//
|
||
|
// #[test]
|
||
|
// fn should_mark_validator_if_disabled() {
|
||
|
// }
|
||
|
|
||
|
fn get_rpc_endpoint() -> Vec<u8> {
|
||
|
b"https://nd-422-757-666.p2pify.com/0a9d79d93fb2f4a4b1e04695da2b77a7/".to_vec()
|
||
|
}
|
||
|
|
||
|
fn get_gatekeeper() -> Vec<u8> {
|
||
|
b"0x4d224452801ACEd8B2F0aebE155379bb5D594381".to_vec()
|
||
|
}
|
||
|
|
||
|
fn get_topic_name() -> Vec<u8> {
|
||
|
b"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef".to_vec()
|
||
|
}
|
||
|
|
||
|
fn get_network_id() -> u32 {
|
||
|
// let mut network_id: NetworkIdOf<Runtime> = Default::default();
|
||
|
// network_id.saturating_inc();
|
||
|
// network_id
|
||
|
1u32
|
||
|
}
|
||
|
|
||
|
fn evm_block_response(state: &mut testing::OffchainState) {
|
||
|
let expected_body = br#"{"id":0,"jsonrpc":"2.0","method":"eth_blockNumber"}"#.to_vec();
|
||
|
state.expect_request(testing::PendingRequest {
|
||
|
method: "POST".into(),
|
||
|
uri: "https://nd-422-757-666.p2pify.com/0a9d79d93fb2f4a4b1e04695da2b77a7/".into(),
|
||
|
headers: vec![
|
||
|
("ACCEPT".to_string(), "APPLICATION/JSON".to_string()),
|
||
|
("CONTENT-TYPE".to_string(), "APPLICATION/JSON".to_string()),
|
||
|
],
|
||
|
response: Some(b"{\"id\":0,\"jsonrpc\":\"2.0\",\"result\":\"0x1364c81\"}".to_vec()),
|
||
|
body: expected_body,
|
||
|
sent: true,
|
||
|
..Default::default()
|
||
|
});
|
||
|
}
|
||
|
|
||
|
fn evm_error_response(state: &mut testing::OffchainState) {
|
||
|
let expected_body = br#"{"id":0,"jsonrpc":"2.0","method":"eth_blockNumber"}"#.to_vec();
|
||
|
state.expect_request(testing::PendingRequest {
|
||
|
method: "POST".into(),
|
||
|
uri: "https://nd-422-757-666.p2pify.com/0a9d79d93fb2f4a4b1e04695da2b77a7/".into(),
|
||
|
headers: vec![
|
||
|
("ACCEPT".to_string(), "APPLICATION/JSON".to_string()),
|
||
|
("CONTENT-TYPE".to_string(), "APPLICATION/JSON".to_string()),
|
||
|
],
|
||
|
response: Some(b"{\"id\":0,\"jsonrpc\":\"2.0\",\"error\":\"some bad error occures :-(\"}".to_vec()),
|
||
|
body: expected_body,
|
||
|
sent: true,
|
||
|
..Default::default()
|
||
|
});
|
||
|
}
|
||
|
|
||
|
fn evm_logs_response(state: &mut testing::OffchainState) {
|
||
|
let expected_body = br#"{"id":0,"jsonrpc":"2.0","method":"eth_getLogs","params":[{"fromBlock":20335773,"toBlock":20335857,"address":"0x4d224452801ACEd8B2F0aebE155379bb5D594381","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"]}]}"#.to_vec();
|
||
|
|
||
|
let expected_response = br#"{
|
||
|
"jsonrpc":"2.0",
|
||
|
"id":0,
|
||
|
"result":[
|
||
|
{
|
||
|
"address":"0x4d224452801aced8b2f0aebe155379bb5d594381",
|
||
|
"topics":[
|
||
|
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
|
||
|
"0x000000000000000000000000d91efec7e42f80156d1d9f660a69847188950747",
|
||
|
"0x0000000000000000000000005e611dfbe71b988cf2a3e5fe4191b5e3d4c4212a"
|
||
|
],
|
||
|
"data":"0x000000000000000000000000000000000000000000000046f0d522a71fdac000",
|
||
|
"blockNumber":"0x1364c9d",
|
||
|
"transactionHash":"0xa82f2fe87f4ba01ab3bd2cd4d0fe75a26f0e9a37e2badc004a0e38f9d088a758",
|
||
|
"transactionIndex":"0x11",
|
||
|
"blockHash":"0x4b08f82d5a948c0bc5c23c8ddce55e5b4536d7454be53668bbd985ef13dca04a",
|
||
|
"logIndex":"0x92",
|
||
|
"removed":false
|
||
|
},
|
||
|
{
|
||
|
"address":"0x4d224452801aced8b2f0aebe155379bb5d594381",
|
||
|
"topics":[
|
||
|
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
|
||
|
"0x0000000000000000000000005954ab967bc958940b7eb73ee84797dc8a2afbb9",
|
||
|
"0x000000000000000000000000465165be7cacdbd2cbc8334f549fab9783ad6e7a"
|
||
|
],
|
||
|
"data":"0x0000000000000000000000000000000000000000000000027c790defec959e75",
|
||
|
"blockNumber":"0x1364cf1",
|
||
|
"transactionHash":"0xd9f02b79a90db7536b0afb5e24bbc1f4319dc3d8c57af7c39941acd249ec053a",
|
||
|
"transactionIndex":"0x2c",
|
||
|
"blockHash":"0x6876b18f5081b5d24d5a73107a667a7713256f6e51edbbe52bf8df24e340b0f7",
|
||
|
"logIndex":"0x14b",
|
||
|
"removed":false
|
||
|
}
|
||
|
]
|
||
|
}"#.to_vec();
|
||
|
|
||
|
state.expect_request(testing::PendingRequest {
|
||
|
method: "POST".into(),
|
||
|
uri: "https://nd-422-757-666.p2pify.com/0a9d79d93fb2f4a4b1e04695da2b77a7/".into(),
|
||
|
headers: vec![
|
||
|
("ACCEPT".to_string(), "APPLICATION/JSON".to_string()),
|
||
|
("CONTENT-TYPE".to_string(), "APPLICATION/JSON".to_string()),
|
||
|
],
|
||
|
body: expected_body,
|
||
|
response: Some(expected_response),
|
||
|
sent: true,
|
||
|
..Default::default()
|
||
|
});
|
||
|
}
|
||
|
|
||
|
fn get_expected_logs() -> Vec<Log> {
|
||
|
let byte_converter = |s: &str| -> Vec<u8> {
|
||
|
(2..s.len())
|
||
|
.step_by(2)
|
||
|
.map(|i| u8::from_str_radix(&s[i..i+2], 16).expect("valid u8 symbol; qed"))
|
||
|
.collect()
|
||
|
};
|
||
|
|
||
|
vec![
|
||
|
Log {
|
||
|
transaction_hash: Some(H256::from_slice(&byte_converter("0xa82f2fe87f4ba01ab3bd2cd4d0fe75a26f0e9a37e2badc004a0e38f9d088a758"))),
|
||
|
block_number: Some(20335773),
|
||
|
topics: vec![
|
||
|
byte_converter("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"),
|
||
|
byte_converter("0x000000000000000000000000d91efec7e42f80156d1d9f660a69847188950747"),
|
||
|
byte_converter("0x0000000000000000000000005e611dfbe71b988cf2a3e5fe4191b5e3d4c4212a"),
|
||
|
],
|
||
|
address: Some(b"0x4d224452801aced8b2f0aebe155379bb5d594381".to_vec()),
|
||
|
data: sp_std::collections::btree_map::BTreeMap::from([(0, 1308625900000000000000)]),
|
||
|
removed: false,
|
||
|
},
|
||
|
Log {
|
||
|
transaction_hash: Some(H256::from_slice(&byte_converter("0xd9f02b79a90db7536b0afb5e24bbc1f4319dc3d8c57af7c39941acd249ec053a"))),
|
||
|
block_number: Some(20335857),
|
||
|
topics: vec![
|
||
|
byte_converter("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"),
|
||
|
byte_converter("0x0000000000000000000000005954ab967bc958940b7eb73ee84797dc8a2afbb9"),
|
||
|
byte_converter("0x000000000000000000000000465165be7cacdbd2cbc8334f549fab9783ad6e7a"),
|
||
|
],
|
||
|
address: Some(b"0x4d224452801aced8b2f0aebe155379bb5d594381".to_vec()),
|
||
|
data: sp_std::collections::btree_map::BTreeMap::from([(0, 45862703604421729909)]),
|
||
|
removed: false,
|
||
|
},
|
||
|
]
|
||
|
}
|