From b3d2012e0fea85d681fc18c2bcb049b2cdc0160e Mon Sep 17 00:00:00 2001 From: Yan Liu Date: Wed, 29 Jan 2025 23:15:04 +0100 Subject: [PATCH] fix(ledger): Make the transfer fee optional --- ic-canister/src/canister_backend/icrc1.rs | 2 +- ic-canister/tests/test_icrc1.rs | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/ic-canister/src/canister_backend/icrc1.rs b/ic-canister/src/canister_backend/icrc1.rs index d228ca6..df88385 100644 --- a/ic-canister/src/canister_backend/icrc1.rs +++ b/ic-canister/src/canister_backend/icrc1.rs @@ -191,7 +191,7 @@ pub fn _icrc1_transfer(arg: TransferArg) -> Result { let to: IcrcCompatibleAccount = arg.to.into(); LEDGER_MAP.with(|ledger| { - let fee = nat_to_balance(&arg.fee.unwrap_or_default()); + let fee = nat_to_balance(&arg.fee.unwrap_or(Nat::from(DC_TOKEN_TRANSFER_FEE_E9S))); let balance_to_after: TokenAmountE9s = if to.is_minting_account() { if fee != 0 { return Err(Icrc1TransferError::BadFee { diff --git a/ic-canister/tests/test_icrc1.rs b/ic-canister/tests/test_icrc1.rs index c875be4..e1b4205 100644 --- a/ic-canister/tests/test_icrc1.rs +++ b/ic-canister/tests/test_icrc1.rs @@ -415,6 +415,26 @@ fn test_fee_handling() { Result ); assert!(result.is_ok()); + + // Test with no fee + let transfer_arg = TransferArg { + from_subaccount: None, + to, + amount: 1_000_000u64.into(), + fee: None, + created_at_time: Some(ts), + memo: None, + }; + + let result = update_check_and_decode!( + ctx.pic, + ctx.canister_id, + from.owner, + "icrc1_transfer", + candid::encode_one(transfer_arg).unwrap(), + Result + ); + assert!(result.is_ok()); } #[test]