torch-liquidation-bot 2.0.0 → 2.0.2

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.
@@ -1,116 +0,0 @@
1
- "use strict";
2
- /**
3
- * wallet-profiler.ts — assesses wallet risk using SAID reputation + trade history.
4
- *
5
- * checks each borrower's trust tier and analyzes their trade messages
6
- * to determine if they tend to lose money (higher liquidation risk).
7
- *
8
- * profiles are cached in-memory with a cooldown to avoid hammering RPC.
9
- */
10
- Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.WalletProfiler = void 0;
12
- const torchsdk_1 = require("torchsdk");
13
- const utils_1 = require("./utils");
14
- const PROFILE_COOLDOWN_MS = 5 * 60 * 1000; // refresh profiles every 5 min
15
- const MAX_CACHE_AGE_MS = 30 * 60 * 1000; // evict entries older than 30 min
16
- const MAX_CACHE_SIZE = 1000; // hard cap on cache entries
17
- class WalletProfiler {
18
- constructor(log) {
19
- this.cache = new Map();
20
- this.log = log;
21
- }
22
- async profile(connection, address, mint) {
23
- this.evictStale();
24
- const cached = this.cache.get(address);
25
- if (cached && Date.now() - cached.lastUpdated < PROFILE_COOLDOWN_MS) {
26
- return cached;
27
- }
28
- this.log.debug(`profiling wallet ${address.slice(0, 8)}...`);
29
- // SAID reputation
30
- const said = await (0, torchsdk_1.verifySaid)(address);
31
- // trade history from messages
32
- const tradeStats = await this.analyzeTradeHistory(connection, mint, address);
33
- // compute wallet risk score (0-100)
34
- const riskScore = this.computeWalletRisk(said.trustTier, tradeStats);
35
- const profile = {
36
- address,
37
- saidVerified: said.verified,
38
- trustTier: said.trustTier,
39
- tradeStats,
40
- riskScore,
41
- lastUpdated: Date.now(),
42
- };
43
- this.cache.set(address, profile);
44
- return profile;
45
- }
46
- async analyzeTradeHistory(connection, mint, address) {
47
- try {
48
- const { messages } = await (0, torchsdk_1.getMessages)(connection, mint, 50);
49
- // filter messages from this wallet and analyze buy/sell patterns
50
- const walletMsgs = messages.filter((m) => m.sender === address);
51
- let wins = 0;
52
- let losses = 0;
53
- let netPnlSol = 0;
54
- for (const msg of walletMsgs) {
55
- const m = msg;
56
- if (m.pnl_sol !== undefined) {
57
- if (m.pnl_sol > 0)
58
- wins++;
59
- else
60
- losses++;
61
- netPnlSol += m.pnl_sol;
62
- }
63
- }
64
- const totalTrades = wins + losses;
65
- return {
66
- totalTrades,
67
- wins,
68
- losses,
69
- winRate: totalTrades > 0 ? wins / totalTrades : 0.5,
70
- netPnlSol,
71
- };
72
- }
73
- catch {
74
- // if we can't get trade history, assume neutral
75
- return { totalTrades: 0, wins: 0, losses: 0, winRate: 0.5, netPnlSol: 0 };
76
- }
77
- }
78
- computeWalletRisk(trustTier, stats) {
79
- // base risk from trust tier
80
- const tierRisk = {
81
- high: 10,
82
- medium: 40,
83
- low: 70,
84
- };
85
- let risk = tierRisk[trustTier ?? ''] ?? 50; // unverified = 50
86
- // modifier from trade history: bad traders are riskier
87
- if (stats.totalTrades > 0) {
88
- // low win rate increases risk, high win rate decreases it
89
- const winRateModifier = (0.5 - stats.winRate) * 40; // -20 to +20
90
- risk += winRateModifier;
91
- // net losses increase risk
92
- if (stats.netPnlSol < 0) {
93
- risk += Math.min(Math.abs(stats.netPnlSol) * 5, 20); // up to +20
94
- }
95
- }
96
- return (0, utils_1.clamp)(Math.round(risk), 0, 100);
97
- }
98
- evictStale() {
99
- const now = Date.now();
100
- for (const [key, profile] of this.cache) {
101
- if (now - profile.lastUpdated > MAX_CACHE_AGE_MS) {
102
- this.cache.delete(key);
103
- }
104
- }
105
- // hard cap: if still too large, evict oldest entries
106
- if (this.cache.size > MAX_CACHE_SIZE) {
107
- const sorted = [...this.cache.entries()].sort((a, b) => a[1].lastUpdated - b[1].lastUpdated);
108
- const toEvict = sorted.slice(0, this.cache.size - MAX_CACHE_SIZE);
109
- for (const [key] of toEvict) {
110
- this.cache.delete(key);
111
- }
112
- }
113
- }
114
- }
115
- exports.WalletProfiler = WalletProfiler;
116
- //# sourceMappingURL=wallet-profiler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wallet-profiler.js","sourceRoot":"","sources":["../src/wallet-profiler.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAGH,uCAAkD;AAGlD,mCAA+B;AAE/B,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA,CAAC,+BAA+B;AACzE,MAAM,gBAAgB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA,CAAC,kCAAkC;AAC1E,MAAM,cAAc,GAAG,IAAI,CAAA,CAAC,4BAA4B;AAExD,MAAa,cAAc;IAIzB,YAAY,GAAW;QAHf,UAAK,GAAG,IAAI,GAAG,EAAyB,CAAA;QAI9C,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAsB,EAAE,OAAe,EAAE,IAAY;QACjE,IAAI,CAAC,UAAU,EAAE,CAAA;QAEjB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACtC,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,WAAW,GAAG,mBAAmB,EAAE,CAAC;YACpE,OAAO,MAAM,CAAA;QACf,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,oBAAoB,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAA;QAE5D,kBAAkB;QAClB,MAAM,IAAI,GAAG,MAAM,IAAA,qBAAU,EAAC,OAAO,CAAC,CAAA;QAEtC,8BAA8B;QAC9B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;QAE5E,oCAAoC;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;QAEpE,MAAM,OAAO,GAAkB;YAC7B,OAAO;YACP,YAAY,EAAE,IAAI,CAAC,QAAQ;YAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,UAAU;YACV,SAAS;YACT,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;SACxB,CAAA;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAChC,OAAO,OAAO,CAAA;IAChB,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAC/B,UAAsB,EACtB,IAAY,EACZ,OAAe;QAEf,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAA,sBAAW,EAAC,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;YAE5D,iEAAiE;YACjE,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAqB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAA;YAEnF,IAAI,IAAI,GAAG,CAAC,CAAA;YACZ,IAAI,MAAM,GAAG,CAAC,CAAA;YACd,IAAI,SAAS,GAAG,CAAC,CAAA;YAEjB,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;gBAC7B,MAAM,CAAC,GAAG,GAA2B,CAAA;gBACrC,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC5B,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC;wBAAE,IAAI,EAAE,CAAA;;wBACpB,MAAM,EAAE,CAAA;oBACb,SAAS,IAAI,CAAC,CAAC,OAAO,CAAA;gBACxB,CAAC;YACH,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,GAAG,MAAM,CAAA;YACjC,OAAO;gBACL,WAAW;gBACX,IAAI;gBACJ,MAAM;gBACN,OAAO,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG;gBACnD,SAAS;aACV,CAAA;QACH,CAAC;QAAC,MAAM,CAAC;YACP,gDAAgD;YAChD,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,CAAA;QAC3E,CAAC;IACH,CAAC;IAEO,iBAAiB,CACvB,SAA2C,EAC3C,KAAiB;QAEjB,4BAA4B;QAC5B,MAAM,QAAQ,GAA2B;YACvC,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,EAAE;YACV,GAAG,EAAE,EAAE;SACR,CAAA;QACD,IAAI,IAAI,GAAG,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,IAAI,EAAE,CAAA,CAAC,kBAAkB;QAE7D,uDAAuD;QACvD,IAAI,KAAK,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;YAC1B,0DAA0D;YAC1D,MAAM,eAAe,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAA,CAAC,aAAa;YAChE,IAAI,IAAI,eAAe,CAAA;YAEvB,2BAA2B;YAC3B,IAAI,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;gBACxB,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAA,CAAC,YAAY;YAClE,CAAC;QACH,CAAC;QAED,OAAO,IAAA,aAAK,EAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA;IACxC,CAAC;IAEO,UAAU;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACxC,IAAI,GAAG,GAAG,OAAO,CAAC,WAAW,GAAG,gBAAgB,EAAE,CAAC;gBACjD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACxB,CAAC;QACH,CAAC;QACD,qDAAqD;QACrD,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,cAAc,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAA;YAC5F,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,cAAc,CAAC,CAAA;YACjE,KAAK,MAAM,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACxB,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAzHD,wCAyHC"}