@polymarbot/shared 0.1.0 → 0.1.2
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 +0 -1
- package/basic.d.cts +3 -28
- package/basic.d.ts +3 -28
- package/basic.js +0 -1
- package/chunk-QQPFFDMY.js +6 -0
- package/package.json +43 -18
- package/relayer-client.d.cts +1 -19
- package/relayer-client.d.ts +1 -19
- package/trade-strategy/normalize.cjs +11 -26
- package/trade-strategy/normalize.d.cts +6 -20
- package/trade-strategy/normalize.d.ts +6 -20
- package/trade-strategy/normalize.js +15 -31
- package/trade-strategy/types.cjs +12 -0
- package/trade-strategy/types.d.cts +37 -103
- package/trade-strategy/types.d.ts +37 -103
- package/trade-strategy/types.js +6 -0
- package/wallet.d.cts +4 -18
- package/wallet.d.ts +4 -18
package/basic.cjs
CHANGED
package/basic.d.cts
CHANGED
|
@@ -1,34 +1,9 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 等待指定毫秒
|
|
3
|
-
* @param ms
|
|
4
|
-
* @returns {Promise<any>}
|
|
5
|
-
*/
|
|
6
1
|
declare function sleep(ms: number): Promise<void>;
|
|
7
|
-
|
|
8
|
-
* 安全解析Json
|
|
9
|
-
* @param str - 需要解析的字符串
|
|
10
|
-
* @param defaultValue - 解析失败时的默认值
|
|
11
|
-
*/
|
|
2
|
+
|
|
12
3
|
declare function safeJsonParse<T extends object | unknown[]>(str?: string, defaultValue?: T): T;
|
|
13
|
-
|
|
14
|
-
* 判断字符串是否为 URL
|
|
15
|
-
* @param str - 需要判断的字符串
|
|
16
|
-
* @returns 是否为 URL
|
|
17
|
-
*/
|
|
4
|
+
|
|
18
5
|
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
|
-
*/
|
|
6
|
+
|
|
32
7
|
declare function stableStringify(value: unknown, sortArray?: boolean): string;
|
|
33
8
|
|
|
34
9
|
export { isUrl, safeJsonParse, sleep, stableStringify };
|
package/basic.d.ts
CHANGED
|
@@ -1,34 +1,9 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 等待指定毫秒
|
|
3
|
-
* @param ms
|
|
4
|
-
* @returns {Promise<any>}
|
|
5
|
-
*/
|
|
6
1
|
declare function sleep(ms: number): Promise<void>;
|
|
7
|
-
|
|
8
|
-
* 安全解析Json
|
|
9
|
-
* @param str - 需要解析的字符串
|
|
10
|
-
* @param defaultValue - 解析失败时的默认值
|
|
11
|
-
*/
|
|
2
|
+
|
|
12
3
|
declare function safeJsonParse<T extends object | unknown[]>(str?: string, defaultValue?: T): T;
|
|
13
|
-
|
|
14
|
-
* 判断字符串是否为 URL
|
|
15
|
-
* @param str - 需要判断的字符串
|
|
16
|
-
* @returns 是否为 URL
|
|
17
|
-
*/
|
|
4
|
+
|
|
18
5
|
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
|
-
*/
|
|
6
|
+
|
|
32
7
|
declare function stableStringify(value: unknown, sortArray?: boolean): string;
|
|
33
8
|
|
|
34
9
|
export { isUrl, safeJsonParse, sleep, stableStringify };
|
package/basic.js
CHANGED
package/package.json
CHANGED
|
@@ -1,35 +1,60 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@polymarbot/shared",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./basic.cjs",
|
|
6
6
|
"module": "./basic.js",
|
|
7
7
|
"types": "./basic.d.ts",
|
|
8
8
|
"exports": {
|
|
9
9
|
"./basic": {
|
|
10
|
-
"import":
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
"import": {
|
|
11
|
+
"types": "./basic.d.ts",
|
|
12
|
+
"default": "./basic.js"
|
|
13
|
+
},
|
|
14
|
+
"require": {
|
|
15
|
+
"types": "./basic.d.cts",
|
|
16
|
+
"default": "./basic.cjs"
|
|
17
|
+
}
|
|
13
18
|
},
|
|
14
19
|
"./relayer-client": {
|
|
15
|
-
"import":
|
|
16
|
-
|
|
17
|
-
|
|
20
|
+
"import": {
|
|
21
|
+
"types": "./relayer-client.d.ts",
|
|
22
|
+
"default": "./relayer-client.js"
|
|
23
|
+
},
|
|
24
|
+
"require": {
|
|
25
|
+
"types": "./relayer-client.d.cts",
|
|
26
|
+
"default": "./relayer-client.cjs"
|
|
27
|
+
}
|
|
18
28
|
},
|
|
19
29
|
"./trade-strategy/normalize": {
|
|
20
|
-
"import":
|
|
21
|
-
|
|
22
|
-
|
|
30
|
+
"import": {
|
|
31
|
+
"types": "./trade-strategy/normalize.d.ts",
|
|
32
|
+
"default": "./trade-strategy/normalize.js"
|
|
33
|
+
},
|
|
34
|
+
"require": {
|
|
35
|
+
"types": "./trade-strategy/normalize.d.cts",
|
|
36
|
+
"default": "./trade-strategy/normalize.cjs"
|
|
37
|
+
}
|
|
23
38
|
},
|
|
24
39
|
"./trade-strategy/types": {
|
|
25
|
-
"import":
|
|
26
|
-
|
|
27
|
-
|
|
40
|
+
"import": {
|
|
41
|
+
"types": "./trade-strategy/types.d.ts",
|
|
42
|
+
"default": "./trade-strategy/types.js"
|
|
43
|
+
},
|
|
44
|
+
"require": {
|
|
45
|
+
"types": "./trade-strategy/types.d.cts",
|
|
46
|
+
"default": "./trade-strategy/types.cjs"
|
|
47
|
+
}
|
|
28
48
|
},
|
|
29
49
|
"./wallet": {
|
|
30
|
-
"import":
|
|
31
|
-
|
|
32
|
-
|
|
50
|
+
"import": {
|
|
51
|
+
"types": "./wallet.d.ts",
|
|
52
|
+
"default": "./wallet.js"
|
|
53
|
+
},
|
|
54
|
+
"require": {
|
|
55
|
+
"types": "./wallet.d.cts",
|
|
56
|
+
"default": "./wallet.cjs"
|
|
57
|
+
}
|
|
33
58
|
}
|
|
34
59
|
},
|
|
35
60
|
"files": [
|
|
@@ -39,9 +64,9 @@
|
|
|
39
64
|
"**/*.d.cts"
|
|
40
65
|
],
|
|
41
66
|
"dependencies": {
|
|
67
|
+
"@polymarket/clob-client": "^4.22.8",
|
|
42
68
|
"viem": "^2.38.6",
|
|
43
69
|
"@polymarket/builder-relayer-client": "^0.0.6",
|
|
44
|
-
"@polymarket/builder-signing-sdk": "^0.0.8"
|
|
45
|
-
"@polymarket/clob-client": "^4.22.8"
|
|
70
|
+
"@polymarket/builder-signing-sdk": "^0.0.8"
|
|
46
71
|
}
|
|
47
72
|
}
|
package/relayer-client.d.cts
CHANGED
|
@@ -2,26 +2,8 @@ import { Hex } from 'viem';
|
|
|
2
2
|
import { RelayClient } from '@polymarket/builder-relayer-client';
|
|
3
3
|
import { BuilderApiKeyCreds } from '@polymarket/builder-signing-sdk';
|
|
4
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
5
|
declare function getBuilderCredsFromEnv(): BuilderApiKeyCreds;
|
|
19
|
-
|
|
20
|
-
* Create a Relayer Client instance
|
|
21
|
-
*
|
|
22
|
-
* @param privateKey - User wallet private key
|
|
23
|
-
* @returns RelayClient instance
|
|
24
|
-
*/
|
|
6
|
+
|
|
25
7
|
declare function createRelayerClient(privateKey: Hex): RelayClient;
|
|
26
8
|
|
|
27
9
|
export { createRelayerClient, getBuilderCredsFromEnv };
|
package/relayer-client.d.ts
CHANGED
|
@@ -2,26 +2,8 @@ import { Hex } from 'viem';
|
|
|
2
2
|
import { RelayClient } from '@polymarket/builder-relayer-client';
|
|
3
3
|
import { BuilderApiKeyCreds } from '@polymarket/builder-signing-sdk';
|
|
4
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
5
|
declare function getBuilderCredsFromEnv(): BuilderApiKeyCreds;
|
|
19
|
-
|
|
20
|
-
* Create a Relayer Client instance
|
|
21
|
-
*
|
|
22
|
-
* @param privateKey - User wallet private key
|
|
23
|
-
* @returns RelayClient instance
|
|
24
|
-
*/
|
|
6
|
+
|
|
25
7
|
declare function createRelayerClient(privateKey: Hex): RelayClient;
|
|
26
8
|
|
|
27
9
|
export { createRelayerClient, getBuilderCredsFromEnv };
|
|
@@ -20,32 +20,31 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/utils/trade-strategy/normalize.ts
|
|
21
21
|
var normalize_exports = {};
|
|
22
22
|
__export(normalize_exports, {
|
|
23
|
-
|
|
23
|
+
hasTradeStepsBuy: () => hasTradeStepsBuy,
|
|
24
24
|
normalizeStrategy: () => normalizeStrategy
|
|
25
25
|
});
|
|
26
26
|
module.exports = __toCommonJS(normalize_exports);
|
|
27
|
+
|
|
28
|
+
// src/utils/trade-strategy/types.ts
|
|
27
29
|
var import_clob_client = require("@polymarket/clob-client");
|
|
28
|
-
|
|
30
|
+
|
|
31
|
+
// src/utils/trade-strategy/normalize.ts
|
|
32
|
+
function normalizeTradeStepBuy(step, options) {
|
|
29
33
|
const { start, end, price, size } = step;
|
|
30
34
|
const { minPrice, minSize } = options;
|
|
31
35
|
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
36
|
return null;
|
|
34
37
|
}
|
|
35
38
|
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
39
|
return null;
|
|
38
40
|
}
|
|
39
41
|
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
42
|
return null;
|
|
42
43
|
}
|
|
43
44
|
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
45
|
return null;
|
|
46
46
|
}
|
|
47
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
48
|
return null;
|
|
50
49
|
}
|
|
51
50
|
const normalized = {
|
|
@@ -68,11 +67,9 @@ function normalizeBuyStep(step, options) {
|
|
|
68
67
|
if (step.maxUnderlyingDiff >= 1 && step.maxUnderlyingDiff <= 1e3) {
|
|
69
68
|
normalized.maxUnderlyingDiff = step.maxUnderlyingDiff;
|
|
70
69
|
} 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
70
|
}
|
|
73
71
|
}
|
|
74
72
|
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
73
|
}
|
|
77
74
|
}
|
|
78
75
|
if (isChaseMode) {
|
|
@@ -80,36 +77,29 @@ function normalizeBuyStep(step, options) {
|
|
|
80
77
|
if (step.minUnderlyingDiff >= 1 && step.minUnderlyingDiff <= 1e3) {
|
|
81
78
|
normalized.minUnderlyingDiff = step.minUnderlyingDiff;
|
|
82
79
|
} 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
80
|
}
|
|
85
81
|
}
|
|
86
82
|
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
83
|
}
|
|
89
84
|
}
|
|
90
85
|
return normalized;
|
|
91
86
|
}
|
|
92
|
-
function
|
|
87
|
+
function normalizeTradeStepSell(step, options) {
|
|
93
88
|
const { start, end, price, size } = step;
|
|
94
89
|
const { minPrice, minSize } = options;
|
|
95
90
|
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
91
|
return null;
|
|
98
92
|
}
|
|
99
93
|
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
94
|
return null;
|
|
102
95
|
}
|
|
103
96
|
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
97
|
return null;
|
|
106
98
|
}
|
|
107
99
|
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
100
|
return null;
|
|
110
101
|
}
|
|
111
102
|
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
103
|
return null;
|
|
114
104
|
}
|
|
115
105
|
const normalized = {
|
|
@@ -126,13 +116,11 @@ function normalizeSellStep(step, options) {
|
|
|
126
116
|
if ("maxUnderlyingDiff" in stepAsTradeStep && stepAsTradeStep.maxUnderlyingDiff !== void 0) invalidFields.push("maxUnderlyingDiff");
|
|
127
117
|
if ("minUnderlyingDiff" in stepAsTradeStep && stepAsTradeStep.minUnderlyingDiff !== void 0) invalidFields.push("minUnderlyingDiff");
|
|
128
118
|
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
119
|
}
|
|
131
120
|
return normalized;
|
|
132
121
|
}
|
|
133
122
|
function normalizeStrategy(config, options = {}) {
|
|
134
123
|
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
124
|
return [];
|
|
137
125
|
}
|
|
138
126
|
const normalizeOptions = {
|
|
@@ -141,28 +129,25 @@ function normalizeStrategy(config, options = {}) {
|
|
|
141
129
|
};
|
|
142
130
|
const normalized = [];
|
|
143
131
|
config.forEach((step, index) => {
|
|
144
|
-
console.debug(`\u9A8C\u8BC1\u6B65\u9AA4 ${index + 1}/${config.length}: ${step.side}`);
|
|
145
132
|
let normalizedStep = null;
|
|
146
133
|
if (step.side === import_clob_client.Side.BUY) {
|
|
147
|
-
normalizedStep =
|
|
134
|
+
normalizedStep = normalizeTradeStepBuy(step, normalizeOptions);
|
|
148
135
|
} else if (step.side === import_clob_client.Side.SELL) {
|
|
149
|
-
normalizedStep =
|
|
136
|
+
normalizedStep = normalizeTradeStepSell(step, normalizeOptions);
|
|
150
137
|
} else {
|
|
151
138
|
const unknownStep = step;
|
|
152
|
-
console.warn(`\u26A0\uFE0F \u5DF2\u8FC7\u6EE4\u65E0\u6548\u6B65\u9AA4: \u672A\u77E5\u7684 side \u7C7B\u578B: ${unknownStep.side}`);
|
|
153
139
|
}
|
|
154
140
|
if (normalizedStep) {
|
|
155
141
|
normalized.push(normalizedStep);
|
|
156
142
|
}
|
|
157
143
|
});
|
|
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
144
|
return normalized;
|
|
160
145
|
}
|
|
161
|
-
function
|
|
146
|
+
function hasTradeStepsBuy(config) {
|
|
162
147
|
return config.some((step) => step.side === import_clob_client.Side.BUY);
|
|
163
148
|
}
|
|
164
149
|
// Annotate the CommonJS export names for ESM import in node:
|
|
165
150
|
0 && (module.exports = {
|
|
166
|
-
|
|
151
|
+
hasTradeStepsBuy,
|
|
167
152
|
normalizeStrategy
|
|
168
153
|
});
|
|
@@ -1,29 +1,15 @@
|
|
|
1
1
|
import { StrategyConfig } from './types.cjs';
|
|
2
2
|
import '@polymarket/clob-client';
|
|
3
3
|
|
|
4
|
-
/**
|
|
5
|
-
* 策略修正选项
|
|
6
|
-
*/
|
|
7
4
|
interface NormalizeStrategyOptions {
|
|
8
|
-
|
|
5
|
+
|
|
9
6
|
minPrice?: number;
|
|
10
|
-
|
|
7
|
+
|
|
11
8
|
minSize?: number;
|
|
12
9
|
}
|
|
13
|
-
|
|
14
|
-
* 修正策略配置
|
|
15
|
-
* 对输入的策略进行验证、修正和过滤
|
|
16
|
-
*
|
|
17
|
-
* @param config - 原始策略配置
|
|
18
|
-
* @param options - 修正选项
|
|
19
|
-
* @returns 修正后的策略配置
|
|
20
|
-
*/
|
|
10
|
+
|
|
21
11
|
declare function normalizeStrategy(config: StrategyConfig, options?: NormalizeStrategyOptions): StrategyConfig;
|
|
22
|
-
/**
|
|
23
|
-
* 检查策略是否包含买入步骤
|
|
24
|
-
* @param config - 策略配置
|
|
25
|
-
* @returns 是否包含买入步骤
|
|
26
|
-
*/
|
|
27
|
-
declare function hasBuySteps(config: StrategyConfig): boolean;
|
|
28
12
|
|
|
29
|
-
|
|
13
|
+
declare function hasTradeStepsBuy(config: StrategyConfig): boolean;
|
|
14
|
+
|
|
15
|
+
export { type NormalizeStrategyOptions, hasTradeStepsBuy, normalizeStrategy };
|
|
@@ -1,29 +1,15 @@
|
|
|
1
1
|
import { StrategyConfig } from './types.js';
|
|
2
2
|
import '@polymarket/clob-client';
|
|
3
3
|
|
|
4
|
-
/**
|
|
5
|
-
* 策略修正选项
|
|
6
|
-
*/
|
|
7
4
|
interface NormalizeStrategyOptions {
|
|
8
|
-
|
|
5
|
+
|
|
9
6
|
minPrice?: number;
|
|
10
|
-
|
|
7
|
+
|
|
11
8
|
minSize?: number;
|
|
12
9
|
}
|
|
13
|
-
|
|
14
|
-
* 修正策略配置
|
|
15
|
-
* 对输入的策略进行验证、修正和过滤
|
|
16
|
-
*
|
|
17
|
-
* @param config - 原始策略配置
|
|
18
|
-
* @param options - 修正选项
|
|
19
|
-
* @returns 修正后的策略配置
|
|
20
|
-
*/
|
|
10
|
+
|
|
21
11
|
declare function normalizeStrategy(config: StrategyConfig, options?: NormalizeStrategyOptions): StrategyConfig;
|
|
22
|
-
/**
|
|
23
|
-
* 检查策略是否包含买入步骤
|
|
24
|
-
* @param config - 策略配置
|
|
25
|
-
* @returns 是否包含买入步骤
|
|
26
|
-
*/
|
|
27
|
-
declare function hasBuySteps(config: StrategyConfig): boolean;
|
|
28
12
|
|
|
29
|
-
|
|
13
|
+
declare function hasTradeStepsBuy(config: StrategyConfig): boolean;
|
|
14
|
+
|
|
15
|
+
export { type NormalizeStrategyOptions, hasTradeStepsBuy, normalizeStrategy };
|
|
@@ -1,30 +1,28 @@
|
|
|
1
|
+
import {
|
|
2
|
+
TradeSide
|
|
3
|
+
} from "../chunk-QQPFFDMY.js";
|
|
4
|
+
|
|
1
5
|
// src/utils/trade-strategy/normalize.ts
|
|
2
|
-
|
|
3
|
-
function normalizeBuyStep(step, options) {
|
|
6
|
+
function normalizeTradeStepBuy(step, options) {
|
|
4
7
|
const { start, end, price, size } = step;
|
|
5
8
|
const { minPrice, minSize } = options;
|
|
6
9
|
if (start === void 0 || start === null || start < 0) {
|
|
7
|
-
console.warn(`\u26A0\uFE0F \u5DF2\u8FC7\u6EE4\u65E0\u6548\u4E70\u5165\u6B65\u9AA4: start \u5FC5\u987B >= 0\uFF0C\u5F53\u524D\u503C: ${start}`);
|
|
8
10
|
return null;
|
|
9
11
|
}
|
|
10
12
|
if (end === void 0 || end === null || end <= 0) {
|
|
11
|
-
console.warn(`\u26A0\uFE0F \u5DF2\u8FC7\u6EE4\u65E0\u6548\u4E70\u5165\u6B65\u9AA4: end \u5FC5\u987B > 0\uFF0C\u5F53\u524D\u503C: ${end}`);
|
|
12
13
|
return null;
|
|
13
14
|
}
|
|
14
15
|
if (start >= end) {
|
|
15
|
-
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}`);
|
|
16
16
|
return null;
|
|
17
17
|
}
|
|
18
18
|
if (price === void 0 || price === null || price < minPrice || price >= 1) {
|
|
19
|
-
console.warn(`\u26A0\uFE0F \u5DF2\u8FC7\u6EE4\u65E0\u6548\u4E70\u5165\u6B65\u9AA4: price \u5FC5\u987B >= ${minPrice} \u4E14 < 1\uFF0C\u5F53\u524D\u503C: ${price}`);
|
|
20
19
|
return null;
|
|
21
20
|
}
|
|
22
21
|
if (size === void 0 || size === null || size < minSize) {
|
|
23
|
-
console.warn(`\u26A0\uFE0F \u5DF2\u8FC7\u6EE4\u65E0\u6548\u4E70\u5165\u6B65\u9AA4: size \u5FC5\u987B >= ${minSize}\uFF0C\u5F53\u524D\u503C: ${size}`);
|
|
24
22
|
return null;
|
|
25
23
|
}
|
|
26
24
|
const normalized = {
|
|
27
|
-
side:
|
|
25
|
+
side: TradeSide.BUY,
|
|
28
26
|
price,
|
|
29
27
|
size,
|
|
30
28
|
start,
|
|
@@ -43,11 +41,9 @@ function normalizeBuyStep(step, options) {
|
|
|
43
41
|
if (step.maxUnderlyingDiff >= 1 && step.maxUnderlyingDiff <= 1e3) {
|
|
44
42
|
normalized.maxUnderlyingDiff = step.maxUnderlyingDiff;
|
|
45
43
|
} else {
|
|
46
|
-
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}`);
|
|
47
44
|
}
|
|
48
45
|
}
|
|
49
46
|
if (step.minUnderlyingDiff !== void 0) {
|
|
50
|
-
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`);
|
|
51
47
|
}
|
|
52
48
|
}
|
|
53
49
|
if (isChaseMode) {
|
|
@@ -55,40 +51,33 @@ function normalizeBuyStep(step, options) {
|
|
|
55
51
|
if (step.minUnderlyingDiff >= 1 && step.minUnderlyingDiff <= 1e3) {
|
|
56
52
|
normalized.minUnderlyingDiff = step.minUnderlyingDiff;
|
|
57
53
|
} else {
|
|
58
|
-
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}`);
|
|
59
54
|
}
|
|
60
55
|
}
|
|
61
56
|
if (step.maxUnderlyingDiff !== void 0) {
|
|
62
|
-
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`);
|
|
63
57
|
}
|
|
64
58
|
}
|
|
65
59
|
return normalized;
|
|
66
60
|
}
|
|
67
|
-
function
|
|
61
|
+
function normalizeTradeStepSell(step, options) {
|
|
68
62
|
const { start, end, price, size } = step;
|
|
69
63
|
const { minPrice, minSize } = options;
|
|
70
64
|
if (start === void 0 || start === null || start < 0) {
|
|
71
|
-
console.warn(`\u26A0\uFE0F \u5DF2\u8FC7\u6EE4\u65E0\u6548\u5356\u51FA\u6B65\u9AA4: start \u5FC5\u987B >= 0\uFF0C\u5F53\u524D\u503C: ${start}`);
|
|
72
65
|
return null;
|
|
73
66
|
}
|
|
74
67
|
if (end === void 0 || end === null || end <= 0) {
|
|
75
|
-
console.warn(`\u26A0\uFE0F \u5DF2\u8FC7\u6EE4\u65E0\u6548\u5356\u51FA\u6B65\u9AA4: end \u5FC5\u987B > 0\uFF0C\u5F53\u524D\u503C: ${end}`);
|
|
76
68
|
return null;
|
|
77
69
|
}
|
|
78
70
|
if (start >= end) {
|
|
79
|
-
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}`);
|
|
80
71
|
return null;
|
|
81
72
|
}
|
|
82
73
|
if (price === void 0 || price === null || price < minPrice || price >= 1) {
|
|
83
|
-
console.warn(`\u26A0\uFE0F \u5DF2\u8FC7\u6EE4\u65E0\u6548\u5356\u51FA\u6B65\u9AA4: price \u5FC5\u987B >= ${minPrice} \u4E14 < 1\uFF0C\u5F53\u524D\u503C: ${price}`);
|
|
84
74
|
return null;
|
|
85
75
|
}
|
|
86
76
|
if (size === void 0 || size === null || size < minSize) {
|
|
87
|
-
console.warn(`\u26A0\uFE0F \u5DF2\u8FC7\u6EE4\u65E0\u6548\u5356\u51FA\u6B65\u9AA4: size \u5FC5\u987B >= ${minSize}\uFF0C\u5F53\u524D\u503C: ${size}`);
|
|
88
77
|
return null;
|
|
89
78
|
}
|
|
90
79
|
const normalized = {
|
|
91
|
-
side:
|
|
80
|
+
side: TradeSide.SELL,
|
|
92
81
|
price,
|
|
93
82
|
size,
|
|
94
83
|
start,
|
|
@@ -101,13 +90,11 @@ function normalizeSellStep(step, options) {
|
|
|
101
90
|
if ("maxUnderlyingDiff" in stepAsTradeStep && stepAsTradeStep.maxUnderlyingDiff !== void 0) invalidFields.push("maxUnderlyingDiff");
|
|
102
91
|
if ("minUnderlyingDiff" in stepAsTradeStep && stepAsTradeStep.minUnderlyingDiff !== void 0) invalidFields.push("minUnderlyingDiff");
|
|
103
92
|
if (invalidFields.length > 0) {
|
|
104
|
-
console.warn(` \u2514\u2500 \u5DF2\u79FB\u9664\u5356\u51FA\u6B65\u9AA4\u4E2D\u7684\u65E0\u6548\u5B57\u6BB5: ${invalidFields.join(", ")}`);
|
|
105
93
|
}
|
|
106
94
|
return normalized;
|
|
107
95
|
}
|
|
108
96
|
function normalizeStrategy(config, options = {}) {
|
|
109
97
|
if (!config || !Array.isArray(config) || config.length === 0) {
|
|
110
|
-
console.warn("\u26A0\uFE0F \u7B56\u7565\u914D\u7F6E\u4E3A\u7A7A\u6216\u683C\u5F0F\u9519\u8BEF");
|
|
111
98
|
return [];
|
|
112
99
|
}
|
|
113
100
|
const normalizeOptions = {
|
|
@@ -116,27 +103,24 @@ function normalizeStrategy(config, options = {}) {
|
|
|
116
103
|
};
|
|
117
104
|
const normalized = [];
|
|
118
105
|
config.forEach((step, index) => {
|
|
119
|
-
console.debug(`\u9A8C\u8BC1\u6B65\u9AA4 ${index + 1}/${config.length}: ${step.side}`);
|
|
120
106
|
let normalizedStep = null;
|
|
121
|
-
if (step.side ===
|
|
122
|
-
normalizedStep =
|
|
123
|
-
} else if (step.side ===
|
|
124
|
-
normalizedStep =
|
|
107
|
+
if (step.side === TradeSide.BUY) {
|
|
108
|
+
normalizedStep = normalizeTradeStepBuy(step, normalizeOptions);
|
|
109
|
+
} else if (step.side === TradeSide.SELL) {
|
|
110
|
+
normalizedStep = normalizeTradeStepSell(step, normalizeOptions);
|
|
125
111
|
} else {
|
|
126
112
|
const unknownStep = step;
|
|
127
|
-
console.warn(`\u26A0\uFE0F \u5DF2\u8FC7\u6EE4\u65E0\u6548\u6B65\u9AA4: \u672A\u77E5\u7684 side \u7C7B\u578B: ${unknownStep.side}`);
|
|
128
113
|
}
|
|
129
114
|
if (normalizedStep) {
|
|
130
115
|
normalized.push(normalizedStep);
|
|
131
116
|
}
|
|
132
117
|
});
|
|
133
|
-
console.info(`\u2705 \u7B56\u7565\u4FEE\u6B63\u5B8C\u6210: \u539F\u59CB\u6B65\u9AA4 ${config.length} \u4E2A\uFF0C\u6709\u6548\u6B65\u9AA4 ${normalized.length} \u4E2A`);
|
|
134
118
|
return normalized;
|
|
135
119
|
}
|
|
136
|
-
function
|
|
137
|
-
return config.some((step) => step.side ===
|
|
120
|
+
function hasTradeStepsBuy(config) {
|
|
121
|
+
return config.some((step) => step.side === TradeSide.BUY);
|
|
138
122
|
}
|
|
139
123
|
export {
|
|
140
|
-
|
|
124
|
+
hasTradeStepsBuy,
|
|
141
125
|
normalizeStrategy
|
|
142
126
|
};
|
package/trade-strategy/types.cjs
CHANGED
|
@@ -3,6 +3,10 @@ var __defProp = Object.defineProperty;
|
|
|
3
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
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
|
+
};
|
|
6
10
|
var __copyProps = (to, from, except, desc) => {
|
|
7
11
|
if (from && typeof from === "object" || typeof from === "function") {
|
|
8
12
|
for (let key of __getOwnPropNames(from))
|
|
@@ -15,4 +19,12 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
15
19
|
|
|
16
20
|
// src/utils/trade-strategy/types.ts
|
|
17
21
|
var types_exports = {};
|
|
22
|
+
__export(types_exports, {
|
|
23
|
+
TradeSide: () => import_clob_client.Side
|
|
24
|
+
});
|
|
18
25
|
module.exports = __toCommonJS(types_exports);
|
|
26
|
+
var import_clob_client = require("@polymarket/clob-client");
|
|
27
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
28
|
+
0 && (module.exports = {
|
|
29
|
+
TradeSide
|
|
30
|
+
});
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { Side, ClobClient } from '@polymarket/clob-client';
|
|
2
|
+
export { Side as TradeSide } from '@polymarket/clob-client';
|
|
2
3
|
|
|
3
|
-
/**
|
|
4
|
-
* 市场相关类型定义
|
|
5
|
-
*/
|
|
6
4
|
declare enum SupportedSymbol {
|
|
7
5
|
ETH = "eth",
|
|
8
6
|
BTC = "btc",
|
|
@@ -61,56 +59,35 @@ interface MarketToken {
|
|
|
61
59
|
name: string;
|
|
62
60
|
}
|
|
63
61
|
|
|
64
|
-
/**
|
|
65
|
-
* Polymarket 交易基础工具方法
|
|
66
|
-
*/
|
|
67
|
-
/**
|
|
68
|
-
* 仓位信息
|
|
69
|
-
*/
|
|
70
62
|
interface PositionInfo {
|
|
71
|
-
|
|
63
|
+
|
|
72
64
|
size: number;
|
|
73
|
-
|
|
65
|
+
|
|
74
66
|
balance: string;
|
|
75
67
|
}
|
|
76
68
|
|
|
77
|
-
/**
|
|
78
|
-
* 加密货币价格查询模块
|
|
79
|
-
* 支持通过 Binance API 查询 ETH, BTC, SOL, XRP 的价格
|
|
80
|
-
*/
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* 价格差信息类型
|
|
84
|
-
*/
|
|
85
69
|
interface PriceDifferenceInfo {
|
|
86
|
-
|
|
70
|
+
|
|
87
71
|
start: number;
|
|
88
|
-
|
|
72
|
+
|
|
89
73
|
end: number;
|
|
90
|
-
|
|
74
|
+
|
|
91
75
|
difference: number;
|
|
92
|
-
|
|
76
|
+
|
|
93
77
|
differenceAbs: number;
|
|
94
|
-
|
|
78
|
+
|
|
95
79
|
percent: number;
|
|
96
|
-
|
|
80
|
+
|
|
97
81
|
percentAbs: number;
|
|
98
|
-
|
|
82
|
+
|
|
99
83
|
isUp: boolean;
|
|
100
|
-
|
|
84
|
+
|
|
101
85
|
isDown: boolean;
|
|
102
|
-
|
|
86
|
+
|
|
103
87
|
isFlat: boolean;
|
|
104
88
|
}
|
|
105
89
|
|
|
106
|
-
|
|
107
|
-
* 交易策略类型定义
|
|
108
|
-
*/
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* 买入步骤配置
|
|
112
|
-
*/
|
|
113
|
-
interface BuyStep {
|
|
90
|
+
interface TradeStepBuy {
|
|
114
91
|
side: Side.BUY;
|
|
115
92
|
price: number;
|
|
116
93
|
size: number;
|
|
@@ -121,60 +98,28 @@ interface BuyStep {
|
|
|
121
98
|
maxUnderlyingDiff?: number;
|
|
122
99
|
minUnderlyingDiff?: number;
|
|
123
100
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
*/
|
|
127
|
-
interface SellStep {
|
|
101
|
+
|
|
102
|
+
interface TradeStepSell {
|
|
128
103
|
side: Side.SELL;
|
|
129
104
|
price: number;
|
|
130
105
|
size: number;
|
|
131
106
|
start: number;
|
|
132
107
|
end: number;
|
|
133
108
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
type TradeStep = BuyStep | SellStep;
|
|
138
|
-
/**
|
|
139
|
-
* 策略配置类型
|
|
140
|
-
* 由多个交易步骤组成的数组
|
|
141
|
-
*/
|
|
109
|
+
|
|
110
|
+
type TradeStep = TradeStepBuy | TradeStepSell;
|
|
111
|
+
|
|
142
112
|
type StrategyConfig = TradeStep[];
|
|
143
|
-
|
|
144
|
-
* 策略回调函数类型
|
|
145
|
-
* @param prevResult - 上一个策略回调的返回值(首个回调为 undefined)
|
|
146
|
-
* @returns 返回值说明:
|
|
147
|
-
* - 返回 false:终止后续所有策略的执行
|
|
148
|
-
* - 返回 true、null、undefined、void:继续执行后续策略,不传递值
|
|
149
|
-
* - 返回其他非 boolean 值:继续执行后续策略,并将该值作为下一个策略的入参
|
|
150
|
-
*/
|
|
113
|
+
|
|
151
114
|
type StrategyCallback = (prevResult?: any) => any | Promise<any>;
|
|
152
|
-
|
|
153
|
-
* 策略配置数组
|
|
154
|
-
* StrategyCondition 格式:
|
|
155
|
-
* - "<10": 从开始到10分钟(不包含10分钟)
|
|
156
|
-
* - ">=10": 从10分钟开始(包含10分钟)到结束
|
|
157
|
-
* - ">=20,<40": 从20分钟开始(包含20分钟)到40分钟(不包含40分钟)
|
|
158
|
-
* - "=30" 或 "30": 等于30分钟
|
|
159
|
-
* - ">10,<=20": 从10分钟后(不包含10分钟)到20分钟(包含20分钟)
|
|
160
|
-
*
|
|
161
|
-
* 任务严格按照数组顺序执行
|
|
162
|
-
*/
|
|
115
|
+
|
|
163
116
|
type StrategyCondition = string;
|
|
164
117
|
type StrategyExecQueue = Array<[StrategyCondition, StrategyCallback]>;
|
|
165
|
-
|
|
166
|
-
* 策略执行错误回调函数类型
|
|
167
|
-
* @param error - 错误对象
|
|
168
|
-
*/
|
|
118
|
+
|
|
169
119
|
type StrategyErrorCallback = (error: Error) => void | Promise<void>;
|
|
170
|
-
|
|
171
|
-
* 策略函数类型
|
|
172
|
-
* @param onError - 策略执行失败时的错误回调(可选)
|
|
173
|
-
*/
|
|
120
|
+
|
|
174
121
|
type StrategyFn = (onError?: StrategyErrorCallback) => Promise<void>;
|
|
175
|
-
|
|
176
|
-
* Token 交易步骤订单信息
|
|
177
|
-
*/
|
|
122
|
+
|
|
178
123
|
interface TokenTradeStepOrder {
|
|
179
124
|
id: string;
|
|
180
125
|
stepJson: string;
|
|
@@ -182,9 +127,7 @@ interface TokenTradeStepOrder {
|
|
|
182
127
|
status: string;
|
|
183
128
|
updatedAt: number;
|
|
184
129
|
}
|
|
185
|
-
|
|
186
|
-
* 市场交易记录类型
|
|
187
|
-
*/
|
|
130
|
+
|
|
188
131
|
interface MarketTradeRecord {
|
|
189
132
|
marketId: string;
|
|
190
133
|
strategyJson: string;
|
|
@@ -192,40 +135,31 @@ interface MarketTradeRecord {
|
|
|
192
135
|
[tokenId: string]: TokenTradeStepOrder[];
|
|
193
136
|
};
|
|
194
137
|
}
|
|
195
|
-
|
|
196
|
-
* 市场交易上下文
|
|
197
|
-
* 包含执行交易策略所需的市场信息和客户端实例
|
|
198
|
-
*/
|
|
138
|
+
|
|
199
139
|
interface MarketTradeContext {
|
|
200
|
-
|
|
140
|
+
|
|
201
141
|
clobClient: ClobClient;
|
|
202
|
-
|
|
142
|
+
|
|
203
143
|
funder: string;
|
|
204
|
-
|
|
144
|
+
|
|
205
145
|
market: Market;
|
|
206
|
-
|
|
146
|
+
|
|
207
147
|
tokens: MarketToken[];
|
|
208
|
-
|
|
148
|
+
|
|
209
149
|
tradeRecord: MarketTradeRecord;
|
|
210
|
-
|
|
150
|
+
|
|
211
151
|
underlyingPrice: PriceDifferenceInfo | null;
|
|
212
152
|
}
|
|
213
|
-
|
|
214
|
-
* 市场 Token 数据
|
|
215
|
-
*/
|
|
153
|
+
|
|
216
154
|
interface MarketTokenData extends MarketToken {
|
|
217
|
-
|
|
155
|
+
|
|
218
156
|
hasPosition: boolean;
|
|
219
|
-
|
|
157
|
+
|
|
220
158
|
positionInfo: PositionInfo | null;
|
|
221
|
-
|
|
159
|
+
|
|
222
160
|
orderRecords: TokenTradeStepOrder[];
|
|
223
161
|
}
|
|
224
|
-
|
|
225
|
-
* 市场 Token 上下文
|
|
226
|
-
* 记录市场中每个 Token 的持仓和订单记录数据
|
|
227
|
-
* 使用 tokenId 作为 key
|
|
228
|
-
*/
|
|
162
|
+
|
|
229
163
|
type MarketTokenContext = Record<string, MarketTokenData>;
|
|
230
164
|
|
|
231
|
-
export type {
|
|
165
|
+
export type { MarketTokenContext, MarketTokenData, MarketTradeContext, MarketTradeRecord, StrategyCallback, StrategyCondition, StrategyConfig, StrategyErrorCallback, StrategyExecQueue, StrategyFn, TokenTradeStepOrder, TradeStep, TradeStepBuy, TradeStepSell };
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { Side, ClobClient } from '@polymarket/clob-client';
|
|
2
|
+
export { Side as TradeSide } from '@polymarket/clob-client';
|
|
2
3
|
|
|
3
|
-
/**
|
|
4
|
-
* 市场相关类型定义
|
|
5
|
-
*/
|
|
6
4
|
declare enum SupportedSymbol {
|
|
7
5
|
ETH = "eth",
|
|
8
6
|
BTC = "btc",
|
|
@@ -61,56 +59,35 @@ interface MarketToken {
|
|
|
61
59
|
name: string;
|
|
62
60
|
}
|
|
63
61
|
|
|
64
|
-
/**
|
|
65
|
-
* Polymarket 交易基础工具方法
|
|
66
|
-
*/
|
|
67
|
-
/**
|
|
68
|
-
* 仓位信息
|
|
69
|
-
*/
|
|
70
62
|
interface PositionInfo {
|
|
71
|
-
|
|
63
|
+
|
|
72
64
|
size: number;
|
|
73
|
-
|
|
65
|
+
|
|
74
66
|
balance: string;
|
|
75
67
|
}
|
|
76
68
|
|
|
77
|
-
/**
|
|
78
|
-
* 加密货币价格查询模块
|
|
79
|
-
* 支持通过 Binance API 查询 ETH, BTC, SOL, XRP 的价格
|
|
80
|
-
*/
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* 价格差信息类型
|
|
84
|
-
*/
|
|
85
69
|
interface PriceDifferenceInfo {
|
|
86
|
-
|
|
70
|
+
|
|
87
71
|
start: number;
|
|
88
|
-
|
|
72
|
+
|
|
89
73
|
end: number;
|
|
90
|
-
|
|
74
|
+
|
|
91
75
|
difference: number;
|
|
92
|
-
|
|
76
|
+
|
|
93
77
|
differenceAbs: number;
|
|
94
|
-
|
|
78
|
+
|
|
95
79
|
percent: number;
|
|
96
|
-
|
|
80
|
+
|
|
97
81
|
percentAbs: number;
|
|
98
|
-
|
|
82
|
+
|
|
99
83
|
isUp: boolean;
|
|
100
|
-
|
|
84
|
+
|
|
101
85
|
isDown: boolean;
|
|
102
|
-
|
|
86
|
+
|
|
103
87
|
isFlat: boolean;
|
|
104
88
|
}
|
|
105
89
|
|
|
106
|
-
|
|
107
|
-
* 交易策略类型定义
|
|
108
|
-
*/
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* 买入步骤配置
|
|
112
|
-
*/
|
|
113
|
-
interface BuyStep {
|
|
90
|
+
interface TradeStepBuy {
|
|
114
91
|
side: Side.BUY;
|
|
115
92
|
price: number;
|
|
116
93
|
size: number;
|
|
@@ -121,60 +98,28 @@ interface BuyStep {
|
|
|
121
98
|
maxUnderlyingDiff?: number;
|
|
122
99
|
minUnderlyingDiff?: number;
|
|
123
100
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
*/
|
|
127
|
-
interface SellStep {
|
|
101
|
+
|
|
102
|
+
interface TradeStepSell {
|
|
128
103
|
side: Side.SELL;
|
|
129
104
|
price: number;
|
|
130
105
|
size: number;
|
|
131
106
|
start: number;
|
|
132
107
|
end: number;
|
|
133
108
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
type TradeStep = BuyStep | SellStep;
|
|
138
|
-
/**
|
|
139
|
-
* 策略配置类型
|
|
140
|
-
* 由多个交易步骤组成的数组
|
|
141
|
-
*/
|
|
109
|
+
|
|
110
|
+
type TradeStep = TradeStepBuy | TradeStepSell;
|
|
111
|
+
|
|
142
112
|
type StrategyConfig = TradeStep[];
|
|
143
|
-
|
|
144
|
-
* 策略回调函数类型
|
|
145
|
-
* @param prevResult - 上一个策略回调的返回值(首个回调为 undefined)
|
|
146
|
-
* @returns 返回值说明:
|
|
147
|
-
* - 返回 false:终止后续所有策略的执行
|
|
148
|
-
* - 返回 true、null、undefined、void:继续执行后续策略,不传递值
|
|
149
|
-
* - 返回其他非 boolean 值:继续执行后续策略,并将该值作为下一个策略的入参
|
|
150
|
-
*/
|
|
113
|
+
|
|
151
114
|
type StrategyCallback = (prevResult?: any) => any | Promise<any>;
|
|
152
|
-
|
|
153
|
-
* 策略配置数组
|
|
154
|
-
* StrategyCondition 格式:
|
|
155
|
-
* - "<10": 从开始到10分钟(不包含10分钟)
|
|
156
|
-
* - ">=10": 从10分钟开始(包含10分钟)到结束
|
|
157
|
-
* - ">=20,<40": 从20分钟开始(包含20分钟)到40分钟(不包含40分钟)
|
|
158
|
-
* - "=30" 或 "30": 等于30分钟
|
|
159
|
-
* - ">10,<=20": 从10分钟后(不包含10分钟)到20分钟(包含20分钟)
|
|
160
|
-
*
|
|
161
|
-
* 任务严格按照数组顺序执行
|
|
162
|
-
*/
|
|
115
|
+
|
|
163
116
|
type StrategyCondition = string;
|
|
164
117
|
type StrategyExecQueue = Array<[StrategyCondition, StrategyCallback]>;
|
|
165
|
-
|
|
166
|
-
* 策略执行错误回调函数类型
|
|
167
|
-
* @param error - 错误对象
|
|
168
|
-
*/
|
|
118
|
+
|
|
169
119
|
type StrategyErrorCallback = (error: Error) => void | Promise<void>;
|
|
170
|
-
|
|
171
|
-
* 策略函数类型
|
|
172
|
-
* @param onError - 策略执行失败时的错误回调(可选)
|
|
173
|
-
*/
|
|
120
|
+
|
|
174
121
|
type StrategyFn = (onError?: StrategyErrorCallback) => Promise<void>;
|
|
175
|
-
|
|
176
|
-
* Token 交易步骤订单信息
|
|
177
|
-
*/
|
|
122
|
+
|
|
178
123
|
interface TokenTradeStepOrder {
|
|
179
124
|
id: string;
|
|
180
125
|
stepJson: string;
|
|
@@ -182,9 +127,7 @@ interface TokenTradeStepOrder {
|
|
|
182
127
|
status: string;
|
|
183
128
|
updatedAt: number;
|
|
184
129
|
}
|
|
185
|
-
|
|
186
|
-
* 市场交易记录类型
|
|
187
|
-
*/
|
|
130
|
+
|
|
188
131
|
interface MarketTradeRecord {
|
|
189
132
|
marketId: string;
|
|
190
133
|
strategyJson: string;
|
|
@@ -192,40 +135,31 @@ interface MarketTradeRecord {
|
|
|
192
135
|
[tokenId: string]: TokenTradeStepOrder[];
|
|
193
136
|
};
|
|
194
137
|
}
|
|
195
|
-
|
|
196
|
-
* 市场交易上下文
|
|
197
|
-
* 包含执行交易策略所需的市场信息和客户端实例
|
|
198
|
-
*/
|
|
138
|
+
|
|
199
139
|
interface MarketTradeContext {
|
|
200
|
-
|
|
140
|
+
|
|
201
141
|
clobClient: ClobClient;
|
|
202
|
-
|
|
142
|
+
|
|
203
143
|
funder: string;
|
|
204
|
-
|
|
144
|
+
|
|
205
145
|
market: Market;
|
|
206
|
-
|
|
146
|
+
|
|
207
147
|
tokens: MarketToken[];
|
|
208
|
-
|
|
148
|
+
|
|
209
149
|
tradeRecord: MarketTradeRecord;
|
|
210
|
-
|
|
150
|
+
|
|
211
151
|
underlyingPrice: PriceDifferenceInfo | null;
|
|
212
152
|
}
|
|
213
|
-
|
|
214
|
-
* 市场 Token 数据
|
|
215
|
-
*/
|
|
153
|
+
|
|
216
154
|
interface MarketTokenData extends MarketToken {
|
|
217
|
-
|
|
155
|
+
|
|
218
156
|
hasPosition: boolean;
|
|
219
|
-
|
|
157
|
+
|
|
220
158
|
positionInfo: PositionInfo | null;
|
|
221
|
-
|
|
159
|
+
|
|
222
160
|
orderRecords: TokenTradeStepOrder[];
|
|
223
161
|
}
|
|
224
|
-
|
|
225
|
-
* 市场 Token 上下文
|
|
226
|
-
* 记录市场中每个 Token 的持仓和订单记录数据
|
|
227
|
-
* 使用 tokenId 作为 key
|
|
228
|
-
*/
|
|
162
|
+
|
|
229
163
|
type MarketTokenContext = Record<string, MarketTokenData>;
|
|
230
164
|
|
|
231
|
-
export type {
|
|
165
|
+
export type { MarketTokenContext, MarketTokenData, MarketTradeContext, MarketTradeRecord, StrategyCallback, StrategyCondition, StrategyConfig, StrategyErrorCallback, StrategyExecQueue, StrategyFn, TokenTradeStepOrder, TradeStep, TradeStepBuy, TradeStepSell };
|
package/trade-strategy/types.js
CHANGED
package/wallet.d.cts
CHANGED
|
@@ -13,27 +13,13 @@ declare const USDC_ABI: readonly [{
|
|
|
13
13
|
readonly type: "uint256";
|
|
14
14
|
}];
|
|
15
15
|
}];
|
|
16
|
-
|
|
17
|
-
* 创建单例 publicClient,避免重复实例化
|
|
18
|
-
* @returns viem PublicClient 实例
|
|
19
|
-
*/
|
|
16
|
+
|
|
20
17
|
declare const getPublicClient: () => PublicClient;
|
|
21
|
-
|
|
22
|
-
* 格式化原始余额为可读格式
|
|
23
|
-
* @param rawBalance - 原始余额
|
|
24
|
-
* @param decimals - 小数位数
|
|
25
|
-
* @returns 格式化后的余额
|
|
26
|
-
*/
|
|
18
|
+
|
|
27
19
|
declare function formatBalance(rawBalance: string | bigint, decimals?: number): string;
|
|
28
|
-
|
|
29
|
-
* 查询指定地址的 USDC 余额
|
|
30
|
-
* @param address - 要查询的地址
|
|
31
|
-
* @returns USDC 余额 (原始值,需要用 formatBalance 格式化)
|
|
32
|
-
*/
|
|
20
|
+
|
|
33
21
|
declare function getUSDCBalance(address: string): Promise<bigint>;
|
|
34
|
-
|
|
35
|
-
* 比较两个以太坊地址是否相等
|
|
36
|
-
*/
|
|
22
|
+
|
|
37
23
|
declare function isAddressEqual(a?: Address | string | null, b?: Address | string | null): boolean;
|
|
38
24
|
|
|
39
25
|
export { USDC_ABI, USDC_ADDRESS, USDC_DECIMALS, formatBalance, getPublicClient, getUSDCBalance, isAddressEqual };
|
package/wallet.d.ts
CHANGED
|
@@ -13,27 +13,13 @@ declare const USDC_ABI: readonly [{
|
|
|
13
13
|
readonly type: "uint256";
|
|
14
14
|
}];
|
|
15
15
|
}];
|
|
16
|
-
|
|
17
|
-
* 创建单例 publicClient,避免重复实例化
|
|
18
|
-
* @returns viem PublicClient 实例
|
|
19
|
-
*/
|
|
16
|
+
|
|
20
17
|
declare const getPublicClient: () => PublicClient;
|
|
21
|
-
|
|
22
|
-
* 格式化原始余额为可读格式
|
|
23
|
-
* @param rawBalance - 原始余额
|
|
24
|
-
* @param decimals - 小数位数
|
|
25
|
-
* @returns 格式化后的余额
|
|
26
|
-
*/
|
|
18
|
+
|
|
27
19
|
declare function formatBalance(rawBalance: string | bigint, decimals?: number): string;
|
|
28
|
-
|
|
29
|
-
* 查询指定地址的 USDC 余额
|
|
30
|
-
* @param address - 要查询的地址
|
|
31
|
-
* @returns USDC 余额 (原始值,需要用 formatBalance 格式化)
|
|
32
|
-
*/
|
|
20
|
+
|
|
33
21
|
declare function getUSDCBalance(address: string): Promise<bigint>;
|
|
34
|
-
|
|
35
|
-
* 比较两个以太坊地址是否相等
|
|
36
|
-
*/
|
|
22
|
+
|
|
37
23
|
declare function isAddressEqual(a?: Address | string | null, b?: Address | string | null): boolean;
|
|
38
24
|
|
|
39
25
|
export { USDC_ABI, USDC_ADDRESS, USDC_DECIMALS, formatBalance, getPublicClient, getUSDCBalance, isAddressEqual };
|