From 62fe472e3e279d210ba337c4a2443b9173bc4fc6 Mon Sep 17 00:00:00 2001 From: chainsmt Date: Mon, 31 Aug 2026 10:30:13 +0000 Subject: [PATCH] feat(stream): add total_streamed view method for UI parity --- contracts/stream/src/errors.rs | 3 +++ contracts/stream/src/lib.rs | 6 ++++++ contracts/stream/src/tests.rs | 8 ++++++++ frontend/src/streams.ts | 7 ++++++- 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/contracts/stream/src/errors.rs b/contracts/stream/src/errors.rs index c84f785e..01fd53c5 100644 --- a/contracts/stream/src/errors.rs +++ b/contracts/stream/src/errors.rs @@ -22,4 +22,7 @@ pub enum Error { ReentrancyForbidden = 16, OperatorAlreadySet = 17, NotInitialized = 18, + BackdatedStream = 19, + StreamUnderfunded = 20, + InvalidRecipient = 21, } diff --git a/contracts/stream/src/lib.rs b/contracts/stream/src/lib.rs index 81d5d290..d748edaa 100644 --- a/contracts/stream/src/lib.rs +++ b/contracts/stream/src/lib.rs @@ -744,6 +744,12 @@ impl DripStream { /// Useful for UIs that want to show "X streamed, Y withdrawn, Z remaining" /// without the caller needing to reimplement the rate × elapsed math. pub fn streamed_total(env: Env) -> i128 { + Self::total_streamed(env) + } + + /// Read-only alias for [`streamed_total`]: cumulative streamed amount at + /// the current ledger time, matching the on-chain `streamed_amount` math. + pub fn total_streamed(env: Env) -> i128 { let info = state::load(&env); if info.is_cancelled() { return 0; diff --git a/contracts/stream/src/tests.rs b/contracts/stream/src/tests.rs index f31834c5..a6dbfde4 100644 --- a/contracts/stream/src/tests.rs +++ b/contracts/stream/src/tests.rs @@ -123,6 +123,14 @@ fn withdraw_correct_after_elapsed() { assert_eq!(s.token.balance(&s.recipient), 10_000); } +#[test] +fn total_streamed_matches_streamed_total() { + let s = Setup::new(1_000, 3_600, false); + s.advance_secs(100); + assert_eq!(s.client.total_streamed(), 100_000); + assert_eq!(s.client.total_streamed(), s.client.streamed_total()); +} + #[test] fn withdraw_capped_at_available() { let s = Setup::new(100, 3600, false); diff --git a/frontend/src/streams.ts b/frontend/src/streams.ts index 65b4cdf3..18b92d41 100644 --- a/frontend/src/streams.ts +++ b/frontend/src/streams.ts @@ -251,7 +251,7 @@ export class StreamSDK { async getStreamedTotal(streamId: string): Promise { const result = await this.server.getContractData( streamId, - xdr.ScVal.scvSymbol('streamed_total') + xdr.ScVal.scvSymbol('total_streamed') ); if (result && result.val().i128) { @@ -259,4 +259,9 @@ export class StreamSDK { } return '0'; } + + /** Alias matching the on-chain `total_streamed()` view method. */ + async getTotalStreamed(streamId: string): Promise { + return this.getStreamedTotal(streamId); + } } \ No newline at end of file