@@ -478,26 +478,44 @@ fn permit_queries(deps: Deps, permit: Permit, query: QueryWithPermit) -> Result<
478
478
page,
479
479
page_size,
480
480
} => {
481
- if !permit. check_permission ( & TokenPermissions :: Allowance ) {
481
+ if account != owner {
482
+ return Err ( StdError :: generic_err (
483
+ "Cannot query allowance. Requires permit for owner" ,
484
+ ) ) ;
485
+ }
486
+
487
+ // we really should add a check_permission(s) function.. an owner permit should
488
+ // just give you permissions to do everything
489
+ if !permit. check_permission ( & TokenPermissions :: Allowance )
490
+ && !permit. check_permission ( & TokenPermissions :: Owner )
491
+ {
482
492
return Err ( StdError :: generic_err ( format ! (
483
493
"No permission to query all allowances, got permissions {:?}" ,
484
494
permit. params. permissions
485
495
) ) ) ;
486
496
}
487
- query_allowances_given ( deps, owner , page. unwrap_or ( 0 ) , page_size)
497
+ query_allowances_given ( deps, account , page. unwrap_or ( 0 ) , page_size)
488
498
}
489
499
QueryWithPermit :: AllowancesReceived {
490
500
spender,
491
501
page,
492
502
page_size,
493
503
} => {
494
- if !permit. check_permission ( & TokenPermissions :: Allowance ) {
504
+ if account != spender {
505
+ return Err ( StdError :: generic_err (
506
+ "Cannot query allowance. Requires permit for spender" ,
507
+ ) ) ;
508
+ }
509
+
510
+ if !permit. check_permission ( & TokenPermissions :: Allowance )
511
+ && !permit. check_permission ( & TokenPermissions :: Owner )
512
+ {
495
513
return Err ( StdError :: generic_err ( format ! (
496
514
"No permission to query all allowed, got permissions {:?}" ,
497
515
permit. params. permissions
498
516
) ) ) ;
499
517
}
500
- query_allowances_received ( deps, spender , page. unwrap_or ( 0 ) , page_size)
518
+ query_allowances_received ( deps, account , page. unwrap_or ( 0 ) , page_size)
501
519
}
502
520
}
503
521
}
@@ -2664,6 +2682,93 @@ mod tests {
2664
2682
permit
2665
2683
}
2666
2684
2685
+ fn get_allowances_given_permit (
2686
+ permit_name : & str ,
2687
+ chain_id : & str ,
2688
+ pub_key_value : & str ,
2689
+ signature : & str ,
2690
+ spender : String ,
2691
+ ) -> QueryMsg {
2692
+ let permit = gen_permit_obj (
2693
+ permit_name,
2694
+ chain_id,
2695
+ pub_key_value,
2696
+ signature,
2697
+ TokenPermissions :: Owner ,
2698
+ ) ;
2699
+
2700
+ QueryMsg :: WithPermit {
2701
+ permit,
2702
+ query : QueryWithPermit :: AllowancesReceived {
2703
+ spender,
2704
+ page : None ,
2705
+ page_size : 0 ,
2706
+ } ,
2707
+ }
2708
+ }
2709
+
2710
+ #[ test]
2711
+ fn test_permit_query_allowances_given_should_fail ( ) {
2712
+ let user_address = "secret18mdrja40gfuftt5yx6tgj0fn5lurplezyp894y" ;
2713
+ let permit_name = "default" ;
2714
+ let chain_id = "secretdev-1" ;
2715
+ let pub_key = "AkZqxdKMtPq2w0kGDGwWGejTAed0H7azPMHtrCX0XYZG" ;
2716
+ let signature = "ZXyFMlAy6guMG9Gj05rFvcMi5/JGfClRtJpVTHiDtQY3GtSfBHncY70kmYiTXkKIxSxdnh/kS8oXa+GSX5su6Q==" ;
2717
+
2718
+ // Init the contract
2719
+ let ( init_result, deps) = init_helper ( vec ! [ InitialBalance {
2720
+ address: user_address. to_string( ) ,
2721
+ amount: Uint128 :: new( 50000000 ) ,
2722
+ } ] ) ;
2723
+ assert ! (
2724
+ init_result. is_ok( ) ,
2725
+ "Init failed: {}" ,
2726
+ init_result. err( ) . unwrap( )
2727
+ ) ;
2728
+
2729
+ let msg = get_allowances_given_permit (
2730
+ permit_name,
2731
+ chain_id,
2732
+ pub_key,
2733
+ signature,
2734
+ "secret1kmgdagt5efcz2kku0ak9ezfgntg29g2vr88q0e" . to_string ( ) ,
2735
+ ) ;
2736
+ let query_result = query ( deps. as_ref ( ) , mock_env ( ) , msg) ;
2737
+
2738
+ assert_eq ! ( query_result. is_err( ) , true ) ;
2739
+ }
2740
+
2741
+ #[ test]
2742
+ fn test_permit_query_allowances_given ( ) {
2743
+ let user_address = "secret18mdrja40gfuftt5yx6tgj0fn5lurplezyp894y" ;
2744
+ let permit_name = "default" ;
2745
+ let chain_id = "secretdev-1" ;
2746
+ let pub_key = "AkZqxdKMtPq2w0kGDGwWGejTAed0H7azPMHtrCX0XYZG" ;
2747
+ let signature = "ZXyFMlAy6guMG9Gj05rFvcMi5/JGfClRtJpVTHiDtQY3GtSfBHncY70kmYiTXkKIxSxdnh/kS8oXa+GSX5su6Q==" ;
2748
+
2749
+ // Init the contract
2750
+ let ( init_result, deps) = init_helper ( vec ! [ InitialBalance {
2751
+ address: user_address. to_string( ) ,
2752
+ amount: Uint128 :: new( 50000000 ) ,
2753
+ } ] ) ;
2754
+ assert ! (
2755
+ init_result. is_ok( ) ,
2756
+ "Init failed: {}" ,
2757
+ init_result. err( ) . unwrap( )
2758
+ ) ;
2759
+
2760
+ let msg = get_allowances_given_permit (
2761
+ permit_name,
2762
+ chain_id,
2763
+ pub_key,
2764
+ signature,
2765
+ "secret18mdrja40gfuftt5yx6tgj0fn5lurplezyp894y" . to_string ( ) ,
2766
+ ) ;
2767
+ let query_result = query ( deps. as_ref ( ) , mock_env ( ) , msg) ;
2768
+
2769
+ assert_eq ! ( query_result. is_ok( ) , true ) ;
2770
+ }
2771
+
2667
2772
#[ test]
2668
2773
fn test_permit_revoke ( ) {
2669
2774
let user_address = "secret1kmgdagt5efcz2kku0ak9ezfgntg29g2vr88q0e" ;
0 commit comments