poly-whales 0.0.2 → 0.0.4
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 +7 -2
- package/bun.lock +0 -47
- package/src/cli.ts +0 -25
- package/src/config.ts +0 -55
- package/src/hypersync.ts +0 -18
- package/src/index.ts +0 -125
- package/src/trades.ts +0 -67
- package/src/types.ts +0 -26
- package/src/ui/main.ts +0 -838
- package/src/ui/startup.ts +0 -115
- package/src/utils.ts +0 -36
- package/tsconfig.json +0 -22
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "poly-whales",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"start": "bun src/index.ts",
|
|
@@ -20,5 +20,10 @@
|
|
|
20
20
|
},
|
|
21
21
|
"bin": {
|
|
22
22
|
"poly-whales": "./dist/index.js"
|
|
23
|
-
}
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"dist",
|
|
26
|
+
"README.md",
|
|
27
|
+
"assets"
|
|
28
|
+
]
|
|
24
29
|
}
|
package/bun.lock
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"lockfileVersion": 1,
|
|
3
|
-
"configVersion": 1,
|
|
4
|
-
"workspaces": {
|
|
5
|
-
"": {
|
|
6
|
-
"name": "whale-tracker-tui",
|
|
7
|
-
"dependencies": {
|
|
8
|
-
"@envio-dev/hypersync-client": "^1.1.0",
|
|
9
|
-
"blessed": "^0.1.81",
|
|
10
|
-
},
|
|
11
|
-
"devDependencies": {
|
|
12
|
-
"@types/blessed": "^0.1.25",
|
|
13
|
-
"@types/bun": "latest",
|
|
14
|
-
},
|
|
15
|
-
"peerDependencies": {
|
|
16
|
-
"typescript": "^5",
|
|
17
|
-
},
|
|
18
|
-
},
|
|
19
|
-
},
|
|
20
|
-
"packages": {
|
|
21
|
-
"@envio-dev/hypersync-client": ["@envio-dev/hypersync-client@1.1.0", "", { "optionalDependencies": { "@envio-dev/hypersync-client-darwin-arm64": "1.1.0", "@envio-dev/hypersync-client-darwin-x64": "1.1.0", "@envio-dev/hypersync-client-linux-arm64-gnu": "1.1.0", "@envio-dev/hypersync-client-linux-x64-gnu": "1.1.0", "@envio-dev/hypersync-client-linux-x64-musl": "1.1.0" } }, "sha512-tTCW/fvYPFYIcL6SLcWd5Fe6uPCcXQbLgZaYL3NSvkhvrpw5VSx3M2QbHdpIrhmzoDkZdpIYyFD+pdZhC6Y75g=="],
|
|
22
|
-
|
|
23
|
-
"@envio-dev/hypersync-client-darwin-arm64": ["@envio-dev/hypersync-client-darwin-arm64@1.1.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-WO/yxYiN9nz7pHw7xLs/4hnEHQM5OVcTwvtxZTZHox7It3n7aeBzsJfrGYYqYW1bPxDwSYwb6x9l0/fQc59xeA=="],
|
|
24
|
-
|
|
25
|
-
"@envio-dev/hypersync-client-darwin-x64": ["@envio-dev/hypersync-client-darwin-x64@1.1.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-BOD4gaZ6NAyLDDVgfIhpD25ikjEQpTXNBqbIYuTjWS1D0NiQD5mmyZCFcSMmaJJ0j4iobBQV1LMiNX8nDLahPA=="],
|
|
26
|
-
|
|
27
|
-
"@envio-dev/hypersync-client-linux-arm64-gnu": ["@envio-dev/hypersync-client-linux-arm64-gnu@1.1.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-TDRpAGbfuI4u83Swy50IkGZSMaWXZw/SNC8BiMqLBmYVt1GqFDB1VGrkecf4AhQBPlQk8iDTOxxIKNuOCsY//A=="],
|
|
28
|
-
|
|
29
|
-
"@envio-dev/hypersync-client-linux-x64-gnu": ["@envio-dev/hypersync-client-linux-x64-gnu@1.1.0", "", { "os": "linux", "cpu": "x64" }, "sha512-ooOdLfrhq8W3J76pcJDWuXIpu9cTBjZR86XkkHaheDNkYQlBZ7h5oG3IhNTLnooFkih+6+9dfcfOdG4NMmylGA=="],
|
|
30
|
-
|
|
31
|
-
"@envio-dev/hypersync-client-linux-x64-musl": ["@envio-dev/hypersync-client-linux-x64-musl@1.1.0", "", { "os": "linux", "cpu": "x64" }, "sha512-WS717WyRyTZPRMfYmscRslRIhxWNKzdQR3SLugqQs0z1W7wo58WMufhr5EpzID5/GR10zexz+Y3a4HWMAGiu+Q=="],
|
|
32
|
-
|
|
33
|
-
"@types/blessed": ["@types/blessed@0.1.27", "", { "dependencies": { "@types/node": "*" } }, "sha512-ZOQGjLvWDclAXp0rW5iuUBXeD6Gr1PkitN7tj7/G8FCoSzTsij6OhXusOzMKhwrZ9YlL2Pmu0d6xJ9zVvk+Hsg=="],
|
|
34
|
-
|
|
35
|
-
"@types/bun": ["@types/bun@1.3.10", "", { "dependencies": { "bun-types": "1.3.10" } }, "sha512-0+rlrUrOrTSskibryHbvQkDOWRJwJZqZlxrUs1u4oOoTln8+WIXBPmAuCF35SWB2z4Zl3E84Nl/D0P7803nigQ=="],
|
|
36
|
-
|
|
37
|
-
"@types/node": ["@types/node@25.4.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-9wLpoeWuBlcbBpOY3XmzSTG3oscB6xjBEEtn+pYXTfhyXhIxC5FsBer2KTopBlvKEiW9l13po9fq+SJY/5lkhw=="],
|
|
38
|
-
|
|
39
|
-
"blessed": ["blessed@0.1.81", "", { "bin": { "blessed": "./bin/tput.js" } }, "sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ=="],
|
|
40
|
-
|
|
41
|
-
"bun-types": ["bun-types@1.3.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-tcpfCCl6XWo6nCVnpcVrxQ+9AYN1iqMIzgrSKYMB/fjLtV2eyAVEg7AxQJuCq/26R6HpKWykQXuSOq/21RYcbg=="],
|
|
42
|
-
|
|
43
|
-
"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
|
|
44
|
-
|
|
45
|
-
"undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="],
|
|
46
|
-
}
|
|
47
|
-
}
|
package/src/cli.ts
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import type { CliArgs } from "./types";
|
|
2
|
-
|
|
3
|
-
// ─── CLI Arguments ──────────────────────────────────────────────────────────
|
|
4
|
-
|
|
5
|
-
export const parseArgs = (argv: string[]): CliArgs => {
|
|
6
|
-
let threshold = 100;
|
|
7
|
-
let addresses: string[] = [];
|
|
8
|
-
|
|
9
|
-
for (let i = 0; i < argv.length; i++) {
|
|
10
|
-
const arg = argv[i];
|
|
11
|
-
if ((arg === "-t" || arg === "--threshold") && argv[i + 1]) {
|
|
12
|
-
const val = Number(argv[i + 1]);
|
|
13
|
-
if (!isNaN(val) && val > 0) threshold = val;
|
|
14
|
-
i++;
|
|
15
|
-
} else if ((arg === "-a" || arg === "--addresses") && argv[i + 1]) {
|
|
16
|
-
addresses = argv[i + 1]!
|
|
17
|
-
.split(",")
|
|
18
|
-
.map((a) => a.trim().toLowerCase())
|
|
19
|
-
.filter((a) => a.startsWith("0x") && a.length >= 10);
|
|
20
|
-
i++;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
return { threshold, addresses };
|
|
25
|
-
};
|
package/src/config.ts
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import * as fs from "fs";
|
|
2
|
-
import * as path from "path";
|
|
3
|
-
|
|
4
|
-
// ─── Configuration ──────────────────────────────────────────────────────────
|
|
5
|
-
|
|
6
|
-
export let ENVIO_API_TOKEN: string | null = process.env.ENVIO_API_TOKEN ?? null;
|
|
7
|
-
export const ENVIO_URL = process.env.ENVIO_URL ?? "https://polygon.hypersync.xyz";
|
|
8
|
-
|
|
9
|
-
export const HYPERSYNC_CONFIG_DIR = path.join(process.env.HOME ?? "~", ".hypersync");
|
|
10
|
-
export const HYPERSYNC_ENV_FILE = path.join(HYPERSYNC_CONFIG_DIR, ".env");
|
|
11
|
-
|
|
12
|
-
export const ORDER_FILLED_SIG =
|
|
13
|
-
"event OrderFilled(bytes32 indexed orderHash, address indexed maker, address indexed taker, uint256 makerAssetId, uint256 takerAssetId, uint256 makerAmountFilled, uint256 takerAmountFilled, uint256 fee)";
|
|
14
|
-
|
|
15
|
-
export const EXCHANGE_ADDRESSES = [
|
|
16
|
-
"0x4bfb41d5b3570defd03c39a9a4d8de6bd8b8982e",
|
|
17
|
-
"0xc5d563a36ae78145c45a50134d48a1215220f80a",
|
|
18
|
-
].map((a) => a.toLowerCase());
|
|
19
|
-
|
|
20
|
-
export const ORDER_FILLED_TOPIC =
|
|
21
|
-
"0xd0a08e8c493f9c94f29311604c9de1b4e8c8d4c06bd0c789af57f2d65bfec0f6";
|
|
22
|
-
|
|
23
|
-
// ─── API Key Management ──────────────────────────────────────────────────────
|
|
24
|
-
|
|
25
|
-
export const loadStoredApiKey = (): string | null => {
|
|
26
|
-
try {
|
|
27
|
-
if (fs.existsSync(HYPERSYNC_ENV_FILE)) {
|
|
28
|
-
const content = fs.readFileSync(HYPERSYNC_ENV_FILE, "utf-8");
|
|
29
|
-
const match = content.match(/^ENVIO_API_TOKEN=(.+)$/m);
|
|
30
|
-
if (match && match[1]) {
|
|
31
|
-
return match[1].trim();
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
} catch (err) {
|
|
35
|
-
// Silently fail if file can't be read
|
|
36
|
-
}
|
|
37
|
-
return null;
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
export const saveApiKey = (apiKey: string): boolean => {
|
|
41
|
-
try {
|
|
42
|
-
if (!fs.existsSync(HYPERSYNC_CONFIG_DIR)) {
|
|
43
|
-
fs.mkdirSync(HYPERSYNC_CONFIG_DIR, { recursive: true });
|
|
44
|
-
}
|
|
45
|
-
fs.writeFileSync(HYPERSYNC_ENV_FILE, `ENVIO_API_TOKEN=${apiKey}\n`);
|
|
46
|
-
return true;
|
|
47
|
-
} catch (err) {
|
|
48
|
-
console.error("Failed to save API key:", err);
|
|
49
|
-
return false;
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
export const setApiToken = (token: string) => {
|
|
54
|
-
ENVIO_API_TOKEN = token;
|
|
55
|
-
};
|
package/src/hypersync.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { HypersyncClient, Decoder } from "@envio-dev/hypersync-client";
|
|
2
|
-
import { ENVIO_URL, ORDER_FILLED_SIG } from "./config";
|
|
3
|
-
|
|
4
|
-
// ─── HyperSync Client Management ─────────────────────────────────────────────
|
|
5
|
-
|
|
6
|
-
export let client: HypersyncClient | null = null;
|
|
7
|
-
export let decoder: Decoder | null = null;
|
|
8
|
-
|
|
9
|
-
export const initializeHyperSync = (apiToken: string) => {
|
|
10
|
-
client = new HypersyncClient({
|
|
11
|
-
url: ENVIO_URL,
|
|
12
|
-
apiToken,
|
|
13
|
-
});
|
|
14
|
-
decoder = Decoder.fromSignatures([ORDER_FILLED_SIG]);
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
export const getClient = (): HypersyncClient | null => client;
|
|
18
|
-
export const getDecoder = (): Decoder | null => decoder;
|
package/src/index.ts
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import blessed from "blessed";
|
|
4
|
-
import { parseArgs } from "./cli";
|
|
5
|
-
import { loadStoredApiKey, saveApiKey, setApiToken } from "./config";
|
|
6
|
-
import { initializeHyperSync, getClient, getDecoder } from "./hypersync";
|
|
7
|
-
import { createStartupPrompt } from "./ui/startup";
|
|
8
|
-
|
|
9
|
-
// ─── Main Application ───────────────────────────────────────────────────────
|
|
10
|
-
|
|
11
|
-
const createScreen = () => {
|
|
12
|
-
return blessed.screen({
|
|
13
|
-
smartCSR: true,
|
|
14
|
-
title: "Polymarket Whale Tracker",
|
|
15
|
-
fullUnicode: true,
|
|
16
|
-
});
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
const validateApiKey = async (apiKey: string): Promise<boolean> => {
|
|
20
|
-
const trimmed = apiKey.trim();
|
|
21
|
-
|
|
22
|
-
// Basic format validation
|
|
23
|
-
if (!trimmed.match(/^[a-zA-Z0-9\-]+$/)) {
|
|
24
|
-
return false;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
// Try to initialize and test connection
|
|
28
|
-
try {
|
|
29
|
-
initializeHyperSync(trimmed);
|
|
30
|
-
const client = getClient();
|
|
31
|
-
if (!client) return false;
|
|
32
|
-
await client.getHeight();
|
|
33
|
-
return true;
|
|
34
|
-
} catch (err) {
|
|
35
|
-
return false;
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
const initializeApp = async () => {
|
|
40
|
-
const screen = createScreen();
|
|
41
|
-
const startup = createStartupPrompt(screen);
|
|
42
|
-
|
|
43
|
-
// Parse CLI args early for later use
|
|
44
|
-
const cliArgs = parseArgs(process.argv.slice(2));
|
|
45
|
-
|
|
46
|
-
// Try to load existing API key
|
|
47
|
-
let apiKey = loadStoredApiKey();
|
|
48
|
-
|
|
49
|
-
const processApiKey = async (providedKey: string) => {
|
|
50
|
-
const trimmed = providedKey.trim();
|
|
51
|
-
|
|
52
|
-
if (!trimmed) {
|
|
53
|
-
startup.setErrorMessage("{red-fg}API key cannot be empty{/red-fg}");
|
|
54
|
-
startup.readInput();
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
startup.setStatusMessage(
|
|
59
|
-
"Validating API key...\n{gray-fg}Initializing HyperSync{/gray-fg}",
|
|
60
|
-
);
|
|
61
|
-
|
|
62
|
-
const isValid = await validateApiKey(trimmed);
|
|
63
|
-
if (!isValid) {
|
|
64
|
-
startup.setErrorMessage(
|
|
65
|
-
"{red-fg}Failed to validate API key. Check your key and try again.{/red-fg}",
|
|
66
|
-
);
|
|
67
|
-
startup.setStatusMessage(
|
|
68
|
-
"Enter your HyperSync API key to continue.\n{gray-fg}This will be saved to ~/.hypersync/.env{/gray-fg}",
|
|
69
|
-
);
|
|
70
|
-
startup.readInput();
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const saved = saveApiKey(trimmed);
|
|
75
|
-
if (!saved) {
|
|
76
|
-
startup.setErrorMessage(
|
|
77
|
-
"{yellow-fg}API key validated but couldn't save to disk{/yellow-fg}",
|
|
78
|
-
);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
setApiToken(trimmed);
|
|
82
|
-
apiKey = trimmed;
|
|
83
|
-
|
|
84
|
-
startup.hide();
|
|
85
|
-
startup.cleanup();
|
|
86
|
-
|
|
87
|
-
// Import and run the main app (in separate module for modularity)
|
|
88
|
-
const { bootUI } = await import("./ui/main");
|
|
89
|
-
bootUI(screen, cliArgs);
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
startup.input.on("submit", (value) => {
|
|
93
|
-
void processApiKey(String(value ?? ""));
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
startup.input.on("cancel", () => {
|
|
97
|
-
process.exit(0);
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
screen.render();
|
|
101
|
-
|
|
102
|
-
// If we have a stored key, try to use it
|
|
103
|
-
if (apiKey) {
|
|
104
|
-
startup.input.setValue(apiKey);
|
|
105
|
-
const isValid = await validateApiKey(apiKey);
|
|
106
|
-
if (isValid) {
|
|
107
|
-
setApiToken(apiKey);
|
|
108
|
-
startup.hide();
|
|
109
|
-
startup.cleanup();
|
|
110
|
-
const { bootUI } = await import("./ui/main");
|
|
111
|
-
bootUI(screen, cliArgs);
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// Otherwise, show the prompt
|
|
117
|
-
startup.focus();
|
|
118
|
-
startup.readInput();
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
// Start the application
|
|
122
|
-
initializeApp().catch((err) => {
|
|
123
|
-
console.error("Fatal error:", err);
|
|
124
|
-
process.exit(1);
|
|
125
|
-
});
|
package/src/trades.ts
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import type { TradeDirection, ParsedTrade } from "./types";
|
|
2
|
-
import { usdcFromRaw } from "./utils";
|
|
3
|
-
|
|
4
|
-
// ─── Trade Classification ───────────────────────────────────────────────────
|
|
5
|
-
|
|
6
|
-
export const classifyTrade = (args: {
|
|
7
|
-
makerAssetId: string;
|
|
8
|
-
takerAssetId: string;
|
|
9
|
-
makerAmountFilled: string;
|
|
10
|
-
takerAmountFilled: string;
|
|
11
|
-
maker: string;
|
|
12
|
-
taker: string;
|
|
13
|
-
}): {
|
|
14
|
-
usdc: number;
|
|
15
|
-
buyer: string | null;
|
|
16
|
-
buyerSide: "maker" | "taker" | null;
|
|
17
|
-
direction: TradeDirection;
|
|
18
|
-
} => {
|
|
19
|
-
const {
|
|
20
|
-
makerAssetId,
|
|
21
|
-
takerAssetId,
|
|
22
|
-
makerAmountFilled,
|
|
23
|
-
takerAmountFilled,
|
|
24
|
-
maker,
|
|
25
|
-
taker,
|
|
26
|
-
} = args;
|
|
27
|
-
|
|
28
|
-
if (makerAssetId === "0") {
|
|
29
|
-
return {
|
|
30
|
-
usdc: usdcFromRaw(makerAmountFilled),
|
|
31
|
-
buyer: maker,
|
|
32
|
-
buyerSide: "maker",
|
|
33
|
-
direction: "BUY",
|
|
34
|
-
};
|
|
35
|
-
} else if (takerAssetId === "0") {
|
|
36
|
-
return {
|
|
37
|
-
usdc: usdcFromRaw(takerAmountFilled),
|
|
38
|
-
buyer: taker,
|
|
39
|
-
buyerSide: "taker",
|
|
40
|
-
direction: "SELL",
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
return { usdc: 0, buyer: null, buyerSide: null, direction: "UNKNOWN" };
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
export const filterTrades = (
|
|
48
|
-
trades: ParsedTrade[],
|
|
49
|
-
threshold: number,
|
|
50
|
-
watchAddresses: string[],
|
|
51
|
-
): ParsedTrade[] => {
|
|
52
|
-
return trades.filter((trade) => {
|
|
53
|
-
// Only show BUY trades above threshold
|
|
54
|
-
if (trade.direction !== "BUY") return false;
|
|
55
|
-
if (trade.usdc <= threshold) return false;
|
|
56
|
-
|
|
57
|
-
// Filter by watched addresses if any are set
|
|
58
|
-
if (watchAddresses.length > 0) {
|
|
59
|
-
const matchesBuyer = trade.buyer && watchAddresses.includes(trade.buyer);
|
|
60
|
-
const matchesMaker = watchAddresses.includes(trade.maker);
|
|
61
|
-
const matchesTaker = watchAddresses.includes(trade.taker);
|
|
62
|
-
if (!matchesBuyer && !matchesMaker && !matchesTaker) return false;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
return true;
|
|
66
|
-
});
|
|
67
|
-
};
|
package/src/types.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
// ─── Types ──────────────────────────────────────────────────────────────────
|
|
2
|
-
|
|
3
|
-
export type TradeDirection = "BUY" | "SELL" | "UNKNOWN";
|
|
4
|
-
|
|
5
|
-
export type ParsedTrade = {
|
|
6
|
-
txHash: string;
|
|
7
|
-
blockNumber?: number;
|
|
8
|
-
orderHash: string;
|
|
9
|
-
maker: string;
|
|
10
|
-
taker: string;
|
|
11
|
-
makerAssetId: string;
|
|
12
|
-
takerAssetId: string;
|
|
13
|
-
makerAmountFilled: string;
|
|
14
|
-
takerAmountFilled: string;
|
|
15
|
-
fee: string;
|
|
16
|
-
buyer: string | null;
|
|
17
|
-
buyerSide: "maker" | "taker" | null;
|
|
18
|
-
direction: TradeDirection;
|
|
19
|
-
usdc: number;
|
|
20
|
-
timestamp: Date;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
export type CliArgs = {
|
|
24
|
-
threshold: number;
|
|
25
|
-
addresses: string[];
|
|
26
|
-
};
|