Skip to content

Commit dd61c51

Browse files
Validated preinstantiated contracts code ids
1 parent d65cfbd commit dd61c51

File tree

11 files changed

+135
-4
lines changed

11 files changed

+135
-4
lines changed

contracts/factory/src/contract.rs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use drop_staking_base::msg::{
2828
withdrawal_manager::InstantiateMsg as WithdrawalManagerInstantiateMsg,
2929
withdrawal_voucher::InstantiateMsg as WithdrawalVoucherInstantiateMsg,
3030
};
31-
use drop_staking_base::state::factory::{PreInstantiatedContracts, STATE};
31+
use drop_staking_base::state::factory::{CodeIds, PreInstantiatedContracts, STATE};
3232
use drop_staking_base::state::splitter::Config as SplitterConfig;
3333
use neutron_sdk::{
3434
bindings::{msg::NeutronMsg, query::NeutronQuery},
@@ -49,7 +49,12 @@ pub fn instantiate(
4949
cw2::set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?;
5050
cw_ownable::initialize_owner(deps.storage, deps.api, Some(info.sender.as_str()))?;
5151

52-
validate_pre_instantiated_contracts(deps.as_ref(), &env, &msg.pre_instantiated_contracts)?;
52+
validate_pre_instantiated_contracts(
53+
deps.as_ref(),
54+
&env,
55+
&msg.pre_instantiated_contracts,
56+
&msg.code_ids,
57+
)?;
5358

5459
let attrs = vec![
5560
attr("base_denom", &msg.base_denom),
@@ -516,6 +521,7 @@ pub fn validate_contract_metadata(
516521
env: &Env,
517522
contract_addr: &Addr,
518523
valid_names: &[&str],
524+
code_id: u64,
519525
) -> ContractResult<()> {
520526
let contract_version = get_contract_version(deps, contract_addr)?;
521527

@@ -553,13 +559,22 @@ pub fn validate_contract_metadata(
553559
});
554560
}
555561

562+
if contract_info.code_id != code_id {
563+
return Err(ContractError::InvalidContractCodeId {
564+
contract: contract_addr.to_string(),
565+
expected: code_id.to_string(),
566+
actual: contract_info.code_id.to_string(),
567+
});
568+
}
569+
556570
Ok(())
557571
}
558572

559573
fn validate_pre_instantiated_contracts(
560574
deps: Deps,
561575
env: &Env,
562576
pre_instantiated_contracts: &PreInstantiatedContracts,
577+
code_ids: &CodeIds,
563578
) -> Result<(), ContractError> {
564579
// Validate native bond provider contract
565580
validate_contract_metadata(
@@ -570,6 +585,7 @@ fn validate_pre_instantiated_contracts(
570585
drop_native_bond_provider::contract::CONTRACT_NAME,
571586
drop_native_sync_bond_provider::contract::CONTRACT_NAME,
572587
],
588+
code_ids.native_bond_provider_code_id.unwrap_or_default(),
573589
)?;
574590

575591
// Validate val ref address
@@ -579,6 +595,7 @@ fn validate_pre_instantiated_contracts(
579595
env,
580596
val_ref_address,
581597
&[drop_val_ref::contract::CONTRACT_NAME],
598+
code_ids.val_ref_code_id.unwrap_or_default(),
582599
)?;
583600
}
584601

@@ -591,6 +608,7 @@ fn validate_pre_instantiated_contracts(
591608
env,
592609
lsm_share_bond_provider_address,
593610
&[drop_lsm_share_bond_provider::contract::CONTRACT_NAME],
611+
code_ids.lsm_share_bond_provider_code_id.unwrap_or_default(),
594612
)?;
595613
}
596614

@@ -604,6 +622,7 @@ fn validate_pre_instantiated_contracts(
604622
drop_puppeteer_initia::contract::CONTRACT_NAME,
605623
drop_puppeteer_native::contract::CONTRACT_NAME,
606624
],
625+
code_ids.puppeteer_code_id.unwrap_or_default(),
607626
)?;
608627

