Skip to content

Commit 94c9692

Browse files
md0xReinis-FRPchrismaree
authored
Solana march audit 2 (#995)
* feat(svm): remove enabled deposit route check (#939) * feat(svm): remove enabled deposit route check Signed-off-by: Reinis Martinsons <reinis@umaproject.org> * fix: remove create_vault ix Signed-off-by: Reinis Martinsons <reinis@umaproject.org> * Update scripts/svm/simpleDeposit.ts Co-authored-by: Chris Maree <christopher.maree@gmail.com> * fix: update comment Signed-off-by: Reinis Martinsons <reinis@umaproject.org> --------- Signed-off-by: Reinis Martinsons <reinis@umaproject.org> Co-authored-by: Chris Maree <christopher.maree@gmail.com> * feat(svm): test native sol deposits (#942) * feat(svm): test native sol deposits Signed-off-by: Reinis Martinsons <reinis@umaproject.org> * fix: merge issues Signed-off-by: Reinis Martinsons <reinis@umaproject.org> --------- Signed-off-by: Reinis Martinsons <reinis@umaproject.org> * fix(svm): pin rust toolchain for solana (#960) (#961) * fix(svm): pin rust toolchain for solana * fix: add local toolchain * fix: add rustfmt to nightly * fix: pin nightly in lint scripts --------- Signed-off-by: Reinis Martinsons <reinis@umaproject.org> * fix(svm): M-01 Deposit Tokens Transferred from Depositor Token Account Instead of Signer (#971) * fix(svm): M-01 Deposit Tokens Transfers Signed-off-by: Pablo Maldonado <pablo@umaproject.org> * feat: use unchecked account Signed-off-by: Pablo Maldonado <pablo@umaproject.org> * feat: remove system acc Signed-off-by: Pablo Maldonado <pablo@umaproject.org> * fix: deposit tests Signed-off-by: Pablo Maldonado <pablo@umaproject.org> * fix: fill tests Signed-off-by: Pablo Maldonado <pablo@umaproject.org> * refactor: rename and comments Signed-off-by: Pablo Maldonado <pablo@umaproject.org> * fix: across plus Signed-off-by: Pablo Maldonado <pablo@umaproject.org> * fix(svm): pin rust toolchain for solana (#960) * fix(svm): pin rust toolchain for solana Signed-off-by: Reinis Martinsons <reinis@umaproject.org> * fix: add local toolchain Signed-off-by: Reinis Martinsons <reinis@umaproject.org> * fix: add rustfmt to nightly Signed-off-by: Reinis Martinsons <reinis@umaproject.org> * fix: pin nightly in lint scripts Signed-off-by: Reinis Martinsons <reinis@umaproject.org> --------- Signed-off-by: Reinis Martinsons <reinis@umaproject.org> * refactor: rename and organize function Signed-off-by: Pablo Maldonado <pablo@umaproject.org> * feat: update deposit delegate seed Signed-off-by: Pablo Maldonado <pablo@umaproject.org> * feat: use relay_hash from function arguments Signed-off-by: Pablo Maldonado <pablo@umaproject.org> * fix: heap memory error Signed-off-by: Pablo Maldonado <pablo@umaproject.org> * fix Signed-off-by: Pablo Maldonado <pablo@umaproject.org> * refactor: cleanup Signed-off-by: Pablo Maldonado <pablo@umaproject.org> * fix: deposit checks Signed-off-by: Pablo Maldonado <pablo@umaproject.org> * fix: fill tests Signed-off-by: Pablo Maldonado <pablo@umaproject.org> * fix: fill relay delagate Signed-off-by: Pablo Maldonado <pablo@umaproject.org> * fix: fill Signed-off-by: Pablo Maldonado <pablomaldonadoturci@gmail.com> * refactor: simplify Signed-off-by: Pablo Maldonado <pablomaldonadoturci@gmail.com> * refactor: cleanup Signed-off-by: Pablo Maldonado <pablomaldonadoturci@gmail.com> * test: update fill tests Signed-off-by: Pablo Maldonado <pablomaldonadoturci@gmail.com> * refactor: comments Signed-off-by: Pablo Maldonado <pablomaldonadoturci@gmail.com> * fix: scripts Signed-off-by: Pablo Maldonado <pablomaldonadoturci@gmail.com> * refactor: make seed structs private Signed-off-by: Pablo Maldonado <pablomaldonadoturci@gmail.com> * feat: add missing params to deposit hashes Signed-off-by: Pablo Maldonado <pablomaldonadoturci@gmail.com> * refactor: simplify Signed-off-by: Pablo Maldonado <pablomaldonadoturci@gmail.com> * refactor: delegate utils Signed-off-by: Pablo Maldonado <pablomaldonadoturci@gmail.com> * refactor: anchor serialize Signed-off-by: Pablo Maldonado <pablomaldonadoturci@gmail.com> * refactor: reuse helper deriveSeedHash Signed-off-by: Pablo Maldonado <pablomaldonadoturci@gmail.com> * fix: move paused fills check in handler Signed-off-by: Reinis Martinsons <reinis@umaproject.org> * feat: improvements Signed-off-by: Pablo Maldonado <pablomaldonadoturci@gmail.com> * fix: remove program_id from transfer_from params Signed-off-by: Reinis Martinsons <reinis@umaproject.org> * fix: fill import Signed-off-by: Pablo Maldonado <pablomaldonadoturci@gmail.com> * fix: tests Signed-off-by: Pablo Maldonado <pablomaldonadoturci@gmail.com> --------- Signed-off-by: Pablo Maldonado <pablo@umaproject.org> Signed-off-by: Reinis Martinsons <reinis@umaproject.org> Signed-off-by: Pablo Maldonado <pablomaldonadoturci@gmail.com> Co-authored-by: Reinis Martinsons <77973553+Reinis-FRP@users.noreply.github.com> Co-authored-by: Reinis Martinsons <reinis@umaproject.org> * fix(svm): N-01 remove v3 from remaining functions and comments (#964) Signed-off-by: Reinis Martinsons <reinis@umaproject.org> * fix(svm): L-01 create new vault on deposit if needed (#957) * fix(svm): L-01 create new vault on deposit if needed Signed-off-by: Reinis Martinsons <reinis@umaproject.org> * fix: use stable toolchain in ci Signed-off-by: Reinis Martinsons <reinis@umaproject.org> * fix(svm): pin rust toolchain for solana (#960) * fix(svm): pin rust toolchain for solana Signed-off-by: Reinis Martinsons <reinis@umaproject.org> * fix: add local toolchain Signed-off-by: Reinis Martinsons <reinis@umaproject.org> * fix: add rustfmt to nightly Signed-off-by: Reinis Martinsons <reinis@umaproject.org> * fix: pin nightly in lint scripts Signed-off-by: Reinis Martinsons <reinis@umaproject.org> --------- Signed-off-by: Reinis Martinsons <reinis@umaproject.org> --------- Signed-off-by: Reinis Martinsons <reinis@umaproject.org> * fix(svm): N-02 clarify documentation (#963) Signed-off-by: Reinis Martinsons <reinis@umaproject.org> * fix(svm): N-03 use consistent variable names in the instruction constraint (#962) * fix(svm): pin rust toolchain for solana (#960) * fix(svm): pin rust toolchain for solana Signed-off-by: Reinis Martinsons <reinis@umaproject.org> * fix: add local toolchain Signed-off-by: Reinis Martinsons <reinis@umaproject.org> * fix: add rustfmt to nightly Signed-off-by: Reinis Martinsons <reinis@umaproject.org> * fix: pin nightly in lint scripts Signed-off-by: Reinis Martinsons <reinis@umaproject.org> --------- Signed-off-by: Reinis Martinsons <reinis@umaproject.org> * fix(svm): N-03 use consistent variable names in the instruction constraint Signed-off-by: Reinis Martinsons <reinis@umaproject.org> * fix: restore relay_hash naming in FillRelay context Signed-off-by: Reinis Martinsons <reinis@umaproject.org> --------- Signed-off-by: Reinis Martinsons <reinis@umaproject.org> * feat: update toolchain Signed-off-by: Pablo Maldonado <pablomaldonadoturci@gmail.com> * feat: update toolchain bis Signed-off-by: Pablo Maldonado <pablomaldonadoturci@gmail.com> * fix: delete old scripts Signed-off-by: Pablo Maldonado <pablomaldonadoturci@gmail.com> * fix: across plus codama test Signed-off-by: Pablo Maldonado <pablomaldonadoturci@gmail.com> * fix: fill test codama Signed-off-by: Pablo Maldonado <pablomaldonadoturci@gmail.com> * feat: bump version Signed-off-by: Pablo Maldonado <pablomaldonadoturci@gmail.com> * fix: bump version Signed-off-by: Reinis Martinsons <reinis@umaproject.org> --------- Signed-off-by: Reinis Martinsons <reinis@umaproject.org> Signed-off-by: Pablo Maldonado <pablo@umaproject.org> Signed-off-by: Pablo Maldonado <pablomaldonadoturci@gmail.com> Co-authored-by: Reinis Martinsons <77973553+Reinis-FRP@users.noreply.github.com> Co-authored-by: Chris Maree <christopher.maree@gmail.com> Co-authored-by: Reinis Martinsons <reinis@umaproject.org>
1 parent c88ac8a commit 94c9692

36 files changed

+1192
-1262
lines changed

Anchor.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ queryEvents = "NODE_NO_WARNINGS=1 yarn run ts-node ./scripts/svm/queryEvents.ts"
3030
queryEventsV2 = "NODE_NO_WARNINGS=1 yarn run ts-node ./scripts/svm/queryEventsV2.ts"
3131
initialize = "NODE_NO_WARNINGS=1 yarn run ts-node ./scripts/svm/initialize.ts"
3232
queryState = "NODE_NO_WARNINGS=1 yarn run ts-node ./scripts/svm/queryState.ts"
33-
enableRoute = "NODE_NO_WARNINGS=1 yarn run ts-node ./scripts/svm/enableRoute.ts"
34-
queryRoute = "NODE_NO_WARNINGS=1 yarn run ts-node ./scripts/svm/queryRoute.ts"
33+
createVault = "NODE_NO_WARNINGS=1 yarn run ts-node ./scripts/svm/createVault.ts"
34+
queryVault = "NODE_NO_WARNINGS=1 yarn run ts-node ./scripts/svm/queryVault.ts"
3535
simpleDeposit = "NODE_NO_WARNINGS=1 yarn run ts-node ./scripts/svm/simpleDeposit.ts"
3636
queryDeposits = "NODE_NO_WARNINGS=1 yarn run ts-node ./scripts/svm/queryDeposits.ts"
3737
queryFills = "NODE_NO_WARNINGS=1 yarn run ts-node ./scripts/svm/queryFills.ts"
@@ -53,6 +53,7 @@ addressToPublicKey = "NODE_NO_WARNINGS=1 yarn run ts-node ./scripts/svm/addressT
5353
publicKeyToAddress = "NODE_NO_WARNINGS=1 yarn run ts-node ./scripts/svm/publicKeyToAddress.ts"
5454
findFillStatusPdaFromEvent = "NODE_NO_WARNINGS=1 yarn run ts-node ./scripts/svm/findFillStatusPdaFromEvent.ts"
5555
findFillStatusFromFillStatusPda = "NODE_NO_WARNINGS=1 yarn run ts-node ./scripts/svm/findFillStatusFromFillStatusPda.ts"
56+
nativeDeposit = "NODE_NO_WARNINGS=1 yarn run ts-node ./scripts/svm/nativeDeposit.ts"
5657

5758
[test.validator]
5859
url = "https://api.mainnet-beta.solana.com"

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@across-protocol/contracts",
3-
"version": "4.0.11",
3+
"version": "4.0.12",
44
"author": "UMA Team",
55
"license": "AGPL-3.0-only",
66
"repository": {

programs/svm-spoke/src/error.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,9 @@ use anchor_lang::prelude::*;
33
// Common Errors with EVM SpokePool.
44
#[error_code]
55
pub enum CommonError {
6-
#[msg("The route is not enabled!")]
7-
DisabledRoute,
86
#[msg("Invalid quote timestamp!")]
97
InvalidQuoteTimestamp,
10-
#[msg("Ivalid fill deadline!")]
8+
#[msg("Invalid fill deadline!")]
119
InvalidFillDeadline,
1210
#[msg("Caller is not the exclusive relayer and exclusivity deadline has not passed!")]
1311
NotExclusiveRelayer,
@@ -74,6 +72,8 @@ pub enum SvmError {
7472
InvalidProductionSeed,
7573
#[msg("Invalid remaining accounts for ATA creation!")]
7674
InvalidATACreationAccounts,
75+
#[msg("Invalid delegate PDA!")]
76+
InvalidDelegatePda,
7777
}
7878

7979
// CCTP specific errors.

programs/svm-spoke/src/event.rs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,6 @@ pub struct PausedFills {
2121
pub is_paused: bool,
2222
}
2323

24-
#[event]
25-
pub struct EnabledDepositRoute {
26-
pub origin_token: Pubkey,
27-
pub destination_chain_id: u64,
28-
pub enabled: bool,
29-
}
30-
3124
#[event]
3225
pub struct RelayedRootBundle {
3326
pub root_bundle_id: u32,

programs/svm-spoke/src/instructions/admin.rs

Lines changed: 3 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
11
use anchor_lang::prelude::*;
2-
use anchor_spl::{
3-
associated_token::AssociatedToken,
4-
token_interface::{Mint, TokenAccount, TokenInterface},
5-
};
62

73
use crate::{
84
constants::DISCRIMINATOR_SIZE,
95
constraints::is_local_or_remote_owner,
106
error::SvmError,
117
event::{
12-
EmergencyDeletedRootBundle, EnabledDepositRoute, PausedDeposits, PausedFills, RelayedRootBundle,
13-
SetXDomainAdmin, TransferredOwnership,
8+
EmergencyDeletedRootBundle, PausedDeposits, PausedFills, RelayedRootBundle, SetXDomainAdmin,
9+
TransferredOwnership,
1410
},
15-
state::{RootBundle, Route, State},
11+
state::{RootBundle, State},
1612
utils::{initialize_current_time, set_seed},
1713
};
1814

@@ -136,67 +132,6 @@ pub fn set_cross_domain_admin(ctx: Context<SetCrossDomainAdmin>, cross_domain_ad
136132
Ok(())
137133
}
138134

139-
#[event_cpi]
140-
#[derive(Accounts)]
141-
#[instruction(origin_token: Pubkey, destination_chain_id: u64)]
142-
pub struct SetEnableRoute<'info> {
143-
#[account(constraint = is_local_or_remote_owner(&signer, &state) @ SvmError::NotOwner)]
144-
pub signer: Signer<'info>,
145-
146-
#[account(mut)]
147-
pub payer: Signer<'info>,
148-
149-
#[account(seeds = [b"state", state.seed.to_le_bytes().as_ref()], bump)]
150-
pub state: Account<'info, State>,
151-
152-
#[account(
153-
init_if_needed,
154-
payer = payer,
155-
space = DISCRIMINATOR_SIZE + Route::INIT_SPACE,
156-
seeds = [
157-
b"route",
158-
origin_token.as_ref(),
159-
state.seed.to_le_bytes().as_ref(),
160-
destination_chain_id.to_le_bytes().as_ref(),
161-
],
162-
bump
163-
)]
164-
pub route: Account<'info, Route>, // PDA to store route information for this particular token & chainId pair.
165-
166-
#[account(
167-
init_if_needed,
168-
payer = payer,
169-
associated_token::mint = origin_token_mint,
170-
associated_token::authority = state,
171-
associated_token::token_program = token_program
172-
)]
173-
pub vault: InterfaceAccount<'info, TokenAccount>, // ATA, owned by the state, to store the origin token for spoke.
174-
175-
#[account(
176-
mint::token_program = token_program,
177-
// IDL build fails when requiring address = origin_token for mint, thus using a custom constraint.
178-
constraint = origin_token_mint.key() == origin_token @ SvmError::InvalidMint
179-
)]
180-
pub origin_token_mint: InterfaceAccount<'info, Mint>,
181-
182-
pub token_program: Interface<'info, TokenInterface>,
183-
pub associated_token_program: Program<'info, AssociatedToken>,
184-
pub system_program: Program<'info, System>,
185-
}
186-
187-
pub fn set_enable_route(
188-
ctx: Context<SetEnableRoute>,
189-
origin_token: Pubkey,
190-
destination_chain_id: u64,
191-
enabled: bool,
192-
) -> Result<()> {
193-
ctx.accounts.route.enabled = enabled;
194-
195-
emit_cpi!(EnabledDepositRoute { origin_token, destination_chain_id, enabled });
196-
197-
Ok(())
198-
}
199-
200135
#[event_cpi]
201136
#[derive(Accounts)]
202137
pub struct RelayRootBundle<'info> {

