my backend code
const depositCkusdt = async () => {
const res = await backendActor.deposit_ckusdt();
}
async fn transfer_from(amount: Nat, from: Principal, to: Principal) -> Result<BlockIndex, Error> {
let args = TransferFromArgs {
spender_subaccount: None,
from: Account {
owner: from,
subaccount: None,
},
to: Account {
owner: to,
subaccount: None,
},
amount,
fee: None,
memo: None,
created_at_time: None,
};
let res = ic_cdk::call::<(TransferFromArgs, ), (Result<BlockIndex, TransferFromError>, )>(
Principal::from_text("xevnm-gaaaa-aaaar-qafnq-cai").unwrap(),
"icrc2_transfer_from",
(args, ),
)
.await
.map_err(|(_, message)| Error::IcCdkError { message })?
.0
.map_err(|e| Error::IcCdkError {
message: format!("{:?}", e),
});
res
}
#[update]
async fn deposit_ckusdt() -> Result<Wallet, Error> {
let mut wallet = Wallet::get(caller());
let balance = get_user_balance().await;
if balance.is_err() {
return Err(Error::IcCdkError {
message: format!("{:?}", balance),
});
}
let balance = balance.unwrap();
if balance > Nat::from(3000000 as u64) {
let fee: Nat = get_fee().await;
let _ = transfer_from(balance.clone() - fee, caller(), ic_cdk::id()).await?;
wallet
.deposit(
nat_to_u64(balance.clone() / Nat::from(1000000 as u64)) as f64,
"ExternalWallet".to_string(),
ExchangeType::Deposit,
)
.map_err(|e| Error::IcCdkError {
message: format!("{:?}", e),
})?;
let message = format!("You received {} CKUSD", balance);
Notification::new(
format!("{:?}", time::SystemTime::now()),
caller(),
NoteContent::ReceivedDeposit(message),
)
.save();
}
Ok(wallet.clone())
}
my frontend code
const approveTransaction = async (balance, fee_value) => {
const approveArg: ApproveArgs = {
fee: [BigInt(fee_value)],
memo: [],
from_subaccount: [],
created_at_time: [],
amount: BigInt(Number(balance)),
expected_allowance: [BigInt(Number(balance))],
expires_at: [],
spender: {
owner: Principal.fromText(canisterId),
subaccount: [],
},
};
return await ckUSDCActor.icrc2_approve(approveArg);
};
const fee_value = await fetchFee();
const account = { owner: Principal.fromText(profile.id), subaccount: [] };
const balance = await fetchBalance(account);
console.log({ balance });
if (balance > BigInt(1000000)) {
// -------------------- icrc2_approve --------------------
let approve = await approveTransaction(balance, fee_value);
console.log({ approve,fee_value });
// -------------------- icrc2_allowance --------------------
const allowance: AllowanceArgs = {
account: {
owner: Principal.fromText(canisterId),
subaccount: [],
},
spender: {
owner: Principal.fromText(canisterId),
subaccount: [],
},
};
let allowance_res: Allowance =
await ckUSDCActor?.icrc2_allowance(allowance);
console.log({ allowance_res });
// -------------------- transfer from user to odoc wallet --------------------
let deposit = await depositCkusdt();
console.log({ deposit });
}