Skip to content

Commit 5a6a4cb

Browse files
committed
feat: balance change for swap overflow
1 parent 855cdbd commit 5a6a4cb

File tree

3 files changed

+85
-66
lines changed

3 files changed

+85
-66
lines changed

Cargo.lock

Lines changed: 28 additions & 56 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,15 @@ axum-extra = { version = "0.9.3", features = ["query"] }
3636
chrono = { version = "0.4.30", features = ["serde"] }
3737
anyhow = "1.0.75"
3838
num-bigint = "0.4.6"
39-
namada_core = { version = "0.149.1" }
40-
namada_events = { version = "0.149.1" }
41-
namada_sdk = { version = "0.149.1", default-features = false, features = ["std", "async-send", "download-params"] }
42-
namada_tx = { version = "0.149.1" }
43-
namada_governance = { version = "0.149.1" }
44-
namada_ibc = { version = "0.149.1" }
45-
namada_token = { version = "0.149.1" }
46-
namada_parameters = { version = "0.149.1" }
47-
namada_proof_of_stake = { version = "0.149.1" }
39+
namada_core = { git = "https://github.com/anoma/namada", rev = "c7c04353b285c1437c9351501b702376db437072" }
40+
namada_events = { git = "https://github.com/anoma/namada", rev = "c7c04353b285c1437c9351501b702376db437072" }
41+
namada_sdk = { git = "https://github.com/anoma/namada", rev = "c7c04353b285c1437c9351501b702376db437072", default-features = false, features = ["std", "async-send", "download-params"] }
42+
namada_tx = { git = "https://github.com/anoma/namada", rev = "c7c04353b285c1437c9351501b702376db437072" }
43+
namada_governance = { git = "https://github.com/anoma/namada", rev = "c7c04353b285c1437c9351501b702376db437072" }
44+
namada_ibc = { git = "https://github.com/anoma/namada", rev = "c7c04353b285c1437c9351501b702376db437072" }
45+
namada_token = { git = "https://github.com/anoma/namada", rev = "c7c04353b285c1437c9351501b702376db437072" }
46+
namada_parameters = { git = "https://github.com/anoma/namada", rev = "c7c04353b285c1437c9351501b702376db437072" }
47+
namada_proof_of_stake = { git = "https://github.com/anoma/namada", rev = "c7c04353b285c1437c9351501b702376db437072" }
4848
tendermint = "0.40.1"
4949
tendermint-rpc = { version = "0.40.1", features = ["http-client"] }
5050
subtle-encoding = "0.5.1"

shared/src/utils.rs

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use anyhow::Context;
2+
use namada_ibc::OsmosisSwapMemoDataInner;
23
use namada_ibc::apps::nft_transfer::types::PORT_ID_STR as NFT_PORT_ID_STR;
34
use namada_ibc::apps::transfer::types::packet::PacketData as FtPacketData;
45
use namada_ibc::apps::transfer::types::{
@@ -10,6 +11,7 @@ use namada_ibc::core::channel::types::msgs::PacketMsg;
1011
use namada_ibc::core::channel::types::packet::Packet;
1112
use namada_ibc::core::handler::types::msgs::MsgEnvelope;
1213
use namada_ibc::core::host::types::identifiers::{ChannelId, PortId};
14+
use namada_ibc::trace::convert_to_address;
1315
use namada_sdk::address::Address;
1416
use namada_sdk::token::Transfer;
1517

@@ -100,7 +102,49 @@ fn packet_msg_to_balance_info(
100102
native_token: Id,
101103
packet_msg: PacketMsg,
102104
) -> anyhow::Result<Option<BalanceChange>> {
105+
let try_extract_swap_overflow = |packet: Packet| -> anyhow::Result<
106+
Option<BalanceChange>,
107+
> {
108+
let native_token = native_token.clone();
109+
let packet_data = serde_json::from_slice::<FtPacketData>(&packet.data)
110+
.context("Could not deserialize IBC fungible token packet")?;
111+
112+
let memo_data =
113+
serde_json::from_str::<serde_json::Value>(packet_data.memo.as_ref())
114+
.context("Invalid JSON")?
115+
.pointer("/forward/next/wasm/msg/osmosis_swap/final_memo/namada/osmosis_swap")
116+
.map(|swap| {
117+
serde_json::from_value::<OsmosisSwapMemoDataInner>(swap.clone())
118+
.context("Failed to deserialize Osmosis swap memo")
119+
})
120+
.transpose()?;
121+
122+
if let Some(memo_data) = memo_data {
123+
let trace = memo_data.overflow_trace;
124+
125+
let token =
126+
// For nam overflow_trace should be nam's tnam address
127+
if Id::Account(trace.clone()) == native_token {
128+
Token::Native(native_token)
129+
// For ibc overflow_trace should be /transfer/channel-x/denom
130+
} else {
131+
Token::Ibc(crate::token::IbcToken {
132+
address: convert_to_address(&trace)
133+
.context("Failed to convert IBC trace to address")?
134+
.into(),
135+
trace: Id::IbcTrace(trace),
136+
})
137+
};
138+
let source = Id::from(memo_data.overflow_receiver);
139+
140+
return Ok(Some(BalanceChange::new(source, token)));
141+
};
142+
143+
Ok(None)
144+
};
145+
103146
let extract = |packet: Packet| -> anyhow::Result<BalanceChange> {
147+
let native_token = native_token.clone();
104148
let packet_data = serde_json::from_slice::<FtPacketData>(&packet.data)
105149
.context("Could not deserialize IBC fungible token packet")?;
106150

@@ -128,7 +172,10 @@ fn packet_msg_to_balance_info(
128172
.context("Could not deserialize IBC acknowledgement")?;
129173

130174
match ack {
131-
AcknowledgementStatus::Success(_) => Ok(None),
175+
AcknowledgementStatus::Success(_) => {
176+
// Needed to update the balance of overflow receiver when doing shielded swaps
177+
try_extract_swap_overflow(msg.packet)
178+
}
132179
AcknowledgementStatus::Error(_) => {
133180
extract(msg.packet).map(Some)
134181
}

0 commit comments

Comments
 (0)