Skip to content

Commit f9fd8fd

Browse files
authored
Merge pull request #27 from sshdopey/drips-contributions
feat(contract): add get_protocol_fee_view read-only view method
2 parents 0be87bf + 78ac838 commit f9fd8fd

2 files changed

Lines changed: 107 additions & 0 deletions

File tree

creator-keys/src/lib.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,18 @@ pub mod fee {
5353
}
5454
}
5555

56+
/// Stable, non-optional view of the protocol fee configuration.
57+
///
58+
/// Returned by [`CreatorKeysContract::get_protocol_fee_view`] for indexer-friendly consumption.
59+
/// When `is_configured` is `false`, both bps fields are `0` and no fee config has been stored.
60+
#[derive(Clone)]
61+
#[contracttype]
62+
pub struct ProtocolFeeView {
63+
pub creator_bps: u32,
64+
pub protocol_bps: u32,
65+
pub is_configured: bool,
66+
}
67+
5668
#[derive(Clone)]
5769
#[contracttype]
5870
pub enum DataKey {
@@ -164,6 +176,30 @@ impl CreatorKeysContract {
164176
env.storage().persistent().get(&DataKey::FeeConfig)
165177
}
166178

179+
/// Read-only view: returns the current protocol fee configuration.
180+
///
181+
/// Returns a stable [`ProtocolFeeView`] regardless of whether a fee config has been set.
182+
/// When no config is stored, `is_configured` is `false` and both bps fields are `0`.
183+
/// Use this method for indexers and read-only callers that need a non-optional result.
184+
pub fn get_protocol_fee_view(env: Env) -> ProtocolFeeView {
185+
match env
186+
.storage()
187+
.persistent()
188+
.get::<DataKey, fee::FeeConfig>(&DataKey::FeeConfig)
189+
{
190+
Some(config) => ProtocolFeeView {
191+
creator_bps: config.creator_bps,
192+
protocol_bps: config.protocol_bps,
193+
is_configured: true,
194+
},
195+
None => ProtocolFeeView {
196+
creator_bps: 0,
197+
protocol_bps: 0,
198+
is_configured: false,
199+
},
200+
}
201+
}
202+
167203
pub fn compute_fees_for_payment(env: Env, total: i128) -> (i128, i128) {
168204
let config: fee::FeeConfig = env
169205
.storage()
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
//! Tests for the get_protocol_fee_view read-only method (#19).
2+
3+
use creator_keys::{CreatorKeysContract, CreatorKeysContractClient};
4+
use soroban_sdk::{testutils::Address as _, Env};
5+
6+
#[test]
7+
fn test_get_protocol_fee_view_unconfigured_returns_defaults() {
8+
let env = Env::default();
9+
let contract_id = env.register(CreatorKeysContract, ());
10+
let client = CreatorKeysContractClient::new(&env, &contract_id);
11+
12+
let view = client.get_protocol_fee_view();
13+
assert!(!view.is_configured);
14+
assert_eq!(view.creator_bps, 0);
15+
assert_eq!(view.protocol_bps, 0);
16+
}
17+
18+
#[test]
19+
fn test_get_protocol_fee_view_returns_configured_values() {
20+
let env = Env::default();
21+
env.mock_all_auths();
22+
23+
let contract_id = env.register(CreatorKeysContract, ());
24+
let client = CreatorKeysContractClient::new(&env, &contract_id);
25+
let admin = soroban_sdk::Address::generate(&env);
26+
27+
client.set_fee_config(&admin, &9000u32, &1000u32);
28+
29+
let view = client.get_protocol_fee_view();
30+
assert!(view.is_configured);
31+
assert_eq!(view.creator_bps, 9000);
32+
assert_eq!(view.protocol_bps, 1000);
33+
}
34+
35+
#[test]
36+
fn test_get_protocol_fee_view_is_read_only() {
37+
let env = Env::default();
38+
env.mock_all_auths();
39+
40+
let contract_id = env.register(CreatorKeysContract, ());
41+
let client = CreatorKeysContractClient::new(&env, &contract_id);
42+
let admin = soroban_sdk::Address::generate(&env);
43+
44+
client.set_fee_config(&admin, &8000u32, &2000u32);
45+
46+
let v1 = client.get_protocol_fee_view();
47+
let v2 = client.get_protocol_fee_view();
48+
49+
assert_eq!(v1.creator_bps, v2.creator_bps);
50+
assert_eq!(v1.protocol_bps, v2.protocol_bps);
51+
assert_eq!(v1.is_configured, v2.is_configured);
52+
}
53+
54+
#[test]
55+
fn test_get_protocol_fee_view_updates_after_reconfiguration() {
56+
let env = Env::default();
57+
env.mock_all_auths();
58+
59+
let contract_id = env.register(CreatorKeysContract, ());
60+
let client = CreatorKeysContractClient::new(&env, &contract_id);
61+
let admin = soroban_sdk::Address::generate(&env);
62+
63+
client.set_fee_config(&admin, &9000u32, &1000u32);
64+
let v1 = client.get_protocol_fee_view();
65+
assert_eq!(v1.protocol_bps, 1000);
66+
67+
client.set_fee_config(&admin, &8000u32, &2000u32);
68+
let v2 = client.get_protocol_fee_view();
69+
assert_eq!(v2.protocol_bps, 2000);
70+
assert_eq!(v2.creator_bps, 8000);
71+
}

0 commit comments

Comments
 (0)