Skip to content

Commit 2d35f82

Browse files
paych and multisig actor
1 parent f2905ea commit 2d35f82

File tree

17 files changed

+125
-121
lines changed

17 files changed

+125
-121
lines changed

Cargo.lock

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

actors/multisig/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ cid = { version = "0.8.3", default-features = false, features = ["serde-codec"]
2323
indexmap = { version = "1.8.0", features = ["serde-1"] }
2424
integer-encoding = { version = "3.0.3", default-features = false }
2525
serde = { version = "1.0.136", features = ["derive"] }
26-
anyhow = "1.0.56"
2726
fvm_ipld_blockstore = { version = "0.1" }
2827
fvm_ipld_encoding = "0.1.0"
2928

actors/multisig/src/lib.rs

Lines changed: 26 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ use std::collections::BTreeSet;
66
use fil_actors_runtime::cbor::serialize_vec;
77
use fil_actors_runtime::runtime::{ActorCode, Runtime, Syscalls};
88
use fil_actors_runtime::{
9-
actor_error, cbor, make_empty_map, make_map_with_root, resolve_to_id_addr, ActorDowncast,
10-
ActorError, Map, INIT_ACTOR_ADDR,
9+
actor_error, cbor, make_empty_map, make_map_with_root, resolve_to_id_addr, ActorContext,
10+
ActorDowncast, ActorError, Map, INIT_ACTOR_ADDR,
1111
};
1212
use fvm_ipld_blockstore::Blockstore;
1313
use fvm_ipld_encoding::RawBytes;
@@ -73,12 +73,8 @@ impl Actor {
7373
let mut resolved_signers = Vec::with_capacity(params.signers.len());
7474
let mut dedup_signers = BTreeSet::new();
7575
for signer in &params.signers {
76-
let resolved = resolve_to_id_addr(rt, signer).map_err(|e| {
77-
e.downcast_default(
78-
ExitCode::USR_ILLEGAL_STATE,
79-
format!("failed to resolve addr {} to ID addr", signer),
80-
)
81-
})?;
76+
let resolved = resolve_to_id_addr(rt, signer)
77+
.with_context(|| format!("failed to resolve addr {} to ID addr", signer))?;
8278
if !dedup_signers.insert(resolved.id().expect("address should be resolved")) {
8379
return Err(
8480
actor_error!(illegal_argument; "duplicate signer not allowed: {}", signer),
@@ -269,11 +265,8 @@ impl Actor {
269265
return Err(actor_error!(forbidden; "Cannot cancel another signers transaction"));
270266
}
271267

272-
let calculated_hash = compute_proposal_hash(&tx, rt).map_err(|e| {
273-
e.downcast_default(
274-
ExitCode::USR_ILLEGAL_STATE,
275-
format!("failed to compute proposal hash for (tx: {:?})", params.id),
276-
)
268+
let calculated_hash = compute_proposal_hash(&tx, rt).with_context(|| {
269+
format!("failed to compute proposal hash for (tx: {:?})", params.id)
277270
})?;
278271

279272
if !params.proposal_hash.is_empty() && params.proposal_hash != calculated_hash {
@@ -299,12 +292,8 @@ impl Actor {
299292
{
300293
let receiver = rt.message().receiver();
301294
rt.validate_immediate_caller_is(std::iter::once(&receiver))?;
302-
let resolved_new_signer = resolve_to_id_addr(rt, &params.signer).map_err(|e| {
303-
e.downcast_default(
304-
ExitCode::USR_ILLEGAL_STATE,
305-
format!("failed to resolve address {}", params.signer),
306-
)
307-
})?;
295+
let resolved_new_signer = resolve_to_id_addr(rt, &params.signer)
296+
.with_context(|| format!("failed to resolve address {}", params.signer))?;
308297

309298
rt.transaction(|st: &mut State, _| {
310299
if st.signers.len() >= SIGNERS_MAX {
@@ -336,12 +325,8 @@ impl Actor {
336325
{
337326
let receiver = rt.message().receiver();
338327
rt.validate_immediate_caller_is(std::iter::once(&receiver))?;
339-
let resolved_old_signer = resolve_to_id_addr(rt, &params.signer).map_err(|e| {
340-
e.downcast_default(
341-
ExitCode::USR_ILLEGAL_STATE,
342-
format!("failed to resolve address {}", params.signer),
343-
)
344-
})?;
328+
let resolved_old_signer = resolve_to_id_addr(rt, &params.signer)
329+
.with_context(|| format!("failed to resolve address {}", params.signer))?;
345330

346331
rt.transaction(|st: &mut State, rt| {
347332
if !st.is_signer(&resolved_old_signer) {
@@ -374,12 +359,9 @@ impl Actor {
374359
}
375360

376361
// Remove approvals from removed signer
377-
st.purge_approvals(rt.store(), &resolved_old_signer).map_err(|e| {
378-
e.downcast_default(
379-
ExitCode::USR_ILLEGAL_STATE,
380-
"failed to purge approvals of removed signer",
381-
)
382-
})?;
362+
st.purge_approvals(rt.store(), &resolved_old_signer)
363+
.context("failed to purge approvals of removed signer")?;
364+
383365
st.signers.retain(|s| s != &resolved_old_signer);
384366

385367
Ok(())
@@ -396,18 +378,10 @@ impl Actor {
396378
{
397379
let receiver = rt.message().receiver();
398380
rt.validate_immediate_caller_is(std::iter::once(&receiver))?;
399-
let from_resolved = resolve_to_id_addr(rt, &params.from).map_err(|e| {
400-
e.downcast_default(
401-
ExitCode::USR_ILLEGAL_STATE,
402-
format!("failed to resolve address {}", params.from),
403-
)
404-
})?;
405-
let to_resolved = resolve_to_id_addr(rt, &params.to).map_err(|e| {
406-
e.downcast_default(
407-
ExitCode::USR_ILLEGAL_STATE,
408-
format!("failed to resolve address {}", params.to),
409-
)
410-
})?;
381+
let from_resolved = resolve_to_id_addr(rt, &params.from)
382+
.with_context(|| format!("failed to resolve address {}", params.from))?;
383+
let to_resolved = resolve_to_id_addr(rt, &params.to)
384+
.with_context(|| format!("failed to resolve address {}", params.to))?;
411385

412386
rt.transaction(|st: &mut State, rt| {
413387
if !st.is_signer(&from_resolved) {
@@ -424,12 +398,9 @@ impl Actor {
424398
// Add new signer
425399
st.signers.push(to_resolved);
426400

427-
st.purge_approvals(rt.store(), &from_resolved).map_err(|e| {
428-
e.downcast_default(
429-
ExitCode::USR_ILLEGAL_STATE,
430-
"failed to purge approvals of removed signer",
431-
)
432-
})?;
401+
st.purge_approvals(rt.store(), &from_resolved)
402+
.context("failed to purge approvals of removed signer")?;
403+
433404
Ok(())
434405
})?;
435406

@@ -621,12 +592,8 @@ where
621592
.ok_or_else(|| actor_error!(not_found, "no such transaction {:?} for approval", txn_id))?;
622593

623594
if !proposal_hash.is_empty() {
624-
let calculated_hash = compute_proposal_hash(txn, rt).map_err(|e| {
625-
e.downcast_default(
626-
ExitCode::USR_ILLEGAL_STATE,
627-
format!("failed to compute proposal hash for (tx: {:?})", txn_id),
628-
)
629-
})?;
595+
let calculated_hash = compute_proposal_hash(txn, rt)
596+
.with_context(|| format!("failed to compute proposal hash for (tx: {:?})", txn_id))?;
630597

631598
if proposal_hash != calculated_hash {
632599
return Err(actor_error!(
@@ -641,7 +608,10 @@ where
641608

642609
/// Computes a digest of a proposed transaction. This digest is used to confirm identity
643610
/// of the transaction associated with an ID, which might change under chain re-orgs.
644-
pub fn compute_proposal_hash(txn: &Transaction, sys: &dyn Syscalls) -> anyhow::Result<[u8; 32]> {
611+
pub fn compute_proposal_hash(
612+
txn: &Transaction,
613+
sys: &dyn Syscalls,
614+
) -> Result<[u8; 32], ActorError> {
645615
let proposal_hash = ProposalHashData {
646616
requester: txn.approved.get(0),
647617
to: &txn.to,

actors/multisig/src/state.rs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
// Copyright 2019-2022 ChainSafe Systems
22
// SPDX-License-Identifier: Apache-2.0, MIT
33

4-
use anyhow::anyhow;
54
use cid::Cid;
5+
use fil_actors_runtime::actor_error;
6+
use fil_actors_runtime::ActorError;
67
use fvm_ipld_blockstore::Blockstore;
78
use fvm_ipld_encoding::tuple::*;
89
use fvm_ipld_encoding::Cbor;
@@ -75,7 +76,7 @@ impl State {
7576
&mut self,
7677
store: &BS,
7778
addr: &Address,
78-
) -> anyhow::Result<()> {
79+
) -> Result<(), ActorError> {
7980
let mut txns = make_map_with_root(&self.pending_txs, store)?;
8081

8182
// Identify transactions that need updating
@@ -86,7 +87,6 @@ impl State {
8687
txn_ids_to_purge.insert(tx_id.0.clone(), txn.clone());
8788
}
8889
}
89-
Ok(())
9090
})?;
9191

9292
// Update or remove those transactions.
@@ -110,12 +110,17 @@ impl State {
110110
balance: TokenAmount,
111111
amount_to_spend: &TokenAmount,
112112
curr_epoch: ChainEpoch,
113-
) -> anyhow::Result<()> {
113+
) -> Result<(), ActorError> {
114114
if amount_to_spend < &0.into() {
115-
return Err(anyhow!("amount to spend {} less than zero", amount_to_spend));
115+
return Err(actor_error!(
116+
insufficient_funds,
117+
"amount to spend {} less than zero",
118+
amount_to_spend
119+
));
116120
}
117121
if &balance < amount_to_spend {
118-
return Err(anyhow!(
122+
return Err(actor_error!(
123+
insufficient_funds,
119124
"current balance {} less than amount to spend {}",
120125
balance,
121126
amount_to_spend
@@ -131,7 +136,8 @@ impl State {
131136
let remaining_balance = balance - amount_to_spend;
132137
let amount_locked = self.amount_locked(curr_epoch - self.start_epoch);
133138
if remaining_balance < amount_locked {
134-
return Err(anyhow!(
139+
return Err(actor_error!(
140+
insufficient_funds,
135141
"actor balance {} if spent {} would be less than required locked amount {}",
136142
remaining_balance,
137143
amount_to_spend,

actors/multisig/tests/util.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,8 +192,7 @@ impl ActorHarness {
192192
let ptx = make_map_with_root::<_, Transaction>(&st.pending_txs, &rt.store).unwrap();
193193
let mut actual_txns = Vec::new();
194194
ptx.for_each(|k, txn: &Transaction| {
195-
actual_txns.push((TxnID(parse_uint_key(k)? as i64), txn.clone()));
196-
Ok(())
195+
actual_txns.push((TxnID(parse_uint_key(k).unwrap() as i64), txn.clone()));
197196
})
198197
.unwrap();
199198
expect_txns.sort_by_key(|(TxnID(id), _txn)| (*id));

actors/paych/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@ num-traits = "0.2.14"
2020
num-derive = "0.3.3"
2121
serde = { version = "1.0.136", features = ["derive"] }
2222
cid = { version = "0.8.3", default-features = false, features = ["serde-codec"] }
23-
anyhow = "1.0.56"
2423
fvm_ipld_blockstore = { version = "0.1" }
2524
fvm_ipld_encoding = "0.1.0"
2625

2726
[dev-dependencies]
27+
anyhow = "1.0.56"
2828
fil_actors_runtime = { version = "8.0.0-alpha.1", path = "../runtime", features = ["test_utils", "sector-default"] }
2929
fvm_ipld_amt = { version = "0.4.0", features = ["go-interop"] }
3030
derive_builder = "0.10.2"

actors/paych/src/lib.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
// SPDX-License-Identifier: Apache-2.0, MIT
33

44
use fil_actors_runtime::runtime::{ActorCode, Runtime};
5-
use fil_actors_runtime::{actor_error, cbor, resolve_to_id_addr, ActorDowncast, ActorError, Array};
5+
use fil_actors_runtime::{
6+
actor_error, cbor, resolve_to_id_addr, ActorContext, ActorDowncast, ActorError, Array,
7+
};
68
use fvm_ipld_blockstore::Blockstore;
79
use fvm_ipld_encoding::RawBytes;
810
use fvm_shared::actor::builtin::Type;
@@ -72,12 +74,8 @@ impl Actor {
7274
BS: Blockstore,
7375
RT: Runtime<BS>,
7476
{
75-
let resolved = resolve_to_id_addr(rt, raw).map_err(|e| {
76-
e.downcast_default(
77-
ExitCode::USR_ILLEGAL_STATE,
78-
format!("failed to resolve address {}", raw),
79-
)
80-
})?;
77+
let resolved = resolve_to_id_addr(rt, raw)
78+
.with_context(|| format!("failed to resolve address {}", raw))?;
8179

8280
let code_cid = rt
8381
.get_actor_code_cid(&resolved)

actors/power/src/lib.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ impl Actor {
408408
}
409409
};
410410

411-
if let Err(e) = mmap.for_all::<_, SealVerifyInfo, _>(|k, arr| {
411+
if let Err(e) = mmap.try_for_all::<_, SealVerifyInfo, _>(|k, arr| {
412412
let addr = match Address::from_bytes(&k.0) {
413413
Ok(addr) => addr,
414414
Err(e) => {
@@ -431,9 +431,8 @@ impl Actor {
431431
.try_into()
432432
.map_err(|_| "can not convert u64 to usize".to_string())?;
433433
infos.reserve(num_proofs);
434-
arr.for_each::<_, ActorError>(|_, svi| {
434+
arr.for_each(|_, svi| {
435435
infos.push(svi.clone());
436-
Ok(())
437436
})
438437
.map_err(|e| {
439438
format!(

actors/power/src/state.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -327,9 +327,8 @@ pub(super) fn load_cron_events<BS: Blockstore>(
327327
) -> Result<Vec<CronEvent>, ActorError> {
328328
let mut events = Vec::new();
329329

330-
mmap.for_each::<_, _, ActorError>(&epoch_key(epoch), |_, v: &CronEvent| {
330+
mmap.for_each(&epoch_key(epoch), |_, v: &CronEvent| {
331331
events.push(v.clone());
332-
Ok(())
333332
})?;
334333

335334
Ok(events)

actors/power/tests/harness/mod.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ use cid::Cid;
22
use fvm_ipld_blockstore::Blockstore;
33
use fvm_ipld_encoding::{BytesDe, RawBytes};
44
use fvm_ipld_hamt::BytesKey;
5-
use fvm_ipld_hamt::EitherError;
65
use fvm_ipld_hamt::Error;
76
use fvm_shared::address::Address;
87
use fvm_shared::bigint::bigint_ser::BigIntDe;
@@ -181,13 +180,8 @@ where
181180
V: DeserializeOwned + Serialize,
182181
{
183182
let mut ret_keys = Vec::new();
184-
m.for_each::<_, ()>(|k, _| {
183+
m.for_each(|k, _| {
185184
ret_keys.push(k.clone());
186-
Ok(())
187-
})
188-
.map_err(|err| match err {
189-
EitherError::User(()) => unreachable!(),
190-
EitherError::Hamt(e) => e,
191185
})?;
192186

193187
Ok(ret_keys)
@@ -196,5 +190,5 @@ where
196190
pub fn verify_empty_map(rt: &MockRuntime, key: Cid) {
197191
let map =
198192
make_map_with_root_and_bitwidth::<_, BigIntDe>(&key, &rt.store, HAMT_BIT_WIDTH).unwrap();
199-
map.for_each::<_, ()>(|_key, _val| panic!("expected no keys")).unwrap();
193+
map.for_each(|_key, _val| panic!("expected no keys")).unwrap();
200194
}

0 commit comments

Comments
 (0)