@@ -11,7 +11,9 @@ use crate::{
1111 error:: { CommonError , SvmError } ,
1212 event:: FundsDeposited ,
1313 state:: { Route , State } ,
14- utils:: { get_current_time, get_unsafe_deposit_id, transfer_from} ,
14+ utils:: {
15+ derive_seed_hash, get_current_time, get_unsafe_deposit_id, transfer_from, DepositNowSeedData , DepositSeedData ,
16+ } ,
1517} ;
1618
1719#[ event_cpi]
@@ -23,7 +25,7 @@ use crate::{
2325 output_token: Pubkey ,
2426 input_amount: u64 ,
2527 output_amount: u64 ,
26- destination_chain_id: u64 ,
28+ destination_chain_id: u64
2729) ]
2830pub struct Deposit < ' info > {
2931 #[ account( mut ) ]
@@ -36,6 +38,9 @@ pub struct Deposit<'info> {
3638 ) ]
3739 pub state : Account < ' info , State > ,
3840
41+ /// CHECK: PDA derived with seeds ["delegate", seed_hash]; used as a CPI signer.
42+ pub delegate : UncheckedAccount < ' info > ,
43+
3944 #[ account(
4045 seeds = [ b"route" , input_token. as_ref( ) , state. seed. to_le_bytes( ) . as_ref( ) , destination_chain_id. to_le_bytes( ) . as_ref( ) ] ,
4146 bump,
@@ -83,15 +88,14 @@ pub fn _deposit(
8388 fill_deadline : u32 ,
8489 exclusivity_parameter : u32 ,
8590 message : Vec < u8 > ,
91+ delegate_seed_hash : [ u8 ; 32 ] ,
8692) -> Result < ( ) > {
8793 let state = & mut ctx. accounts . state ;
88-
8994 let current_time = get_current_time ( state) ?;
9095
9196 if current_time. checked_sub ( quote_timestamp) . unwrap_or ( u32:: MAX ) > state. deposit_quote_time_buffer {
9297 return err ! ( CommonError :: InvalidQuoteTimestamp ) ;
9398 }
94-
9599 if fill_deadline > current_time + state. fill_deadline_buffer {
96100 return err ! ( CommonError :: InvalidFillDeadline ) ;
97101 }
@@ -101,21 +105,20 @@ pub fn _deposit(
101105 if exclusivity_deadline <= MAX_EXCLUSIVITY_PERIOD_SECONDS {
102106 exclusivity_deadline += current_time;
103107 }
104-
105108 if exclusive_relayer == Pubkey :: default ( ) {
106109 return err ! ( CommonError :: InvalidExclusiveRelayer ) ;
107110 }
108111 }
109112
110- // Depositor must have delegated input_amount to the state PDA.
113+ // Depositor must have delegated input_amount to the delegate PDA
111114 transfer_from (
112115 & ctx. accounts . depositor_token_account ,
113116 & ctx. accounts . vault ,
114117 input_amount,
115- state,
116- ctx. bumps . state ,
118+ & ctx. accounts . delegate ,
117119 & ctx. accounts . mint ,
118120 & ctx. accounts . token_program ,
121+ delegate_seed_hash,
119122 ) ?;
120123
121124 let mut applied_deposit_id = deposit_id;
@@ -159,6 +162,22 @@ pub fn deposit(
159162 exclusivity_parameter : u32 ,
160163 message : Vec < u8 > ,
161164) -> Result < ( ) > {
165+ let seed_hash = derive_seed_hash (
166+ & ( DepositSeedData {
167+ depositor,
168+ recipient,
169+ input_token,
170+ output_token,
171+ input_amount,
172+ output_amount,
173+ destination_chain_id,
174+ exclusive_relayer,
175+ quote_timestamp,
176+ fill_deadline,
177+ exclusivity_parameter,
178+ message : & message,
179+ } ) ,
180+ ) ;
162181 _deposit (
163182 ctx,
164183 depositor,
@@ -174,6 +193,7 @@ pub fn deposit(
174193 fill_deadline,
175194 exclusivity_parameter,
176195 message,
196+ seed_hash,
177197 ) ?;
178198
179199 Ok ( ( ) )
@@ -195,7 +215,22 @@ pub fn deposit_now(
195215) -> Result < ( ) > {
196216 let state = & mut ctx. accounts . state ;
197217 let current_time = get_current_time ( state) ?;
198- deposit (
218+ let seed_hash = derive_seed_hash (
219+ & ( DepositNowSeedData {
220+ depositor,
221+ recipient,
222+ input_token,
223+ output_token,
224+ input_amount,
225+ output_amount,
226+ destination_chain_id,
227+ exclusive_relayer,
228+ fill_deadline_offset,
229+ exclusivity_period,
230+ message : & message,
231+ } ) ,
232+ ) ;
233+ _deposit (
199234 ctx,
200235 depositor,
201236 recipient,
@@ -205,10 +240,12 @@ pub fn deposit_now(
205240 output_amount,
206241 destination_chain_id,
207242 exclusive_relayer,
243+ ZERO_DEPOSIT_ID , // ZERO_DEPOSIT_ID informs internal function to use state.number_of_deposits as id.
208244 current_time,
209245 current_time + fill_deadline_offset,
210246 exclusivity_period,
211247 message,
248+ seed_hash,
212249 ) ?;
213250
214251 Ok ( ( ) )
@@ -232,6 +269,22 @@ pub fn unsafe_deposit(
232269) -> Result < ( ) > {
233270 // Calculate the unsafe deposit ID as a [u8; 32]
234271 let deposit_id = get_unsafe_deposit_id ( ctx. accounts . signer . key ( ) , depositor, deposit_nonce) ;
272+ let seed_hash = derive_seed_hash (
273+ & ( DepositSeedData {
274+ depositor,
275+ recipient,
276+ input_token,
277+ output_token,
278+ input_amount,
279+ output_amount,
280+ destination_chain_id,
281+ exclusive_relayer,
282+ quote_timestamp,
283+ fill_deadline,
284+ exclusivity_parameter,
285+ message : & message,
286+ } ) ,
287+ ) ;
235288 _deposit (
236289 ctx,
237290 depositor,
@@ -247,6 +300,7 @@ pub fn unsafe_deposit(
247300 fill_deadline,
248301 exclusivity_parameter,
249302 message,
303+ seed_hash,
250304 ) ?;
251305
252306 Ok ( ( ) )
0 commit comments