@@ -80,6 +80,7 @@ pub fn instantiate(
80
80
owner : deps. api . addr_validate ( msg. owner . as_str ( ) ) ?,
81
81
allowed_lp_tokens : vec ! [ ] ,
82
82
unbond_config : msg. unbond_config . clone ( ) ,
83
+ allowed_reward_cw20_tokens : vec ! [ ] ,
83
84
} ,
84
85
) ?;
85
86
@@ -187,6 +188,29 @@ pub fn execute(
187
188
ExecuteMsg :: ClaimUnallocatedReward { reward_schedule_id } => {
188
189
claim_unallocated_reward ( deps, env, info, reward_schedule_id)
189
190
}
191
+ ExecuteMsg :: AllowRewardCw20Token { addr } => {
192
+ let mut config = CONFIG . load ( deps. storage ) ?;
193
+ if config. allowed_reward_cw20_tokens . contains ( & addr) {
194
+ return Err ( ContractError :: Cw20TokenAlreadyAllowed ) ;
195
+ }
196
+ config. allowed_reward_cw20_tokens . push ( addr. clone ( ) ) ;
197
+ CONFIG . save ( deps. storage , & config) ?;
198
+
199
+ Ok ( Response :: new ( ) . add_event (
200
+ Event :: from_info ( concatcp ! ( CONTRACT_NAME , "::allow_reward_cw20_token" ) , & info)
201
+ . add_attribute ( "cw20_token" , addr. to_string ( ) ) ,
202
+ ) )
203
+ } ,
204
+ ExecuteMsg :: RemoveRewardCw20Token { addr } => {
205
+ let mut config = CONFIG . load ( deps. storage ) ?;
206
+ config. allowed_reward_cw20_tokens . retain ( |x| x != & addr) ;
207
+ CONFIG . save ( deps. storage , & config) ?;
208
+
209
+ Ok ( Response :: new ( ) . add_event (
210
+ Event :: from_info ( concatcp ! ( CONTRACT_NAME , "::remove_reward_cw20_token" ) , & info)
211
+ . add_attribute ( "cw20_token" , addr. to_string ( ) ) ,
212
+ ) )
213
+ } ,
190
214
ExecuteMsg :: ProposeNewOwner { owner, expires_in } => {
191
215
let config = CONFIG . load ( deps. storage ) ?;
192
216
let response = propose_new_owner (
@@ -619,6 +643,11 @@ pub fn receive_cw20(
619
643
620
644
let token_addr = info. sender . clone ( ) ;
621
645
646
+ // validate that the CW20 token is allowed for rewards
647
+ if !config. allowed_reward_cw20_tokens . contains ( & token_addr) {
648
+ return Err ( ContractError :: Cw20TokenNotAllowed ) ;
649
+ }
650
+
622
651
let creator = match actual_creator {
623
652
Some ( creator) => deps. api . addr_validate ( & creator. to_string ( ) ) ?,
624
653
None => sender. clone ( ) ,
@@ -1230,6 +1259,7 @@ pub fn migrate(deps: DepsMut, _env: Env, msg: MigrateMsg) -> ContractResult<Resp
1230
1259
allowed_lp_tokens : config_v1. allowed_lp_tokens ,
1231
1260
keeper : deps. api . addr_validate ( & keeper_addr. to_string ( ) ) ?,
1232
1261
unbond_config,
1262
+ allowed_reward_cw20_tokens : vec ! [ ] ,
1233
1263
} ;
1234
1264
1235
1265
set_contract_version ( deps. storage , CONTRACT_NAME , CONTRACT_VERSION ) ?;
@@ -1257,6 +1287,7 @@ pub fn migrate(deps: DepsMut, _env: Env, msg: MigrateMsg) -> ContractResult<Resp
1257
1287
allowed_lp_tokens : config_v2. allowed_lp_tokens ,
1258
1288
keeper : deps. api . addr_validate ( & keeper_addr. to_string ( ) ) ?,
1259
1289
unbond_config,
1290
+ allowed_reward_cw20_tokens : vec ! [ ] ,
1260
1291
} ;
1261
1292
1262
1293
CONFIG . save ( deps. storage , & config) ?;
@@ -1289,6 +1320,7 @@ pub fn migrate(deps: DepsMut, _env: Env, msg: MigrateMsg) -> ContractResult<Resp
1289
1320
allowed_lp_tokens : config_v2. allowed_lp_tokens ,
1290
1321
keeper : config_v2. keeper ,
1291
1322
unbond_config,
1323
+ allowed_reward_cw20_tokens : vec ! [ ] ,
1292
1324
} ;
1293
1325
1294
1326
CONFIG . save ( deps. storage , & config) ?;
@@ -1323,6 +1355,7 @@ pub fn migrate(deps: DepsMut, _env: Env, msg: MigrateMsg) -> ContractResult<Resp
1323
1355
allowed_lp_tokens : config_v3. allowed_lp_tokens ,
1324
1356
keeper : config_v3. keeper ,
1325
1357
unbond_config,
1358
+ allowed_reward_cw20_tokens : vec ! [ ] ,
1326
1359
} ;
1327
1360
1328
1361
CONFIG . save ( deps. storage , & config) ?;
0 commit comments