-
Notifications
You must be signed in to change notification settings - Fork 1k
Fix transfer triggered vps #3804
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 25 commits
fbc328f
a62a2bc
ccbb457
fc39308
cd3f5a1
77ad90e
f8cfe7b
6e52f37
07035e0
664ee16
439a3a6
c82a4fd
578eb0e
8799b26
c74695c
1651cad
2fb578d
160f8b5
1ae3919
902b06a
5c19027
e597347
b634d91
5d5e9db
b11c556
41583eb
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| - The multitoken vp now checks that the involved parties | ||
| validate the transaction. Improved tests and transfer code. | ||
| ([\#3804](https://github.com/anoma/namada/pull/3804)) |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -32,6 +32,7 @@ use std::collections::BTreeSet; | |
| use std::fmt::Debug; | ||
| use std::marker::PhantomData; | ||
| use std::rc::Rc; | ||
| use std::str::FromStr; | ||
|
|
||
| pub use actions::transfer_over_ibc; | ||
| use apps::transfer::types::packet::PacketData; | ||
|
|
@@ -54,13 +55,16 @@ use ibc::apps::nft_transfer::types::msgs::transfer::MsgTransfer as IbcMsgNftTran | |
| use ibc::apps::nft_transfer::types::{ | ||
| ack_success_b64, is_receiver_chain_source as is_nft_receiver_chain_source, | ||
| PrefixedClassId, TokenId, TracePrefix as NftTracePrefix, | ||
| PORT_ID_STR as NFT_PORT_ID_STR, | ||
| }; | ||
| use ibc::apps::transfer::handler::{ | ||
| send_transfer_execute, send_transfer_validate, | ||
| }; | ||
| use ibc::apps::transfer::types::error::TokenTransferError; | ||
| use ibc::apps::transfer::types::msgs::transfer::MsgTransfer as IbcMsgTransfer; | ||
| use ibc::apps::transfer::types::{is_receiver_chain_source, TracePrefix}; | ||
| use ibc::apps::transfer::types::{ | ||
| is_receiver_chain_source, TracePrefix, PORT_ID_STR as FT_PORT_ID_STR, | ||
| }; | ||
| use ibc::core::channel::types::acknowledgement::AcknowledgementStatus; | ||
| use ibc::core::channel::types::commitment::compute_ack_commitment; | ||
| use ibc::core::channel::types::msgs::{ | ||
|
|
@@ -612,6 +616,18 @@ where | |
| self.ctx.inner.clone(), | ||
| self.verifiers.clone(), | ||
| ); | ||
| // Add the source to the set of verifiers | ||
| self.verifiers.borrow_mut().insert( | ||
| Address::from_str(msg.message.packet_data.sender.as_ref()) | ||
| .map_err(|_| { | ||
| Error::TokenTransfer(TokenTransferError::Other( | ||
| format!( | ||
| "Cannot convert the sender address {}", | ||
| msg.message.packet_data.sender | ||
| ), | ||
| )) | ||
| })?, | ||
| ); | ||
| self.insert_verifiers()?; | ||
| if msg.transfer.is_some() { | ||
| token_transfer_ctx.enable_shielded_transfer(); | ||
|
|
@@ -630,6 +646,19 @@ where | |
| if msg.transfer.is_some() { | ||
| nft_transfer_ctx.enable_shielded_transfer(); | ||
| } | ||
| // Add the source to the set of verifiers | ||
| self.verifiers.borrow_mut().insert( | ||
| Address::from_str(msg.message.packet_data.sender.as_ref()) | ||
| .map_err(|_| { | ||
| Error::NftTransfer(NftTransferError::Other( | ||
| format!( | ||
| "Cannot convert the sender address {}", | ||
| msg.message.packet_data.sender | ||
| ), | ||
| )) | ||
| })?, | ||
| ); | ||
| self.insert_verifiers()?; | ||
| send_nft_transfer_execute( | ||
| &mut self.ctx, | ||
| &mut nft_transfer_ctx, | ||
|
|
@@ -639,8 +668,23 @@ where | |
| Ok((msg.transfer, None)) | ||
| } | ||
| IbcMessage::Envelope(envelope) => { | ||
| if let Some(verifier) = get_envelope_verifier(envelope.as_ref()) | ||
| { | ||
| self.verifiers.borrow_mut().insert( | ||
| Address::from_str(verifier.as_ref()).map_err(|_| { | ||
| Error::NftTransfer(NftTransferError::Other( | ||
|
||
| format!( | ||
| "Cannot convert the address {}", | ||
| verifier | ||
| ), | ||
| )) | ||
| })?, | ||
| ); | ||
| self.insert_verifiers()?; | ||
| } | ||
| execute(&mut self.ctx, &mut self.router, *envelope.clone()) | ||
| .map_err(|e| Error::Context(Box::new(e)))?; | ||
|
|
||
| // Extract MASP tx from the memo in the packet if needed | ||
| let masp_tx = match &*envelope { | ||
| MsgEnvelope::Packet(PacketMsg::Recv(msg)) | ||
|
|
@@ -734,6 +778,70 @@ where | |
| } | ||
| } | ||
|
|
||
| // Extract the involved namada address from the packet (either sender or | ||
| // receiver) to trigger its vp. Returns None if an address could not be found | ||
grarco marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| fn get_envelope_verifier( | ||
| envelope: &MsgEnvelope, | ||
| ) -> Option<ibc::primitives::Signer> { | ||
| match envelope { | ||
| MsgEnvelope::Packet(PacketMsg::Recv(msg)) => { | ||
| match msg.packet.port_id_on_b.as_str() { | ||
| FT_PORT_ID_STR => { | ||
| serde_json::from_slice::<PacketData>(&msg.packet.data) | ||
| .ok() | ||
| .map(|packet_data| packet_data.receiver) | ||
| } | ||
| NFT_PORT_ID_STR => { | ||
| serde_json::from_slice::<NftPacketData>(&msg.packet.data) | ||
| .ok() | ||
| .map(|packet_data| packet_data.receiver) | ||
| } | ||
| _ => None, | ||
| } | ||
| } | ||
| MsgEnvelope::Packet(PacketMsg::Ack(msg)) => serde_json::from_slice::< | ||
| AcknowledgementStatus, | ||
| >( | ||
| msg.acknowledgement.as_ref(), | ||
| ) | ||
| .map_or(None, |ack| { | ||
| if ack.is_successful() { | ||
| None | ||
| } else { | ||
| match msg.packet.port_id_on_a.as_str() { | ||
| FT_PORT_ID_STR => { | ||
| serde_json::from_slice::<PacketData>(&msg.packet.data) | ||
| .ok() | ||
| .map(|packet_data| packet_data.sender) | ||
| } | ||
| NFT_PORT_ID_STR => serde_json::from_slice::<NftPacketData>( | ||
| &msg.packet.data, | ||
| ) | ||
| .ok() | ||
| .map(|packet_data| packet_data.sender), | ||
| _ => None, | ||
| } | ||
| } | ||
| }), | ||
| MsgEnvelope::Packet(PacketMsg::Timeout(msg)) => { | ||
| match msg.packet.port_id_on_a.as_str() { | ||
| FT_PORT_ID_STR => { | ||
| serde_json::from_slice::<PacketData>(&msg.packet.data) | ||
| .ok() | ||
| .map(|packet_data| packet_data.sender) | ||
| } | ||
| NFT_PORT_ID_STR => { | ||
| serde_json::from_slice::<NftPacketData>(&msg.packet.data) | ||
| .ok() | ||
| .map(|packet_data| packet_data.sender) | ||
| } | ||
| _ => None, | ||
| } | ||
| } | ||
| _ => None, | ||
| } | ||
| } | ||
|
|
||
| /// Tries to decode transaction data to an `IbcMessage` | ||
| pub fn decode_message<Transfer: BorshDeserialize>( | ||
| tx_data: &[u8], | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.