diff --git a/backend/prisma/seed.ts b/backend/prisma/seed.ts index ccf856aa..a1d7f0fd 100644 --- a/backend/prisma/seed.ts +++ b/backend/prisma/seed.ts @@ -54,13 +54,22 @@ async function main() { console.log({ stream1 }); - // Create an example event - const event1 = await prisma.streamEvent.create({ - data: { + // Upsert an example event – keyed on the @@unique([transactionHash, eventType]) + // constraint so re-running the seed never creates duplicate rows. + const DEMO_TX_HASH = '6f7e8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r'; + const event1 = await prisma.streamEvent.upsert({ + where: { + transactionHash_eventType: { + transactionHash: DEMO_TX_HASH, + eventType: 'CREATED', + }, + }, + update: {}, + create: { streamId: stream1.streamId, eventType: 'CREATED', amount: '1000000000000', - transactionHash: '6f7e8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r', + transactionHash: DEMO_TX_HASH, ledgerSequence: 123456, timestamp: Math.floor(Date.now() / 1000), metadata: JSON.stringify({ memo: 'Seed data' }), diff --git a/backend/src/controllers/stream.controller.ts b/backend/src/controllers/stream.controller.ts index c453e67d..394c11ad 100644 --- a/backend/src/controllers/stream.controller.ts +++ b/backend/src/controllers/stream.controller.ts @@ -212,7 +212,7 @@ export const createStream = async (req: Request, res: Response) => { }, }); - return res.status(201).json(stream); + return res.status(201).json(JSON.parse(JSON.stringify(stream, (_key, value) => typeof value === "bigint" ? value.toString() : value))); } catch (error) { if ( error instanceof RangeError || diff --git a/backend/src/workers/soroban-event-worker.ts b/backend/src/workers/soroban-event-worker.ts index 45e74cd4..730c0a5f 100644 --- a/backend/src/workers/soroban-event-worker.ts +++ b/backend/src/workers/soroban-event-worker.ts @@ -1107,7 +1107,7 @@ export class SorobanEventWorker { } const sender = decodeAddress(body["sender"]); - const newEndTime = Number(decodeU64(body["new_end_time"])); + const newEndTime = decodeU64(body["new_end_time"]); const timestamp = Math.floor(Date.now() / 1000); await prisma.$transaction(async (tx: Prisma.TransactionClient) => { @@ -1164,7 +1164,7 @@ export class SorobanEventWorker { timestamp, metadata: JSON.stringify({ sender, - newEndTime, + newEndTime: newEndTime.toString(), pausedDuration: additionalPausedDuration, totalPausedDuration: newTotalPausedDuration, }), @@ -1180,7 +1180,7 @@ export class SorobanEventWorker { sseService.broadcastToStream(String(streamId), "stream.resumed", { streamId, sender, - newEndTime, + newEndTime: newEndTime.toString(), transactionHash: event.txHash, ledger: event.ledger, timestamp, diff --git a/backend/tests/stream.test.ts b/backend/tests/stream.test.ts index a9c5822e..13410543 100644 --- a/backend/tests/stream.test.ts +++ b/backend/tests/stream.test.ts @@ -65,8 +65,8 @@ describe('POST /v1/streams', () => { ratePerSecond: '100', depositedAmount: '86400', withdrawnAmount: '0', - startTime: 1700000000, - lastUpdateTime: 1700000000, + startTime: 1700000000n, + lastUpdateTime: 1700000000n, isPaused: false, pausedAt: null, totalPausedDuration: 0,