forked from StellarSplit/StellarSplit
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfees.rs
More file actions
48 lines (39 loc) · 1.33 KB
/
Copy pathfees.rs
File metadata and controls
48 lines (39 loc) · 1.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
use soroban_sdk::{token, Address, Env};
use crate::{errors::Error, events, storage};
const MAX_BPS: u32 = 10_000;
fn require_admin(env: &Env) -> Result<(), Error> {
if !storage::has_admin(env) {
return Err(Error::NotInitialized);
}
let admin = storage::get_admin(env);
admin.require_auth();
Ok(())
}
pub fn set_fee(env: &Env, fee_bps: u32) -> Result<(), Error> {
require_admin(env)?;
if fee_bps > MAX_BPS {
return Err(Error::InvalidFeeBps);
}
storage::set_fee_bps(env, fee_bps);
Ok(())
}
pub fn set_treasury(env: &Env, treasury: &Address) -> Result<(), Error> {
require_admin(env)?;
storage::set_treasury(env, treasury);
Ok(())
}
pub fn calculate_fee(total: i128, fee_bps: u32) -> i128 {
(total * fee_bps as i128) / MAX_BPS as i128
}
pub fn collect_fee(env: &Env, total: i128) -> Result<i128, Error> {
let fee_bps = storage::get_fee_bps(env);
let treasury = storage::get_treasury(env).ok_or(Error::TreasuryNotSet)?;
let fee_amount = calculate_fee(total, fee_bps);
if fee_amount > 0 {
let token = storage::get_token(env);
let token_client = token::Client::new(env, &token);
token_client.transfer(&env.current_contract_address(), &treasury, &fee_amount);
}
events::emit_fees_collected(env, fee_amount, &treasury);
Ok(fee_amount)
}