@polymarbot/shared 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/basic.cjs ADDED
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/utils/basic.ts
21
+ var basic_exports = {};
22
+ __export(basic_exports, {
23
+ isUrl: () => isUrl,
24
+ safeJsonParse: () => safeJsonParse,
25
+ sleep: () => sleep,
26
+ stableStringify: () => stableStringify
27
+ });
28
+ module.exports = __toCommonJS(basic_exports);
29
+ function sleep(ms) {
30
+ return new Promise((resolve) => setTimeout(resolve, ms));
31
+ }
32
+ function safeJsonParse(str, defaultValue) {
33
+ try {
34
+ return JSON.parse(str);
35
+ } catch (e) {
36
+ console.error(e);
37
+ return defaultValue ?? {};
38
+ }
39
+ }
40
+ function isUrl(str) {
41
+ return str.startsWith("http://") || str.startsWith("https://");
42
+ }
43
+ function stableStringify(value, sortArray = false) {
44
+ if (value === null || value === void 0) {
45
+ return JSON.stringify(value);
46
+ }
47
+ if (typeof value !== "object") {
48
+ return JSON.stringify(value);
49
+ }
50
+ if (Array.isArray(value)) {
51
+ const processedArray = value.map((item) => {
52
+ if (item !== null && typeof item === "object") {
53
+ return stableStringify(item, sortArray);
54
+ }
55
+ return item;
56
+ });
57
+ const finalProcessedArray = sortArray ? [...processedArray].sort((a, b) => {
58
+ const strA = typeof a === "string" ? a : JSON.stringify(a);
59
+ const strB = typeof b === "string" ? b : JSON.stringify(b);
60
+ return strA.localeCompare(strB);
61
+ }) : processedArray;
62
+ const finalArray = finalProcessedArray.map((item) => {
63
+ if (typeof item === "string" && (item.startsWith("{") || item.startsWith("["))) {
64
+ return JSON.parse(item);
65
+ }
66
+ return item;
67
+ });
68
+ return JSON.stringify(finalArray);
69
+ }
70
+ const sortedKeys = Object.keys(value).sort();
71
+ const sortedObj = {};
72
+ for (const key of sortedKeys) {
73
+ const val = value[key];
74
+ if (val !== null && typeof val === "object") {
75
+ sortedObj[key] = JSON.parse(stableStringify(val, sortArray));
76
+ } else {
77
+ sortedObj[key] = val;
78
+ }
79
+ }
80
+ return JSON.stringify(sortedObj);
81
+ }
82
+ // Annotate the CommonJS export names for ESM import in node:
83
+ 0 && (module.exports = {
84
+ isUrl,
85
+ safeJsonParse,
86
+ sleep,
87
+ stableStringify
88
+ });
package/basic.d.cts ADDED
@@ -0,0 +1,34 @@
1
+ /**
2
+ * 等待指定毫秒
3
+ * @param ms
4
+ * @returns {Promise<any>}
5
+ */
6
+ declare function sleep(ms: number): Promise<void>;
7
+ /**
8
+ * 安全解析Json
9
+ * @param str - 需要解析的字符串
10
+ * @param defaultValue - 解析失败时的默认值
11
+ */
12
+ declare function safeJsonParse<T extends object | unknown[]>(str?: string, defaultValue?: T): T;
13
+ /**
14
+ * 判断字符串是否为 URL
15
+ * @param str - 需要判断的字符串
16
+ * @returns 是否为 URL
17
+ */
18
+ declare function isUrl(str: string): boolean;
19
+ /**
20
+ * 将对象序列化为稳定的 JSON 字符串
21
+ * 通过深度遍历对象,对所有 key 进行排序,确保相同值的对象序列化结果一致
22
+ *
23
+ * 处理策略:
24
+ * - 对象:按 key 字母序排序
25
+ * - 数组:当 sortArray 为 true 时,对基本类型直接排序,对对象类型先序列化再排序;为 false 时保持原顺序
26
+ * - 从底层向上递归处理,确保嵌套结构都被正确处理
27
+ *
28
+ * @param value - 需要序列化的值
29
+ * @param sortArray - 是否对数组进行排序,默认为 false
30
+ * @returns 稳定的 JSON 字符串
31
+ */
32
+ declare function stableStringify(value: unknown, sortArray?: boolean): string;
33
+
34
+ export { isUrl, safeJsonParse, sleep, stableStringify };
package/basic.d.ts ADDED
@@ -0,0 +1,34 @@
1
+ /**
2
+ * 等待指定毫秒
3
+ * @param ms
4
+ * @returns {Promise<any>}
5
+ */
6
+ declare function sleep(ms: number): Promise<void>;
7
+ /**
8
+ * 安全解析Json
9
+ * @param str - 需要解析的字符串
10
+ * @param defaultValue - 解析失败时的默认值
11
+ */
12
+ declare function safeJsonParse<T extends object | unknown[]>(str?: string, defaultValue?: T): T;
13
+ /**
14
+ * 判断字符串是否为 URL
15
+ * @param str - 需要判断的字符串
16
+ * @returns 是否为 URL
17
+ */
18
+ declare function isUrl(str: string): boolean;
19
+ /**
20
+ * 将对象序列化为稳定的 JSON 字符串
21
+ * 通过深度遍历对象,对所有 key 进行排序,确保相同值的对象序列化结果一致
22
+ *
23
+ * 处理策略:
24
+ * - 对象:按 key 字母序排序
25
+ * - 数组:当 sortArray 为 true 时,对基本类型直接排序,对对象类型先序列化再排序;为 false 时保持原顺序
26
+ * - 从底层向上递归处理,确保嵌套结构都被正确处理
27
+ *
28
+ * @param value - 需要序列化的值
29
+ * @param sortArray - 是否对数组进行排序,默认为 false
30
+ * @returns 稳定的 JSON 字符串
31
+ */
32
+ declare function stableStringify(value: unknown, sortArray?: boolean): string;
33
+
34
+ export { isUrl, safeJsonParse, sleep, stableStringify };
package/basic.js ADDED
@@ -0,0 +1,60 @@
1
+ // src/utils/basic.ts
2
+ function sleep(ms) {
3
+ return new Promise((resolve) => setTimeout(resolve, ms));
4
+ }
5
+ function safeJsonParse(str, defaultValue) {
6
+ try {
7
+ return JSON.parse(str);
8
+ } catch (e) {
9
+ console.error(e);
10
+ return defaultValue ?? {};
11
+ }
12
+ }
13
+ function isUrl(str) {
14
+ return str.startsWith("http://") || str.startsWith("https://");
15
+ }
16
+ function stableStringify(value, sortArray = false) {
17
+ if (value === null || value === void 0) {
18
+ return JSON.stringify(value);
19
+ }
20
+ if (typeof value !== "object") {
21
+ return JSON.stringify(value);
22
+ }
23
+ if (Array.isArray(value)) {
24
+ const processedArray = value.map((item) => {
25
+ if (item !== null && typeof item === "object") {
26
+ return stableStringify(item, sortArray);
27
+ }
28
+ return item;
29
+ });
30
+ const finalProcessedArray = sortArray ? [...processedArray].sort((a, b) => {
31
+ const strA = typeof a === "string" ? a : JSON.stringify(a);
32
+ const strB = typeof b === "string" ? b : JSON.stringify(b);
33
+ return strA.localeCompare(strB);
34
+ }) : processedArray;
35
+ const finalArray = finalProcessedArray.map((item) => {
36
+ if (typeof item === "string" && (item.startsWith("{") || item.startsWith("["))) {
37
+ return JSON.parse(item);
38
+ }
39
+ return item;
40
+ });
41
+ return JSON.stringify(finalArray);
42
+ }
43
+ const sortedKeys = Object.keys(value).sort();
44
+ const sortedObj = {};
45
+ for (const key of sortedKeys) {
46
+ const val = value[key];
47
+ if (val !== null && typeof val === "object") {
48
+ sortedObj[key] = JSON.parse(stableStringify(val, sortArray));
49
+ } else {
50
+ sortedObj[key] = val;
51
+ }
52
+ }
53
+ return JSON.stringify(sortedObj);
54
+ }
55
+ export {
56
+ isUrl,
57
+ safeJsonParse,
58
+ sleep,
59
+ stableStringify
60
+ };
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@polymarbot/shared",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "./basic.cjs",
6
+ "module": "./basic.js",
7
+ "types": "./basic.d.ts",
8
+ "exports": {
9
+ "./basic": {
10
+ "import": "./basic.js",
11
+ "require": "./basic.cjs",
12
+ "types": "./basic.d.ts"
13
+ },
14
+ "./relayer-client": {
15
+ "import": "./relayer-client.js",
16
+ "require": "./relayer-client.cjs",
17
+ "types": "./relayer-client.d.ts"
18
+ },
19
+ "./trade-strategy/normalize": {
20
+ "import": "./trade-strategy/normalize.js",
21
+ "require": "./trade-strategy/normalize.cjs",
22
+ "types": "./trade-strategy/normalize.d.ts"
23
+ },
24
+ "./trade-strategy/types": {
25
+ "import": "./trade-strategy/types.js",
26
+ "require": "./trade-strategy/types.cjs",
27
+ "types": "./trade-strategy/types.d.ts"
28
+ },
29
+ "./wallet": {
30
+ "import": "./wallet.js",
31
+ "require": "./wallet.cjs",
32
+ "types": "./wallet.d.ts"
33
+ }
34
+ },
35
+ "files": [
36
+ "**/*.js",
37
+ "**/*.cjs",
38
+ "**/*.d.ts",
39
+ "**/*.d.cts"
40
+ ],
41
+ "dependencies": {
42
+ "viem": "^2.38.6",
43
+ "@polymarket/builder-relayer-client": "^0.0.6",
44
+ "@polymarket/builder-signing-sdk": "^0.0.8",
45
+ "@polymarket/clob-client": "^4.22.8"
46
+ }
47
+ }
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/utils/relayer-client.ts
21
+ var relayer_client_exports = {};
22
+ __export(relayer_client_exports, {
23
+ createRelayerClient: () => createRelayerClient,
24
+ getBuilderCredsFromEnv: () => getBuilderCredsFromEnv
25
+ });
26
+ module.exports = __toCommonJS(relayer_client_exports);
27
+ var import_viem = require("viem");
28
+ var import_accounts = require("viem/accounts");
29
+ var import_chains = require("viem/chains");
30
+ var import_builder_relayer_client = require("@polymarket/builder-relayer-client");
31
+ var import_builder_signing_sdk = require("@polymarket/builder-signing-sdk");
32
+ function getBuilderCredsFromEnv() {
33
+ const key = process.env.POLYMARKET_BUILDER_API_KEY;
34
+ const secret = process.env.POLYMARKET_BUILDER_SECRET;
35
+ const passphrase = process.env.POLYMARKET_BUILDER_PASSPHRASE;
36
+ const missingVars = [];
37
+ if (!key) missingVars.push("POLYMARKET_BUILDER_API_KEY");
38
+ if (!secret) missingVars.push("POLYMARKET_BUILDER_SECRET");
39
+ if (!passphrase) missingVars.push("POLYMARKET_BUILDER_PASSPHRASE");
40
+ if (missingVars.length > 0) {
41
+ throw new Error(`Missing required environment variables: ${missingVars.join(", ")}`);
42
+ }
43
+ return { key, secret, passphrase };
44
+ }
45
+ function createRelayerClient(privateKey) {
46
+ const POLYGON_RPC = process.env.POLYGON_RPC || import_chains.polygon.rpcUrls.default.http[0];
47
+ const CHAIN_ID = Number(process.env.CHAIN_ID) || import_chains.polygon.id;
48
+ const RELAYER_URL = "https://relayer-v2.polymarket.com/";
49
+ const builderConfig = new import_builder_signing_sdk.BuilderConfig({
50
+ localBuilderCreds: getBuilderCredsFromEnv()
51
+ });
52
+ const account = (0, import_accounts.privateKeyToAccount)(privateKey);
53
+ const wallet = (0, import_viem.createWalletClient)({
54
+ account,
55
+ chain: import_chains.polygon,
56
+ transport: (0, import_viem.http)(POLYGON_RPC)
57
+ });
58
+ return new import_builder_relayer_client.RelayClient(RELAYER_URL, CHAIN_ID, wallet, builderConfig);
59
+ }
60
+ // Annotate the CommonJS export names for ESM import in node:
61
+ 0 && (module.exports = {
62
+ createRelayerClient,
63
+ getBuilderCredsFromEnv
64
+ });
@@ -0,0 +1,27 @@
1
+ import { Hex } from 'viem';
2
+ import { RelayClient } from '@polymarket/builder-relayer-client';
3
+ import { BuilderApiKeyCreds } from '@polymarket/builder-signing-sdk';
4
+
5
+ /**
6
+ * Polymarket Relayer Client Utility
7
+ *
8
+ * Features: Create Relayer Client, manage Builder API credentials
9
+ * Documentation: https://docs.polymarket.com/developers/builders/relayer-client
10
+ */
11
+
12
+ /**
13
+ * Read Builder API credentials from environment variables
14
+ *
15
+ * @returns Builder API credentials
16
+ * @throws Throws an error when environment variables are missing
17
+ */
18
+ declare function getBuilderCredsFromEnv(): BuilderApiKeyCreds;
19
+ /**
20
+ * Create a Relayer Client instance
21
+ *
22
+ * @param privateKey - User wallet private key
23
+ * @returns RelayClient instance
24
+ */
25
+ declare function createRelayerClient(privateKey: Hex): RelayClient;
26
+
27
+ export { createRelayerClient, getBuilderCredsFromEnv };
@@ -0,0 +1,27 @@
1
+ import { Hex } from 'viem';
2
+ import { RelayClient } from '@polymarket/builder-relayer-client';
3
+ import { BuilderApiKeyCreds } from '@polymarket/builder-signing-sdk';
4
+
5
+ /**
6
+ * Polymarket Relayer Client Utility
7
+ *
8
+ * Features: Create Relayer Client, manage Builder API credentials
9
+ * Documentation: https://docs.polymarket.com/developers/builders/relayer-client
10
+ */
11
+
12
+ /**
13
+ * Read Builder API credentials from environment variables
14
+ *
15
+ * @returns Builder API credentials
16
+ * @throws Throws an error when environment variables are missing
17
+ */
18
+ declare function getBuilderCredsFromEnv(): BuilderApiKeyCreds;
19
+ /**
20
+ * Create a Relayer Client instance
21
+ *
22
+ * @param privateKey - User wallet private key
23
+ * @returns RelayClient instance
24
+ */
25
+ declare function createRelayerClient(privateKey: Hex): RelayClient;
26
+
27
+ export { createRelayerClient, getBuilderCredsFromEnv };
@@ -0,0 +1,38 @@
1
+ // src/utils/relayer-client.ts
2
+ import { createWalletClient, http } from "viem";
3
+ import { privateKeyToAccount } from "viem/accounts";
4
+ import { polygon } from "viem/chains";
5
+ import { RelayClient } from "@polymarket/builder-relayer-client";
6
+ import { BuilderConfig } from "@polymarket/builder-signing-sdk";
7
+ function getBuilderCredsFromEnv() {
8
+ const key = process.env.POLYMARKET_BUILDER_API_KEY;
9
+ const secret = process.env.POLYMARKET_BUILDER_SECRET;
10
+ const passphrase = process.env.POLYMARKET_BUILDER_PASSPHRASE;
11
+ const missingVars = [];
12
+ if (!key) missingVars.push("POLYMARKET_BUILDER_API_KEY");
13
+ if (!secret) missingVars.push("POLYMARKET_BUILDER_SECRET");
14
+ if (!passphrase) missingVars.push("POLYMARKET_BUILDER_PASSPHRASE");
15
+ if (missingVars.length > 0) {
16
+ throw new Error(`Missing required environment variables: ${missingVars.join(", ")}`);
17
+ }
18
+ return { key, secret, passphrase };
19
+ }
20
+ function createRelayerClient(privateKey) {
21
+ const POLYGON_RPC = process.env.POLYGON_RPC || polygon.rpcUrls.default.http[0];
22
+ const CHAIN_ID = Number(process.env.CHAIN_ID) || polygon.id;
23
+ const RELAYER_URL = "https://relayer-v2.polymarket.com/";
24
+ const builderConfig = new BuilderConfig({
25
+ localBuilderCreds: getBuilderCredsFromEnv()
26
+ });
27
+ const account = privateKeyToAccount(privateKey);
28
+ const wallet = createWalletClient({
29
+ account,
30
+ chain: polygon,
31
+ transport: http(POLYGON_RPC)
32
+ });
33
+ return new RelayClient(RELAYER_URL, CHAIN_ID, wallet, builderConfig);
34
+ }
35
+ export {
36
+ createRelayerClient,
37
+ getBuilderCredsFromEnv
38
+ };
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/utils/trade-strategy/normalize.ts
21
+ var normalize_exports = {};
22
+ __export(normalize_exports, {
23
+ hasBuySteps: () => hasBuySteps,
24
+ normalizeStrategy: () => normalizeStrategy
25
+ });
26
+ module.exports = __toCommonJS(normalize_exports);
27
+ var import_clob_client = require("@polymarket/clob-client");
28
+ function normalizeBuyStep(step, options) {
29
+ const { start, end, price, size } = step;
30
+ const { minPrice, minSize } = options;
31
+ if (start === void 0 || start === null || start < 0) {
32
+ console.warn(`\u26A0\uFE0F \u5DF2\u8FC7\u6EE4\u65E0\u6548\u4E70\u5165\u6B65\u9AA4: start \u5FC5\u987B >= 0\uFF0C\u5F53\u524D\u503C: ${start}`);
33
+ return null;
34
+ }
35
+ if (end === void 0 || end === null || end <= 0) {
36
+ console.warn(`\u26A0\uFE0F \u5DF2\u8FC7\u6EE4\u65E0\u6548\u4E70\u5165\u6B65\u9AA4: end \u5FC5\u987B > 0\uFF0C\u5F53\u524D\u503C: ${end}`);
37
+ return null;
38
+ }
39
+ if (start >= end) {
40
+ console.warn(`\u26A0\uFE0F \u5DF2\u8FC7\u6EE4\u65E0\u6548\u4E70\u5165\u6B65\u9AA4: start \u5FC5\u987B\u5C0F\u4E8E end\uFF0C\u5F53\u524D start: ${start}, end: ${end}`);
41
+ return null;
42
+ }
43
+ if (price === void 0 || price === null || price < minPrice || price >= 1) {
44
+ console.warn(`\u26A0\uFE0F \u5DF2\u8FC7\u6EE4\u65E0\u6548\u4E70\u5165\u6B65\u9AA4: price \u5FC5\u987B >= ${minPrice} \u4E14 < 1\uFF0C\u5F53\u524D\u503C: ${price}`);
45
+ return null;
46
+ }
47
+ if (size === void 0 || size === null || size < minSize) {
48
+ console.warn(`\u26A0\uFE0F \u5DF2\u8FC7\u6EE4\u65E0\u6548\u4E70\u5165\u6B65\u9AA4: size \u5FC5\u987B >= ${minSize}\uFF0C\u5F53\u524D\u503C: ${size}`);
49
+ return null;
50
+ }
51
+ const normalized = {
52
+ side: import_clob_client.Side.BUY,
53
+ price,
54
+ size,
55
+ start,
56
+ end
57
+ };
58
+ if (step.once === true) {
59
+ normalized.once = true;
60
+ }
61
+ if (step.outcome === "Up" || step.outcome === "Down") {
62
+ normalized.outcome = step.outcome;
63
+ }
64
+ const isLowPriceMode = price <= 0.5;
65
+ const isChaseMode = price > 0.5;
66
+ if (isLowPriceMode) {
67
+ if (step.maxUnderlyingDiff !== void 0) {
68
+ if (step.maxUnderlyingDiff >= 1 && step.maxUnderlyingDiff <= 1e3) {
69
+ normalized.maxUnderlyingDiff = step.maxUnderlyingDiff;
70
+ } else {
71
+ console.warn(` \u2514\u2500 \u5DF2\u79FB\u9664\u65E0\u6548\u5B57\u6BB5 maxUnderlyingDiff: \u503C\u5FC5\u987B\u5728 1-1000 \u8303\u56F4\u5185\uFF0C\u5F53\u524D\u503C: ${step.maxUnderlyingDiff}`);
72
+ }
73
+ }
74
+ if (step.minUnderlyingDiff !== void 0) {
75
+ console.warn(` \u2514\u2500 \u5DF2\u79FB\u9664\u65E0\u6548\u5B57\u6BB5 minUnderlyingDiff: \u4F4E\u4F4D\u4E70\u5165\u6A21\u5F0F(price=${price})\u4E0D\u652F\u6301\u6B64\u5B57\u6BB5`);
76
+ }
77
+ }
78
+ if (isChaseMode) {
79
+ if (step.minUnderlyingDiff !== void 0) {
80
+ if (step.minUnderlyingDiff >= 1 && step.minUnderlyingDiff <= 1e3) {
81
+ normalized.minUnderlyingDiff = step.minUnderlyingDiff;
82
+ } else {
83
+ console.warn(` \u2514\u2500 \u5DF2\u79FB\u9664\u65E0\u6548\u5B57\u6BB5 minUnderlyingDiff: \u503C\u5FC5\u987B\u5728 1-1000 \u8303\u56F4\u5185\uFF0C\u5F53\u524D\u503C: ${step.minUnderlyingDiff}`);
84
+ }
85
+ }
86
+ if (step.maxUnderlyingDiff !== void 0) {
87
+ console.warn(` \u2514\u2500 \u5DF2\u79FB\u9664\u65E0\u6548\u5B57\u6BB5 maxUnderlyingDiff: \u8FFD\u6DA8\u4E70\u5165\u6A21\u5F0F(price=${price})\u4E0D\u652F\u6301\u6B64\u5B57\u6BB5`);
88
+ }
89
+ }
90
+ return normalized;
91
+ }
92
+ function normalizeSellStep(step, options) {
93
+ const { start, end, price, size } = step;
94
+ const { minPrice, minSize } = options;
95
+ if (start === void 0 || start === null || start < 0) {
96
+ console.warn(`\u26A0\uFE0F \u5DF2\u8FC7\u6EE4\u65E0\u6548\u5356\u51FA\u6B65\u9AA4: start \u5FC5\u987B >= 0\uFF0C\u5F53\u524D\u503C: ${start}`);
97
+ return null;
98
+ }
99
+ if (end === void 0 || end === null || end <= 0) {
100
+ console.warn(`\u26A0\uFE0F \u5DF2\u8FC7\u6EE4\u65E0\u6548\u5356\u51FA\u6B65\u9AA4: end \u5FC5\u987B > 0\uFF0C\u5F53\u524D\u503C: ${end}`);
101
+ return null;
102
+ }
103
+ if (start >= end) {
104
+ console.warn(`\u26A0\uFE0F \u5DF2\u8FC7\u6EE4\u65E0\u6548\u5356\u51FA\u6B65\u9AA4: start \u5FC5\u987B\u5C0F\u4E8E end\uFF0C\u5F53\u524D start: ${start}, end: ${end}`);
105
+ return null;
106
+ }
107
+ if (price === void 0 || price === null || price < minPrice || price >= 1) {
108
+ console.warn(`\u26A0\uFE0F \u5DF2\u8FC7\u6EE4\u65E0\u6548\u5356\u51FA\u6B65\u9AA4: price \u5FC5\u987B >= ${minPrice} \u4E14 < 1\uFF0C\u5F53\u524D\u503C: ${price}`);
109
+ return null;
110
+ }
111
+ if (size === void 0 || size === null || size < minSize) {
112
+ console.warn(`\u26A0\uFE0F \u5DF2\u8FC7\u6EE4\u65E0\u6548\u5356\u51FA\u6B65\u9AA4: size \u5FC5\u987B >= ${minSize}\uFF0C\u5F53\u524D\u503C: ${size}`);
113
+ return null;
114
+ }
115
+ const normalized = {
116
+ side: import_clob_client.Side.SELL,
117
+ price,
118
+ size,
119
+ start,
120
+ end
121
+ };
122
+ const stepAsTradeStep = step;
123
+ const invalidFields = [];
124
+ if ("once" in stepAsTradeStep && stepAsTradeStep.once !== void 0) invalidFields.push("once");
125
+ if ("outcome" in stepAsTradeStep && stepAsTradeStep.outcome !== void 0) invalidFields.push("outcome");
126
+ if ("maxUnderlyingDiff" in stepAsTradeStep && stepAsTradeStep.maxUnderlyingDiff !== void 0) invalidFields.push("maxUnderlyingDiff");
127
+ if ("minUnderlyingDiff" in stepAsTradeStep && stepAsTradeStep.minUnderlyingDiff !== void 0) invalidFields.push("minUnderlyingDiff");
128
+ if (invalidFields.length > 0) {
129
+ console.warn(` \u2514\u2500 \u5DF2\u79FB\u9664\u5356\u51FA\u6B65\u9AA4\u4E2D\u7684\u65E0\u6548\u5B57\u6BB5: ${invalidFields.join(", ")}`);
130
+ }
131
+ return normalized;
132
+ }
133
+ function normalizeStrategy(config, options = {}) {
134
+ if (!config || !Array.isArray(config) || config.length === 0) {
135
+ console.warn("\u26A0\uFE0F \u7B56\u7565\u914D\u7F6E\u4E3A\u7A7A\u6216\u683C\u5F0F\u9519\u8BEF");
136
+ return [];
137
+ }
138
+ const normalizeOptions = {
139
+ minPrice: options.minPrice ?? 0.01,
140
+ minSize: options.minSize ?? 5
141
+ };
142
+ const normalized = [];
143
+ config.forEach((step, index) => {
144
+ console.debug(`\u9A8C\u8BC1\u6B65\u9AA4 ${index + 1}/${config.length}: ${step.side}`);
145
+ let normalizedStep = null;
146
+ if (step.side === import_clob_client.Side.BUY) {
147
+ normalizedStep = normalizeBuyStep(step, normalizeOptions);
148
+ } else if (step.side === import_clob_client.Side.SELL) {
149
+ normalizedStep = normalizeSellStep(step, normalizeOptions);
150
+ } else {
151
+ const unknownStep = step;
152
+ console.warn(`\u26A0\uFE0F \u5DF2\u8FC7\u6EE4\u65E0\u6548\u6B65\u9AA4: \u672A\u77E5\u7684 side \u7C7B\u578B: ${unknownStep.side}`);
153
+ }
154
+ if (normalizedStep) {
155
+ normalized.push(normalizedStep);
156
+ }
157
+ });
158
+ console.info(`\u2705 \u7B56\u7565\u4FEE\u6B63\u5B8C\u6210: \u539F\u59CB\u6B65\u9AA4 ${config.length} \u4E2A\uFF0C\u6709\u6548\u6B65\u9AA4 ${normalized.length} \u4E2A`);
159
+ return normalized;
160
+ }
161
+ function hasBuySteps(config) {
162
+ return config.some((step) => step.side === import_clob_client.Side.BUY);
163
+ }
164
+ // Annotate the CommonJS export names for ESM import in node:
165
+ 0 && (module.exports = {
166
+ hasBuySteps,
167
+ normalizeStrategy
168
+ });
@@ -0,0 +1,29 @@
1
+ import { StrategyConfig } from './types.cjs';
2
+ import '@polymarket/clob-client';
3
+
4
+ /**
5
+ * 策略修正选项
6
+ */
7
+ interface NormalizeStrategyOptions {
8
+ /** 最小价格,默认 0.01 */
9
+ minPrice?: number;
10
+ /** 最小数量,默认 5 */
11
+ minSize?: number;
12
+ }
13
+ /**
14
+ * 修正策略配置
15
+ * 对输入的策略进行验证、修正和过滤
16
+ *
17
+ * @param config - 原始策略配置
18
+ * @param options - 修正选项
19
+ * @returns 修正后的策略配置
20
+ */
21
+ declare function normalizeStrategy(config: StrategyConfig, options?: NormalizeStrategyOptions): StrategyConfig;
22
+ /**
23
+ * 检查策略是否包含买入步骤
24
+ * @param config - 策略配置
25
+ * @returns 是否包含买入步骤
26
+ */
27
+ declare function hasBuySteps(config: StrategyConfig): boolean;
28
+
29
+ export { type NormalizeStrategyOptions, hasBuySteps, normalizeStrategy };
@@ -0,0 +1,29 @@
1
+ import { StrategyConfig } from './types.js';
2
+ import '@polymarket/clob-client';
3
+
4
+ /**
5
+ * 策略修正选项
6
+ */
7
+ interface NormalizeStrategyOptions {
8
+ /** 最小价格,默认 0.01 */
9
+ minPrice?: number;
10
+ /** 最小数量,默认 5 */
11
+ minSize?: number;
12
+ }
13
+ /**
14
+ * 修正策略配置
15
+ * 对输入的策略进行验证、修正和过滤
16
+ *
17
+ * @param config - 原始策略配置
18
+ * @param options - 修正选项
19
+ * @returns 修正后的策略配置
20
+ */
21
+ declare function normalizeStrategy(config: StrategyConfig, options?: NormalizeStrategyOptions): StrategyConfig;
22
+ /**
23
+ * 检查策略是否包含买入步骤
24
+ * @param config - 策略配置
25
+ * @returns 是否包含买入步骤
26
+ */
27
+ declare function hasBuySteps(config: StrategyConfig): boolean;
28
+
29
+ export { type NormalizeStrategyOptions, hasBuySteps, normalizeStrategy };