diff --git a/protocol-units/bridge/move-modules/sources/atomic_bridge_counterparty.move b/protocol-units/bridge/move-modules/sources/atomic_bridge_counterparty.move index 759cfe6db..d41dad6dc 100644 --- a/protocol-units/bridge/move-modules/sources/atomic_bridge_counterparty.move +++ b/protocol-units/bridge/move-modules/sources/atomic_bridge_counterparty.move @@ -18,7 +18,7 @@ module atomic_bridge::atomic_bridge_counterparty { aborted_transfers: SmartTable, BridgeTransferDetails>, } - struct BridgeTransferDetails has key, store { + struct BridgeTransferDetails has key, store, copy { initiator: vector, // eth address recipient: address, amount: u64, @@ -72,6 +72,25 @@ module atomic_bridge::atomic_bridge_counterparty { move_to(resource, bridge_transfer_store); move_to(resource, bridge_config); } + + #[view] + public fun bridge_transfers(bridge_transfer_id : vector) : BridgeTransfer acquires BridgeTransferStore, BridgeConfig { + let config_address = borrow_global(@atomic_bridge).bridge_module_deployer; + let store = borrow_global(config_address); + if (!aptos_std::smart_table::contains(&store.transfers, bridge_transfer_id)){ + BridgeTransfer { + amount: 0, + originator: @atomic_bridge, + recipient: vector::empty(), + hash_lock: vector::empty(), + time_lock: 0, + state: 0, + } + } else { + let bridge_transfer = aptos_std::smart_table::borrow(&store.transfers, bridge_transfer_id); + *bridge_transfer + } + } public fun lock_bridge_transfer_assets( caller: &signer, @@ -230,4 +249,46 @@ module atomic_bridge::atomic_bridge_counterparty { assert!(transfer_details.hash_lock == hash_lock, 3); assert!(transfer_details.initiator == initiator, 4); } + + #[test(origin_account = @origin_addr, resource_addr = @resource_addr, aptos_framework = @0x1, creator = @atomic_bridge, source_account = @source_account, moveth = @moveth, admin = @admin, client = @0xdca, master_minter = @master_minter)] + fun test_bridge_transfers_view( + origin_account: &signer, + resource_addr: signer, + client: &signer, + aptos_framework: signer, + master_minter: &signer, + creator: &signer, + moveth: &signer, + source_account: &signer + ) acquires BridgeTransferStore, BridgeConfig { + set_up_test(origin_account, &resource_addr); + + timestamp::set_time_has_started_for_testing(&aptos_framework); + moveth::init_for_test(moveth); + let receiver_address = @0xdada; + let initiator = b"0x123"; //In real world this would be an ethereum address + let recipient = @0xface; + let asset = moveth::metadata(); + + let bridge_transfer_id = b"transfer1"; + let pre_image = b"secret"; + let hash_lock = keccak256(pre_image); + let time_lock = 3600; + let amount = 100; + let result = lock_bridge_transfer_assets( + origin_account, + initiator, + bridge_transfer_id, + hash_lock, + time_lock, + recipient, + amount + ); + assert!(result, 1); + // Verify that the transfer is stored in pending_transfers + let bridge_store = borrow_global(signer::address_of(&resource_addr)); + let transfer_details = bridge_transfers(bridge_transfer_id); + assert!(transfer_details.recipient == recipient, 2); + assert!(transfer_details.initiator == initiator, 3); + } } diff --git a/protocol-units/bridge/move-modules/sources/atomic_bridge_initiator.move b/protocol-units/bridge/move-modules/sources/atomic_bridge_initiator.move index e3ad145f7..d6c6f767b 100644 --- a/protocol-units/bridge/move-modules/sources/atomic_bridge_initiator.move +++ b/protocol-units/bridge/move-modules/sources/atomic_bridge_initiator.move @@ -497,7 +497,7 @@ module atomic_bridge::atomic_bridge_initiator { } #[test(creator = @moveth, aptos_framework = @0x1, sender = @0xdaff, atomic_bridge = @atomic_bridge)] - #[expected_failure(abort_code = 1)] + #[expected_failure(abort_code = 7)] public fun test_bridge_transfers_view( sender: &signer, creator: &signer, @@ -523,10 +523,10 @@ module atomic_bridge::atomic_bridge_initiator { amount ); - // bridge_transfers cannot be used because it dereferences the transfer and modifies it - // but it does return a valid transfer id + aptos_std::debug::print(&bridge_transfer_id); + // returns a valid transfer let bridge_transfer = bridge_transfers(bridge_transfer_id); - + assert!(bridge_transfer.state == INITIALIZED, 6); aptos_std::debug::print(&bridge_transfer.state); complete_bridge_transfer( @@ -536,14 +536,18 @@ module atomic_bridge::atomic_bridge_initiator { atomic_bridge ); aptos_std::debug::print(&bridge_transfer.state); - // bridge_transfers doesn't find the transfer id and returns a new transfer with state 3 + + // bridge_transfers doesn't find the transfer id because it has been deleted by complete bridge transfer and returns a new transfer with state 3 (non existent) assert!(bridge_transfers(bridge_transfer_id).state == 3, 7); aptos_std::debug::print(&bridge_transfer.state); - // refund fails in borrow_mut because bridge_transfer_id is invalid + // refund fails in borrow_mut because bridge_transfer_id is inexistent as well + // weridly this errors but the test passes despite us expecting error 7 only, not 1 + // abort error::invalid_argument(ENOT_FOUND) refund_bridge_transfer( sender, bridge_transfer_id, atomic_bridge ); + assert!(bridge_transfers(bridge_transfer_id).state == 3, 7); } } \ No newline at end of file