@@ -19,6 +19,7 @@ const EInvalidMessageType: u64 = 3;
1919const EInvalidEmergencyOpType : u64 = 4 ;
2020const EInvalidPayloadLength : u64 = 5 ;
2121const EMustBeTokenMessage : u64 = 6 ;
22+ const EInvalidMessageVersion : u64 = 7 ;
2223
2324// Emergency Op types
2425const PAUSE : u8 = 0 ;
@@ -50,6 +51,15 @@ public struct TokenTransferPayload has drop {
5051 amount: u64 ,
5152}
5253
54+ public struct TokenTransferPayloadV2 has drop {
55+ sender_address: vector <u8 >,
56+ target_chain: u8 ,
57+ target_address: vector <u8 >,
58+ token_type: u8 ,
59+ amount: u64 ,
60+ timestamp_ms: u64 ,
61+ }
62+
5363public struct EmergencyOp has drop {
5464 op_type: u8 ,
5565}
@@ -99,6 +109,7 @@ public struct ParsedTokenTransferMessage has drop {
99109// Therefore their length can be represented by a single byte.
100110// See `create_token_bridge_message` for the actual encoding rule.
101111public fun extract_token_bridge_payload (message: &BridgeMessage ): TokenTransferPayload {
112+ assert !(message.message_version () == 1 , EInvalidMessageVersion );
102113 let mut bcs = bcs::new (message.payload);
103114 let sender_address = bcs.peel_vec_u8 ();
104115 let target_chain = bcs.peel_u8 ();
@@ -108,12 +119,7 @@ public fun extract_token_bridge_payload(message: &BridgeMessage): TokenTransferP
108119
109120 chain_ids::assert_valid_chain_id (target_chain);
110121
111- if (message.message_version () == 2 ) {
112- let _timestamp = peel_u64_be (&mut bcs);
113- assert !(bcs.into_remainder_bytes ().is_empty (), ETrailingBytes );
114- } else {
115- assert !(bcs.into_remainder_bytes ().is_empty (), ETrailingBytes );
116- };
122+ assert !(bcs.into_remainder_bytes ().is_empty (), ETrailingBytes );
117123
118124 TokenTransferPayload {
119125 sender_address,
@@ -128,18 +134,38 @@ public fun extract_token_bridge_payload(message: &BridgeMessage): TokenTransferP
128134// `sender_address` and `target_address` are no longer than 255 bytes.
129135// Therefore their length can be represented by a single byte.
130136// See `create_token_bridge_message` for the actual encoding rule.
131- public fun extract_token_bridge_payload_v2_timestamp (message: &BridgeMessage ): u64 {
137+ public fun extract_token_bridge_payload_v2 (message: &BridgeMessage ): TokenTransferPayloadV2 {
138+ assert !(message.message_version () == 2 , EInvalidMessageVersion );
139+
132140 let mut bcs = bcs::new (message.payload);
133- let _sender_address = bcs.peel_vec_u8 ();
134- let _target_chain = bcs.peel_u8 ();
135- let _target_address = bcs.peel_vec_u8 ();
136- let _token_type = bcs.peel_u8 ();
137- let _amount = peel_u64_be (&mut bcs);
138- let timestamp = peel_u64_be (&mut bcs);
141+ let sender_address = bcs.peel_vec_u8 ();
142+ let target_chain = bcs.peel_u8 ();
143+ let target_address = bcs.peel_vec_u8 ();
144+ let token_type = bcs.peel_u8 ();
145+ let amount = peel_u64_be (&mut bcs);
139146
147+ chain_ids::assert_valid_chain_id (target_chain);
148+ let timestamp_ms = peel_u64_be (&mut bcs);
140149 assert !(bcs.into_remainder_bytes ().is_empty (), ETrailingBytes );
141150
142- timestamp
151+ TokenTransferPayloadV2 {
152+ sender_address,
153+ target_chain,
154+ target_address,
155+ token_type,
156+ amount,
157+ timestamp_ms,
158+ }
159+ }
160+
161+ public fun to_token_payload_v1 (self: &TokenTransferPayloadV2 ): TokenTransferPayload {
162+ TokenTransferPayload {
163+ sender_address: self.sender_address,
164+ target_chain: self.target_chain,
165+ target_address: self.target_address,
166+ token_type: self.token_type,
167+ amount: self.amount,
168+ }
143169}
144170
145171/// Emergency op payload is just a single byte
@@ -531,6 +557,10 @@ public fun token_amount(self: &TokenTransferPayload): u64 {
531557 self.amount
532558}
533559
560+ public fun timestamp_ms (self: &TokenTransferPayloadV2 ): u64 {
561+ self.timestamp_ms
562+ }
563+
534564// EmergencyOpPayload getters
535565public fun emergency_op_type (self: &EmergencyOp ): u8 {
536566 self.op_type
0 commit comments