@mnemopay/sdk 0.3.0 → 0.4.1

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.
@@ -0,0 +1,544 @@
1
+ "use strict";
2
+ /**
3
+ * MnemoPay Advanced Fraud Detection — ML-grade algorithms in pure TypeScript.
4
+ *
5
+ * Three systems that close the depth gap with Stripe/Coinbase:
6
+ *
7
+ * 1. IsolationForest — Adaptive anomaly detection that LEARNS each agent's
8
+ * normal behavior and catches deviations. Replaces static z-scores.
9
+ *
10
+ * 2. TransactionGraph — Directed graph of money flows between agents.
11
+ * Detects wash trading (A→B→A cycles), fraud rings (dense subgraphs),
12
+ * and sybil attacks (correlated agents from same source).
13
+ *
14
+ * 3. BehaviorProfile — Fingerprints each agent's behavioral signature:
15
+ * typical amounts, timing patterns, charge frequency, memory-to-payment
16
+ * ratio. Detects drift from established baseline.
17
+ *
18
+ * Zero external dependencies. Runs in-process alongside FraudGuard.
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.BehaviorProfile = exports.TransactionGraph = exports.IsolationForest = void 0;
22
+ class IsolationForest {
23
+ trees = [];
24
+ numTrees;
25
+ maxSamples;
26
+ maxDepth;
27
+ /** Training data buffer — keeps recent samples for incremental retraining */
28
+ buffer = [];
29
+ bufferSize;
30
+ featureNames;
31
+ constructor(opts) {
32
+ this.numTrees = opts?.numTrees ?? 50;
33
+ this.maxSamples = opts?.maxSamples ?? 256;
34
+ this.maxDepth = Math.ceil(Math.log2(this.maxSamples));
35
+ this.bufferSize = opts?.bufferSize ?? 1000;
36
+ this.featureNames = [
37
+ "amount", "hourOfDay", "minutesSinceLast", "chargesLast10Min",
38
+ "avgAmountLast10", "stdDevLast10", "pendingCount", "reputation",
39
+ ];
40
+ }
41
+ /** Number of features expected per sample */
42
+ get numFeatures() { return this.featureNames.length; }
43
+ /**
44
+ * Add a sample and retrain if buffer is full enough.
45
+ * Features: [amount, hourOfDay, minutesSinceLast, chargesLast10Min,
46
+ * avgAmountLast10, stdDevLast10, pendingCount, reputation]
47
+ */
48
+ addSample(features) {
49
+ this.buffer.push(features);
50
+ if (this.buffer.length > this.bufferSize) {
51
+ this.buffer = this.buffer.slice(-this.bufferSize);
52
+ }
53
+ // Retrain after collecting enough samples
54
+ if (this.buffer.length >= 20 && (this.trees.length === 0 || this.buffer.length % 50 === 0)) {
55
+ this.train();
56
+ }
57
+ }
58
+ /** Train forest from buffer */
59
+ train() {
60
+ this.trees = [];
61
+ for (let t = 0; t < this.numTrees; t++) {
62
+ const sample = this.subsample(this.buffer, Math.min(this.maxSamples, this.buffer.length));
63
+ this.trees.push(this.buildTree(sample, 0));
64
+ }
65
+ }
66
+ /** Build a single isolation tree */
67
+ buildTree(data, depth) {
68
+ if (depth >= this.maxDepth || data.length <= 1) {
69
+ return { splitFeature: 0, splitValue: 0, left: null, right: null, size: data.length };
70
+ }
71
+ const numFeatures = data[0].length;
72
+ const feature = Math.floor(Math.random() * numFeatures);
73
+ // Find min/max for this feature
74
+ let min = Infinity, max = -Infinity;
75
+ for (const row of data) {
76
+ if (row[feature] < min)
77
+ min = row[feature];
78
+ if (row[feature] > max)
79
+ max = row[feature];
80
+ }
81
+ if (min === max) {
82
+ return { splitFeature: feature, splitValue: min, left: null, right: null, size: data.length };
83
+ }
84
+ const splitValue = min + Math.random() * (max - min);
85
+ const left = [];
86
+ const right = [];
87
+ for (const row of data) {
88
+ if (row[feature] < splitValue)
89
+ left.push(row);
90
+ else
91
+ right.push(row);
92
+ }
93
+ return {
94
+ splitFeature: feature,
95
+ splitValue,
96
+ left: left.length > 0 ? this.buildTree(left, depth + 1) : null,
97
+ right: right.length > 0 ? this.buildTree(right, depth + 1) : null,
98
+ size: data.length,
99
+ };
100
+ }
101
+ /**
102
+ * Score a sample. Returns 0-1 where higher = more anomalous.
103
+ * Returns -1 if not enough training data yet.
104
+ */
105
+ score(features) {
106
+ if (this.trees.length === 0)
107
+ return -1;
108
+ let totalPathLength = 0;
109
+ for (const tree of this.trees) {
110
+ totalPathLength += this.pathLength(features, tree, 0);
111
+ }
112
+ const avgPath = totalPathLength / this.trees.length;
113
+ const n = Math.min(this.buffer.length, this.maxSamples);
114
+ const c = this.avgPathLength(n);
115
+ // Anomaly score: s(x, n) = 2^(-avgPath / c(n))
116
+ return Math.pow(2, -avgPath / c);
117
+ }
118
+ /** Traverse tree and return path length to isolation */
119
+ pathLength(features, node, depth) {
120
+ if (!node.left && !node.right) {
121
+ return depth + this.avgPathLength(node.size);
122
+ }
123
+ if (features[node.splitFeature] < node.splitValue) {
124
+ return node.left ? this.pathLength(features, node.left, depth + 1) : depth + 1;
125
+ }
126
+ return node.right ? this.pathLength(features, node.right, depth + 1) : depth + 1;
127
+ }
128
+ /** Average path length of unsuccessful search in BST (used for normalization) */
129
+ avgPathLength(n) {
130
+ if (n <= 1)
131
+ return 0;
132
+ if (n === 2)
133
+ return 1;
134
+ const H = Math.log(n - 1) + 0.5772156649; // Euler-Mascheroni constant
135
+ return 2 * H - (2 * (n - 1) / n);
136
+ }
137
+ /** Random subsample without replacement */
138
+ subsample(data, size) {
139
+ const copy = [...data];
140
+ for (let i = copy.length - 1; i > 0; i--) {
141
+ const j = Math.floor(Math.random() * (i + 1));
142
+ [copy[i], copy[j]] = [copy[j], copy[i]];
143
+ }
144
+ return copy.slice(0, size);
145
+ }
146
+ /** Has enough data to score */
147
+ get isReady() {
148
+ return this.trees.length > 0;
149
+ }
150
+ get sampleCount() {
151
+ return this.buffer.length;
152
+ }
153
+ // ── Serialization ──────────────────────────────────────────────────────
154
+ serialize() {
155
+ return JSON.stringify({ trees: this.trees, buffer: this.buffer });
156
+ }
157
+ static deserialize(json, opts) {
158
+ const forest = new IsolationForest(opts);
159
+ try {
160
+ const data = JSON.parse(json);
161
+ if (data.trees)
162
+ forest.trees = data.trees;
163
+ if (data.buffer)
164
+ forest.buffer = data.buffer;
165
+ }
166
+ catch { }
167
+ return forest;
168
+ }
169
+ }
170
+ exports.IsolationForest = IsolationForest;
171
+ class TransactionGraph {
172
+ /** Adjacency list: agent → list of outgoing edges */
173
+ edges = new Map();
174
+ /** Agent metadata: IP, creation time, etc. */
175
+ agentMeta = new Map();
176
+ /** Total edge count */
177
+ edgeCount = 0;
178
+ /**
179
+ * Record a transaction between two agents.
180
+ * fromAgent paid toAgent.
181
+ */
182
+ addTransaction(fromAgent, toAgent, amount, txId) {
183
+ const edge = { from: fromAgent, to: toAgent, amount, timestamp: Date.now(), txId };
184
+ const list = this.edges.get(fromAgent) || [];
185
+ list.push(edge);
186
+ this.edges.set(fromAgent, list);
187
+ this.edgeCount++;
188
+ // Ensure both nodes exist
189
+ if (!this.edges.has(toAgent))
190
+ this.edges.set(toAgent, []);
191
+ }
192
+ /** Register agent metadata for sybil detection */
193
+ registerAgent(agentId, ip) {
194
+ const meta = this.agentMeta.get(agentId) || { ips: new Set(), createdAt: Date.now() };
195
+ if (ip)
196
+ meta.ips.add(ip);
197
+ this.agentMeta.set(agentId, meta);
198
+ }
199
+ /**
200
+ * Detect wash trading: cycles where money flows A→B→...→A.
201
+ * Returns cycles of length 2-4 (direct and indirect wash trading).
202
+ */
203
+ detectWashTrading(maxCycleLength = 4) {
204
+ const signals = [];
205
+ const recentCutoff = Date.now() - 24 * 3_600_000; // Last 24h
206
+ for (const [startAgent] of this.edges) {
207
+ this.findCycles(startAgent, [startAgent], maxCycleLength, recentCutoff, signals);
208
+ }
209
+ // Deduplicate by sorting agent sets
210
+ const seen = new Set();
211
+ return signals.filter((s) => {
212
+ const key = [...s.agents].sort().join(",");
213
+ if (seen.has(key))
214
+ return false;
215
+ seen.add(key);
216
+ return true;
217
+ });
218
+ }
219
+ findCycles(current, path, maxLen, cutoff, signals) {
220
+ if (path.length > maxLen)
221
+ return;
222
+ const edges = this.edges.get(current) || [];
223
+ for (const edge of edges) {
224
+ if (edge.timestamp < cutoff)
225
+ continue;
226
+ if (edge.to === path[0] && path.length >= 2) {
227
+ // Found a cycle
228
+ const totalFlow = this.getCycleFlow(path, cutoff);
229
+ signals.push({
230
+ type: "wash_trading",
231
+ agents: [...path],
232
+ evidence: `Cycle detected: ${path.join(" → ")} → ${path[0]}. Flow: $${totalFlow.toFixed(2)} in last 24h`,
233
+ severity: Math.min(0.3 + path.length * 0.15 + totalFlow * 0.002, 1.0),
234
+ });
235
+ return;
236
+ }
237
+ if (!path.includes(edge.to)) {
238
+ this.findCycles(edge.to, [...path, edge.to], maxLen, cutoff, signals);
239
+ }
240
+ }
241
+ }
242
+ getCycleFlow(path, cutoff) {
243
+ let total = 0;
244
+ for (let i = 0; i < path.length; i++) {
245
+ const from = path[i];
246
+ const to = path[(i + 1) % path.length];
247
+ const edges = this.edges.get(from) || [];
248
+ for (const e of edges) {
249
+ if (e.to === to && e.timestamp >= cutoff)
250
+ total += e.amount;
251
+ }
252
+ }
253
+ return total;
254
+ }
255
+ /**
256
+ * Detect sybil clusters: multiple agents sharing the same IP(s)
257
+ * that also transact with each other.
258
+ */
259
+ detectSybilClusters() {
260
+ const signals = [];
261
+ // Group agents by shared IPs
262
+ const ipToAgents = new Map();
263
+ for (const [agentId, meta] of this.agentMeta) {
264
+ for (const ip of meta.ips) {
265
+ const agents = ipToAgents.get(ip) || [];
266
+ agents.push(agentId);
267
+ ipToAgents.set(ip, agents);
268
+ }
269
+ }
270
+ // Find IPs with multiple agents that transact with each other
271
+ for (const [ip, agents] of ipToAgents) {
272
+ if (agents.length < 2)
273
+ continue;
274
+ // Check if these agents transact with each other
275
+ let internalTxCount = 0;
276
+ for (const a of agents) {
277
+ const edges = this.edges.get(a) || [];
278
+ for (const e of edges) {
279
+ if (agents.includes(e.to))
280
+ internalTxCount++;
281
+ }
282
+ }
283
+ if (internalTxCount > 0) {
284
+ signals.push({
285
+ type: "sybil_cluster",
286
+ agents,
287
+ evidence: `${agents.length} agents sharing IP ${ip.slice(0, 8)}... with ${internalTxCount} internal transactions`,
288
+ severity: Math.min(0.4 + agents.length * 0.1 + internalTxCount * 0.05, 1.0),
289
+ });
290
+ }
291
+ }
292
+ return signals;
293
+ }
294
+ /**
295
+ * Detect self-dealing: agent transacting with itself via intermediaries.
296
+ * A→X→A pattern where X is a thin shell.
297
+ */
298
+ detectSelfDealing() {
299
+ const signals = [];
300
+ const recentCutoff = Date.now() - 24 * 3_600_000;
301
+ for (const [agent, outEdges] of this.edges) {
302
+ // Find all agents this one has paid recently
303
+ const paidTo = new Set();
304
+ for (const e of outEdges) {
305
+ if (e.timestamp >= recentCutoff)
306
+ paidTo.add(e.to);
307
+ }
308
+ // Check if any of those agents paid back
309
+ for (const target of paidTo) {
310
+ if (target === agent)
311
+ continue;
312
+ const targetEdges = this.edges.get(target) || [];
313
+ const paybacks = targetEdges.filter((e) => e.to === agent && e.timestamp >= recentCutoff);
314
+ if (paybacks.length > 0) {
315
+ const outFlow = outEdges.filter((e) => e.to === target && e.timestamp >= recentCutoff)
316
+ .reduce((s, e) => s + e.amount, 0);
317
+ const backFlow = paybacks.reduce((s, e) => s + e.amount, 0);
318
+ // If back-flow is >50% of out-flow, likely self-dealing
319
+ if (backFlow > outFlow * 0.5) {
320
+ signals.push({
321
+ type: "self_dealing",
322
+ agents: [agent, target],
323
+ evidence: `${agent} sent $${outFlow.toFixed(2)} to ${target}, got $${backFlow.toFixed(2)} back (${Math.round(backFlow / outFlow * 100)}% return)`,
324
+ severity: Math.min(0.5 + (backFlow / outFlow) * 0.3, 1.0),
325
+ });
326
+ }
327
+ }
328
+ }
329
+ }
330
+ // Deduplicate
331
+ const seen = new Set();
332
+ return signals.filter((s) => {
333
+ const key = [...s.agents].sort().join(",");
334
+ if (seen.has(key))
335
+ return false;
336
+ seen.add(key);
337
+ return true;
338
+ });
339
+ }
340
+ /**
341
+ * Run all collusion detectors and return combined signals.
342
+ */
343
+ detectAll() {
344
+ return [
345
+ ...this.detectWashTrading(),
346
+ ...this.detectSybilClusters(),
347
+ ...this.detectSelfDealing(),
348
+ ];
349
+ }
350
+ /** Get graph stats */
351
+ stats() {
352
+ const agents = this.edges.size;
353
+ const avgDegree = agents > 0 ? this.edgeCount / agents : 0;
354
+ return { agents, edges: this.edgeCount, avgDegree: Math.round(avgDegree * 100) / 100 };
355
+ }
356
+ // ── Serialization ──────────────────────────────────────────────────────
357
+ serialize() {
358
+ return JSON.stringify({
359
+ edges: Array.from(this.edges.entries()),
360
+ agentMeta: Array.from(this.agentMeta.entries()).map(([k, v]) => [k, { ips: Array.from(v.ips), createdAt: v.createdAt }]),
361
+ edgeCount: this.edgeCount,
362
+ });
363
+ }
364
+ static deserialize(json) {
365
+ const graph = new TransactionGraph();
366
+ try {
367
+ const data = JSON.parse(json);
368
+ if (data.edges)
369
+ graph.edges = new Map(data.edges);
370
+ if (data.agentMeta) {
371
+ graph.agentMeta = new Map(data.agentMeta.map(([k, v]) => [k, { ips: new Set(v.ips), createdAt: v.createdAt }]));
372
+ }
373
+ if (data.edgeCount)
374
+ graph.edgeCount = data.edgeCount;
375
+ }
376
+ catch { }
377
+ return graph;
378
+ }
379
+ }
380
+ exports.TransactionGraph = TransactionGraph;
381
+ class BehaviorProfile {
382
+ /** Per-agent behavior history */
383
+ agentEvents = new Map();
384
+ /** Per-agent baseline snapshots */
385
+ baselines = new Map();
386
+ /** Minimum events before baseline is established */
387
+ minEvents;
388
+ /** Max events to retain per agent */
389
+ maxEvents;
390
+ constructor(opts) {
391
+ this.minEvents = opts?.minEvents ?? 15;
392
+ this.maxEvents = opts?.maxEvents ?? 2000;
393
+ }
394
+ /** Record an event for an agent */
395
+ recordEvent(agentId, type, amount) {
396
+ const events = this.agentEvents.get(agentId) || [];
397
+ events.push({ type, amount, timestamp: Date.now() });
398
+ if (events.length > this.maxEvents) {
399
+ events.splice(0, events.length - this.maxEvents);
400
+ }
401
+ this.agentEvents.set(agentId, events);
402
+ // Rebuild baseline periodically
403
+ if (events.length >= this.minEvents && events.length % 10 === 0) {
404
+ this.buildBaseline(agentId);
405
+ }
406
+ }
407
+ /** Build/update baseline from historical events */
408
+ buildBaseline(agentId) {
409
+ const events = this.agentEvents.get(agentId);
410
+ if (!events || events.length < this.minEvents)
411
+ return;
412
+ const charges = events.filter((e) => e.type === "charge" && e.amount !== undefined);
413
+ const memoryOps = events.filter((e) => e.type === "remember" || e.type === "recall");
414
+ const paymentOps = events.filter((e) => e.type === "charge" || e.type === "settle" || e.type === "refund");
415
+ if (charges.length < 5)
416
+ return;
417
+ const amounts = charges.map((e) => e.amount);
418
+ const avgAmount = amounts.reduce((s, a) => s + a, 0) / amounts.length;
419
+ const stdAmount = Math.sqrt(amounts.reduce((s, a) => s + (a - avgAmount) ** 2, 0) / amounts.length);
420
+ // Peak hour
421
+ const hourCounts = new Array(24).fill(0);
422
+ for (const e of events) {
423
+ hourCounts[new Date(e.timestamp).getHours()]++;
424
+ }
425
+ const peakHour = hourCounts.indexOf(Math.max(...hourCounts));
426
+ // Average interval between charges
427
+ const chargeTimes = charges.map((e) => e.timestamp).sort();
428
+ let intervalSum = 0;
429
+ for (let i = 1; i < chargeTimes.length; i++) {
430
+ intervalSum += chargeTimes[i] - chargeTimes[i - 1];
431
+ }
432
+ const avgInterval = chargeTimes.length > 1 ? intervalSum / (chargeTimes.length - 1) / 60_000 : 0;
433
+ // Memory to payment ratio
434
+ const memoryToPaymentRatio = paymentOps.length > 0 ? memoryOps.length / paymentOps.length : 0;
435
+ // Charges per day
436
+ const firstEvent = events[0].timestamp;
437
+ const daySpan = Math.max((Date.now() - firstEvent) / 86_400_000, 1);
438
+ const chargesPerDay = charges.length / daySpan;
439
+ this.baselines.set(agentId, {
440
+ avgAmount,
441
+ stdAmount,
442
+ peakHour,
443
+ avgInterval,
444
+ memoryToPaymentRatio,
445
+ chargesPerDay,
446
+ sampleCount: events.length,
447
+ updatedAt: Date.now(),
448
+ });
449
+ }
450
+ /**
451
+ * Check if current behavior drifts from baseline.
452
+ * Pass recent charge amount and context.
453
+ */
454
+ detectDrift(agentId, currentAmount) {
455
+ const baseline = this.baselines.get(agentId);
456
+ if (!baseline)
457
+ return []; // No baseline yet
458
+ const signals = [];
459
+ const events = this.agentEvents.get(agentId) || [];
460
+ const recentEvents = events.filter((e) => Date.now() - e.timestamp < 3_600_000); // Last hour
461
+ // 1. Amount drift
462
+ if (currentAmount !== undefined && baseline.stdAmount > 0) {
463
+ const zScore = Math.abs(currentAmount - baseline.avgAmount) / baseline.stdAmount;
464
+ if (zScore > 2.5) {
465
+ signals.push({
466
+ type: "amount_drift",
467
+ description: `Charge $${currentAmount.toFixed(2)} is ${zScore.toFixed(1)}σ from baseline avg $${baseline.avgAmount.toFixed(2)}`,
468
+ deviation: zScore,
469
+ severity: Math.min(0.2 + zScore * 0.15, 0.9),
470
+ });
471
+ }
472
+ }
473
+ // 2. Timing drift — activity outside normal hours
474
+ const currentHour = new Date().getHours();
475
+ const hourDiff = Math.min(Math.abs(currentHour - baseline.peakHour), 24 - Math.abs(currentHour - baseline.peakHour));
476
+ if (hourDiff >= 8 && events.length > 30) {
477
+ signals.push({
478
+ type: "timing_drift",
479
+ description: `Activity at ${currentHour}:00, usual peak is ${baseline.peakHour}:00 (${hourDiff}h off)`,
480
+ deviation: hourDiff / 12,
481
+ severity: Math.min(0.1 + hourDiff * 0.05, 0.5),
482
+ });
483
+ }
484
+ // 3. Frequency drift — sudden burst vs normal pace
485
+ const recentCharges = recentEvents.filter((e) => e.type === "charge");
486
+ if (baseline.chargesPerDay > 0 && recentCharges.length > 0) {
487
+ const expectedPerHour = baseline.chargesPerDay / 24;
488
+ const actualPerHour = recentCharges.length;
489
+ if (expectedPerHour > 0 && actualPerHour > expectedPerHour * 5) {
490
+ signals.push({
491
+ type: "frequency_drift",
492
+ description: `${actualPerHour} charges/hour vs baseline ${expectedPerHour.toFixed(1)}/hour (${(actualPerHour / expectedPerHour).toFixed(0)}x normal)`,
493
+ deviation: actualPerHour / expectedPerHour,
494
+ severity: Math.min(0.3 + (actualPerHour / expectedPerHour) * 0.05, 0.8),
495
+ });
496
+ }
497
+ }
498
+ // 4. Behavioral shift — memory/payment ratio changed
499
+ const recentMemory = recentEvents.filter((e) => e.type === "remember" || e.type === "recall").length;
500
+ const recentPayment = recentEvents.filter((e) => e.type === "charge" || e.type === "settle" || e.type === "refund").length;
501
+ if (baseline.memoryToPaymentRatio > 0 && recentPayment > 3) {
502
+ const currentRatio = recentMemory / recentPayment;
503
+ const ratioDiff = Math.abs(currentRatio - baseline.memoryToPaymentRatio) / Math.max(baseline.memoryToPaymentRatio, 0.1);
504
+ if (ratioDiff > 3) {
505
+ signals.push({
506
+ type: "behavior_shift",
507
+ description: `Memory/payment ratio shifted: ${currentRatio.toFixed(1)} vs baseline ${baseline.memoryToPaymentRatio.toFixed(1)}`,
508
+ deviation: ratioDiff,
509
+ severity: Math.min(0.2 + ratioDiff * 0.1, 0.6),
510
+ });
511
+ }
512
+ }
513
+ return signals;
514
+ }
515
+ /** Get an agent's current baseline (if established) */
516
+ getBaseline(agentId) {
517
+ return this.baselines.get(agentId);
518
+ }
519
+ /** Check if agent has established baseline */
520
+ hasBaseline(agentId) {
521
+ return this.baselines.has(agentId);
522
+ }
523
+ // ── Serialization ──────────────────────────────────────────────────────
524
+ serialize() {
525
+ return JSON.stringify({
526
+ agentEvents: Array.from(this.agentEvents.entries()),
527
+ baselines: Array.from(this.baselines.entries()),
528
+ });
529
+ }
530
+ static deserialize(json, opts) {
531
+ const profile = new BehaviorProfile(opts);
532
+ try {
533
+ const data = JSON.parse(json);
534
+ if (data.agentEvents)
535
+ profile.agentEvents = new Map(data.agentEvents);
536
+ if (data.baselines)
537
+ profile.baselines = new Map(data.baselines);
538
+ }
539
+ catch { }
540
+ return profile;
541
+ }
542
+ }
543
+ exports.BehaviorProfile = BehaviorProfile;
544
+ //# sourceMappingURL=fraud-ml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fraud-ml.js","sourceRoot":"","sources":["../src/fraud-ml.ts"],"names":[],"mappings":"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"}