@@ -780,8 +780,9 @@ export class SuiNtt<N extends Network, C extends SuiChains>
780780
781781 // get token ID
782782 const token = this . contracts . ntt ! [ "token" ] ;
783- const isNativeToken = ( typeof token === "string" && token === "native" ) ||
784- ( typeof token === "string" && token === "0x2::sui::SUI" ) ;
783+ const isNativeToken =
784+ ( typeof token === "string" && token === "native" ) ||
785+ ( typeof token === "string" && token === "0x2::sui::SUI" ) ;
785786 const tokenAddress = new SuiAddress (
786787 isNativeToken
787788 ? SuiPlatform . nativeTokenId ( this . network , this . chain ) . address
@@ -852,7 +853,20 @@ export class SuiNtt<N extends Network, C extends SuiChains>
852853 ] ,
853854 } ) ;
854855
855- // Now call transfer_tx_sender with just the ticket
856+ // Get next sequence number before calling transfer_tx_sender
857+ const [ sequenceBytes32 ] = txb . moveCall ( {
858+ target : `${ packageId } ::state::get_next_sequence` ,
859+ typeArguments : [ tokenId ] ,
860+ arguments : [ txb . object ( this . contracts . ntt ! [ "manager" ] ) ] ,
861+ } ) ;
862+
863+ // Get Wormhole package ID
864+ const wormholePackageId = await this . getWormholePackageId (
865+ this . provider ,
866+ this . coreBridgeStateId
867+ ) ;
868+
869+ // Now call transfer_tx_sender
856870 txb . moveCall ( {
857871 target : `${ packageId } ::ntt::transfer_tx_sender` ,
858872 typeArguments : [ tokenId ] ,
@@ -865,6 +879,52 @@ export class SuiNtt<N extends Network, C extends SuiChains>
865879 ] ,
866880 } ) ;
867881
882+ // Get transceiver info
883+ const transceiverStateId = this . contracts . ntt ! . transceiver ?. [ "wormhole" ] ;
884+ if ( ! transceiverStateId ) {
885+ throw new Error ( "Wormhole transceiver not found in contracts" ) ;
886+ }
887+
888+ // Get transceiver package ID
889+ const transceiverPackageId = await this . getPackageIdFromObject (
890+ transceiverStateId
891+ ) ;
892+
893+ // Create transceiver message
894+ const [ transceiverMessage ] = txb . moveCall ( {
895+ target : `${ packageId } ::state::create_transceiver_message` ,
896+ typeArguments : [
897+ `${ transceiverPackageId } ::wormhole_transceiver::TransceiverAuth` ,
898+ tokenId ,
899+ ] ,
900+ arguments : [
901+ txb . object ( this . contracts . ntt ! [ "manager" ] ) ,
902+ sequenceBytes32 as any ,
903+ txb . object ( SUI_CLOCK_OBJECT_ID ) ,
904+ ] ,
905+ } ) ;
906+
907+ // Release outbound message
908+ const [ messageTicket ] = txb . moveCall ( {
909+ target : `${ transceiverPackageId } ::wormhole_transceiver::release_outbound` ,
910+ typeArguments : [ `${ packageId } ::auth::ManagerAuth` ] ,
911+ arguments : [ txb . object ( transceiverStateId ) , transceiverMessage as any ] ,
912+ } ) ;
913+
914+ // Split fee coin for publishing message
915+ const [ feeCoin ] = txb . splitCoins ( txb . gas , [ txb . pure . u64 ( 0n ) ] ) ;
916+
917+ // Publish message to Wormhole
918+ txb . moveCall ( {
919+ target : `${ wormholePackageId } ::publish_message::publish_message` ,
920+ arguments : [
921+ txb . object ( this . coreBridgeStateId ) ,
922+ feeCoin ,
923+ messageTicket as any ,
924+ txb . object ( SUI_CLOCK_OBJECT_ID ) ,
925+ ] ,
926+ } ) ;
927+
868928 // Handle dust by converting back to coin and merging with gas if native or back to sender otherwise
869929 const [ dustCoin ] = txb . moveCall ( {
870930 target : `0x2::coin::from_balance` ,
0 commit comments