1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
use core::ops::Add;
use core::time::Duration;
use ibc::signer::Signer;
use ibc::timestamp::Timestamp;
use ibc::Height;
use ibc_proto::google::protobuf::Any;
use ibc_relayer::chain::cosmos::types::config::TxConfig;
use ibc_relayer::transfer::build_transfer_message as raw_build_transfer_message;
use crate::error::{handle_generic_error, Error};
use crate::ibc::denom::Denom;
use crate::relayer::tx::simple_send_tx;
use crate::types::id::{TaggedChannelIdRef, TaggedPortIdRef};
use crate::types::tagged::*;
use crate::types::wallet::{Wallet, WalletAddress};
pub fn build_transfer_message<SrcChain, DstChain>(
port_id: &TaggedPortIdRef<'_, SrcChain, DstChain>,
channel_id: &TaggedChannelIdRef<'_, SrcChain, DstChain>,
sender: &MonoTagged<SrcChain, &Wallet>,
recipient: &MonoTagged<DstChain, &WalletAddress>,
denom: &MonoTagged<SrcChain, &Denom>,
amount: u64,
) -> Result<Any, Error> {
let timeout_timestamp = Timestamp::now()
.add(Duration::from_secs(60))
.map_err(handle_generic_error)?;
Ok(raw_build_transfer_message(
(*port_id.value()).clone(),
**channel_id.value(),
amount.into(),
denom.value().to_string(),
Signer::new(sender.value().address.0.clone()),
Signer::new(recipient.value().0.clone()),
Height::zero(),
timeout_timestamp,
))
}
pub async fn ibc_token_transfer<SrcChain, DstChain>(
tx_config: &MonoTagged<SrcChain, &TxConfig>,
port_id: &TaggedPortIdRef<'_, SrcChain, DstChain>,
channel_id: &TaggedChannelIdRef<'_, SrcChain, DstChain>,
sender: &MonoTagged<SrcChain, &Wallet>,
recipient: &MonoTagged<DstChain, &WalletAddress>,
denom: &MonoTagged<SrcChain, &Denom>,
amount: u64,
) -> Result<(), Error> {
let message = build_transfer_message(port_id, channel_id, sender, recipient, denom, amount)?;
simple_send_tx(tx_config.value(), &sender.value().key, vec![message]).await?;
Ok(())
}