Skip to content

Commit 52c917e

Browse files
committed
making more examples in utils testable - featuretoggle
1 parent 850f99d commit 52c917e

File tree

1 file changed

+92
-18
lines changed

1 file changed

+92
-18
lines changed

packages/utils/Readme.md

Lines changed: 92 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -243,9 +243,9 @@ Normally you'd want to initialize the features in the `instantiate()` function:
243243
```rust
244244
# use secret_toolkit_utils::feature_toggle::{FeatureToggle, FeatureStatus, FeatureToggleTrait};
245245
# use cosmwasm_std::{entry_point, DepsMut, Env, MessageInfo, StdResult, Response};
246-
# use serde::{Serialize, Deserialize};
246+
# use serde::{Serialize};
247247
#
248-
# #[derive(Serialize, Deserialize)]
248+
# #[derive(Serialize)]
249249
# enum Features {
250250
# Feature1,
251251
# Feature2,
@@ -282,7 +282,9 @@ pub fn instantiate(
282282
The feature field in `FeatureStatus` can be anything, as long as it's implementing `serde::Serialize`.
283283
In this example it's:
284284

285-
```ignore
285+
```rust
286+
# use serde::{Serialize};
287+
#
286288
#[derive(Serialize)]
287289
pub enum Features {
288290
Feature1,
@@ -292,7 +294,10 @@ pub enum Features {
292294

293295
For the `status` field, you should use the built-in `FeatureToggle::Status` enum:
294296

295-
```ignore
297+
```rust
298+
# use serde::{Serialize, Deserialize};
299+
# use schemars::JsonSchema;
300+
#
296301
#[derive(Serialize, Debug, Deserialize, Clone, JsonSchema, PartialEq)]
297302
pub enum Status {
298303
NotPaused,
@@ -306,15 +311,25 @@ The defult value of `Status` is `Status::NotPaused`.
306311

307312
Putting a toggle on a message (or any code section of your choosing) is as easy as calling `FeatureToggle::require_not_paused()`. For example if we have a `Redeem` message in our contract, and we initialized the feature as `Features::Redeem`:
308313

309-
```ignore
314+
```rust
315+
# use cosmwasm_std::{DepsMut, Env, StdResult, Response};
316+
# use secret_toolkit_utils::feature_toggle::{FeatureToggle, FeatureToggleTrait};
317+
# use serde::{Serialize};
318+
#
319+
# #[derive(Serialize)]
320+
# pub enum Features {
321+
# Redeem,
322+
# }
323+
#
310324
fn redeem(
311325
deps: DepsMut,
312326
env: Env,
313327
amount: Option<u128>,
314328
) -> StdResult<Response> {
315-
FeatureToggle::require_not_paused(&deps.storage, vec![Features::Redeem])?;
329+
FeatureToggle::require_not_paused(deps.as_ref().storage, vec![Features::Redeem])?;
316330

317331
// Continue with function's operation
332+
Ok(Response::new())
318333
}
319334
```
320335

@@ -324,7 +339,16 @@ If the status of the `Features::Redeem` feature is `Paused`, the contract will e
324339

325340
Firstly, we will need to add `Pause` and `Unpause` messages in our `HandleMsg` enum. We can simply use `FeatureToggle::FeatureToggleHandleMsg` - it's an enum that contains default messages that `FeatureToggle` also has default implementation for:
326341

