@pear-protocol/types 1.24.0 → 1.25.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/dist/auth/api-keys.js +11 -3
- package/dist/auth/entities.js +10 -2
- package/dist/auth/payloads.d.ts +7 -0
- package/dist/auth/payloads.js +15 -11
- package/dist/auth/response.js +4 -1
- package/dist/common/array.js +9 -2
- package/dist/common/refinement.js +25 -19
- package/dist/common/request.js +8 -8
- package/dist/common/response.js +10 -10
- package/dist/common/schema.js +9 -2
- package/dist/common/trade-legs.js +17 -12
- package/dist/connector/index.js +7 -1
- package/dist/execution/entities.js +96 -65
- package/dist/execution/queries.js +5 -1
- package/dist/execution/responses.js +3 -1
- package/dist/fee/entities.js +17 -3
- package/dist/fill/entities.js +33 -29
- package/dist/fill/queries.js +4 -1
- package/dist/funding/entities.js +4 -4
- package/dist/funding/responses.js +2 -2
- package/dist/instrument/entities.js +56 -44
- package/dist/instrument/queries.js +6 -1
- package/dist/instrument/responses.js +4 -4
- package/dist/instrument-precision/index.js +23 -23
- package/dist/ladder/entities.js +5 -1
- package/dist/ladder/payloads.js +15 -4
- package/dist/ladder/queries.js +0 -1
- package/dist/ladder/responses.js +12 -4
- package/dist/leverage/payloads.js +4 -1
- package/dist/notification/entities.js +37 -28
- package/dist/notification/payloads.js +9 -3
- package/dist/notification/queries.js +5 -1
- package/dist/notification/responses.js +4 -4
- package/dist/order/entities.js +38 -30
- package/dist/portfolio/queries.js +18 -3
- package/dist/position/entities.js +95 -72
- package/dist/position/queries.js +29 -23
- package/dist/price/entities.js +4 -1
- package/dist/price/responses.js +4 -4
- package/dist/rebalance/entities.js +23 -6
- package/dist/rebalance/payloads.js +23 -11
- package/dist/rebalance/queries.js +2 -8
- package/dist/rebalance/responses.js +12 -4
- package/dist/saved-baskets/entities.js +3 -1
- package/dist/saved-baskets/payloads.js +3 -1
- package/dist/schedule/entities.js +87 -71
- package/dist/schedule/payloads.js +36 -33
- package/dist/schedule/queries.js +5 -1
- package/dist/schedule/responses.js +12 -4
- package/dist/statistics/entities.d.ts +1 -0
- package/dist/statistics/entities.js +12 -0
- package/dist/statistics/queries.d.ts +2 -0
- package/dist/statistics/queries.js +16 -3
- package/dist/statistics/responses.d.ts +1 -0
- package/dist/sync/payloads.js +13 -17
- package/dist/tca/entities.js +4 -1
- package/dist/tca/responses.js +4 -1
- package/dist/trade/payloads.js +37 -23
- package/dist/trade/responses.js +15 -5
- package/dist/trade-accounts/entities.js +4 -1
- package/dist/trade-accounts/response.js +6 -2
- package/dist/trigger/common/index.js +27 -6
- package/dist/trigger/entities/conditions.js +14 -15
- package/dist/trigger/entities/index.js +89 -80
- package/dist/trigger/oracle.js +10 -3
- package/dist/trigger/payloads/conditions.js +8 -2
- package/dist/trigger/payloads/index.js +18 -4
- package/dist/trigger/queries.js +5 -1
- package/dist/trigger/refinement/static.refinement.js +5 -2
- package/dist/trigger/refinement/trailing.refinement.js +8 -6
- package/dist/trigger/responses.js +12 -4
- package/dist/triggers/entities.js +8 -2
- package/dist/users/entities.js +4 -1
- package/dist/users/payloads.js +17 -18
- package/package.json +1 -1
|
@@ -9,23 +9,31 @@ const RebalanceManualResponse = z.object({
|
|
|
9
9
|
}),
|
|
10
10
|
z.object({
|
|
11
11
|
outcome: z.literal("partial_rebalance"),
|
|
12
|
-
messages: z.tuple([
|
|
12
|
+
messages: z.tuple([
|
|
13
|
+
z.string()
|
|
14
|
+
]).rest(z.string())
|
|
13
15
|
}),
|
|
14
16
|
z.object({
|
|
15
17
|
outcome: z.literal("no_rebalance"),
|
|
16
|
-
messages: z.tuple([
|
|
18
|
+
messages: z.tuple([
|
|
19
|
+
z.string()
|
|
20
|
+
]).rest(z.string())
|
|
17
21
|
}),
|
|
18
22
|
// `failed` only occurs on background runs (dispatch/cron); MANUAL execution errors throw and surface as HTTP errors instead.
|
|
19
23
|
z.object({
|
|
20
24
|
outcome: z.literal("failed"),
|
|
21
|
-
messages: z.tuple([
|
|
25
|
+
messages: z.tuple([
|
|
26
|
+
z.string()
|
|
27
|
+
]).rest(z.string())
|
|
22
28
|
})
|
|
23
29
|
])
|
|
24
30
|
});
|
|
25
31
|
const AutoRebalanceListResponse = CursorResponse.extend({
|
|
26
32
|
items: z.array(AutoRebalanceConfig)
|
|
27
33
|
});
|
|
28
|
-
const CreateAutoRebalanceResponse = z.object({
|
|
34
|
+
const CreateAutoRebalanceResponse = z.object({
|
|
35
|
+
config: AutoRebalanceConfig
|
|
36
|
+
});
|
|
29
37
|
const RebalanceEventListResponse = CursorResponse.extend({
|
|
30
38
|
items: z.array(RebalanceEvent)
|
|
31
39
|
});
|
|
@@ -10,7 +10,9 @@ const SavedBasketLeg = z.object({
|
|
|
10
10
|
const SavedBasket = z.object({
|
|
11
11
|
id: z.uuid(),
|
|
12
12
|
name: z.string(),
|
|
13
|
-
legs: z.tuple([
|
|
13
|
+
legs: z.tuple([
|
|
14
|
+
SavedBasketLeg
|
|
15
|
+
]).rest(SavedBasketLeg),
|
|
14
16
|
createdAt: z.string(),
|
|
15
17
|
updatedAt: z.string()
|
|
16
18
|
});
|
|
@@ -3,7 +3,9 @@ import { RefineUniqueSymbols, RefineWeightingSum } from '../common/refinement';
|
|
|
3
3
|
import { SavedBasketLeg } from './entities';
|
|
4
4
|
|
|
5
5
|
const SavedBasketName = z.string().trim().min(1, "Name is required").max(48).describe("Display name, unique per trade account (case-insensitive)");
|
|
6
|
-
const SavedBasketLegs = z.tuple([
|
|
6
|
+
const SavedBasketLegs = z.tuple([
|
|
7
|
+
SavedBasketLeg
|
|
8
|
+
]).rest(SavedBasketLeg).superRefine(RefineUniqueSymbols).superRefine(RefineWeightingSum).refine((value) => value.length <= 20, "Basket must have at most 20 legs").describe("At least one leg, up to 20");
|
|
7
9
|
const CreateSavedBasketPayload = z.object({
|
|
8
10
|
name: SavedBasketName,
|
|
9
11
|
legs: SavedBasketLegs
|
|
@@ -5,10 +5,23 @@ import { Fill } from '../fill/entities';
|
|
|
5
5
|
import { InstrumentId } from '../instrument';
|
|
6
6
|
import { TWAPRandomization } from './randomization';
|
|
7
7
|
|
|
8
|
-
const ScheduleStrategy = z.enum([
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
const ScheduleStrategy = z.enum([
|
|
9
|
+
"TWAP",
|
|
10
|
+
"VWAP"
|
|
11
|
+
]);
|
|
12
|
+
const ScheduleStatus = z.enum([
|
|
13
|
+
"ACTIVE",
|
|
14
|
+
"COMPLETED",
|
|
15
|
+
"FAILED",
|
|
16
|
+
"CANCELLED"
|
|
17
|
+
]);
|
|
18
|
+
const ScheduleIntent = z.enum([
|
|
19
|
+
"OPEN",
|
|
20
|
+
"CLOSE"
|
|
21
|
+
]);
|
|
22
|
+
const ScheduleExecutionType = z.enum([
|
|
23
|
+
"MARKET"
|
|
24
|
+
]);
|
|
12
25
|
const ScheduleCancelledReason = z.enum([
|
|
13
26
|
"POSITION_CLOSED",
|
|
14
27
|
"USER",
|
|
@@ -18,144 +31,147 @@ const ScheduleCancelledReason = z.enum([
|
|
|
18
31
|
]);
|
|
19
32
|
const TWAPOpenLeg = z.object({
|
|
20
33
|
/**
|
|
21
|
-
|
|
22
|
-
|
|
34
|
+
* Instrument ID
|
|
35
|
+
*/
|
|
23
36
|
symbol: InstrumentId,
|
|
24
37
|
/**
|
|
25
|
-
|
|
26
|
-
|
|
38
|
+
* Side
|
|
39
|
+
*/
|
|
27
40
|
side: Side,
|
|
28
41
|
/**
|
|
29
|
-
|
|
30
|
-
|
|
42
|
+
* Share of the parent target notional allocated to this leg
|
|
43
|
+
*/
|
|
31
44
|
weight: AssetWeight
|
|
32
45
|
});
|
|
33
46
|
const BaseSchedule = z.object({
|
|
34
47
|
/**
|
|
35
|
-
|
|
36
|
-
|
|
48
|
+
* Schedule UUID
|
|
49
|
+
*/
|
|
37
50
|
id: z.uuid(),
|
|
38
51
|
/**
|
|
39
|
-
|
|
40
|
-
|
|
52
|
+
* Connector
|
|
53
|
+
*/
|
|
41
54
|
connector: Connector,
|
|
42
55
|
/**
|
|
43
|
-
|
|
44
|
-
|
|
56
|
+
* Schedule strategy
|
|
57
|
+
*/
|
|
45
58
|
strategy: ScheduleStrategy,
|
|
46
59
|
/**
|
|
47
|
-
|
|
48
|
-
|
|
60
|
+
* Schedule status
|
|
61
|
+
*/
|
|
49
62
|
status: ScheduleStatus,
|
|
50
63
|
/**
|
|
51
|
-
|
|
52
|
-
|
|
64
|
+
* Intent
|
|
65
|
+
*/
|
|
53
66
|
intent: ScheduleIntent,
|
|
54
67
|
/**
|
|
55
|
-
|
|
56
|
-
|
|
68
|
+
* Position key
|
|
69
|
+
*/
|
|
57
70
|
positionKey: z.string(),
|
|
58
71
|
/**
|
|
59
|
-
|
|
60
|
-
|
|
72
|
+
* Execution type
|
|
73
|
+
*/
|
|
61
74
|
executionType: ScheduleExecutionType,
|
|
62
75
|
/**
|
|
63
|
-
|
|
64
|
-
|
|
76
|
+
* Last slice at timestamp
|
|
77
|
+
*/
|
|
65
78
|
lastSliceAt: z.string().optional(),
|
|
66
79
|
/**
|
|
67
|
-
|
|
68
|
-
|
|
80
|
+
* Start at timestamp
|
|
81
|
+
*/
|
|
69
82
|
startAt: z.string(),
|
|
70
83
|
/**
|
|
71
|
-
|
|
72
|
-
|
|
84
|
+
* End at timestamp
|
|
85
|
+
*/
|
|
73
86
|
endAt: z.string(),
|
|
74
87
|
/**
|
|
75
|
-
|
|
76
|
-
|
|
88
|
+
* When the schedule was cancelled
|
|
89
|
+
*/
|
|
77
90
|
cancelledAt: z.string().optional(),
|
|
78
91
|
/**
|
|
79
|
-
|
|
80
|
-
|
|
92
|
+
* Reason for the schedule being cancelled
|
|
93
|
+
*/
|
|
81
94
|
cancelledReason: ScheduleCancelledReason.optional(),
|
|
82
95
|
/**
|
|
83
|
-
|
|
84
|
-
|
|
96
|
+
* Created at timestamp
|
|
97
|
+
*/
|
|
85
98
|
createdAt: z.string(),
|
|
86
99
|
/**
|
|
87
|
-
|
|
88
|
-
|
|
100
|
+
* Updated at timestamp
|
|
101
|
+
*/
|
|
89
102
|
updatedAt: z.string(),
|
|
90
103
|
/**
|
|
91
|
-
|
|
92
|
-
|
|
104
|
+
* Fills
|
|
105
|
+
*/
|
|
93
106
|
fills: z.array(Fill).optional()
|
|
94
107
|
});
|
|
95
108
|
const TWAPOpen = BaseSchedule.extend({
|
|
96
109
|
/**
|
|
97
|
-
|
|
98
|
-
|
|
110
|
+
* Strategy
|
|
111
|
+
*/
|
|
99
112
|
strategy: z.literal("TWAP"),
|
|
100
113
|
/**
|
|
101
|
-
|
|
102
|
-
|
|
114
|
+
* Intent
|
|
115
|
+
*/
|
|
103
116
|
intent: z.literal("OPEN"),
|
|
104
117
|
/**
|
|
105
|
-
|
|
106
|
-
|
|
118
|
+
* Slice interval in seconds
|
|
119
|
+
*/
|
|
107
120
|
sliceIntervalSec: z.number(),
|
|
108
121
|
/**
|
|
109
|
-
|
|
110
|
-
|
|
122
|
+
* Number of slices planned inside the execution window
|
|
123
|
+
*/
|
|
111
124
|
sliceCount: z.number().int().positive(),
|
|
112
125
|
/**
|
|
113
|
-
|
|
114
|
-
|
|
126
|
+
* Bounded timing and basket-size randomization
|
|
127
|
+
*/
|
|
115
128
|
randomization: TWAPRandomization,
|
|
116
129
|
/**
|
|
117
|
-
|
|
118
|
-
|
|
130
|
+
* Parent-order leg allocation
|
|
131
|
+
*/
|
|
119
132
|
legs: z.array(TWAPOpenLeg),
|
|
120
133
|
/**
|
|
121
|
-
|
|
122
|
-
|
|
134
|
+
* Target notional
|
|
135
|
+
*/
|
|
123
136
|
targetNotional: UnsignedDecimalString,
|
|
124
137
|
/**
|
|
125
|
-
|
|
126
|
-
|
|
138
|
+
* Remaining notional
|
|
139
|
+
*/
|
|
127
140
|
remainingNotional: UnsignedDecimalString
|
|
128
141
|
});
|
|
129
142
|
const TWAPClose = BaseSchedule.extend({
|
|
130
143
|
/**
|
|
131
|
-
|
|
132
|
-
|
|
144
|
+
* Strategy
|
|
145
|
+
*/
|
|
133
146
|
strategy: z.literal("TWAP"),
|
|
134
147
|
/**
|
|
135
|
-
|
|
136
|
-
|
|
148
|
+
* Intent
|
|
149
|
+
*/
|
|
137
150
|
intent: z.literal("CLOSE"),
|
|
138
151
|
/**
|
|
139
|
-
|
|
140
|
-
|
|
152
|
+
* Slice interval in seconds
|
|
153
|
+
*/
|
|
141
154
|
sliceIntervalSec: z.number(),
|
|
142
155
|
/**
|
|
143
|
-
|
|
144
|
-
|
|
156
|
+
* Number of slices planned inside the execution window
|
|
157
|
+
*/
|
|
145
158
|
sliceCount: z.number().int().positive(),
|
|
146
159
|
/**
|
|
147
|
-
|
|
148
|
-
|
|
160
|
+
* Bounded timing and basket-size randomization
|
|
161
|
+
*/
|
|
149
162
|
randomization: TWAPRandomization,
|
|
150
163
|
/**
|
|
151
|
-
|
|
152
|
-
|
|
164
|
+
* Position UUID
|
|
165
|
+
*/
|
|
153
166
|
positionId: z.uuid(),
|
|
154
167
|
/**
|
|
155
|
-
|
|
156
|
-
|
|
168
|
+
* Initial exposure
|
|
169
|
+
*/
|
|
157
170
|
initialExposure: z.record(InstrumentId, SignedDecimalString)
|
|
158
171
|
});
|
|
159
|
-
const Schedule = z.discriminatedUnion("intent", [
|
|
172
|
+
const Schedule = z.discriminatedUnion("intent", [
|
|
173
|
+
TWAPOpen,
|
|
174
|
+
TWAPClose
|
|
175
|
+
]);
|
|
160
176
|
|
|
161
177
|
export { Schedule, ScheduleCancelledReason, ScheduleExecutionType, ScheduleIntent, ScheduleStatus, ScheduleStrategy, TWAPClose, TWAPOpen };
|
|
@@ -13,16 +13,16 @@ const TargetNotional = UnsignedDecimalString.refine((value) => /[1-9]/.test(valu
|
|
|
13
13
|
});
|
|
14
14
|
const TWAPOpenLeg = z.object({
|
|
15
15
|
/**
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
* Instrument ID
|
|
17
|
+
*/
|
|
18
18
|
symbol: InstrumentId,
|
|
19
19
|
/**
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
* Direction to take
|
|
21
|
+
*/
|
|
22
22
|
side: Side,
|
|
23
23
|
/**
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
* Share of the parent target notional allocated to this leg
|
|
25
|
+
*/
|
|
26
26
|
weight: AssetWeight
|
|
27
27
|
});
|
|
28
28
|
const TWAPOpenLegs = z.array(TWAPOpenLeg).superRefine(RefineMinimumOneSymbol).superRefine(RefineUniqueSymbols).superRefine(RefineWeightingSum);
|
|
@@ -46,60 +46,63 @@ const BaseSchedule = z.object({
|
|
|
46
46
|
});
|
|
47
47
|
const CreateTWAPOpen = BaseSchedule.safeExtend({
|
|
48
48
|
/**
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
* Strategy
|
|
50
|
+
*/
|
|
51
51
|
strategy: z.literal("TWAP"),
|
|
52
52
|
/**
|
|
53
|
-
|
|
54
|
-
|
|
53
|
+
* Intent
|
|
54
|
+
*/
|
|
55
55
|
intent: z.literal("OPEN"),
|
|
56
56
|
/**
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
* Execution type
|
|
58
|
+
*/
|
|
59
59
|
executionType: z.literal("MARKET"),
|
|
60
60
|
/**
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
* Parent-order allocation for each leg
|
|
62
|
+
*/
|
|
63
63
|
legs: TWAPOpenLegs,
|
|
64
64
|
/**
|
|
65
|
-
|
|
66
|
-
|
|
65
|
+
* Target notional
|
|
66
|
+
*/
|
|
67
67
|
targetNotional: TargetNotional,
|
|
68
68
|
/**
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
* Slice interval in seconds
|
|
70
|
+
*/
|
|
71
71
|
sliceIntervalSec: SliceIntervalSec,
|
|
72
72
|
/**
|
|
73
|
-
|
|
74
|
-
|
|
73
|
+
* Attribution route code (client_ids.code)
|
|
74
|
+
*/
|
|
75
75
|
clientId: ClientIdCode
|
|
76
76
|
});
|
|
77
77
|
const CreateTWAPClose = BaseSchedule.safeExtend({
|
|
78
78
|
/**
|
|
79
|
-
|
|
80
|
-
|
|
79
|
+
* Strategy
|
|
80
|
+
*/
|
|
81
81
|
strategy: z.literal("TWAP"),
|
|
82
82
|
/**
|
|
83
|
-
|
|
84
|
-
|
|
83
|
+
* Intent
|
|
84
|
+
*/
|
|
85
85
|
intent: z.literal("CLOSE"),
|
|
86
86
|
/**
|
|
87
|
-
|
|
88
|
-
|
|
87
|
+
* Execution type
|
|
88
|
+
*/
|
|
89
89
|
executionType: z.literal("MARKET"),
|
|
90
90
|
/**
|
|
91
|
-
|
|
92
|
-
|
|
91
|
+
* Position UUID
|
|
92
|
+
*/
|
|
93
93
|
positionId: z.uuid(),
|
|
94
94
|
/**
|
|
95
|
-
|
|
96
|
-
|
|
95
|
+
* Slice interval in seconds
|
|
96
|
+
*/
|
|
97
97
|
sliceIntervalSec: SliceIntervalSec,
|
|
98
98
|
/**
|
|
99
|
-
|
|
100
|
-
|
|
99
|
+
* Attribution route code (client_ids.code)
|
|
100
|
+
*/
|
|
101
101
|
clientId: ClientIdCode
|
|
102
102
|
});
|
|
103
|
-
const CreateSchedule = z.discriminatedUnion("intent", [
|
|
103
|
+
const CreateSchedule = z.discriminatedUnion("intent", [
|
|
104
|
+
CreateTWAPOpen,
|
|
105
|
+
CreateTWAPClose
|
|
106
|
+
]);
|
|
104
107
|
|
|
105
108
|
export { CreateSchedule, CreateTWAPClose, CreateTWAPOpen };
|
package/dist/schedule/queries.js
CHANGED
|
@@ -2,7 +2,11 @@ import { z } from 'zod';
|
|
|
2
2
|
import { normalizeArray, CursorFindParams } from '../common';
|
|
3
3
|
import { Connector } from '../connector';
|
|
4
4
|
|
|
5
|
-
const StatusEnum = z.enum([
|
|
5
|
+
const StatusEnum = z.enum([
|
|
6
|
+
"ACTIVE",
|
|
7
|
+
"COMPLETED",
|
|
8
|
+
"CANCELLED"
|
|
9
|
+
]);
|
|
6
10
|
const StatusArray = z.preprocess((arg) => normalizeArray(arg), z.array(StatusEnum));
|
|
7
11
|
const ScheduleListParams = CursorFindParams.extend({
|
|
8
12
|
connector: Connector.optional(),
|
|
@@ -2,9 +2,17 @@ import { z } from 'zod';
|
|
|
2
2
|
import { CursorResponse } from '../common';
|
|
3
3
|
import { Schedule } from './entities';
|
|
4
4
|
|
|
5
|
-
const ScheduleListResponse = CursorResponse.extend({
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const
|
|
5
|
+
const ScheduleListResponse = CursorResponse.extend({
|
|
6
|
+
schedules: z.array(Schedule)
|
|
7
|
+
});
|
|
8
|
+
const CreateScheduleResponse = z.object({
|
|
9
|
+
schedule: Schedule
|
|
10
|
+
});
|
|
11
|
+
const CancelScheduleResponse = z.object({
|
|
12
|
+
id: z.uuid()
|
|
13
|
+
});
|
|
14
|
+
const CancelAllSchedulesResponse = z.object({
|
|
15
|
+
ids: z.array(z.uuid())
|
|
16
|
+
});
|
|
9
17
|
|
|
10
18
|
export { CancelAllSchedulesResponse, CancelScheduleResponse, CreateScheduleResponse, ScheduleListResponse };
|
|
@@ -17,6 +17,7 @@ export declare const LeaderboardRow: z.ZodObject<{
|
|
|
17
17
|
pearFee: z.ZodString;
|
|
18
18
|
tradeFee: z.ZodString;
|
|
19
19
|
totalTrades: z.ZodNumber;
|
|
20
|
+
roi: z.ZodOptional<z.ZodString>;
|
|
20
21
|
xHandle: z.ZodOptional<z.ZodString>;
|
|
21
22
|
xName: z.ZodOptional<z.ZodString>;
|
|
22
23
|
xAvatarUrl: z.ZodOptional<z.ZodString>;
|
|
@@ -21,6 +21,18 @@ const LeaderboardRow = z.object({
|
|
|
21
21
|
pearFee: z.string(),
|
|
22
22
|
tradeFee: z.string(),
|
|
23
23
|
totalTrades: z.number(),
|
|
24
|
+
// The plain average of this account's per-position returns, as a ratio: "0.25" is +25%.
|
|
25
|
+
// Every position is weighted equally, so a small winner counts as much as a large one —
|
|
26
|
+
// this is a measure of the trader's decisions, not of the dollars those decisions moved.
|
|
27
|
+
//
|
|
28
|
+
// Each position is measured against the size it opened with. An open position contributes
|
|
29
|
+
// its unrealized PnL, a closed one what it realized after fees.
|
|
30
|
+
//
|
|
31
|
+
// Absent when the board could measure none of the account's positions — never "0", which
|
|
32
|
+
// would claim a break-even trader. An account reaches the board with nothing measurable
|
|
33
|
+
// when its only activity in scope is a fill on a position opened before startDate, or when
|
|
34
|
+
// none of its positions recorded an opening size.
|
|
35
|
+
roi: z.string().optional(),
|
|
24
36
|
// The trader's linked X account. Absent for an account whose owner has connected no X
|
|
25
37
|
// account, and absent for an anonymous caller: the board itself is public, but pairing a
|
|
26
38
|
// real name with a wallet address and a PnL for the open internet is a wider promise than
|
|
@@ -53,6 +53,7 @@ export declare const LeaderboardSortBy: z.ZodEnum<{
|
|
|
53
53
|
trades: "trades";
|
|
54
54
|
volume: "volume";
|
|
55
55
|
totalNetPnl: "totalNetPnl";
|
|
56
|
+
roi: "roi";
|
|
56
57
|
}>;
|
|
57
58
|
export type LeaderboardSortBy = z.infer<typeof LeaderboardSortBy>;
|
|
58
59
|
export declare const LEADERBOARD_MAX_LIMIT = 200;
|
|
@@ -70,6 +71,7 @@ export declare const LeaderboardQueryParams: z.ZodObject<{
|
|
|
70
71
|
trades: "trades";
|
|
71
72
|
volume: "volume";
|
|
72
73
|
totalNetPnl: "totalNetPnl";
|
|
74
|
+
roi: "roi";
|
|
73
75
|
}>>;
|
|
74
76
|
startDate: z.ZodOptional<z.ZodPipe<z.ZodCoercedNumber<number>, z.ZodTransform<Date, number>>>;
|
|
75
77
|
endDate: z.ZodOptional<z.ZodPipe<z.ZodCoercedNumber<number>, z.ZodTransform<Date, number>>>;
|
|
@@ -4,7 +4,11 @@ import { Connector } from '../connector';
|
|
|
4
4
|
|
|
5
5
|
const VolumeStatisticsQueryParams = z.object({
|
|
6
6
|
connector: Connector,
|
|
7
|
-
resolution: z.enum([
|
|
7
|
+
resolution: z.enum([
|
|
8
|
+
"1h",
|
|
9
|
+
"4h",
|
|
10
|
+
"24h"
|
|
11
|
+
]),
|
|
8
12
|
startDate: z.coerce.date().optional(),
|
|
9
13
|
endDate: z.coerce.date().default(() => /* @__PURE__ */ new Date()),
|
|
10
14
|
// Per-client scope; absent serves the global series. The literal 'other'
|
|
@@ -15,7 +19,11 @@ const VolumeStatisticsQueryParams = z.object({
|
|
|
15
19
|
});
|
|
16
20
|
const OiStatisticsQueryParams = z.object({
|
|
17
21
|
connector: Connector,
|
|
18
|
-
resolution: z.enum([
|
|
22
|
+
resolution: z.enum([
|
|
23
|
+
"1h",
|
|
24
|
+
"4h",
|
|
25
|
+
"24h"
|
|
26
|
+
]),
|
|
19
27
|
startDate: z.coerce.date().optional(),
|
|
20
28
|
endDate: z.coerce.date().default(() => /* @__PURE__ */ new Date()),
|
|
21
29
|
// Per-client scope; absent serves the global series. The literal 'other'
|
|
@@ -30,7 +38,12 @@ const StatisticsTotalsQueryParams = z.object({
|
|
|
30
38
|
// selects the unattributed (NULL) bucket; an unknown code returns zero totals.
|
|
31
39
|
clientId: z.string().trim().min(1).optional()
|
|
32
40
|
});
|
|
33
|
-
const LeaderboardSortBy = z.enum([
|
|
41
|
+
const LeaderboardSortBy = z.enum([
|
|
42
|
+
"trades",
|
|
43
|
+
"totalNetPnl",
|
|
44
|
+
"volume",
|
|
45
|
+
"roi"
|
|
46
|
+
]);
|
|
34
47
|
const LEADERBOARD_MAX_LIMIT = 200;
|
|
35
48
|
const UnixSeconds = z.coerce.number().int().min(0).transform((seconds) => new Date(seconds * 1e3));
|
|
36
49
|
const ConnectorArray = z.preprocess((arg) => normalizeArray(arg), z.array(Connector));
|
|
@@ -18,6 +18,7 @@ export declare const LeaderboardResponse: z.ZodObject<{
|
|
|
18
18
|
pearFee: z.ZodString;
|
|
19
19
|
tradeFee: z.ZodString;
|
|
20
20
|
totalTrades: z.ZodNumber;
|
|
21
|
+
roi: z.ZodOptional<z.ZodString>;
|
|
21
22
|
xHandle: z.ZodOptional<z.ZodString>;
|
|
22
23
|
xName: z.ZodOptional<z.ZodString>;
|
|
23
24
|
xAvatarUrl: z.ZodOptional<z.ZodString>;
|
package/dist/sync/payloads.js
CHANGED
|
@@ -7,7 +7,9 @@ import { PositionClosedReason, PositionStatus, PositionOrigin } from '../positio
|
|
|
7
7
|
|
|
8
8
|
const ExchangeFillId = z.string().trim().min(1, "Exchange fill ID must be non-empty");
|
|
9
9
|
const MsTimestamp = z.number().int().positive().describe("Unix timestamp in milliseconds");
|
|
10
|
-
const LiquidationMark = z.object({
|
|
10
|
+
const LiquidationMark = z.object({
|
|
11
|
+
mark: UnsignedDecimalString
|
|
12
|
+
}).nullable();
|
|
11
13
|
const OriginalFillRef = z.object({
|
|
12
14
|
exchangeFillId: ExchangeFillId,
|
|
13
15
|
quantity: UnsignedDecimalString
|
|
@@ -52,11 +54,13 @@ const ReconcileReplacementExternalFill = z.object({
|
|
|
52
54
|
builderFee: UnsignedDecimalString,
|
|
53
55
|
liquidation: LiquidationMark
|
|
54
56
|
});
|
|
55
|
-
const ConfirmFillsRequest = z.record(z.uuid().describe("Position ID"), z.tuple([
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
57
|
+
const ConfirmFillsRequest = z.record(z.uuid().describe("Position ID"), z.tuple([
|
|
58
|
+
ConfirmableExternalFill
|
|
59
|
+
]).rest(ConfirmableExternalFill)).superRefine(RefineMinimumOneKeyValuePair);
|
|
60
|
+
const ReconcileFillsRequest = z.record(z.string().trim().min(1, "CLOID must be non-empty"), z.tuple([
|
|
61
|
+
ReconcileReplacementExternalFill,
|
|
62
|
+
ReconcileReplacementExternalFill
|
|
63
|
+
]).rest(ReconcileReplacementExternalFill)).superRefine(RefineMinimumOneKeyValuePair);
|
|
60
64
|
const SyncFillsSinceRequest = z.object({
|
|
61
65
|
overlapMs: z.number().int().positive()
|
|
62
66
|
});
|
|
@@ -105,17 +109,11 @@ const ApplicablePosition = z.object({
|
|
|
105
109
|
});
|
|
106
110
|
const WATERMARK_FUTURE_SKEW_MS = 3e5;
|
|
107
111
|
const SyncMeta = z.object({
|
|
108
|
-
externalMaxTs: z.number().int().nonnegative().refine(
|
|
109
|
-
(timestamp) => timestamp <= Date.now() + WATERMARK_FUTURE_SKEW_MS,
|
|
110
|
-
"externalMaxTs must not be ahead of server time"
|
|
111
|
-
).nullable().describe("watermark advance source")
|
|
112
|
+
externalMaxTs: z.number().int().nonnegative().refine((timestamp) => timestamp <= Date.now() + WATERMARK_FUTURE_SKEW_MS, "externalMaxTs must not be ahead of server time").nullable().describe("watermark advance source")
|
|
112
113
|
});
|
|
113
114
|
const CreateApplicablesMeta = SyncMeta.extend({
|
|
114
115
|
firstSyncStartedAt: z.number().int().nonnegative().optional().describe("backend-issued timestamp returned before the first fill-history fetch"),
|
|
115
|
-
newestFillTs: z.number().int().nonnegative().refine(
|
|
116
|
-
(timestamp) => timestamp <= Date.now() + WATERMARK_FUTURE_SKEW_MS,
|
|
117
|
-
"newestFillTs must not be ahead of server time"
|
|
118
|
-
).optional().describe("raw newest fetched fill \u2014 settle-gate source, never trim-advanced")
|
|
116
|
+
newestFillTs: z.number().int().nonnegative().refine((timestamp) => timestamp <= Date.now() + WATERMARK_FUTURE_SKEW_MS, "newestFillTs must not be ahead of server time").optional().describe("raw newest fetched fill \u2014 settle-gate source, never trim-advanced")
|
|
119
117
|
});
|
|
120
118
|
const CreateApplicablesRequest = z.object({
|
|
121
119
|
applicables: z.array(ApplicablePosition),
|
|
@@ -128,9 +126,7 @@ const FundingPaymentEntry = z.object({
|
|
|
128
126
|
instrumentId: InstrumentId,
|
|
129
127
|
fundingRate: OptionallySignedDecimalString.describe("applied funding rate, optionally signed"),
|
|
130
128
|
notional: OptionallySignedDecimalString.describe("funding amount in USD notional, optionally signed"),
|
|
131
|
-
fundingPerUnit: OptionallySignedDecimalString.describe(
|
|
132
|
-
"signed funding per 1 unit of size (notional / szi); attribution coefficient"
|
|
133
|
-
),
|
|
129
|
+
fundingPerUnit: OptionallySignedDecimalString.describe("signed funding per 1 unit of size (notional / szi); attribution coefficient"),
|
|
134
130
|
timestamp: MsTimestamp
|
|
135
131
|
});
|
|
136
132
|
const CreateFundingPaymentsRequest = z.object({
|
package/dist/tca/entities.js
CHANGED
package/dist/tca/responses.js
CHANGED
|
@@ -14,7 +14,10 @@ const TcaBenchmarkResponse = z.object({
|
|
|
14
14
|
legIndex: z.number(),
|
|
15
15
|
connector: Connector,
|
|
16
16
|
symbol: z.string(),
|
|
17
|
-
side: z.enum([
|
|
17
|
+
side: z.enum([
|
|
18
|
+
"BUY",
|
|
19
|
+
"SELL"
|
|
20
|
+
]),
|
|
18
21
|
decisionPrice: optionalNumeric,
|
|
19
22
|
arrivalMid: optionalNumeric,
|
|
20
23
|
arrivalBid: optionalNumeric,
|