From 08f69627e99f8bd4cf21d9a8c25cb50abb60c8c5 Mon Sep 17 00:00:00 2001 From: fjchen7 Date: Tue, 27 Jun 2023 16:11:15 +0800 Subject: [PATCH 1/3] get tx receipts for axon --- crates/relayer/src/chain/axon.rs | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/crates/relayer/src/chain/axon.rs b/crates/relayer/src/chain/axon.rs index 719bb167b..494b27f0d 100644 --- a/crates/relayer/src/chain/axon.rs +++ b/crates/relayer/src/chain/axon.rs @@ -927,11 +927,32 @@ impl AxonChain { )) })?; - let receipts: Receipts = self + let block = self .rt - .block_on(self.client.get_block_receipts(block_number)) + .block_on(self.client.get_block(block_number)) .map_err(|e| Error::rpc_response(e.to_string()))? - .into(); + .ok_or_else(|| { + Error::other_error(format!("can't find block with number {}", block_number)) + })?; + + let tx_receipts = block + .transactions + .into_iter() + .map(|tx_hash| { + let receipt = self + .rt + .block_on(self.client.get_transaction_receipt(tx_hash)); + match receipt { + Ok(Some(receipt)) => Ok(receipt), + Ok(None) => Err(Error::other_error(format!( + "can't find transaction receipt with hash {}", + hex::encode(tx_hash) + ))), + Err(e) => Err(Error::rpc_response(e.to_string())), + } + }) + .collect::, _>>()?; + let receipts: Receipts = tx_receipts.into(); let receipt_proof = receipts.generate_proof(receipt.transaction_index.as_usize()); let (block, state_root, proof, mut validators) = self From b10df1d6767a09de92d3af1665bbcdc018198354 Mon Sep 17 00:00:00 2001 From: fjchen7 Date: Wed, 28 Jun 2023 10:33:45 +0800 Subject: [PATCH 2/3] cache tx after sending msg --- crates/relayer/src/chain/axon.rs | 58 +++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/crates/relayer/src/chain/axon.rs b/crates/relayer/src/chain/axon.rs index 494b27f0d..416639597 100644 --- a/crates/relayer/src/chain/axon.rs +++ b/crates/relayer/src/chain/axon.rs @@ -1035,6 +1035,61 @@ impl AxonChain { Ok((block, state_root, proof, validators)) } + + fn cache_ics_tx_hash_with_event>( + &mut self, + event: IbcEvent, + tx_hash: T, + ) -> Result<(), Error> { + let tx_hash_status = match event { + IbcEvent::OpenInitConnection(event) => Some(CacheTxHashStatus::new_with_conn( + event.0.connection_id.unwrap(), + )), + IbcEvent::OpenTryConnection(event) => Some(CacheTxHashStatus::new_with_conn( + event.0.connection_id.unwrap(), + )), + IbcEvent::OpenAckConnection(event) => Some(CacheTxHashStatus::new_with_conn( + event.0.connection_id.unwrap(), + )), + IbcEvent::OpenConfirmConnection(event) => Some(CacheTxHashStatus::new_with_conn( + event.0.connection_id.unwrap(), + )), + IbcEvent::OpenInitChannel(event) => Some(CacheTxHashStatus::new_with_chan( + event.channel_id.unwrap(), + event.port_id, + )), + IbcEvent::OpenTryChannel(event) => Some(CacheTxHashStatus::new_with_chan( + event.channel_id.unwrap(), + event.port_id, + )), + IbcEvent::OpenAckChannel(event) => Some(CacheTxHashStatus::new_with_chan( + event.channel_id.unwrap(), + event.port_id, + )), + IbcEvent::OpenConfirmChannel(event) => Some(CacheTxHashStatus::new_with_chan( + event.channel_id.unwrap(), + event.port_id, + )), + IbcEvent::SendPacket(event) => Some(CacheTxHashStatus::new_with_packet( + event.packet.source_channel, + event.packet.source_port, + event.packet.sequence.into(), + )), + IbcEvent::ReceivePacket(event) => Some(CacheTxHashStatus::new_with_packet( + event.packet.destination_channel, + event.packet.destination_port, + event.packet.sequence.into(), + )), + _ => None, + }; + match tx_hash_status { + Some(tx_hash_status) => { + self.cache_ics_tx_hash(tx_hash_status, tx_hash)?; + } + None => {} + } + Ok(()) + } } impl AxonChain { @@ -1220,7 +1275,7 @@ impl AxonChain { } }; let tx_receipt = tx_receipt.ok_or(Error::send_tx(String::from("fail to send tx")))?; - let event = { + let event: IbcEvent = { use contract::OwnableIBCHandlerEvents::*; let mut events = tx_receipt .logs @@ -1295,6 +1350,7 @@ impl AxonChain { })?; Height::new(u64::MAX, block_height.as_u64()).unwrap() }; + let _ = self.cache_ics_tx_hash_with_event(event.clone(), tx_hash)?; Ok(IbcEventWithHeight { event, height, From 07f21a84d602967dfad28c5fbd336898fe6ea891 Mon Sep 17 00:00:00 2001 From: fjchen7 Date: Wed, 28 Jun 2023 10:35:19 +0800 Subject: [PATCH 3/3] impl max_block_time for axon --- crates/relayer/src/config.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/relayer/src/config.rs b/crates/relayer/src/config.rs index 180ac5d9d..3d90ac11e 100644 --- a/crates/relayer/src/config.rs +++ b/crates/relayer/src/config.rs @@ -295,7 +295,7 @@ impl ChainConfig { ChainConfig::Cosmos(c) => c.max_block_time, ChainConfig::Eth(_) => todo!(), ChainConfig::Ckb(_) => todo!(), - ChainConfig::Axon(_) => todo!(), + ChainConfig::Axon(_) => Duration::from_secs(90), ChainConfig::Ckb4Ibc(_) => Duration::from_secs(90), } }