609628
// Validate unbonding and rewards pump contracts
@@ -613,6 +632,7 @@ fn validate_pre_instantiated_contracts(
613632
env,
614633
unbonding_pump_address,
615634
&[drop_pump::contract::CONTRACT_NAME],
635+
code_ids.unbonding_pump_code_id.unwrap_or_default(),
616636
)?;
617637
}
618638
if let Some(rewards_pump_address) = &pre_instantiated_contracts.rewards_pump_address {
@@ -621,6 +641,7 @@ fn validate_pre_instantiated_contracts(
621641
env,
622642
rewards_pump_address,
623643
&[drop_pump::contract::CONTRACT_NAME],
644+
code_ids.rewards_pump_code_id.unwrap_or_default(),
624645
)?;
625646
}
626647

contracts/factory/src/tests.rs

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,13 +177,15 @@ fn test_instantiate() {
177177
"crates.io:drop-staking__drop-native-bond-provider".to_string(),
178178
mocked_env.contract.address.to_string(),
179179
Some(contract_admin.clone()),
180+
13,
180181
);
181182
setup_contract_metadata(
182183
&mut deps.querier,
183184
"puppeteer_address",
184185
"crates.io:drop-staking__drop-puppeteer".to_string(),
185186
mocked_env.contract.address.to_string(),
186187
Some(contract_admin),
188+
14,
187189
);
188190

