Skip to content

Commit 5d34e89

Browse files
committed
feat: add missing params to deposit hashes
Signed-off-by: Pablo Maldonado <[email protected]>
1 parent b6b8b9e commit 5d34e89

File tree

4 files changed

+295
-135
lines changed

4 files changed

+295
-135
lines changed

Diff for: programs/svm-spoke/src/instructions/deposit.rs

+60-17
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ use crate::{
1111
error::{CommonError, SvmError},
1212
event::FundsDeposited,
1313
state::{Route, State},
14-
utils::{derive_deposit_delegate_seed_hash, get_current_time, get_unsafe_deposit_id, transfer_from},
14+
utils::{
15+
derive_deposit_now_seed_hash, derive_deposit_seed_hash, get_current_time, get_unsafe_deposit_id, transfer_from,
16+
DepositNowSeedData, DepositSeedData,
17+
},
1518
};
1619

1720
#[event_cpi]
@@ -36,7 +39,7 @@ pub struct Deposit<'info> {
3639
)]
3740
pub state: Account<'info, State>,
3841

39-
/// CHECK: PDA derived with seeds ["delegate", deposit_delegate_seed_hash]; used as a CPI signer.
42+
/// CHECK: PDA derived with seeds ["delegate", deposit_seed_hash]; used as a CPI signer.
4043
pub delegate: UncheckedAccount<'info>,
4144

