tensorgate 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 (63) hide show
  1. package/.env.example +7 -0
  2. package/build/.tsbuildinfo +1 -0
  3. package/build/bittensor/dendrite.d.ts +22 -0
  4. package/build/bittensor/dendrite.d.ts.map +1 -0
  5. package/build/bittensor/dendrite.js +150 -0
  6. package/build/bittensor/dendrite.js.map +1 -0
  7. package/build/bittensor/metagraph.d.ts +30 -0
  8. package/build/bittensor/metagraph.d.ts.map +1 -0
  9. package/build/bittensor/metagraph.js +101 -0
  10. package/build/bittensor/metagraph.js.map +1 -0
  11. package/build/bittensor/router.d.ts +21 -0
  12. package/build/bittensor/router.d.ts.map +1 -0
  13. package/build/bittensor/router.js +129 -0
  14. package/build/bittensor/router.js.map +1 -0
  15. package/build/bittensor/subtensor.d.ts +60 -0
  16. package/build/bittensor/subtensor.d.ts.map +1 -0
  17. package/build/bittensor/subtensor.js +186 -0
  18. package/build/bittensor/subtensor.js.map +1 -0
  19. package/build/cache/index.d.ts +13 -0
  20. package/build/cache/index.d.ts.map +1 -0
  21. package/build/cache/index.js +124 -0
  22. package/build/cache/index.js.map +1 -0
  23. package/build/config.d.ts +30 -0
  24. package/build/config.d.ts.map +1 -0
  25. package/build/config.js +48 -0
  26. package/build/config.js.map +1 -0
  27. package/build/index.d.ts +2 -0
  28. package/build/index.d.ts.map +1 -0
  29. package/build/index.js +78 -0
  30. package/build/index.js.map +1 -0
  31. package/build/tools/analyze-token.d.ts +21 -0
  32. package/build/tools/analyze-token.d.ts.map +1 -0
  33. package/build/tools/analyze-token.js +185 -0
  34. package/build/tools/analyze-token.js.map +1 -0
  35. package/build/tools/network-stats.d.ts +13 -0
  36. package/build/tools/network-stats.d.ts.map +1 -0
  37. package/build/tools/network-stats.js +114 -0
  38. package/build/tools/network-stats.js.map +1 -0
  39. package/build/tools/predictions.d.ts +25 -0
  40. package/build/tools/predictions.d.ts.map +1 -0
  41. package/build/tools/predictions.js +92 -0
  42. package/build/tools/predictions.js.map +1 -0
  43. package/build/tools/query-subnet.d.ts +29 -0
  44. package/build/tools/query-subnet.d.ts.map +1 -0
  45. package/build/tools/query-subnet.js +66 -0
  46. package/build/tools/query-subnet.js.map +1 -0
  47. package/build/tools/subnet-health.d.ts +21 -0
  48. package/build/tools/subnet-health.d.ts.map +1 -0
  49. package/build/tools/subnet-health.js +118 -0
  50. package/build/tools/subnet-health.js.map +1 -0
  51. package/build/tools/tao-stake.d.ts +21 -0
  52. package/build/tools/tao-stake.d.ts.map +1 -0
  53. package/build/tools/tao-stake.js +203 -0
  54. package/build/tools/tao-stake.js.map +1 -0
  55. package/build/utils/logger.d.ts +7 -0
  56. package/build/utils/logger.d.ts.map +1 -0
  57. package/build/utils/logger.js +41 -0
  58. package/build/utils/logger.js.map +1 -0
  59. package/build/utils/retry.d.ts +8 -0
  60. package/build/utils/retry.d.ts.map +1 -0
  61. package/build/utils/retry.js +28 -0
  62. package/build/utils/retry.js.map +1 -0
  63. package/package.json +50 -0
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSubtensorApi = getSubtensorApi;
4
+ exports.disconnectSubtensor = disconnectSubtensor;
5
+ exports.getTotalStake = getTotalStake;
6
+ exports.getSubnetCount = getSubnetCount;
7
+ exports.getSubnetInfo = getSubnetInfo;
8
+ exports.getNeuronInfo = getNeuronInfo;
9
+ exports.getDelegateInfo = getDelegateInfo;
10
+ exports.getCurrentBlock = getCurrentBlock;
11
+ const api_1 = require("@polkadot/api");
12
+ const config_1 = require("../config");
13
+ const logger_1 = require("../utils/logger");
14
+ const retry_1 = require("../utils/retry");
15
+ const log = (0, logger_1.createLogger)('subtensor');
16
+ let _api = null;
17
+ let _connecting = null;
18
+ /**
19
+ * Returns a connected ApiPromise to the subtensor chain.
20
+ * Uses lazy initialization with a singleton pattern.
21
+ */
22
+ async function getSubtensorApi() {
23
+ if (_api && _api.isConnected) {
24
+ return _api;
25
+ }
26
+ // Prevent multiple concurrent connection attempts
27
+ if (_connecting) {
28
+ return _connecting;
29
+ }
30
+ _connecting = (async () => {
31
+ const config = (0, config_1.getConfig)();
32
+ log.info('Connecting to subtensor', { endpoint: config.SUBTENSOR_ENDPOINT });
33
+ try {
34
+ const provider = new api_1.WsProvider(config.SUBTENSOR_ENDPOINT);
35
+ const api = await api_1.ApiPromise.create({ provider });
36
+ await api.isReady;
37
+ const chain = await api.rpc.system.chain();
38
+ const version = await api.rpc.system.version();
39
+ log.info('Connected to subtensor', { chain: chain.toString(), version: version.toString() });
40
+ api.on('disconnected', () => {
41
+ log.warn('Subtensor connection lost');
42
+ _api = null;
43
+ });
44
+ api.on('error', (err) => {
45
+ log.error('Subtensor connection error', { error: err instanceof Error ? err.message : String(err) });
46
+ });
47
+ _api = api;
48
+ return api;
49
+ }
50
+ finally {
51
+ _connecting = null;
52
+ }
53
+ })();
54
+ return _connecting;
55
+ }
56
+ /**
57
+ * Disconnect from subtensor and clean up.
58
+ */
59
+ async function disconnectSubtensor() {
60
+ if (_api) {
61
+ await _api.disconnect();
62
+ _api = null;
63
+ log.info('Disconnected from subtensor');
64
+ }
65
+ }
66
+ /**
67
+ * Get the total TAO staked across the network.
68
+ */
69
+ async function getTotalStake() {
70
+ return (0, retry_1.withRetry)(async () => {
71
+ const api = await getSubtensorApi();
72
+ const totalStake = await api.query.subtensorModule.totalStake();
73
+ // Subtensor stores values in RAO (1 TAO = 1e9 RAO)
74
+ const stakeRao = BigInt(totalStake.toString());
75
+ const stakeTao = Number(stakeRao) / 1e9;
76
+ return stakeTao.toLocaleString(undefined, { maximumFractionDigits: 2 });
77
+ }, 'getTotalStake');
78
+ }
79
+ /**
80
+ * Get the number of registered subnets.
81
+ */
82
+ async function getSubnetCount() {
83
+ return (0, retry_1.withRetry)(async () => {
84
+ const api = await getSubtensorApi();
85
+ const count = await api.query.subtensorModule.totalNetworks();
86
+ return Number(count.toString());
87
+ }, 'getSubnetCount');
88
+ }
89
+ /**
90
+ * Get metadata for a specific subnet.
91
+ */
92
+ async function getSubnetInfo(netuid) {
93
+ return (0, retry_1.withRetry)(async () => {
94
+ const api = await getSubtensorApi();
95
+ const [tempo, emission, maxAllowedUids, minAllowedWeights, maxWeightsLimit, difficulty, subnetN] = await Promise.all([
96
+ api.query.subtensorModule.tempo(netuid),
97
+ api.query.subtensorModule.emissionValues(netuid),
98
+ api.query.subtensorModule.maxAllowedUids(netuid),
99
+ api.query.subtensorModule.minAllowedWeights(netuid),
100
+ api.query.subtensorModule.maxWeightsLimit(netuid),
101
+ api.query.subtensorModule.difficulty(netuid),
102
+ api.query.subtensorModule.subnetworkN(netuid),
103
+ ]);
104
+ const emissionRao = BigInt(emission.toString());
105
+ const emissionTao = (Number(emissionRao) / 1e9).toFixed(4);
106
+ return {
107
+ netuid,
108
+ tempo: Number(tempo.toString()),
109
+ emission: emissionTao,
110
+ maxAllowedUids: Number(maxAllowedUids.toString()),
111
+ minAllowedWeights: Number(minAllowedWeights.toString()),
112
+ maxWeightsLimit: Number(maxWeightsLimit.toString()),
113
+ difficulty: difficulty.toString(),
114
+ registrationCount: Number(subnetN.toString()),
115
+ };
116
+ }, `getSubnetInfo(${netuid})`);
117
+ }
118
+ /**
119
+ * Get information about an individual neuron in a subnet.
120
+ */
121
+ async function getNeuronInfo(netuid, uid) {
122
+ return (0, retry_1.withRetry)(async () => {
123
+ const api = await getSubtensorApi();
124
+ const [keys, stake, trust, consensus, incentive, dividends, emission, active] = await Promise.all([
125
+ api.query.subtensorModule.keys(netuid, uid),
126
+ api.query.subtensorModule.s(netuid, uid),
127
+ api.query.subtensorModule.trust(netuid, uid),
128
+ api.query.subtensorModule.consensus(netuid, uid),
129
+ api.query.subtensorModule.incentive(netuid, uid),
130
+ api.query.subtensorModule.dividends(netuid, uid),
131
+ api.query.subtensorModule.emission(netuid, uid),
132
+ api.query.subtensorModule.active(netuid, uid),
133
+ ]);
134
+ const stakeRao = BigInt(stake.toString());
135
+ const stakeTao = (Number(stakeRao) / 1e9).toFixed(4);
136
+ const emissionRao = BigInt(emission.toString());
137
+ const emissionTao = (Number(emissionRao) / 1e9).toFixed(6);
138
+ // Trust, consensus, incentive, dividends are u16 scaled by U16_MAX (65535)
139
+ const U16_MAX = 65535;
140
+ return {
141
+ uid,
142
+ hotkey: keys.toString(),
143
+ coldkey: '',
144
+ stake: stakeTao,
145
+ trust: Number(trust.toString()) / U16_MAX,
146
+ consensus: Number(consensus.toString()) / U16_MAX,
147
+ incentive: Number(incentive.toString()) / U16_MAX,
148
+ dividends: Number(dividends.toString()) / U16_MAX,
149
+ emission: emissionTao,
150
+ isActive: Boolean(Number(active.toString())),
151
+ };
152
+ }, `getNeuronInfo(${netuid}, ${uid})`);
153
+ }
154
+ /**
155
+ * Get delegate staking info for a hotkey.
156
+ */
157
+ async function getDelegateInfo(hotkey) {
158
+ return (0, retry_1.withRetry)(async () => {
159
+ const api = await getSubtensorApi();
160
+ const [delegateTake, totalHotkeyStake] = await Promise.all([
161
+ api.query.subtensorModule.delegates(hotkey),
162
+ api.query.subtensorModule.totalHotkeyStake(hotkey),
163
+ ]);
164
+ const stakeRao = BigInt(totalHotkeyStake.toString());
165
+ const stakeTao = (Number(stakeRao) / 1e9).toFixed(4);
166
+ // Take is stored as u16 out of U16_MAX
167
+ const take = Number(delegateTake.toString()) / 65535;
168
+ return {
169
+ hotkey,
170
+ totalStake: stakeTao,
171
+ nominatorCount: 0, // Would need to iterate nominators
172
+ take,
173
+ };
174
+ }, `getDelegateInfo(${hotkey})`);
175
+ }
176
+ /**
177
+ * Get the current block number.
178
+ */
179
+ async function getCurrentBlock() {
180
+ return (0, retry_1.withRetry)(async () => {
181
+ const api = await getSubtensorApi();
182
+ const header = await api.rpc.chain.getHeader();
183
+ return header.number.toNumber();
184
+ }, 'getCurrentBlock');
185
+ }
186
+ //# sourceMappingURL=subtensor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subtensor.js","sourceRoot":"","sources":["../../src/bittensor/subtensor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare function getCached<T = unknown>(key: string): T | null;
2
+ export declare function setCached(key: string, value: unknown, ttlSeconds: number): void;
3
+ export interface SubnetScore {
4
+ subnet_id: number;
5
+ miner_uid: number;
6
+ score: number;
7
+ updated_at: number;
8
+ }
9
+ export declare function getSubnetScores(subnetId: number): SubnetScore[];
10
+ export declare function updateSubnetScore(subnetId: number, minerUid: number, score: number): void;
11
+ export declare function cleanExpiredCache(): number;
12
+ export declare function closeCache(): void;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAgDA,wBAAgB,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAiB5D;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAc/E;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,EAAE,CAY/D;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAazF;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAc1C;AAED,wBAAgB,UAAU,IAAI,IAAI,CAMjC"}
@@ -0,0 +1,124 @@
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.getCached = getCached;
7
+ exports.setCached = setCached;
8
+ exports.getSubnetScores = getSubnetScores;
9
+ exports.updateSubnetScore = updateSubnetScore;
10
+ exports.cleanExpiredCache = cleanExpiredCache;
11
+ exports.closeCache = closeCache;
12
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
13
+ const path_1 = __importDefault(require("path"));
14
+ const fs_1 = __importDefault(require("fs"));
15
+ const logger_1 = require("../utils/logger");
16
+ const log = (0, logger_1.createLogger)('cache');
17
+ const DATA_DIR = path_1.default.join(process.cwd(), 'data');
18
+ const DB_PATH = path_1.default.join(DATA_DIR, 'tensorgate-cache.db');
19
+ let _db = null;
20
+ function getDb() {
21
+ if (!_db) {
22
+ if (!fs_1.default.existsSync(DATA_DIR)) {
23
+ fs_1.default.mkdirSync(DATA_DIR, { recursive: true });
24
+ }
25
+ _db = new better_sqlite3_1.default(DB_PATH);
26
+ _db.pragma('journal_mode = WAL');
27
+ _db.exec(`
28
+ CREATE TABLE IF NOT EXISTS query_cache (
29
+ key TEXT PRIMARY KEY,
30
+ value TEXT NOT NULL,
31
+ expires_at INTEGER NOT NULL
32
+ );
33
+
34
+ CREATE TABLE IF NOT EXISTS subnet_scores (
35
+ subnet_id INTEGER NOT NULL,
36
+ miner_uid INTEGER NOT NULL,
37
+ score REAL NOT NULL,
38
+ updated_at INTEGER NOT NULL,
39
+ PRIMARY KEY (subnet_id, miner_uid)
40
+ );
41
+
42
+ CREATE INDEX IF NOT EXISTS idx_query_cache_expires
43
+ ON query_cache(expires_at);
44
+
45
+ CREATE INDEX IF NOT EXISTS idx_subnet_scores_subnet
46
+ ON subnet_scores(subnet_id);
47
+ `);
48
+ log.info('Cache database initialized', { path: DB_PATH });
49
+ }
50
+ return _db;
51
+ }
52
+ function getCached(key) {
53
+ try {
54
+ const db = getDb();
55
+ const now = Math.floor(Date.now() / 1000);
56
+ const row = db.prepare('SELECT value FROM query_cache WHERE key = ? AND expires_at > ?').get(key, now);
57
+ if (!row)
58
+ return null;
59
+ log.debug('Cache hit', { key });
60
+ return JSON.parse(row.value);
61
+ }
62
+ catch (err) {
63
+ log.warn('Cache read error', { key, error: err instanceof Error ? err.message : String(err) });
64
+ return null;
65
+ }
66
+ }
67
+ function setCached(key, value, ttlSeconds) {
68
+ try {
69
+ const db = getDb();
70
+ const expiresAt = Math.floor(Date.now() / 1000) + ttlSeconds;
71
+ const serialized = JSON.stringify(value);
72
+ db.prepare('INSERT OR REPLACE INTO query_cache (key, value, expires_at) VALUES (?, ?, ?)').run(key, serialized, expiresAt);
73
+ log.debug('Cache set', { key, ttlSeconds });
74
+ }
75
+ catch (err) {
76
+ log.warn('Cache write error', { key, error: err instanceof Error ? err.message : String(err) });
77
+ }
78
+ }
79
+ function getSubnetScores(subnetId) {
80
+ try {
81
+ const db = getDb();
82
+ const rows = db.prepare('SELECT subnet_id, miner_uid, score, updated_at FROM subnet_scores WHERE subnet_id = ? ORDER BY score DESC').all(subnetId);
83
+ return rows;
84
+ }
85
+ catch (err) {
86
+ log.warn('Failed to read subnet scores', { subnetId, error: err instanceof Error ? err.message : String(err) });
87
+ return [];
88
+ }
89
+ }
90
+ function updateSubnetScore(subnetId, minerUid, score) {
91
+ try {
92
+ const db = getDb();
93
+ const now = Math.floor(Date.now() / 1000);
94
+ db.prepare('INSERT OR REPLACE INTO subnet_scores (subnet_id, miner_uid, score, updated_at) VALUES (?, ?, ?, ?)').run(subnetId, minerUid, score, now);
95
+ log.debug('Subnet score updated', { subnetId, minerUid, score });
96
+ }
97
+ catch (err) {
98
+ log.warn('Failed to update subnet score', { subnetId, minerUid, error: err instanceof Error ? err.message : String(err) });
99
+ }
100
+ }
101
+ function cleanExpiredCache() {
102
+ try {
103
+ const db = getDb();
104
+ const now = Math.floor(Date.now() / 1000);
105
+ const result = db.prepare('DELETE FROM query_cache WHERE expires_at <= ?').run(now);
106
+ const deleted = result.changes;
107
+ if (deleted > 0) {
108
+ log.info('Cleaned expired cache entries', { deleted });
109
+ }
110
+ return deleted;
111
+ }
112
+ catch (err) {
113
+ log.warn('Cache cleanup error', { error: err instanceof Error ? err.message : String(err) });
114
+ return 0;
115
+ }
116
+ }
117
+ function closeCache() {
118
+ if (_db) {
119
+ _db.close();
120
+ _db = null;
121
+ log.info('Cache database closed');
122
+ }
123
+ }
124
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":";;;;;AAgDA,8BAiBC;AAED,8BAcC;AASD,0CAYC;AAED,8CAaC;AAED,8CAcC;AAED,gCAMC;AA7ID,oEAAsC;AACtC,gDAAwB;AACxB,4CAAoB;AACpB,4CAA+C;AAE/C,MAAM,GAAG,GAAG,IAAA,qBAAY,EAAC,OAAO,CAAC,CAAC;AAElC,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;AAClD,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;AAE3D,IAAI,GAAG,GAA6B,IAAI,CAAC;AAEzC,SAAS,KAAK;IACZ,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,YAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC;QAED,GAAG,GAAG,IAAI,wBAAQ,CAAC,OAAO,CAAC,CAAC;QAC5B,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAEjC,GAAG,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;KAoBR,CAAC,CAAC;QAEH,GAAG,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAgB,SAAS,CAAc,GAAW;IAChD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAE1C,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CACpB,gEAAgE,CACjE,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAkC,CAAC;QAEjD,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QAEtB,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAM,CAAC;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/F,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,SAAS,CAAC,GAAW,EAAE,KAAc,EAAE,UAAkB;IACvE,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,UAAU,CAAC;QAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAEzC,EAAE,CAAC,OAAO,CACR,8EAA8E,CAC/E,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;QAElC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClG,CAAC;AACH,CAAC;AASD,SAAgB,eAAe,CAAC,QAAgB;IAC9C,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,2GAA2G,CAC5G,CAAC,GAAG,CAAC,QAAQ,CAAkB,CAAC;QAEjC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,8BAA8B,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChH,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAgB,iBAAiB,CAAC,QAAgB,EAAE,QAAgB,EAAE,KAAa;IACjF,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAE1C,EAAE,CAAC,OAAO,CACR,oGAAoG,CACrG,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QAEtC,GAAG,CAAC,KAAK,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IACnE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,+BAA+B,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7H,CAAC;AACH,CAAC;AAED,SAAgB,iBAAiB;IAC/B,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,GAAG,CAAC,IAAI,CAAC,+BAA+B,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7F,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,SAAgB,UAAU;IACxB,IAAI,GAAG,EAAE,CAAC;QACR,GAAG,CAAC,KAAK,EAAE,CAAC;QACZ,GAAG,GAAG,IAAI,CAAC;QACX,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACpC,CAAC;AACH,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { z } from 'zod';
2
+ declare const configSchema: z.ZodObject<{
3
+ SUBTENSOR_ENDPOINT: z.ZodDefault<z.ZodString>;
4
+ SUBTENSOR_NETWORK: z.ZodDefault<z.ZodEnum<["finney", "test"]>>;
5
+ TGATE_WALLET_NAME: z.ZodDefault<z.ZodString>;
6
+ TGATE_HOTKEY_NAME: z.ZodDefault<z.ZodString>;
7
+ TAOSTATS_API_URL: z.ZodDefault<z.ZodString>;
8
+ CACHE_TTL_SECONDS: z.ZodDefault<z.ZodNumber>;
9
+ LOG_LEVEL: z.ZodDefault<z.ZodEnum<["debug", "info", "warn", "error"]>>;
10
+ }, "strip", z.ZodTypeAny, {
11
+ SUBTENSOR_ENDPOINT: string;
12
+ SUBTENSOR_NETWORK: "finney" | "test";
13
+ TGATE_WALLET_NAME: string;
14
+ TGATE_HOTKEY_NAME: string;
15
+ TAOSTATS_API_URL: string;
16
+ CACHE_TTL_SECONDS: number;
17
+ LOG_LEVEL: "debug" | "info" | "warn" | "error";
18
+ }, {
19
+ SUBTENSOR_ENDPOINT?: string | undefined;
20
+ SUBTENSOR_NETWORK?: "finney" | "test" | undefined;
21
+ TGATE_WALLET_NAME?: string | undefined;
22
+ TGATE_HOTKEY_NAME?: string | undefined;
23
+ TAOSTATS_API_URL?: string | undefined;
24
+ CACHE_TTL_SECONDS?: number | undefined;
25
+ LOG_LEVEL?: "debug" | "info" | "warn" | "error" | undefined;
26
+ }>;
27
+ export type Config = z.infer<typeof configSchema>;
28
+ export declare function getConfig(): Config;
29
+ export {};
30
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;EAyBhB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAIlD,wBAAgB,SAAS,IAAI,MAAM,CAUlC"}
@@ -0,0 +1,48 @@
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.getConfig = getConfig;
7
+ const zod_1 = require("zod");
8
+ const dotenv_1 = __importDefault(require("dotenv"));
9
+ dotenv_1.default.config();
10
+ const configSchema = zod_1.z.object({
11
+ SUBTENSOR_ENDPOINT: zod_1.z
12
+ .string()
13
+ .default('wss://entrypoint-finney.opentensor.ai:443'),
14
+ SUBTENSOR_NETWORK: zod_1.z
15
+ .enum(['finney', 'test'])
16
+ .default('finney'),
17
+ TGATE_WALLET_NAME: zod_1.z
18
+ .string()
19
+ .default('default'),
20
+ TGATE_HOTKEY_NAME: zod_1.z
21
+ .string()
22
+ .default('default'),
23
+ TAOSTATS_API_URL: zod_1.z
24
+ .string()
25
+ .url()
26
+ .default('https://api.taostats.io'),
27
+ CACHE_TTL_SECONDS: zod_1.z
28
+ .coerce.number()
29
+ .int()
30
+ .positive()
31
+ .default(300),
32
+ LOG_LEVEL: zod_1.z
33
+ .enum(['debug', 'info', 'warn', 'error'])
34
+ .default('info'),
35
+ });
36
+ let _config = null;
37
+ function getConfig() {
38
+ if (!_config) {
39
+ const result = configSchema.safeParse(process.env);
40
+ if (!result.success) {
41
+ console.error('Invalid configuration:', result.error.format());
42
+ process.exit(1);
43
+ }
44
+ _config = result.data;
45
+ }
46
+ return _config;
47
+ }
48
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;AAoCA,8BAUC;AA9CD,6BAAwB;AACxB,oDAA4B;AAE5B,gBAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,MAAM,YAAY,GAAG,OAAC,CAAC,MAAM,CAAC;IAC5B,kBAAkB,EAAE,OAAC;SAClB,MAAM,EAAE;SACR,OAAO,CAAC,2CAA2C,CAAC;IACvD,iBAAiB,EAAE,OAAC;SACjB,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;SACxB,OAAO,CAAC,QAAQ,CAAC;IACpB,iBAAiB,EAAE,OAAC;SACjB,MAAM,EAAE;SACR,OAAO,CAAC,SAAS,CAAC;IACrB,iBAAiB,EAAE,OAAC;SACjB,MAAM,EAAE;SACR,OAAO,CAAC,SAAS,CAAC;IACrB,gBAAgB,EAAE,OAAC;SAChB,MAAM,EAAE;SACR,GAAG,EAAE;SACL,OAAO,CAAC,yBAAyB,CAAC;IACrC,iBAAiB,EAAE,OAAC;SACjB,MAAM,CAAC,MAAM,EAAE;SACf,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,OAAO,CAAC,GAAG,CAAC;IACf,SAAS,EAAE,OAAC;SACT,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;SACxC,OAAO,CAAC,MAAM,CAAC;CACnB,CAAC,CAAC;AAIH,IAAI,OAAO,GAAkB,IAAI,CAAC;AAElC,SAAgB,SAAS;IACvB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;IACxB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/build/index.js ADDED
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env node
2
+ #!/usr/bin/env node
3
+ "use strict";
4
+ var __importDefault = (this && this.__importDefault) || function (mod) {
5
+ return (mod && mod.__esModule) ? mod : { "default": mod };
6
+ };
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
9
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
10
+ const dotenv_1 = __importDefault(require("dotenv"));
11
+ const logger_1 = require("./utils/logger");
12
+ const cache_1 = require("./cache");
13
+ const subtensor_1 = require("./bittensor/subtensor");
14
+ const network_stats_1 = require("./tools/network-stats");
15
+ const subnet_health_1 = require("./tools/subnet-health");
16
+ const query_subnet_1 = require("./tools/query-subnet");
17
+ const analyze_token_1 = require("./tools/analyze-token");
18
+ const predictions_1 = require("./tools/predictions");
19
+ const tao_stake_1 = require("./tools/tao-stake");
20
+ dotenv_1.default.config();
21
+ const log = (0, logger_1.createLogger)('main');
22
+ async function main() {
23
+ log.info('Starting TensorGate MCP server v1.0.0');
24
+ const server = new mcp_js_1.McpServer({
25
+ name: 'tensorgate',
26
+ version: '1.0.0',
27
+ });
28
+ // Register tools (cast schema shapes to any for zod version compat with MCP SDK)
29
+ server.tool(network_stats_1.networkStatsTool.name, network_stats_1.networkStatsTool.description, network_stats_1.networkStatsTool.schema.shape, async () => {
30
+ return await network_stats_1.networkStatsTool.handler();
31
+ });
32
+ server.tool(subnet_health_1.subnetHealthTool.name, subnet_health_1.subnetHealthTool.description, subnet_health_1.subnetHealthTool.schema.shape, async (args) => {
33
+ return await subnet_health_1.subnetHealthTool.handler(args);
34
+ });
35
+ server.tool(query_subnet_1.querySubnetTool.name, query_subnet_1.querySubnetTool.description, query_subnet_1.querySubnetTool.schema.shape, async (args) => {
36
+ return await query_subnet_1.querySubnetTool.handler(args);
37
+ });
38
+ server.tool(analyze_token_1.analyzeTokenTool.name, analyze_token_1.analyzeTokenTool.description, analyze_token_1.analyzeTokenTool.schema.shape, async (args) => {
39
+ return await analyze_token_1.analyzeTokenTool.handler(args);
40
+ });
41
+ server.tool(predictions_1.predictionsTool.name, predictions_1.predictionsTool.description, predictions_1.predictionsTool.schema.shape, async (args) => {
42
+ return await predictions_1.predictionsTool.handler(args);
43
+ });
44
+ server.tool(tao_stake_1.stakingInfoTool.name, tao_stake_1.stakingInfoTool.description, tao_stake_1.stakingInfoTool.schema.shape, async (args) => {
45
+ return await tao_stake_1.stakingInfoTool.handler(args);
46
+ });
47
+ log.info('Registered 6 tools: tgate_network_stats, tgate_subnet_health, tgate_query_subnet, tgate_analyze_token, tgate_predictions, tgate_staking_info');
48
+ // Connect via stdio transport
49
+ const transport = new stdio_js_1.StdioServerTransport();
50
+ await server.connect(transport);
51
+ log.info('TensorGate MCP server connected via stdio');
52
+ // Graceful shutdown
53
+ const shutdown = async (signal) => {
54
+ log.info(`Received ${signal}, shutting down gracefully`);
55
+ try {
56
+ await (0, subtensor_1.disconnectSubtensor)();
57
+ (0, cache_1.closeCache)();
58
+ await server.close();
59
+ }
60
+ catch (err) {
61
+ log.error('Error during shutdown', { error: err instanceof Error ? err.message : String(err) });
62
+ }
63
+ process.exit(0);
64
+ };
65
+ process.on('SIGINT', () => shutdown('SIGINT'));
66
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
67
+ process.on('uncaughtException', (err) => {
68
+ log.error('Uncaught exception', { error: err.message, stack: err.stack });
69
+ });
70
+ process.on('unhandledRejection', (reason) => {
71
+ log.error('Unhandled rejection', { reason: reason instanceof Error ? reason.message : String(reason) });
72
+ });
73
+ }
74
+ main().catch((err) => {
75
+ log.error('Fatal error starting TensorGate', { error: err instanceof Error ? err.message : String(err) });
76
+ process.exit(1);
77
+ });
78
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { z } from 'zod';
2
+ export declare const analyzeTokenTool: {
3
+ name: string;
4
+ description: string;
5
+ schema: z.ZodObject<{
6
+ token_symbol: z.ZodString;
7
+ }, "strip", z.ZodTypeAny, {
8
+ token_symbol: string;
9
+ }, {
10
+ token_symbol: string;
11
+ }>;
12
+ handler: (args: {
13
+ token_symbol: string;
14
+ }) => Promise<{
15
+ content: Array<{
16
+ type: "text";
17
+ text: string;
18
+ }>;
19
+ }>;
20
+ };
21
+ //# sourceMappingURL=analyze-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-token.d.ts","sourceRoot":"","sources":["../../src/tools/analyze-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAgCxB,eAAO,MAAM,gBAAgB;;;;;;;;;;oBAML;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,KAAG,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;CAsC7G,CAAC"}