forest/rpc/methods/
market.rs1use crate::rpc::error::ServerError;
5use crate::rpc::mpool::MpoolPushMessage;
6use crate::rpc::{ApiPaths, Ctx, Permission, RpcMethod};
7use crate::shim::{address::Address, message::Message, message::MethodNum};
8use cid::Cid;
9use enumflags2::BitFlags;
10use fvm_ipld_blockstore::Blockstore;
11use fvm_ipld_encoding::RawBytes;
12use num_bigint::BigInt;
13
14const METHOD_ADD_BALANCE: MethodNum = 2;
15
16pub enum MarketAddBalance {}
17impl RpcMethod<3> for MarketAddBalance {
18 const NAME: &'static str = "Filecoin.MarketAddBalance";
19 const PARAM_NAMES: [&'static str; 3] = ["wallet", "address", "amount"];
20 const API_PATHS: BitFlags<ApiPaths> = ApiPaths::all();
21 const PERMISSION: Permission = Permission::Sign;
22
23 type Params = (Address, Address, BigInt);
24 type Ok = Cid;
25
26 async fn handle(
27 ctx: Ctx<impl Blockstore + Send + Sync + 'static>,
28 (wallet, address, amount): Self::Params,
29 ) -> Result<Self::Ok, ServerError> {
30 let bytes = fvm_ipld_encoding::to_vec(&address)?;
31 let params = RawBytes::new(bytes);
32
33 let message = Message {
34 to: Address::MARKET_ACTOR,
35 from: wallet,
36 value: amount.into(),
37 method_num: METHOD_ADD_BALANCE,
38 params,
39 ..Default::default()
40 };
41
42 let smsg = MpoolPushMessage::handle(ctx, (message, None)).await?;
43 Ok(smsg.cid())
44 }
45}