programs/svm-spoke/src/instructions/deposit.rs

Lines changed: 75 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
1-
// Note: The `svm-spoke` does not support `speedUpV3Deposit` and `fillV3RelayWithUpdatedDeposit` due to cryptographic
1+
// Note: The `svm-spoke` does not support `speedUpDeposit` and `fillRelayWithUpdatedDeposit` due to cryptographic
22
// incompatibilities between Solana (Ed25519) and Ethereum (ECDSA secp256k1). Specifically, Solana wallets cannot
33
// generate ECDSA signatures required for Ethereum verification. As a result, speed-up functionality on Solana is not
44
// implemented. For more details, refer to the documentation: https://docs.across.to
55

66
use anchor_lang::prelude::*;
7-
use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface};
7+
use anchor_spl::{
8+
associated_token::AssociatedToken,
9+
token_interface::{Mint, TokenAccount, TokenInterface},
10+
};
811

912
use crate::{
1013
constants::{MAX_EXCLUSIVITY_PERIOD_SECONDS, ZERO_DEPOSIT_ID},
1114
error::{CommonError, SvmError},
1215
event::FundsDeposited,
13-
state::{Route, State},
14-
utils::{get_current_time, get_unsafe_deposit_id, transfer_from},
16+
state::State,
17+
utils::{
18+
derive_seed_hash, get_current_time, get_unsafe_deposit_id, transfer_from, DepositNowSeedData, DepositSeedData,
19+
},
1520
};
1621

