Skip to content

Commit 530d262

Browse files
committed
Add v2 payload
1 parent 4e2af8c commit 530d262

File tree

3 files changed

+54
-24
lines changed

3 files changed

+54
-24
lines changed

crates/sui-bridge/src/abi.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,6 @@ pub struct EthToSuiTokenBridgeV1 {
190190
pub eth_address: EthAddress,
191191
pub token_id: u8,
192192
pub sui_adjusted_amount: u64,
193-
#[serde(default)]
194-
pub block_timestamp: Option<u64>,
195193
}
196194

197195
impl TryFrom<&TokensDepositedFilter> for EthToSuiTokenBridgeV1 {
@@ -205,7 +203,6 @@ impl TryFrom<&TokensDepositedFilter> for EthToSuiTokenBridgeV1 {
205203
eth_address: event.sender_address,
206204
token_id: event.token_id,
207205
sui_adjusted_amount: event.sui_adjusted_amount,
208-
block_timestamp: None,
209206
})
210207
}
211208
}

crates/sui-framework/packages/bridge/sources/bridge.move

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ public fun send_token_v2<T>(
330330
target_address,
331331
token_type: token_id,
332332
amount: token_amount,
333-
timestamp: clock.timestamp_ms(),
333+
timestamp_ms: clock.timestamp_ms(),
334334
});
335335
}
336336

@@ -582,14 +582,17 @@ fun claim_token_internal<T>(
582582
assert!(record.verified_signatures.is_some(), EUnauthorisedClaim);
583583

584584
// extract token message
585-
let token_payload = record.message.extract_token_bridge_payload();
586585
let mut bypass_limiter = false;
587-
if (record.message.message_version() == 2) {
588-
let timestamp = record.message.extract_token_bridge_payload_v2_timestamp();
586+
let mut token_payload;
587+
if (record.message.message_version() == 1) {
588+
token_payload = record.message.extract_token_bridge_payload();
589+
} else if (record.message.message_version() == 2) {
590+
let token_payload_v2 = record.message.extract_token_bridge_payload_v2();
591+
592+
let timestamp = token_payload_v2.timestamp_ms();
589593
// if token_payload.timestamp is within the last 48 hours, bypass the limiter
590-
if (clock.timestamp_ms() < timestamp + 48 * 3600000) {
591-
bypass_limiter = true;
592-
};
594+
bypass_limiter = clock.timestamp_ms() < timestamp + 48 * 3600000;
595+
token_payload = token_payload_v2.to_token_payload_v1();
593596
};
594597

595598
// get owner address

crates/sui-framework/packages/bridge/sources/message.move

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ const EInvalidMessageType: u64 = 3;
1919
const EInvalidEmergencyOpType: u64 = 4;
2020
const EInvalidPayloadLength: u64 = 5;
2121
const EMustBeTokenMessage: u64 = 6;
22+
const EInvalidMessageVersion: u64 = 7;
2223

2324
// Emergency Op types
2425
const 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+
5363
public 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.
101111
public 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
535565
public fun emergency_op_type(self: &EmergencyOp): u8 {
536566
self.op_type

0 commit comments

Comments
 (0)