Skip to content

Commit 7d8a9a5

Browse files
author
Cashmaney
authored
Fix for allowances issue (#84)
1 parent 81ad971 commit 7d8a9a5

File tree

1 file changed

+109
-4
lines changed

1 file changed

+109
-4
lines changed

src/contract.rs

+109-4
Original file line numberDiff line numberDiff line change
@@ -478,26 +478,44 @@ fn permit_queries(deps: Deps, permit: Permit, query: QueryWithPermit) -> Result<
478478
page,
479479
page_size,
480480
} => {
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+
{
482492
return Err(StdError::generic_err(format!(
483493
"No permission to query all allowances, got permissions {:?}",
484494
permit.params.permissions
485495
)));
486496
}
487-
query_allowances_given(deps, owner, page.unwrap_or(0), page_size)
497+
query_allowances_given(deps, account, page.unwrap_or(0), page_size)
488498
}
489499
QueryWithPermit::AllowancesReceived {
490500
spender,
491501
page,
492502
page_size,
493503
} => {
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+
{
495513
return Err(StdError::generic_err(format!(
496514
"No permission to query all allowed, got permissions {:?}",
497515
permit.params.permissions
498516
)));
499517
}
500-
query_allowances_received(deps, spender, page.unwrap_or(0), page_size)
518+
query_allowances_received(deps, account, page.unwrap_or(0), page_size)
501519
}
502520
}
503521
}
@@ -2664,6 +2682,93 @@ mod tests {
26642682
permit
26652683
}
26662684

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+
26672772
#[test]
26682773
fn test_permit_revoke() {
26692774
let user_address = "secret1kmgdagt5efcz2kku0ak9ezfgntg29g2vr88q0e";

0 commit comments

Comments
 (0)