From 051cccd5fc052ab6501025926c0d80aa43453644 Mon Sep 17 00:00:00 2001 From: primata Date: Wed, 21 Aug 2024 16:54:28 -0300 Subject: [PATCH 01/21] unfinisshed --- .../sources/atomic_bridge_initiator.move | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) 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 e00468bd2..f4e8be18b 100644 --- a/protocol-units/bridge/move-modules/sources/atomic_bridge_initiator.move +++ b/protocol-units/bridge/move-modules/sources/atomic_bridge_initiator.move @@ -80,13 +80,37 @@ module atomic_bridge::atomic_bridge_initiator { }); } + #[view] + public fun store() : &BridgeTransferStore acquires BridgeTransferStore, BridgeConfig { + let config_address = borrow_global(@atomic_bridge).bridge_module_deployer; + return borrow_global(config_address) + } + + #[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 = store(); + if (aptos_std::smart_table::contains(&store.transfers, bridge_transfer_id)){ + return aptos_std::smart_table::borrow(&store.transfers, bridge_transfer_id) + } else { + return &BridgeTransfer { + amount: 0, + originator: @atomic_bridge, + recipient: vector::empty(), + hash_lock: vector::empty(), + time_lock: 0, + state: 0, + } + } + } + public fun initiate_bridge_transfer( initiator: &signer, recipient: vector, // eth address hash_lock: vector, time_lock: u64, amount: u64 - ): vector acquires BridgeTransferStore, BridgeConfig { + ) : vector acquires BridgeTransferStore, BridgeConfig { let addr = signer::address_of(initiator); let asset = moveth::metadata(); let config_address = borrow_global(@atomic_bridge).bridge_module_deployer; From b510c24534b9f2f6cfde4c022bd18d17b3704f17 Mon Sep 17 00:00:00 2001 From: primata Date: Wed, 21 Aug 2024 18:17:32 -0300 Subject: [PATCH 02/21] add bridge_transfers --- .../sources/atomic_bridge_initiator.move | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) 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 f4e8be18b..3731bc83e 100644 --- a/protocol-units/bridge/move-modules/sources/atomic_bridge_initiator.move +++ b/protocol-units/bridge/move-modules/sources/atomic_bridge_initiator.move @@ -25,7 +25,7 @@ module atomic_bridge::atomic_bridge_initiator { const ETIMELOCK_EXPIRED: u64 = 5; const ENOT_EXPIRED: u64 = 6; - struct BridgeTransfer has key, store, drop { + struct BridgeTransfer has key, store, drop, copy { amount: u64, originator: address, recipient: vector, // eth address @@ -81,19 +81,11 @@ module atomic_bridge::atomic_bridge_initiator { } #[view] - public fun store() : &BridgeTransferStore acquires BridgeTransferStore, BridgeConfig { + public fun bridge_transfers(bridge_transfer_id : vector) : BridgeTransfer acquires BridgeTransferStore, BridgeConfig { let config_address = borrow_global(@atomic_bridge).bridge_module_deployer; - return borrow_global(config_address) - } - - #[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 = store(); - if (aptos_std::smart_table::contains(&store.transfers, bridge_transfer_id)){ - return aptos_std::smart_table::borrow(&store.transfers, bridge_transfer_id) - } else { - return &BridgeTransfer { + 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(), @@ -101,6 +93,9 @@ module atomic_bridge::atomic_bridge_initiator { time_lock: 0, state: 0, } + } else { + let bridge_transfer = aptos_std::smart_table::borrow(&store.transfers, bridge_transfer_id); + *bridge_transfer } } From fab34e4ab49fd5fc3128b6df94aea4d0a9341c61 Mon Sep 17 00:00:00 2001 From: primata Date: Wed, 21 Aug 2024 18:20:43 -0300 Subject: [PATCH 03/21] bugged test --- .../bridge/move-modules/sources/atomic_bridge_initiator.move | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 3731bc83e..4282512e8 100644 --- a/protocol-units/bridge/move-modules/sources/atomic_bridge_initiator.move +++ b/protocol-units/bridge/move-modules/sources/atomic_bridge_initiator.move @@ -475,19 +475,22 @@ module atomic_bridge::atomic_bridge_initiator { time_lock, amount ); - + let bridge_transfer = bridge_transfers(bridge_transfer_id); + assert!(bridge_transfer.state == INITIALIZED, 6); complete_bridge_transfer( sender, bridge_transfer_id, pre_image, atomic_bridge ); + assert!(bridge_transfer.state == COMPLETED, 7); refund_bridge_transfer( sender, bridge_transfer_id, atomic_bridge ); + assert!(bridge_transfer.state == REFUNDED, 8); let addr = signer::address_of(sender); let store = borrow_global(addr); From 4ca4a3e6613893a0657ad13fe100f4543c129071 Mon Sep 17 00:00:00 2001 From: primata Date: Wed, 21 Aug 2024 19:49:33 -0300 Subject: [PATCH 04/21] test failure --- .../sources/atomic_bridge_initiator.move | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) 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 4282512e8..f95f1e1e5 100644 --- a/protocol-units/bridge/move-modules/sources/atomic_bridge_initiator.move +++ b/protocol-units/bridge/move-modules/sources/atomic_bridge_initiator.move @@ -91,7 +91,7 @@ module atomic_bridge::atomic_bridge_initiator { recipient: vector::empty(), hash_lock: vector::empty(), time_lock: 0, - state: 0, + state: 3, // ENOT_INITIALIZED } } else { let bridge_transfer = aptos_std::smart_table::borrow(&store.transfers, bridge_transfer_id); @@ -440,6 +440,8 @@ module atomic_bridge::atomic_bridge_initiator { bridge_transfer_id, atomic_bridge ); + let bridge_transfer = bridge_transfers(bridge_transfer_id); + assert!(bridge_transfer.state == REFUNDED, 300); let addr = signer::address_of(sender); let asset = moveth::metadata(); @@ -450,7 +452,7 @@ module atomic_bridge::atomic_bridge_initiator { } #[test(creator = @moveth, aptos_framework = @0x1, sender = @0xdaff, atomic_bridge = @atomic_bridge)] - #[expected_failure] + // #[expected_failure(abort_code = 7)] public fun test_refund_completed_transfer( sender: &signer, creator: &signer, @@ -475,22 +477,28 @@ module atomic_bridge::atomic_bridge_initiator { time_lock, amount ); + + // bridge_transfers cannot be used because it dereferences the transfer and modifies it let bridge_transfer = bridge_transfers(bridge_transfer_id); + assert!(bridge_transfer.state == INITIALIZED, 6); + aptos_std::debug::print(&bridge_transfer.state); complete_bridge_transfer( sender, bridge_transfer_id, pre_image, atomic_bridge ); - assert!(bridge_transfer.state == COMPLETED, 7); - + aptos_std::debug::print(&bridge_transfer.state); + // bridge_transfers doesn't find the transfer id and returns a new transfer with state 3 + 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_bridge_transfer( sender, bridge_transfer_id, atomic_bridge ); - assert!(bridge_transfer.state == REFUNDED, 8); let addr = signer::address_of(sender); let store = borrow_global(addr); From 701a2c7bc9cc36fc72151d8e2360b9c9035d9537 Mon Sep 17 00:00:00 2001 From: primata Date: Wed, 21 Aug 2024 19:52:21 -0300 Subject: [PATCH 05/21] notes --- .../sources/atomic_bridge_initiator.move | 60 +++++++++++++++---- 1 file changed, 50 insertions(+), 10 deletions(-) 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 f95f1e1e5..e3ad145f7 100644 --- a/protocol-units/bridge/move-modules/sources/atomic_bridge_initiator.move +++ b/protocol-units/bridge/move-modules/sources/atomic_bridge_initiator.move @@ -91,7 +91,7 @@ module atomic_bridge::atomic_bridge_initiator { recipient: vector::empty(), hash_lock: vector::empty(), time_lock: 0, - state: 3, // ENOT_INITIALIZED + state: 0, } } else { let bridge_transfer = aptos_std::smart_table::borrow(&store.transfers, bridge_transfer_id); @@ -440,8 +440,6 @@ module atomic_bridge::atomic_bridge_initiator { bridge_transfer_id, atomic_bridge ); - let bridge_transfer = bridge_transfers(bridge_transfer_id); - assert!(bridge_transfer.state == REFUNDED, 300); let addr = signer::address_of(sender); let asset = moveth::metadata(); @@ -452,7 +450,7 @@ module atomic_bridge::atomic_bridge_initiator { } #[test(creator = @moveth, aptos_framework = @0x1, sender = @0xdaff, atomic_bridge = @atomic_bridge)] - // #[expected_failure(abort_code = 7)] + #[expected_failure] public fun test_refund_completed_transfer( sender: &signer, creator: &signer, @@ -478,7 +476,55 @@ module atomic_bridge::atomic_bridge_initiator { amount ); + complete_bridge_transfer( + sender, + bridge_transfer_id, + pre_image, + atomic_bridge + ); + + refund_bridge_transfer( + sender, + bridge_transfer_id, + atomic_bridge + ); + + let addr = signer::address_of(sender); + let store = borrow_global(addr); + let transfer = aptos_std::smart_table::borrow(&store.transfers, bridge_transfer_id); + + assert!(transfer.state == COMPLETED, 300); + } + + #[test(creator = @moveth, aptos_framework = @0x1, sender = @0xdaff, atomic_bridge = @atomic_bridge)] + #[expected_failure(abort_code = 1)] + public fun test_bridge_transfers_view( + sender: &signer, + creator: &signer, + aptos_framework: &signer, + atomic_bridge: &signer + ) acquires BridgeTransferStore, BridgeConfig { + init_test(sender, creator, aptos_framework, atomic_bridge); + + let recipient = b"recipient_address"; + let pre_image = b"pre_image_value"; + let hash_lock = aptos_std::aptos_hash::keccak256(bcs::to_bytes(&pre_image)); + assert!(aptos_std::aptos_hash::keccak256(bcs::to_bytes(&pre_image)) == hash_lock, 5); + let time_lock = 1000; + let amount = 1000; + let sender_address = signer::address_of(sender); + moveth::mint(atomic_bridge, sender_address, amount); + + let bridge_transfer_id = initiate_bridge_transfer( + sender, + recipient, + hash_lock, + time_lock, + amount + ); + // bridge_transfers cannot be used because it dereferences the transfer and modifies it + // but it does return a valid transfer id let bridge_transfer = bridge_transfers(bridge_transfer_id); assert!(bridge_transfer.state == INITIALIZED, 6); @@ -499,11 +545,5 @@ module atomic_bridge::atomic_bridge_initiator { bridge_transfer_id, atomic_bridge ); - - let addr = signer::address_of(sender); - let store = borrow_global(addr); - let transfer = aptos_std::smart_table::borrow(&store.transfers, bridge_transfer_id); - - assert!(transfer.state == COMPLETED, 300); } } \ No newline at end of file From 90e8c14a0e46488ac139e2d4f7444423b9531c5e Mon Sep 17 00:00:00 2001 From: primata Date: Thu, 22 Aug 2024 15:28:52 -0300 Subject: [PATCH 06/21] wait for counterparty refactor --- .../sources/atomic_bridge_counterparty.move | 63 ++++++++++++++++++- .../sources/atomic_bridge_initiator.move | 16 +++-- 2 files changed, 72 insertions(+), 7 deletions(-) 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 From 07904ffbb7828c2a4e5463956d023d1d8f3feb21 Mon Sep 17 00:00:00 2001 From: primata Date: Fri, 23 Aug 2024 16:55:51 -0300 Subject: [PATCH 07/21] feat: restructure counterparty to assimilate with initiator nomeclature --- .../sources/atomic_bridge_counterparty.move | 117 +++++++++--------- .../sources/atomic_bridge_initiator.move | 23 +--- 2 files changed, 65 insertions(+), 75 deletions(-) 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 d41dad6dc..037c45501 100644 --- a/protocol-units/bridge/move-modules/sources/atomic_bridge_counterparty.move +++ b/protocol-units/bridge/move-modules/sources/atomic_bridge_counterparty.move @@ -11,19 +11,25 @@ module atomic_bridge::atomic_bridge_counterparty { use aptos_std::smart_table::{Self, SmartTable}; use moveth::moveth; - /// A mapping of bridge transfer IDs to their details + const LOCKED: u8 = 1; + const COMPLETED: u8 = 2; + const CANCELLED: u8 = 3; + + /// A mapping of bridge transfer IDs to their bridge_transfer struct BridgeTransferStore has key, store { - pending_transfers: SmartTable, BridgeTransferDetails>, - completed_transfers: SmartTable, BridgeTransferDetails>, - aborted_transfers: SmartTable, BridgeTransferDetails>, + transfers: SmartTable, BridgeTransfer>, + bridge_transfer_locked_events: EventHandle, + bridge_transfer_completed_events: EventHandle, + bridge_transfer_cancelled_events: EventHandle, } - struct BridgeTransferDetails has key, store, copy { - initiator: vector, // eth address + struct BridgeTransfer has key, store, copy { + originator: vector, // eth address, recipient: address, amount: u64, hash_lock: vector, time_lock: u64, + state: u8, } struct BridgeConfig has key { @@ -36,6 +42,7 @@ module atomic_bridge::atomic_bridge_counterparty { /// An event triggered upon locking assets for a bridge transfer struct BridgeTransferAssetsLockedEvent has store, drop { bridge_transfer_id: vector, + originator: vector, recipient: address, amount: u64, hash_lock: vector, @@ -55,22 +62,21 @@ module atomic_bridge::atomic_bridge_counterparty { bridge_transfer_id: vector, } - entry fun init_module(resource: &signer) { + fun init_module(resource: &signer) { let resource_signer_cap = resource_account::retrieve_resource_account_cap(resource, @origin_addr); - let bridge_transfer_store = BridgeTransferStore { - pending_transfers: smart_table::new(), - completed_transfers: smart_table::new(), - aborted_transfers: smart_table::new(), - }; - let bridge_config = BridgeConfig { + move_to(resource, BridgeTransferStore { + transfers: aptos_std::smart_table::new, BridgeTransfer>(), + bridge_transfer_initiated_events: account::new_event_handle(resource), + bridge_transfer_completed_events: account::new_event_handle(resource), + bridge_transfer_refunded_events: account::new_event_handle(resource), + }); + move_to(resource,BridgeConfig { moveth_minter: signer::address_of(resource), bridge_module_deployer: signer::address_of(resource), signer_cap: resource_signer_cap - }; - move_to(resource, bridge_transfer_store); - move_to(resource, bridge_config); + }); } #[view] @@ -78,14 +84,7 @@ module atomic_bridge::atomic_bridge_counterparty { 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, - } + assert!(false, 1) } else { let bridge_transfer = aptos_std::smart_table::borrow(&store.transfers, bridge_transfer_id); *bridge_transfer @@ -94,7 +93,7 @@ module atomic_bridge::atomic_bridge_counterparty { public fun lock_bridge_transfer_assets( caller: &signer, - initiator: vector, //eth address + originator: vector, //eth address bridge_transfer_id: vector, hash_lock: vector, time_lock: u64, @@ -103,25 +102,26 @@ module atomic_bridge::atomic_bridge_counterparty { ): bool acquires BridgeTransferStore { assert!(signer::address_of(caller) == @origin_addr, 1); let bridge_store = borrow_global_mut(@resource_addr); - let details = BridgeTransferDetails { + let bridge_transfer = BridgeTransfer { + originator, recipient, - initiator, amount, hash_lock, - time_lock: timestamp::now_seconds() + time_lock + time_lock: timestamp::now_seconds() + time_lock, + state: LOCKED, }; - smart_table::add(&mut bridge_store.pending_transfers, bridge_transfer_id, details); - event::emit( - BridgeTransferAssetsLockedEvent { + smart_table::add(&mut bridge_store.transfers, bridge_transfer_id, bridge_transfer); + + event::emit_event(&mut store.bridge_transfer_initiated_events, BridgeTransferInitiatedEvent { + amount, bridge_transfer_id, + originator, recipient, - amount, hash_lock, time_lock, }, ); - true } @@ -133,17 +133,17 @@ module atomic_bridge::atomic_bridge_counterparty { let config_address = borrow_global(@resource_addr).bridge_module_deployer; let resource_signer = account::create_signer_with_capability(&borrow_global(@resource_addr).signer_cap); let bridge_store = borrow_global_mut(config_address); - let details: BridgeTransferDetails = smart_table::remove(&mut bridge_store.pending_transfers, bridge_transfer_id); + let bridge_transfer = aptos_std::smart_table::borrow_mut(&mut store.transfers, bridge_transfer_id); let computed_hash = keccak256(pre_image); - assert!(computed_hash == details.hash_lock, 2); + assert!(computed_hash == bridge_transfer.hash_lock, 2); + assert!(bridge_transfer.state == LOCKED, 3); + bridge_transfer.state = COMPLETED; - moveth::mint(&resource_signer, details.recipient, details.amount); + moveth::mint(&resource_signer, bridge_transfer.recipient, bridge_transfer.amount); - smart_table::add(&mut bridge_store.completed_transfers, bridge_transfer_id, details); - event::emit( - BridgeTransferCompletedEvent { - bridge_transfer_id, + event::emit_event(&mut store.bridge_transfer_completed_events, BridgeTransferCompletedEvent { + bridge_transfer_id: copy bridge_transfer_id, pre_image, }, ); @@ -156,14 +156,15 @@ module atomic_bridge::atomic_bridge_counterparty { // check that the signer is the bridge_module_deployer assert!(signer::address_of(caller) == borrow_global(signer::address_of(caller)).bridge_module_deployer, 1); let bridge_store = borrow_global_mut(signer::address_of(caller)); - let details: BridgeTransferDetails = smart_table::remove(&mut bridge_store.pending_transfers, bridge_transfer_id); + let bridge_transfer = aptos_std::smart_table::borrow_mut(&mut store.transfers, bridge_transfer_id); // Ensure the timelock has expired - assert!(timestamp::now_seconds() > details.time_lock, 2); + assert!(timestamp::now_seconds() > bridge_transfer.time_lock, 2); + assert!(bridge_transfer.state == LOCKED, 3); + + bridge_transfer.state = CANCELLED; - smart_table::add(&mut bridge_store.aborted_transfers, bridge_transfer_id, details); - event::emit( - BridgeTransferCancelledEvent { + event::emit_event(&mut store.bridge_transfer_cancelled_events, BridgeTransferCancelledEvent { bridge_transfer_id, }, ); @@ -227,11 +228,11 @@ module atomic_bridge::atomic_bridge_counterparty { 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: &BridgeTransferDetails = smart_table::borrow(&bridge_store.pending_transfers, bridge_transfer_id); - assert!(transfer_details.recipient == recipient, 2); - assert!(transfer_details.initiator == initiator, 3); - assert!(transfer_details.amount == amount, 5); - assert!(transfer_details.hash_lock == hash_lock, 5); + let bridge_transfer: &BridgeTransfer = smart_table::borrow(&bridge_store.transfers, bridge_transfer_id); + assert!(bridge_transfer.recipient == recipient, 2); + assert!(bridge_transfer.originator == initiator, 3); + assert!(bridge_transfer.amount == amount, 5); + assert!(bridge_transfer.hash_lock == hash_lock, 5); let pre_image = b"secret"; let msg:vector = b"secret"; debug::print(&utf8(msg)); @@ -243,11 +244,11 @@ module atomic_bridge::atomic_bridge_counterparty { debug::print(&utf8(msg)); // Verify that the transfer is stored in completed_transfers let bridge_store = borrow_global(signer::address_of(&resource_addr)); - let transfer_details: &BridgeTransferDetails = smart_table::borrow(&bridge_store. completed_transfers, bridge_transfer_id); - assert!(transfer_details.recipient == recipient, 1); - assert!(transfer_details.amount == amount, 2); - assert!(transfer_details.hash_lock == hash_lock, 3); - assert!(transfer_details.initiator == initiator, 4); + let bridge_transfer: &BridgeTransfer = smart_table::borrow(&bridge_store.transfers, bridge_transfer_id); + assert!(bridge_transfer.recipient == recipient, 1); + assert!(bridge_transfer.amount == amount, 2); + assert!(bridge_transfer.hash_lock == hash_lock, 3); + assert!(bridge_transfer.originator == 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)] @@ -287,8 +288,8 @@ module atomic_bridge::atomic_bridge_counterparty { 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); + let bridge_transfer = bridge_transfers(bridge_transfer_id); + assert!(bridge_transfer.recipient == recipient, 2); + assert!(bridge_transfer.originator == 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 d6c6f767b..03dedb5f7 100644 --- a/protocol-units/bridge/move-modules/sources/atomic_bridge_initiator.move +++ b/protocol-units/bridge/move-modules/sources/atomic_bridge_initiator.move @@ -13,9 +13,9 @@ module atomic_bridge::atomic_bridge_initiator { use std::debug; use moveth::moveth; - const INITIALIZED: u8 = 0; - const COMPLETED: u8 = 1; - const REFUNDED: u8 = 2; + const INITIALIZED: u8 = 1; + const COMPLETED: u8 = 2; + const REFUNDED: u8 = 3; const EINSUFFICIENT_AMOUNT: u64 = 0; const EINSUFFICIENT_BALANCE: u64 = 1; @@ -26,9 +26,9 @@ module atomic_bridge::atomic_bridge_initiator { const ENOT_EXPIRED: u64 = 6; struct BridgeTransfer has key, store, drop, copy { - amount: u64, originator: address, recipient: vector, // eth address + amount: u64, hash_lock: vector, time_lock: u64, state: u8, @@ -65,7 +65,7 @@ module atomic_bridge::atomic_bridge_initiator { bridge_transfer_id: vector, } - entry fun init_module(deployer: &signer) { + fun init_module(deployer: &signer) { let deployer_addr = signer::address_of(deployer); move_to(deployer, BridgeTransferStore { transfers: aptos_std::smart_table::new, BridgeTransfer>(), @@ -85,14 +85,7 @@ module atomic_bridge::atomic_bridge_initiator { 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, - } + assert!(false, 1); } else { let bridge_transfer = aptos_std::smart_table::borrow(&store.transfers, bridge_transfer_id); *bridge_transfer @@ -176,8 +169,6 @@ module atomic_bridge::atomic_bridge_initiator { bridge_transfer_id: copy bridge_transfer_id, pre_image: pre_image, }); - - aptos_std::smart_table::remove(&mut store.transfers, copy bridge_transfer_id); } public fun refund_bridge_transfer( @@ -206,8 +197,6 @@ module atomic_bridge::atomic_bridge_initiator { event::emit_event(&mut store.bridge_transfer_refunded_events, BridgeTransferRefundedEvent { bridge_transfer_id: copy bridge_transfer_id, }); - - aptos_std::smart_table::remove(&mut store.transfers, copy bridge_transfer_id); } #[test_only] From f20a9af2878afe851a4953b9ab8595365aa54608 Mon Sep 17 00:00:00 2001 From: primata Date: Fri, 23 Aug 2024 17:01:36 -0300 Subject: [PATCH 08/21] fix: rename func --- .../bridge/move-modules/sources/atomic_bridge_counterparty.move | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 037c45501..83ab70ff0 100644 --- a/protocol-units/bridge/move-modules/sources/atomic_bridge_counterparty.move +++ b/protocol-units/bridge/move-modules/sources/atomic_bridge_counterparty.move @@ -91,7 +91,7 @@ module atomic_bridge::atomic_bridge_counterparty { } } - public fun lock_bridge_transfer_assets( + public fun lock_bridge_transfer( caller: &signer, originator: vector, //eth address bridge_transfer_id: vector, From b2597af7a5490b037bd14fd7a5868a85312e63b2 Mon Sep 17 00:00:00 2001 From: primata Date: Fri, 23 Aug 2024 18:44:50 -0300 Subject: [PATCH 09/21] feat: formatted code, passing tests --- .../sources/atomic_bridge_counterparty.move | 45 +++++++++++-------- .../sources/atomic_bridge_initiator.move | 12 ++++- 2 files changed, 36 insertions(+), 21 deletions(-) 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 83ab70ff0..40f100700 100644 --- a/protocol-units/bridge/move-modules/sources/atomic_bridge_counterparty.move +++ b/protocol-units/bridge/move-modules/sources/atomic_bridge_counterparty.move @@ -1,8 +1,8 @@ module atomic_bridge::atomic_bridge_counterparty { use std::signer; - use std::event; use std::vector; use aptos_framework::account; + use aptos_framework::event::{Self, EventHandle}; #[test_only] use aptos_framework::account::create_account_for_test; use aptos_framework::resource_account; @@ -18,12 +18,12 @@ module atomic_bridge::atomic_bridge_counterparty { /// A mapping of bridge transfer IDs to their bridge_transfer struct BridgeTransferStore has key, store { transfers: SmartTable, BridgeTransfer>, - bridge_transfer_locked_events: EventHandle, + bridge_transfer_locked_events: EventHandle, bridge_transfer_completed_events: EventHandle, bridge_transfer_cancelled_events: EventHandle, } - struct BridgeTransfer has key, store, copy { + struct BridgeTransfer has key, store, drop, copy { originator: vector, // eth address, recipient: address, amount: u64, @@ -40,7 +40,7 @@ module atomic_bridge::atomic_bridge_counterparty { #[event] /// An event triggered upon locking assets for a bridge transfer - struct BridgeTransferAssetsLockedEvent has store, drop { + struct BridgeTransferLockedEvent has store, drop { bridge_transfer_id: vector, originator: vector, recipient: address, @@ -68,9 +68,9 @@ module atomic_bridge::atomic_bridge_counterparty { move_to(resource, BridgeTransferStore { transfers: aptos_std::smart_table::new, BridgeTransfer>(), - bridge_transfer_initiated_events: account::new_event_handle(resource), + bridge_transfer_locked_events: account::new_event_handle(resource), bridge_transfer_completed_events: account::new_event_handle(resource), - bridge_transfer_refunded_events: account::new_event_handle(resource), + bridge_transfer_cancelled_events: account::new_event_handle(resource), }); move_to(resource,BridgeConfig { moveth_minter: signer::address_of(resource), @@ -84,7 +84,14 @@ module atomic_bridge::atomic_bridge_counterparty { 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)){ - assert!(false, 1) + BridgeTransfer { + amount: 0, + originator: vector::empty(), + recipient: @atomic_bridge, + 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 @@ -101,7 +108,7 @@ module atomic_bridge::atomic_bridge_counterparty { amount: u64 ): bool acquires BridgeTransferStore { assert!(signer::address_of(caller) == @origin_addr, 1); - let bridge_store = borrow_global_mut(@resource_addr); + let store = borrow_global_mut(@resource_addr); let bridge_transfer = BridgeTransfer { originator, recipient, @@ -111,9 +118,9 @@ module atomic_bridge::atomic_bridge_counterparty { state: LOCKED, }; - smart_table::add(&mut bridge_store.transfers, bridge_transfer_id, bridge_transfer); + smart_table::add(&mut store.transfers, bridge_transfer_id, bridge_transfer); - event::emit_event(&mut store.bridge_transfer_initiated_events, BridgeTransferInitiatedEvent { + event::emit_event(&mut store.bridge_transfer_locked_events, BridgeTransferLockedEvent { amount, bridge_transfer_id, originator, @@ -132,7 +139,7 @@ module atomic_bridge::atomic_bridge_counterparty { ) acquires BridgeTransferStore, BridgeConfig, { let config_address = borrow_global(@resource_addr).bridge_module_deployer; let resource_signer = account::create_signer_with_capability(&borrow_global(@resource_addr).signer_cap); - let bridge_store = borrow_global_mut(config_address); + let store = borrow_global_mut(config_address); let bridge_transfer = aptos_std::smart_table::borrow_mut(&mut store.transfers, bridge_transfer_id); let computed_hash = keccak256(pre_image); @@ -155,7 +162,7 @@ module atomic_bridge::atomic_bridge_counterparty { ) acquires BridgeTransferStore, BridgeConfig { // check that the signer is the bridge_module_deployer assert!(signer::address_of(caller) == borrow_global(signer::address_of(caller)).bridge_module_deployer, 1); - let bridge_store = borrow_global_mut(signer::address_of(caller)); + let store = borrow_global_mut(signer::address_of(caller)); let bridge_transfer = aptos_std::smart_table::borrow_mut(&mut store.transfers, bridge_transfer_id); // Ensure the timelock has expired @@ -216,7 +223,7 @@ module atomic_bridge::atomic_bridge_counterparty { let hash_lock = keccak256(pre_image); let time_lock = 3600; let amount = 100; - let result = lock_bridge_transfer_assets( + let result = lock_bridge_transfer( origin_account, initiator, bridge_transfer_id, @@ -227,8 +234,8 @@ module atomic_bridge::atomic_bridge_counterparty { ); assert!(result, 1); // Verify that the transfer is stored in pending_transfers - let bridge_store = borrow_global(signer::address_of(&resource_addr)); - let bridge_transfer: &BridgeTransfer = smart_table::borrow(&bridge_store.transfers, bridge_transfer_id); + let store = borrow_global(signer::address_of(&resource_addr)); + let bridge_transfer: &BridgeTransfer = smart_table::borrow(&store.transfers, bridge_transfer_id); assert!(bridge_transfer.recipient == recipient, 2); assert!(bridge_transfer.originator == initiator, 3); assert!(bridge_transfer.amount == amount, 5); @@ -243,8 +250,8 @@ module atomic_bridge::atomic_bridge_counterparty { ); debug::print(&utf8(msg)); // Verify that the transfer is stored in completed_transfers - let bridge_store = borrow_global(signer::address_of(&resource_addr)); - let bridge_transfer: &BridgeTransfer = smart_table::borrow(&bridge_store.transfers, bridge_transfer_id); + let store = borrow_global(signer::address_of(&resource_addr)); + let bridge_transfer: &BridgeTransfer = smart_table::borrow(&store.transfers, bridge_transfer_id); assert!(bridge_transfer.recipient == recipient, 1); assert!(bridge_transfer.amount == amount, 2); assert!(bridge_transfer.hash_lock == hash_lock, 3); @@ -276,7 +283,7 @@ module atomic_bridge::atomic_bridge_counterparty { let hash_lock = keccak256(pre_image); let time_lock = 3600; let amount = 100; - let result = lock_bridge_transfer_assets( + let result = lock_bridge_transfer( origin_account, initiator, bridge_transfer_id, @@ -287,7 +294,7 @@ module atomic_bridge::atomic_bridge_counterparty { ); assert!(result, 1); // Verify that the transfer is stored in pending_transfers - let bridge_store = borrow_global(signer::address_of(&resource_addr)); + let store = borrow_global(signer::address_of(&resource_addr)); let bridge_transfer = bridge_transfers(bridge_transfer_id); assert!(bridge_transfer.recipient == recipient, 2); assert!(bridge_transfer.originator == 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 03dedb5f7..3bed092ff 100644 --- a/protocol-units/bridge/move-modules/sources/atomic_bridge_initiator.move +++ b/protocol-units/bridge/move-modules/sources/atomic_bridge_initiator.move @@ -85,7 +85,14 @@ module atomic_bridge::atomic_bridge_initiator { 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)){ - assert!(false, 1); + 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 @@ -350,7 +357,8 @@ module atomic_bridge::atomic_bridge_initiator { ); let bridge_addr = signer::address_of(atomic_bridge); let store = borrow_global(bridge_addr); - assert!(!aptos_std::smart_table::contains(&store.transfers, copy bridge_transfer_id), 300); + // complete bridge doesn't delete the transfer from the store + assert!(aptos_std::smart_table::contains(&store.transfers, copy bridge_transfer_id), 300); } #[test(creator = @moveth, aptos_framework = @0x1, sender = @0xdaff, atomic_bridge = @atomic_bridge)] From 12cf0464ba40c221fe9a704190eec916f3560bb4 Mon Sep 17 00:00:00 2001 From: Andy Golay Date: Sat, 24 Aug 2024 07:44:18 -0400 Subject: [PATCH 10/21] test: update_move_toml.sh updates both origin address and resource address --- .github/scripts/update_move_toml.sh | 35 +++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/.github/scripts/update_move_toml.sh b/.github/scripts/update_move_toml.sh index beebab1fd..fde5d2ffd 100644 --- a/.github/scripts/update_move_toml.sh +++ b/.github/scripts/update_move_toml.sh @@ -2,23 +2,40 @@ MOVE_TOML_PATH="protocol-units/bridge/move-modules/Move.toml" +# Initialize Aptos and capture output INIT_OUTPUT=$(aptos init 2>&1) - echo "$INIT_OUTPUT" +# Extract the account address from the initialization output ADDRESS=$(echo "$INIT_OUTPUT" | grep -oE '0x[a-f0-9]{64}' | head -1) - if [[ -z "$ADDRESS" ]]; then echo "Error: Failed to extract the Aptos account address." exit 1 fi -echo "$ADDRESS" +# Generate a random seed +RANDOM_SEED=$(shuf -i 0-1000000 -n 1) + +# Derive the resource account address using the random seed +RESOURCE_OUTPUT=$(aptos account derive-resource-account-address --address "$ADDRESS" --seed "$RANDOM_SEED" 2>&1) +RESOURCE_ADDRESS=$(echo "$RESOURCE_OUTPUT" | grep -oE '0x[a-f0-9]{64}' | head -1) + +if [[ -z "$RESOURCE_ADDRESS" ]]; then + echo "Error: Failed to extract the resource account address." + exit 1 +fi + +echo "Extracted address: $ADDRESS" +echo "Derived resource address: $RESOURCE_ADDRESS" -sed -i "s/^atomic_bridge = \".*\"/atomic_bridge = \"$ADDRESS\"/" "$MOVE_TOML_PATH" -sed -i "s/^moveth = \".*\"/moveth = \"$ADDRESS\"/" "$MOVE_TOML_PATH" -sed -i "s/^master_minter = \".*\"/master_minter = \"$ADDRESS\"/" "$MOVE_TOML_PATH" -sed -i "s/^minter = \".*\"/minter = \"$ADDRESS\"/" "$MOVE_TOML_PATH" -sed -i "s/^admin = \".*\"/admin = \"$ADDRESS\"/" "$MOVE_TOML_PATH" +# Update the Move.toml file with the addresses +sed -i "s/^resource_addr = \".*\"/resource_addr = \"$RESOURCE_ADDRESS\"/" "$MOVE_TOML_PATH" +sed -i "s/^atomic_bridge = \".*\"/atomic_bridge = \"$RESOURCE_ADDRESS\"/" "$MOVE_TOML_PATH" +sed -i "s/^moveth = \".*\"/moveth = \"$RESOURCE_ADDRESS\"/" "$MOVE_TOML_PATH" +sed -i "s/^master_minter = \".*\"/master_minter = \"$RESOURCE_ADDRESS\"/" "$MOVE_TOML_PATH" +sed -i "s/^minter = \".*\"/minter = \"$RESOURCE_ADDRESS\"/" "$MOVE_TOML_PATH" +sed -i "s/^admin = \".*\"/admin = \"$RESOURCE_ADDRESS\"/" "$MOVE_TOML_PATH" +sed -i "s/^origin_addr = \".*\"/origin_addr = \"$ADDRESS\"/" "$MOVE_TOML_PATH" +sed -i "s/^source_account = \".*\"/source_account = \"$ADDRESS\"/" "$MOVE_TOML_PATH" -echo "Move.toml updated with address: $ADDRESS" \ No newline at end of file +echo "Move.toml updated with ADDRESS: $ADDRESS and RESOURCE_ADDRESS: $RESOURCE_ADDRESS" \ No newline at end of file From 25d0798730fc1c79b9cc22da62571741bae08272 Mon Sep 17 00:00:00 2001 From: Andy Golay Date: Sat, 24 Aug 2024 07:53:10 -0400 Subject: [PATCH 11/21] test: log resource output --- .github/scripts/update_move_toml.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/scripts/update_move_toml.sh b/.github/scripts/update_move_toml.sh index fde5d2ffd..3972d4ef4 100644 --- a/.github/scripts/update_move_toml.sh +++ b/.github/scripts/update_move_toml.sh @@ -18,6 +18,9 @@ RANDOM_SEED=$(shuf -i 0-1000000 -n 1) # Derive the resource account address using the random seed RESOURCE_OUTPUT=$(aptos account derive-resource-account-address --address "$ADDRESS" --seed "$RANDOM_SEED" 2>&1) +echo "Resource address derivation output: $RESOURCE_OUTPUT" + +# Attempt to extract the resource address from the output RESOURCE_ADDRESS=$(echo "$RESOURCE_OUTPUT" | grep -oE '0x[a-f0-9]{64}' | head -1) if [[ -z "$RESOURCE_ADDRESS" ]]; then From f78a0e4e19cf35a072b63e859faed88a46f252f2 Mon Sep 17 00:00:00 2001 From: Andy Golay Date: Sat, 24 Aug 2024 08:04:31 -0400 Subject: [PATCH 12/21] fix: grep for resource address without 0x then prepend 0x --- .github/scripts/update_move_toml.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/scripts/update_move_toml.sh b/.github/scripts/update_move_toml.sh index 3972d4ef4..9334dded6 100644 --- a/.github/scripts/update_move_toml.sh +++ b/.github/scripts/update_move_toml.sh @@ -20,14 +20,17 @@ RANDOM_SEED=$(shuf -i 0-1000000 -n 1) RESOURCE_OUTPUT=$(aptos account derive-resource-account-address --address "$ADDRESS" --seed "$RANDOM_SEED" 2>&1) echo "Resource address derivation output: $RESOURCE_OUTPUT" -# Attempt to extract the resource address from the output -RESOURCE_ADDRESS=$(echo "$RESOURCE_OUTPUT" | grep -oE '0x[a-f0-9]{64}' | head -1) +# Extract the resource address directly +RESOURCE_ADDRESS=$(echo "$RESOURCE_OUTPUT" | grep -oE '[a-f0-9]{64}') if [[ -z "$RESOURCE_ADDRESS" ]]; then echo "Error: Failed to extract the resource account address." exit 1 fi +# Prepend the 0x to the resource address +RESOURCE_ADDRESS="0x$RESOURCE_ADDRESS" + echo "Extracted address: $ADDRESS" echo "Derived resource address: $RESOURCE_ADDRESS" From 1219f93ad3a9325a16c6b5f6b148611d2d2158e0 Mon Sep 17 00:00:00 2001 From: Andy Golay Date: Sat, 24 Aug 2024 08:21:35 -0400 Subject: [PATCH 13/21] test: log contents of Move.toml to debug failed tests --- .github/scripts/update_move_toml.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/scripts/update_move_toml.sh b/.github/scripts/update_move_toml.sh index 9334dded6..b56ae84bf 100644 --- a/.github/scripts/update_move_toml.sh +++ b/.github/scripts/update_move_toml.sh @@ -44,4 +44,7 @@ sed -i "s/^admin = \".*\"/admin = \"$RESOURCE_ADDRESS\"/" "$MOVE_TOML_PATH" sed -i "s/^origin_addr = \".*\"/origin_addr = \"$ADDRESS\"/" "$MOVE_TOML_PATH" sed -i "s/^source_account = \".*\"/source_account = \"$ADDRESS\"/" "$MOVE_TOML_PATH" -echo "Move.toml updated with ADDRESS: $ADDRESS and RESOURCE_ADDRESS: $RESOURCE_ADDRESS" \ No newline at end of file +echo "Move.toml updated with ADDRESS: $ADDRESS and RESOURCE_ADDRESS: $RESOURCE_ADDRESS" + +echo "Contents of $MOVE_TOML_PATH:" +cat "$MOVE_TOML_PATH" \ No newline at end of file From b303fce04d4b3bd90cf345d91ef15f32bb6d9244 Mon Sep 17 00:00:00 2001 From: Andy Golay Date: Sat, 24 Aug 2024 09:09:42 -0400 Subject: [PATCH 14/21] test: echo seed generated by update_move_toml --- .github/scripts/update_move_toml.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/scripts/update_move_toml.sh b/.github/scripts/update_move_toml.sh index b56ae84bf..bbabef557 100644 --- a/.github/scripts/update_move_toml.sh +++ b/.github/scripts/update_move_toml.sh @@ -15,6 +15,7 @@ fi # Generate a random seed RANDOM_SEED=$(shuf -i 0-1000000 -n 1) +echo "Seed: $RANDOM_SEED" # Derive the resource account address using the random seed RESOURCE_OUTPUT=$(aptos account derive-resource-account-address --address "$ADDRESS" --seed "$RANDOM_SEED" 2>&1) From c3b66e1c00125b7ca79e1db31b6360802b123837 Mon Sep 17 00:00:00 2001 From: Andy Golay Date: Sat, 24 Aug 2024 10:08:05 -0400 Subject: [PATCH 15/21] test: check that ci passing is not flaky --- protocol-units/bridge/move-modules/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protocol-units/bridge/move-modules/README.md b/protocol-units/bridge/move-modules/README.md index 6807ed21b..49436bbb4 100644 --- a/protocol-units/bridge/move-modules/README.md +++ b/protocol-units/bridge/move-modules/README.md @@ -172,4 +172,4 @@ This works because in the `moveth` module, the `init_module` function was modifi vector::push_back(&mut minters, @0xc3bb8488ab1a5815a9d543d7e41b0e0df46a7396f89b22821f07a4362f75ddc5); ``` -Avoiding the need to add and then remove caller as minter, and simply having the resource signer facilitate minting, appears to be more efficient. \ No newline at end of file +Avoiding the need to add and then remove caller as minter, and simply having the resource signer facilitate minting, appears to be more efficient. From fbd8b5d01e7255b89d31047758914f68a079c6aa Mon Sep 17 00:00:00 2001 From: Andy Golay Date: Sat, 24 Aug 2024 10:29:06 -0400 Subject: [PATCH 16/21] test: set seed to empty string for testing --- .github/scripts/update_move_toml.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/scripts/update_move_toml.sh b/.github/scripts/update_move_toml.sh index bbabef557..440538b14 100644 --- a/.github/scripts/update_move_toml.sh +++ b/.github/scripts/update_move_toml.sh @@ -18,7 +18,7 @@ RANDOM_SEED=$(shuf -i 0-1000000 -n 1) echo "Seed: $RANDOM_SEED" # Derive the resource account address using the random seed -RESOURCE_OUTPUT=$(aptos account derive-resource-account-address --address "$ADDRESS" --seed "$RANDOM_SEED" 2>&1) +RESOURCE_OUTPUT=$(aptos account derive-resource-account-address --address "$ADDRESS" --seed "" 2>&1) echo "Resource address derivation output: $RESOURCE_OUTPUT" # Extract the resource address directly From 19c9fba975ff01626e6de5e7093532a76584fd45 Mon Sep 17 00:00:00 2001 From: Andy Golay Date: Sat, 24 Aug 2024 11:21:27 -0400 Subject: [PATCH 17/21] fix: seed encoding hex --- .github/scripts/update_move_toml.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/scripts/update_move_toml.sh b/.github/scripts/update_move_toml.sh index 440538b14..8823def9c 100644 --- a/.github/scripts/update_move_toml.sh +++ b/.github/scripts/update_move_toml.sh @@ -18,7 +18,7 @@ RANDOM_SEED=$(shuf -i 0-1000000 -n 1) echo "Seed: $RANDOM_SEED" # Derive the resource account address using the random seed -RESOURCE_OUTPUT=$(aptos account derive-resource-account-address --address "$ADDRESS" --seed "" 2>&1) +RESOURCE_OUTPUT=$(aptos account derive-resource-account-address --address "$ADDRESS" --seed "" --seed-encoding hex 2>&1) echo "Resource address derivation output: $RESOURCE_OUTPUT" # Extract the resource address directly From d90348c008adf232096186850f5d2f99aa6ff6b0 Mon Sep 17 00:00:00 2001 From: Andy Golay Date: Sat, 24 Aug 2024 20:24:47 -0400 Subject: [PATCH 18/21] fix: get_bridge_transfer_details_from_id returns tuple --- .../sources/atomic_bridge_counterparty.move | 46 ++++++++++--------- 1 file changed, 24 insertions(+), 22 deletions(-) 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 40f100700..42c1a8a92 100644 --- a/protocol-units/bridge/move-modules/sources/atomic_bridge_counterparty.move +++ b/protocol-units/bridge/move-modules/sources/atomic_bridge_counterparty.move @@ -23,7 +23,7 @@ module atomic_bridge::atomic_bridge_counterparty { bridge_transfer_cancelled_events: EventHandle, } - struct BridgeTransfer has key, store, drop, copy { + struct BridgeTransfer has key, store { originator: vector, // eth address, recipient: address, amount: u64, @@ -79,25 +79,28 @@ module atomic_bridge::atomic_bridge_counterparty { }); } - #[view] - public fun bridge_transfers(bridge_transfer_id : vector) : BridgeTransfer acquires BridgeTransferStore, BridgeConfig { + public fun get_bridge_transfer_details_from_id(bridge_transfer_id: vector): (vector, address, u64, vector, u64, u8) 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: vector::empty(), - recipient: @atomic_bridge, - 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 - } + + if (!aptos_std::smart_table::contains(&store.transfers, bridge_transfer_id)) { + abort 0x1; // Handle the case where the transfer does not exist + }; + + // Borrow the bridge transfer + let bridge_transfer_ref = aptos_std::smart_table::borrow(&store.transfers, bridge_transfer_id); + + // Return the relevant fields as a tuple + ( + bridge_transfer_ref.originator, + bridge_transfer_ref.recipient, + bridge_transfer_ref.amount, + bridge_transfer_ref.hash_lock, + bridge_transfer_ref.time_lock, + bridge_transfer_ref.state + ) } - + public fun lock_bridge_transfer( caller: &signer, originator: vector, //eth address @@ -259,7 +262,7 @@ module atomic_bridge::atomic_bridge_counterparty { } #[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( + fun test_get_bridge_transfer_details_from_id( origin_account: &signer, resource_addr: signer, client: &signer, @@ -294,9 +297,8 @@ module atomic_bridge::atomic_bridge_counterparty { ); assert!(result, 1); // Verify that the transfer is stored in pending_transfers - let store = borrow_global(signer::address_of(&resource_addr)); - let bridge_transfer = bridge_transfers(bridge_transfer_id); - assert!(bridge_transfer.recipient == recipient, 2); - assert!(bridge_transfer.originator == initiator, 3); + let (transfer_originator, transfer_recipient, transfer_amount, transfer_hash_lock, transfer_time_lock, transfer_state) = get_bridge_transfer_details_from_id(bridge_transfer_id); + assert!(transfer_recipient == recipient, 2); + assert!(transfer_originator == initiator, 3); } } From d947f247ce868ff8ac7fb5d0994e78e15d94a7ee Mon Sep 17 00:00:00 2001 From: Andy Golay Date: Sat, 24 Aug 2024 20:33:25 -0400 Subject: [PATCH 19/21] fix: remove redundant source_account named addr --- protocol-units/bridge/move-modules/Move.toml | 1 - .../sources/atomic_bridge_counterparty.move | 12 ++++-------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/protocol-units/bridge/move-modules/Move.toml b/protocol-units/bridge/move-modules/Move.toml index 0b6be281e..56ab1a2b1 100644 --- a/protocol-units/bridge/move-modules/Move.toml +++ b/protocol-units/bridge/move-modules/Move.toml @@ -11,7 +11,6 @@ moveth = "0xc3bb8488ab1a5815a9d543d7e41b0e0df46a7396f89b22821f07a4362f75ddc5" master_minter = "0xc3bb8488ab1a5815a9d543d7e41b0e0df46a7396f89b22821f07a4362f75ddc5" minter = "0xc3bb8488ab1a5815a9d543d7e41b0e0df46a7396f89b22821f07a4362f75ddc5" admin = "0xc3bb8488ab1a5815a9d543d7e41b0e0df46a7396f89b22821f07a4362f75ddc5" -source_account = "0xc3bb8488ab1a5815a9d543d7e41b0e0df46a7396f89b22821f07a4362f75ddc5" pauser = "0xdafe" denylister = "0xcade" 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 42c1a8a92..e865aa51a 100644 --- a/protocol-units/bridge/move-modules/sources/atomic_bridge_counterparty.move +++ b/protocol-units/bridge/move-modules/sources/atomic_bridge_counterparty.move @@ -84,13 +84,11 @@ module atomic_bridge::atomic_bridge_counterparty { let store = borrow_global(config_address); if (!aptos_std::smart_table::contains(&store.transfers, bridge_transfer_id)) { - abort 0x1; // Handle the case where the transfer does not exist + abort 0x1; }; - // Borrow the bridge transfer let bridge_transfer_ref = aptos_std::smart_table::borrow(&store.transfers, bridge_transfer_id); - // Return the relevant fields as a tuple ( bridge_transfer_ref.originator, bridge_transfer_ref.recipient, @@ -201,7 +199,7 @@ module atomic_bridge::atomic_bridge_counterparty { use aptos_framework::create_signer::create_signer; use aptos_framework::primary_fungible_store; - #[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)] + #[test(origin_account = @origin_addr, resource_addr = @resource_addr, aptos_framework = @0x1, creator = @atomic_bridge, moveth = @moveth, admin = @admin, client = @0xdca, master_minter = @master_minter)] fun test_complete_bridge_transfer( origin_account: &signer, resource_addr: signer, @@ -210,7 +208,6 @@ module atomic_bridge::atomic_bridge_counterparty { master_minter: &signer, creator: &signer, moveth: &signer, - source_account: &signer ) acquires BridgeTransferStore, BridgeConfig { set_up_test(origin_account, &resource_addr); @@ -261,7 +258,7 @@ module atomic_bridge::atomic_bridge_counterparty { assert!(bridge_transfer.originator == 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)] + #[test(origin_account = @origin_addr, resource_addr = @resource_addr, aptos_framework = @0x1, creator = @atomic_bridge, moveth = @moveth, admin = @admin, client = @0xdca, master_minter = @master_minter)] fun test_get_bridge_transfer_details_from_id( origin_account: &signer, resource_addr: signer, @@ -270,7 +267,6 @@ module atomic_bridge::atomic_bridge_counterparty { master_minter: &signer, creator: &signer, moveth: &signer, - source_account: &signer ) acquires BridgeTransferStore, BridgeConfig { set_up_test(origin_account, &resource_addr); @@ -296,7 +292,7 @@ module atomic_bridge::atomic_bridge_counterparty { amount ); assert!(result, 1); - // Verify that the transfer is stored in pending_transfers + let (transfer_originator, transfer_recipient, transfer_amount, transfer_hash_lock, transfer_time_lock, transfer_state) = get_bridge_transfer_details_from_id(bridge_transfer_id); assert!(transfer_recipient == recipient, 2); assert!(transfer_originator == initiator, 3); From 4465ac30089f255ce86343760b352e9b34493adf Mon Sep 17 00:00:00 2001 From: Andy Golay Date: Sat, 24 Aug 2024 20:35:45 -0400 Subject: [PATCH 20/21] fix: remove source_account from workflow Move.toml update --- .github/scripts/update_move_toml.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/scripts/update_move_toml.sh b/.github/scripts/update_move_toml.sh index 8823def9c..b0b11205f 100644 --- a/.github/scripts/update_move_toml.sh +++ b/.github/scripts/update_move_toml.sh @@ -43,7 +43,6 @@ sed -i "s/^master_minter = \".*\"/master_minter = \"$RESOURCE_ADDRESS\"/" "$MOVE sed -i "s/^minter = \".*\"/minter = \"$RESOURCE_ADDRESS\"/" "$MOVE_TOML_PATH" sed -i "s/^admin = \".*\"/admin = \"$RESOURCE_ADDRESS\"/" "$MOVE_TOML_PATH" sed -i "s/^origin_addr = \".*\"/origin_addr = \"$ADDRESS\"/" "$MOVE_TOML_PATH" -sed -i "s/^source_account = \".*\"/source_account = \"$ADDRESS\"/" "$MOVE_TOML_PATH" echo "Move.toml updated with ADDRESS: $ADDRESS and RESOURCE_ADDRESS: $RESOURCE_ADDRESS" From dc1dabb878b9bdf1d8218ae5c359b926ae3556ac Mon Sep 17 00:00:00 2001 From: primata Date: Mon, 26 Aug 2024 16:59:42 -0300 Subject: [PATCH 21/21] add new view function to initiator --- .../sources/atomic_bridge_counterparty.move | 5 +- .../sources/atomic_bridge_initiator.move | 54 ++++++++----------- 2 files changed, 24 insertions(+), 35 deletions(-) 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 e865aa51a..6925fbb8c 100644 --- a/protocol-units/bridge/move-modules/sources/atomic_bridge_counterparty.move +++ b/protocol-units/bridge/move-modules/sources/atomic_bridge_counterparty.move @@ -79,7 +79,8 @@ module atomic_bridge::atomic_bridge_counterparty { }); } - public fun get_bridge_transfer_details_from_id(bridge_transfer_id: vector): (vector, address, u64, vector, u64, u8) acquires BridgeTransferStore, BridgeConfig { + #[view] + public fun bridge_transfers(bridge_transfer_id: vector): (vector, address, u64, vector, u64, u8) acquires BridgeTransferStore, BridgeConfig { let config_address = borrow_global(@atomic_bridge).bridge_module_deployer; let store = borrow_global(config_address); @@ -293,7 +294,7 @@ module atomic_bridge::atomic_bridge_counterparty { ); assert!(result, 1); - let (transfer_originator, transfer_recipient, transfer_amount, transfer_hash_lock, transfer_time_lock, transfer_state) = get_bridge_transfer_details_from_id(bridge_transfer_id); + let (transfer_originator, transfer_recipient, transfer_amount, transfer_hash_lock, transfer_time_lock, transfer_state) = bridge_transfers(bridge_transfer_id); assert!(transfer_recipient == recipient, 2); assert!(transfer_originator == 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 3bed092ff..f47202293 100644 --- a/protocol-units/bridge/move-modules/sources/atomic_bridge_initiator.move +++ b/protocol-units/bridge/move-modules/sources/atomic_bridge_initiator.move @@ -81,22 +81,24 @@ module atomic_bridge::atomic_bridge_initiator { } #[view] - public fun bridge_transfers(bridge_transfer_id : vector) : BridgeTransfer acquires BridgeTransferStore, BridgeConfig { - let config_address = borrow_global(@atomic_bridge).bridge_module_deployer; + public fun bridge_transfers(bridge_transfer_id: vector): (address, vector, u64, vector, u64, u8) 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 - } + + if (!aptos_std::smart_table::contains(&store.transfers, bridge_transfer_id)) { + abort 0x1; + }; + + let bridge_transfer_ref = aptos_std::smart_table::borrow(&store.transfers, bridge_transfer_id); + + ( + bridge_transfer_ref.originator, + bridge_transfer_ref.recipient, + bridge_transfer_ref.amount, + bridge_transfer_ref.hash_lock, + bridge_transfer_ref.time_lock, + bridge_transfer_ref.state + ) } public fun initiate_bridge_transfer( @@ -494,7 +496,6 @@ module atomic_bridge::atomic_bridge_initiator { } #[test(creator = @moveth, aptos_framework = @0x1, sender = @0xdaff, atomic_bridge = @atomic_bridge)] - #[expected_failure(abort_code = 7)] public fun test_bridge_transfers_view( sender: &signer, creator: &signer, @@ -522,29 +523,16 @@ module atomic_bridge::atomic_bridge_initiator { aptos_std::debug::print(&bridge_transfer_id); // returns a valid transfer - let bridge_transfer = bridge_transfers(bridge_transfer_id); + let (transfer_originator, transfer_recipient, transfer_amount, transfer_hash_lock, transfer_time_lock, transfer_state) = bridge_transfers(bridge_transfer_id); - assert!(bridge_transfer.state == INITIALIZED, 6); - aptos_std::debug::print(&bridge_transfer.state); + assert!(transfer_state == INITIALIZED, 6); + aptos_std::debug::print(&transfer_state); complete_bridge_transfer( sender, bridge_transfer_id, pre_image, atomic_bridge ); - aptos_std::debug::print(&bridge_transfer.state); - - // 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 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); + aptos_std::debug::print(&transfer_state); } } \ No newline at end of file