@unifiedflow/cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +85 -0
  2. package/dist/idl/unified_flow.json +1889 -0
  3. package/dist/index.d.ts +2 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +443 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/services/backfill.d.ts +2 -0
  8. package/dist/services/backfill.d.ts.map +1 -0
  9. package/dist/services/backfill.js +358 -0
  10. package/dist/services/backfill.js.map +1 -0
  11. package/dist/services/csvDiff.d.ts +68 -0
  12. package/dist/services/csvDiff.d.ts.map +1 -0
  13. package/dist/services/csvDiff.js +318 -0
  14. package/dist/services/csvDiff.js.map +1 -0
  15. package/dist/services/decoder.d.ts +3 -0
  16. package/dist/services/decoder.d.ts.map +1 -0
  17. package/dist/services/decoder.js +43 -0
  18. package/dist/services/decoder.js.map +1 -0
  19. package/dist/services/eventNormalizer.d.ts +63 -0
  20. package/dist/services/eventNormalizer.d.ts.map +1 -0
  21. package/dist/services/eventNormalizer.js +212 -0
  22. package/dist/services/eventNormalizer.js.map +1 -0
  23. package/dist/services/eventParser.d.ts +7 -0
  24. package/dist/services/eventParser.d.ts.map +1 -0
  25. package/dist/services/eventParser.js +130 -0
  26. package/dist/services/eventParser.js.map +1 -0
  27. package/dist/services/rpc.d.ts +10 -0
  28. package/dist/services/rpc.d.ts.map +1 -0
  29. package/dist/services/rpc.js +203 -0
  30. package/dist/services/rpc.js.map +1 -0
  31. package/dist/services/streamIndexer.d.ts +2 -0
  32. package/dist/services/streamIndexer.d.ts.map +1 -0
  33. package/dist/services/streamIndexer.js +367 -0
  34. package/dist/services/streamIndexer.js.map +1 -0
  35. package/package.json +42 -0
