@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 +88 -0
- package/basic.d.cts +34 -0
- package/basic.d.ts +34 -0
- package/basic.js +60 -0
- package/package.json +47 -0
- package/relayer-client.cjs +64 -0
- package/relayer-client.d.cts +27 -0
- package/relayer-client.d.ts +27 -0
- package/relayer-client.js +38 -0
- package/trade-strategy/normalize.cjs +168 -0
- package/trade-strategy/normalize.d.cts +29 -0
- package/trade-strategy/normalize.d.ts +29 -0
- package/trade-strategy/normalize.js +142 -0
- package/trade-strategy/types.cjs +18 -0
- package/trade-strategy/types.d.cts +231 -0
- package/trade-strategy/types.d.ts +231 -0
- package/trade-strategy/types.js +0 -0
- package/wallet.cjs +76 -0
- package/wallet.d.cts +39 -0
- package/wallet.d.ts +39 -0
- package/wallet.js +45 -0
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 };
|