solana/token_bridge: calculate diff from original mint

Change-Id: I2bf59ecd353e27de4dc3a947b87c738bdff320ea
This commit is contained in:
Reisen 2021-09-07 16:32:27 +00:00 committed by David Paryente
parent 4865275d95
commit 8fb9caf606
2 changed files with 18 additions and 10 deletions

View File

@ -244,19 +244,23 @@ pub fn complete_wrapped(
let (_, is_external) =
derive_mint_for_token(ctx.program_id, accs.vaa.token_address, accs.vaa.token_chain);
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.
// 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();
(
accs.vaa
.amount
.as_u64()
.checked_div(10u64.pow(2.min(accs.wrapped_meta.original_decimals as u32 - 6)))
.checked_div(10u64.pow(difference.min(accs.wrapped_meta.original_decimals as u32 - 6)))
.unwrap(),
accs.vaa
.fee
.as_u64()
.checked_div(10u64.pow(2.min(accs.wrapped_meta.original_decimals as u32 - 6)))
.checked_div(10u64.pow(difference.min(accs.wrapped_meta.original_decimals as u32 - 6)))
.unwrap(),
)
} else {

View File

@ -336,15 +336,19 @@ pub fn transfer_wrapped(
accs.wrapped_meta.token_address,
accs.wrapped_meta.chain,
);
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.
// 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();
(
data.amount
.checked_mul(10u64.pow(2.min(accs.wrapped_meta.original_decimals as u32 - 6)))
.checked_mul(10u64.pow(difference.min(accs.wrapped_meta.original_decimals as u32 - 6)))
.unwrap(),
data.fee
.checked_mul(10u64.pow(2.min(accs.wrapped_meta.original_decimals as u32 - 6)))
.checked_mul(10u64.pow(difference.min(accs.wrapped_meta.original_decimals as u32 - 6)))
.unwrap(),
)
} else {