@primuslabs/por-client-sdk 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/README.md +91 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +52 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/data_service_client.d.ts +18 -0
- package/dist/client/data_service_client.js +40 -0
- package/dist/client/data_service_client.js.map +1 -0
- package/dist/client/index.d.ts +3 -0
- package/dist/client/index.js +4 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/por_client.d.ts +12 -0
- package/dist/client/por_client.js +36 -0
- package/dist/client/por_client.js.map +1 -0
- package/dist/client/prover_client.d.ts +14 -0
- package/dist/client/prover_client.js +121 -0
- package/dist/client/prover_client.js.map +1 -0
- package/dist/client/zktls_client.d.ts +32 -0
- package/dist/client/zktls_client.js +213 -0
- package/dist/client/zktls_client.js.map +1 -0
- package/dist/config.d.ts +16 -0
- package/dist/config.js +53 -0
- package/dist/config.js.map +1 -0
- package/dist/datasource/binance.d.ts +14 -0
- package/dist/datasource/binance.js +55 -0
- package/dist/datasource/binance.js.map +1 -0
- package/dist/datasource/helper.d.ts +2 -0
- package/dist/datasource/helper.js +34 -0
- package/dist/datasource/helper.js.map +1 -0
- package/dist/datasource/index.d.ts +2 -0
- package/dist/datasource/index.js +3 -0
- package/dist/datasource/index.js.map +1 -0
- package/dist/datasource/okx.d.ts +5 -0
- package/dist/datasource/okx.js +17 -0
- package/dist/datasource/okx.js.map +1 -0
- package/dist/error.d.ts +8 -0
- package/dist/error.js +14 -0
- package/dist/error.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +17 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +12 -0
- package/dist/utils.js +38 -0
- package/dist/utils.js.map +1 -0
- package/package.json +46 -0
package/README.md
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# PoR Client SDK
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The **PoR Client SDK** provides a client for interacting with **zkTLS** and **zkVM**, supporting authentication, program execution, and optional blockchain integration.
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
## Build
|
|
9
|
+
|
|
10
|
+
Install dependencies and build the project:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm install
|
|
14
|
+
npm run build
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
## Getting Started
|
|
19
|
+
|
|
20
|
+
1. Copy `.env.example` to `.env` and configure your environment variables (see [Configuration](#configuration)).
|
|
21
|
+
|
|
22
|
+
2. Ensure required fields are set:
|
|
23
|
+
|
|
24
|
+
* `TOKEN` and `PROJECT_ID` for authentication
|
|
25
|
+
* `PROGRAM_ID` for program execution
|
|
26
|
+
|
|
27
|
+
3. Run an example:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npx tsx example/okx.ts
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
## Configuration
|
|
35
|
+
|
|
36
|
+
The SDK allows flexible configuration from **three sources**, applied in **priority order (highest to lowest)**:
|
|
37
|
+
|
|
38
|
+
1. **Environment variables** (`.env` or `process.env`)
|
|
39
|
+
2. **User-provided options** (passed to the `PoRClient` constructor)
|
|
40
|
+
3. **Default values** defined in the SDK
|
|
41
|
+
|
|
42
|
+
> Higher-priority values overwrite lower-priority values.
|
|
43
|
+
|
|
44
|
+
### Configuration Fields and Defaults
|
|
45
|
+
|
|
46
|
+
| Env Variable | SDK Field | Type | Required / Conditions | Default | Description |
|
|
47
|
+
| ------------------ | ---------------- | ------ | --------------------- | -------------------------------------- | ---------------------------------------------------------- |
|
|
48
|
+
| `TOKEN` | `token` | string | Required | `""` | Authentication token assigned by Primus Labs. |
|
|
49
|
+
| `PROJECT_ID` | `projectId` | string | Required | `""` | Project identifier associated with your account. |
|
|
50
|
+
| `PROGRAM_ID` | `programId` | string | Required | `""` | Program identifier for zkVM execution. |
|
|
51
|
+
| `LOG_VERBOSE` | `logVerbose` | number | Optional | `0` | Logging verbosity level (`0` = off; higher = more detail). |
|
|
52
|
+
| `RPC_URL` | `rpcUrl` | string | Optional | `https://mainnet.base.org` | RPC endpoint for blockchain interactions. |
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
### User-provided Configuration Example
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
import { PoRClient } from "@primuslabs/por-client-sdk";
|
|
59
|
+
|
|
60
|
+
const client = new PoRClient({
|
|
61
|
+
token: "my-token",
|
|
62
|
+
projectId: "my-project",
|
|
63
|
+
programId: "my-program",
|
|
64
|
+
logVerbose: 2,
|
|
65
|
+
});
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
## Using the SDK
|
|
70
|
+
|
|
71
|
+
```ts
|
|
72
|
+
import { DataSource, PoRClient } from "@primuslabs/por-client-sdk";
|
|
73
|
+
|
|
74
|
+
async function main() {
|
|
75
|
+
const ds = new DataSource.Okx();
|
|
76
|
+
const requestParams = ds.getSampleRequests();
|
|
77
|
+
|
|
78
|
+
const client = new PoRClient();
|
|
79
|
+
const result = await client.run(requestParams);
|
|
80
|
+
|
|
81
|
+
console.log("Result:", JSON.stringify(result));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
main();
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
## Data Sources
|
|
89
|
+
|
|
90
|
+
> TODO: Document supported data sources and sample requests.
|
|
91
|
+
|
package/dist/cli.d.ts
ADDED
package/dist/cli.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { ProverClient } from "./client/prover_client.js";
|
|
4
|
+
import fs from "fs";
|
|
5
|
+
async function main() {
|
|
6
|
+
const api = new ProverClient();
|
|
7
|
+
const program = new Command();
|
|
8
|
+
program
|
|
9
|
+
.command("uploadProgram")
|
|
10
|
+
.description("uploadProgram.")
|
|
11
|
+
.requiredOption("--filepath <FILEPATH>", "Program file path")
|
|
12
|
+
.option("--name <NAME>", "Program Name", "Default Name")
|
|
13
|
+
.option("--version <VERSION>", "Version number", "1.0")
|
|
14
|
+
.option("--description <DESCRIPTION>", "Description", "Default description.")
|
|
15
|
+
.action(async (opts) => {
|
|
16
|
+
console.log("uploadProgram");
|
|
17
|
+
const result = await api.uploadProgram(opts.filepath, 'My Program', '1.0', 'Program description');
|
|
18
|
+
console.log('Program uploaded, ID:', result.program_id);
|
|
19
|
+
});
|
|
20
|
+
program
|
|
21
|
+
.command("submitTask")
|
|
22
|
+
.description("submitTask.")
|
|
23
|
+
.requiredOption("--filepath <FILEPATH>", "Attestation data file path")
|
|
24
|
+
.action(async (opts) => {
|
|
25
|
+
console.log("submitTask");
|
|
26
|
+
const attestation_data = fs.readFileSync(opts.filepath, { encoding: "utf-8" });
|
|
27
|
+
const result = await api.submitTask(attestation_data);
|
|
28
|
+
console.log('Task submitted:', result);
|
|
29
|
+
});
|
|
30
|
+
program
|
|
31
|
+
.command("getResult")
|
|
32
|
+
.description("getResult.")
|
|
33
|
+
.requiredOption("--taskId <TASK_ID>", "Task id")
|
|
34
|
+
.action(async (opts) => {
|
|
35
|
+
console.log("getResult");
|
|
36
|
+
const result = await api.getResult(opts.taskId);
|
|
37
|
+
console.log('getResult:', result);
|
|
38
|
+
});
|
|
39
|
+
program
|
|
40
|
+
.command("submitTaskAndGetResult")
|
|
41
|
+
.description("submitTask and getResult.")
|
|
42
|
+
.requiredOption("--filepath <FILEPATH>", "Attestation data file path")
|
|
43
|
+
.action(async (opts) => {
|
|
44
|
+
console.log("submitTask and getResult.");
|
|
45
|
+
const attestation_data = fs.readFileSync(opts.filepath, { encoding: "utf-8" });
|
|
46
|
+
const result = await api.doZkVM(attestation_data);
|
|
47
|
+
console.log('result:', result);
|
|
48
|
+
});
|
|
49
|
+
program.parseAsync();
|
|
50
|
+
}
|
|
51
|
+
main();
|
|
52
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,KAAK,UAAU,IAAI;IACjB,MAAM,GAAG,GAAG,IAAI,YAAY,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,gBAAgB,CAAC;SAC7B,cAAc,CAAC,uBAAuB,EAAE,mBAAmB,CAAC;SAC5D,MAAM,CAAC,eAAe,EAAE,cAAc,EAAE,cAAc,CAAC;SACvD,MAAM,CAAC,qBAAqB,EAAE,gBAAgB,EAAE,KAAK,CAAC;SACtD,MAAM,CAAC,6BAA6B,EAAE,aAAa,EAAE,sBAAsB,CAAC;SAC5E,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,qBAAqB,CAAC,CAAC;QAClG,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,aAAa,CAAC;SAC1B,cAAc,CAAC,uBAAuB,EAAE,4BAA4B,CAAC;SACrE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC1B,MAAM,gBAAgB,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,YAAY,CAAC;SACzB,cAAc,CAAC,oBAAoB,EAAE,SAAS,CAAC;SAC/C,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAGL,OAAO;SACJ,OAAO,CAAC,wBAAwB,CAAC;SACjC,WAAW,CAAC,2BAA2B,CAAC;SACxC,cAAc,CAAC,uBAAuB,EAAE,4BAA4B,CAAC;SACrE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACzC,MAAM,gBAAgB,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEL,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC;AAED,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface ApiResponse<T> {
|
|
2
|
+
rc: 0 | 1;
|
|
3
|
+
mc: string;
|
|
4
|
+
msg: string;
|
|
5
|
+
result: T;
|
|
6
|
+
}
|
|
7
|
+
export interface SubmitTaskResult {
|
|
8
|
+
taskId: string;
|
|
9
|
+
taskTxHash: string;
|
|
10
|
+
taskAttestors: string[];
|
|
11
|
+
}
|
|
12
|
+
export declare class DataServiceClient {
|
|
13
|
+
private readonly client;
|
|
14
|
+
constructor(baseURL: string, timeout?: number);
|
|
15
|
+
submitTask(bizId: string, projectId: string, token: string): Promise<SubmitTaskResult>;
|
|
16
|
+
checkPayment(bizId: string, projectId: string, token: string): Promise<void>;
|
|
17
|
+
private unwrap;
|
|
18
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
import { ClientError } from "../error.js";
|
|
3
|
+
export class DataServiceClient {
|
|
4
|
+
client;
|
|
5
|
+
constructor(baseURL, timeout = 30_000) {
|
|
6
|
+
this.client = axios.create({ baseURL, timeout });
|
|
7
|
+
}
|
|
8
|
+
async submitTask(bizId, projectId, token) {
|
|
9
|
+
const res = await this.client.get("/public/program/submitTask", {
|
|
10
|
+
params: { bizId, projectId },
|
|
11
|
+
headers: {
|
|
12
|
+
"POR-TOKEN": token,
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
const raw = this.unwrap('submitTask', res.data);
|
|
16
|
+
return {
|
|
17
|
+
taskId: raw.taskId,
|
|
18
|
+
taskTxHash: raw.taskTxHash,
|
|
19
|
+
taskAttestors: raw.taskAttestors,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
async checkPayment(bizId, projectId, token) {
|
|
23
|
+
const res = await this.client.get("/public/program/payment/check", {
|
|
24
|
+
params: { bizId, projectId },
|
|
25
|
+
headers: {
|
|
26
|
+
"POR-TOKEN": token,
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
this.unwrap('checkPayment', res.data);
|
|
30
|
+
}
|
|
31
|
+
unwrap(op, data) {
|
|
32
|
+
if (data.rc === 0) {
|
|
33
|
+
return data.result;
|
|
34
|
+
}
|
|
35
|
+
// data.rc === 1
|
|
36
|
+
const { mc, msg } = data;
|
|
37
|
+
throw new ClientError("72001", `${op} failed`, { op, mc, msg });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=data_service_client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data_service_client.js","sourceRoot":"","sources":["../../src/client/data_service_client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAe1C,MAAM,OAAO,iBAAiB;IACX,MAAM,CAAgB;IACvC,YAAY,OAAe,EAAE,UAAkB,MAAM;QACnD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,UAAU,CACd,KAAa,EACb,SAAiB,EACjB,KAAa;QAEb,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAC/B,4BAA4B,EAC5B;YACE,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;YAC5B,OAAO,EAAE;gBACP,WAAW,EAAE,KAAK;aACnB;SACF,CACF,CAAC;QAEF,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAChD,OAAO;YACL,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,aAAa,EAAE,GAAG,CAAC,aAAa;SACjC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,KAAa,EACb,SAAiB,EACjB,KAAa;QAEb,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAC/B,+BAA+B,EAC/B;YACE,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;YAC5B,OAAO,EAAE;gBACP,WAAW,EAAE,KAAK;aACnB;SACF,CACF,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAGO,MAAM,CAAI,EAAU,EAAE,IAAoB;QAChD,IAAI,IAAI,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;QAED,gBAAgB;QAChB,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QACzB,MAAM,IAAI,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAClE,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Options, RequestParamsInput } from "../types.js";
|
|
2
|
+
import { SdkConfig } from "../config.js";
|
|
3
|
+
export declare class PoRClient {
|
|
4
|
+
private readonly config;
|
|
5
|
+
private zktlsClient;
|
|
6
|
+
private proverClient;
|
|
7
|
+
constructor(config?: SdkConfig);
|
|
8
|
+
/**
|
|
9
|
+
* zkTLS + zkVM (optional)
|
|
10
|
+
*/
|
|
11
|
+
run(requestParams: RequestParamsInput, options?: Options): Promise<any>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { saveToFile } from "../utils.js";
|
|
2
|
+
import { getDefaultOptions } from "../types.js";
|
|
3
|
+
import { ZkTLSClient } from "./zktls_client.js";
|
|
4
|
+
import { ProverClient } from "./prover_client.js";
|
|
5
|
+
import { resolveSdkConfig, printConfig } from "../config.js";
|
|
6
|
+
export class PoRClient {
|
|
7
|
+
config;
|
|
8
|
+
zktlsClient;
|
|
9
|
+
proverClient;
|
|
10
|
+
constructor(config = {}) {
|
|
11
|
+
this.config = resolveSdkConfig(config);
|
|
12
|
+
printConfig(this.config, 'PoRClient');
|
|
13
|
+
this.zktlsClient = new ZkTLSClient(this.config);
|
|
14
|
+
this.proverClient = new ProverClient(this.config);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* zkTLS + zkVM (optional)
|
|
18
|
+
*/
|
|
19
|
+
async run(requestParams, options = {}) {
|
|
20
|
+
const opts = getDefaultOptions(options);
|
|
21
|
+
console.log("do zkTLS");
|
|
22
|
+
const attestationData = await this.zktlsClient.doZkTLS(requestParams, opts);
|
|
23
|
+
if (attestationData) {
|
|
24
|
+
// optional
|
|
25
|
+
saveToFile("attestation.json", JSON.stringify(attestationData));
|
|
26
|
+
}
|
|
27
|
+
if (opts.runZkvm && attestationData) {
|
|
28
|
+
console.log("do zkVM");
|
|
29
|
+
const result = await this.proverClient.doZkVM(JSON.stringify(attestationData));
|
|
30
|
+
console.log("result", result);
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
return attestationData;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=por_client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"por_client.js","sourceRoot":"","sources":["../../src/client/por_client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAW,iBAAiB,EAAsB,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAa,gBAAgB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAExE,MAAM,OAAO,SAAS;IACH,MAAM,CAAsB;IACrC,WAAW,CAAc;IACzB,YAAY,CAAe;IAEnC,YAAY,SAAoB,EAAE;QAChC,IAAI,CAAC,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACvC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACtC,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,aAAiC,EAAE,UAAmB,EAAE;QAChE,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAExC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxB,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAC5E,IAAI,eAAe,EAAE,CAAC;YACpB,WAAW;YACX,UAAU,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,IAAI,eAAe,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC;YAC/E,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC9B,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,OAAO,eAAe,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { SdkConfig } from "../config.js";
|
|
2
|
+
export declare class ProverClient {
|
|
3
|
+
private readonly config;
|
|
4
|
+
private client;
|
|
5
|
+
constructor(config?: SdkConfig, timeout?: number);
|
|
6
|
+
uploadProgram(filePath: string, name: string, version: string, desc: string, prover?: string): Promise<any>;
|
|
7
|
+
submitTask(attestationData: string): Promise<any>;
|
|
8
|
+
getResult(taskId: string): Promise<any>;
|
|
9
|
+
private unwrap;
|
|
10
|
+
submitTaskWithRetry(attestationData: string, maxRetries?: number, baseDelay?: number): Promise<any>;
|
|
11
|
+
getResultWithTimeout(taskId: string, timeoutMs?: number, intervalMs?: number): Promise<any>;
|
|
12
|
+
private _doZkVM;
|
|
13
|
+
doZkVM(attestationData: string): Promise<any>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
import FormData from "form-data";
|
|
3
|
+
import fs from "fs";
|
|
4
|
+
import { resolveSdkConfig } from "../config.js";
|
|
5
|
+
import { ClientError } from "../error.js";
|
|
6
|
+
import { sleepMs, mockErrorReport, makeErrData } from "../utils.js";
|
|
7
|
+
export class ProverClient {
|
|
8
|
+
config;
|
|
9
|
+
client;
|
|
10
|
+
constructor(config = {}, timeout = 30_000) {
|
|
11
|
+
this.config = resolveSdkConfig(config);
|
|
12
|
+
this.client = axios.create({ baseURL: this.config.zkvmServiceUrl, timeout });
|
|
13
|
+
}
|
|
14
|
+
async uploadProgram(filePath, name, version, desc, prover = "succinct") {
|
|
15
|
+
const form = new FormData();
|
|
16
|
+
form.append("file", fs.createReadStream(filePath));
|
|
17
|
+
form.append("prover", prover);
|
|
18
|
+
form.append("name", name);
|
|
19
|
+
form.append("version", version);
|
|
20
|
+
form.append("desc", desc);
|
|
21
|
+
const res = await this.client.post("/uploadProgram", form, {
|
|
22
|
+
headers: form.getHeaders()
|
|
23
|
+
});
|
|
24
|
+
return this.unwrap("uploadProgram", res.data);
|
|
25
|
+
}
|
|
26
|
+
async submitTask(attestationData) {
|
|
27
|
+
const form = new FormData();
|
|
28
|
+
form.append("zktls_mode", this.config.zktlsMode);
|
|
29
|
+
form.append("token", this.config.token);
|
|
30
|
+
form.append("project_id", this.config.projectId);
|
|
31
|
+
form.append("program_id", this.config.programId);
|
|
32
|
+
form.append("attestation_data", attestationData);
|
|
33
|
+
const res = await this.client.post("/submitTask", form, {
|
|
34
|
+
headers: form.getHeaders()
|
|
35
|
+
});
|
|
36
|
+
return this.unwrap("submitTask", res.data);
|
|
37
|
+
}
|
|
38
|
+
async getResult(taskId) {
|
|
39
|
+
const res = await this.client.get("/getResult", {
|
|
40
|
+
params: { task_id: taskId }
|
|
41
|
+
});
|
|
42
|
+
return this.unwrap("getResult", res.data);
|
|
43
|
+
}
|
|
44
|
+
unwrap(op, data) {
|
|
45
|
+
if (data.rc === 0) {
|
|
46
|
+
return data.result;
|
|
47
|
+
}
|
|
48
|
+
// data.rc === 1
|
|
49
|
+
const { mc, msg } = data;
|
|
50
|
+
throw new ClientError("73001", `${op} failed`, { op, mc, msg });
|
|
51
|
+
}
|
|
52
|
+
async submitTaskWithRetry(attestationData, maxRetries = 4, baseDelay = 1000) {
|
|
53
|
+
let attempt = 0;
|
|
54
|
+
const start = Date.now();
|
|
55
|
+
console.log("Submitting task...");
|
|
56
|
+
while (true) {
|
|
57
|
+
try {
|
|
58
|
+
const result = await this.submitTask(attestationData);
|
|
59
|
+
console.log(`Submitting task done (${Date.now() - start}ms):`, result);
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
const NO_RETRY_CODES = ["73001"]; // from zkvm
|
|
64
|
+
if (err instanceof ClientError && NO_RETRY_CODES.includes(err.code))
|
|
65
|
+
throw err;
|
|
66
|
+
attempt++;
|
|
67
|
+
if (attempt > maxRetries) {
|
|
68
|
+
throw new ClientError("73002", `Submitting task failed after ${maxRetries} retries`, makeErrData(err));
|
|
69
|
+
}
|
|
70
|
+
const delay = baseDelay * 2 ** (attempt - 1);
|
|
71
|
+
console.warn(`Submitting task retrying in ${delay}ms...`);
|
|
72
|
+
await sleepMs(delay);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async getResultWithTimeout(taskId, timeoutMs = 600_000, intervalMs = 5000) {
|
|
77
|
+
const start = Date.now();
|
|
78
|
+
const isPending = (status) => status === undefined || status === "queued" || status === "running";
|
|
79
|
+
let errData = undefined;
|
|
80
|
+
while (true) {
|
|
81
|
+
const elapsed = Date.now() - start;
|
|
82
|
+
if (elapsed > timeoutMs) {
|
|
83
|
+
throw new ClientError("73003", `Timeout: cannot get task[${taskId}] complete result within ${timeoutMs}ms`, errData);
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
const data = await this.getResult(taskId);
|
|
87
|
+
const { status } = data ?? {};
|
|
88
|
+
errData = { taskId, status };
|
|
89
|
+
if (!isPending(status)) {
|
|
90
|
+
return data;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
const NO_RETRY_CODES = ["73001"]; // from zkvm
|
|
95
|
+
if (err instanceof ClientError && NO_RETRY_CODES.includes(err.code))
|
|
96
|
+
throw err;
|
|
97
|
+
errData = makeErrData(err);
|
|
98
|
+
}
|
|
99
|
+
console.warn(`Getting result retrying in ${intervalMs}ms...`);
|
|
100
|
+
await sleepMs(intervalMs);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
async _doZkVM(attestationData) {
|
|
104
|
+
try {
|
|
105
|
+
const submitResult = await this.submitTaskWithRetry(attestationData);
|
|
106
|
+
const result = await this.getResultWithTimeout(submitResult.task_id);
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
if (!(err instanceof ClientError)) {
|
|
111
|
+
err = new ClientError("73099", `Do doZkVM failed`, makeErrData(err));
|
|
112
|
+
}
|
|
113
|
+
await mockErrorReport(err);
|
|
114
|
+
throw err;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async doZkVM(attestationData) {
|
|
118
|
+
return await this._doZkVM(attestationData);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=prover_client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prover_client.js","sourceRoot":"","sources":["../../src/client/prover_client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Options, RequestParamsInput } from "../types.js";
|
|
2
|
+
import { SdkConfig } from "../config.js";
|
|
3
|
+
export declare class ZkTLSClient {
|
|
4
|
+
private readonly config;
|
|
5
|
+
private primusNetwork;
|
|
6
|
+
constructor(config?: SdkConfig);
|
|
7
|
+
/**
|
|
8
|
+
* Initialize PrimusNetwork SDK
|
|
9
|
+
*/
|
|
10
|
+
private _initializePrimusNetwork;
|
|
11
|
+
/**
|
|
12
|
+
* Submit zkTLS task with retry and exponential backoff
|
|
13
|
+
*/
|
|
14
|
+
private _submitZkTLSTaskWithRetry;
|
|
15
|
+
/**
|
|
16
|
+
* Run attestation with retries
|
|
17
|
+
*/
|
|
18
|
+
private _attestWithRetry;
|
|
19
|
+
/**
|
|
20
|
+
* Verify and poll task result with retries
|
|
21
|
+
*/
|
|
22
|
+
private _verifyAndPollTaskResultWithRetry;
|
|
23
|
+
/**
|
|
24
|
+
* Prepare final zkVM attestation data
|
|
25
|
+
*/
|
|
26
|
+
private _prepareZkVmRequestData;
|
|
27
|
+
/**
|
|
28
|
+
* Main entry: perform zkTLS attestation and task flow
|
|
29
|
+
*/
|
|
30
|
+
private _doZkTLS;
|
|
31
|
+
doZkTLS(params: RequestParamsInput, options?: Options): Promise<any>;
|
|
32
|
+
}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { PrimusNetwork } from "@primuslabs/network-core-sdk";
|
|
2
|
+
import { ethers } from "ethers";
|
|
3
|
+
import { sleepMs, mockErrorReport, makeErrData } from "../utils.js";
|
|
4
|
+
import { getDefaultOptions } from "../types.js";
|
|
5
|
+
import { resolveSdkConfig } from "../config.js";
|
|
6
|
+
import { ClientError } from "../error.js";
|
|
7
|
+
import { DataServiceClient } from "./data_service_client.js";
|
|
8
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
9
|
+
export class ZkTLSClient {
|
|
10
|
+
config;
|
|
11
|
+
primusNetwork;
|
|
12
|
+
constructor(config = {}) {
|
|
13
|
+
this.config = resolveSdkConfig(config);
|
|
14
|
+
this.primusNetwork = new PrimusNetwork();
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Initialize PrimusNetwork SDK
|
|
18
|
+
*/
|
|
19
|
+
async _initializePrimusNetwork(opts, wallet, chainId) {
|
|
20
|
+
try {
|
|
21
|
+
console.log("🚀 Initializing PrimusNetwork...");
|
|
22
|
+
const result = await this.primusNetwork.init(wallet, chainId, opts.noProxy === true ? "native" : undefined);
|
|
23
|
+
console.log("✅ PrimusNetwork initialized:", result);
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
throw new ClientError("71002", `Initializing PrimusNetwork failed`, makeErrData(err));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Submit zkTLS task with retry and exponential backoff
|
|
31
|
+
*/
|
|
32
|
+
async _submitZkTLSTaskWithRetry(_opts, attestParams, maxRetries = 4, baseDelay = 1000) {
|
|
33
|
+
let attempt = 0;
|
|
34
|
+
const start = Date.now();
|
|
35
|
+
console.log("📝 Submitting zkTLS task...");
|
|
36
|
+
while (true) {
|
|
37
|
+
try {
|
|
38
|
+
let result;
|
|
39
|
+
if (this.config.zktlsMode === "DVC") {
|
|
40
|
+
result = await this.primusNetwork.submitTask(attestParams);
|
|
41
|
+
}
|
|
42
|
+
else if (this.config.zktlsMode === "POR") {
|
|
43
|
+
const client = new DataServiceClient(this.config.dataServiceUrl);
|
|
44
|
+
const bizId = uuidv4();
|
|
45
|
+
const token = this.config.token;
|
|
46
|
+
const projectId = this.config.projectId;
|
|
47
|
+
result = await client.submitTask(bizId, projectId, token);
|
|
48
|
+
}
|
|
49
|
+
console.log(`✅ submitTask done (${Date.now() - start}ms):`, result);
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
const NO_RETRY_CODES = ["72001"]; // from data service client
|
|
54
|
+
if (err instanceof ClientError && NO_RETRY_CODES.includes(err.code))
|
|
55
|
+
throw err;
|
|
56
|
+
attempt++;
|
|
57
|
+
console.warn(`⚠️ submitTask attempt ${attempt} failed: ${err.message}`);
|
|
58
|
+
if (attempt > maxRetries) {
|
|
59
|
+
throw new ClientError("71003", `Submitting zkTLS task failed after ${maxRetries} retries`, makeErrData(err));
|
|
60
|
+
}
|
|
61
|
+
const delay = baseDelay * 2 ** (attempt - 1);
|
|
62
|
+
console.warn(`⏳ submitTask retrying in ${delay}ms...`);
|
|
63
|
+
await sleepMs(delay);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Run attestation with retries
|
|
69
|
+
*/
|
|
70
|
+
async _attestWithRetry(requestParams, opts, attestParams, submitResult, maxRetries = 4, baseDelay = 1000) {
|
|
71
|
+
let attempt = 0;
|
|
72
|
+
const start = Date.now();
|
|
73
|
+
console.log("⚙️ Running attestation...");
|
|
74
|
+
while (true) {
|
|
75
|
+
try {
|
|
76
|
+
const reqParams = opts.requestParamsCallback ? opts.requestParamsCallback() : requestParams;
|
|
77
|
+
if (reqParams.requests.length !== reqParams.responseResolves.length) {
|
|
78
|
+
throw new ClientError("71001", `Request params size mismatch ${reqParams.requests.length} != ${reqParams.responseResolves.length}`);
|
|
79
|
+
}
|
|
80
|
+
const params = {
|
|
81
|
+
...attestParams,
|
|
82
|
+
...submitResult,
|
|
83
|
+
requests: reqParams.requests,
|
|
84
|
+
responseResolves: reqParams.responseResolves,
|
|
85
|
+
sslCipher: opts.sslCipher,
|
|
86
|
+
attMode: { algorithmType: opts.algorithmType },
|
|
87
|
+
specialTask: opts.specialTask,
|
|
88
|
+
noProxy: opts.noProxy,
|
|
89
|
+
getAllJsonResponse: "true"
|
|
90
|
+
};
|
|
91
|
+
const result = await this.primusNetwork.attest(params, 5 * 60 * 1000);
|
|
92
|
+
console.log(`✅ attest done (${Date.now() - start}ms):`, result);
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
attempt++;
|
|
97
|
+
if (err) {
|
|
98
|
+
const info = {};
|
|
99
|
+
if (err.code)
|
|
100
|
+
info.code = err.code;
|
|
101
|
+
if (err.message)
|
|
102
|
+
info.message = err.message;
|
|
103
|
+
if (err.data)
|
|
104
|
+
info.data = err.data;
|
|
105
|
+
console.warn(`⚠️ attest attempt ${attempt} failed: ${info}`);
|
|
106
|
+
const NO_RETRY_CODES = ["71001"]; // TODO:
|
|
107
|
+
if (info.code && NO_RETRY_CODES.includes(info.code)) {
|
|
108
|
+
if (err instanceof ClientError)
|
|
109
|
+
throw err;
|
|
110
|
+
throw new ClientError("71004", `Attesting zkTLS failed`, makeErrData(err));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (attempt > maxRetries) {
|
|
114
|
+
throw new ClientError("71005", `Attesting zkTLS failed after ${maxRetries} retries`, makeErrData(err));
|
|
115
|
+
}
|
|
116
|
+
const delay = baseDelay * 2 ** (attempt - 1);
|
|
117
|
+
console.warn(`⏳ attest retrying in ${delay}ms...`);
|
|
118
|
+
await sleepMs(delay);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Verify and poll task result with retries
|
|
124
|
+
*/
|
|
125
|
+
async _verifyAndPollTaskResultWithRetry(attestResult, maxRetries = 4, baseDelay = 1000) {
|
|
126
|
+
let attempt = 0;
|
|
127
|
+
const start = Date.now();
|
|
128
|
+
console.log("🔍 Verifying task...");
|
|
129
|
+
while (true) {
|
|
130
|
+
try {
|
|
131
|
+
const result = await this.primusNetwork.verifyAndPollTaskResult({
|
|
132
|
+
taskId: attestResult[0].taskId,
|
|
133
|
+
reportTxHash: attestResult[0].reportTxHash
|
|
134
|
+
});
|
|
135
|
+
console.log(`✅ verify done (${Date.now() - start}ms):`, result);
|
|
136
|
+
return result;
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
attempt++;
|
|
140
|
+
console.warn(`⚠️ verify attempt ${attempt} failed: ${err.message}`);
|
|
141
|
+
if (attempt > maxRetries) {
|
|
142
|
+
throw new ClientError("71006", `Verifying task failed after ${maxRetries} retries`, makeErrData(err));
|
|
143
|
+
}
|
|
144
|
+
const delay = baseDelay * 2 ** (attempt - 1);
|
|
145
|
+
console.warn(`⏳ verify retrying in ${delay}ms...`);
|
|
146
|
+
await sleepMs(delay);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Prepare final zkVM attestation data
|
|
152
|
+
*/
|
|
153
|
+
async _prepareZkVmRequestData(verifyType, attestResult) {
|
|
154
|
+
const taskId = attestResult[0].taskId;
|
|
155
|
+
const plainResponse = this.primusNetwork.getAllJsonResponse(taskId);
|
|
156
|
+
if (!plainResponse) {
|
|
157
|
+
throw new ClientError("71007", `Unable to get plain JSON response.`);
|
|
158
|
+
}
|
|
159
|
+
if (verifyType == 'HASH_COMPARISON') {
|
|
160
|
+
// todo!
|
|
161
|
+
return {
|
|
162
|
+
attestationData: {
|
|
163
|
+
verification_type: Array.from({ length: plainResponse.length }, () => "HASH_COMPARISON"),
|
|
164
|
+
public_data: attestResult,
|
|
165
|
+
private_data: plainResponse
|
|
166
|
+
},
|
|
167
|
+
requestid: taskId
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
return {};
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Main entry: perform zkTLS attestation and task flow
|
|
176
|
+
*/
|
|
177
|
+
async _doZkTLS(requestParams, options = {}) {
|
|
178
|
+
const startTime = Date.now();
|
|
179
|
+
const attestParams = {
|
|
180
|
+
address: "0x9b7706746c6e19AD5EB5c1DaeEa4b4C09EEC8a5f"
|
|
181
|
+
};
|
|
182
|
+
const opts = getDefaultOptions(options);
|
|
183
|
+
try {
|
|
184
|
+
const provider = new ethers.providers.JsonRpcProvider(this.config.rpcUrl);
|
|
185
|
+
const wallet = this.config.privateKey ? new ethers.Wallet(this.config.privateKey, provider) : provider;
|
|
186
|
+
const { chainId } = await provider.getNetwork();
|
|
187
|
+
await this._initializePrimusNetwork(opts, wallet, chainId);
|
|
188
|
+
const submitResult = await this._submitZkTLSTaskWithRetry(opts, attestParams);
|
|
189
|
+
const attestResult = await this._attestWithRetry(requestParams, opts, attestParams, submitResult);
|
|
190
|
+
await this._verifyAndPollTaskResultWithRetry(attestResult);
|
|
191
|
+
const zkVmRequestData = await this._prepareZkVmRequestData(requestParams.verifyType, attestResult);
|
|
192
|
+
console.log(`✅ Total execution time: ${Date.now() - startTime}ms`);
|
|
193
|
+
return zkVmRequestData;
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
if (!(err instanceof ClientError)) {
|
|
197
|
+
err = new ClientError("71099", `Do zkTLS failed`, makeErrData(err));
|
|
198
|
+
}
|
|
199
|
+
await mockErrorReport(err);
|
|
200
|
+
throw err;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
async doZkTLS(params, options = {}) {
|
|
204
|
+
const requestParams = Array.isArray(params) ? params : [params];
|
|
205
|
+
let attestations = [];
|
|
206
|
+
for (const reqParams of requestParams) {
|
|
207
|
+
const data = await this._doZkTLS(reqParams, options);
|
|
208
|
+
attestations.push(data.attestationData);
|
|
209
|
+
}
|
|
210
|
+
return attestations;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=zktls_client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zktls_client.js","sourceRoot":"","sources":["../../src/client/zktls_client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAW,iBAAiB,EAAkD,MAAM,aAAa,CAAC;AACzG,OAAO,EAAa,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAGpC,MAAM,OAAO,WAAW;IACL,MAAM,CAAsB;IACrC,aAAa,CAAgB;IAErC,YAAY,SAAoB,EAAE;QAChC,IAAI,CAAC,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;IAC3C,CAAC;IAGD;;OAEG;IACK,KAAK,CAAC,wBAAwB,CAAC,IAAa,EAAE,MAAW,EAAE,OAAe;QAChF,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAC5G,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,MAAM,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,WAAW,CAAC,OAAO,EAAE,mCAAmC,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,yBAAyB,CACrC,KAAc,EACd,YAAiB,EACjB,UAAU,GAAG,CAAC,EACd,SAAS,GAAG,IAAI;QAEhB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAE3C,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,IAAI,MAAM,CAAC;gBACX,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;oBACpC,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;gBAC7D,CAAC;qBAAM,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;oBAC3C,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;oBACjE,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC;oBACvB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;oBAChC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;oBACxC,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;gBAC5D,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,EAAE,MAAM,CAAC,CAAC;gBACpE,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,MAAM,cAAc,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B;gBAC7D,IAAI,GAAG,YAAY,WAAW,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE,MAAM,GAAG,CAAC;gBAE/E,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,IAAI,CAAC,yBAAyB,OAAO,YAAY,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBACxE,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;oBACzB,MAAM,IAAI,WAAW,CAAC,OAAO,EAAE,sCAAsC,UAAU,UAAU,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC/G,CAAC;gBAED,MAAM,KAAK,GAAG,SAAS,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;gBAC7C,OAAO,CAAC,IAAI,CAAC,4BAA4B,KAAK,OAAO,CAAC,CAAC;gBACvD,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAC5B,aAA4B,EAC5B,IAAa,EACb,YAAiB,EACjB,YAAiB,EACjB,UAAU,GAAG,CAAC,EACd,SAAS,GAAG,IAAI;QAEhB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QAEzC,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;gBAC5F,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;oBACpE,MAAM,IAAI,WAAW,CAAC,OAAO,EAAE,gCAAgC,SAAS,CAAC,QAAQ,CAAC,MAAM,OAAO,SAAS,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC;gBACtI,CAAC;gBAED,MAAM,MAAM,GAAG;oBACb,GAAG,YAAY;oBACf,GAAG,YAAY;oBACf,QAAQ,EAAE,SAAS,CAAC,QAAQ;oBAC5B,gBAAgB,EAAE,SAAS,CAAC,gBAAgB;oBAC5C,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE;oBAC9C,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,kBAAkB,EAAE,MAAM;iBAC3B,CAAC;gBAEF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;gBACtE,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,EAAE,MAAM,CAAC,CAAC;gBAChE,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,EAAE,CAAC;gBAEV,IAAI,GAAG,EAAE,CAAC;oBACR,MAAM,IAAI,GAAwB,EAAE,CAAC;oBACrC,IAAI,GAAG,CAAC,IAAI;wBAAE,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;oBACnC,IAAI,GAAG,CAAC,OAAO;wBAAE,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;oBAC5C,IAAI,GAAG,CAAC,IAAI;wBAAE,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;oBACnC,OAAO,CAAC,IAAI,CAAC,qBAAqB,OAAO,YAAY,IAAI,EAAE,CAAC,CAAC;oBAE7D,MAAM,cAAc,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;oBAC1C,IAAI,IAAI,CAAC,IAAI,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;wBACpD,IAAI,GAAG,YAAY,WAAW;4BAAE,MAAM,GAAG,CAAC;wBAC1C,MAAM,IAAI,WAAW,CAAC,OAAO,EAAE,wBAAwB,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC7E,CAAC;gBACH,CAAC;gBAED,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;oBACzB,MAAM,IAAI,WAAW,CAAC,OAAO,EAAE,gCAAgC,UAAU,UAAU,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;gBACzG,CAAC;gBAED,MAAM,KAAK,GAAG,SAAS,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;gBAC7C,OAAO,CAAC,IAAI,CAAC,wBAAwB,KAAK,OAAO,CAAC,CAAC;gBACnD,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,iCAAiC,CAC7C,YAAiB,EACjB,UAAU,GAAG,CAAC,EACd,SAAS,GAAG,IAAI;QAEhB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAEpC,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,uBAAuB,CAAC;oBAC9D,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM;oBAC9B,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY;iBAC3C,CAAC,CAAC;gBACH,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,EAAE,MAAM,CAAC,CAAC;gBAChE,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,IAAI,CAAC,qBAAqB,OAAO,YAAY,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBACpE,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;oBACzB,MAAM,IAAI,WAAW,CAAC,OAAO,EAAE,+BAA+B,UAAU,UAAU,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;gBACxG,CAAC;gBAED,MAAM,KAAK,GAAG,SAAS,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;gBAC7C,OAAO,CAAC,IAAI,CAAC,wBAAwB,KAAK,OAAO,CAAC,CAAC;gBACnD,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,uBAAuB,CAAC,UAAuB,EAAE,YAAiB;QAC9E,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACtC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAEpE,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,WAAW,CAAC,OAAO,EAAE,oCAAoC,CAAC,CAAC;QACvE,CAAC;QAED,IAAI,UAAU,IAAI,iBAAiB,EAAE,CAAC;YACpC,QAAQ;YACR,OAAO;gBACL,eAAe,EAAE;oBACf,iBAAiB,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC;oBACxF,WAAW,EAAE,YAAY;oBACzB,YAAY,EAAE,aAAa;iBAC5B;gBACD,SAAS,EAAE,MAAM;aAClB,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,EAAE,CAAC;QACZ,CAAC;IAEH,CAAC;IAGD;;OAEG;IACK,KAAK,CAAC,QAAQ,CAAC,aAA4B,EAAE,UAAmB,EAAE;QACxE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,YAAY,GAAG;YACnB,OAAO,EAAE,4CAA4C;SACtD,CAAC;QAEF,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YACvG,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;YAEhD,MAAM,IAAI,CAAC,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAE3D,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YAE9E,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAC9C,aAAa,EACb,IAAI,EACJ,YAAY,EACZ,YAAY,CACb,CAAC;YAEF,MAAM,IAAI,CAAC,iCAAiC,CAAC,YAAY,CAAC,CAAC;YAE3D,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,aAAa,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YAEnG,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,CAAC,CAAC;YAEnE,OAAO,eAAe,CAAC;QACzB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,CAAC,GAAG,YAAY,WAAW,CAAC,EAAE,CAAC;gBAClC,GAAG,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,iBAAiB,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;YACtE,CAAC;YACD,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;YAE3B,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,MAA0B,EAAE,UAAmB,EAAE;QAC7D,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAChE,IAAI,YAAY,GAAU,EAAE,CAAC;QAC7B,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACrD,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;CACF"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import "dotenv/config";
|
|
2
|
+
export interface SdkConfig {
|
|
3
|
+
token?: string;
|
|
4
|
+
projectId?: string;
|
|
5
|
+
programId?: string;
|
|
6
|
+
logVerbose?: number;
|
|
7
|
+
zkvmServiceUrl?: string;
|
|
8
|
+
dataServiceUrl?: string;
|
|
9
|
+
rpcUrl?: string;
|
|
10
|
+
privateKey?: string;
|
|
11
|
+
zktlsMode?: "POR" | string;
|
|
12
|
+
}
|
|
13
|
+
export declare function getDefaultConfig(): Required<SdkConfig>;
|
|
14
|
+
export declare function loadConfigFromEnv(): SdkConfig;
|
|
15
|
+
export declare function resolveSdkConfig(userConfig?: SdkConfig): Required<SdkConfig>;
|
|
16
|
+
export declare function printConfig(config: SdkConfig, tag: string): void;
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import "dotenv/config";
|
|
2
|
+
export function getDefaultConfig() {
|
|
3
|
+
return {
|
|
4
|
+
token: "",
|
|
5
|
+
projectId: "",
|
|
6
|
+
programId: "",
|
|
7
|
+
logVerbose: 0,
|
|
8
|
+
zkvmServiceUrl: "https://api-por.primuslabs.xyz:38080",
|
|
9
|
+
dataServiceUrl: "http://api-dev.padolabs.org:38101",
|
|
10
|
+
rpcUrl: "https://mainnet.base.org",
|
|
11
|
+
privateKey: "",
|
|
12
|
+
zktlsMode: "POR",
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export function loadConfigFromEnv() {
|
|
16
|
+
const envConfig = {
|
|
17
|
+
token: process.env.TOKEN?.trim(),
|
|
18
|
+
projectId: process.env.PROJECT_ID?.trim(),
|
|
19
|
+
programId: process.env.PROGRAM_ID?.trim(),
|
|
20
|
+
logVerbose: process.env.LOG_VERBOSE !== undefined ? Number(process.env.LOG_VERBOSE) : undefined,
|
|
21
|
+
zkvmServiceUrl: process.env.ZKVM_SERVICE_URL?.trim(),
|
|
22
|
+
dataServiceUrl: process.env.DATA_SERVICE_URL?.trim(),
|
|
23
|
+
rpcUrl: process.env.RPC_URL?.trim(),
|
|
24
|
+
privateKey: process.env.PRIVATE_KEY?.trim(),
|
|
25
|
+
zktlsMode: process.env.ZKTLS_MODE?.trim(),
|
|
26
|
+
};
|
|
27
|
+
// filter undefined field
|
|
28
|
+
return Object.fromEntries(Object.entries(envConfig).filter(([_, value]) => value !== undefined));
|
|
29
|
+
}
|
|
30
|
+
export function resolveSdkConfig(userConfig = {}) {
|
|
31
|
+
const config = {
|
|
32
|
+
...getDefaultConfig(),
|
|
33
|
+
...userConfig,
|
|
34
|
+
...loadConfigFromEnv(),
|
|
35
|
+
};
|
|
36
|
+
// validate
|
|
37
|
+
if (config.zktlsMode === "POR") {
|
|
38
|
+
if (!config.token || !config.projectId || !config.programId) {
|
|
39
|
+
throw new Error("TOKEN, PROJECT_ID, PROGRAM_ID are required in POR mode");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return config;
|
|
43
|
+
}
|
|
44
|
+
export function printConfig(config, tag) {
|
|
45
|
+
const maskedConfig = {
|
|
46
|
+
...config,
|
|
47
|
+
token: config.token ? `${config.token.slice(0, 6)}***` : undefined,
|
|
48
|
+
privateKey: config.privateKey ? `${config.privateKey.slice(0, 6)}***` : undefined,
|
|
49
|
+
};
|
|
50
|
+
const filterConfig = Object.fromEntries(Object.entries(maskedConfig).filter(([_, value]) => value !== undefined));
|
|
51
|
+
console.log(tag, "config", filterConfig);
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { VERIFY_TYPE, RequestParams } from "../types.js";
|
|
2
|
+
export interface BinanceAccount {
|
|
3
|
+
key: string;
|
|
4
|
+
secret: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class Binance {
|
|
7
|
+
private accounts;
|
|
8
|
+
private readonly recvWindow;
|
|
9
|
+
constructor();
|
|
10
|
+
private loadAccounts;
|
|
11
|
+
getUnifiedAccountRequests(verifyType?: VERIFY_TYPE): RequestParams;
|
|
12
|
+
getSpotAccountRequests(verifyType?: VERIFY_TYPE): RequestParams;
|
|
13
|
+
getAccounts(): BinanceAccount[];
|
|
14
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import ccxt from "ccxt";
|
|
2
|
+
import { makeHashComparisonParams } from "./helper.js";
|
|
3
|
+
export class Binance {
|
|
4
|
+
accounts;
|
|
5
|
+
recvWindow;
|
|
6
|
+
constructor() {
|
|
7
|
+
this.recvWindow = Number(process.env.BINANCE_RECV_WINDOW || 60) * 1000;
|
|
8
|
+
this.accounts = this.loadAccounts();
|
|
9
|
+
}
|
|
10
|
+
loadAccounts() {
|
|
11
|
+
const accounts = [];
|
|
12
|
+
const _add = (key, secret) => {
|
|
13
|
+
if (key && secret)
|
|
14
|
+
accounts.push({ key, secret });
|
|
15
|
+
};
|
|
16
|
+
_add(process.env.BINANCE_API_KEY, process.env.BINANCE_API_SECRET);
|
|
17
|
+
for (let i = 1; i <= 100; i++) {
|
|
18
|
+
_add(process.env[`BINANCE_API_KEY${i}`], process.env[`BINANCE_API_SECRET${i}`]);
|
|
19
|
+
}
|
|
20
|
+
if (accounts.length === 0) {
|
|
21
|
+
throw new Error("Please configure at least one set of BINANCE_API_KEY{i} / BINANCE_API_SECRET{i} in .env.");
|
|
22
|
+
}
|
|
23
|
+
const seen = new Set();
|
|
24
|
+
for (const acc of accounts) {
|
|
25
|
+
const key = `${acc.key}${acc.secret}`;
|
|
26
|
+
if (seen.has(key))
|
|
27
|
+
throw new Error("Duplicate BINANCE_API_KEY{i} detected");
|
|
28
|
+
seen.add(key);
|
|
29
|
+
}
|
|
30
|
+
return accounts;
|
|
31
|
+
}
|
|
32
|
+
getUnifiedAccountRequests(verifyType = 'HASH_COMPARISON') {
|
|
33
|
+
const signParams = { recvWindow: this.recvWindow };
|
|
34
|
+
const origRequests = [];
|
|
35
|
+
for (const acc of this.accounts) {
|
|
36
|
+
const exchange = new ccxt.binance({ apiKey: acc.key, secret: acc.secret });
|
|
37
|
+
origRequests.push(exchange.sign("um/positionRisk", "papi", "GET", signParams));
|
|
38
|
+
origRequests.push(exchange.sign("balance", "papi", "GET", signParams));
|
|
39
|
+
}
|
|
40
|
+
return makeHashComparisonParams(origRequests, verifyType);
|
|
41
|
+
}
|
|
42
|
+
getSpotAccountRequests(verifyType = 'HASH_COMPARISON') {
|
|
43
|
+
const origRequests = [];
|
|
44
|
+
const signParams = { recvWindow: this.recvWindow };
|
|
45
|
+
for (const acc of this.accounts) {
|
|
46
|
+
const exchange = new ccxt.binance({ apiKey: acc.key, secret: acc.secret });
|
|
47
|
+
origRequests.push(exchange.sign("account", "private", "GET", { ...signParams, omitZeroBalances: true }));
|
|
48
|
+
}
|
|
49
|
+
return makeHashComparisonParams(origRequests, verifyType);
|
|
50
|
+
}
|
|
51
|
+
getAccounts() {
|
|
52
|
+
return this.accounts;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=binance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binance.js","sourceRoot":"","sources":["../../src/datasource/binance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export function makeHashComparisonParams(origRequests, verifyType) {
|
|
2
|
+
if (!Array.isArray(origRequests)) {
|
|
3
|
+
throw new Error("Invalid input: origRequests must be an array");
|
|
4
|
+
}
|
|
5
|
+
const requestParams = {
|
|
6
|
+
verifyType: 'HASH_COMPARISON',
|
|
7
|
+
requests: [],
|
|
8
|
+
responseResolves: [],
|
|
9
|
+
};
|
|
10
|
+
for (let i = 0; i < origRequests.length; i++) {
|
|
11
|
+
const origRequest = origRequests[i];
|
|
12
|
+
requestParams.requests.push({
|
|
13
|
+
url: origRequest.url,
|
|
14
|
+
method: "GET",
|
|
15
|
+
header: { ...origRequest.headers },
|
|
16
|
+
body: "",
|
|
17
|
+
});
|
|
18
|
+
if (verifyType == 'HASH_COMPARISON') {
|
|
19
|
+
requestParams.responseResolves.push([
|
|
20
|
+
{
|
|
21
|
+
keyName: `${i}`,
|
|
22
|
+
parseType: "json",
|
|
23
|
+
parsePath: "$",
|
|
24
|
+
op: "SHA256_EX",
|
|
25
|
+
},
|
|
26
|
+
]);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
throw Error("not supported verify type");
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return requestParams;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helper.js","sourceRoot":"","sources":["../../src/datasource/helper.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,wBAAwB,CAAC,YAAmB,EAAE,UAAuB;IACnF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,aAAa,GAAkB;QACnC,UAAU,EAAE,iBAAiB;QAC7B,QAAQ,EAAE,EAAE;QACZ,gBAAgB,EAAE,EAAE;KACrB,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAEpC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC1B,GAAG,EAAE,WAAW,CAAC,GAAG;YACpB,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE;YAClC,IAAI,EAAE,EAAE;SACT,CAAC,CAAC;QAEH,IAAI,UAAU,IAAI,iBAAiB,EAAE,CAAC;YACpC,aAAa,CAAC,gBAAgB,CAAC,IAAI,CAAC;gBAClC;oBACE,OAAO,EAAE,GAAG,CAAC,EAAE;oBACf,SAAS,EAAE,MAAM;oBACjB,SAAS,EAAE,GAAG;oBACd,EAAE,EAAE,WAAW;iBAChB;aACF,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/datasource/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,OAAO,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { makeHashComparisonParams } from "./helper.js";
|
|
2
|
+
export class Okx {
|
|
3
|
+
constructor() {
|
|
4
|
+
}
|
|
5
|
+
getSampleRequests(verifyType = 'HASH_COMPARISON') {
|
|
6
|
+
const origRequests = [
|
|
7
|
+
{
|
|
8
|
+
url: "https://www.okx.com/api/v5/public/instruments?instType=SPOT&instId=BTC-USD",
|
|
9
|
+
method: "GET",
|
|
10
|
+
header: {},
|
|
11
|
+
body: "",
|
|
12
|
+
}
|
|
13
|
+
];
|
|
14
|
+
return makeHashComparisonParams(origRequests, verifyType);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=okx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"okx.js","sourceRoot":"","sources":["../../src/datasource/okx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAIvD,MAAM,OAAO,GAAG;IACd;IACA,CAAC;IAEM,iBAAiB,CAAC,aAA0B,iBAAiB;QAClE,MAAM,YAAY,GAAU;YAC1B;gBACE,GAAG,EAAE,4EAA4E;gBACjF,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,EAAE;gBACV,IAAI,EAAE,EAAE;aACT;SACF,CAAC;QACF,OAAO,wBAAwB,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IAC5D,CAAC;CAEF"}
|
package/dist/error.d.ts
ADDED
package/dist/error.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC,IAAI,CAAS;IACb,IAAI,CAAO;IAEX,YAAY,IAAY,EAAE,OAAgB,EAAE,IAAU;QACpD,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,OAAO,KAAK,UAAU,MAAM,cAAc,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { AttNetworkRequest, AttNetworkResponseResolve } from "@primuslabs/network-core-sdk/dist/types";
|
|
2
|
+
export type VERIFY_TYPE = "HASH_COMPARISON";
|
|
3
|
+
export type RequestParams = {
|
|
4
|
+
verifyType: VERIFY_TYPE;
|
|
5
|
+
requests: AttNetworkRequest[];
|
|
6
|
+
responseResolves: AttNetworkResponseResolve[][];
|
|
7
|
+
};
|
|
8
|
+
export type RequestParamsInput = RequestParams | RequestParams[];
|
|
9
|
+
export interface Options {
|
|
10
|
+
sslCipher?: string;
|
|
11
|
+
algorithmType?: string;
|
|
12
|
+
specialTask?: any;
|
|
13
|
+
noProxy?: boolean;
|
|
14
|
+
runZkvm?: boolean;
|
|
15
|
+
requestParamsCallback?: () => RequestParams;
|
|
16
|
+
}
|
|
17
|
+
export declare function getDefaultOptions(options: Options): Options;
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function getDefaultOptions(options) {
|
|
2
|
+
const defaults = {
|
|
3
|
+
sslCipher: "ECDHE-RSA-AES128-GCM-SHA256",
|
|
4
|
+
algorithmType: "mpctls",
|
|
5
|
+
specialTask: undefined,
|
|
6
|
+
noProxy: true,
|
|
7
|
+
runZkvm: true,
|
|
8
|
+
requestParamsCallback: undefined,
|
|
9
|
+
};
|
|
10
|
+
return { ...defaults, ...options };
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAkBA,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,MAAM,QAAQ,GAAY;QACxB,SAAS,EAAE,6BAA6B;QACxC,aAAa,EAAE,QAAQ;QACvB,WAAW,EAAE,SAAS;QACtB,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,IAAI;QACb,qBAAqB,EAAE,SAAS;KACjC,CAAC;IACF,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC;AACrC,CAAC"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ClientError } from "./error.js";
|
|
2
|
+
/**
|
|
3
|
+
* Save data to file
|
|
4
|
+
*/
|
|
5
|
+
export declare function saveToFile(filepath: string, data: string | Buffer): void;
|
|
6
|
+
/**
|
|
7
|
+
* Sleep helper (ms)
|
|
8
|
+
*/
|
|
9
|
+
export declare function sleepMs(ms: number): Promise<void>;
|
|
10
|
+
export declare function assertEnvVars<T extends Record<string, any>>(obj: T, keys: readonly (keyof T)[]): void;
|
|
11
|
+
export declare function makeErrData(err: any): Record<string, any> | undefined;
|
|
12
|
+
export declare function mockErrorReport(err: ClientError): Promise<void>;
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
/**
|
|
3
|
+
* Save data to file
|
|
4
|
+
*/
|
|
5
|
+
export function saveToFile(filepath, data) {
|
|
6
|
+
fs.writeFileSync(filepath, data);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Sleep helper (ms)
|
|
10
|
+
*/
|
|
11
|
+
export async function sleepMs(ms) {
|
|
12
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
13
|
+
}
|
|
14
|
+
export function assertEnvVars(obj, keys) {
|
|
15
|
+
for (const key of keys) {
|
|
16
|
+
if (!obj[key]) {
|
|
17
|
+
throw new Error(`❌ Missing required .env value: ${String(key)}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export function makeErrData(err) {
|
|
22
|
+
if (!err)
|
|
23
|
+
return undefined;
|
|
24
|
+
const errData = {};
|
|
25
|
+
if (err.code)
|
|
26
|
+
errData.code = err.code;
|
|
27
|
+
if (err.message)
|
|
28
|
+
errData.message = err.message;
|
|
29
|
+
if (err.data)
|
|
30
|
+
errData.data = err.data;
|
|
31
|
+
console.log("makeErrData:", errData);
|
|
32
|
+
return errData;
|
|
33
|
+
}
|
|
34
|
+
export async function mockErrorReport(err) {
|
|
35
|
+
// TODO:
|
|
36
|
+
console.log('mockErrorReport: ', JSON.stringify(err));
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAGpB;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,IAAqB;IAChE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,EAAU;IACtC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,aAAa,CAAgC,GAAM,EAAE,IAA0B;IAC7F,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,kCAAkC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAQ;IAClC,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAE3B,MAAM,OAAO,GAAwB,EAAE,CAAC;IACxC,IAAI,GAAG,CAAC,IAAI;QAAE,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IACtC,IAAI,GAAG,CAAC,OAAO;QAAE,OAAO,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IAC/C,IAAI,GAAG,CAAC,IAAI;QAAE,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAgB;IACpD,QAAQ;IACR,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AACxD,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@primuslabs/por-client-sdk",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"author": "Primus Labs <dev@primuslabs.org>",
|
|
5
|
+
"description": "Primus PoR client sdk",
|
|
6
|
+
"license": "ISC",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "dist/index.js",
|
|
9
|
+
"types": "dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"require": "./dist/index.cjs"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist"
|
|
19
|
+
],
|
|
20
|
+
"bin": {
|
|
21
|
+
"por-cli": "./dist/cli.js"
|
|
22
|
+
},
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "tsc -p tsconfig.json",
|
|
25
|
+
"test": "jest",
|
|
26
|
+
"publish": "npm publish --access public"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@primuslabs/network-core-sdk": "0.1.4",
|
|
30
|
+
"axios": "^1.13.2",
|
|
31
|
+
"ccxt": "^4.5.11",
|
|
32
|
+
"commander": "^14.0.1",
|
|
33
|
+
"dotenv": "^16.3.1",
|
|
34
|
+
"ethers": "^5.7.2",
|
|
35
|
+
"form-data": "^4.0.4",
|
|
36
|
+
"undici": "^7.16.0",
|
|
37
|
+
"uuid": "^13.0.0"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@types/jest": "^30.0.0",
|
|
41
|
+
"@types/node": "^24.10.2",
|
|
42
|
+
"ts-jest": "^29.4.6",
|
|
43
|
+
"ts-node": "^10.9.2",
|
|
44
|
+
"typescript": "^5.9.3"
|
|
45
|
+
}
|
|
46
|
+
}
|