4245
#[account(
@@ -86,6 +89,7 @@ pub fn _deposit(
8689
fill_deadline: u32,
8790
exclusivity_parameter: u32,
8891
message: Vec<u8>,
92+
delegate_seed_hash: [u8; 32],
8993
) -> Result<()> {
9094
let state = &mut ctx.accounts.state;
9195
let current_time = get_current_time(state)?;
@@ -108,19 +112,7 @@ pub fn _deposit(
108112
}
109113

110114
// Verify delegate PDA
111-
let seed_hash = derive_deposit_delegate_seed_hash(
112-
depositor,
113-
recipient,
114-
input_token,
115-
output_token,
116-
input_amount,
117-
output_amount,
118-
destination_chain_id,
119-
exclusive_relayer,
120-
exclusivity_parameter,
121-
message.clone(),
122-
);
123-
let (pda, bump) = Pubkey::find_program_address(&[b"delegate", &seed_hash], &ctx.program_id);
115+
let (pda, bump) = Pubkey::find_program_address(&[b"delegate", &delegate_seed_hash], &ctx.program_id);
124116
if pda != ctx.accounts.delegate.key() {
125117
return err!(SvmError::InvalidDelegatePda);
126118
}
@@ -133,7 +125,7 @@ pub fn _deposit(
133125
&ctx.accounts.delegate,
134126
&ctx.accounts.mint,
135127
&ctx.accounts.token_program,
136-
seed_hash,
128+
delegate_seed_hash,
137129
bump,
138130
)?;
139131

@@ -178,6 +170,22 @@ pub fn deposit(
178170
exclusivity_parameter: u32,
179171
message: Vec<u8>,
180172
) -> Result<()> {
173+
let seed_hash = derive_deposit_seed_hash(
174+
&(DepositSeedData {
175+
depositor,
176+
recipient,
177+
input_token,
178+
output_token,
179+
input_amount,
180+
output_amount,
181+
destination_chain_id,
182+
exclusive_relayer,
183+
quote_timestamp,
184+
fill_deadline,
185+
exclusivity_parameter,
186+
message: message.clone(),
187+
}),
188+
);
181189
_deposit(
182190
ctx,
183191
depositor,
@@ -193,6 +201,7 @@ pub fn deposit(
193201
fill_deadline,
194202
exclusivity_parameter,
195203
message,
204+
seed_hash,
196205
)?;
197206

198207
Ok(())
@@ -214,7 +223,22 @@ pub fn deposit_now(
214223
) -> Result<()> {
215224
let state = &mut ctx.accounts.state;
216225
let current_time = get_current_time(state)?;
217-
deposit(
226+
let seed_hash = derive_deposit_now_seed_hash(
227+
&(DepositNowSeedData {
228+
depositor,
229+
recipient,
230+
input_token,
231+
output_token,
232+
input_amount,
233+
output_amount,
234+
destination_chain_id,
235+
exclusive_relayer,
236+
fill_deadline_offset,
237+
exclusivity_period,
238+
message: message.clone(),
239+
}),
240+
);
241+
_deposit(
218242
ctx,
219243
depositor,
220244
recipient,
@@ -224,10 +248,12 @@ pub fn deposit_now(
224248
output_amount,
225249
destination_chain_id,
226250
exclusive_relayer,
251+
ZERO_DEPOSIT_ID, // ZERO_DEPOSIT_ID informs internal function to use state.number_of_deposits as id.
227252
current_time,
228253
current_time + fill_deadline_offset,
229254
exclusivity_period,
230255
message,
256+
seed_hash,
231257
)?;
232258

233259
Ok(())
@@ -251,6 +277,22 @@ pub fn unsafe_deposit(
251277
) -> Result<()> {
252278
// Calculate the unsafe deposit ID as a [u8; 32]
253279
let deposit_id = get_unsafe_deposit_id(ctx.accounts.signer.key(), depositor, deposit_nonce);
280+
let seed_hash = derive_deposit_seed_hash(
281+
&(DepositSeedData {
282+
depositor,
283+
recipient,
284+
input_token,
285+
output_token,
286+
input_amount,
287+
output_amount,
288+
destination_chain_id,
289+
exclusive_relayer,
290+
quote_timestamp,
291+
fill_deadline,
292+
exclusivity_parameter,
293+
message: message.clone(),
294+
}),
295+
);
254296
_deposit(
255297
ctx,
256298
depositor,
@@ -266,6 +308,7 @@ pub fn unsafe_deposit(
266308
fill_deadline,
267309
exclusivity_parameter,
268310
message,
311+
seed_hash,
269312
)?;
270313

271314
Ok(())

Diff for: programs/svm-spoke/src/utils/deposit_utils.rs

+40-38
Original file line numberDiff line numberDiff line change
@@ -11,44 +11,46 @@ pub fn get_unsafe_deposit_id(msg_sender: Pubkey, depositor: Pubkey, deposit_nonc
1111
}
1212

1313
#[derive(AnchorSerialize)]
14-
struct DepositDelegateSeedData {
15-
depositor: Pubkey,
16-
recipient: Pubkey,
17-
input_token: Pubkey,
18-
output_token: Pubkey,
19-
input_amount: u64,
20-
output_amount: u64,
21-
destination_chain_id: u64,
22-
exclusive_relayer: Pubkey,
23-
exclusivity_parameter: u32,
24-
message: Vec<u8>,
14+
pub struct DepositSeedData {
15+
pub depositor: Pubkey,
16+
pub recipient: Pubkey,
17+
pub input_token: Pubkey,
18+
pub output_token: Pubkey,
19+
pub input_amount: u64,
20+
pub output_amount: u64,
21+
pub destination_chain_id: u64,
22+
pub exclusive_relayer: Pubkey,
23+
pub quote_timestamp: u32,
24+
pub fill_deadline: u32,
25+
pub exclusivity_parameter: u32,
26+
pub message: Vec<u8>,
2527
}
2628

27-
pub fn derive_deposit_delegate_seed_hash(
28-
depositor: Pubkey,
29-
recipient: Pubkey,
30-
input_token: Pubkey,
31-
output_token: Pubkey,
32-
input_amount: u64,
33-
output_amount: u64,
34-
destination_chain_id: u64,
35-
exclusive_relayer: Pubkey,
36-
exclusivity_parameter: u32,
37-
message: Vec<u8>,
38-
) -> [u8; 32] {
39-
let data_struct = DepositDelegateSeedData {
40-
depositor,
41-
recipient,
42-
input_token,
43-
output_token,
44-
input_amount,
45-
output_amount,
46-
destination_chain_id,
47-
exclusive_relayer,
48-
exclusivity_parameter,
49-
message,
50-
};
51-
let serialized = data_struct.try_to_vec().unwrap();
52-
53-
keccak::hash(&serialized).to_bytes()
29+
#[derive(AnchorSerialize)]
30+
pub struct DepositNowSeedData {
31+
pub depositor: Pubkey,
32+
pub recipient: Pubkey,
33+
pub input_token: Pubkey,
34+
pub output_token: Pubkey,
35+
pub input_amount: u64,
36+
pub output_amount: u64,
37+
pub destination_chain_id: u64,
38+
pub exclusive_relayer: Pubkey,
39+
pub fill_deadline_offset: u32,
40+
pub exclusivity_period: u32,
41+
pub message: Vec<u8>,
42+
}
43+
44+
pub fn derive_seed_hash<T: AnchorSerialize>(seed: &T) -> [u8; 32] {
45+
let mut buf = Vec::with_capacity(128);
46+
seed.serialize(&mut buf).unwrap();
47+
keccak::hash(&buf).to_bytes()
48+
}
49+
50+
pub fn derive_deposit_seed_hash(args: &DepositSeedData) -> [u8; 32] {
51+
derive_seed_hash(args)
52+
}
53+
54+
pub fn derive_deposit_now_seed_hash(args: &DepositNowSeedData) -> [u8; 32] {
55+
derive_seed_hash(args)
5456
}

0 commit comments

Comments
 (0)