diff --git a/solana/modules/token_bridge/program/src/api/complete_transfer.rs b/solana/modules/token_bridge/program/src/api/complete_transfer.rs index 4083ba21..86e0ab6d 100644 --- a/solana/modules/token_bridge/program/src/api/complete_transfer.rs +++ b/solana/modules/token_bridge/program/src/api/complete_transfer.rs @@ -244,23 +244,19 @@ pub fn complete_wrapped( let (_, is_external) = derive_mint_for_token(ctx.program_id, accs.vaa.token_address, accs.vaa.token_chain); - - // When dealing with external adopted mints, we check if the asset in question is larger than - // the mint in question. If it is, we truncate to the mints size. For example, sollet assets - // are truncated to 6 decimals, however Wormhole uses 8 and assumes wire-truncation to 8 - // decimals. - let (amount, fee) = if is_external && accs.wrapped_meta.original_decimals > accs.mint.decimals { - let difference = 8u32.checked_sub(accs.mint.decimals.into()).unwrap(); + let (amount, fee) = if is_external && accs.wrapped_meta.original_decimals > 6 { + // Sollet assets are truncated to 6 decimals, however Wormhole uses 8 and assumes + // wire-truncation to 8 decimals. ( accs.vaa .amount .as_u64() - .checked_div(10u64.pow(difference.min(accs.wrapped_meta.original_decimals as u32 - 6))) + .checked_div(10u64.pow(2.min(accs.wrapped_meta.original_decimals as u32 - 6))) .unwrap(), accs.vaa .fee .as_u64() - .checked_div(10u64.pow(difference.min(accs.wrapped_meta.original_decimals as u32 - 6))) + .checked_div(10u64.pow(2.min(accs.wrapped_meta.original_decimals as u32 - 6))) .unwrap(), ) } else { diff --git a/solana/modules/token_bridge/program/src/api/transfer.rs b/solana/modules/token_bridge/program/src/api/transfer.rs index 538e01e9..419788c8 100644 --- a/solana/modules/token_bridge/program/src/api/transfer.rs +++ b/solana/modules/token_bridge/program/src/api/transfer.rs @@ -336,19 +336,15 @@ pub fn transfer_wrapped( accs.wrapped_meta.token_address, accs.wrapped_meta.chain, ); - - // When dealing with external adopted mints, we check if the asset in question is larger than - // the mint in question. If it is, we truncate to the mints size. For example, sollet assets - // are truncated to 6 decimals, however Wormhole uses 8 and assumes wire-truncation to 8 - // decimals. Larger mints are unsupported. - let (amount, fee) = if is_external && accs.wrapped_meta.original_decimals > accs.mint.decimals { - let difference = 8u32.checked_sub(accs.mint.decimals.into()).unwrap(); + let (amount, fee) = if is_external && accs.wrapped_meta.original_decimals > 6 { + // Sollet assets are truncated to 6 decimals, however Wormhole uses 8 and assumes + // wire-truncation to 8 decimals. ( data.amount - .checked_mul(10u64.pow(difference.min(accs.wrapped_meta.original_decimals as u32 - 6))) + .checked_mul(10u64.pow(2.min(accs.wrapped_meta.original_decimals as u32 - 6))) .unwrap(), data.fee - .checked_mul(10u64.pow(difference.min(accs.wrapped_meta.original_decimals as u32 - 6))) + .checked_mul(10u64.pow(2.min(accs.wrapped_meta.original_decimals as u32 - 6))) .unwrap(), ) } else {