@lifi/perps-sdk 0.0.0-preview-142c251 → 0.0.0-preview-1edeff0
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 +42 -2
- package/dist/cjs/client/PerpsClient.d.ts +10 -5
- package/dist/cjs/client/PerpsClient.d.ts.map +1 -1
- package/dist/cjs/client/PerpsClient.js +89 -55
- package/dist/cjs/client/PerpsClient.js.map +1 -1
- package/dist/cjs/index.d.ts +13 -8
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +20 -5
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/registry/marketRegistry.d.ts +3 -0
- package/dist/cjs/registry/marketRegistry.d.ts.map +1 -1
- package/dist/cjs/registry/marketRegistry.js +16 -1
- package/dist/cjs/registry/marketRegistry.js.map +1 -1
- package/dist/cjs/registry/referenceDataRegistry.d.ts.map +1 -1
- package/dist/cjs/registry/referenceDataRegistry.js +0 -1
- package/dist/cjs/registry/referenceDataRegistry.js.map +1 -1
- package/dist/cjs/services/getGasRecommendation.d.ts +9 -0
- package/dist/cjs/services/getGasRecommendation.d.ts.map +1 -0
- package/dist/cjs/services/getGasRecommendation.js +10 -0
- package/dist/cjs/services/getGasRecommendation.js.map +1 -0
- package/dist/cjs/services/getMarket.d.ts.map +1 -1
- package/dist/cjs/services/getMarket.js +2 -1
- package/dist/cjs/services/getMarket.js.map +1 -1
- package/dist/cjs/services/getMarkets.d.ts.map +1 -1
- package/dist/cjs/services/getMarkets.js +3 -1
- package/dist/cjs/services/getMarkets.js.map +1 -1
- package/dist/cjs/types/api.d.ts +4 -0
- package/dist/cjs/types/api.d.ts.map +1 -1
- package/dist/cjs/types/config.d.ts.map +1 -1
- package/dist/cjs/types/deposit.d.ts +25 -0
- package/dist/cjs/types/deposit.d.ts.map +1 -0
- package/dist/cjs/types/deposit.js +3 -0
- package/dist/cjs/types/deposit.js.map +1 -0
- package/dist/cjs/types/provider.d.ts +16 -5
- package/dist/cjs/types/provider.d.ts.map +1 -1
- package/dist/cjs/utils/accountSummary.d.ts.map +1 -1
- package/dist/cjs/utils/accountSummary.js +10 -4
- package/dist/cjs/utils/accountSummary.js.map +1 -1
- package/dist/cjs/utils/depositAssets.d.ts +8 -0
- package/dist/cjs/utils/depositAssets.d.ts.map +1 -0
- package/dist/cjs/utils/depositAssets.js +36 -0
- package/dist/cjs/utils/depositAssets.js.map +1 -0
- package/dist/cjs/utils/explorer.d.ts +1 -0
- package/dist/cjs/utils/explorer.d.ts.map +1 -1
- package/dist/cjs/utils/explorer.js +7 -3
- package/dist/cjs/utils/explorer.js.map +1 -1
- package/dist/cjs/utils/format.d.ts +3 -0
- package/dist/cjs/utils/format.d.ts.map +1 -1
- package/dist/cjs/utils/format.js +31 -24
- package/dist/cjs/utils/format.js.map +1 -1
- package/dist/cjs/utils/scaleToInteger.d.ts +3 -0
- package/dist/cjs/utils/scaleToInteger.d.ts.map +1 -0
- package/dist/cjs/utils/scaleToInteger.js +30 -0
- package/dist/cjs/utils/scaleToInteger.js.map +1 -0
- package/dist/cjs/utils/setupActions.d.ts +3 -0
- package/dist/cjs/utils/setupActions.d.ts.map +1 -0
- package/dist/cjs/utils/setupActions.js +8 -0
- package/dist/cjs/utils/setupActions.js.map +1 -0
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/client/PerpsClient.d.ts +41 -14
- package/dist/esm/client/PerpsClient.d.ts.map +1 -1
- package/dist/esm/client/PerpsClient.js +128 -73
- package/dist/esm/client/PerpsClient.js.map +1 -1
- package/dist/esm/index.d.ts +14 -9
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +8 -5
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/registry/marketRegistry.d.ts +15 -2
- package/dist/esm/registry/marketRegistry.d.ts.map +1 -1
- package/dist/esm/registry/marketRegistry.js +26 -2
- package/dist/esm/registry/marketRegistry.js.map +1 -1
- package/dist/esm/registry/referenceDataRegistry.d.ts +2 -1
- package/dist/esm/registry/referenceDataRegistry.d.ts.map +1 -1
- package/dist/esm/registry/referenceDataRegistry.js +2 -2
- package/dist/esm/registry/referenceDataRegistry.js.map +1 -1
- package/dist/esm/services/getGasRecommendation.d.ts +31 -0
- package/dist/esm/services/getGasRecommendation.d.ts.map +1 -0
- package/dist/esm/services/getGasRecommendation.js +22 -0
- package/dist/esm/services/getGasRecommendation.js.map +1 -0
- package/dist/esm/services/getMarket.d.ts +5 -4
- package/dist/esm/services/getMarket.d.ts.map +1 -1
- package/dist/esm/services/getMarket.js +7 -5
- package/dist/esm/services/getMarket.js.map +1 -1
- package/dist/esm/services/getMarkets.d.ts +6 -3
- package/dist/esm/services/getMarkets.d.ts.map +1 -1
- package/dist/esm/services/getMarkets.js +9 -4
- package/dist/esm/services/getMarkets.js.map +1 -1
- package/dist/esm/types/api.d.ts +9 -0
- package/dist/esm/types/api.d.ts.map +1 -1
- package/dist/esm/types/config.d.ts +4 -1
- package/dist/esm/types/config.d.ts.map +1 -1
- package/dist/esm/types/deposit.d.ts +68 -0
- package/dist/esm/types/deposit.d.ts.map +1 -0
- package/dist/esm/types/deposit.js +2 -0
- package/dist/esm/types/deposit.js.map +1 -0
- package/dist/esm/types/provider.d.ts +53 -17
- package/dist/esm/types/provider.d.ts.map +1 -1
- package/dist/esm/utils/accountSummary.d.ts.map +1 -1
- package/dist/esm/utils/accountSummary.js +13 -4
- package/dist/esm/utils/accountSummary.js.map +1 -1
- package/dist/esm/utils/depositAssets.d.ts +46 -0
- package/dist/esm/utils/depositAssets.d.ts.map +1 -0
- package/dist/esm/utils/depositAssets.js +71 -0
- package/dist/esm/utils/depositAssets.js.map +1 -0
- package/dist/esm/utils/explorer.d.ts +10 -0
- package/dist/esm/utils/explorer.d.ts.map +1 -1
- package/dist/esm/utils/explorer.js +16 -4
- package/dist/esm/utils/explorer.js.map +1 -1
- package/dist/esm/utils/format.d.ts +22 -0
- package/dist/esm/utils/format.d.ts.map +1 -1
- package/dist/esm/utils/format.js +57 -27
- package/dist/esm/utils/format.js.map +1 -1
- package/dist/esm/utils/scaleToInteger.d.ts +22 -0
- package/dist/esm/utils/scaleToInteger.d.ts.map +1 -0
- package/dist/esm/utils/scaleToInteger.js +34 -0
- package/dist/esm/utils/scaleToInteger.js.map +1 -0
- package/dist/esm/utils/setupActions.d.ts +17 -0
- package/dist/esm/utils/setupActions.d.ts.map +1 -0
- package/dist/esm/utils/setupActions.js +19 -0
- package/dist/esm/utils/setupActions.js.map +1 -0
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/types/client/PerpsClient.d.ts +41 -14
- package/dist/types/client/PerpsClient.d.ts.map +1 -1
- package/dist/types/index.d.ts +14 -9
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/registry/marketRegistry.d.ts +15 -2
- package/dist/types/registry/marketRegistry.d.ts.map +1 -1
- package/dist/types/registry/referenceDataRegistry.d.ts +2 -1
- package/dist/types/registry/referenceDataRegistry.d.ts.map +1 -1
- package/dist/types/services/getGasRecommendation.d.ts +31 -0
- package/dist/types/services/getGasRecommendation.d.ts.map +1 -0
- package/dist/types/services/getMarket.d.ts +5 -4
- package/dist/types/services/getMarket.d.ts.map +1 -1
- package/dist/types/services/getMarkets.d.ts +6 -3
- package/dist/types/services/getMarkets.d.ts.map +1 -1
- package/dist/types/types/api.d.ts +9 -0
- package/dist/types/types/api.d.ts.map +1 -1
- package/dist/types/types/config.d.ts +4 -1
- package/dist/types/types/config.d.ts.map +1 -1
- package/dist/types/types/deposit.d.ts +68 -0
- package/dist/types/types/deposit.d.ts.map +1 -0
- package/dist/types/types/provider.d.ts +53 -17
- package/dist/types/types/provider.d.ts.map +1 -1
- package/dist/types/utils/accountSummary.d.ts.map +1 -1
- package/dist/types/utils/depositAssets.d.ts +46 -0
- package/dist/types/utils/depositAssets.d.ts.map +1 -0
- package/dist/types/utils/explorer.d.ts +10 -0
- package/dist/types/utils/explorer.d.ts.map +1 -1
- package/dist/types/utils/format.d.ts +22 -0
- package/dist/types/utils/format.d.ts.map +1 -1
- package/dist/types/utils/scaleToInteger.d.ts +22 -0
- package/dist/types/utils/scaleToInteger.d.ts.map +1 -0
- package/dist/types/utils/setupActions.d.ts +17 -0
- package/dist/types/utils/setupActions.d.ts.map +1 -0
- package/dist/types/version.d.ts +1 -1
- package/package.json +4 -3
- package/src/client/PerpsClient.ts +206 -106
- package/src/index.ts +34 -8
- package/src/registry/marketRegistry.ts +33 -2
- package/src/registry/referenceDataRegistry.ts +2 -2
- package/src/services/getGasRecommendation.ts +45 -0
- package/src/services/getMarket.ts +7 -5
- package/src/services/getMarkets.ts +14 -4
- package/src/types/api.ts +10 -0
- package/src/types/config.ts +4 -1
- package/src/types/deposit.ts +75 -0
- package/src/types/provider.ts +56 -25
- package/src/utils/accountSummary.ts +18 -5
- package/src/utils/depositAssets.ts +77 -0
- package/src/utils/explorer.ts +20 -4
- package/src/utils/format.ts +108 -28
- package/src/utils/scaleToInteger.ts +56 -0
- package/src/utils/setupActions.ts +24 -0
- package/src/version.ts +1 -1
- package/dist/cjs/client/clientLog.d.ts +0 -4
- package/dist/cjs/client/clientLog.d.ts.map +0 -1
- package/dist/cjs/client/clientLog.js +0 -9
- package/dist/cjs/client/clientLog.js.map +0 -1
- package/dist/cjs/utils/depositChain.d.ts +0 -6
- package/dist/cjs/utils/depositChain.d.ts.map +0 -1
- package/dist/cjs/utils/depositChain.js +0 -13
- package/dist/cjs/utils/depositChain.js.map +0 -1
- package/dist/esm/client/clientLog.d.ts +0 -16
- package/dist/esm/client/clientLog.d.ts.map +0 -1
- package/dist/esm/client/clientLog.js +0 -18
- package/dist/esm/client/clientLog.js.map +0 -1
- package/dist/esm/utils/depositChain.d.ts +0 -27
- package/dist/esm/utils/depositChain.d.ts.map +0 -1
- package/dist/esm/utils/depositChain.js +0 -23
- package/dist/esm/utils/depositChain.js.map +0 -1
- package/dist/types/client/clientLog.d.ts +0 -16
- package/dist/types/client/clientLog.d.ts.map +0 -1
- package/dist/types/utils/depositChain.d.ts +0 -27
- package/dist/types/utils/depositChain.d.ts.map +0 -1
- package/src/client/clientLog.ts +0 -20
- package/src/utils/depositChain.ts +0 -38
package/dist/cjs/utils/format.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatNumber = formatNumber;
|
|
3
4
|
exports.formatUsd = formatUsd;
|
|
4
5
|
exports.formatSignedUsd = formatSignedUsd;
|
|
5
6
|
exports.formatSignedPercent = formatSignedPercent;
|
|
6
7
|
exports.formatPrice = formatPrice;
|
|
7
8
|
exports.formatCompactUsd = formatCompactUsd;
|
|
8
9
|
const DEFAULT_PLACEHOLDER = '—';
|
|
10
|
+
const FLOAT_GUARD_DIGITS = 9;
|
|
9
11
|
function toFiniteNumber(value) {
|
|
10
12
|
let n;
|
|
11
13
|
if (typeof value === 'string') {
|
|
@@ -23,10 +25,18 @@ function toFiniteNumber(value) {
|
|
|
23
25
|
}
|
|
24
26
|
return Number.isFinite(n) ? n : null;
|
|
25
27
|
}
|
|
26
|
-
function
|
|
27
|
-
const
|
|
28
|
-
const
|
|
29
|
-
const
|
|
28
|
+
function truncateAbs(abs, decimals) {
|
|
29
|
+
const s = abs.toFixed(Math.min(decimals + FLOAT_GUARD_DIGITS, 100));
|
|
30
|
+
const dot = s.indexOf('.');
|
|
31
|
+
const cut = decimals === 0 ? dot : dot + 1 + decimals;
|
|
32
|
+
return Number(s.slice(0, cut));
|
|
33
|
+
}
|
|
34
|
+
function signAndBody(n, decimals, locale, grouping, rounding, signed) {
|
|
35
|
+
const reduced = rounding === 'floor'
|
|
36
|
+
? (n < 0 ? -1 : 1) * truncateAbs(Math.abs(n), decimals)
|
|
37
|
+
: Number(n.toFixed(decimals));
|
|
38
|
+
const sign = reduced < 0 ? '-' : signed && reduced > 0 ? '+' : '';
|
|
39
|
+
const body = Math.abs(reduced).toLocaleString(locale, {
|
|
30
40
|
minimumFractionDigits: decimals,
|
|
31
41
|
maximumFractionDigits: decimals,
|
|
32
42
|
useGrouping: grouping,
|
|
@@ -45,54 +55,51 @@ function autoDecimals(abs) {
|
|
|
45
55
|
}
|
|
46
56
|
return 6;
|
|
47
57
|
}
|
|
58
|
+
function formatNumber(value, options = {}) {
|
|
59
|
+
const { decimals = 2, placeholder = DEFAULT_PLACEHOLDER, locale, rounding = 'halfUp', } = options;
|
|
60
|
+
const n = toFiniteNumber(value);
|
|
61
|
+
if (n === null) {
|
|
62
|
+
return placeholder;
|
|
63
|
+
}
|
|
64
|
+
const { sign, body } = signAndBody(n, decimals, locale, true, rounding, false);
|
|
65
|
+
return `${sign}${body}`;
|
|
66
|
+
}
|
|
48
67
|
function formatUsd(value, options = {}) {
|
|
49
|
-
const { decimals = 2, placeholder = DEFAULT_PLACEHOLDER, locale } = options;
|
|
68
|
+
const { decimals = 2, placeholder = DEFAULT_PLACEHOLDER, locale, rounding = 'halfUp', } = options;
|
|
50
69
|
const n = toFiniteNumber(value);
|
|
51
70
|
if (n === null) {
|
|
52
71
|
return placeholder;
|
|
53
72
|
}
|
|
54
|
-
const { sign, body } = signAndBody(n, decimals, locale, true);
|
|
73
|
+
const { sign, body } = signAndBody(n, decimals, locale, true, rounding, false);
|
|
55
74
|
return `${sign}$${body}`;
|
|
56
75
|
}
|
|
57
76
|
function formatSignedUsd(value, options = {}) {
|
|
58
|
-
const { decimals = 2, placeholder = DEFAULT_PLACEHOLDER, locale } = options;
|
|
77
|
+
const { decimals = 2, placeholder = DEFAULT_PLACEHOLDER, locale, rounding = 'halfUp', } = options;
|
|
59
78
|
const n = toFiniteNumber(value);
|
|
60
79
|
if (n === null) {
|
|
61
80
|
return placeholder;
|
|
62
81
|
}
|
|
63
|
-
const
|
|
64
|
-
const sign = rounded > 0 ? '+' : rounded < 0 ? '-' : '';
|
|
65
|
-
const body = Math.abs(rounded).toLocaleString(locale, {
|
|
66
|
-
minimumFractionDigits: decimals,
|
|
67
|
-
maximumFractionDigits: decimals,
|
|
68
|
-
useGrouping: true,
|
|
69
|
-
});
|
|
82
|
+
const { sign, body } = signAndBody(n, decimals, locale, true, rounding, true);
|
|
70
83
|
return `${sign}$${body}`;
|
|
71
84
|
}
|
|
72
85
|
function formatSignedPercent(value, options = {}) {
|
|
73
|
-
const { decimals = 2, placeholder = DEFAULT_PLACEHOLDER, locale } = options;
|
|
86
|
+
const { decimals = 2, placeholder = DEFAULT_PLACEHOLDER, locale, rounding = 'halfUp', } = options;
|
|
74
87
|
const n = toFiniteNumber(value);
|
|
75
88
|
if (n === null) {
|
|
76
89
|
return placeholder;
|
|
77
90
|
}
|
|
78
|
-
const
|
|
79
|
-
const sign = rounded > 0 ? '+' : rounded < 0 ? '-' : '';
|
|
80
|
-
const body = Math.abs(rounded).toLocaleString(locale, {
|
|
81
|
-
minimumFractionDigits: decimals,
|
|
82
|
-
maximumFractionDigits: decimals,
|
|
83
|
-
useGrouping: false,
|
|
84
|
-
});
|
|
91
|
+
const { sign, body } = signAndBody(n, decimals, locale, false, rounding, true);
|
|
85
92
|
return `${sign}${body}%`;
|
|
86
93
|
}
|
|
87
94
|
function formatPrice(value, options = {}) {
|
|
88
|
-
const { placeholder = DEFAULT_PLACEHOLDER, locale } = options;
|
|
95
|
+
const { placeholder = DEFAULT_PLACEHOLDER, locale, rounding = 'halfUp', } = options;
|
|
89
96
|
const n = toFiniteNumber(value);
|
|
90
97
|
if (n === null) {
|
|
91
98
|
return placeholder;
|
|
92
99
|
}
|
|
93
100
|
const abs = Math.abs(n);
|
|
94
101
|
const decimals = options.decimals ?? autoDecimals(abs);
|
|
95
|
-
const { sign, body } = signAndBody(n, decimals, locale, abs >= 1000);
|
|
102
|
+
const { sign, body } = signAndBody(n, decimals, locale, abs >= 1000, rounding, false);
|
|
96
103
|
return `${sign}$${body}`;
|
|
97
104
|
}
|
|
98
105
|
function formatCompactUsd(value, options = {}) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/utils/format.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/utils/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaleToInteger.d.ts","sourceRoot":"","sources":["../../../src/utils/scaleToInteger.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG,OAAO,CAAA;AAavD,eAAO,MAAM,cAAc,GACzB,OAAO,MAAM,EACb,UAAU,MAAM,EAChB,QAAQ,oBAAoB,KAC3B,MA0BF,CAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.scaleToInteger = void 0;
|
|
7
|
+
const perps_types_1 = require("@lifi/perps-types");
|
|
8
|
+
const big_js_1 = __importDefault(require("big.js"));
|
|
9
|
+
const PerpsError_js_1 = require("../errors/PerpsError.js");
|
|
10
|
+
const scaleToInteger = (value, decimals, policy) => {
|
|
11
|
+
if (!Number.isInteger(decimals) || decimals < 0) {
|
|
12
|
+
throw new PerpsError_js_1.PerpsError(perps_types_1.PerpsErrorCode.ValidationError, `Invalid decimals for integer scaling: ${decimals}`);
|
|
13
|
+
}
|
|
14
|
+
let parsed;
|
|
15
|
+
try {
|
|
16
|
+
parsed = new big_js_1.default(value);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
throw new PerpsError_js_1.PerpsError(perps_types_1.PerpsErrorCode.ValidationError, `Invalid decimal string for integer scaling: '${value}'`);
|
|
20
|
+
}
|
|
21
|
+
const scaled = parsed
|
|
22
|
+
.times(new big_js_1.default(10).pow(decimals))
|
|
23
|
+
.round(0, policy === 'truncate' ? big_js_1.default.roundDown : big_js_1.default.roundHalfUp);
|
|
24
|
+
if (scaled.abs().gt(Number.MAX_SAFE_INTEGER)) {
|
|
25
|
+
throw new PerpsError_js_1.PerpsError(perps_types_1.PerpsErrorCode.ValidationError, `Scaled value ${scaled.toFixed()} exceeds Number.MAX_SAFE_INTEGER and cannot be encoded exactly.`);
|
|
26
|
+
}
|
|
27
|
+
return scaled.toNumber();
|
|
28
|
+
};
|
|
29
|
+
exports.scaleToInteger = scaleToInteger;
|
|
30
|
+
//# sourceMappingURL=scaleToInteger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaleToInteger.js","sourceRoot":"","sources":["../../../src/utils/scaleToInteger.ts"],"names":[],"mappings":";;;;;;AAAA,mDAAkD;AAClD,oDAAwB;AACxB,2DAAoD;AAuB7C,MAAM,cAAc,GAAG,CAC5B,KAAa,EACb,QAAgB,EAChB,MAA4B,EACpB,EAAE;IACV,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,0BAAU,CAClB,4BAAc,CAAC,eAAe,EAC9B,yCAAyC,QAAQ,EAAE,CACpD,CAAA;IACH,CAAC;IACD,IAAI,MAAW,CAAA;IACf,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,gBAAG,CAAC,KAAK,CAAC,CAAA;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,0BAAU,CAClB,4BAAc,CAAC,eAAe,EAC9B,gDAAgD,KAAK,GAAG,CACzD,CAAA;IACH,CAAC;IACD,MAAM,MAAM,GAAG,MAAM;SAClB,KAAK,CAAC,IAAI,gBAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;SAChC,KAAK,CAAC,CAAC,EAAE,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,gBAAG,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAG,CAAC,WAAW,CAAC,CAAA;IACpE,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,0BAAU,CAClB,4BAAc,CAAC,eAAe,EAC9B,gBAAgB,MAAM,CAAC,OAAO,EAAE,iEAAiE,CAClG,CAAA;IACH,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAA;AAC1B,CAAC,CAAA;AA9BY,QAAA,cAAc,kBA8B1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setupActions.d.ts","sourceRoot":"","sources":["../../../src/utils/setupActions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAiBvD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,cAAc,EAAE,GACtB,cAAc,EAAE,CAIlB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.selectUserSetupActions = selectUserSetupActions;
|
|
4
|
+
const perps_types_1 = require("@lifi/perps-types");
|
|
5
|
+
function selectUserSetupActions(setup) {
|
|
6
|
+
return setup.filter((descriptor) => descriptor.signers.includes(perps_types_1.PerpsSigner.USER));
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=setupActions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setupActions.js","sourceRoot":"","sources":["../../../src/utils/setupActions.ts"],"names":[],"mappings":";;AAiBA,wDAMC;AAtBD,mDAA+C;AAgB/C,SAAgB,sBAAsB,CACpC,KAAuB;IAEvB,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CACjC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,yBAAW,CAAC,IAAI,CAAC,CAC9C,CAAA;AACH,CAAC"}
|
package/dist/cjs/version.d.ts
CHANGED
package/dist/cjs/version.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import type { AccountResponse, AccountSummary, ActionParamsMap, ActionStep, CreateActionResponse,
|
|
1
|
+
import type { AccountResponse, AccountSummary, ActionParamsMap, ActionStep, CreateActionResponse, ExecuteActionResponse, MarketRef, Position } from '@lifi/perps-types';
|
|
2
2
|
import { ActionType } from '@lifi/perps-types';
|
|
3
3
|
import type { Address } from 'viem';
|
|
4
|
-
import type { BuildProviderSetupParams, CancelOrdersParams, GetAccountResult, GetSetupParams, ModifyOrdersParams, PerpsClientOptions, PlaceOrderParams, PlaceTriggerOrderParams, ProviderSetup, SendAssetActionParams, WithdrawParams } from '../types/api.js';
|
|
4
|
+
import type { BuildProviderSetupParams, CancelOrdersParams, GetAccountResult, GetDepositFlowParams, GetSetupParams, ModifyOrdersParams, PerpsClientOptions, PlaceOrderParams, PlaceTriggerOrderParams, ProviderSetup, SendAssetActionParams, WithdrawParams } from '../types/api.js';
|
|
5
5
|
import type { SwitchChainHook } from '../types/config.js';
|
|
6
|
-
import type {
|
|
6
|
+
import type { DepositFlow } from '../types/deposit.js';
|
|
7
|
+
import type { PerpsSDKClient, SignActionProgress } from '../types/provider.js';
|
|
7
8
|
/**
|
|
8
9
|
* The primary high-level perps API: wraps a {@link PerpsSDKClient} and owns the
|
|
9
10
|
* end-to-end signing pipeline for provider setup, orders, and account-level
|
|
@@ -63,6 +64,12 @@ export declare class PerpsClient {
|
|
|
63
64
|
* arm signs as the user.
|
|
64
65
|
*/
|
|
65
66
|
private delegateSignActions;
|
|
67
|
+
/**
|
|
68
|
+
* Let the plugin observe `/executeAction` per-step results before the core
|
|
69
|
+
* surfaces failures — e.g. to evict a locally stored credential the venue
|
|
70
|
+
* rejected.
|
|
71
|
+
*/
|
|
72
|
+
private notifyExecuteResults;
|
|
66
73
|
/**
|
|
67
74
|
* Resolve the wallet that signs `actions`. For a USER-signed EIP-712 batch,
|
|
68
75
|
* switch the configured wallet to the action's target chain via the
|
|
@@ -146,12 +153,16 @@ export declare class PerpsClient {
|
|
|
146
153
|
*/
|
|
147
154
|
accountExists(provider: string, address: Address): Promise<boolean>;
|
|
148
155
|
/**
|
|
149
|
-
*
|
|
150
|
-
*
|
|
156
|
+
* The deposit flow for `params.address` at `params.provider`, delegated to the
|
|
157
|
+
* provider plugin — every deposit decision (the collateral destination, the
|
|
158
|
+
* account-opening pipeline, an outstanding setup gate) is venue-owned.
|
|
151
159
|
*
|
|
160
|
+
* @returns `undefined` when the registered plugin declares no deposit flow.
|
|
161
|
+
* @throws {PerpsError} When the provider plugin is not registered, or the
|
|
162
|
+
* plugin's flow resolution fails.
|
|
152
163
|
* @public
|
|
153
164
|
*/
|
|
154
|
-
|
|
165
|
+
getDepositFlow(params: GetDepositFlowParams): Promise<DepositFlow | undefined>;
|
|
155
166
|
/**
|
|
156
167
|
* Return the unsatisfied entries on `Provider.setup` for this account as a
|
|
157
168
|
* flat, self-describing list. Trading is gated on `isReady === true`.
|
|
@@ -163,6 +174,27 @@ export declare class PerpsClient {
|
|
|
163
174
|
* @public
|
|
164
175
|
*/
|
|
165
176
|
checkSetup(params: GetSetupParams): Promise<ProviderSetup>;
|
|
177
|
+
/**
|
|
178
|
+
* Resolve setup descriptors already satisfied from the provider's own typed
|
|
179
|
+
* account config projection. This catches client-held auth state (e.g. Ondo
|
|
180
|
+
* SIWE/JWT) that the backend cannot observe.
|
|
181
|
+
*/
|
|
182
|
+
private resolveSatisfiedSetup;
|
|
183
|
+
/**
|
|
184
|
+
* Drain the pending setup steps the provider declares as internal via
|
|
185
|
+
* `PerpsProviderPlugin.internalSetupActions`, returning the set of action
|
|
186
|
+
* types to omit from the caller-facing setup list. Each such step is built,
|
|
187
|
+
* signed, and executed in place with the provider's own credentials. A
|
|
188
|
+
* descriptor whose `signers` include {@link PerpsSigner.USER} is left to
|
|
189
|
+
* render as a normal step. A drain failure is swallowed so it never blocks
|
|
190
|
+
* setup — the step stays unsatisfied and is retried on a later `checkSetup`.
|
|
191
|
+
*/
|
|
192
|
+
private resolveInternalSetup;
|
|
193
|
+
/**
|
|
194
|
+
* Build unsigned setup steps for the supplied descriptor subset, preserving
|
|
195
|
+
* provider sequence order with SIWE descriptors prioritized.
|
|
196
|
+
*/
|
|
197
|
+
private buildProviderSetupActions;
|
|
166
198
|
/**
|
|
167
199
|
* Build the unsigned setup `ActionStep`s still outstanding for an account,
|
|
168
200
|
* ordered by descriptor `sequence`. The backend filters already-satisfied
|
|
@@ -326,14 +358,9 @@ export declare class PerpsClient {
|
|
|
326
358
|
address: Address;
|
|
327
359
|
action: T;
|
|
328
360
|
params: ActionParamsMap[T];
|
|
361
|
+
/** Progress sink for on-chain legs (e.g. a native deposit's approve then
|
|
362
|
+
* deposit); called as each leg is submitted and confirmed. */
|
|
363
|
+
onProgress?: (progress: SignActionProgress) => void;
|
|
329
364
|
}): Promise<ExecuteActionResponse>;
|
|
330
|
-
/**
|
|
331
|
-
* The `AUTH_TOKEN` arm of {@link execute}: the venue call runs client-side
|
|
332
|
-
* via the plugin's `executeRestCallActions` because the credential headers
|
|
333
|
-
* must never transit the LI.FI backend. The venue's results are what the
|
|
334
|
-
* caller gets; the backend `executeAction` submission that follows is
|
|
335
|
-
* bookkeeping only, sent with `headers` stripped.
|
|
336
|
-
*/
|
|
337
|
-
private executeAuthTokenActions;
|
|
338
365
|
}
|
|
339
366
|
//# sourceMappingURL=PerpsClient.d.ts.map
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"PerpsClient.d.ts","sourceRoot":"","sources":["../../../src/client/PerpsClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import { ActionType, PerpsErrorCode, SigningMethod } from '@lifi/perps-types';
|
|
1
|
+
import { ActionType, PerpsErrorCode, PerpsSigner, SigningMethod, } from '@lifi/perps-types';
|
|
2
2
|
import { PerpsError } from '../errors/PerpsError.js';
|
|
3
3
|
import { createAction } from '../services/createAction.js';
|
|
4
4
|
import { executeAction } from '../services/executeAction.js';
|
|
5
5
|
import { getAccount as fetchAccount } from '../services/getAccount.js';
|
|
6
6
|
import { getProviders } from '../services/getProviders.js';
|
|
7
7
|
import { switchSigningChain, userEip712TargetChainId, } from '../utils/switchChain.js';
|
|
8
|
-
import { clientLog } from './clientLog.js';
|
|
9
8
|
import { createPerpsClient } from './createPerpsClient.js';
|
|
10
9
|
import { requireProvider as resolveProvider } from './requireProvider.js';
|
|
11
10
|
/**
|
|
@@ -123,14 +122,25 @@ export class PerpsClient {
|
|
|
123
122
|
* reading the end-user's wallet from the {@link SignActionsContext} when an
|
|
124
123
|
* arm signs as the user.
|
|
125
124
|
*/
|
|
126
|
-
async delegateSignActions(provider, address, descriptor, actions) {
|
|
125
|
+
async delegateSignActions(provider, address, descriptor, actions, onProgress) {
|
|
127
126
|
const plugin = this.requireProvider(provider);
|
|
128
127
|
if (typeof plugin.signActions !== 'function') {
|
|
129
128
|
throw new PerpsError(PerpsErrorCode.SDKError, `Provider '${provider}' does not implement signActions for ` +
|
|
130
129
|
`signingMethod '${descriptor.signingMethod}'.`);
|
|
131
130
|
}
|
|
132
131
|
const userWallet = await this.resolveSigningWallet(descriptor, actions);
|
|
133
|
-
return plugin.signActions(descriptor.signingMethod, actions, address, this.buildSignActionsContext(descriptor, userWallet));
|
|
132
|
+
return plugin.signActions(descriptor.signingMethod, actions, address, this.buildSignActionsContext(descriptor, userWallet, onProgress));
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Let the plugin observe `/executeAction` per-step results before the core
|
|
136
|
+
* surfaces failures — e.g. to evict a locally stored credential the venue
|
|
137
|
+
* rejected.
|
|
138
|
+
*/
|
|
139
|
+
async notifyExecuteResults(provider, address, results) {
|
|
140
|
+
const plugin = this.requireProvider(provider);
|
|
141
|
+
if (typeof plugin.onExecuteResults === 'function') {
|
|
142
|
+
await plugin.onExecuteResults(address, results);
|
|
143
|
+
}
|
|
134
144
|
}
|
|
135
145
|
/**
|
|
136
146
|
* Resolve the wallet that signs `actions`. For a USER-signed EIP-712 batch,
|
|
@@ -167,8 +177,11 @@ export class PerpsClient {
|
|
|
167
177
|
* `EVM_TX` broadcasts); the switch stays transient — it never mutates
|
|
168
178
|
* `sdkClient.userWallet`.
|
|
169
179
|
*/
|
|
170
|
-
buildSignActionsContext(descriptor, userWallet) {
|
|
180
|
+
buildSignActionsContext(descriptor, userWallet, onProgress) {
|
|
171
181
|
const ctx = { signers: descriptor.signers };
|
|
182
|
+
if (onProgress !== undefined) {
|
|
183
|
+
ctx.onProgress = onProgress;
|
|
184
|
+
}
|
|
172
185
|
const wallet = userWallet ?? this.sdkClient.userWallet;
|
|
173
186
|
if (wallet !== undefined) {
|
|
174
187
|
ctx.userWallet = wallet;
|
|
@@ -260,17 +273,18 @@ export class PerpsClient {
|
|
|
260
273
|
return this.requireProvider(provider).accountExists({ address });
|
|
261
274
|
}
|
|
262
275
|
/**
|
|
263
|
-
*
|
|
264
|
-
*
|
|
276
|
+
* The deposit flow for `params.address` at `params.provider`, delegated to the
|
|
277
|
+
* provider plugin — every deposit decision (the collateral destination, the
|
|
278
|
+
* account-opening pipeline, an outstanding setup gate) is venue-owned.
|
|
265
279
|
*
|
|
280
|
+
* @returns `undefined` when the registered plugin declares no deposit flow.
|
|
281
|
+
* @throws {PerpsError} When the provider plugin is not registered, or the
|
|
282
|
+
* plugin's flow resolution fails.
|
|
266
283
|
* @public
|
|
267
284
|
*/
|
|
268
|
-
async
|
|
269
|
-
const plugin = this.requireProvider(provider);
|
|
270
|
-
|
|
271
|
-
return [];
|
|
272
|
-
}
|
|
273
|
-
return plugin.getDepositMethods({ address, sourceAsset });
|
|
285
|
+
async getDepositFlow(params) {
|
|
286
|
+
const plugin = this.requireProvider(params.provider);
|
|
287
|
+
return plugin.getDepositFlow?.({ address: params.address });
|
|
274
288
|
}
|
|
275
289
|
/**
|
|
276
290
|
* Return the unsatisfied entries on `Provider.setup` for this account as a
|
|
@@ -284,15 +298,24 @@ export class PerpsClient {
|
|
|
284
298
|
*/
|
|
285
299
|
async checkSetup(params) {
|
|
286
300
|
const { provider, address } = params;
|
|
301
|
+
const metadata = await this.getProviderMetadata(provider);
|
|
302
|
+
const hasSiweSetup = metadata.setup.some((descriptor) => descriptor.signingMethod === SigningMethod.SIWE);
|
|
287
303
|
// Gate on existence first: an unfunded account has no setup, so short-circuit
|
|
288
304
|
// before any createAction round-trip and let the consumer prompt a deposit.
|
|
289
|
-
|
|
305
|
+
//
|
|
306
|
+
// SIWE-first providers (Ondo) are the exception: they cannot reliably probe
|
|
307
|
+
// account existence before the user signs in, so setup must still stage.
|
|
308
|
+
if (!hasSiweSetup && !(await this.accountExists(provider, address))) {
|
|
290
309
|
return { accountExists: false, setup: [], isReady: false };
|
|
291
310
|
}
|
|
311
|
+
const satisfiedSetup = await this.resolveSatisfiedSetup(provider, address);
|
|
312
|
+
const pendingSetup = metadata.setup.filter((descriptor) => !satisfiedSetup.has(descriptor.type));
|
|
313
|
+
const hiddenSetup = await this.resolveInternalSetup(provider, address, pendingSetup);
|
|
314
|
+
const visibleSetup = pendingSetup.filter((descriptor) => !hiddenSetup.has(descriptor.type));
|
|
292
315
|
// The backend filters already-satisfied setup actions and returns typed
|
|
293
316
|
// data for those still outstanding; each plugin contributes its own
|
|
294
317
|
// signer-bearing request fields.
|
|
295
|
-
const
|
|
318
|
+
const actions = await this.buildProviderSetupActions(provider, address, visibleSetup);
|
|
296
319
|
return {
|
|
297
320
|
accountExists: true,
|
|
298
321
|
setup: actions,
|
|
@@ -300,18 +323,77 @@ export class PerpsClient {
|
|
|
300
323
|
};
|
|
301
324
|
}
|
|
302
325
|
/**
|
|
303
|
-
*
|
|
304
|
-
*
|
|
305
|
-
*
|
|
306
|
-
* any local-state params (e.g. Lighter's known pubkey).
|
|
307
|
-
*
|
|
308
|
-
* @public
|
|
326
|
+
* Resolve setup descriptors already satisfied from the provider's own typed
|
|
327
|
+
* account config projection. This catches client-held auth state (e.g. Ondo
|
|
328
|
+
* SIWE/JWT) that the backend cannot observe.
|
|
309
329
|
*/
|
|
310
|
-
async
|
|
311
|
-
const { provider, address } = params;
|
|
330
|
+
async resolveSatisfiedSetup(provider, address) {
|
|
312
331
|
const metadata = await this.getProviderMetadata(provider);
|
|
313
|
-
const
|
|
314
|
-
|
|
332
|
+
const plugin = this.sdkClient.getProvider(provider);
|
|
333
|
+
if (!plugin || typeof plugin.getAccount !== 'function') {
|
|
334
|
+
return new Set();
|
|
335
|
+
}
|
|
336
|
+
const account = await plugin.getAccount({ address });
|
|
337
|
+
const settings = plugin.projectConfig(account.config, metadata.setup, metadata.options);
|
|
338
|
+
const setupTypes = new Set(metadata.setup.map((descriptor) => descriptor.type));
|
|
339
|
+
return new Set(settings
|
|
340
|
+
.filter((setting) => setting.satisfied && setupTypes.has(setting.type))
|
|
341
|
+
.map((setting) => setting.type));
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Drain the pending setup steps the provider declares as internal via
|
|
345
|
+
* `PerpsProviderPlugin.internalSetupActions`, returning the set of action
|
|
346
|
+
* types to omit from the caller-facing setup list. Each such step is built,
|
|
347
|
+
* signed, and executed in place with the provider's own credentials. A
|
|
348
|
+
* descriptor whose `signers` include {@link PerpsSigner.USER} is left to
|
|
349
|
+
* render as a normal step. A drain failure is swallowed so it never blocks
|
|
350
|
+
* setup — the step stays unsatisfied and is retried on a later `checkSetup`.
|
|
351
|
+
*/
|
|
352
|
+
async resolveInternalSetup(provider, address, pending) {
|
|
353
|
+
const plugin = this.sdkClient.getProvider(provider);
|
|
354
|
+
const internal = plugin?.internalSetupActions;
|
|
355
|
+
if (!internal || internal.length === 0) {
|
|
356
|
+
return new Set();
|
|
357
|
+
}
|
|
358
|
+
const internalTypes = new Set(internal);
|
|
359
|
+
const hidden = new Set();
|
|
360
|
+
for (const descriptor of pending) {
|
|
361
|
+
if (!internalTypes.has(descriptor.type) ||
|
|
362
|
+
descriptor.signers.includes(PerpsSigner.USER)) {
|
|
363
|
+
continue;
|
|
364
|
+
}
|
|
365
|
+
hidden.add(descriptor.type);
|
|
366
|
+
try {
|
|
367
|
+
const steps = await this.buildProviderSetupActions(provider, address, [
|
|
368
|
+
descriptor,
|
|
369
|
+
]);
|
|
370
|
+
for (const step of steps) {
|
|
371
|
+
const signed = await this.signProviderSetupAction(provider, address, step);
|
|
372
|
+
if (signed !== undefined) {
|
|
373
|
+
await this.executeProviderSetup({
|
|
374
|
+
provider,
|
|
375
|
+
address,
|
|
376
|
+
setup: [step],
|
|
377
|
+
signedActions: [signed],
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
catch (error) {
|
|
383
|
+
console.debug(`[perps-sdk] internal setup step '${descriptor.type}' for '${provider}' did not complete; will retry on the next checkSetup.`, error);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
return hidden;
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Build unsigned setup steps for the supplied descriptor subset, preserving
|
|
390
|
+
* provider sequence order with SIWE descriptors prioritized.
|
|
391
|
+
*/
|
|
392
|
+
async buildProviderSetupActions(provider, address, descriptors) {
|
|
393
|
+
const setupPriority = (descriptor) => descriptor.signingMethod === SigningMethod.SIWE ? 0 : 1;
|
|
394
|
+
const orderedSetup = [...descriptors].sort((a, b) => setupPriority(a) - setupPriority(b) ||
|
|
395
|
+
(a.sequence ?? Number.MAX_SAFE_INTEGER) -
|
|
396
|
+
(b.sequence ?? Number.MAX_SAFE_INTEGER));
|
|
315
397
|
const plugin = this.sdkClient.getProvider(provider);
|
|
316
398
|
const allActions = [];
|
|
317
399
|
for (const descriptor of orderedSetup) {
|
|
@@ -332,7 +414,21 @@ export class PerpsClient {
|
|
|
332
414
|
});
|
|
333
415
|
allActions.push(...actions);
|
|
334
416
|
}
|
|
335
|
-
return
|
|
417
|
+
return allActions;
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Build the unsigned setup `ActionStep`s still outstanding for an account,
|
|
421
|
+
* ordered by descriptor `sequence`. The backend filters already-satisfied
|
|
422
|
+
* setup; each plugin contributes its own signer-bearing request fields and
|
|
423
|
+
* any local-state params (e.g. Lighter's known pubkey).
|
|
424
|
+
*
|
|
425
|
+
* @public
|
|
426
|
+
*/
|
|
427
|
+
async buildProviderSetup(params) {
|
|
428
|
+
const { provider, address } = params;
|
|
429
|
+
const metadata = await this.getProviderMetadata(provider);
|
|
430
|
+
const actions = await this.buildProviderSetupActions(provider, address, metadata.setup);
|
|
431
|
+
return { actions };
|
|
336
432
|
}
|
|
337
433
|
/**
|
|
338
434
|
* Submit the signed setup steps returned by `checkSetup` (and signed by the
|
|
@@ -358,6 +454,7 @@ export class PerpsClient {
|
|
|
358
454
|
action,
|
|
359
455
|
actions: signedActions,
|
|
360
456
|
});
|
|
457
|
+
await this.notifyExecuteResults(provider, address, results.results);
|
|
361
458
|
const failure = results.results.find((r) => !r.success);
|
|
362
459
|
if (failure) {
|
|
363
460
|
throw new PerpsError(PerpsErrorCode.ExchangeRejected, failure.error);
|
|
@@ -551,7 +648,7 @@ export class PerpsClient {
|
|
|
551
648
|
* @public
|
|
552
649
|
*/
|
|
553
650
|
async execute(params) {
|
|
554
|
-
const { provider, address, action } = params;
|
|
651
|
+
const { provider, address, action, onProgress } = params;
|
|
555
652
|
const metadata = await this.getProviderMetadata(provider);
|
|
556
653
|
const descriptor = findActionDescriptor(metadata, action);
|
|
557
654
|
const { signerAddress, params: signerParams } = await this.resolveActionRequest(provider, descriptor, address);
|
|
@@ -565,17 +662,14 @@ export class PerpsClient {
|
|
|
565
662
|
...signerParams,
|
|
566
663
|
},
|
|
567
664
|
});
|
|
568
|
-
const signedActions = await this.delegateSignActions(provider, address, descriptor, actions);
|
|
569
|
-
if (descriptor.signingMethod === SigningMethod.AUTH_TOKEN) {
|
|
570
|
-
return this.executeAuthTokenActions(provider, address, signerAddress ?? address, action, signedActions);
|
|
571
|
-
}
|
|
665
|
+
const signedActions = await this.delegateSignActions(provider, address, descriptor, actions, onProgress);
|
|
572
666
|
// A plugin may execute an action entirely client-side (e.g. Lighter's
|
|
573
667
|
// token-authenticated venue mutations), leaving no backend-bound step. With
|
|
574
668
|
// nothing to submit, skip the `/executeAction` hop.
|
|
575
669
|
if (signedActions.length === 0) {
|
|
576
670
|
return { results: [] };
|
|
577
671
|
}
|
|
578
|
-
|
|
672
|
+
const response = await executeAction(this.sdkClient, {
|
|
579
673
|
provider,
|
|
580
674
|
address,
|
|
581
675
|
// The submitting account: the plugin-resolved signer (Hyperliquid's
|
|
@@ -584,47 +678,8 @@ export class PerpsClient {
|
|
|
584
678
|
action,
|
|
585
679
|
actions: signedActions,
|
|
586
680
|
});
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
* The `AUTH_TOKEN` arm of {@link execute}: the venue call runs client-side
|
|
590
|
-
* via the plugin's `executeRestCallActions` because the credential headers
|
|
591
|
-
* must never transit the LI.FI backend. The venue's results are what the
|
|
592
|
-
* caller gets; the backend `executeAction` submission that follows is
|
|
593
|
-
* bookkeeping only, sent with `headers` stripped.
|
|
594
|
-
*/
|
|
595
|
-
async executeAuthTokenActions(provider, address, signerAddress, action, signedActions) {
|
|
596
|
-
const plugin = this.requireProvider(provider);
|
|
597
|
-
if (typeof plugin.executeRestCallActions !== 'function') {
|
|
598
|
-
throw new PerpsError(PerpsErrorCode.SDKError, `Provider '${provider}' does not implement executeRestCallActions ` +
|
|
599
|
-
`for signingMethod 'authToken'.`);
|
|
600
|
-
}
|
|
601
|
-
const restCallSteps = signedActions.map((step) => {
|
|
602
|
-
if (!('request' in step) || !('headers' in step)) {
|
|
603
|
-
throw new PerpsError(PerpsErrorCode.SDKError, `Provider '${provider}' signed action '${step.action}' with a ` +
|
|
604
|
-
`non-rest-call step for signingMethod 'authToken'.`);
|
|
605
|
-
}
|
|
606
|
-
return step;
|
|
607
|
-
});
|
|
608
|
-
const results = await plugin.executeRestCallActions(restCallSteps, address);
|
|
609
|
-
try {
|
|
610
|
-
await executeAction(this.sdkClient, {
|
|
611
|
-
provider,
|
|
612
|
-
address,
|
|
613
|
-
signerAddress,
|
|
614
|
-
action,
|
|
615
|
-
actions: restCallSteps.map((step) => ({
|
|
616
|
-
action: step.action,
|
|
617
|
-
request: step.request,
|
|
618
|
-
headers: {},
|
|
619
|
-
})),
|
|
620
|
-
});
|
|
621
|
-
}
|
|
622
|
-
catch (error) {
|
|
623
|
-
// The venue call already succeeded above — a failed bookkeeping
|
|
624
|
-
// submission must not mask a landed order, so it is logged, not thrown.
|
|
625
|
-
clientLog.bookkeepingFailure(provider, error);
|
|
626
|
-
}
|
|
627
|
-
return { results };
|
|
681
|
+
await this.notifyExecuteResults(provider, address, response.results);
|
|
682
|
+
return response;
|
|
628
683
|
}
|
|
629
684
|
}
|
|
630
685
|
//# sourceMappingURL=PerpsClient.js.map
|