Skip to content
Open
Show file tree
Hide file tree
Changes from 9 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
5 changes: 5 additions & 0 deletions .changeset/warm-pandas-climb.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'mppx': minor
---

Added `onSessionSettlement` hook for visibility into on-chain session settlement transactions, with chain-agnostic context including trigger, txHash, channelId, cumulative amount, and incremental delta.
6 changes: 5 additions & 1 deletion src/tempo/server/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,9 @@ export * as Ws from '../session/server/Ws.js'
export { charge } from './Charge.js'
export { sessionLegacy, settleLegacy, tempo } from './Methods.js'
export { session, settle, settleBatch } from '../session/server/Session.js'
export type { SettlementSchedule } from '../session/server/Session.js'
export type {
OnSessionSettlement,
SessionSettlementContext,
SettlementSchedule,
} from '../session/server/Session.js'
export { renew as renewSubscription, subscription } from './Subscription.js'
19 changes: 18 additions & 1 deletion src/tempo/session/server/CredentialVerification.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ import {
import * as Voucher from '../precompile/Voucher.js'
import * as ChannelStore from './ChannelStore.js'
import { getChallengePaymentFields } from './RequestState.js'
import { assertSettlementSender, getClientAccount } from './Settlement.js'
import { assertSettlementSender, getClientAccount, type OnSessionSettlement } from './Settlement.js'

/** Returns the effective voucher signer for a TIP-1034 descriptor. */
export function authorizedSigner(descriptor: Channel.ChannelDescriptor): Address {
Expand Down Expand Up @@ -344,6 +344,8 @@ export type VerifyCredentialPayloadParameters = {
lastOnChainVerified: Map<Hex, number>
/** Minimum allowed voucher delta in raw units. */
minVoucherDelta: bigint
/** Callback invoked after an on-chain settlement or close transaction is confirmed. */
onSessionSettlement?: OnSessionSettlement | undefined
/** Discriminated session credential payload to verify. */
payload: SessionCredentialPayload
/** Server-side channel store. */
Expand Down Expand Up @@ -747,6 +749,21 @@ async function handleCloseCredential(
signature: payload.signature,
}),
)
if (parameters.onSessionSettlement && txHash) {
try {
await parameters.onSessionSettlement(
Object.freeze({
txHash,
channelId,
trigger: 'close' as const,
amount: settledToPayee,
delta: settledToPayee - state.settled,
}),
)
} catch {
// Errors are isolated — observers cannot break the settlement flow.
}
}
return createSessionReceipt({
challengeId: challenge.id,
channelId,
Expand Down
Loading
Loading