@@ -0,0 +1,358 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.backfill = backfill;
7
+ const dotenv_1 = __importDefault(require("dotenv"));
8
+ const web3_js_1 = require("@solana/web3.js");
9
+ const rpc_1 = require("./rpc");
10
+ const prisma_1 = __importDefault(require("../db/prisma"));
11
+ const eventParser_1 = require("./eventParser");
12
+ const eventNormalizer_1 = require("./eventNormalizer");
13
+ dotenv_1.default.config();
14
+ const PROGRAM_ID = new web3_js_1.PublicKey(process.env.PROGRAM_ID);
15
+ async function backfill() {
16
+ console.log("Starting backfill...");
17
+ let before = undefined;
18
+ while (true) {
19
+ const signatures = await rpc_1.connection.getSignaturesForAddress(PROGRAM_ID, {
20
+ before,
21
+ limit: 100,
22
+ });
23
+ if (signatures.length === 0) {
24
+ break;
25
+ }
26
+ for (const sigInfo of signatures) {
27
+ try {
28
+ console.log("Backfill TX:", sigInfo.signature);
29
+ // =========================
30
+ // SKIP EXISTING
31
+ // =========================
32
+ const existing = await prisma_1.default.transaction.findUnique({
33
+ where: { signature: sigInfo.signature },
34
+ });
35
+ if (existing) {
36
+ continue;
37
+ }
38
+ // =========================
39
+ // FETCH TX
40
+ // =========================
41
+ await new Promise((r) => setTimeout(r, 800));
42
+ const tx = await rpc_1.connection.getTransaction(sigInfo.signature, {
43
+ commitment: "confirmed",
44
+ maxSupportedTransactionVersion: 0,
45
+ });
46
+ if (!tx) {
47
+ continue;
48
+ }
49
+ const logs = tx.meta?.logMessages || [];
50
+ // =========================
51
+ // PARSE EVENTS
52
+ // =========================
53
+ const events = (0, eventParser_1.parseEventsSafely)(logs);
54
+ // =========================
55
+ // HANDLE EVENTS
56
+ // =========================
57
+ for (const event of events) {
58
+ if (event.name === "StreamCreated") {
59
+ await handleStreamCreated(event.data, tx, sigInfo.signature);
60
+ }
61
+ else if (event.name === "TokensClaimed") {
62
+ await handleTokensClaimed(event.data, tx, sigInfo.signature);
63
+ }
64
+ else if (event.name === "MilestoneUnlocked") {
65
+ await handleMilestoneUnlocked(event.data, tx, sigInfo.signature);
66
+ }
67
+ else if (event.name === "StreamCancelled") {
68
+ await handleStreamCancelled(event.data, tx, sigInfo.signature);
69
+ }
70
+ else if (event.name === "MilestoneEdited") {
71
+ await handleMilestoneEdited(event.data, tx, sigInfo.signature);
72
+ }
73
+ else if (event.name === "LinearEdited") {
74
+ await handleLinearEdited(event.data, tx, sigInfo.signature);
75
+ }
76
+ else if (event.name === "CliffEdited") {
77
+ await handleCliffEdited(event.data, tx, sigInfo.signature);
78
+ }
79
+ }
80
+ }
81
+ catch (err) {
82
+ console.error(`Error in backfilling transaction ${sigInfo.signature}:`, err);
83
+ }
84
+ }
85
+ before = signatures[signatures.length - 1].signature;
86
+ }
87
+ console.log("Backfill completed");
88
+ }
89
+ async function handleStreamCreated(event, tx, signature) {
90
+ console.log("STREAM CREATED (BACKFILL):", event);
91
+ const normalized = (0, eventNormalizer_1.normalizeStreamCreated)(event);
92
+ if (!normalized) {
93
+ console.warn("Skipping StreamCreated event with missing fields:", event);
94
+ return;
95
+ }
96
+ const streamId = normalized.stream;
97
+ await prisma_1.default.stream.upsert({
98
+ where: { id: streamId },
99
+ update: {},
100
+ create: {
101
+ id: streamId,
102
+ creator: normalized.creator,
103
+ recipient: normalized.recipient,
104
+ mint: normalized.mint,
105
+ vault: normalized.vault,
106
+ totalAmount: normalized.totalAmount,
107
+ withdrawn: BigInt(0),
108
+ startTs: normalized.startTs,
109
+ cliffTs: normalized.cliffTs,
110
+ endTs: normalized.endTs,
111
+ vestingType: normalized.vestingType,
112
+ status: 1, // ACTIVE
113
+ cancelable: normalized.cancelable,
114
+ milestoneCount: normalized.milestoneCount,
115
+ nonce: normalized.nonce,
116
+ bump: 0,
117
+ }
118
+ });
119
+ await prisma_1.default.transaction.upsert({
120
+ where: { signature },
121
+ update: {},
122
+ create: {
123
+ id: signature,
124
+ signature,
125
+ slot: BigInt(tx.slot),
126
+ streamId: streamId,
127
+ type: "CREATE_STREAM",
128
+ raw: JSON.parse(JSON.stringify(tx)),
129
+ },
130
+ });
131
+ console.log("Backfilled stream:", streamId);
132
+ }
133
+ async function handleTokensClaimed(event, tx, signature) {
134
+ console.log("TOKENS CLAIMED (BACKFILL):", event);
135
+ const normalized = (0, eventNormalizer_1.normalizeTokensClaimed)(event);
136
+ if (!normalized) {
137
+ console.warn("Skipping TokensClaimed event with missing fields:", event);
138
+ return;
139
+ }
140
+ const streamId = normalized.stream;
141
+ const withdrawnTotal = normalized.withdrawnTotal;
142
+ // Fetch stream totalAmount to check if it's completed
143
+ const stream = await prisma_1.default.stream.findUnique({
144
+ where: { id: streamId }
145
+ });
146
+ if (stream) {
147
+ let newStatus = 1; // ACTIVE
148
+ if (withdrawnTotal >= stream.totalAmount) {
149
+ newStatus = 2; // COMPLETED
150
+ }
151
+ await prisma_1.default.stream.update({
152
+ where: { id: streamId },
153
+ data: {
154
+ withdrawn: withdrawnTotal,
155
+ status: newStatus
156
+ }
157
+ });
158
+ }
159
+ else {
160
+ console.log(`Stream ${streamId} not found in database, skipping balance update.`);
161
+ }
162
+ await prisma_1.default.transaction.upsert({
163
+ where: { signature },
164
+ update: {},
165
+ create: {
166
+ id: signature,
167
+ signature,
168
+ slot: BigInt(tx.slot),
169
+ streamId: stream ? streamId : null,
170
+ type: "WITHDRAW",
171
+ raw: JSON.parse(JSON.stringify(tx)),
172
+ }
173
+ });
174
+ console.log(`Backfilled withdrawal for stream ${streamId}: ${normalized.claimable.toString()} tokens`);
175
+ }
176
+ async function handleMilestoneUnlocked(event, tx, signature) {
177
+ console.log("MILESTONE UNLOCKED (BACKFILL):", event);
178
+ const normalized = (0, eventNormalizer_1.normalizeMilestoneUnlocked)(event);
179
+ if (!normalized) {
180
+ console.warn("Skipping MilestoneUnlocked event with missing fields:", event);
181
+ return;
182
+ }
183
+ const streamId = normalized.stream;
184
+ const milestoneAmount = normalized.amount;
185
+ const unlockTs = normalized.unlockTs;
186
+ const completionTs = unlockTs ?? (tx.blockTime !== null && tx.blockTime !== undefined ? BigInt(tx.blockTime) : null);
187
+ // Fetch stream to update its unlockedAmount
188
+ const stream = await prisma_1.default.stream.findUnique({
189
+ where: { id: streamId }
190
+ });
191
+ if (stream) {
192
+ const currentUnlocked = stream.unlockedAmount || BigInt(0);
193
+ const updatedUnlocked = currentUnlocked + milestoneAmount;
194
+ const completed = updatedUnlocked >= stream.totalAmount;
195
+ await prisma_1.default.stream.update({
196
+ where: { id: streamId },
197
+ data: {
198
+ unlockedAmount: updatedUnlocked,
199
+ status: completed ? 2 : stream.status,
200
+ completedAt: completed && completionTs !== null ? completionTs : stream.completedAt,
201
+ }
202
+ });
203
+ }
204
+ else {
205
+ console.log(`Stream ${streamId} not found in database during milestone unlock, skipping.`);
206
+ }
207
+ await prisma_1.default.transaction.upsert({
208
+ where: { signature },
209
+ update: {},
210
+ create: {
211
+ id: signature,
212
+ signature,
213
+ slot: BigInt(tx.slot),
214
+ streamId: stream ? streamId : null,
215
+ type: "MILESTONE_UNLOCKED",
216
+ raw: JSON.parse(JSON.stringify(tx)),
217
+ }
218
+ });
219
+ console.log(`Backfilled milestone unlock for stream ${streamId}: unlocked ${milestoneAmount.toString()} tokens`);
220
+ }
221
+ async function handleStreamCancelled(event, tx, signature) {
222
+ console.log("STREAM CANCELLED (BACKFILL):", event);
223
+ const normalized = (0, eventNormalizer_1.normalizeStreamCancelled)(event);
224
+ if (!normalized) {
225
+ console.warn("Skipping StreamCancelled event with missing fields:", event);
226
+ return;
227
+ }
228
+ const streamId = normalized.stream;
229
+ const stream = await prisma_1.default.stream.findUnique({
230
+ where: { id: streamId }
231
+ });
232
+ if (stream) {
233
+ const nextWithdrawn = stream.withdrawn + normalized.claimableForRecipient;
234
+ await prisma_1.default.stream.update({
235
+ where: { id: streamId },
236
+ data: {
237
+ withdrawn: nextWithdrawn,
238
+ status: 3,
239
+ }
240
+ });
241
+ }
242
+ else {
243
+ console.log(`Stream ${streamId} not found in database, skipping cancel update.`);
244
+ }
245
+ await prisma_1.default.transaction.upsert({
246
+ where: { signature },
247
+ update: {},
248
+ create: {
249
+ id: signature,
250
+ signature,
251
+ slot: BigInt(tx.slot),
252
+ streamId: stream ? streamId : null,
253
+ type: "CANCEL",
254
+ raw: JSON.parse(JSON.stringify(tx)),
255
+ }
256
+ });
257
+ console.log(`Backfilled cancel for stream ${streamId}: vested ${normalized.vestedAmount.toString()} tokens`);
258
+ }
259
+ async function handleMilestoneEdited(event, tx, signature) {
260
+ console.log("MILESTONE EDITED (BACKFILL):", event);
261
+ const normalized = (0, eventNormalizer_1.normalizeMilestoneEdited)(event);
262
+ if (!normalized) {
263
+ console.warn("Skipping MilestoneEdited event with missing fields:", event);
264
+ return;
265
+ }
266
+ const streamId = normalized.stream;
267
+ const stream = await prisma_1.default.stream.findUnique({ where: { id: streamId } });
268
+ if (stream) {
269
+ const diff = normalized.newAmount - normalized.oldAmount;
270
+ const updatedTotal = stream.totalAmount + diff;
271
+ let milestonesArr = stream.milestones ? stream.milestones.split(";") : [];
272
+ while (milestonesArr.length <= normalized.index) {
273
+ milestonesArr.push("0");
274
+ }
275
+ milestonesArr[normalized.index] = normalized.newAmount.toString();
276
+ await prisma_1.default.stream.update({
277
+ where: { id: streamId },
278
+ data: {
279
+ totalAmount: updatedTotal,
280
+ milestones: milestonesArr.join(";"),
281
+ }
282
+ });
283
+ }
284
+ await prisma_1.default.transaction.upsert({
285
+ where: { signature },
286
+ update: {},
287
+ create: {
288
+ id: signature,
289
+ signature,
290
+ slot: BigInt(tx.slot),
291
+ streamId: stream ? streamId : null,
292
+ type: "MILESTONE_EDITED",
293
+ raw: JSON.parse(JSON.stringify(tx)),
294
+ }
295
+ });
296
+ }
297
+ async function handleLinearEdited(event, tx, signature) {
298
+ console.log("LINEAR EDITED (BACKFILL):", event);
299
+ const normalized = (0, eventNormalizer_1.normalizeLinearEdited)(event);
300
+ if (!normalized) {
301
+ console.warn("Skipping LinearEdited event with missing fields:", event);
302
+ return;
303
+ }
304
+ const streamId = normalized.stream;
305
+ const stream = await prisma_1.default.stream.findUnique({ where: { id: streamId } });
306
+ if (stream) {
307
+ await prisma_1.default.stream.update({
308
+ where: { id: streamId },
309
+ data: {
310
+ endTs: normalized.newEndTs,
311
+ totalAmount: normalized.newTotalAmount,
312
+ }
313
+ });
314
+ }
315
+ await prisma_1.default.transaction.upsert({
316
+ where: { signature },
317
+ update: {},
318
+ create: {
319
+ id: signature,
320
+ signature,
321
+ slot: BigInt(tx.slot),
322
+ streamId: stream ? streamId : null,
323
+ type: "LINEAR_EDITED",
324
+ raw: JSON.parse(JSON.stringify(tx)),
325
+ }
326
+ });
327
+ }
328
+ async function handleCliffEdited(event, tx, signature) {
329
+ console.log("CLIFF EDITED (BACKFILL):", event);
330
+ const normalized = (0, eventNormalizer_1.normalizeCliffEdited)(event);
331
+ if (!normalized) {
332
+ console.warn("Skipping CliffEdited event with missing fields:", event);
333
+ return;
334
+ }
335
+ const streamId = normalized.stream;
336
+ const stream = await prisma_1.default.stream.findUnique({ where: { id: streamId } });
337
+ if (stream) {
338
+ await prisma_1.default.stream.update({
339
+ where: { id: streamId },
340
+ data: {
341
+ cliffTs: normalized.newCliffTs,
342
+ }
343
+ });
344
+ }
345
+ await prisma_1.default.transaction.upsert({
346
+ where: { signature },
347
+ update: {},
348
+ create: {
349
+ id: signature,
350
+ signature,
351
+ slot: BigInt(tx.slot),
352
+ streamId: stream ? streamId : null,
353
+ type: "CLIFF_EDITED",
354
+ raw: JSON.parse(JSON.stringify(tx)),
355
+ }
356
+ });
357
+ }
358
+ //# sourceMappingURL=backfill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backfill.js","sourceRoot":"","sources":["../../src/services/backfill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ type CsvPrimitive = string | number | boolean | undefined;
2
+ export interface CsvRow {
3
+ id?: string;
4
+ recipient?: string;
5
+ creator?: string;
6
+ amount?: number;
7
+ mint?: string;
8
+ type?: number;
9
+ duration?: number;
10
+ cliffDuration?: number;
11
+ cancelable?: boolean;
12
+ milestones?: string;
13
+ }
14
+ type CsvDiffRecord = {
15
+ matchKey: string;
16
+ id?: string;
17
+ recipient: string;
18
+ amount: number;
19
+ mint: string;
20
+ type: number;
21
+ duration: number;
22
+ cliffDuration: number;
23
+ cancelable: boolean;
24
+ milestones: string;
25
+ creator?: string;
26
+ };
27
+ export interface DiffChange {
28
+ field: string;
29
+ oldVal: CsvPrimitive;
30
+ newVal: CsvPrimitive;
31
+ }
32
+ export interface DiffItem {
33
+ id: string;
34
+ recipient: string;
35
+ changes: DiffChange[];
36
+ details: {
37
+ creator?: string;
38
+ mint?: string;
39
+ type?: number;
40
+ amount?: number;
41
+ duration?: number;
42
+ cliffDuration?: number;
43
+ cancelable?: boolean;
44
+ milestones?: string;
45
+ };
46
+ }
47
+ export interface CsvDiffResult {
48
+ added: any[];
49
+ modified: DiffItem[];
50
+ deleted: any[];
51
+ unchanged: any[];
52
+ mode?: "create" | "edit";
53
+ }
54
+ export declare function buildExactRecordKey(record: Pick<CsvDiffRecord, "recipient" | "mint" | "type" | "amount" | "duration" | "cliffDuration" | "cancelable" | "milestones">): string;
55
+ /**
56
+ * Robust CSV parser that parses text into key-value objects, converting numeric and boolean fields appropriately.
57
+ */
58
+ export declare function parseCsvText(csvText: string): CsvRow[];
59
+ /**
60
+ * Compute the diff between incoming CSV rows and a set of reference rows.
61
+ */
62
+ export declare function computeCsvDiff(newRows: CsvRow[], refStreams: any[], mode: "create" | "edit"): CsvDiffResult;
63
+ /**
64
+ * Utility to map CSV rows into diff-friendly records.
65
+ */
66
+ export declare function mapCsvRowsToStreams(rows: CsvRow[]): any[];
67
+ export {};
68
+ //# sourceMappingURL=csvDiff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csvDiff.d.ts","sourceRoot":"","sources":["../../src/services/csvDiff.ts"],"names":[],"mappings":"AAAA,KAAK,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;AAE1D,MAAM,WAAW,MAAM;IACrB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,KAAK,aAAa,GAAG;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,OAAO,EAAE;QACP,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,GAAG,EAAE,CAAC;IACb,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,OAAO,EAAE,GAAG,EAAE,CAAC;IACf,SAAS,EAAE,GAAG,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;CAC1B;AAyED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,eAAe,GAAG,YAAY,GAAG,YAAY,CAAC,UAWrK;AAMD;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAiEtD;AAWD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EAAE,EACjB,UAAU,EAAE,GAAG,EAAE,EACjB,IAAI,EAAE,QAAQ,GAAG,MAAM,GACtB,aAAa,CA4Lf;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,EAAE,CAEzD"}