torch-liquidation-bot 2.0.1 → 2.0.3

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.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "torch-liquidation-bot",
3
- "version": "2.0.1",
4
- "description": "lending position monitor and auto-liquidation skill using the torchsdk",
3
+ "version": "2.0.3",
4
+ "description": "read-only lending market scanner for Torch Market on Solana",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "bin": {
@@ -14,15 +14,10 @@
14
14
  "build": "tsc",
15
15
  "clean": "rm -rf dist",
16
16
  "test": "npx tsx tests/test_readonly.ts",
17
- "test:lending": "npx tsx tests/test_lending.ts",
18
- "test:bot": "npx tsx tests/test_bot.ts",
19
17
  "format": "prettier --write src/ tests/"
20
18
  },
21
19
  "dependencies": {
22
- "@coral-xyz/anchor": "^0.32.1",
23
- "@solana/spl-token": "^0.4.14",
24
20
  "@solana/web3.js": "^1.98.4",
25
- "bs58": "^6.0.0",
26
21
  "torchsdk": "^1.0.5"
27
22
  },
28
23
  "devDependencies": {
@@ -32,6 +27,10 @@
32
27
  },
33
28
  "peerDependencies": {
34
29
  "@solana/web3.js": "^1.98.0"
30
+ },
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "torch-liquidation-bot-ro"
35
34
  },
36
35
  "license": "MIT",
37
36
  "packageManager": "pnpm@9.10.0+sha512.73a29afa36a0d092ece5271de5177ecbf8318d454ecd701343131b8ebc0c1a91c487da46ab77c8e596d6acf1461e3594ced4becedf8921b074fbd8653ed7051c"
package/readme.md CHANGED
@@ -1,8 +1,8 @@
1
- # torch-liquidation-bot v2.0.0 (Read-Only)
1
+ # torch-liquidation-bot v2.0.3 (Read-Only)
2
2
 
