From ba1864f8693f7906039c00c36f1cc9aae44d52f7 Mon Sep 17 00:00:00 2001 From: Andy Golay Date: Mon, 14 Oct 2024 06:43:19 -0400 Subject: [PATCH] feat: fetch details with get_bridge_transfer_details view function --- .../tests/client_l2move_l1move.rs | 12 ++-- .../src/chains/movement/client_framework.rs | 59 +++++++++++-------- 2 files changed, 40 insertions(+), 31 deletions(-) diff --git a/protocol-units/bridge/integration-tests/tests/client_l2move_l1move.rs b/protocol-units/bridge/integration-tests/tests/client_l2move_l1move.rs index 6be30eea5..3467ea3bb 100644 --- a/protocol-units/bridge/integration-tests/tests/client_l2move_l1move.rs +++ b/protocol-units/bridge/integration-tests/tests/client_l2move_l1move.rs @@ -66,27 +66,27 @@ async fn test_movement_client_initiate_transfer() -> Result<(), anyhow::Error> { .await .expect("Failed to initiate bridge transfer"); - let details: ([u8; 32], String, Vec, u64, [u8; 32], u64) = + let initial_details: ([u8; 32], String, Vec, u64, [u8; 32], u64) = test_utils::extract_bridge_transfer_details_framework( &mut mvt_client_harness.movement_client, ) .await?; - info!("Bridge transfer details: {:?}", details); + info!("Bridge transfer details: {:?}", initial_details); let details = BridgeContract::get_bridge_transfer_details_initiator( &mut mvt_client_harness.movement_client, - BridgeTransferId(MovementHash(details.0)), + BridgeTransferId(initial_details.0), ) .await .expect("Failed to get bridge transfer details") .expect("Expected to find bridge transfer details, but got None"); - assert_eq!(details.state, 2, "Bridge transfer should be completed."); + assert_eq!(details.state, 1, "Bridge transfer should be initiated."); test_utils::assert_bridge_transfer_details_framework( - &details, - details.0, + &initial_details, + details.bridge_transfer_id.0, sender_address.to_string(), args.recipient.clone(), args.amount, diff --git a/protocol-units/bridge/service/src/chains/movement/client_framework.rs b/protocol-units/bridge/service/src/chains/movement/client_framework.rs index 1432f0450..a1f35780f 100644 --- a/protocol-units/bridge/service/src/chains/movement/client_framework.rs +++ b/protocol-units/bridge/service/src/chains/movement/client_framework.rs @@ -332,7 +332,7 @@ impl BridgeContract for MovementClientFramework { bridge_transfer_id: BridgeTransferId, ) -> BridgeContractResult>> { let bridge_transfer_id_hex = format!("0x{}", hex::encode(bridge_transfer_id.0)); - + let view_request = ViewRequest { function: EntryFunctionId { module: MoveModuleId { @@ -350,41 +350,50 @@ impl BridgeContract for MovementClientFramework { type_arguments: vec![], arguments: vec![serde_json::json!(bridge_transfer_id_hex)], }; - - debug!("View request: {:?}", view_request); - + let response: Response> = self .rest_client .view(&view_request, None) .await .map_err(|_| BridgeContractError::CallError)?; - + let values = response.inner(); - - if values.len() != 6 { + + if values.len() != 1 { return Err(BridgeContractError::InvalidResponseLength); } - - let originator = utils::val_as_str_initiator(values.first())?; - let recipient = utils::val_as_str_initiator(values.get(1))?; - let amount = utils::val_as_str_initiator(values.get(2))? - .parse::() - .map_err(|_| BridgeContractError::SerializationError)?; - let hash_lock = utils::val_as_str_initiator(values.get(3))?; - let time_lock = utils::val_as_str_initiator(values.get(4))? + + let value = &values[0]; + + let originator_address = AccountAddress::from_hex_literal( + value["addresses"]["initiator"].as_str().ok_or(BridgeContractError::SerializationError)? + ).map_err(|_| BridgeContractError::SerializationError)?; + + let recipient_address_bytes = hex::decode( + &value["addresses"]["recipient"]["inner"].as_str().ok_or(BridgeContractError::SerializationError)?[2..] + ).map_err(|_| BridgeContractError::SerializationError)?; + + let amount = value["amount"] + .as_str() + .ok_or(BridgeContractError::SerializationError)? .parse::() .map_err(|_| BridgeContractError::SerializationError)?; - let state = utils::val_as_u64_initiator(values.get(5))? as u8; - - let originator_address = AccountAddress::from_hex_literal(originator) + + let hash_lock_array: [u8; 32] = hex::decode( + &value["hash_lock"].as_str().ok_or(BridgeContractError::SerializationError)?[2..] + ).map_err(|_| BridgeContractError::SerializationError)?.try_into() .map_err(|_| BridgeContractError::SerializationError)?; - let recipient_address_bytes = - hex::decode(&recipient[2..]).map_err(|_| BridgeContractError::SerializationError)?; - let hash_lock_array: [u8; 32] = hex::decode(&hash_lock[2..]) - .map_err(|_| BridgeContractError::SerializationError)? - .try_into() + + let time_lock = value["time_lock"] + .as_str() + .ok_or(BridgeContractError::SerializationError)? + .parse::() .map_err(|_| BridgeContractError::SerializationError)?; - + + let state = value["state"] + .as_u64() + .ok_or(BridgeContractError::SerializationError)? as u8; + let details = BridgeTransferDetails { bridge_transfer_id, initiator_address: BridgeAddress(MovementAddress(originator_address)), @@ -394,7 +403,7 @@ impl BridgeContract for MovementClientFramework { time_lock: TimeLock(time_lock), state, }; - + Ok(Some(details)) }