pub trait FeatureToggleTrait {
const STORAGE_KEY: &'static [u8];
Show 15 methods
fn init_features<T: Serialize>(
storage: &mut dyn Storage,
feature_statuses: Vec<FeatureStatus<T>>,
pausers: Vec<Addr>
) -> StdResult<()> { ... }
fn require_not_paused<T: Serialize>(
storage: &dyn Storage,
features: Vec<T>
) -> StdResult<()> { ... }
fn pause<T: Serialize>(
storage: &mut dyn Storage,
features: Vec<T>
) -> StdResult<()> { ... }
fn unpause<T: Serialize>(
storage: &mut dyn Storage,
features: Vec<T>
) -> StdResult<()> { ... }
fn is_pauser(storage: &dyn Storage, key: &Addr) -> StdResult<bool> { ... }
fn set_pauser(storage: &mut dyn Storage, key: &Addr) -> StdResult<()> { ... }
fn remove_pauser(storage: &mut dyn Storage, key: &Addr) { ... }
fn get_feature_status<T: Serialize>(
storage: &dyn Storage,
key: &T
) -> StdResult<Option<Status>> { ... }
fn set_feature_status<T: Serialize>(
storage: &mut dyn Storage,
key: &T,
item: Status
) -> StdResult<()> { ... }
fn handle_pause<T: Serialize>(
deps: DepsMut<'_>,
info: &MessageInfo,
features: Vec<T>
) -> StdResult<Response> { ... }
fn handle_unpause<T: Serialize>(
deps: DepsMut<'_>,
info: &MessageInfo,
features: Vec<T>
) -> StdResult<Response> { ... }
fn handle_set_pauser(deps: DepsMut<'_>, address: Addr) -> StdResult<Response> { ... }
fn handle_remove_pauser(
deps: DepsMut<'_>,
address: Addr
) -> StdResult<Response> { ... }
fn query_status<T: Serialize>(
deps: Deps<'_>,
features: Vec<T>
) -> StdResult<Binary> { ... }
fn query_is_pauser(deps: Deps<'_>, address: Addr) -> StdResult<Binary> { ... }
}Required Associated Constants§
const STORAGE_KEY: &'static [u8]
Provided Methods§
fn init_features<T: Serialize>(
storage: &mut dyn Storage,
feature_statuses: Vec<FeatureStatus<T>>,
pausers: Vec<Addr>
) -> StdResult<()>
fn require_not_paused<T: Serialize>(
storage: &dyn Storage,
features: Vec<T>
) -> StdResult<()>
sourcefn pause<T: Serialize>(
storage: &mut dyn Storage,
features: Vec<T>
) -> StdResult<()>
fn pause<T: Serialize>(
storage: &mut dyn Storage,
features: Vec<T>
) -> StdResult<()>
Examples found in repository?
src/feature_toggle.rs (line 123)
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
fn handle_pause<T: Serialize>(
deps: DepsMut,
info: &MessageInfo,
features: Vec<T>,
) -> StdResult<Response> {
if !Self::is_pauser(deps.storage, &info.sender)? {
return Err(StdError::generic_err("unauthorized"));
}
Self::pause(deps.storage, features)?;
Ok(Response::new().set_data(to_binary(&HandleAnswer::Pause {
status: ResponseStatus::Success,
})?))
}sourcefn unpause<T: Serialize>(
storage: &mut dyn Storage,
features: Vec<T>
) -> StdResult<()>
fn unpause<T: Serialize>(
storage: &mut dyn Storage,
features: Vec<T>
) -> StdResult<()>
Examples found in repository?
src/feature_toggle.rs (line 139)
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
fn handle_unpause<T: Serialize>(
deps: DepsMut,
info: &MessageInfo,
features: Vec<T>,
) -> StdResult<Response> {
if !Self::is_pauser(deps.storage, &info.sender)? {
return Err(StdError::generic_err("unauthorized"));
}
Self::unpause(deps.storage, features)?;
Ok(Response::new().set_data(to_binary(&HandleAnswer::Unpause {
status: ResponseStatus::Success,
})?))
}sourcefn is_pauser(storage: &dyn Storage, key: &Addr) -> StdResult<bool>
fn is_pauser(storage: &dyn Storage, key: &Addr) -> StdResult<bool>
Examples found in repository?
src/feature_toggle.rs (line 119)
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
fn handle_pause<T: Serialize>(
deps: DepsMut,
info: &MessageInfo,
features: Vec<T>,
) -> StdResult<Response> {
if !Self::is_pauser(deps.storage, &info.sender)? {
return Err(StdError::generic_err("unauthorized"));
}
Self::pause(deps.storage, features)?;
Ok(Response::new().set_data(to_binary(&HandleAnswer::Pause {
status: ResponseStatus::Success,
})?))
}
fn handle_unpause<T: Serialize>(
deps: DepsMut,
info: &MessageInfo,
features: Vec<T>,
) -> StdResult<Response> {
if !Self::is_pauser(deps.storage, &info.sender)? {
return Err(StdError::generic_err("unauthorized"));
}
Self::unpause(deps.storage, features)?;
Ok(Response::new().set_data(to_binary(&HandleAnswer::Unpause {
status: ResponseStatus::Success,
})?))
}
fn handle_set_pauser(deps: DepsMut, address: Addr) -> StdResult<Response> {
Self::set_pauser(deps.storage, &address)?;
Ok(
Response::new().set_data(to_binary(&HandleAnswer::SetPauser {
status: ResponseStatus::Success,
})?),
)
}
fn handle_remove_pauser(deps: DepsMut, address: Addr) -> StdResult<Response> {
Self::remove_pauser(deps.storage, &address);
Ok(
Response::new().set_data(to_binary(&HandleAnswer::RemovePauser {
status: ResponseStatus::Success,
})?),
)
}
fn query_status<T: Serialize>(deps: Deps, features: Vec<T>) -> StdResult<Binary> {
let mut status = Vec::with_capacity(features.len());
for feature in features {
match Self::get_feature_status(deps.storage, &feature)? {
None => {
return Err(StdError::generic_err(format!(
"invalid feature: {} does not exist",
String::from_utf8_lossy(&to_vec(&feature)?)
)))
}
Some(s) => status.push(FeatureStatus { feature, status: s }),
}
}
to_binary(&FeatureToggleQueryAnswer::Status { features: status })
}
fn query_is_pauser(deps: Deps, address: Addr) -> StdResult<Binary> {
let is_pauser = Self::is_pauser(deps.storage, &address)?;
to_binary(&FeatureToggleQueryAnswer::<()>::IsPauser { is_pauser })
}sourcefn set_pauser(storage: &mut dyn Storage, key: &Addr) -> StdResult<()>
fn set_pauser(storage: &mut dyn Storage, key: &Addr) -> StdResult<()>
Examples found in repository?
src/feature_toggle.rs (line 32)
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
fn init_features<T: Serialize>(
storage: &mut dyn Storage,
feature_statuses: Vec<FeatureStatus<T>>,
pausers: Vec<Addr>,
) -> StdResult<()> {
for fs in feature_statuses {
Self::set_feature_status(storage, &fs.feature, fs.status)?;
}
for p in pausers {
Self::set_pauser(storage, &p)?;
}
Ok(())
}
fn require_not_paused<T: Serialize>(storage: &dyn Storage, features: Vec<T>) -> StdResult<()> {
for feature in features {
let status = Self::get_feature_status(storage, &feature)?;
match status {
None => {
return Err(StdError::generic_err(format!(
"feature toggle: unknown feature '{}'",
String::from_utf8_lossy(&to_vec(&feature)?)
)))
}
Some(s) => match s {
Status::NotPaused => {}
Status::Paused => {
return Err(StdError::generic_err(format!(
"feature toggle: feature '{}' is paused",
String::from_utf8_lossy(&to_vec(&feature)?)
)));
}
},
}
}
Ok(())
}
fn pause<T: Serialize>(storage: &mut dyn Storage, features: Vec<T>) -> StdResult<()> {
for f in features {
Self::set_feature_status(storage, &f, Status::Paused)?;
}
Ok(())
}
fn unpause<T: Serialize>(storage: &mut dyn Storage, features: Vec<T>) -> StdResult<()> {
for f in features {
Self::set_feature_status(storage, &f, Status::NotPaused)?;
}
Ok(())
}
fn is_pauser(storage: &dyn Storage, key: &Addr) -> StdResult<bool> {
let feature_store: ReadonlyBucket<bool> =
ReadonlyBucket::multilevel(storage, &[Self::STORAGE_KEY, PREFIX_PAUSERS]);
feature_store.may_load(key.as_bytes()).map(|p| p.is_some())
}
fn set_pauser(storage: &mut dyn Storage, key: &Addr) -> StdResult<()> {
let mut feature_store = Bucket::multilevel(storage, &[Self::STORAGE_KEY, PREFIX_PAUSERS]);
feature_store.save(key.as_bytes(), &true /* value is insignificant */)
}
fn remove_pauser(storage: &mut dyn Storage, key: &Addr) {
let mut feature_store: Bucket<bool> =
Bucket::multilevel(storage, &[Self::STORAGE_KEY, PREFIX_PAUSERS]);
feature_store.remove(key.as_bytes())
}
fn get_feature_status<T: Serialize>(
storage: &dyn Storage,
key: &T,
) -> StdResult<Option<Status>> {
let feature_store =
ReadonlyBucket::multilevel(storage, &[Self::STORAGE_KEY, PREFIX_FEATURES]);
feature_store.may_load(&cosmwasm_std::to_vec(&key)?)
}
fn set_feature_status<T: Serialize>(
storage: &mut dyn Storage,
key: &T,
item: Status,
) -> StdResult<()> {
let mut feature_store = Bucket::multilevel(storage, &[Self::STORAGE_KEY, PREFIX_FEATURES]);
feature_store.save(&cosmwasm_std::to_vec(&key)?, &item)
}
fn handle_pause<T: Serialize>(
deps: DepsMut,
info: &MessageInfo,
features: Vec<T>,
) -> StdResult<Response> {
if !Self::is_pauser(deps.storage, &info.sender)? {
return Err(StdError::generic_err("unauthorized"));
}
Self::pause(deps.storage, features)?;
Ok(Response::new().set_data(to_binary(&HandleAnswer::Pause {
status: ResponseStatus::Success,
})?))
}
fn handle_unpause<T: Serialize>(
deps: DepsMut,
info: &MessageInfo,
features: Vec<T>,
) -> StdResult<Response> {
if !Self::is_pauser(deps.storage, &info.sender)? {
return Err(StdError::generic_err("unauthorized"));
}
Self::unpause(deps.storage, features)?;
Ok(Response::new().set_data(to_binary(&HandleAnswer::Unpause {
status: ResponseStatus::Success,
})?))
}
fn handle_set_pauser(deps: DepsMut, address: Addr) -> StdResult<Response> {
Self::set_pauser(deps.storage, &address)?;
Ok(
Response::new().set_data(to_binary(&HandleAnswer::SetPauser {
status: ResponseStatus::Success,
})?),
)
}sourcefn remove_pauser(storage: &mut dyn Storage, key: &Addr)
fn remove_pauser(storage: &mut dyn Storage, key: &Addr)
sourcefn get_feature_status<T: Serialize>(
storage: &dyn Storage,
key: &T
) -> StdResult<Option<Status>>
fn get_feature_status<T: Serialize>(
storage: &dyn Storage,
key: &T
) -> StdResult<Option<Status>>
Examples found in repository?
src/feature_toggle.rs (line 40)
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
fn require_not_paused<T: Serialize>(storage: &dyn Storage, features: Vec<T>) -> StdResult<()> {
for feature in features {
let status = Self::get_feature_status(storage, &feature)?;
match status {
None => {
return Err(StdError::generic_err(format!(
"feature toggle: unknown feature '{}'",
String::from_utf8_lossy(&to_vec(&feature)?)
)))
}
Some(s) => match s {
Status::NotPaused => {}
Status::Paused => {
return Err(StdError::generic_err(format!(
"feature toggle: feature '{}' is paused",
String::from_utf8_lossy(&to_vec(&feature)?)
)));
}
},
}
}
Ok(())
}
fn pause<T: Serialize>(storage: &mut dyn Storage, features: Vec<T>) -> StdResult<()> {
for f in features {
Self::set_feature_status(storage, &f, Status::Paused)?;
}
Ok(())
}
fn unpause<T: Serialize>(storage: &mut dyn Storage, features: Vec<T>) -> StdResult<()> {
for f in features {
Self::set_feature_status(storage, &f, Status::NotPaused)?;
}
Ok(())
}
fn is_pauser(storage: &dyn Storage, key: &Addr) -> StdResult<bool> {
let feature_store: ReadonlyBucket<bool> =
ReadonlyBucket::multilevel(storage, &[Self::STORAGE_KEY, PREFIX_PAUSERS]);
feature_store.may_load(key.as_bytes()).map(|p| p.is_some())
}
fn set_pauser(storage: &mut dyn Storage, key: &Addr) -> StdResult<()> {
let mut feature_store = Bucket::multilevel(storage, &[Self::STORAGE_KEY, PREFIX_PAUSERS]);
feature_store.save(key.as_bytes(), &true /* value is insignificant */)
}
fn remove_pauser(storage: &mut dyn Storage, key: &Addr) {
let mut feature_store: Bucket<bool> =
Bucket::multilevel(storage, &[Self::STORAGE_KEY, PREFIX_PAUSERS]);
feature_store.remove(key.as_bytes())
}
fn get_feature_status<T: Serialize>(
storage: &dyn Storage,
key: &T,
) -> StdResult<Option<Status>> {
let feature_store =
ReadonlyBucket::multilevel(storage, &[Self::STORAGE_KEY, PREFIX_FEATURES]);
feature_store.may_load(&cosmwasm_std::to_vec(&key)?)
}
fn set_feature_status<T: Serialize>(
storage: &mut dyn Storage,
key: &T,
item: Status,
) -> StdResult<()> {
let mut feature_store = Bucket::multilevel(storage, &[Self::STORAGE_KEY, PREFIX_FEATURES]);
feature_store.save(&cosmwasm_std::to_vec(&key)?, &item)
}
fn handle_pause<T: Serialize>(
deps: DepsMut,
info: &MessageInfo,
features: Vec<T>,
) -> StdResult<Response> {
if !Self::is_pauser(deps.storage, &info.sender)? {
return Err(StdError::generic_err("unauthorized"));
}
Self::pause(deps.storage, features)?;
Ok(Response::new().set_data(to_binary(&HandleAnswer::Pause {
status: ResponseStatus::Success,
})?))
}
fn handle_unpause<T: Serialize>(
deps: DepsMut,
info: &MessageInfo,
features: Vec<T>,
) -> StdResult<Response> {
if !Self::is_pauser(deps.storage, &info.sender)? {
return Err(StdError::generic_err("unauthorized"));
}
Self::unpause(deps.storage, features)?;
Ok(Response::new().set_data(to_binary(&HandleAnswer::Unpause {
status: ResponseStatus::Success,
})?))
}
fn handle_set_pauser(deps: DepsMut, address: Addr) -> StdResult<Response> {
Self::set_pauser(deps.storage, &address)?;
Ok(
Response::new().set_data(to_binary(&HandleAnswer::SetPauser {
status: ResponseStatus::Success,
})?),
)
}
fn handle_remove_pauser(deps: DepsMut, address: Addr) -> StdResult<Response> {
Self::remove_pauser(deps.storage, &address);
Ok(
Response::new().set_data(to_binary(&HandleAnswer::RemovePauser {
status: ResponseStatus::Success,
})?),
)
}
fn query_status<T: Serialize>(deps: Deps, features: Vec<T>) -> StdResult<Binary> {
let mut status = Vec::with_capacity(features.len());
for feature in features {
match Self::get_feature_status(deps.storage, &feature)? {
None => {
return Err(StdError::generic_err(format!(
"invalid feature: {} does not exist",
String::from_utf8_lossy(&to_vec(&feature)?)
)))
}
Some(s) => status.push(FeatureStatus { feature, status: s }),
}
}
to_binary(&FeatureToggleQueryAnswer::Status { features: status })
}sourcefn set_feature_status<T: Serialize>(
storage: &mut dyn Storage,
key: &T,
item: Status
) -> StdResult<()>
fn set_feature_status<T: Serialize>(
storage: &mut dyn Storage,
key: &T,
item: Status
) -> StdResult<()>
Examples found in repository?
src/feature_toggle.rs (line 28)
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
fn init_features<T: Serialize>(
storage: &mut dyn Storage,
feature_statuses: Vec<FeatureStatus<T>>,
pausers: Vec<Addr>,
) -> StdResult<()> {
for fs in feature_statuses {
Self::set_feature_status(storage, &fs.feature, fs.status)?;
}
for p in pausers {
Self::set_pauser(storage, &p)?;
}
Ok(())
}
fn require_not_paused<T: Serialize>(storage: &dyn Storage, features: Vec<T>) -> StdResult<()> {
for feature in features {
let status = Self::get_feature_status(storage, &feature)?;
match status {
None => {
return Err(StdError::generic_err(format!(
"feature toggle: unknown feature '{}'",
String::from_utf8_lossy(&to_vec(&feature)?)
)))
}
Some(s) => match s {
Status::NotPaused => {}
Status::Paused => {
return Err(StdError::generic_err(format!(
"feature toggle: feature '{}' is paused",
String::from_utf8_lossy(&to_vec(&feature)?)
)));
}
},
}
}
Ok(())
}
fn pause<T: Serialize>(storage: &mut dyn Storage, features: Vec<T>) -> StdResult<()> {
for f in features {
Self::set_feature_status(storage, &f, Status::Paused)?;
}
Ok(())
}
fn unpause<T: Serialize>(storage: &mut dyn Storage, features: Vec<T>) -> StdResult<()> {
for f in features {
Self::set_feature_status(storage, &f, Status::NotPaused)?;
}
Ok(())
}