1722
#[event_cpi]
@@ -23,11 +28,12 @@ use crate::{
2328
output_token: Pubkey,
2429
input_amount: u64,
2530
output_amount: u64,
26-
destination_chain_id: u64,
31+
destination_chain_id: u64
2732
)]
2833
pub struct Deposit<'info> {
2934
#[account(mut)]
3035
pub signer: Signer<'info>,
36+
3137
#[account(
3238
mut,
3339
seeds = [b"state", state.seed.to_le_bytes().as_ref()],
@@ -36,12 +42,8 @@ pub struct Deposit<'info> {
3642
)]
3743
pub state: Account<'info, State>,
3844

39-
#[account(
40-
seeds = [b"route", input_token.as_ref(), state.seed.to_le_bytes().as_ref(), destination_chain_id.to_le_bytes().as_ref()],
41-
bump,
42-
constraint = route.enabled @ CommonError::DisabledRoute
43-
)]
44-
pub route: Account<'info, Route>,
45+
/// CHECK: PDA derived with seeds ["delegate", seed_hash]; used as a CPI signer.
46+
pub delegate: UncheckedAccount<'info>,
4547

4648
#[account(
4749
mut,
@@ -52,7 +54,8 @@ pub struct Deposit<'info> {
5254
pub depositor_token_account: InterfaceAccount<'info, TokenAccount>,
5355

