forest/rpc/methods/
market.rs

1// Copyright 2019-2025 ChainSafe Systems
2// SPDX-License-Identifier: Apache-2.0, MIT
3
4use 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}