327-
```ignore
342+
```rust
343+
# use cosmwasm_std::Uint128;
344+
# use secret_toolkit_utils::feature_toggle::FeatureToggleHandleMsg;
345+
# use serde::{Serialize, Deserialize};
346+
#
347+
# #[derive(Serialize, Deserialize)]
348+
# pub enum Features {
349+
# Redeem,
350+
# }
351+
#
328352
pub enum ExecuteMsg {
329353
// Contract messages
330354
Redeem {
@@ -333,13 +357,36 @@ pub enum ExecuteMsg {
333357
Etc {}, //..
334358

335359
// Feature toggle
336-
Features(FeatureToggleHandleMsg),
360+
Features(FeatureToggleHandleMsg::<Features>),
337361
}
338362
```
339363

340364
The `FeatureToggle` struct contains a default implementation for triggering (pausing/unpausing) a feature, so you can just call it from your `execute()` function:
341365

342-
```ignore
366+
```rust
367+
# use secret_toolkit_utils::feature_toggle::{FeatureToggle, FeatureToggleTrait, FeatureToggleHandleMsg};
368+
# use cosmwasm_std::{entry_point, DepsMut, Env, MessageInfo, StdResult, Response, Uint128, Addr};
369+
# use serde::{Serialize, Deserialize};
370+
#
371+
# #[derive(Serialize, Deserialize)]
372+
# enum Features {
373+
# Feature1,
374+
# Feature2,
375+
# }
376+
#
377+
# pub enum ExecuteMsg {
378+
# // Contract messages
379+
# Redeem {
380+
# amount: Option<Uint128>,
381+
# },
382+
# Etc {}, //..
383+
# // Feature toggle
384+
# Features(FeatureToggleHandleMsg::<Features>),
385+
# }
386+
#
387+
# fn redeem(_deps: DepsMut, _env: Env, _amount: Option<Uint128>) -> StdResult<Response> { Ok(Response::new()) }
388+
# fn etc(_deps: DepsMut, _env: Env) -> StdResult<Response> { Ok(Response::new()) }
389+
#
343390
#[entry_point]
344391
pub fn execute(
345392
deps: DepsMut,
@@ -351,8 +398,10 @@ pub fn execute(
351398
ExecuteMsg::Redeem { amount } => redeem(deps, env, amount),
352399
ExecuteMsg::Etc {} => etc(deps, env),
353400
ExecuteMsg::Features(m) => match m {
354-
FeatureToggleHandleMsg::Pause { features } => FeatureToggle::handle_pause(deps, env, features),
355-
FeatureToggleHandleMsg::Unpause { features } => FeatureToggle::handle_unpause(deps, env, features),
401+
FeatureToggleHandleMsg::Pause { features } => FeatureToggle::handle_pause(deps, &info, features),
402+
FeatureToggleHandleMsg::Unpause { features } => FeatureToggle::handle_unpause(deps, &info, features),
403+
// `SetPauser` and `RemovePauser` go here too
404+
# _ => Ok(Response::new())
356405
},
357406
}
358407
}
@@ -368,7 +417,29 @@ Note: you should only add `Features(FeatureToggleHandleMsg)` to the `HandleMsg`
368417

369418
`FeatureToggle` provides with default implementation for these too, but you can wrap it with your own logic like requiring the caller to be admin, etc.:
370419

371-
```ignore
420+
```rust
421+
# use cosmwasm_std::{entry_point, DepsMut, Env, MessageInfo, StdResult, Response, Uint128, Addr, StdError};
422+
# use secret_toolkit_utils::feature_toggle::{FeatureToggle, FeatureToggleTrait, FeatureToggleHandleMsg};
423+
# use serde::{Serialize, Deserialize};
424+
#
425+
# #[derive(Serialize, Deserialize)]
426+
# enum Features {
427+
# Feature1,
428+
# Feature2,
429+
# }
430+
#
431+
# pub enum ExecuteMsg {
432+
# // Contract messages
433+
# Redeem {
434+
# amount: Option<Uint128>,
435+
# },
436+
# // Feature toggle
437+
# Features(FeatureToggleHandleMsg::<Features>),
438+
# }
439+
#
440+
# fn redeem(_deps: DepsMut, _env: Env, _amount: Option<Uint128>) -> StdResult<Response> { Ok(Response::new()) }
441+
# fn get_admin() -> StdResult<Addr> { Ok(Addr::unchecked("admin")) }
442+
#
372443
#[entry_point]
373444
pub fn execute(
374445
deps: DepsMut,
@@ -380,9 +451,10 @@ pub fn execute(
380451
match msg {
381452
ExecuteMsg::Redeem { amount } => redeem(deps, env, amount),
382453
ExecuteMsg::Features(m) => match m {
383-
// `Stop` and `Resume` go here too
384454
FeatureToggleHandleMsg::SetPauser { address } => set_pauser(deps, info, address),
385455
FeatureToggleHandleMsg::RemovePauser { address } => remove_pauser(deps, info, address),
456+
// `Pause` and `Unpause` go here too
457+
# _ => Ok(Response::new())
386458
},
387459
}
388460
}
@@ -391,13 +463,14 @@ fn set_pauser(
391463
deps: DepsMut,
392464
info: MessageInfo,
393465
address: String,
394-
) -> StdResult<HandleResponse> {
466+
) -> StdResult<Response> {
395467
let admin = get_admin()?;
396468
if admin != info.sender {
397-
return Err(StdError::unauthorized());
469+
return Err(StdError::generic_err("Unauthorized"));
398470
}
399471

400-
FeatureToggle::handle_set_pauser(deps, env, address)
472+
let address = deps.api.addr_validate(&address)?;
473+
FeatureToggle::handle_set_pauser(deps, address)
401474
}
402475

403476
fn remove_pauser(
@@ -407,10 +480,11 @@ fn remove_pauser(
407480
) -> StdResult<Response> {
408481
let admin = get_admin()?;
409482
if admin != info.sender {
410-
return Err(StdError::unauthorized());
483+
return Err(StdError::generic_err("Unauthorized"));
411484
}
412485

413-
FeatureToggle::handle_remove_pauser(deps, env, address)
486+
let address = deps.api.addr_validate(&address)?;
487+
FeatureToggle::handle_remove_pauser(deps, address)
414488
}
415489
```
416490

0 commit comments

Comments
 (0)