|
1 |
| -use fil_actor_miner::locked_reward_from_reward; |
| 1 | +use fil_actor_miner::{locked_reward_from_reward, Actor, Method}; |
| 2 | +use fil_actors_runtime::test_utils::{expect_abort_contains_message, make_identity_cid}; |
| 3 | +use fil_actors_runtime::BURNT_FUNDS_ACTOR_ADDR; |
| 4 | +use fvm_ipld_encoding::RawBytes; |
2 | 5 | use fvm_shared::bigint::Zero;
|
3 | 6 | use fvm_shared::clock::ChainEpoch;
|
4 | 7 | use fvm_shared::econ::TokenAmount;
|
| 8 | +use fvm_shared::error::ExitCode; |
| 9 | +use fvm_shared::METHOD_SEND; |
5 | 10 |
|
6 | 11 | mod util;
|
7 | 12 | use util::*;
|
@@ -48,6 +53,52 @@ fn pay_debt_entirely_from_balance() {
|
48 | 53 | h.check_state(&rt);
|
49 | 54 | }
|
50 | 55 |
|
| 56 | +#[test] |
| 57 | +fn repay_debt_restricted_correctly() { |
| 58 | + let h = ActorHarness::new(PERIOD_OFFSET); |
| 59 | + let mut rt = h.new_runtime(); |
| 60 | + h.construct_and_verify(&mut rt); |
| 61 | + |
| 62 | + // introduce fee debt |
| 63 | + let mut st = h.get_state(&rt); |
| 64 | + let fee_debt: TokenAmount = 4 * &*BIG_BALANCE; |
| 65 | + st.fee_debt = fee_debt.clone(); |
| 66 | + rt.replace_state(&st); |
| 67 | + |
| 68 | + rt.set_caller(make_identity_cid(b"1234"), h.owner); |
| 69 | + |
| 70 | + // fail to call the unexported method |
| 71 | + expect_abort_contains_message( |
| 72 | + ExitCode::USR_FORBIDDEN, |
| 73 | + "must be built-in", |
| 74 | + rt.call::<Actor>(Method::RepayDebt as u64, &RawBytes::default()), |
| 75 | + ); |
| 76 | + |
| 77 | + // can call the exported method |
| 78 | + |
| 79 | + rt.expect_validate_caller_addr(h.caller_addrs()); |
| 80 | + |
| 81 | + rt.add_balance(fee_debt.clone()); |
| 82 | + rt.set_received(fee_debt.clone()); |
| 83 | + |
| 84 | + rt.expect_send( |
| 85 | + BURNT_FUNDS_ACTOR_ADDR, |
| 86 | + METHOD_SEND, |
| 87 | + RawBytes::default(), |
| 88 | + fee_debt.clone(), |
| 89 | + RawBytes::default(), |
| 90 | + ExitCode::OK, |
| 91 | + ); |
| 92 | + |
| 93 | + rt.call::<Actor>(Method::RepayDebtExported as u64, &RawBytes::default()).unwrap(); |
| 94 | + |
| 95 | + rt.verify(); |
| 96 | + |
| 97 | + let st = h.get_state(&rt); |
| 98 | + assert!(st.fee_debt.is_zero()); |
| 99 | + h.check_state(&rt); |
| 100 | +} |
| 101 | + |
51 | 102 | #[test]
|
52 | 103 | fn partially_repay_debt() {
|
53 | 104 | let h = ActorHarness::new(PERIOD_OFFSET);
|
|
0 commit comments