3
3
  Read-only lending market scanner for [Torch Market](https://torch.market) on Solana. No wallet required. Only an RPC endpoint is needed.
4
4
 
5
- > **v2.0.0 Breaking Change:** All wallet-dependent functionality (bot mode, watch mode, transaction signing) is deprecated. The entry point no longer imports or references any wallet, keypair, or signing code. Only read-only info mode is available.
5
+ > **v2.0.0 Breaking Change:** All wallet-dependent code (bot mode, watch mode, transaction signing) was removed. The source tree contains only read-only code. No wallet, no keypair, no signing.
6
6
 
7
7
  ## Install
8
8
 
@@ -30,7 +30,7 @@ That's it. No wallet loaded. No transactions built. No state changes.
30
30
 
31
31
  | Variable | Required | Default | Description |
32
32
  |----------|----------|---------|-------------|
33
- | `RPC_URL` | yes | -- | Solana RPC endpoint |
33
+ | `RPC_URL` | yes | -- | Solana RPC endpoint. If your provider embeds an API key in the URL, use a read-only key or a public endpoint. |
34
34
  | `MINT` | no | -- | Token mint address (omit to show all tokens) |
35
35
  | `LOG_LEVEL` | no | `info` | `debug`, `info`, `warn`, `error` |
36
36
 
@@ -61,32 +61,13 @@ for (const t of tokens) {
61
61
  ## Architecture
62
62
 
63
63
  ```
64
- packages/bot/src/
65
- ├── types.ts interfaces (ReadOnlyConfig + dormant BotConfig)
66
- ├── config.ts — loadReadOnlyConfig() (active) + loadConfig() (dormant)
67
- ├── utils.ts shared helpers
68
- └── index.ts — read-only entry point
69
-
70
- dormant (retained for future release, not imported by index.ts):
71
- ├── logger.ts — structured logging
72
- ├── scanner.ts — token discovery
73
- ├── wallet-profiler.ts — SAID reputation + trade history
74
- ├── risk-scorer.ts — 4-factor risk model
75
- ├── liquidator.ts — liquidation execution
76
- └── monitor.ts — scan + score orchestration
64
+ src/
65
+ ├── types.ts — ReadOnlyConfig interface
66
+ ├── config.ts — loadReadOnlyConfig()
67
+ ├── utils.ts sol() + bpsToPercent() helpers
68
+ └── index.ts — read-only entry point
77
69
  ```
78
70
 
79
- ## Deprecated (v1.x)
80
-
81
- The following functionality is preserved in the source files but is not imported or reachable from the entry point. It will be re-enabled in a future version after further security review.
82
-
83
- - `bot` mode — scan, score, and liquidate positions
84
- - `watch` mode — monitor loan health + auto-repay
85
- - `loadConfig()` — wallet keypair decoding
86
- - `loadWallet()` — private key loading
87
- - All transaction signing (`sendAndConfirmTransaction`)
88
- - All SAID Protocol write operations (`confirmTransaction`)
89
-
90
71
  ## Lending Parameters
91
72
 
92
73
  | Parameter | Value |
@@ -103,17 +84,17 @@ Requires [Surfpool](https://github.com/nicholasgasior/surfpool) running a mainne
103
84
 
104
85
  ```bash
105
86
  surfpool start --network mainnet --no-tui
106
- pnpm test # read-only test (default)
107
- pnpm test:lending # v1.x lending lifecycle test (requires wallet)
108
- pnpm test:bot # v1.x bot module test (requires wallet)
87
+ pnpm test # read-only test
109
88
  ```
110
89
 
111
90
  ## Security
112
91
 
113
92
  - No wallet loaded, no keypair decoded, no private key in memory
114
93
  - No transaction building, no signing, no state changes
115
- - Outbound connections: Solana RPC only (no SAID API in active codepath)
116
- - Distributed via npm no post-install hooks, no remote code fetching
94
+ - Outbound connections: Solana RPC only
95
+ - Minimal dependencies: `@solana/web3.js` + `torchsdk`
96
+ - No post-install hooks, no remote code fetching
97
+ - RPC_URL is used only for read-only RPC calls — never logged, transmitted externally, or stored
117
98
 
118
99
  ## Links
119
100
 
package/dist/config.d.ts DELETED
@@ -1,6 +0,0 @@
1
- /**
2
- * config.ts — loads environment variables into a typed BotConfig.
3
- */
4
- import type { BotConfig } from './types';
5
- export declare function loadConfig(): BotConfig;
6
- //# sourceMappingURL=config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAY,MAAM,SAAS,CAAA;AAIlD,wBAAgB,UAAU,IAAI,SAAS,CAuCtC"}
package/dist/config.js DELETED
@@ -1,51 +0,0 @@
1
- "use strict";
2
- /**
3
- * config.ts — loads environment variables into a typed BotConfig.
4
- */
5
- var __importDefault = (this && this.__importDefault) || function (mod) {
6
- return (mod && mod.__esModule) ? mod : { "default": mod };
7
- };
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.loadConfig = loadConfig;
10
- const web3_js_1 = require("@solana/web3.js");
11
- const bs58_1 = __importDefault(require("bs58"));
12
- const torchsdk_1 = require("torchsdk");
13
- const LOG_LEVELS = ['debug', 'info', 'warn', 'error'];
14
- function loadConfig() {
15
- const rpcUrl = process.env.RPC_URL;
16
- if (!rpcUrl)
17
- throw new Error('RPC_URL env var is required');
18
- const walletKey = process.env.WALLET;
19
- if (!walletKey)
20
- throw new Error('WALLET env var is required (base58 private key)');
21
- const logLevel = (process.env.LOG_LEVEL ?? 'info');
22
- if (!LOG_LEVELS.includes(logLevel)) {
23
- throw new Error(`LOG_LEVEL must be one of: ${LOG_LEVELS.join(', ')}`);
24
- }
25
- const minProfitSol = Number(process.env.MIN_PROFIT_SOL ?? '0.01');
26
- const scanIntervalMs = Number(process.env.SCAN_INTERVAL_MS ?? '60000');
27
- const scoreIntervalMs = Number(process.env.SCORE_INTERVAL_MS ?? '15000');
28
- const riskThreshold = Number(process.env.RISK_THRESHOLD ?? '60');
29
- const priceHistoryDepth = Number(process.env.PRICE_HISTORY ?? '20');
30
- if (isNaN(scanIntervalMs) || scanIntervalMs < 1000)
31
- throw new Error('SCAN_INTERVAL_MS must be >= 1000');
32
- if (isNaN(scoreIntervalMs) || scoreIntervalMs < 1000)
33
- throw new Error('SCORE_INTERVAL_MS must be >= 1000');
34
- if (isNaN(riskThreshold) || riskThreshold < 0 || riskThreshold > 100)
35
- throw new Error('RISK_THRESHOLD must be 0-100');
36
- if (isNaN(priceHistoryDepth) || priceHistoryDepth < 2)
37
- throw new Error('PRICE_HISTORY must be >= 2');
38
- if (isNaN(minProfitSol) || minProfitSol < 0)
39
- throw new Error('MIN_PROFIT_SOL must be >= 0');
40
- return {
41
- rpcUrl,
42
- walletKeypair: web3_js_1.Keypair.fromSecretKey(bs58_1.default.decode(walletKey)),
43
- scanIntervalMs,
44
- scoreIntervalMs,
45
- minProfitLamports: Math.floor(minProfitSol * torchsdk_1.LAMPORTS_PER_SOL),
46
- riskThreshold,
47
- priceHistoryDepth,
48
- logLevel,
49
- };
50
- }
51
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;AASH,gCAuCC;AA9CD,6CAAyC;AACzC,gDAAuB;AACvB,uCAA2C;AAG3C,MAAM,UAAU,GAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;AAEjE,SAAgB,UAAU;IACxB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAA;IAClC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAE3D,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAA;IACpC,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAA;IAElF,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,CAAa,CAAA;IAC9D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,6BAA6B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACvE,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,MAAM,CAAC,CAAA;IACjE,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,CAAA;IACtE,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,CAAA;IACxE,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,CAAA;IAChE,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,CAAA;IAEnE,IAAI,KAAK,CAAC,cAAc,CAAC,IAAI,cAAc,GAAG,IAAI;QAChD,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;IACrD,IAAI,KAAK,CAAC,eAAe,CAAC,IAAI,eAAe,GAAG,IAAI;QAClD,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;IACtD,IAAI,KAAK,CAAC,aAAa,CAAC,IAAI,aAAa,GAAG,CAAC,IAAI,aAAa,GAAG,GAAG;QAClE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;IACjD,IAAI,KAAK,CAAC,iBAAiB,CAAC,IAAI,iBAAiB,GAAG,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAA;IAC/C,IAAI,KAAK,CAAC,YAAY,CAAC,IAAI,YAAY,GAAG,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAEhD,OAAO;QACL,MAAM;QACN,aAAa,EAAE,iBAAO,CAAC,aAAa,CAAC,cAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC5D,cAAc;QACd,eAAe;QACf,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,2BAAgB,CAAC;QAC9D,aAAa;QACb,iBAAiB;QACjB,QAAQ;KACT,CAAA;AACH,CAAC"}
package/dist/index.d.ts DELETED
@@ -1,28 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * torch-lending-monitor
4
- *
5
- * multi-token liquidation bot that discovers lending markets, profiles
6
- * borrower wallets, predicts which loans will fail, and executes
7
- * profitable liquidations.
8
- *
9
- * modes:
10
- * info — display lending parameters for a token (or all tokens) (default)
11
- * watch — monitor your own loan health in real-time
12
- * bot — run the full liquidation bot
13
- *
14
- * usage:
15
- * # show all migrated tokens with lending
16
- * RPC_URL=<rpc> npx tsx src/index.ts
17
- *
18
- * # show lending info for one token
19
- * MODE=info MINT=<mint> RPC_URL=<rpc> npx tsx src/index.ts
20
- *
21
- * # watch your loan health
22
- * MODE=watch MINT=<mint> WALLET=<key> RPC_URL=<rpc> npx tsx src/index.ts
23
- *
24
- * # run the liquidation bot
25
- * MODE=bot WALLET=<key> RPC_URL=<rpc> npx tsx src/index.ts
26
- */
27
- export {};
28
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG"}
package/dist/index.js DELETED
@@ -1,172 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
- /**
4
- * torch-lending-monitor
5
- *
6
- * multi-token liquidation bot that discovers lending markets, profiles
7
- * borrower wallets, predicts which loans will fail, and executes
8
- * profitable liquidations.
9
- *
10
- * modes:
11
- * info — display lending parameters for a token (or all tokens) (default)
12
- * watch — monitor your own loan health in real-time
13
- * bot — run the full liquidation bot
14
- *
15
- * usage:
16
- * # show all migrated tokens with lending
17
- * RPC_URL=<rpc> npx tsx src/index.ts
18
- *
19
- * # show lending info for one token
20
- * MODE=info MINT=<mint> RPC_URL=<rpc> npx tsx src/index.ts
21
- *
22
- * # watch your loan health
23
- * MODE=watch MINT=<mint> WALLET=<key> RPC_URL=<rpc> npx tsx src/index.ts
24
- *
25
- * # run the liquidation bot
26
- * MODE=bot WALLET=<key> RPC_URL=<rpc> npx tsx src/index.ts
27
- */
28
- var __importDefault = (this && this.__importDefault) || function (mod) {
29
- return (mod && mod.__esModule) ? mod : { "default": mod };
30
- };
31
- Object.defineProperty(exports, "__esModule", { value: true });
32
- const web3_js_1 = require("@solana/web3.js");
33
- const bs58_1 = __importDefault(require("bs58"));
34
- const torchsdk_1 = require("torchsdk");
35
- const monitor_1 = require("./monitor");
36
- const config_1 = require("./config");
37
- const utils_1 = require("./utils");
38
- // ---------------------------------------------------------------------------
39
- // helpers for info/watch modes (don't need full config)
40
- // ---------------------------------------------------------------------------
41
- function loadWallet() {
42
- const key = process.env.WALLET;
43
- if (!key)
44
- throw new Error('Set WALLET env var to a base58-encoded private key');
45
- return web3_js_1.Keypair.fromSecretKey(bs58_1.default.decode(key));
46
- }
47
- // ---------------------------------------------------------------------------
48
- // mode: info
49
- // ---------------------------------------------------------------------------
50
- async function showLendingInfo(connection, mint) {
51
- const token = await (0, torchsdk_1.getToken)(connection, mint);
52
- const lending = await (0, torchsdk_1.getLendingInfo)(connection, mint);
53
- console.log(`\n=== lending info: ${token.name} (${token.symbol}) ===`);
54
- console.log(`status: ${token.status}`);
55
- console.log(`token price: ${(0, utils_1.sol)(token.price_sol)} SOL`);
56
- console.log(`interest rate: ${(0, utils_1.bpsToPercent)(lending.interest_rate_bps)}`);
57
- console.log(`max LTV: ${(0, utils_1.bpsToPercent)(lending.max_ltv_bps)}`);
58
- console.log(`liquidation threshold: ${(0, utils_1.bpsToPercent)(lending.liquidation_threshold_bps)}`);
59
- console.log(`liquidation bonus: ${(0, utils_1.bpsToPercent)(lending.liquidation_bonus_bps)}`);
60
- console.log(`treasury SOL avail: ${(0, utils_1.sol)(lending.treasury_sol_available)} SOL`);
61
- console.log(`total SOL lent: ${(0, utils_1.sol)(lending.total_sol_lent)} SOL`);
62
- console.log(`active loans: ${lending.active_loans}`);
63
- }
64
- async function showAllLending(connection) {
65
- console.log('=== torch lending monitor ===\n');
66
- console.log('no MINT specified — showing all migrated tokens with lending\n');
67
- const { tokens } = await (0, torchsdk_1.getTokens)(connection, {
68
- status: 'migrated',
69
- sort: 'volume',
70
- limit: 10,
71
- });
72
- for (const t of tokens) {
73
- try {
74
- const lending = await (0, torchsdk_1.getLendingInfo)(connection, t.mint);
75
- console.log(`${t.symbol.padEnd(10)} | ` +
76
- `rate: ${(0, utils_1.bpsToPercent)(lending.interest_rate_bps).padEnd(7)} | ` +
77
- `loans: ${String(lending.active_loans).padEnd(4)} | ` +
78
- `avail: ${(0, utils_1.sol)(lending.treasury_sol_available)} SOL`);
79
- }
80
- catch {
81
- // token may not have lending enabled yet
82
- }
83
- }
84
- }
85
- // ---------------------------------------------------------------------------
86
- // mode: watch
87
- // ---------------------------------------------------------------------------
88
- async function watchPosition(connection, mint, wallet) {
89
- const pollMs = Number(process.env.POLL_INTERVAL_MS ?? '15000');
90
- console.log(`\n=== watching loan: ${wallet.publicKey.toBase58()} ===`);
91
- console.log(`mint: ${mint}\n`);
92
- while (true) {
93
- const pos = await (0, torchsdk_1.getLoanPosition)(connection, mint, wallet.publicKey.toBase58());
94
- if (pos.health === 'none') {
95
- console.log(`[${new Date().toISOString()}] no active loan`);
96
- }
97
- else {
98
- const healthColor = pos.health === 'healthy' ? 'OK' : pos.health === 'at_risk' ? 'WARNING' : 'DANGER';
99
- console.log(`[${new Date().toISOString()}] health: ${healthColor} (${pos.health})`);
100
- console.log(` collateral: ${pos.collateral_amount} tokens`);
101
- console.log(` collat value: ${(0, utils_1.sol)(pos.collateral_value_sol)} SOL`);
102
- console.log(` borrowed: ${(0, utils_1.sol)(pos.borrowed_amount)} SOL`);
103
- console.log(` interest: ${(0, utils_1.sol)(pos.accrued_interest)} SOL`);
104
- console.log(` total owed: ${(0, utils_1.sol)(pos.total_owed)} SOL`);
105
- console.log(` current LTV: ${(0, utils_1.bpsToPercent)(pos.current_ltv_bps)}`);
106
- if (pos.health === 'at_risk') {
107
- console.log(' --> consider adding collateral or repaying to avoid liquidation');
108
- }
109
- if (pos.health === 'liquidatable') {
110
- console.log(' --> your position can be liquidated! repay immediately');
111
- if (process.env.AUTO_REPAY === 'true') {
112
- console.log(' --> auto-repaying...');
113
- const { transaction, message } = await (0, torchsdk_1.buildRepayTransaction)(connection, {
114
- mint,
115
- borrower: wallet.publicKey.toBase58(),
116
- sol_amount: pos.total_owed,
117
- });
118
- console.log(` tx: ${message}`);
119
- const sig = await (0, web3_js_1.sendAndConfirmTransaction)(connection, transaction, [wallet]);
120
- console.log(` confirmed: ${sig}`);
121
- const result = await (0, torchsdk_1.confirmTransaction)(connection, sig, wallet.publicKey.toBase58());
122
- console.log(` SAID event: ${result.event_type}`);
123
- }
124
- }
125
- }
126
- await (0, utils_1.sleep)(pollMs);
127
- }
128
- }
129
- // ---------------------------------------------------------------------------
130
- // main
131
- // ---------------------------------------------------------------------------
132
- async function main() {
133
- const MODE = process.env.MODE ?? 'info';
134
- const MINT = process.env.MINT;
135
- const RPC_URL = process.env.RPC_URL ?? 'https://api.mainnet-beta.solana.com';
136
- // info mode: no wallet needed
137
- if (MODE === 'info') {
138
- const connection = new web3_js_1.Connection(RPC_URL, 'confirmed');
139
- if (MINT) {
140
- await showLendingInfo(connection, MINT);
141
- }
142
- else {
143
- await showAllLending(connection);
144
- }
145
- return;
146
- }
147
- // watch mode: single token + wallet
148
- if (MODE === 'watch') {
149
- if (!MINT)
150
- throw new Error('MINT env var required for watch mode');
151
- const connection = new web3_js_1.Connection(RPC_URL, 'confirmed');
152
- await watchPosition(connection, MINT, loadWallet());
153
- return;
154
- }
155
- // bot mode: full liquidation bot
156
- if (MODE === 'bot') {
157
- const config = (0, config_1.loadConfig)();
158
- const connection = new web3_js_1.Connection(config.rpcUrl, 'confirmed');
159
- const monitor = new monitor_1.Monitor(connection, config);
160
- // graceful shutdown
161
- process.on('SIGINT', () => {
162
- monitor.stop();
163
- process.exit(0);
164
- });
165
- await monitor.start();
166
- return;
167
- }
168
- console.error(`unknown MODE: ${MODE}. use info | watch | bot`);
169
- process.exit(1);
170
- }
171
- main();
172
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- /**
2
- * liquidator.ts — executes liquidation transactions.
3
- *
4
- * receives a target, calculates expected profit, builds the tx,
5
- * signs and sends it, then confirms via SAID for reputation.
6
- */
7
- import { type Connection } from '@solana/web3.js';
8
- import type { ScoredLoan, LiquidationResult, BotConfig } from './types';
9
- import type { Logger } from './logger';
10
- export declare class Liquidator {
11
- private log;
12
- private wallet;
13
- private minProfitLamports;
14
- constructor(config: BotConfig, log: Logger);
15
- tryLiquidate(connection: Connection, loan: ScoredLoan): Promise<LiquidationResult | null>;
16
- }
17
- //# sourceMappingURL=liquidator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"liquidator.d.ts","sourceRoot":"","sources":["../src/liquidator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,UAAU,EAA2C,MAAM,iBAAiB,CAAA;AAE1F,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAGtC,qBAAa,UAAU;IACrB,OAAO,CAAC,GAAG,CAAQ;IACnB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,iBAAiB,CAAQ;gBAErB,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM;IAMpC,YAAY,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;CA4DhG"}
@@ -1,72 +0,0 @@
1
- "use strict";
2
- /**
3
- * liquidator.ts — executes liquidation transactions.
4
- *
5
- * receives a target, calculates expected profit, builds the tx,
6
- * signs and sends it, then confirms via SAID for reputation.
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.Liquidator = void 0;
10
- const web3_js_1 = require("@solana/web3.js");
11
- const torchsdk_1 = require("torchsdk");
12
- const utils_1 = require("./utils");
13
- class Liquidator {
14
- constructor(config, log) {
15
- this.wallet = config.walletKeypair;
16
- this.minProfitLamports = config.minProfitLamports;
17
- this.log = log;
18
- }
19
- async tryLiquidate(connection, loan) {
20
- if (loan.position.health !== 'liquidatable') {
21
- this.log.debug(`skipping ${loan.borrower.slice(0, 8)}... — not liquidatable yet`);
22
- return null;
23
- }
24
- if (loan.estimatedProfitLamports < this.minProfitLamports) {
25
- this.log.debug(`skipping ${loan.borrower.slice(0, 8)}... — profit too low`, {
26
- expected: (0, utils_1.sol)(loan.estimatedProfitLamports),
27
- minimum: (0, utils_1.sol)(this.minProfitLamports),
28
- });
29
- return null;
30
- }
31
- this.log.info(`liquidating ${loan.borrower.slice(0, 8)}...`, {
32
- token: loan.tokenName,
33
- profit: `${(0, utils_1.sol)(loan.estimatedProfitLamports)} SOL`,
34
- risk: loan.riskScore,
35
- });
36
- try {
37
- const { transaction, message } = await (0, torchsdk_1.buildLiquidateTransaction)(connection, {
38
- mint: loan.mint,
39
- liquidator: this.wallet.publicKey.toBase58(),
40
- borrower: loan.borrower,
41
- });
42
- this.log.debug(`tx built: ${message}`);
43
- const signature = await (0, web3_js_1.sendAndConfirmTransaction)(connection, transaction, [this.wallet]);
44
- this.log.info(`liquidation confirmed`, { sig: signature });
45
- // confirm via SAID for reputation
46
- let confirmed = false;
47
- try {
48
- const result = await (0, torchsdk_1.confirmTransaction)(connection, signature, this.wallet.publicKey.toBase58());
49
- confirmed = result.confirmed;
50
- this.log.debug(`SAID confirmation`, { event: result.event_type });
51
- }
52
- catch {
53
- this.log.warn('SAID confirmation failed — tx still went through');
54
- }
55
- return {
56
- mint: loan.mint,
57
- borrower: loan.borrower,
58
- signature,
59
- profitLamports: loan.estimatedProfitLamports,
60
- timestamp: Date.now(),
61
- confirmed,
62
- };
63
- }
64
- catch (err) {
65
- const msg = err instanceof Error ? err.message : String(err);
66
- this.log.error(`liquidation failed for ${loan.borrower.slice(0, 8)}...`, { error: msg });
67
- return null;
68
- }
69
- }
70
- }
71
- exports.Liquidator = Liquidator;
72
- //# sourceMappingURL=liquidator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"liquidator.js","sourceRoot":"","sources":["../src/liquidator.ts"],"names":[],"mappings":"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"}
package/dist/logger.d.ts DELETED
@@ -1,17 +0,0 @@
1
- /**
2
- * logger.ts — simple structured logging with levels.
3
- */
4
- import type { LogLevel } from './types';
5
- export declare class Logger {
6
- private module;
7
- private minLevel;
8
- constructor(module: string, level: LogLevel);
9
- debug(msg: string, data?: Record<string, unknown>): void;
10
- info(msg: string, data?: Record<string, unknown>): void;
11
- warn(msg: string, data?: Record<string, unknown>): void;
12
- error(msg: string, data?: Record<string, unknown>): void;
13
- child(module: string): Logger;
14
- private levelName;
15
- private log;
16
- }
17
- //# sourceMappingURL=logger.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AASvC,qBAAa,MAAM;IAIf,OAAO,CAAC,MAAM;IAHhB,OAAO,CAAC,QAAQ,CAAQ;gBAGd,MAAM,EAAE,MAAM,EACtB,KAAK,EAAE,QAAQ;IAKjB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAIjD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAIhD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAIhD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAIjD,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAI7B,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,GAAG;CAeZ"}
package/dist/logger.js DELETED
@@ -1,54 +0,0 @@
1
- "use strict";
2
- /**
3
- * logger.ts — simple structured logging with levels.
4
- */
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.Logger = void 0;
7
- const LEVEL_PRIORITY = {
8
- debug: 0,
9
- info: 1,
10
- warn: 2,
11
- error: 3,
12
- };
13
- class Logger {
14
- constructor(module, level) {
15
- this.module = module;
16
- this.minLevel = LEVEL_PRIORITY[level];
17
- }
18
- debug(msg, data) {
19
- this.log('debug', msg, data);
20
- }
21
- info(msg, data) {
22
- this.log('info', msg, data);
23
- }
24
- warn(msg, data) {
25
- this.log('warn', msg, data);
26
- }
27
- error(msg, data) {
28
- this.log('error', msg, data);
29
- }
30
- child(module) {
31
- return new Logger(`${this.module}:${module}`, this.levelName());
32
- }
33
- levelName() {
34
- const entry = Object.entries(LEVEL_PRIORITY).find(([, v]) => v === this.minLevel);
35
- return (entry?.[0] ?? 'info');
36
- }
37
- log(level, msg, data) {
38
- if (LEVEL_PRIORITY[level] < this.minLevel)
39
- return;
40
- const ts = new Date().toISOString();
41
- const prefix = `[${ts}] [${level.toUpperCase().padEnd(5)}] [${this.module}]`;
42
- if (data) {
43
- const parts = Object.entries(data)
44
- .map(([k, v]) => `${k}=${v}`)
45
- .join(' ');
46
- console.log(`${prefix} ${msg} | ${parts}`);
47
- }
48
- else {
49
- console.log(`${prefix} ${msg}`);
50
- }
51
- }
52
- }
53
- exports.Logger = Logger;
54
- //# sourceMappingURL=logger.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAIH,MAAM,cAAc,GAA6B;IAC/C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAA;AAED,MAAa,MAAM;IAGjB,YACU,MAAc,EACtB,KAAe;QADP,WAAM,GAAN,MAAM,CAAQ;QAGtB,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;IACvC,CAAC;IAED,KAAK,CAAC,GAAW,EAAE,IAA8B;QAC/C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;IAC9B,CAAC;IAED,IAAI,CAAC,GAAW,EAAE,IAA8B;QAC9C,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;IAC7B,CAAC;IAED,IAAI,CAAC,GAAW,EAAE,IAA8B;QAC9C,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,GAAW,EAAE,IAA8B;QAC/C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,MAAc;QAClB,OAAO,IAAI,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,MAAM,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;IACjE,CAAC;IAEO,SAAS;QACf,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAA;QACjF,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAa,CAAA;IAC3C,CAAC;IAEO,GAAG,CAAC,KAAe,EAAE,GAAW,EAAE,IAA8B;QACtE,IAAI,cAAc,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ;YAAE,OAAM;QAEjD,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QACnC,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,GAAG,CAAA;QAE5E,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;iBAC/B,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;iBAC5B,IAAI,CAAC,GAAG,CAAC,CAAA;YACZ,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,GAAG,MAAM,KAAK,EAAE,CAAC,CAAA;QAC5C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,CAAA;QACjC,CAAC;IACH,CAAC;CACF;AAlDD,wBAkDC"}
package/dist/monitor.d.ts DELETED
@@ -1,27 +0,0 @@
1
- /**
2
- * monitor.ts — main orchestration loop.
3
- *
4
- * two loops running on intervals:
5
- * 1. scan loop: discover tokens with active lending
6
- * 2. score loop: profile borrowers, score loans, execute liquidations
7
- */
8
- import type { Connection } from '@solana/web3.js';
9
- import type { BotConfig } from './types';
10
- export declare class Monitor {
11
- private connection;
12
- private config;
13
- private log;
14
- private profiler;
15
- private liquidator;
16
- private tokens;
17
- private running;
18
- constructor(connection: Connection, config: BotConfig);
19
- start(): Promise<void>;
20
- stop(): void;
21
- private scanLoop;
22
- private scan;
23
- private scoreLoop;
24
- private scoreAllPositions;
25
- private scoreToken;
26
- }
27
- //# sourceMappingURL=monitor.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../src/monitor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEjD,OAAO,KAAK,EAAE,SAAS,EAA8B,MAAM,SAAS,CAAA;AAQpE,qBAAa,OAAO;IAClB,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,GAAG,CAAQ;IACnB,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,OAAO,CAAQ;gBAEX,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS;IAQ/C,KAAK;IAmBX,IAAI;YAKU,QAAQ;YAOR,IAAI;YAcJ,SAAS;YAOT,iBAAiB;YAkDjB,UAAU;CA0BzB"}