Skip to content

Commit 065f88b

Browse files
committed
fix(chain-1977): add zero-value checks for denominator values
1 parent d98b00e commit 065f88b

5 files changed

Lines changed: 53 additions & 13 deletions

File tree

solana/programs/bridge/src/common/instructions/config/eip1559.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ pub fn set_minimum_base_fee_handler(ctx: Context<SetBridgeConfig>, new_fee: u64)
1111
/// Set the window duration parameter
1212
pub fn set_window_duration_handler(ctx: Context<SetBridgeConfig>, new_duration: u64) -> Result<()> {
1313
ctx.accounts.bridge.eip1559.config.window_duration_seconds = new_duration;
14+
ctx.accounts.bridge.eip1559.config.validate()?;
1415
Ok(())
1516
}
1617

1718
/// Set the gas target parameter
1819
pub fn set_gas_target_handler(ctx: Context<SetBridgeConfig>, new_target: u64) -> Result<()> {
1920
ctx.accounts.bridge.eip1559.config.target = new_target;
20-
2121
Ok(())
2222
}
2323

@@ -27,5 +27,6 @@ pub fn set_adjustment_denominator_handler(
2727
new_denominator: u64,
2828
) -> Result<()> {
2929
ctx.accounts.bridge.eip1559.config.denominator = new_denominator;
30+
ctx.accounts.bridge.eip1559.config.validate()?;
3031
Ok(())
3132
}

solana/programs/bridge/src/common/instructions/config/gas.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ pub fn set_gas_cost_scaler_handler(ctx: Context<SetBridgeConfig>, new_scaler: u6
1111
/// Set the gas cost scaler decimal precision
1212
pub fn set_gas_cost_scaler_dp_handler(ctx: Context<SetBridgeConfig>, new_dp: u64) -> Result<()> {
1313
ctx.accounts.bridge.gas_config.gas_cost_scaler_dp = new_dp;
14+
ctx.accounts.bridge.gas_config.validate()?;
1415
Ok(())
1516
}
1617

solana/programs/bridge/src/common/instructions/config/protocol.rs

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,12 @@ pub fn set_block_interval_requirement_handler(
77
ctx: Context<SetBridgeConfig>,
88
new_interval: u64,
99
) -> Result<()> {
10-
require!(
11-
new_interval <= 1000,
12-
SetBlockIntervalRequirementError::NewIntervalTooHigh
13-
);
14-
1510
ctx.accounts
1611
.bridge
1712
.protocol_config
1813
.block_interval_requirement = new_interval;
1914

20-
Ok(())
21-
}
15+
ctx.accounts.bridge.protocol_config.validate()?;
2216

23-
#[error_code]
24-
pub enum SetBlockIntervalRequirementError {
25-
#[msg("New interval too high")]
26-
NewIntervalTooHigh,
17+
Ok(())
2718
}

solana/programs/bridge/src/common/internal/init_config.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,11 @@ pub struct Config {
2222

2323
impl Config {
2424
pub fn validate(&self) -> Result<()> {
25-
self.base_oracle_config.validate()?;
25+
self.eip1559_config.validate()?;
26+
self.gas_config.validate()?;
27+
self.protocol_config.validate()?;
2628
self.partner_oracle_config.validate()?;
29+
self.base_oracle_config.validate()?;
2730
Ok(())
2831
}
2932
}

solana/programs/bridge/src/common/state/bridge.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,17 @@ pub struct Eip1559Config {
5757
pub minimum_base_fee: u64,
5858
}
5959

60+
impl Eip1559Config {
61+
pub fn validate(&self) -> Result<()> {
62+
require!(self.denominator > 0, BridgeError::InvalidDenominator);
63+
require!(
64+
self.window_duration_seconds > 0,
65+
BridgeError::InvalidWindowDurationSeconds
66+
);
67+
Ok(())
68+
}
69+
}
70+
6071
impl Eip1559 {
6172
/// Refresh the base fee if window has expired, reset window tracking
6273
/// Handles multiple expired windows by processing each empty window
@@ -159,13 +170,38 @@ pub struct GasConfig {
159170
pub gas_per_call: u64,
160171
}
161172

173+
impl GasConfig {
174+
pub fn validate(&self) -> Result<()> {
175+
require!(
176+
self.gas_cost_scaler_dp > 0,
177+
BridgeError::InvalidGasCostScalerDp
178+
);
179+
Ok(())
180+
}
181+
}
182+
162183
#[derive(Debug, Clone, PartialEq, Eq, InitSpace, AnchorSerialize, AnchorDeserialize)]
163184
pub struct ProtocolConfig {
164185
/// Block interval requirement for output root registration. Every Base block associated with a
165186
/// submitted output root must be a multiple of this number.
166187
pub block_interval_requirement: u64,
167188
}
168189

190+
impl ProtocolConfig {
191+
pub fn validate(&self) -> Result<()> {
192+
require!(
193+
self.block_interval_requirement > 0,
194+
BridgeError::InvalidBlockIntervalRequirement
195+
);
196+
197+
require!(
198+
self.block_interval_requirement <= 1000,
199+
BridgeError::InvalidBlockIntervalRequirement
200+
);
201+
Ok(())
202+
}
203+
}
204+
169205
#[derive(Debug, Clone, PartialEq, Eq, InitSpace, AnchorSerialize, AnchorDeserialize)]
170206
pub struct BufferConfig {
171207
/// Maximum call buffer size. This caps the max size of a Solana → Base message.
@@ -247,6 +283,14 @@ pub enum BridgeError {
247283
DuplicateSigner,
248284
#[msg("Invalid partner threshold")]
249285
InvalidPartnerThreshold,
286+
#[msg("Invalid denominator")]
287+
InvalidDenominator,
288+
#[msg("Invalid window duration seconds")]
289+
InvalidWindowDurationSeconds,
290+
#[msg("Invalid gas cost scaler dp")]
291+
InvalidGasCostScalerDp,
292+
#[msg("Invalid block interval requirement")]
293+
InvalidBlockIntervalRequirement,
250294
}
251295

252296
#[cfg(test)]

0 commit comments

Comments
 (0)