@@ -38,6 +38,7 @@ pub fn instantiate(
38
38
set_contract_version ( deps. storage , CONTRACT_NAME , CONTRACT_VERSION ) ?;
39
39
let cfg = Config {
40
40
default_timeout : msg. default_timeout ,
41
+ default_gas_limit : msg. default_gas_limit ,
41
42
} ;
42
43
CONFIG . save ( deps. storage , & cfg) ?;
43
44
@@ -107,19 +108,23 @@ pub fn execute_transfer(
107
108
if !CHANNEL_INFO . has ( deps. storage , & msg. channel ) {
108
109
return Err ( ContractError :: NoSuchChannel { id : msg. channel } ) ;
109
110
}
111
+ let config = CONFIG . load ( deps. storage ) ?;
110
112
111
- // if cw20 token, ensure it is whitelisted
113
+ // if cw20 token, validate and ensure it is whitelisted, or we set default gas limit
112
114
if let Amount :: Cw20 ( coin) = & amount {
113
115
let addr = deps. api . addr_validate ( & coin. address ) ?;
114
- ALLOW_LIST
115
- . may_load ( deps. storage , & addr) ?
116
- . ok_or ( ContractError :: NotOnAllowList ) ?;
116
+ // if limit is set, then we always allow cw20
117
+ if config. default_gas_limit . is_none ( ) {
118
+ ALLOW_LIST
119
+ . may_load ( deps. storage , & addr) ?
120
+ . ok_or ( ContractError :: NotOnAllowList ) ?;
121
+ }
117
122
} ;
118
123
119
124
// delta from user is in seconds
120
125
let timeout_delta = match msg. timeout {
121
126
Some ( t) => t,
122
- None => CONFIG . load ( deps . storage ) ? . default_timeout ,
127
+ None => config . default_timeout ,
123
128
} ;
124
129
// timeout is in nanoseconds
125
130
let timeout = env. block . time . plus_seconds ( timeout_delta) ;
@@ -202,7 +207,7 @@ const MIGRATE_VERSION_2: &str = "0.12.0-alpha1";
202
207
const MIGRATE_VERSION_3 : & str = "0.13.1" ;
203
208
204
209
#[ cfg_attr( not( feature = "library" ) , entry_point) ]
205
- pub fn migrate ( mut deps : DepsMut , env : Env , _msg : MigrateMsg ) -> Result < Response , ContractError > {
210
+ pub fn migrate ( mut deps : DepsMut , env : Env , msg : MigrateMsg ) -> Result < Response , ContractError > {
206
211
let version: Version = CONTRACT_VERSION . parse ( ) . map_err ( from_semver) ?;
207
212
let stored = get_contract_version ( deps. storage ) ?;
208
213
let storage_version: Version = stored. version . parse ( ) . map_err ( from_semver) ?;
@@ -233,6 +238,7 @@ pub fn migrate(mut deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result<Response
233
238
ADMIN . set ( deps. branch ( ) , Some ( old_config. gov_contract ) ) ?;
234
239
let config = Config {
235
240
default_timeout : old_config. default_timeout ,
241
+ default_gas_limit : None ,
236
242
} ;
237
243
CONFIG . save ( deps. storage , & config) ?;
238
244
}
@@ -242,6 +248,15 @@ pub fn migrate(mut deps: DepsMut, env: Env, _msg: MigrateMsg) -> Result<Response
242
248
}
243
249
// otherwise no migration (yet) - add them here
244
250
251
+ // always allow setting the default gas limit via MigrateMsg, even if same version
252
+ // (Note this doesn't allow unsetting it now)
253
+ if msg. default_gas_limit . is_some ( ) {
254
+ CONFIG . update ( deps. storage , |mut old| -> StdResult < _ > {
255
+ old. default_gas_limit = msg. default_gas_limit ;
256
+ Ok ( old)
257
+ } ) ?;
258
+ }
259
+
245
260
// we don't need to save anything if migrating from the same version
246
261
if storage_version < version {
247
262
set_contract_version ( deps. storage , CONTRACT_NAME , CONTRACT_VERSION ) ?;
@@ -313,6 +328,7 @@ fn query_config(deps: Deps) -> StdResult<ConfigResponse> {
313
328
let admin = ADMIN . get ( deps) ?. unwrap_or_else ( || Addr :: unchecked ( "" ) ) ;
314
329
let res = ConfigResponse {
315
330
default_timeout : cfg. default_timeout ,
331
+ default_gas_limit : cfg. default_gas_limit ,
316
332
gov_contract : admin. into ( ) ,
317
333
} ;
318
334
Ok ( res)
@@ -512,9 +528,9 @@ mod test {
512
528
}
513
529
514
530
#[ test]
515
- fn execute_cw20_fails_if_not_whitelisted ( ) {
531
+ fn execute_cw20_fails_if_not_whitelisted_unless_default_gas_limit ( ) {
516
532
let send_channel = "channel-15" ;
517
- let mut deps = setup ( & [ "channel-3" , send_channel] , & [ ] ) ;
533
+ let mut deps = setup ( & [ send_channel] , & [ ] ) ;
518
534
519
535
let cw20_addr = "my-token" ;
520
536
let transfer = TransferMsg {
@@ -528,10 +544,23 @@ mod test {
528
544
msg : to_binary ( & transfer) . unwrap ( ) ,
529
545
} ) ;
530
546
531
- // works with proper funds
547
+ // rejected as not on allow list
532
548
let info = mock_info ( cw20_addr, & [ ] ) ;
533
- let err = execute ( deps. as_mut ( ) , mock_env ( ) , info, msg) . unwrap_err ( ) ;
549
+ let err = execute ( deps. as_mut ( ) , mock_env ( ) , info. clone ( ) , msg. clone ( ) ) . unwrap_err ( ) ;
534
550
assert_eq ! ( err, ContractError :: NotOnAllowList ) ;
551
+
552
+ // add a default gas limit
553
+ migrate (
554
+ deps. as_mut ( ) ,
555
+ mock_env ( ) ,
556
+ MigrateMsg {
557
+ default_gas_limit : Some ( 123456 ) ,
558
+ } ,
559
+ )
560
+ . unwrap ( ) ;
561
+
562
+ // try again
563
+ execute ( deps. as_mut ( ) , mock_env ( ) , info, msg) . unwrap ( ) ;
535
564
}
536
565
537
566
#[ test]
@@ -558,11 +587,22 @@ mod test {
558
587
. unwrap ( ) ;
559
588
560
589
// run migration
561
- migrate ( deps. as_mut ( ) , mock_env ( ) , MigrateMsg { } ) . unwrap ( ) ;
590
+ migrate (
591
+ deps. as_mut ( ) ,
592
+ mock_env ( ) ,
593
+ MigrateMsg {
594
+ default_gas_limit : Some ( 123456 ) ,
595
+ } ,
596
+ )
597
+ . unwrap ( ) ;
562
598
563
599
// check new channel state
564
600
let chan = query_channel ( deps. as_ref ( ) , send_channel. into ( ) ) . unwrap ( ) ;
565
601
assert_eq ! ( chan. balances, vec![ Amount :: native( 50000 , native) ] ) ;
566
602
assert_eq ! ( chan. total_sent, vec![ Amount :: native( 114000 , native) ] ) ;
603
+
604
+ // check config updates
605
+ let config = query_config ( deps. as_ref ( ) ) . unwrap ( ) ;
606
+ assert_eq ! ( config. default_gas_limit, Some ( 123456 ) ) ;
567
607
}
568
608
}
0 commit comments