5456
#[account(
55-
mut,
57+
init_if_needed,
58+
payer = signer,
5659
associated_token::mint = mint,
5760
associated_token::authority = state, // Ensure owner is the state as tokens are sent here on deposit.
5861
associated_token::token_program = token_program
@@ -66,6 +69,10 @@ pub struct Deposit<'info> {
6669
pub mint: InterfaceAccount<'info, Mint>,
6770

6871
pub token_program: Interface<'info, TokenInterface>,
72+
73+
pub associated_token_program: Program<'info, AssociatedToken>,
74+
75+
pub system_program: Program<'info, System>,
6976
}
7077

7178
pub fn _deposit(
@@ -83,15 +90,14 @@ pub fn _deposit(
8390
fill_deadline: u32,
8491
exclusivity_parameter: u32,
8592
message: Vec<u8>,
93+
delegate_seed_hash: [u8; 32],
8694
) -> Result<()> {
8795
let state = &mut ctx.accounts.state;
88-
8996
let current_time = get_current_time(state)?;
9097

9198
if current_time.checked_sub(quote_timestamp).unwrap_or(u32::MAX) > state.deposit_quote_time_buffer {
9299
return err!(CommonError::InvalidQuoteTimestamp);
93100
}
94-
95101
if fill_deadline > current_time + state.fill_deadline_buffer {
96102
return err!(CommonError::InvalidFillDeadline);
97103
}
@@ -101,21 +107,20 @@ pub fn _deposit(
101107
if exclusivity_deadline <= MAX_EXCLUSIVITY_PERIOD_SECONDS {
102108
exclusivity_deadline += current_time;
103109
}
104-
105110
if exclusive_relayer == Pubkey::default() {
106111
return err!(CommonError::InvalidExclusiveRelayer);
107112
}
108113
}
109114

110-
// Depositor must have delegated input_amount to the state PDA.
115+
// Depositor must have delegated input_amount to the delegate PDA
111116
transfer_from(
112117
&ctx.accounts.depositor_token_account,
113118
&ctx.accounts.vault,
114119
input_amount,
115-
state,
116-
ctx.bumps.state,
120+
&ctx.accounts.delegate,
117121
&ctx.accounts.mint,
118122
&ctx.accounts.token_program,
123+
delegate_seed_hash,
119124
)?;
120125

121126
let mut applied_deposit_id = deposit_id;
@@ -159,6 +164,22 @@ pub fn deposit(
159164
exclusivity_parameter: u32,
160165
message: Vec<u8>,
161166
) -> Result<()> {
167+
let seed_hash = derive_seed_hash(
168+
&(DepositSeedData {
169+
depositor,
170+
recipient,
171+
input_token,
172+
output_token,
173+
input_amount,
174+
output_amount,
175+
destination_chain_id,
176+
exclusive_relayer,
177+
quote_timestamp,
178+
fill_deadline,
179+
exclusivity_parameter,
180+
message: &message,
181+
}),
182+
);
162183
_deposit(
163184
ctx,
164185
depositor,
@@ -174,6 +195,7 @@ pub fn deposit(
174195
fill_deadline,
175196
exclusivity_parameter,
176197
message,
198+
seed_hash,
177199
)?;
178200

179201
Ok(())
@@ -195,7 +217,22 @@ pub fn deposit_now(
195217
) -> Result<()> {
196218
let state = &mut ctx.accounts.state;
197219
let current_time = get_current_time(state)?;
198-
deposit(
220+
let seed_hash = derive_seed_hash(
221+
&(DepositNowSeedData {
222+
depositor,
223+
recipient,
224+
input_token,
225+
output_token,
226+
input_amount,
227+
output_amount,
228+
destination_chain_id,
229+
exclusive_relayer,
230+
fill_deadline_offset,
231+
exclusivity_period,
232+
message: &message,
233+
}),
234+
);
235+
_deposit(
199236
ctx,
200237
depositor,
201238
recipient,
@@ -205,10 +242,12 @@ pub fn deposit_now(
205242
output_amount,
206243
destination_chain_id,
207244
exclusive_relayer,
245+
ZERO_DEPOSIT_ID, // ZERO_DEPOSIT_ID informs internal function to use state.number_of_deposits as id.
208246
current_time,
209247
current_time + fill_deadline_offset,
210248
exclusivity_period,
211249
message,
250+
seed_hash,
212251
)?;
213252

214253
Ok(())
@@ -232,6 +271,22 @@ pub fn unsafe_deposit(
232271
) -> Result<()> {
233272
// Calculate the unsafe deposit ID as a [u8; 32]
234273
let deposit_id = get_unsafe_deposit_id(ctx.accounts.signer.key(), depositor, deposit_nonce);
274+
let seed_hash = derive_seed_hash(
275+
&(DepositSeedData {
276+
depositor,
277+
recipient,
278+
input_token,
279+
output_token,
280+
input_amount,
281+
output_amount,
282+
destination_chain_id,
283+
exclusive_relayer,
284+
quote_timestamp,
285+
fill_deadline,
286+
exclusivity_parameter,
287+
message: &message,
288+
}),
289+
);
235290
_deposit(
236291
ctx,
237292
depositor,
@@ -247,6 +302,7 @@ pub fn unsafe_deposit(
247302
fill_deadline,
248303
exclusivity_parameter,
249304
message,
305+
seed_hash,
250306
)?;
251307

252308
Ok(())

0 commit comments

Comments
 (0)