Skip to content

Commit b303f3e

Browse files
core: reduce mutable config params (#107)
## Description This PR reduced mutable config params. `bsn_activation_height` and `finality_signature_interval` should not be mutable Fixes #106 ## Checklist - [x] I have updated the [docs/SPEC.md](https://github.com/babylonlabs-io/rollup-bsn-contracts/blob/main/docs/SPEC.md) file if this change affects the specification - [x] I have updated the schema by running `cargo gen-schema`
1 parent 2ede478 commit b303f3e

File tree

8 files changed

+29
-105
lines changed

8 files changed

+29
-105
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
4848

4949
### Improvements
5050

51+
* [#107](https://github.com/babylonlabs-io/rollup-bsn-contracts/pull/107) core:
52+
reduce mutable config params
5153
* [#108](https://github.com/babylonlabs-io/rollup-bsn-contracts/pull/91) feat:
5254
optimize public key handling by using bytes instead of hex
5355
* [#103](https://github.com/babylonlabs-io/rollup-bsn-contracts/pull/103) core:

contracts/finality/schema/finality.json

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -336,24 +336,6 @@
336336
"update_config": {
337337
"type": "object",
338338
"properties": {
339-
"bsn_activation_height": {
340-
"description": "New BSN activation height (if provided)",
341-
"type": [
342-
"integer",
343-
"null"
344-
],
345-
"format": "uint64",
346-
"minimum": 0.0
347-
},
348-
"finality_signature_interval": {
349-
"description": "New finality signature interval (if provided)",
350-
"type": [
351-
"integer",
352-
"null"
353-
],
354-
"format": "uint64",
355-
"minimum": 0.0
356-
},
357339
"max_msgs_per_interval": {
358340
"description": "New maximum messages per finality provider per interval (if provided)",
359341
"type": [

contracts/finality/schema/raw/execute.json

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -266,24 +266,6 @@
266266
"update_config": {
267267
"type": "object",
268268
"properties": {
269-
"bsn_activation_height": {
270-
"description": "New BSN activation height (if provided)",
271-
"type": [
272-
"integer",
273-
"null"
274-
],
275-
"format": "uint64",
276-
"minimum": 0.0
277-
},
278-
"finality_signature_interval": {
279-
"description": "New finality signature interval (if provided)",
280-
"type": [
281-
"integer",
282-
"null"
283-
],
284-
"format": "uint64",
285-
"minimum": 0.0
286-
},
287269
"max_msgs_per_interval": {
288270
"description": "New maximum messages per finality provider per interval (if provided)",
289271
"type": [

contracts/finality/src/contract.rs

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -190,16 +190,12 @@ pub fn execute(
190190
min_pub_rand,
191191
max_msgs_per_interval,
192192
rate_limiting_interval,
193-
bsn_activation_height,
194-
finality_signature_interval,
195193
} => handle_update_config(
196194
deps,
197195
info,
198196
min_pub_rand,
199197
max_msgs_per_interval,
200198
rate_limiting_interval,
201-
bsn_activation_height,
202-
finality_signature_interval,
203199
),
204200
}
205201
}
@@ -1099,8 +1095,6 @@ pub(crate) mod tests {
10991095
min_pub_rand: Some(200),
11001096
max_msgs_per_interval: None,
11011097
rate_limiting_interval: None,
1102-
bsn_activation_height: None,
1103-
finality_signature_interval: None,
11041098
};
11051099
let admin_info = message_info(&admin, &[]);
11061100
let res = execute(deps.as_mut(), mock_env(), admin_info.clone(), update_msg).unwrap();
@@ -1114,19 +1108,12 @@ pub(crate) mod tests {
11141108
let config: Config = from_json(config_query).unwrap();
11151109
assert_eq!(config.bsn_id, bsn_id); // unchanged
11161110
assert_eq!(config.min_pub_rand, 200); // updated
1117-
assert_eq!(config.bsn_activation_height, bsn_activation_height); // unchanged
1118-
assert_eq!(
1119-
config.finality_signature_interval,
1120-
finality_signature_interval
1121-
); // unchanged
11221111

11231112
// Test 2: Update multiple fields at once
11241113
let update_msg = ExecuteMsg::UpdateConfig {
11251114
min_pub_rand: Some(300),
11261115
max_msgs_per_interval: Some(150),
11271116
rate_limiting_interval: Some(15000),
1128-
bsn_activation_height: Some(2000),
1129-
finality_signature_interval: Some(200),
11301117
};
11311118
let res = execute(deps.as_mut(), mock_env(), admin_info.clone(), update_msg).unwrap();
11321119

@@ -1141,17 +1128,13 @@ pub(crate) mod tests {
11411128
assert_eq!(config.min_pub_rand, 300);
11421129
assert_eq!(config.rate_limiting.max_msgs_per_interval, 150);
11431130
assert_eq!(config.rate_limiting.block_interval, 15000);
1144-
assert_eq!(config.bsn_activation_height, 2000);
1145-
assert_eq!(config.finality_signature_interval, 200);
11461131

11471132
// Test 3: Non-admin cannot update config
11481133
let non_admin_info = message_info(&non_admin, &[]);
11491134
let update_msg = ExecuteMsg::UpdateConfig {
11501135
min_pub_rand: Some(999),
11511136
max_msgs_per_interval: None,
11521137
rate_limiting_interval: None,
1153-
bsn_activation_height: None,
1154-
finality_signature_interval: None,
11551138
};
11561139
let err = execute(deps.as_mut(), mock_env(), non_admin_info, update_msg).unwrap_err();
11571140
assert_eq!(err, ContractError::Admin(AdminError::NotAdmin {}));
@@ -1161,8 +1144,6 @@ pub(crate) mod tests {
11611144
min_pub_rand: None,
11621145
max_msgs_per_interval: None,
11631146
rate_limiting_interval: None,
1164-
bsn_activation_height: None,
1165-
finality_signature_interval: None,
11661147
};
11671148
let err = execute(deps.as_mut(), mock_env(), admin_info, empty_update_msg).unwrap_err();
11681149
assert_eq!(err, ContractError::NoConfigFieldsToUpdate);
@@ -1195,8 +1176,6 @@ pub(crate) mod tests {
11951176
min_pub_rand: Some(0), // invalid: must be > 0
11961177
max_msgs_per_interval: None,
11971178
rate_limiting_interval: None,
1198-
bsn_activation_height: None,
1199-
finality_signature_interval: None,
12001179
};
12011180
let err = execute(
12021181
deps.as_mut(),
@@ -1212,8 +1191,6 @@ pub(crate) mod tests {
12121191
min_pub_rand: None,
12131192
max_msgs_per_interval: Some(0), // invalid: must be > 0
12141193
rate_limiting_interval: None,
1215-
bsn_activation_height: None,
1216-
finality_signature_interval: None,
12171194
};
12181195
let err = execute(
12191196
deps.as_mut(),
@@ -1229,8 +1206,6 @@ pub(crate) mod tests {
12291206
min_pub_rand: None,
12301207
max_msgs_per_interval: None,
12311208
rate_limiting_interval: Some(0), // invalid: must be > 0
1232-
bsn_activation_height: None,
1233-
finality_signature_interval: None,
12341209
};
12351210
let err = execute(
12361211
deps.as_mut(),
@@ -1240,23 +1215,6 @@ pub(crate) mod tests {
12401215
)
12411216
.unwrap_err();
12421217
assert_eq!(err, ContractError::InvalidRateLimitingInterval(0));
1243-
1244-
// Test invalid finality_signature_interval
1245-
let invalid_finality_interval_update = ExecuteMsg::UpdateConfig {
1246-
min_pub_rand: None,
1247-
max_msgs_per_interval: None,
1248-
rate_limiting_interval: None,
1249-
bsn_activation_height: None,
1250-
finality_signature_interval: Some(0), // invalid: must be > 0
1251-
};
1252-
let err = execute(
1253-
deps.as_mut(),
1254-
mock_env(),
1255-
admin_info,
1256-
invalid_finality_interval_update,
1257-
)
1258-
.unwrap_err();
1259-
assert_eq!(err, ContractError::InvalidFinalitySignatureInterval(0));
12601218
}
12611219

12621220
#[test]

contracts/finality/src/exec/config.rs

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ use crate::error::ContractError;
44
use crate::msg::BabylonMsg;
55
use crate::state::config::{get_config, set_config, ADMIN};
66
use crate::validation::{
7-
validate_finality_signature_interval, validate_max_msgs_per_interval, validate_min_pub_rand,
8-
validate_rate_limiting_interval,
7+
validate_max_msgs_per_interval, validate_min_pub_rand, validate_rate_limiting_interval,
98
};
109
use babylon_bindings::BabylonQuery;
1110

@@ -16,8 +15,6 @@ pub fn handle_update_config(
1615
min_pub_rand: Option<u64>,
1716
max_msgs_per_interval: Option<u32>,
1817
rate_limiting_interval: Option<u64>,
19-
bsn_activation_height: Option<u64>,
20-
finality_signature_interval: Option<u64>,
2118
) -> Result<Response<BabylonMsg>, ContractError> {
2219
// Only admin can update config
2320
ADMIN.assert_admin(deps.as_ref(), &info.sender)?;
@@ -46,19 +43,6 @@ pub fn handle_update_config(
4643
has_updates = true;
4744
}
4845

49-
// Update bsn_activation_height if provided (no validation needed - any u64 is valid)
50-
if let Some(new_activation_height) = bsn_activation_height {
51-
config.bsn_activation_height = new_activation_height;
52-
has_updates = true;
53-
}
54-
55-
// Update finality_signature_interval if provided
56-
if let Some(new_finality_interval) = finality_signature_interval {
57-
validate_finality_signature_interval(new_finality_interval)?;
58-
config.finality_signature_interval = new_finality_interval;
59-
has_updates = true;
60-
}
61-
6246
// Check if any fields were actually updated
6347
if !has_updates {
6448
return Err(ContractError::NoConfigFieldsToUpdate);

contracts/finality/src/msg.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -232,10 +232,6 @@ pub enum ExecuteMsg {
232232
max_msgs_per_interval: Option<u32>,
233233
/// New rate limiting interval in blocks (if provided)
234234
rate_limiting_interval: Option<u64>,
235-
/// New BSN activation height (if provided)
236-
bsn_activation_height: Option<u64>,
237-
/// New finality signature interval (if provided)
238-
finality_signature_interval: Option<u64>,
239235
},
240236
}
241237

docs/SPEC.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -852,8 +852,6 @@ UpdateConfig {
852852
min_pub_rand: Option<u64>,
853853
max_msgs_per_interval: Option<u32>,
854854
rate_limiting_interval: Option<u64>,
855-
bsn_activation_height: Option<u64>,
856-
finality_signature_interval: Option<u64>,
857855
}
858856
```
859857

@@ -869,7 +867,6 @@ handler with the following verification logic:
869867
- If `min_pub_rand` is provided, ensure it is ≥ 1
870868
- If `max_msgs_per_interval` is provided, ensure it is ≥ 1
871869
- If `rate_limiting_interval` is provided, ensure it is ≥ 1
872-
- If `finality_signature_interval` is provided, ensure it is ≥ 1
873870
- Use the same validation functions as during contract instantiation
874871

875872
3. **Storage Operations**: Update the contract configuration:
@@ -879,6 +876,9 @@ handler with the following verification logic:
879876
- Save the updated configuration to storage
880877
- Return success response
881878

879+
> **Note**: The `bsn_activation_height` and `finality_signature_interval` parameters are
880+
> immutable and cannot be updated after contract instantiation
881+
882882
**Usage Context:** This message allows the admin to modify operational
883883
parameters without requiring contract migration, enabling fine-tuning of rate
884884
limits, finality intervals, and other settings based on network conditions.

docs/contract-managment.md

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -171,15 +171,15 @@ underscores with a maximum length of 100 characters.
171171
**min_pub_rand**
172172
> **Type**: Integer (positive)
173173
> **Required**: Yes
174-
> **Mutable**: No
174+
> **Mutable**: Yes (via `update_config` message)
175175
176176
The `min_pub_rand` parameter sets the minimum number of public randomness values that
177177
finality providers must include in each public randomness commitment.
178178

179179
**rate_limiting_interval**
180180
> **Type**: Integer (positive)
181181
> **Required**: Yes
182-
> **Mutable**: No
182+
> **Mutable**: Yes (via `update_config` message)
183183
184184
The `rate_limiting_interval` specifies the length (in Babylon Genesis blocks) of the rate limiting window.
185185
Within each interval, a finality provider can submit a limited number of messages,
@@ -191,7 +191,7 @@ how often a provider can interact with the contract.
191191
**max_msgs_per_interval**
192192
> **Type**: Integer (positive)
193193
> **Required**: Yes
194-
> **Mutable**: No
194+
> **Mutable**: Yes (via `update_config` message)
195195
196196
The `max_msgs_per_interval` sets the maximum number of messages a finality provider
197197
can submit during each rate limiting interval.
@@ -341,6 +341,26 @@ JSON_MSG={
341341
> **Variable:**
342342
> `$FP_BTC_PUBKEY`: Hex-encoded compressed BTC public key of the Finality Provider
343343
344+
**Update Configuration Parameters**
345+
346+
```shell
347+
JSON_MSG={
348+
"update_config": {
349+
"min_pub_rand": $MIN_PUB_RAND,
350+
"max_msgs_per_interval": $MAX_MSGS_PER_INTERVAL,
351+
"rate_limiting_interval": $RATE_LIMITING_INTERVAL
352+
}
353+
}
354+
```
355+
> **Variables:**
356+
> `$MIN_PUB_RAND`: (Optional) New minimum number of public randomness values required
357+
> `$MAX_MSGS_PER_INTERVAL`: (Optional) New maximum messages per finality provider per interval
358+
> `$RATE_LIMITING_INTERVAL`: (Optional) New rate limiting interval in blocks
359+
360+
> **Note**: All fields are optional - only provided fields will be updated. At least one field must be provided.
361+
> The `bsn_activation_height` and `finality_signature_interval` parameters are immutable
362+
> and can only be set during instantiation.
363+
344364
For details on when and why to use these messages, see [Contract Maintenance](#6-contract-maintenance).
345365

346366
## 5. Rollup BSN Registration

0 commit comments

Comments
 (0)