189191
let instantiate_msg = InstantiateMsg {
@@ -197,6 +199,12 @@ fn test_instantiate() {
197199
distribution_code_id: 9,
198200
rewards_manager_code_id: 10,
199201
splitter_code_id: 12,
202+
native_bond_provider_code_id: Some(13),
203+
puppeteer_code_id: Some(14),
204+
val_ref_code_id: Some(15),
205+
lsm_share_bond_provider_code_id: Some(16),
206+
unbonding_pump_code_id: Some(17),
207+
rewards_pump_code_id: Some(18),
200208
},
201209
pre_instantiated_contracts: PreInstantiatedContracts {
202210
native_bond_provider_address: cosmwasm_std::Addr::unchecked(
@@ -1065,13 +1073,15 @@ fn test_validate_contract_metadata() {
10651073
"contract_name".to_string(),
10661074
mocked_env.contract.address.to_string(),
10671075
Some(contract_admin),
1076+
161,
10681077
);
10691078

10701079
validate_contract_metadata(
10711080
deps.as_ref().into_empty(),
10721081
&mocked_env,
10731082
&Addr::unchecked(contract_addr),
10741083
&["contract_name"],
1084+
161,
10751085
)
10761086
.unwrap();
10771087
}
@@ -1091,13 +1101,15 @@ fn test_validate_contract_metadata_two_names() {
10911101
"contract_name".to_string(),
10921102
mocked_env.contract.address.to_string(),
10931103
Some(contract_admin),
1104+
161,
10941105
);
10951106

10961107
validate_contract_metadata(
10971108
deps.as_ref().into_empty(),
10981109
&mocked_env,
10991110
&Addr::unchecked(contract_addr),
11001111
&["another_valid_name", "contract_name"],
1112+
161,
11011113
)
11021114
.unwrap();
11031115
}
@@ -1109,21 +1121,21 @@ fn test_validate_contract_metadata_wrong_contract_name() {
11091121
let contract_addr = "cosmos2contract";
11101122
let mocked_env = mock_env();
11111123

1112-
// let contract_admin = mocked_env.contract.address.to_string();
1113-
11141124
setup_contract_metadata(
11151125
&mut deps.querier,
11161126
contract_addr,
11171127
"wrong_name".to_string(),
11181128
mocked_env.contract.address.to_string(),
11191129
None,
1130+
161,
11201131
);
11211132

11221133
let error = validate_contract_metadata(
11231134
deps.as_ref().into_empty(),
11241135
&mocked_env,
11251136
&Addr::unchecked(contract_addr),
11261137
&["contract_name"],
1138+
161,
11271139
)
11281140
.unwrap_err();
11291141
assert_eq!(
@@ -1148,13 +1160,15 @@ fn test_validate_contract_metadata_wrong_owner() {
11481160
"contract_name".to_string(),
11491161
"wrong_owner_address".to_string(),
11501162
None,
1163+
161,
11511164
);
11521165

11531166
let error = validate_contract_metadata(
11541167
deps.as_ref().into_empty(),
11551168
&mocked_env,
11561169
&Addr::unchecked(contract_addr),
11571170
&["contract_name"],
1171+
161,
11581172
)
11591173
.unwrap_err();
11601174
assert_eq!(
@@ -1180,13 +1194,15 @@ fn test_validate_contract_metadata_wrong_admin() {
11801194
"contract_name".to_string(),
11811195
mocked_env.contract.address.to_string(),
11821196
Some("wrong_contract_admin".to_string()),
1197+
161,
11831198
);
11841199

11851200
let error = validate_contract_metadata(
11861201
deps.as_ref().into_empty(),
11871202
&mocked_env,
11881203
&Addr::unchecked(contract_addr),
11891204
&["contract_name"],
1205+
161,
11901206
)
11911207
.unwrap_err();
11921208
assert_eq!(
@@ -1212,13 +1228,15 @@ fn test_validate_contract_metadata_empty_admin() {
12121228
"contract_name".to_string(),
12131229
mocked_env.contract.address.to_string(),
12141230
None,
1231+
161,
12151232
);
12161233

12171234
let error = validate_contract_metadata(
12181235
deps.as_ref().into_empty(),
12191236
&mocked_env,
12201237
&Addr::unchecked(contract_addr),
12211238
&["contract_name"],
1239+
161,
12221240
)
12231241
.unwrap_err();
12241242
assert_eq!(
@@ -1231,12 +1249,49 @@ fn test_validate_contract_metadata_empty_admin() {
12311249
);
12321250
}
12331251

1252+
#[test]
1253+
fn test_validate_contract_metadata_wrong_code_id() {
1254+
let mut deps = mock_dependencies(&[]);
1255+
1256+
let contract_addr = "cosmos2contract";
1257+
let mocked_env = mock_env();
1258+
1259+
let contract_admin = mocked_env.contract.address.to_string();
1260+
1261+
setup_contract_metadata(
1262+
&mut deps.querier,
1263+
contract_addr,
1264+
"contract_name".to_string(),
1265+
mocked_env.contract.address.to_string(),
1266+
Some(contract_admin),
1267+
161,
1268+
);
1269+
1270+
let error = validate_contract_metadata(
1271+
deps.as_ref().into_empty(),
1272+
&mocked_env,
1273+
&Addr::unchecked(contract_addr),
1274+
&["contract_name"],
1275+
123,
1276+
)
1277+
.unwrap_err();
1278+
assert_eq!(
1279+
error,
1280+
drop_staking_base::error::factory::ContractError::InvalidContractCodeId {
1281+
contract: String::from(contract_addr),
1282+
expected: "123".to_string(),
1283+
actual: "161".to_string()
1284+
}
1285+
);
1286+
}
1287+
12341288
fn setup_contract_metadata(
12351289
querier: &mut WasmMockQuerier,
12361290
contract_addr: &str,
12371291
contract_name: String,
12381292
factory_address: String,
12391293
contract_admin: Option<String>,
1294+
contract_code_id: u64,
12401295
) {
12411296
querier.add_wasm_query_response(contract_addr, move |_| {
12421297
cosmwasm_std::ContractResult::Ok(
@@ -1262,6 +1317,7 @@ fn setup_contract_metadata(
12621317
querier.add_wasm_query_response(contract_addr, move |_| {
12631318
let mut response = cosmwasm_std::ContractInfoResponse::default();
12641319
response.admin = contract_admin.clone();
1320+
response.code_id = contract_code_id;
12651321

12661322
cosmwasm_std::ContractResult::Ok(to_json_binary(&response).unwrap())
12671323
});

integration_tests/src/testcases/auto-withdrawer.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -662,6 +662,12 @@ describe('Auto withdrawer', () => {
662662
validators_set_code_id: context.codeIds.validatorsSet,
663663
rewards_manager_code_id: context.codeIds.rewardsManager,
664664
splitter_code_id: context.codeIds.splitter,
665+
native_bond_provider_code_id: context.codeIds.nativeBondProvider,
666+
puppeteer_code_id: context.codeIds.puppeteer,
667+
val_ref_code_id: null,
668+
lsm_share_bond_provider_code_id: null,
669+
unbonding_pump_code_id: context.codeIds.pump,
670+
rewards_pump_code_id: context.codeIds.pump,
665671
},
666672
pre_instantiated_contracts: {
667673
native_bond_provider_address:

integration_tests/src/testcases/bond-mirror.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -676,6 +676,12 @@ describe('Mirror', () => {
676676
validators_set_code_id: context.codeIds.validatorsSet,
677677
rewards_manager_code_id: context.codeIds.rewardsManager,
678678
splitter_code_id: context.codeIds.splitter,
679+
native_bond_provider_code_id: context.codeIds.nativeBondProvider,
680+
puppeteer_code_id: context.codeIds.puppeteer,
681+
val_ref_code_id: null,
682+
lsm_share_bond_provider_code_id: context.codeIds.lsmShareBondProvider,
683+
unbonding_pump_code_id: context.codeIds.pump,
684+
rewards_pump_code_id: context.codeIds.pump,
679685
},
680686
pre_instantiated_contracts: {
681687
native_bond_provider_address:

integration_tests/src/testcases/core-slashing.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,12 @@ describe('Core Slashing', () => {
690690
validators_set_code_id: context.codeIds.validatorsSet,
691691
rewards_manager_code_id: context.codeIds.rewardsManager,
692692
splitter_code_id: context.codeIds.splitter,
693+
native_bond_provider_code_id: context.codeIds.nativeBondProvider,
694+
puppeteer_code_id: context.codeIds.puppeteer,
695+
val_ref_code_id: null,
696+
lsm_share_bond_provider_code_id: null,
697+
unbonding_pump_code_id: context.codeIds.pump,
698+
rewards_pump_code_id: context.codeIds.pump,
693699
},
694700
pre_instantiated_contracts: {
695701
native_bond_provider_address:

integration_tests/src/testcases/core.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -757,6 +757,12 @@ describe('Core', () => {
757757
validators_set_code_id: context.codeIds.validatorsSet,
758758
rewards_manager_code_id: context.codeIds.rewardsManager,
759759
splitter_code_id: context.codeIds.splitter,
760+
native_bond_provider_code_id: context.codeIds.nativeBondProvider,
761+
puppeteer_code_id: context.codeIds.puppeteer,
762+
val_ref_code_id: null,
763+
lsm_share_bond_provider_code_id: context.codeIds.lsmShareBondProvider,
764+
unbonding_pump_code_id: context.codeIds.pump,
765+
rewards_pump_code_id: context.codeIds.pump,
760766
},
761767
pre_instantiated_contracts: {
762768
native_bond_provider_address:

integration_tests/src/testcases/initia.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -845,6 +845,12 @@ describe('Core', () => {
845845
validators_set_code_id: context.codeIds.validatorsSet,
846846
withdrawal_manager_code_id: context.codeIds.withdrawalManager,
847847
withdrawal_voucher_code_id: context.codeIds.withdrawalVoucher,
848+
native_bond_provider_code_id: context.codeIds.nativeBondProvider,
849+
puppeteer_code_id: context.codeIds.puppeteer,
850+
val_ref_code_id: null,
851+
lsm_share_bond_provider_code_id: context.codeIds.lsmShareBondProvider,
852+
unbonding_pump_code_id: context.codeIds.pump,
853+
rewards_pump_code_id: context.codeIds.pump,
848854
},
849855
core_params: {
850856
icq_update_delay: 5,

packages/base/src/error/factory.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ pub enum ContractError {
4242
expected: String,
4343
actual: String,
4444
},
45+
#[error("Invalid contract code id for {contract}. Expected: {expected}, actual: {actual}")]
46+
InvalidContractCodeId {
47+
contract: String,
48+
expected: String,
49+
actual: String,
50+
},
4551
#[error("Contract address not found: {name}")]
4652
ContractAddressNotFound { name: String },
4753

packages/base/src/state/factory.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@ pub struct CodeIds {
1313
pub distribution_code_id: u64,
1414
pub rewards_manager_code_id: u64,
1515
pub splitter_code_id: u64,
16+
pub native_bond_provider_code_id: Option<u64>,
17+
pub puppeteer_code_id: Option<u64>,
18+
pub val_ref_code_id: Option<u64>,
19+
pub lsm_share_bond_provider_code_id: Option<u64>,
20+
pub unbonding_pump_code_id: Option<u64>,
21+
pub rewards_pump_code_id: Option<u64>,
1622
}
1723

1824
#[cw_serde]

0 commit comments

Comments
 (0)