From 2ed7ccce907121d4d4c909ce975f9056eb8d961a Mon Sep 17 00:00:00 2001 From: Radmir Date: Tue, 26 May 2026 18:42:04 +0500 Subject: [PATCH] Use swap from_asset as primary asset_id on Sui and Aptos Aligns Sui and Aptos swap mappers with Solana, TON, HyperCore, and EVM: the indexed transaction's primary asset_id is now the user's sent asset instead of the chain native. This prevents the wallet's swap icon from flipping after the indexer sync overwrites the locally broadcast row. In Aptos, build_transaction was conflating asset_id and fee_asset_id into a single parameter. That stayed correct as long as every caller passed the chain native, but the swap branch is the first case where they differ. Split the helper signature so fee_asset_id is passed explicitly and stays the chain native for swaps. Closes #1157 --- .../src/provider/transactions_mapper.rs | 17 ++++++++++++----- .../gem_sui/src/provider/transactions_mapper.rs | 4 +++- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/crates/gem_aptos/src/provider/transactions_mapper.rs b/crates/gem_aptos/src/provider/transactions_mapper.rs index 95299ddd4..35340e158 100644 --- a/crates/gem_aptos/src/provider/transactions_mapper.rs +++ b/crates/gem_aptos/src/provider/transactions_mapper.rs @@ -98,10 +98,11 @@ fn map_swap_transaction(transaction: Transaction, events: Vec, chain: Cha ]; let swap = SwapMapper::map_swap(&balance_diffs, &BigUint::from(0u8), &chain.as_asset_id(), Some(SwapProvider::Panora.id().to_owned()))?; + let asset_id = swap.from_asset.clone(); let metadata = serde_json::to_value(&swap).ok(); let to = meta.sender.clone(); - return Some(build_transaction(meta, chain.as_asset_id(), to, swap.from_value, TransactionType::Swap, metadata)); + return Some(build_transaction(meta, asset_id, chain.as_asset_id(), to, swap.from_value, TransactionType::Swap, metadata)); } let withdraw_event = events.iter().find(|e| e.event_type == FUNGIBLE_ASSET_WITHDRAW_EVENT)?; @@ -149,15 +150,17 @@ fn map_swap_transaction(transaction: Transaction, events: Vec, chain: Cha }); let swap = SwapMapper::map_swap(&balance_diffs, &BigUint::from(0u8), &chain.as_asset_id(), provider)?; + let asset_id = swap.from_asset.clone(); let metadata = serde_json::to_value(&swap).ok(); let to = meta.sender.clone(); - Some(build_transaction(meta, chain.as_asset_id(), to, swap.from_value, TransactionType::Swap, metadata)) + Some(build_transaction(meta, asset_id, chain.as_asset_id(), to, swap.from_value, TransactionType::Swap, metadata)) } fn build_transaction( meta: TransactionMeta, asset_id: AssetId, + fee_asset_id: AssetId, to: String, value: String, transaction_type: TransactionType, @@ -165,14 +168,14 @@ fn build_transaction( ) -> PrimitivesTransaction { PrimitivesTransaction::new( meta.hash, - asset_id.clone(), + asset_id, meta.sender, to, None, transaction_type, meta.state, meta.fee, - asset_id, + fee_asset_id, value, None, metadata, @@ -196,6 +199,7 @@ pub fn map_transaction(transaction: Transaction) -> Option Option Option return None, }; let owner = owner.clone()?; + let asset_id = swap.from_asset.clone(); return Some(( - chain.as_asset_id(), + asset_id, owner.clone(), owner, TransactionType::Swap, @@ -366,6 +367,7 @@ mod tests { .unwrap(); assert_eq!(swap.transaction_type, TransactionType::Swap); + assert_eq!(swap.asset_id, AssetId::from_token(Chain::Sui, TOKEN_A)); assert_eq!(swap.value, "200"); let metadata: TransactionSwapMetadata = serde_json::from_value(swap.metadata.unwrap()).unwrap(); assert_eq!(metadata.from_asset, AssetId::from_token(Chain::Sui, TOKEN_A));