hood-traders 0.1.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.
- package/LICENSE +201 -0
- package/README.md +214 -0
- package/dashboard/app.js +215 -0
- package/dashboard/index.html +44 -0
- package/dashboard/style.css +309 -0
- package/dist/chunk-NXL2F7EP.js +1371 -0
- package/dist/chunk-NXL2F7EP.js.map +1 -0
- package/dist/index.d.ts +697 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/main.js +59 -0
- package/dist/main.js.map +1 -0
- package/package.json +75 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
Agent,
|
|
4
|
+
Fleet,
|
|
5
|
+
Journal,
|
|
6
|
+
KillSwitch,
|
|
7
|
+
LaunchSniper,
|
|
8
|
+
Market,
|
|
9
|
+
Momentum,
|
|
10
|
+
PremiumWatch,
|
|
11
|
+
RiskEngine,
|
|
12
|
+
createDashboardServer,
|
|
13
|
+
loadFleetConfig,
|
|
14
|
+
utcDayStart
|
|
15
|
+
} from "./chunk-NXL2F7EP.js";
|
|
16
|
+
export {
|
|
17
|
+
Agent,
|
|
18
|
+
Fleet,
|
|
19
|
+
Journal,
|
|
20
|
+
KillSwitch,
|
|
21
|
+
LaunchSniper,
|
|
22
|
+
Market,
|
|
23
|
+
Momentum,
|
|
24
|
+
PremiumWatch,
|
|
25
|
+
RiskEngine,
|
|
26
|
+
createDashboardServer,
|
|
27
|
+
loadFleetConfig,
|
|
28
|
+
utcDayStart
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/main.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
Fleet,
|
|
4
|
+
LaunchSniper,
|
|
5
|
+
Momentum,
|
|
6
|
+
PremiumWatch,
|
|
7
|
+
createDashboardServer,
|
|
8
|
+
loadFleetConfig
|
|
9
|
+
} from "./chunk-NXL2F7EP.js";
|
|
10
|
+
|
|
11
|
+
// src/main.ts
|
|
12
|
+
import { join } from "path";
|
|
13
|
+
import { fileURLToPath } from "url";
|
|
14
|
+
var DASHBOARD_STATIC_ROOT = join(fileURLToPath(new URL(".", import.meta.url)), "..", "dashboard");
|
|
15
|
+
async function main() {
|
|
16
|
+
const config = loadFleetConfig();
|
|
17
|
+
const fleet = new Fleet(config);
|
|
18
|
+
fleet.addAgents([
|
|
19
|
+
{ id: "sniper-1", strategy: new LaunchSniper(), tickIntervalMs: 4e3 },
|
|
20
|
+
{ id: "momentum-1", strategy: new Momentum(), tickIntervalMs: 15e3 },
|
|
21
|
+
{ id: "premium-1", strategy: new PremiumWatch(), tickIntervalMs: 3e4 }
|
|
22
|
+
]);
|
|
23
|
+
const banner = [
|
|
24
|
+
"\u2500".repeat(60),
|
|
25
|
+
" hood-traders \u2014 Robinhood Chain autonomous fleet",
|
|
26
|
+
"\u2500".repeat(60),
|
|
27
|
+
` network : ${config.network} (${config.network === "testnet" ? 46630 : 4663})`,
|
|
28
|
+
` mode : ${config.mode.toUpperCase()}${config.mode === "paper" ? " (simulation only, no real funds move)" : " (REAL FUNDS \u2014 swaps will be signed and broadcast)"}`,
|
|
29
|
+
` agents : sniper-1, momentum-1, premium-1`,
|
|
30
|
+
` fleet cap : $${config.fleetMaxDailySpendUsdg}/day`,
|
|
31
|
+
` dashboard : http://localhost:${config.dashboardPort}`,
|
|
32
|
+
` kill file : ${config.killFile}`,
|
|
33
|
+
"\u2500".repeat(60)
|
|
34
|
+
].join("\n");
|
|
35
|
+
console.log(banner);
|
|
36
|
+
if (config.mode === "live") {
|
|
37
|
+
console.warn(
|
|
38
|
+
"\n\u26A0 LIVE MODE \u2014 this process will sign and broadcast real transactions with real funds.\n Risk caps are active but are not a guarantee against loss. Ctrl-C or POST /kill to halt.\n"
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
await fleet.start();
|
|
42
|
+
const server = createDashboardServer(fleet, DASHBOARD_STATIC_ROOT);
|
|
43
|
+
server.listen(config.dashboardPort, () => {
|
|
44
|
+
console.log(`dashboard listening on :${config.dashboardPort}`);
|
|
45
|
+
});
|
|
46
|
+
const shutdown = () => {
|
|
47
|
+
console.log("\nshutting down \u2014 stopping agents, closing journal\u2026");
|
|
48
|
+
server.close();
|
|
49
|
+
fleet.close();
|
|
50
|
+
process.exit(0);
|
|
51
|
+
};
|
|
52
|
+
process.on("SIGINT", shutdown);
|
|
53
|
+
process.on("SIGTERM", shutdown);
|
|
54
|
+
}
|
|
55
|
+
main().catch((err) => {
|
|
56
|
+
console.error("hood-traders fatal error:", err);
|
|
57
|
+
process.exit(1);
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/main.ts"],"sourcesContent":["import { join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { loadFleetConfig } from './framework/config.js'\nimport { Fleet } from './framework/fleet.js'\nimport { LaunchSniper } from './strategies/launch-sniper.js'\nimport { Momentum } from './strategies/momentum.js'\nimport { PremiumWatch } from './strategies/premium-watch.js'\nimport { createDashboardServer } from './server/dashboard.js'\n\n// main.ts sits at a stable one-level depth in both trees: src/main.ts (tsx,\n// dev) and dist/main.js (tsup bundle, prod) — so \"one level up + dashboard\"\n// resolves correctly in both without guessing at bundler output shape.\nconst DASHBOARD_STATIC_ROOT = join(fileURLToPath(new URL('.', import.meta.url)), '..', 'dashboard')\n\nasync function main(): Promise<void> {\n const config = loadFleetConfig()\n const fleet = new Fleet(config)\n\n fleet.addAgents([\n { id: 'sniper-1', strategy: new LaunchSniper(), tickIntervalMs: 4000 },\n { id: 'momentum-1', strategy: new Momentum(), tickIntervalMs: 15000 },\n { id: 'premium-1', strategy: new PremiumWatch(), tickIntervalMs: 30000 },\n ])\n\n const banner = [\n '─'.repeat(60),\n ' hood-traders — Robinhood Chain autonomous fleet',\n '─'.repeat(60),\n ` network : ${config.network} (${config.network === 'testnet' ? 46630 : 4663})`,\n ` mode : ${config.mode.toUpperCase()}${config.mode === 'paper' ? ' (simulation only, no real funds move)' : ' (REAL FUNDS — swaps will be signed and broadcast)'}`,\n ` agents : sniper-1, momentum-1, premium-1`,\n ` fleet cap : $${config.fleetMaxDailySpendUsdg}/day`,\n ` dashboard : http://localhost:${config.dashboardPort}`,\n ` kill file : ${config.killFile}`,\n '─'.repeat(60),\n ].join('\\n')\n console.log(banner)\n\n if (config.mode === 'live') {\n console.warn(\n '\\n⚠ LIVE MODE — this process will sign and broadcast real transactions with real funds.\\n' +\n ' Risk caps are active but are not a guarantee against loss. Ctrl-C or POST /kill to halt.\\n',\n )\n }\n\n await fleet.start()\n\n const server = createDashboardServer(fleet, DASHBOARD_STATIC_ROOT)\n server.listen(config.dashboardPort, () => {\n console.log(`dashboard listening on :${config.dashboardPort}`)\n })\n\n const shutdown = () => {\n console.log('\\nshutting down — stopping agents, closing journal…')\n server.close()\n fleet.close()\n process.exit(0)\n }\n process.on('SIGINT', shutdown)\n process.on('SIGTERM', shutdown)\n}\n\nmain().catch((err) => {\n console.error('hood-traders fatal error:', err)\n process.exit(1)\n})\n"],"mappings":";;;;;;;;;;;AAAA,SAAS,YAAY;AACrB,SAAS,qBAAqB;AAW9B,IAAM,wBAAwB,KAAK,cAAc,IAAI,IAAI,KAAK,YAAY,GAAG,CAAC,GAAG,MAAM,WAAW;AAElG,eAAe,OAAsB;AACnC,QAAM,SAAS,gBAAgB;AAC/B,QAAM,QAAQ,IAAI,MAAM,MAAM;AAE9B,QAAM,UAAU;AAAA,IACd,EAAE,IAAI,YAAY,UAAU,IAAI,aAAa,GAAG,gBAAgB,IAAK;AAAA,IACrE,EAAE,IAAI,cAAc,UAAU,IAAI,SAAS,GAAG,gBAAgB,KAAM;AAAA,IACpE,EAAE,IAAI,aAAa,UAAU,IAAI,aAAa,GAAG,gBAAgB,IAAM;AAAA,EACzE,CAAC;AAED,QAAM,SAAS;AAAA,IACb,SAAI,OAAO,EAAE;AAAA,IACb;AAAA,IACA,SAAI,OAAO,EAAE;AAAA,IACb,gBAAgB,OAAO,OAAO,KAAK,OAAO,YAAY,YAAY,QAAQ,IAAI;AAAA,IAC9E,gBAAgB,OAAO,KAAK,YAAY,CAAC,GAAG,OAAO,SAAS,UAAU,2CAA2C,yDAAoD;AAAA,IACrK;AAAA,IACA,iBAAiB,OAAO,sBAAsB;AAAA,IAC9C,iCAAiC,OAAO,aAAa;AAAA,IACrD,gBAAgB,OAAO,QAAQ;AAAA,IAC/B,SAAI,OAAO,EAAE;AAAA,EACf,EAAE,KAAK,IAAI;AACX,UAAQ,IAAI,MAAM;AAElB,MAAI,OAAO,SAAS,QAAQ;AAC1B,YAAQ;AAAA,MACN;AAAA,IAEF;AAAA,EACF;AAEA,QAAM,MAAM,MAAM;AAElB,QAAM,SAAS,sBAAsB,OAAO,qBAAqB;AACjE,SAAO,OAAO,OAAO,eAAe,MAAM;AACxC,YAAQ,IAAI,2BAA2B,OAAO,aAAa,EAAE;AAAA,EAC/D,CAAC;AAED,QAAM,WAAW,MAAM;AACrB,YAAQ,IAAI,+DAAqD;AACjE,WAAO,MAAM;AACb,UAAM,MAAM;AACZ,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,UAAQ,GAAG,UAAU,QAAQ;AAC7B,UAAQ,GAAG,WAAW,QAAQ;AAChC;AAEA,KAAK,EAAE,MAAM,CAAC,QAAQ;AACpB,UAAQ,MAAM,6BAA6B,GAAG;AAC9C,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "hood-traders",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A framework and runnable fleet of autonomous agents that trade Robinhood Chain (4663) memecoins and watch Stock Token premium/discount — real quotes, real risk caps, real signed swaps, live P&L dashboard.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"robinhood-chain",
|
|
7
|
+
"trading-agent",
|
|
8
|
+
"autonomous-agent",
|
|
9
|
+
"memecoin",
|
|
10
|
+
"stock-tokens",
|
|
11
|
+
"usdg",
|
|
12
|
+
"viem",
|
|
13
|
+
"defi"
|
|
14
|
+
],
|
|
15
|
+
"license": "Apache-2.0",
|
|
16
|
+
"author": "nirholas (https://x.com/nichxbt)",
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/nirholas/hood-traders.git"
|
|
20
|
+
},
|
|
21
|
+
"homepage": "https://nirholas.github.io/hood-traders/",
|
|
22
|
+
"bugs": {
|
|
23
|
+
"url": "https://github.com/nirholas/hood-traders/issues"
|
|
24
|
+
},
|
|
25
|
+
"type": "module",
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=20"
|
|
28
|
+
},
|
|
29
|
+
"sideEffects": false,
|
|
30
|
+
"main": "./dist/index.js",
|
|
31
|
+
"types": "./dist/index.d.ts",
|
|
32
|
+
"exports": {
|
|
33
|
+
".": {
|
|
34
|
+
"types": "./dist/index.d.ts",
|
|
35
|
+
"import": "./dist/index.js"
|
|
36
|
+
},
|
|
37
|
+
"./package.json": "./package.json"
|
|
38
|
+
},
|
|
39
|
+
"files": [
|
|
40
|
+
"dist",
|
|
41
|
+
"dashboard",
|
|
42
|
+
"README.md",
|
|
43
|
+
"LICENSE"
|
|
44
|
+
],
|
|
45
|
+
"bin": {
|
|
46
|
+
"hood-traders": "./dist/main.js"
|
|
47
|
+
},
|
|
48
|
+
"scripts": {
|
|
49
|
+
"build": "tsup",
|
|
50
|
+
"start": "node dist/main.js",
|
|
51
|
+
"dev": "tsx watch src/main.ts",
|
|
52
|
+
"fleet": "tsx src/main.ts",
|
|
53
|
+
"typecheck": "tsc --noEmit",
|
|
54
|
+
"test": "vitest run tests/unit",
|
|
55
|
+
"test:e2e": "vitest run tests/e2e --testTimeout 120000",
|
|
56
|
+
"snapshot": "tsx scripts/capture-snapshot.ts",
|
|
57
|
+
"testnet-trade": "tsx scripts/testnet-trade.ts",
|
|
58
|
+
"capture-session": "node scripts/capture-session.mjs"
|
|
59
|
+
},
|
|
60
|
+
"dependencies": {
|
|
61
|
+
"better-sqlite3": "^11.8.0",
|
|
62
|
+
"hoodchain": "^0.1.1",
|
|
63
|
+
"viem": "^2.55.0",
|
|
64
|
+
"ws": "^8.18.0"
|
|
65
|
+
},
|
|
66
|
+
"devDependencies": {
|
|
67
|
+
"@types/better-sqlite3": "^7.6.0",
|
|
68
|
+
"@types/node": "^24.0.0",
|
|
69
|
+
"@types/ws": "^8.18.0",
|
|
70
|
+
"tsup": "^8.5.0",
|
|
71
|
+
"tsx": "^4.19.0",
|
|
72
|
+
"typescript": "^5.9.0",
|
|
73
|
+
"vitest": "^3.2.0"
|
|
74
|
+
}
|
|
75
|
+
}
|