ic_icrc_tx/builder/
icrc1.rs

1use base64::engine::general_purpose;
2use base64::Engine;
3use candid::Encode;
4
5use crate::types::CanisterCall;
6
7/// Builds an ICRC1 transfer canister call.
8///
9/// # Arguments
10///
11/// * `canister_id` - The ID of the canister to call.
12/// * `transfer_arg` - The transfer arguments.
13///
14/// # Returns
15///
16/// A `CanisterCall` struct containing the canister ID, method name, and encoded arguments.
17pub fn build_icrc1_transfer(
18    canister_id: String,
19    transfer_arg: icrc_ledger_types::icrc1::transfer::TransferArg,
20) -> CanisterCall {
21    CanisterCall {
22        canister_id,
23        method: "icrc1_transfer".to_string(),
24        arg: general_purpose::STANDARD.encode(Encode!(&transfer_arg).unwrap()),
25    }
26}
27
28#[cfg(test)]
29mod tests {
30    use super::*;
31    use candid::{Nat, Principal};
32    use icrc_ledger_types::icrc1::{account::Account, transfer::TransferArg};
33
34    #[test]
35    fn test_build_icrc1_transfer() {
36        let canister_id = "rh2pm-ryaaa-aaaan-qeniq-cai".to_string();
37        let transfer_arg = TransferArg {
38            to: Account {
39                owner: Principal::from_text(
40                    "6pfju-rc52z-aihtt-ahhg6-z2bzc-ofp5r-igp5i-qy5ep-j6vob-gs3ae-nae",
41                )
42                .unwrap(),
43                subaccount: None,
44            },
45            amount: Nat::from(10000000u64),
46            memo: None,
47            fee: None,
48            created_at_time: None,
49            from_subaccount: None,
50        };
51
52        let result = build_icrc1_transfer(canister_id.clone(), transfer_arg.clone());
53
54        println!("Encoded Arg: {}", result.arg);
55
56        assert_eq!(result.canister_id, canister_id);
57        assert_eq!(result.method, "icrc1_transfer".to_string());
58        assert_eq!(
59            result.arg,
60            general_purpose::STANDARD.encode(Encode!(&transfer_arg).unwrap())
61        );
62    }
63}