@lifi/perps-sdk 0.0.0-preview-5cdfc44 → 0.0.0-preview-b49efcc
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 +22 -0
- package/dist/cjs/client/PerpsClient.d.ts +7 -3
- package/dist/cjs/client/PerpsClient.d.ts.map +1 -1
- package/dist/cjs/client/PerpsClient.js +43 -47
- package/dist/cjs/client/PerpsClient.js.map +1 -1
- package/dist/cjs/index.d.ts +2 -2
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +4 -3
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/registry/assetRegistry.d.ts +2 -1
- package/dist/cjs/registry/assetRegistry.d.ts.map +1 -1
- package/dist/cjs/registry/assetRegistry.js +11 -1
- package/dist/cjs/registry/assetRegistry.js.map +1 -1
- package/dist/cjs/types/api.d.ts +2 -2
- package/dist/cjs/types/api.d.ts.map +1 -1
- package/dist/cjs/types/provider.d.ts +8 -2
- package/dist/cjs/types/provider.d.ts.map +1 -1
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/client/PerpsClient.d.ts +54 -47
- package/dist/esm/client/PerpsClient.d.ts.map +1 -1
- package/dist/esm/client/PerpsClient.js +92 -102
- package/dist/esm/client/PerpsClient.js.map +1 -1
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/registry/assetRegistry.d.ts +7 -1
- package/dist/esm/registry/assetRegistry.d.ts.map +1 -1
- package/dist/esm/registry/assetRegistry.js +14 -0
- package/dist/esm/registry/assetRegistry.js.map +1 -1
- package/dist/esm/types/api.d.ts +11 -13
- package/dist/esm/types/api.d.ts.map +1 -1
- package/dist/esm/types/provider.d.ts +33 -6
- package/dist/esm/types/provider.d.ts.map +1 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/types/client/PerpsClient.d.ts +54 -47
- package/dist/types/client/PerpsClient.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/registry/assetRegistry.d.ts +7 -1
- package/dist/types/registry/assetRegistry.d.ts.map +1 -1
- package/dist/types/types/api.d.ts +11 -13
- package/dist/types/types/api.d.ts.map +1 -1
- package/dist/types/types/provider.d.ts +33 -6
- package/dist/types/types/provider.d.ts.map +1 -1
- package/dist/types/version.d.ts +1 -1
- package/package.json +2 -2
- package/src/client/PerpsClient.ts +130 -138
- package/src/index.ts +6 -1
- package/src/registry/assetRegistry.ts +16 -1
- package/src/types/api.ts +11 -13
- package/src/types/provider.ts +41 -6
- package/src/version.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/types/provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,cAAc,EACd,YAAY,EACZ,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,MAAM,EACN,SAAS,EACT,cAAc,EACd,KAAK,EACL,WAAW,EACX,cAAc,EACd,WAAW,EACX,WAAW,EACX,qBAAqB,EACrB,wBAAwB,EACxB,QAAQ,EACR,yBAAyB,EACzB,iBAAiB,EACjB,KAAK,EACL,SAAS,EACT,
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/types/provider.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/version.d.ts
CHANGED
package/dist/cjs/version.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AccountResponse, AccountSummary, ActionParamsMap, ActionStep, CreateActionResponse, ExecuteActionResponse, MarketRef, MarketSettings, MetaActionType, Order, OrdersResponse, PortfolioHistoryResponse, Position, PositionMarginConstraints } from '@lifi/perps-types';
|
|
1
|
+
import type { AccountResponse, AccountSummary, ActionParamsMap, ActionStep, AvailableToTrade, CreateActionResponse, ExecuteActionResponse, MarketRef, MarketSettings, MetaActionType, Order, OrdersResponse, PortfolioHistoryResponse, Position, PositionMarginConstraints } from '@lifi/perps-types';
|
|
2
2
|
import { ActionType } from '@lifi/perps-types';
|
|
3
3
|
import type { Address } from 'viem';
|
|
4
4
|
import { type GetOrderParams } from '../services/getOrder.js';
|
|
@@ -142,7 +142,7 @@ export declare class PerpsClient {
|
|
|
142
142
|
/**
|
|
143
143
|
* Fetch the user's account state from the backend and attach the
|
|
144
144
|
* SDK-projected `settings` array — one `AccountConfigSetting` per
|
|
145
|
-
* descriptor on `Provider.setup`. Callers read
|
|
145
|
+
* descriptor on `Provider.setup` + `Provider.options`. Callers read
|
|
146
146
|
* `result.settings` directly without re-deriving values from the typed
|
|
147
147
|
* `AccountConfig`.
|
|
148
148
|
*
|
|
@@ -168,6 +168,25 @@ export declare class PerpsClient {
|
|
|
168
168
|
address: Address;
|
|
169
169
|
market: MarketRef;
|
|
170
170
|
}): Promise<MarketSettings | undefined>;
|
|
171
|
+
/**
|
|
172
|
+
* The amounts `params.address` can still buy and sell on one market, in
|
|
173
|
+
* that market's margin asset. The order panel reads this per-market figure;
|
|
174
|
+
* account displays read the account-scoped
|
|
175
|
+
* {@link AccountSummary.availableMargin} instead.
|
|
176
|
+
*
|
|
177
|
+
* Providers that read a per-market figure answer it directly. For every
|
|
178
|
+
* other provider this falls back to the account summary, so both sides
|
|
179
|
+
* equal `availableMargin` and the asset is the market's quote asset.
|
|
180
|
+
*
|
|
181
|
+
* @throws {PerpsError} When the provider plugin is not registered, or the
|
|
182
|
+
* market is unknown to the provider's market registry.
|
|
183
|
+
* @public
|
|
184
|
+
*/
|
|
185
|
+
getAvailableToTrade(params: {
|
|
186
|
+
provider: string;
|
|
187
|
+
address: Address;
|
|
188
|
+
marketId: string;
|
|
189
|
+
}, options?: SDKRequestOptions): Promise<AvailableToTrade>;
|
|
171
190
|
/**
|
|
172
191
|
* Resolve the exact venue-owned margin requirements for `position`.
|
|
173
192
|
* Returns `undefined` when the position has no individual margin adjustment.
|
|
@@ -230,16 +249,15 @@ export declare class PerpsClient {
|
|
|
230
249
|
*/
|
|
231
250
|
getPortfolioHistory(params: GetPortfolioHistoryParams, options?: SDKRequestOptions): Promise<PortfolioHistoryResponse>;
|
|
232
251
|
/**
|
|
233
|
-
* Return the setup
|
|
234
|
-
* self-describing list. Trading is gated on `isReady === true`.
|
|
235
|
-
* `checklist` carries the renderable onboarding list: every
|
|
236
|
-
*
|
|
237
|
-
*
|
|
252
|
+
* Return the unsatisfied entries on `Provider.setup` for this account as a
|
|
253
|
+
* flat, self-describing list. Trading is gated on `isReady === true`.
|
|
254
|
+
* `checklist` carries the renderable onboarding list: every USER-signed
|
|
255
|
+
* descriptor with its satisfied state, with not-required conditional steps
|
|
256
|
+
* omitted.
|
|
238
257
|
*
|
|
239
|
-
* `
|
|
240
|
-
*
|
|
241
|
-
*
|
|
242
|
-
* applies the descriptor's declared default while it stays unsatisfied.
|
|
258
|
+
* `Provider.options` descriptors are NEVER returned here — options are
|
|
259
|
+
* post-setup tunables and never gate trading. Option state is surfaced
|
|
260
|
+
* separately via `getAccount().settings`.
|
|
243
261
|
*
|
|
244
262
|
* @public
|
|
245
263
|
*/
|
|
@@ -251,17 +269,17 @@ export declare class PerpsClient {
|
|
|
251
269
|
*/
|
|
252
270
|
private resolveSatisfiedSetup;
|
|
253
271
|
/**
|
|
254
|
-
* Drain the pending setup steps the
|
|
255
|
-
* `
|
|
256
|
-
*
|
|
257
|
-
*
|
|
258
|
-
*
|
|
259
|
-
*
|
|
260
|
-
*
|
|
261
|
-
*
|
|
262
|
-
*
|
|
272
|
+
* Drain the pending setup steps the provider declares as internal via
|
|
273
|
+
* `PerpsProviderPlugin.internalSetupActions`. Each step is built, signed,
|
|
274
|
+
* and executed in place with the provider's own credentials. A step is
|
|
275
|
+
* deferred while any staged user-facing step with a lower `sequence` is
|
|
276
|
+
* outstanding — it cannot succeed before its prerequisite (e.g. SET_REFERRAL
|
|
277
|
+
* authenticates with the credential REGISTER_API_KEY installs) and each
|
|
278
|
+
* doomed attempt is venue traffic. A drain failure is swallowed so it never
|
|
279
|
+
* blocks setup — the step stays unsatisfied and is retried on a later
|
|
280
|
+
* `checkSetup`.
|
|
263
281
|
*/
|
|
264
|
-
private
|
|
282
|
+
private drainInternalSetup;
|
|
265
283
|
/**
|
|
266
284
|
* Build unsigned setup steps for the supplied descriptor subset, preserving
|
|
267
285
|
* provider sequence order with SIWE descriptors prioritized.
|
|
@@ -269,9 +287,7 @@ export declare class PerpsClient {
|
|
|
269
287
|
private buildProviderSetupActions;
|
|
270
288
|
/**
|
|
271
289
|
* Build the unsigned setup `ActionStep`s still outstanding for an account,
|
|
272
|
-
* ordered by descriptor `sequence`.
|
|
273
|
-
* `automatic` step drains inside {@link checkSetup} and a `preference`
|
|
274
|
-
* carries the user's own selection. The backend filters already-satisfied
|
|
290
|
+
* ordered by descriptor `sequence`. The backend filters already-satisfied
|
|
275
291
|
* setup; each plugin contributes its own signer-bearing request fields and
|
|
276
292
|
* any local-state params (e.g. Lighter's known pubkey).
|
|
277
293
|
*
|
|
@@ -285,14 +301,6 @@ export declare class PerpsClient {
|
|
|
285
301
|
* Throws on any per-step venue rejection.
|
|
286
302
|
*/
|
|
287
303
|
private executeProviderSetup;
|
|
288
|
-
/**
|
|
289
|
-
* The lowest-`sequence` visible setup step that runs before `descriptor` and
|
|
290
|
-
* is not satisfied, or `undefined` when nothing blocks it. A `preference`
|
|
291
|
-
* reads its satisfied state from the plugin projection; an `approval` is
|
|
292
|
-
* satisfied once the provider stages no action for it, so only the earlier
|
|
293
|
-
* steps are staged here.
|
|
294
|
-
*/
|
|
295
|
-
private findBlockingSetupStep;
|
|
296
304
|
/**
|
|
297
305
|
* Sign and submit one pre-staged setup `ActionStep` end-to-end.
|
|
298
306
|
*
|
|
@@ -306,8 +314,7 @@ export declare class PerpsClient {
|
|
|
306
314
|
* retries with a fresh step.
|
|
307
315
|
*
|
|
308
316
|
* @throws {PerpsError} When the step's action is not in the provider's
|
|
309
|
-
* `setup` descriptors
|
|
310
|
-
* checklist is still unsatisfied.
|
|
317
|
+
* `setup` descriptors.
|
|
311
318
|
* @public
|
|
312
319
|
*/
|
|
313
320
|
executeProviderSetupAction(params: {
|
|
@@ -316,19 +323,19 @@ export declare class PerpsClient {
|
|
|
316
323
|
step: ActionStep;
|
|
317
324
|
}): Promise<void>;
|
|
318
325
|
/**
|
|
319
|
-
* Sign and submit a single
|
|
320
|
-
* as Lighter `ACCOUNT_TYPE` or Hyperliquid `ACCOUNT_MODE`)
|
|
321
|
-
* throwing on a venue rejection.
|
|
322
|
-
*
|
|
323
|
-
*
|
|
324
|
-
* trades, but unlike a trade
|
|
325
|
-
*
|
|
326
|
-
*
|
|
327
|
-
*
|
|
328
|
-
*
|
|
329
|
-
*
|
|
330
|
-
*
|
|
331
|
-
*
|
|
326
|
+
* Sign and submit a single provider-option change (a `Provider.options`
|
|
327
|
+
* tunable such as Lighter `ACCOUNT_TYPE` or Hyperliquid `ACCOUNT_MODE`)
|
|
328
|
+
* end-to-end, throwing on a venue rejection.
|
|
329
|
+
*
|
|
330
|
+
* Options are dispatched through the same {@link execute} pipeline as
|
|
331
|
+
* trades, but unlike a trade an option change is a single mandatory action:
|
|
332
|
+
* a per-action `success: false` (returned as a 200 OK) means the user's
|
|
333
|
+
* selection was rejected and must surface, not be silently dropped. This
|
|
334
|
+
* wrapper inspects the result and throws a {@link PerpsError} carrying the
|
|
335
|
+
* venue `error`, giving options the same throw contract that setup has via
|
|
336
|
+
* {@link executeProviderSetupAction}. The only structural difference is that
|
|
337
|
+
* an option carries `params` (the selected value) rather than a pre-staged
|
|
338
|
+
* step.
|
|
332
339
|
*
|
|
333
340
|
* `execute` itself is unchanged — it still returns results without throwing,
|
|
334
341
|
* which the trade hooks rely on for partial-fill handling.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PerpsClient.d.ts","sourceRoot":"","sources":["../../../src/client/PerpsClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,eAAe,EAEf,UAAU,EACV,oBAAoB,EACpB,qBAAqB,EACrB,SAAS,EACT,cAAc,EACd,cAAc,EACd,KAAK,EACL,cAAc,EACd,wBAAwB,EACxB,QAAQ,EACR,yBAAyB,
|
|
1
|
+
{"version":3,"file":"PerpsClient.d.ts","sourceRoot":"","sources":["../../../src/client/PerpsClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { ActionType, META_PROVIDER, PerpsErrorCode, SigningMethod, } from '@lifi/perps-types';
|
|
1
|
+
import { ActionType, META_PROVIDER, PerpsErrorCode, PerpsSigner, SigningMethod, } from '@lifi/perps-types';
|
|
2
2
|
import Big from 'big.js';
|
|
3
3
|
import { PerpsError } from '../errors/PerpsError.js';
|
|
4
|
-
import { getAssetRegistry } from '../registry/assetRegistry.js';
|
|
4
|
+
import { getAssetRegistry, toAssetDisplay } from '../registry/assetRegistry.js';
|
|
5
|
+
import { getMarketRegistry } from '../registry/marketRegistry.js';
|
|
5
6
|
import { createAction } from '../services/createAction.js';
|
|
6
7
|
import { executeAction } from '../services/executeAction.js';
|
|
7
8
|
import { getAccount as fetchAccount } from '../services/getAccount.js';
|
|
@@ -12,25 +13,16 @@ import { signTypedDataWithSigner } from '../utils/signTypedData.js';
|
|
|
12
13
|
import { eip712DomainChainId, switchSigningChain, userEip712TargetChainId, } from '../utils/switchChain.js';
|
|
13
14
|
import { createPerpsClient } from './createPerpsClient.js';
|
|
14
15
|
import { requireProvider as resolveProvider } from './requireProvider.js';
|
|
15
|
-
/** Absent `sequence` sorts last, so an unordered step gates nothing. */
|
|
16
|
-
function sequenceOf(descriptor) {
|
|
17
|
-
return descriptor.sequence ?? Number.MAX_SAFE_INTEGER;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Whether the SDK can apply a preference without user input. Every declared
|
|
21
|
-
* parameter must carry a `default`, since the action's params object is only
|
|
22
|
-
* complete when each one has a value.
|
|
23
|
-
*/
|
|
24
|
-
function declaresDefault(descriptor) {
|
|
25
|
-
const params = descriptor.params ?? [];
|
|
26
|
-
return (params.length > 0 && params.every((param) => param.default !== undefined));
|
|
27
|
-
}
|
|
28
16
|
/**
|
|
29
17
|
* Look up an action's descriptor in the provider's metadata. Throws if the
|
|
30
18
|
* action isn't declared — defensive: better to fail loudly than to mis-sign.
|
|
31
19
|
*/
|
|
32
20
|
function findActionDescriptor(metadata, action) {
|
|
33
|
-
const descriptor = [
|
|
21
|
+
const descriptor = [
|
|
22
|
+
...metadata.setup,
|
|
23
|
+
...metadata.options,
|
|
24
|
+
...metadata.actions,
|
|
25
|
+
].find((d) => d.type === action);
|
|
34
26
|
if (!descriptor) {
|
|
35
27
|
throw new PerpsError(PerpsErrorCode.SDKError, `Provider '${metadata.key}' does not declare action '${action}'.`);
|
|
36
28
|
}
|
|
@@ -291,7 +283,7 @@ export class PerpsClient {
|
|
|
291
283
|
/**
|
|
292
284
|
* Fetch the user's account state from the backend and attach the
|
|
293
285
|
* SDK-projected `settings` array — one `AccountConfigSetting` per
|
|
294
|
-
* descriptor on `Provider.setup`. Callers read
|
|
286
|
+
* descriptor on `Provider.setup` + `Provider.options`. Callers read
|
|
295
287
|
* `result.settings` directly without re-deriving values from the typed
|
|
296
288
|
* `AccountConfig`.
|
|
297
289
|
*
|
|
@@ -305,7 +297,7 @@ export class PerpsClient {
|
|
|
305
297
|
fetchAccount(this.sdkClient, params),
|
|
306
298
|
this.getProviderMetadata(params.provider),
|
|
307
299
|
]);
|
|
308
|
-
const settings = plugin.projectConfig(response.config, metadata.setup);
|
|
300
|
+
const settings = plugin.projectConfig(response.config, metadata.setup, metadata.options);
|
|
309
301
|
return { ...response, settings };
|
|
310
302
|
}
|
|
311
303
|
/**
|
|
@@ -324,6 +316,39 @@ export class PerpsClient {
|
|
|
324
316
|
market: params.market,
|
|
325
317
|
});
|
|
326
318
|
}
|
|
319
|
+
/**
|
|
320
|
+
* The amounts `params.address` can still buy and sell on one market, in
|
|
321
|
+
* that market's margin asset. The order panel reads this per-market figure;
|
|
322
|
+
* account displays read the account-scoped
|
|
323
|
+
* {@link AccountSummary.availableMargin} instead.
|
|
324
|
+
*
|
|
325
|
+
* Providers that read a per-market figure answer it directly. For every
|
|
326
|
+
* other provider this falls back to the account summary, so both sides
|
|
327
|
+
* equal `availableMargin` and the asset is the market's quote asset.
|
|
328
|
+
*
|
|
329
|
+
* @throws {PerpsError} When the provider plugin is not registered, or the
|
|
330
|
+
* market is unknown to the provider's market registry.
|
|
331
|
+
* @public
|
|
332
|
+
*/
|
|
333
|
+
async getAvailableToTrade(params, options) {
|
|
334
|
+
const plugin = this.requireProvider(params.provider);
|
|
335
|
+
const perMarket = await plugin.getAvailableToTrade?.({ address: params.address, marketId: params.marketId }, options);
|
|
336
|
+
if (perMarket !== undefined) {
|
|
337
|
+
return perMarket;
|
|
338
|
+
}
|
|
339
|
+
const registry = getMarketRegistry(this.sdkClient, params.provider);
|
|
340
|
+
await registry.sync();
|
|
341
|
+
const market = registry.require(params.marketId);
|
|
342
|
+
const account = await fetchAccount(this.sdkClient, { provider: params.provider, address: params.address }, options);
|
|
343
|
+
const { availableMargin } = plugin.getAccountSummary(account, account.positions);
|
|
344
|
+
return {
|
|
345
|
+
providerId: market.providerId,
|
|
346
|
+
marketId: market.id,
|
|
347
|
+
asset: toAssetDisplay(market.quoteAsset),
|
|
348
|
+
buy: availableMargin,
|
|
349
|
+
sell: availableMargin,
|
|
350
|
+
};
|
|
351
|
+
}
|
|
327
352
|
/**
|
|
328
353
|
* Resolve the exact venue-owned margin requirements for `position`.
|
|
329
354
|
* Returns `undefined` when the position has no individual margin adjustment.
|
|
@@ -431,16 +456,15 @@ export class PerpsClient {
|
|
|
431
456
|
return plugin.getPortfolioHistory({ address: params.address, range: params.range }, options);
|
|
432
457
|
}
|
|
433
458
|
/**
|
|
434
|
-
* Return the setup
|
|
435
|
-
* self-describing list. Trading is gated on `isReady === true`.
|
|
436
|
-
* `checklist` carries the renderable onboarding list: every
|
|
437
|
-
*
|
|
438
|
-
*
|
|
459
|
+
* Return the unsatisfied entries on `Provider.setup` for this account as a
|
|
460
|
+
* flat, self-describing list. Trading is gated on `isReady === true`.
|
|
461
|
+
* `checklist` carries the renderable onboarding list: every USER-signed
|
|
462
|
+
* descriptor with its satisfied state, with not-required conditional steps
|
|
463
|
+
* omitted.
|
|
439
464
|
*
|
|
440
|
-
* `
|
|
441
|
-
*
|
|
442
|
-
*
|
|
443
|
-
* applies the descriptor's declared default while it stays unsatisfied.
|
|
465
|
+
* `Provider.options` descriptors are NEVER returned here — options are
|
|
466
|
+
* post-setup tunables and never gate trading. Option state is surfaced
|
|
467
|
+
* separately via `getAccount().settings`.
|
|
444
468
|
*
|
|
445
469
|
* @public
|
|
446
470
|
*/
|
|
@@ -464,32 +488,30 @@ export class PerpsClient {
|
|
|
464
488
|
const satisfiedSetup = await this.resolveSatisfiedSetup(provider, address);
|
|
465
489
|
const pendingSetup = metadata.setup.filter((descriptor) => !satisfiedSetup.has(descriptor.type));
|
|
466
490
|
const plugin = this.sdkClient.getProvider(provider);
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
const
|
|
491
|
+
const internalTypes = new Set(plugin?.internalSetupActions ?? []);
|
|
492
|
+
const isInternal = (descriptor) => internalTypes.has(descriptor.type) &&
|
|
493
|
+
!descriptor.signers.includes(PerpsSigner.USER);
|
|
494
|
+
const visibleSetup = pendingSetup.filter((descriptor) => !isInternal(descriptor));
|
|
471
495
|
// The backend filters already-satisfied setup actions and returns typed
|
|
472
496
|
// data for those still outstanding; each plugin contributes its own
|
|
473
497
|
// signer-bearing request fields.
|
|
474
|
-
const actions = await this.buildProviderSetupActions(provider, address,
|
|
498
|
+
const actions = await this.buildProviderSetupActions(provider, address, visibleSetup);
|
|
475
499
|
// A staged step is one the build produced actions for — a pending
|
|
476
500
|
// descriptor the backend staged nothing for is either satisfied
|
|
477
501
|
// (backend-gated) or not applicable to this account.
|
|
478
502
|
const stagedTypes = new Set(actions.map((step) => step.action));
|
|
479
503
|
const conditionalTypes = new Set(plugin?.conditionalSetupActions ?? []);
|
|
504
|
+
const sequenceOf = (descriptor) => descriptor.sequence ?? Number.MAX_SAFE_INTEGER;
|
|
480
505
|
const checklist = metadata.setup
|
|
481
|
-
.filter((descriptor) => descriptor.
|
|
506
|
+
.filter((descriptor) => descriptor.signers.includes(PerpsSigner.USER))
|
|
482
507
|
.filter((descriptor) => !conditionalTypes.has(descriptor.type) ||
|
|
483
508
|
stagedTypes.has(descriptor.type))
|
|
484
509
|
.sort((a, b) => sequenceOf(a) - sequenceOf(b))
|
|
485
510
|
.map((descriptor) => ({
|
|
486
511
|
descriptor,
|
|
487
|
-
satisfied: descriptor.
|
|
488
|
-
? satisfiedSetup.has(descriptor.type)
|
|
489
|
-
: !stagedTypes.has(descriptor.type),
|
|
512
|
+
satisfied: !stagedTypes.has(descriptor.type),
|
|
490
513
|
}));
|
|
491
|
-
await this.
|
|
492
|
-
(descriptor.kind === 'preference' && declaresDefault(descriptor))), stageable.filter((descriptor) => stagedTypes.has(descriptor.type)));
|
|
514
|
+
await this.drainInternalSetup(provider, address, pendingSetup.filter(isInternal), visibleSetup.filter((descriptor) => stagedTypes.has(descriptor.type)));
|
|
493
515
|
return {
|
|
494
516
|
accountExists: true,
|
|
495
517
|
setup: actions,
|
|
@@ -509,26 +531,28 @@ export class PerpsClient {
|
|
|
509
531
|
return new Set();
|
|
510
532
|
}
|
|
511
533
|
const account = await plugin.getAccount({ address });
|
|
512
|
-
const settings = plugin.projectConfig(account.config, metadata.setup);
|
|
534
|
+
const settings = plugin.projectConfig(account.config, metadata.setup, metadata.options);
|
|
535
|
+
const setupTypes = new Set(metadata.setup.map((descriptor) => descriptor.type));
|
|
513
536
|
return new Set(settings
|
|
514
|
-
.filter((setting) => setting.satisfied)
|
|
537
|
+
.filter((setting) => setting.satisfied && setupTypes.has(setting.type))
|
|
515
538
|
.map((setting) => setting.type));
|
|
516
539
|
}
|
|
517
540
|
/**
|
|
518
|
-
* Drain the pending setup steps the
|
|
519
|
-
* `
|
|
520
|
-
*
|
|
521
|
-
*
|
|
522
|
-
*
|
|
523
|
-
*
|
|
524
|
-
*
|
|
525
|
-
*
|
|
526
|
-
*
|
|
541
|
+
* Drain the pending setup steps the provider declares as internal via
|
|
542
|
+
* `PerpsProviderPlugin.internalSetupActions`. Each step is built, signed,
|
|
543
|
+
* and executed in place with the provider's own credentials. A step is
|
|
544
|
+
* deferred while any staged user-facing step with a lower `sequence` is
|
|
545
|
+
* outstanding — it cannot succeed before its prerequisite (e.g. SET_REFERRAL
|
|
546
|
+
* authenticates with the credential REGISTER_API_KEY installs) and each
|
|
547
|
+
* doomed attempt is venue traffic. A drain failure is swallowed so it never
|
|
548
|
+
* blocks setup — the step stays unsatisfied and is retried on a later
|
|
549
|
+
* `checkSetup`.
|
|
527
550
|
*/
|
|
528
|
-
async
|
|
529
|
-
|
|
551
|
+
async drainInternalSetup(provider, address, internalPending, stagedVisible) {
|
|
552
|
+
const sequenceOf = (descriptor) => descriptor.sequence ?? Number.MAX_SAFE_INTEGER;
|
|
553
|
+
for (const descriptor of internalPending) {
|
|
530
554
|
// A tie (equal sequences, or both absent) declares no order, so the
|
|
531
|
-
//
|
|
555
|
+
// internal step defers to the next checkSetup rather than racing.
|
|
532
556
|
const blocked = stagedVisible.some((staged) => sequenceOf(staged) <= sequenceOf(descriptor));
|
|
533
557
|
if (blocked) {
|
|
534
558
|
continue;
|
|
@@ -550,7 +574,7 @@ export class PerpsClient {
|
|
|
550
574
|
}
|
|
551
575
|
}
|
|
552
576
|
catch (error) {
|
|
553
|
-
console.debug(`[perps-sdk] setup step '${descriptor.type}' for '${provider}' did not
|
|
577
|
+
console.debug(`[perps-sdk] internal setup step '${descriptor.type}' for '${provider}' did not complete; will retry on the next checkSetup.`, error);
|
|
554
578
|
}
|
|
555
579
|
}
|
|
556
580
|
}
|
|
@@ -587,9 +611,7 @@ export class PerpsClient {
|
|
|
587
611
|
}
|
|
588
612
|
/**
|
|
589
613
|
* Build the unsigned setup `ActionStep`s still outstanding for an account,
|
|
590
|
-
* ordered by descriptor `sequence`.
|
|
591
|
-
* `automatic` step drains inside {@link checkSetup} and a `preference`
|
|
592
|
-
* carries the user's own selection. The backend filters already-satisfied
|
|
614
|
+
* ordered by descriptor `sequence`. The backend filters already-satisfied
|
|
593
615
|
* setup; each plugin contributes its own signer-bearing request fields and
|
|
594
616
|
* any local-state params (e.g. Lighter's known pubkey).
|
|
595
617
|
*
|
|
@@ -598,7 +620,7 @@ export class PerpsClient {
|
|
|
598
620
|
async buildProviderSetup(params) {
|
|
599
621
|
const { provider, address } = params;
|
|
600
622
|
const metadata = await this.getProviderMetadata(provider);
|
|
601
|
-
const actions = await this.buildProviderSetupActions(provider, address, metadata.setup
|
|
623
|
+
const actions = await this.buildProviderSetupActions(provider, address, metadata.setup);
|
|
602
624
|
return { actions };
|
|
603
625
|
}
|
|
604
626
|
/**
|
|
@@ -633,33 +655,6 @@ export class PerpsClient {
|
|
|
633
655
|
}
|
|
634
656
|
return { results: { results } };
|
|
635
657
|
}
|
|
636
|
-
/**
|
|
637
|
-
* The lowest-`sequence` visible setup step that runs before `descriptor` and
|
|
638
|
-
* is not satisfied, or `undefined` when nothing blocks it. A `preference`
|
|
639
|
-
* reads its satisfied state from the plugin projection; an `approval` is
|
|
640
|
-
* satisfied once the provider stages no action for it, so only the earlier
|
|
641
|
-
* steps are staged here.
|
|
642
|
-
*/
|
|
643
|
-
async findBlockingSetupStep(provider, address, descriptor) {
|
|
644
|
-
const metadata = await this.getProviderMetadata(provider);
|
|
645
|
-
const earlier = metadata.setup
|
|
646
|
-
.filter((d) => d.kind !== 'automatic' && sequenceOf(d) < sequenceOf(descriptor))
|
|
647
|
-
.sort((a, b) => sequenceOf(a) - sequenceOf(b));
|
|
648
|
-
if (earlier.length === 0) {
|
|
649
|
-
return undefined;
|
|
650
|
-
}
|
|
651
|
-
const satisfiedSetup = await this.resolveSatisfiedSetup(provider, address);
|
|
652
|
-
const pending = earlier.filter((d) => !satisfiedSetup.has(d.type));
|
|
653
|
-
if (pending.length === 0) {
|
|
654
|
-
return undefined;
|
|
655
|
-
}
|
|
656
|
-
const stageable = pending.filter((d) => d.kind === 'approval');
|
|
657
|
-
const staged = stageable.length === 0
|
|
658
|
-
? []
|
|
659
|
-
: await this.buildProviderSetupActions(provider, address, stageable);
|
|
660
|
-
const stagedTypes = new Set(staged.map((action) => action.action));
|
|
661
|
-
return pending.find((d) => d.kind === 'preference' || stagedTypes.has(d.type));
|
|
662
|
-
}
|
|
663
658
|
/**
|
|
664
659
|
* Sign and submit one pre-staged setup `ActionStep` end-to-end.
|
|
665
660
|
*
|
|
@@ -673,8 +668,7 @@ export class PerpsClient {
|
|
|
673
668
|
* retries with a fresh step.
|
|
674
669
|
*
|
|
675
670
|
* @throws {PerpsError} When the step's action is not in the provider's
|
|
676
|
-
* `setup` descriptors
|
|
677
|
-
* checklist is still unsatisfied.
|
|
671
|
+
* `setup` descriptors.
|
|
678
672
|
* @public
|
|
679
673
|
*/
|
|
680
674
|
async executeProviderSetupAction(params) {
|
|
@@ -684,10 +678,6 @@ export class PerpsClient {
|
|
|
684
678
|
if (!descriptor) {
|
|
685
679
|
throw new PerpsError(PerpsErrorCode.SDKError, `Action '${step.action}' is not in '${provider}'.setup`);
|
|
686
680
|
}
|
|
687
|
-
const blocking = await this.findBlockingSetupStep(provider, address, descriptor);
|
|
688
|
-
if (blocking) {
|
|
689
|
-
throw new PerpsError(PerpsErrorCode.SDKError, `Setup step '${step.action}' for '${provider}' is blocked: '${blocking.type}' runs first and is not satisfied.`);
|
|
690
|
-
}
|
|
691
681
|
const signed = await this.signProviderSetupAction(provider, address, step);
|
|
692
682
|
// A client-executed setup action (Lighter SET_REFERRAL) produces no
|
|
693
683
|
// backend-bound step — it already ran during signing, so there is nothing
|
|
@@ -703,19 +693,19 @@ export class PerpsClient {
|
|
|
703
693
|
});
|
|
704
694
|
}
|
|
705
695
|
/**
|
|
706
|
-
* Sign and submit a single
|
|
707
|
-
* as Lighter `ACCOUNT_TYPE` or Hyperliquid `ACCOUNT_MODE`)
|
|
708
|
-
* throwing on a venue rejection.
|
|
696
|
+
* Sign and submit a single provider-option change (a `Provider.options`
|
|
697
|
+
* tunable such as Lighter `ACCOUNT_TYPE` or Hyperliquid `ACCOUNT_MODE`)
|
|
698
|
+
* end-to-end, throwing on a venue rejection.
|
|
709
699
|
*
|
|
710
|
-
*
|
|
711
|
-
* trades, but unlike a trade
|
|
712
|
-
*
|
|
713
|
-
*
|
|
714
|
-
*
|
|
715
|
-
*
|
|
716
|
-
*
|
|
717
|
-
*
|
|
718
|
-
*
|
|
700
|
+
* Options are dispatched through the same {@link execute} pipeline as
|
|
701
|
+
* trades, but unlike a trade an option change is a single mandatory action:
|
|
702
|
+
* a per-action `success: false` (returned as a 200 OK) means the user's
|
|
703
|
+
* selection was rejected and must surface, not be silently dropped. This
|
|
704
|
+
* wrapper inspects the result and throws a {@link PerpsError} carrying the
|
|
705
|
+
* venue `error`, giving options the same throw contract that setup has via
|
|
706
|
+
* {@link executeProviderSetupAction}. The only structural difference is that
|
|
707
|
+
* an option carries `params` (the selected value) rather than a pre-staged
|
|
708
|
+
* step.
|
|
719
709
|
*
|
|
720
710
|
* `execute` itself is unchanged — it still returns results without throwing,
|
|
721
711
|
* which the trade hooks rely on for partial-fill handling.
|