Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 30 additions & 5 deletions crates/sui-framework/packages/bridge/sources/bridge.move
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ use bridge::treasury::{Self, BridgeTreasury};
use sui::address;
use sui::clock::Clock;
use sui::coin::{Coin, TreasuryCap, CoinMetadata};
use sui::coin_registry::Currency;
use sui::event;
use sui::linked_table::{Self, LinkedTable};
use sui::package::UpgradeCap;
Expand Down Expand Up @@ -193,6 +194,7 @@ public fun update_node_url(bridge: &mut Bridge, new_url: vector<u8>, ctx: &TxCon
load_inner_mut(bridge).committee.update_node_url(new_url, ctx);
}

#[deprecated(note = b"Use `register_foreign_token_v2` instead")]
public fun register_foreign_token<T>(
bridge: &mut Bridge,
tc: TreasuryCap<T>,
Expand All @@ -202,6 +204,15 @@ public fun register_foreign_token<T>(
load_inner_mut(bridge).treasury.register_foreign_token<T>(tc, uc, metadata)
}

public fun register_foreign_token_v2<T>(
bridge: &mut Bridge,
tc: TreasuryCap<T>,
uc: UpgradeCap,
currency: &Currency<T>,
) {
load_inner_mut(bridge).treasury.register_foreign_token_v2<T>(tc, uc, currency)
}

// Create bridge request to send token to other chain, the request will be in
// pending state until approved
public fun send_token<T>(
Expand All @@ -216,7 +227,9 @@ public fun send_token<T>(
assert!(chain_ids::is_valid_route(inner.chain_id, target_chain), EInvalidBridgeRoute);
assert!(target_address.length() == EVM_ADDRESS_LENGTH, EInvalidEvmAddress);

let bridge_seq_num = inner.get_current_seq_num_and_increment(message_types::token());
let bridge_seq_num = inner.get_current_seq_num_and_increment(
message_types::token(),
);
let token_id = inner.treasury.token_id<T>();
let token_amount = token.balance().value();
assert!(token_amount > 0, ETokenValueIsZero);
Expand Down Expand Up @@ -276,7 +289,8 @@ public fun approve_token_transfer(
let token_payload = message.extract_token_bridge_payload();
let target_chain = token_payload.token_target_chain();
assert!(
message.source_chain() == inner.chain_id || target_chain == inner.chain_id,
message.source_chain() == inner.chain_id ||
target_chain == inner.chain_id,
EUnexpectedChainID,
);

Expand Down Expand Up @@ -352,7 +366,12 @@ public fun claim_and_transfer_token<T>(
bridge_seq_num: u64,
ctx: &mut TxContext,
) {
let (token, owner) = bridge.claim_token_internal<T>(clock, source_chain, bridge_seq_num, ctx);
let (token, owner) = bridge.claim_token_internal<T>(
clock,
source_chain,
bridge_seq_num,
ctx,
);
if (token.is_some()) {
transfer::public_transfer(token.destroy_some(), owner)
} else {
Expand All @@ -374,7 +393,9 @@ public fun execute_system_message(
assert!(message.source_chain() == inner.chain_id, EUnexpectedChainID);

// check system ops seq number and increment it
let expected_seq_num = inner.get_current_seq_num_and_increment(message_type);
let expected_seq_num = inner.get_current_seq_num_and_increment(
message_type,
);
assert!(message.seq_num() == expected_seq_num, EUnexpectedSeqNum);

inner.committee.verify_signatures(message, signatures);
Expand Down Expand Up @@ -484,7 +505,11 @@ fun claim_token_internal<T>(
let inner = load_inner_mut(bridge);
assert!(!inner.paused, EBridgeUnavailable);

let key = message::create_key(source_chain, message_types::token(), bridge_seq_num);
let key = message::create_key(
source_chain,
message_types::token(),
bridge_seq_num,
);
assert!(inner.token_transfer_records.contains(key), EMessageNotFoundInRecords);

// retrieve approved bridge message
Expand Down
40 changes: 39 additions & 1 deletion crates/sui-framework/packages/bridge/sources/treasury.move
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ use std::type_name::{Self, TypeName};
use sui::address;
use sui::bag::{Self, Bag};
use sui::coin::{Self, Coin, TreasuryCap, CoinMetadata};
use sui::coin_registry::Currency;
use sui::event;
use sui::hex;
use sui::object_bag::{Self, ObjectBag};
Expand Down Expand Up @@ -87,6 +88,7 @@ public fun notional_value<T>(self: &BridgeTreasury): u64 {
// Internal functions
//

#[deprecated(note = b"Use `register_foreign_token_v2` instead")]
public(package) fun register_foreign_token<T>(
self: &mut BridgeTreasury,
tc: TreasuryCap<T>,
Expand All @@ -96,7 +98,9 @@ public(package) fun register_foreign_token<T>(
// Make sure TreasuryCap has not been minted before.
assert!(coin::total_supply(&tc) == 0, ETokenSupplyNonZero);
let type_name = type_name::with_defining_ids<T>();
let address_bytes = hex::decode(ascii::into_bytes(type_name::address_string(&type_name)));
let address_bytes = hex::decode(
ascii::into_bytes(type_name::address_string(&type_name)),
);
let coin_address = address::from_bytes(address_bytes);
// Make sure upgrade cap is for the Coin package
// FIXME: add test
Expand All @@ -119,6 +123,40 @@ public(package) fun register_foreign_token<T>(
});
}

public(package) fun register_foreign_token_v2<T>(
self: &mut BridgeTreasury,
tc: TreasuryCap<T>,
uc: UpgradeCap,
currency: &Currency<T>,
) {
// Make sure TreasuryCap has not been minted before.
assert!(coin::total_supply(&tc) == 0, ETokenSupplyNonZero);
Copy link
Contributor

@manolisliolios manolisliolios Nov 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use receiver syntax (I think there are a few more occasions you should in this fn)

Suggested change
assert!(coin::total_supply(&tc) == 0, ETokenSupplyNonZero);
assert!(tc.total_supply() == 0, ETokenSupplyNonZero);

let type_name = type_name::with_defining_ids<T>();
let address_bytes = hex::decode(
ascii::into_bytes(type_name::address_string(&type_name)),
);
let coin_address = address::from_bytes(address_bytes);
// Make sure upgrade cap is for the Coin package
// FIXME: add test
assert!(
object::id_to_address(&package::upgrade_package(&uc)) == coin_address,
EInvalidUpgradeCap,
);
let registration = ForeignTokenRegistration {
type_name,
uc,
decimal: currency.decimals(),
};
self.waiting_room.add(type_name::into_string(type_name), registration);
self.treasuries.add(type_name, tc);

event::emit(TokenRegistrationEvent {
type_name,
decimal: currency.decimals(),
native_token: false,
});
}

public(package) fun add_new_token(
self: &mut BridgeTreasury,
token_name: String,
Expand Down
Loading
Loading