Fix decimal truncation on Solana

Change-Id: I4b8a90852f03ac03ecbd1e981aa8924a9d26c31f
This commit is contained in:
Hendrik Hofstadt 2021-08-12 19:09:51 +02:00
parent f3ef29c8fd
commit 8e0560274e
1 changed files with 5 additions and 2 deletions

View File

@ -152,8 +152,11 @@ pub fn transfer_native(
invoke_signed(&init_ix, ctx.accounts, &[])?; invoke_signed(&init_ix, ctx.accounts, &[])?;
} }
let trunc_divisor = 10u64.pow(8.max(accs.mint.decimals as u32) - 8);
// Truncate to 8 decimals // Truncate to 8 decimals
let amount: u64 = data.amount / (10u64.pow(8.max(accs.mint.decimals as u32) - 8)); let amount: u64 = data.amount / trunc_divisor;
// Untruncate the amount to drop the remainder so we don't "burn" user's funds.
let amount_trunc: u64 = amount * trunc_divisor;
// Transfer tokens // Transfer tokens
let transfer_ix = spl_token::instruction::transfer( let transfer_ix = spl_token::instruction::transfer(
@ -162,7 +165,7 @@ pub fn transfer_native(
accs.custody.info().key, accs.custody.info().key,
accs.authority_signer.key, accs.authority_signer.key,
&[], &[],
amount, amount_trunc,
)?; )?;
invoke_seeded(&transfer_ix, ctx, &accs.authority_signer, None)?; invoke_seeded(&transfer_ix, ctx, &accs.authority_signer, None)?;