Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 55 additions & 23 deletions payment_router/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,7 @@ impl PaymentRouter {
// whether they qualify for a volume-based fee discount.
let user_volume = Self::get_user_volume(env.clone(), sender.clone());
let effective_fee_bps = if user_volume > Self::VOLUME_THRESHOLD {
fee_bps / 2 // 50% discount
fee_bps / 2
} else {
fee_bps
};
Expand Down Expand Up @@ -349,16 +349,12 @@ impl PaymentRouter {
return Err(Error::LimitExceeded);
}

env.storage()
.persistent()
.set(&spending_key, &spending);
env.storage()
.persistent()
.extend_ttl(
&spending_key,
Self::PERSISTENT_LIFETIME_THRESHOLD,
Self::PERSISTENT_BUMP_AMOUNT,
);
env.storage().persistent().set(&spending_key, &spending);
env.storage().persistent().extend_ttl(
&spending_key,
Self::PERSISTENT_LIFETIME_THRESHOLD,
Self::PERSISTENT_BUMP_AMOUNT,
);

// 8. Initialize the token client
let token_client = token::Client::new(&env, &token_address);
Expand Down Expand Up @@ -393,23 +389,18 @@ impl PaymentRouter {
env.storage()
.persistent()
.set(&volume_key, &(prev_volume + amount));
env.storage()
.persistent()
.extend_ttl(
&volume_key,
Self::PERSISTENT_LIFETIME_THRESHOLD,
Self::PERSISTENT_BUMP_AMOUNT,
);

// Emit an event so indexers can track routed payments. Sender and
// recipient are topics (queryable/filterable by indexers), amount is
// the event data.
env.storage().persistent().extend_ttl(
&volume_key,
Self::PERSISTENT_LIFETIME_THRESHOLD,
Self::PERSISTENT_BUMP_AMOUNT,
);

// Sender/recipient as topics lets indexers filter routed payments by either address.
env.events().publish(
(symbol_short!("routed"), sender.clone(), recipient.clone()),
amount,
);

// Log success
log!(&env, "Platform fee routed to treasury");
log!(&env, "Remaining balance routed to recipient");

Expand Down Expand Up @@ -545,6 +536,47 @@ mod test {
assert_eq!(topic, symbol_short!("pause"));
}

#[test]
fn test_route_payment_emits_payment_initiated_event() {
let (env, client) = setup_env();

let admin = Address::generate(&env);
let treasury = Address::generate(&env);
let sender = Address::generate(&env);
let recipient = Address::generate(&env);

let (token_address, _token_client, _token_admin_client) = setup_token(&env);
let sac = soroban_sdk::token::StellarAssetClient::new(&env, &token_address);
sac.mint(&sender, &10_000);

client.initialize(&admin, &treasury, &100, &50);
client.add_supported_token(&token_address);

let amount = 2_000i128;
client.route_payment(&sender, &recipient, &token_address, &amount);

let events = env.events().all();
let mut found = None;
for evt in events.iter() {
let (_contract_id, topics, data) = evt.clone();
if topics.len() != 2 {
continue;
}
let topic0: Symbol = topics.get(0).unwrap().try_into_val(&env).unwrap();
if topic0 == Symbol::new(&env, "payment_initiated") {
found = Some((topics.clone(), data));
break;
}
}
let (topics, data) = found.expect("route_payment should publish a \"payment_initiated\" event");

let topic_sender: Address = topics.get(1).unwrap().try_into_val(&env).unwrap();
assert_eq!(topic_sender, sender);

let event_amount: i128 = data.try_into_val(&env).unwrap();
assert_eq!(event_amount, amount);
}

#[test]
fn test_route_payment_emits_routed_event() {
let (env, client) = setup_env();
Expand Down
Loading
Loading