@haven-fi/solauto-sdk 1.0.689 → 1.0.691
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/services/rebalance/rebalanceSwapManager.d.ts +3 -1
- package/dist/services/rebalance/rebalanceSwapManager.d.ts.map +1 -1
- package/dist/services/rebalance/rebalanceSwapManager.js +7 -6
- package/dist/services/rebalance/rebalanceTxBuilder.d.ts.map +1 -1
- package/dist/services/rebalance/rebalanceTxBuilder.js +2 -5
- package/dist/services/solauto/solautoClient.d.ts.map +1 -1
- package/dist/services/solauto/solautoClient.js +1 -0
- package/dist/services/transactions/manager/transactionsManager.d.ts +2 -2
- package/dist/services/transactions/manager/transactionsManager.d.ts.map +1 -1
- package/dist/services/transactions/transactionUtils.d.ts.map +1 -1
- package/dist/services/transactions/transactionUtils.js +7 -4
- package/dist/utils/switchboardUtils.d.ts.map +1 -1
- package/dist/utils/switchboardUtils.js +10 -4
- package/local/txSandbox.ts +11 -0
- package/package.json +1 -1
- package/src/services/rebalance/rebalanceTxBuilder.ts +5 -4
- package/src/services/transactions/transactionUtils.ts +14 -4
@@ -3,16 +3,18 @@ import { FlashLoanRequirements } from "../../types";
|
|
3
3
|
import { SolautoClient } from "../solauto";
|
4
4
|
import { SwapParams } from "../swap";
|
5
5
|
import { RebalanceValues } from "./rebalanceValues";
|
6
|
+
import { PriceType } from "../../generated";
|
6
7
|
export declare class RebalanceSwapManager {
|
7
8
|
private client;
|
8
9
|
private values;
|
9
10
|
private flRequirements?;
|
10
11
|
private targetLiqUtilizationRateBps?;
|
12
|
+
private priceType?;
|
11
13
|
swapParams: SwapParams;
|
12
14
|
swapQuote?: QuoteResponse;
|
13
15
|
flBorrowAmount?: bigint;
|
14
16
|
private jupSwapManager;
|
15
|
-
constructor(client: SolautoClient, values: RebalanceValues, flRequirements?: FlashLoanRequirements | undefined, targetLiqUtilizationRateBps?: number | undefined);
|
17
|
+
constructor(client: SolautoClient, values: RebalanceValues, flRequirements?: FlashLoanRequirements | undefined, targetLiqUtilizationRateBps?: number | undefined, priceType?: PriceType | undefined);
|
16
18
|
private isBoost;
|
17
19
|
private usdToSwap;
|
18
20
|
private postRebalanceLiqUtilizationRateBps;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"rebalanceSwapManager.d.ts","sourceRoot":"","sources":["../../../src/services/rebalance/rebalanceSwapManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAkB,UAAU,EAAa,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;
|
1
|
+
{"version":3,"file":"rebalanceSwapManager.d.ts","sourceRoot":"","sources":["../../../src/services/rebalance/rebalanceSwapManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAkB,UAAU,EAAa,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAiC,MAAM,iBAAiB,CAAC;AAU3E,qBAAa,oBAAoB;IAQ7B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,cAAc,CAAC;IACvB,OAAO,CAAC,2BAA2B,CAAC;IACpC,OAAO,CAAC,SAAS,CAAC;IAXb,UAAU,EAAG,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,cAAc,CAAkB;gBAG9B,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,eAAe,EACvB,cAAc,CAAC,EAAE,qBAAqB,YAAA,EACtC,2BAA2B,CAAC,EAAE,MAAM,YAAA,EACpC,SAAS,CAAC,EAAE,SAAS,YAAA;IAK/B,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,kCAAkC;YA2B5B,mBAAmB;IAoCjC,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,mBAAmB;IAIrB,aAAa,CAAC,UAAU,EAAE,MAAM;IA4EhC,aAAa;;;;;;CAWpB"}
|
@@ -6,11 +6,12 @@ const swap_1 = require("../swap");
|
|
6
6
|
const generated_1 = require("../../generated");
|
7
7
|
const utils_1 = require("../../utils");
|
8
8
|
class RebalanceSwapManager {
|
9
|
-
constructor(client, values, flRequirements, targetLiqUtilizationRateBps) {
|
9
|
+
constructor(client, values, flRequirements, targetLiqUtilizationRateBps, priceType) {
|
10
10
|
this.client = client;
|
11
11
|
this.values = values;
|
12
12
|
this.flRequirements = flRequirements;
|
13
13
|
this.targetLiqUtilizationRateBps = targetLiqUtilizationRateBps;
|
14
|
+
this.priceType = priceType;
|
14
15
|
this.jupSwapManager = new swap_1.JupSwapManager(client.signer);
|
15
16
|
}
|
16
17
|
isBoost() {
|
@@ -20,15 +21,15 @@ class RebalanceSwapManager {
|
|
20
21
|
return Math.abs(this.values.debtAdjustmentUsd);
|
21
22
|
}
|
22
23
|
postRebalanceLiqUtilizationRateBps(swapOutputAmount) {
|
23
|
-
let supplyUsd = this.client.pos.supplyUsd();
|
24
|
+
let supplyUsd = this.client.pos.supplyUsd(this.priceType);
|
24
25
|
// TODO: add token balance change
|
25
|
-
let debtUsd = this.client.pos.debtUsd();
|
26
|
+
let debtUsd = this.client.pos.debtUsd(this.priceType);
|
26
27
|
const outputToken = this.isBoost()
|
27
28
|
? this.client.pos.supplyMint
|
28
29
|
: this.client.pos.debtMint;
|
29
30
|
const swapOutputUsd = swapOutputAmount
|
30
31
|
? (0, utils_1.fromBaseUnit)(swapOutputAmount, (0, utils_1.tokenInfo)(outputToken).decimals) *
|
31
|
-
((0, utils_1.safeGetPrice)(outputToken) ?? 0)
|
32
|
+
((0, utils_1.safeGetPrice)(outputToken, this.priceType) ?? 0)
|
32
33
|
: this.usdToSwap();
|
33
34
|
supplyUsd = this.isBoost()
|
34
35
|
? supplyUsd + swapOutputUsd
|
@@ -68,7 +69,7 @@ class RebalanceSwapManager {
|
|
68
69
|
const output = this.isBoost()
|
69
70
|
? this.client.pos.state.supply
|
70
71
|
: this.client.pos.state.debt;
|
71
|
-
let inputAmount = (0, utils_1.toBaseUnit)(this.usdToSwap() / (0, utils_1.safeGetPrice)(input.mint), input.decimals);
|
72
|
+
let inputAmount = (0, utils_1.toBaseUnit)(this.usdToSwap() / (0, utils_1.safeGetPrice)(input.mint, this.priceType), input.decimals);
|
72
73
|
return {
|
73
74
|
input,
|
74
75
|
output,
|
@@ -86,7 +87,7 @@ class RebalanceSwapManager {
|
|
86
87
|
BigInt(Math.round(Number(output.amountUsed.baseUnit) *
|
87
88
|
// Add this small percentage to account for the APR on the debt between now and the transaction
|
88
89
|
0.0001))
|
89
|
-
: (0, utils_1.toBaseUnit)(this.usdToSwap() / (0, utils_1.safeGetPrice)(output.mint), output.decimals);
|
90
|
+
: (0, utils_1.toBaseUnit)(this.usdToSwap() / (0, utils_1.safeGetPrice)(output.mint, this.priceType), output.decimals);
|
90
91
|
const flashLoanRepayFromDebt = !this.isBoost() &&
|
91
92
|
this.flRequirements &&
|
92
93
|
this.flRequirements.liquiditySource === generated_1.TokenType.Debt;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"rebalanceTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/services/rebalance/rebalanceTxBuilder.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAGL,qBAAqB,EACtB,MAAM,aAAa,CAAC;AA8BrB,qBAAa,kBAAkB;IAQ3B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,2BAA2B,CAAC;IACpC,OAAO,CAAC,YAAY,CAAC;IATvB,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,aAAa,CAAwB;IAC7C,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,cAAc,CAAC,CAAwB;IAC/C,OAAO,CAAC,SAAS,CAAiC;gBAGxC,MAAM,EAAE,aAAa,EACrB,2BAA2B,CAAC,EAAE,MAAM,YAAA,EACpC,YAAY,CAAC,EAAE,OAAO,YAAA;IAGhC,OAAO,CAAC,0BAA0B;IAclC,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,oBAAoB;
|
1
|
+
{"version":3,"file":"rebalanceTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/services/rebalance/rebalanceTxBuilder.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAGL,qBAAqB,EACtB,MAAM,aAAa,CAAC;AA8BrB,qBAAa,kBAAkB;IAQ3B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,2BAA2B,CAAC;IACpC,OAAO,CAAC,YAAY,CAAC;IATvB,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,aAAa,CAAwB;IAC7C,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,cAAc,CAAC,CAAwB;IAC/C,OAAO,CAAC,SAAS,CAAiC;gBAGxC,MAAM,EAAE,aAAa,EACrB,2BAA2B,CAAC,EAAE,MAAM,YAAA,EACpC,YAAY,CAAC,EAAE,OAAO,YAAA;IAGhC,OAAO,CAAC,0BAA0B;IAclC,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,oBAAoB;IAwC5B,OAAO,CAAC,iCAAiC;YAgC3B,qBAAqB;IA0CnC,OAAO,CAAC,mBAAmB;IAwB3B,OAAO,CAAC,gBAAgB;IA+BxB,OAAO,CAAC,yBAAyB;YAqBnB,mBAAmB;YAyBnB,sBAAsB;YAyBtB,mBAAmB;IAwEpB,gBAAgB,CAC3B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;CAe9C"}
|
@@ -32,12 +32,9 @@ class RebalanceTxBuilder {
|
|
32
32
|
const insufficientLiquidity = (amountNeededUsd, liquidityAvailable, tokenMint) => {
|
33
33
|
const liquidityUsd = (0, utils_1.fromBaseUnit)(liquidityAvailable, (0, utils_1.tokenInfo)(tokenMint).decimals) *
|
34
34
|
((0, utils_1.safeGetPrice)(tokenMint) ?? 0);
|
35
|
-
(0, utils_1.consoleLog)(liquidityUsd);
|
36
35
|
return amountNeededUsd > liquidityUsd * 0.95;
|
37
36
|
};
|
38
|
-
(0, utils_1.consoleLog)("Supply liquidity available:", supplyLiquidityAvailable);
|
39
37
|
const insufficientSupplyLiquidity = insufficientLiquidity(debtAdjustmentUsd, supplyLiquidityAvailable, this.client.pos.supplyMint);
|
40
|
-
(0, utils_1.consoleLog)("Debt liquidity available:", debtLiquidityAvailable);
|
41
38
|
const insufficientDebtLiquidity = insufficientLiquidity(debtAdjustmentUsd, debtLiquidityAvailable, this.client.pos.debtMint);
|
42
39
|
let useDebtLiquidity = this.values.rebalanceDirection === generated_1.RebalanceDirection.Boost ||
|
43
40
|
insufficientSupplyLiquidity;
|
@@ -73,7 +70,6 @@ class RebalanceTxBuilder {
|
|
73
70
|
}
|
74
71
|
const stdFlLiquiditySource = this.getFlLiquiditySource(this.client.flProvider.liquidityAvailable(generated_1.TokenType.Supply), this.client.flProvider.liquidityAvailable(generated_1.TokenType.Debt));
|
75
72
|
if (stdFlLiquiditySource === undefined || this.optimizeSize) {
|
76
|
-
(0, utils_1.consoleLog)("Checking signer liquidity");
|
77
73
|
const { supplyBalance, debtBalance } = await this.client.signerBalances();
|
78
74
|
const signerFlLiquiditySource = this.getFlLiquiditySource(supplyBalance, debtBalance);
|
79
75
|
if (signerFlLiquiditySource) {
|
@@ -163,7 +159,7 @@ class RebalanceTxBuilder {
|
|
163
159
|
if (this.flRequirements?.flFeeBps) {
|
164
160
|
this.values = this.getRebalanceValues();
|
165
161
|
}
|
166
|
-
this.swapManager = new rebalanceSwapManager_1.RebalanceSwapManager(this.client, this.values, this.flRequirements, this.targetLiqUtilizationRateBps);
|
162
|
+
this.swapManager = new rebalanceSwapManager_1.RebalanceSwapManager(this.client, this.values, this.flRequirements, this.targetLiqUtilizationRateBps, this.priceType);
|
167
163
|
await this.swapManager.setSwapParams(attemptNum);
|
168
164
|
this.setRebalanceType();
|
169
165
|
return true;
|
@@ -203,6 +199,7 @@ class RebalanceTxBuilder {
|
|
203
199
|
priceType: this.priceType,
|
204
200
|
};
|
205
201
|
(0, utils_1.consoleLog)("Rebalance details:", rebalanceDetails);
|
202
|
+
(0, utils_1.consoleLog)("Prices:", (0, utils_1.safeGetPrice)(this.client.pos.supplyMint, this.priceType), (0, utils_1.safeGetPrice)(this.client.pos.debtMint, this.priceType));
|
206
203
|
const firstRebalance = this.client.rebalanceIx(generated_1.RebalanceStep.PreSwap, rebalanceDetails);
|
207
204
|
const lastRebalance = this.client.rebalanceIx(generated_1.RebalanceStep.PostSwap, rebalanceDetails);
|
208
205
|
if (!flashLoanDetails) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"solautoClient.d.ts","sourceRoot":"","sources":["../../../src/services/solauto/solautoClient.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAC;AACxC,OAAO,EAA6B,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EACL,kBAAkB,EAMnB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,gCAAgC,EAEhC,sBAAsB,EAGvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAKL,cAAc,EACf,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,WAAW,iBAAkB,SAAQ,wBAAwB;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B;AAED,MAAM,MAAM,2BAA2B,GAAG,QAAQ,CAChD,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC,CACtC,GACC,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC,CAAC;AAEhD,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAC3C,IAAI,CACF,iBAAiB,EACjB,YAAY,GAAG,YAAY,GAAG,UAAU,GAAG,eAAe,CAC3D,CACF,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG,QAAQ,CACpD,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,CACzC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,QAAQ,CAC/C,IAAI,CAAC,iBAAiB,EAAE,YAAY,GAAG,UAAU,GAAG,eAAe,CAAC,CACrE,CAAC;AAEF,8BAAsB,aAAc,SAAQ,oBAAoB;IACvD,eAAe,EAAG,eAAe,CAAC;IAClC,KAAK,EAAG,UAAU,CAAC;IAEnB,SAAS,EAAG,SAAS,CAAC;IAEtB,GAAG,EAAG,iBAAiB,CAAC;IAExB,gBAAgB,EAAG,SAAS,CAAC;IAC7B,cAAc,EAAG,SAAS,CAAC;IAE3B,cAAc,EAAG,SAAS,CAAC;IAC3B,YAAY,EAAG,SAAS,CAAC;IAEzB,mBAAmB,EAAG,SAAS,CAAC;IAChC,iBAAiB,EAAG,SAAS,CAAC;IAE9B,mBAAmB,CAAC,EAAE,SAAS,CAAC;IAEhC,UAAU,EAAG,oBAAoB,CAAC;IAClC,cAAc,EAAE,cAAc,CAAwB;IAE7D,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,iBAAiB,CAAqB;IAExC,iCAAiC,CAAC,IAAI,EAAE,2BAA2B;IAInE,4BAA4B,CAAC,IAAI,EAAE,sBAAsB;IAIzD,qCAAqC,CACzC,IAAI,EAAE,+BAA+B;IAKjC,gCAAgC,CAAC,IAAI,EAAE,0BAA0B;IAIjE,UAAU,CAAC,IAAI,EAAE,iBAAiB;
|
1
|
+
{"version":3,"file":"solautoClient.d.ts","sourceRoot":"","sources":["../../../src/services/solauto/solautoClient.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAC;AACxC,OAAO,EAA6B,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EACL,kBAAkB,EAMnB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,gCAAgC,EAEhC,sBAAsB,EAGvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAKL,cAAc,EACf,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,WAAW,iBAAkB,SAAQ,wBAAwB;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B;AAED,MAAM,MAAM,2BAA2B,GAAG,QAAQ,CAChD,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC,CACtC,GACC,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC,CAAC;AAEhD,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAC3C,IAAI,CACF,iBAAiB,EACjB,YAAY,GAAG,YAAY,GAAG,UAAU,GAAG,eAAe,CAC3D,CACF,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG,QAAQ,CACpD,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,CACzC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,QAAQ,CAC/C,IAAI,CAAC,iBAAiB,EAAE,YAAY,GAAG,UAAU,GAAG,eAAe,CAAC,CACrE,CAAC;AAEF,8BAAsB,aAAc,SAAQ,oBAAoB;IACvD,eAAe,EAAG,eAAe,CAAC;IAClC,KAAK,EAAG,UAAU,CAAC;IAEnB,SAAS,EAAG,SAAS,CAAC;IAEtB,GAAG,EAAG,iBAAiB,CAAC;IAExB,gBAAgB,EAAG,SAAS,CAAC;IAC7B,cAAc,EAAG,SAAS,CAAC;IAE3B,cAAc,EAAG,SAAS,CAAC;IAC3B,YAAY,EAAG,SAAS,CAAC;IAEzB,mBAAmB,EAAG,SAAS,CAAC;IAChC,iBAAiB,EAAG,SAAS,CAAC;IAE9B,mBAAmB,CAAC,EAAE,SAAS,CAAC;IAEhC,UAAU,EAAG,oBAAoB,CAAC;IAClC,cAAc,EAAE,cAAc,CAAwB;IAE7D,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,iBAAiB,CAAqB;IAExC,iCAAiC,CAAC,IAAI,EAAE,2BAA2B;IAInE,4BAA4B,CAAC,IAAI,EAAE,sBAAsB;IAIzD,qCAAqC,CACzC,IAAI,EAAE,+BAA+B;IAKjC,gCAAgC,CAAC,IAAI,EAAE,0BAA0B;IAIjE,UAAU,CAAC,IAAI,EAAE,iBAAiB;IA0ExC,kBAAkB,IAAI,SAAS,GAAG,SAAS;IAO3C,gBAAgB,IAAI,SAAS,GAAG,SAAS;IAOnC,kBAAkB,CAAC,OAAO,CAAC,EAAE,OAAO;IAe1C,mBAAmB,IAAI,MAAM,EAAE;IAS/B,gBAAgB,IAAI,SAAS,EAAE;IAezB,iCAAiC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAUzD,iBAAiB,IAAI,OAAO,CAC9B;QACE,EAAE,EAAE,kBAAkB,CAAC;QACvB,GAAG,EAAE,OAAO,CAAC;QACb,aAAa,EAAE,SAAS,EAAE,CAAC;KAC5B,GACD,SAAS,CACZ;IAgEK,cAAc,IAAI,OAAO,CAAC;QAC9B,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IAgBF,cAAc,CACZ,QAAQ,CAAC,EAAE,gCAAgC,EAC3C,GAAG,CAAC,EAAE,kBAAkB,GACvB,kBAAkB;IA0BrB,gBAAgB,CAAC,IAAI,EAAE,sBAAsB,GAAG,kBAAkB;IAsDlE,QAAQ,CAAC,eAAe,IAAI,kBAAkB;IAE9C,WAAW,IAAI,kBAAkB;IAcjC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,kBAAkB;IAE5D,qBAAqB,CAAC,IAAI,EAAE,iBAAiB,GAAG,kBAAkB;IAqFlE,QAAQ,CAAC,WAAW,CAClB,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,gBAAgB,GACrB,kBAAkB;CACtB"}
|
@@ -55,6 +55,7 @@ class SolautoClient extends referralStateManager_1.ReferralStateManager {
|
|
55
55
|
this.otherSigners.push(...this.flProvider.otherSigners());
|
56
56
|
this.log("Position state: ", this.pos.state);
|
57
57
|
this.log("Position settings: ", this.pos.settings);
|
58
|
+
this.log("Public key:", this.pos.publicKey.toString());
|
58
59
|
this.log("Supply mint:", this.pos.supplyMint.toString());
|
59
60
|
this.log("Debt mint:", this.pos.debtMint.toString());
|
60
61
|
this.log("LP pool:", this.pos.lpPoolAccount.toString());
|
@@ -26,7 +26,7 @@ interface RetryConfig {
|
|
26
26
|
totalRetries?: number;
|
27
27
|
retryDelay?: number;
|
28
28
|
}
|
29
|
-
export interface
|
29
|
+
export interface TransactionsManagerArgs<T extends TxHandler> {
|
30
30
|
txHandler: T;
|
31
31
|
statusCallback?: (statuses: TransactionManagerStatuses) => void;
|
32
32
|
txRunType?: TransactionRunType;
|
@@ -48,7 +48,7 @@ export declare class TransactionsManager<T extends TxHandler> {
|
|
48
48
|
protected totalRetries: number;
|
49
49
|
protected retryDelay: number;
|
50
50
|
updateOracleTxName: string;
|
51
|
-
constructor(args:
|
51
|
+
constructor(args: TransactionsManagerArgs<T>);
|
52
52
|
private assembleTransactionSets;
|
53
53
|
private updateStatus;
|
54
54
|
private debugAccounts;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"transactionsManager.d.ts","sourceRoot":"","sources":["../../../../src/services/transactions/manager/transactionsManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EACL,kBAAkB,EAElB,kBAAkB,EACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAEL,aAAa,EAId,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAkB,MAAM,UAAU,CAAC;AAEzE,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAK5B;AAED,oBAAY,iBAAiB;IAC3B,OAAO,YAAY;IACnB,UAAU,eAAe;IACzB,MAAM,WAAW;IACjB,UAAU,eAAe;IACzB,MAAM,WAAW;CAClB;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,EAAE,CAAC;AAEJ,UAAU,WAAW;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,
|
1
|
+
{"version":3,"file":"transactionsManager.d.ts","sourceRoot":"","sources":["../../../../src/services/transactions/manager/transactionsManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EACL,kBAAkB,EAElB,kBAAkB,EACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAEL,aAAa,EAId,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAkB,MAAM,UAAU,CAAC;AAEzE,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAK5B;AAED,oBAAY,iBAAiB;IAC3B,OAAO,YAAY;IACnB,UAAU,eAAe;IACzB,MAAM,WAAW;IACjB,UAAU,eAAe;IACzB,MAAM,WAAW;CAClB;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,EAAE,CAAC;AAEJ,UAAU,WAAW;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB,CAAC,CAAC,SAAS,SAAS;IAC1D,SAAS,EAAE,CAAC,CAAC;IACb,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,0BAA0B,KAAK,IAAI,CAAC;IAChE,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,qBAAa,mBAAmB,CAAC,CAAC,SAAS,SAAS;IAClD,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC;IACvB,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,0BAA0B,KAAK,IAAI,CAAC;IAC1E,SAAS,CAAC,SAAS,CAAC,EAAE,kBAAkB,CAAC;IACzC,SAAS,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;IACjD,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC;IAC9B,SAAS,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC;IACxC,SAAS,CAAC,QAAQ,EAAE,0BAA0B,CAAM;IACpD,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC;IACrC,SAAS,CAAC,eAAe,EAAE,MAAM,CAAC;IAClC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC;IAC/B,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;IAE7B,kBAAkB,SAAmB;gBAEzB,IAAI,EAAE,uBAAuB,CAAC,CAAC,CAAC;YAmB9B,uBAAuB;IA0CrC,OAAO,CAAC,YAAY;YA6CN,aAAa;IAoB3B,SAAS,CAAC,4BAA4B,CACpC,SAAS,EAAE,KAAK,GAAG,SAAS,EAC5B,UAAU,EAAE,MAAM;IAcpB,OAAO,CAAC,mBAAmB;IAoBd,IAAI,CACf,KAAK,EAAE,eAAe,EAAE,GACvB,OAAO,CAAC,0BAA0B,CAAC;YA8BxB,6BAA6B;YA8I7B,qBAAqB;YAiDrB,eAAe;cA2Db,eAAe,CAC7B,EAAE,EAAE,kBAAkB,EACtB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,kBAAkB,CAAC,EAAE,kBAAkB,EACvC,SAAS,CAAC,EAAE,kBAAkB;CAwDjC"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"transactionUtils.d.ts","sourceRoot":"","sources":["../../../src/services/transactions/transactionUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AAKxE,OAAO,EAIL,kBAAkB,EAClB,GAAG,EAGJ,MAAM,0BAA0B,CAAC;AAiBlC,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;
|
1
|
+
{"version":3,"file":"transactionUtils.d.ts","sourceRoot":"","sources":["../../../src/services/transactions/transactionUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AAKxE,OAAO,EAIL,kBAAkB,EAClB,GAAG,EAGJ,MAAM,0BAA0B,CAAC;AAiBlC,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AA4BjE,OAAO,EAAE,qBAAqB,EAAyB,MAAM,aAAa,CAAC;AAwL3E,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,kBAAkB,EACtB,sBAAsB,EAAE,MAAM,EAAE,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAyF7B;AA+LD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,kBAAkB,GACrB,OAAO,CAAC,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CA0BnD;AAED,wBAAsB,gCAAgC,CACpD,eAAe,EAAE,oBAAoB,EACrC,YAAY,EAAE,SAAS,EACvB,eAAe,EAAE,SAAS,GACzB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAuC5C;AAED,wBAAgB,YAAY,CAC1B,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,kBAAkB,EAAE,EACzB,KAAK,EAAE,KAAK,EACZ,oBAAoB,CAAC,EAAE,OAAO;;;;EAuH/B"}
|
@@ -212,7 +212,7 @@ function getSolautoActions(umi, tx) {
|
|
212
212
|
const discriminator = (0, utils_1.uint8ArrayToBigInt)(serializer
|
213
213
|
.serialize({
|
214
214
|
amount: 0,
|
215
|
-
depositUpToLimit: true
|
215
|
+
depositUpToLimit: true,
|
216
216
|
})
|
217
217
|
.slice(0, 8));
|
218
218
|
const [data, _] = serializer.deserialize(x.data);
|
@@ -347,17 +347,20 @@ function getErrorInfo(umi, txs, error, simulationSuccessful) {
|
|
347
347
|
let errIxIdx;
|
348
348
|
let errCode;
|
349
349
|
let errName;
|
350
|
-
|
350
|
+
// sub ixs to account for computeUnitLimit and computeUnitPrice that get added
|
351
|
+
const getComputeIxs = (txIdx) => (0, utils_1.addTxOptimizations)(umi, txs[txIdx], 1, !simulationSuccessful ? 1 : undefined).getInstructions().length - txs.length;
|
351
352
|
try {
|
352
353
|
if (error instanceof types_1.BundleSimulationError) {
|
353
354
|
errTxIdx = error.details.transactionIdx;
|
354
|
-
errIxIdx =
|
355
|
+
errIxIdx =
|
356
|
+
error.details.instructionIdx -
|
357
|
+
getComputeIxs(error.details.transactionIdx);
|
355
358
|
errCode = error.details.errorCode;
|
356
359
|
}
|
357
360
|
else if (typeof error === "object" &&
|
358
361
|
error["InstructionError"]) {
|
359
362
|
const err = error["InstructionError"];
|
360
|
-
errIxIdx = err[0] -
|
363
|
+
errIxIdx = err[0] - getComputeIxs(0);
|
361
364
|
errCode =
|
362
365
|
typeof err[1] === "object" && "Custom" in err[1]
|
363
366
|
? err[1]["Custom"]
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"switchboardUtils.d.ts","sourceRoot":"","sources":["../../src/utils/switchboardUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,SAAS,EAGV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,MAAM,EAAsB,MAAM,0BAA0B,CAAC;AAGtE,OAAO,KAAK,QAAQ,MAAM,4BAA4B,CAAC;AAIvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAOjD,wBAAgB,WAAW,CACzB,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,SAAS,EACf,MAAM,CAAC,EAAE,SAAS,qBAuBnB;AAED,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,SAAS,GACd,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,
|
1
|
+
{"version":3,"file":"switchboardUtils.d.ts","sourceRoot":"","sources":["../../src/utils/switchboardUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,SAAS,EAGV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,MAAM,EAAsB,MAAM,0BAA0B,CAAC;AAGtE,OAAO,KAAK,QAAQ,MAAM,4BAA4B,CAAC;AAIvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAOjD,wBAAgB,WAAW,CACzB,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,SAAS,EACf,MAAM,CAAC,EAAE,SAAS,qBAuBnB;AAED,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,SAAS,GACd,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAkC5C;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,SAAS,EAAE,GACjB,OAAO,CAAC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,EAAE,CAAC,CAuB/D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,WAEzD"}
|
@@ -52,10 +52,16 @@ function getPullFeed(conn, mint, wallet) {
|
|
52
52
|
}
|
53
53
|
async function buildSwbSubmitResponseTx(conn, signer, mint) {
|
54
54
|
const feed = getPullFeed(conn, mint, (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(signer.publicKey));
|
55
|
-
const [pullIx, responses] = await (0, generalUtils_1.retryWithExponentialBackoff)(async () =>
|
56
|
-
|
57
|
-
|
58
|
-
|
55
|
+
const [pullIx, responses] = await (0, generalUtils_1.retryWithExponentialBackoff)(async () => {
|
56
|
+
const res = await feed.fetchUpdateIx({
|
57
|
+
chain: "solana",
|
58
|
+
network: "mainnet-beta",
|
59
|
+
});
|
60
|
+
if (!res[1] || !res[1][0].value) {
|
61
|
+
throw new Error("Unable to fetch Switchboard pull IX");
|
62
|
+
}
|
63
|
+
return res;
|
64
|
+
}, 3, 200);
|
59
65
|
if (!pullIx) {
|
60
66
|
throw new Error("Unable to fetch SWB crank IX");
|
61
67
|
}
|
package/local/txSandbox.ts
CHANGED
@@ -10,6 +10,7 @@ import {
|
|
10
10
|
getBatches,
|
11
11
|
getClient,
|
12
12
|
getLiqUtilzationRateBps,
|
13
|
+
getMaxLiqUtilizationRateBps,
|
13
14
|
getPositionExBulk,
|
14
15
|
getSolanaRpcConnection,
|
15
16
|
getSolautoManagedPositions,
|
@@ -88,7 +89,17 @@ export async function main() {
|
|
88
89
|
34.328721976 * supplyWeight,
|
89
90
|
23.575158311 * debtWeight
|
90
91
|
);
|
92
|
+
console.log(
|
93
|
+
getLiqUtilzationRateBps(
|
94
|
+
34.265152701,
|
95
|
+
23.530695876,
|
96
|
+
client.pos.state.liqThresholdBps
|
97
|
+
),
|
98
|
+
34.265152701 * supplyWeight,
|
99
|
+
23.530695876 * debtWeight
|
100
|
+
);
|
91
101
|
console.log(client.pos.maxBoostToBps);
|
102
|
+
console.log(getMaxLiqUtilizationRateBps(client.pos.state.maxLtvBps, client.pos.state.liqThresholdBps, 0));
|
92
103
|
|
93
104
|
// const debtBank = await fetchBank(
|
94
105
|
// umi,
|
package/package.json
CHANGED
@@ -91,18 +91,15 @@ export class RebalanceTxBuilder {
|
|
91
91
|
const liquidityUsd =
|
92
92
|
fromBaseUnit(liquidityAvailable, tokenInfo(tokenMint).decimals) *
|
93
93
|
(safeGetPrice(tokenMint) ?? 0);
|
94
|
-
consoleLog(liquidityUsd);
|
95
94
|
return amountNeededUsd > liquidityUsd * 0.95;
|
96
95
|
};
|
97
96
|
|
98
|
-
consoleLog("Supply liquidity available:", supplyLiquidityAvailable);
|
99
97
|
const insufficientSupplyLiquidity = insufficientLiquidity(
|
100
98
|
debtAdjustmentUsd,
|
101
99
|
supplyLiquidityAvailable,
|
102
100
|
this.client.pos.supplyMint
|
103
101
|
);
|
104
102
|
|
105
|
-
consoleLog("Debt liquidity available:", debtLiquidityAvailable);
|
106
103
|
const insufficientDebtLiquidity = insufficientLiquidity(
|
107
104
|
debtAdjustmentUsd,
|
108
105
|
debtLiquidityAvailable,
|
@@ -172,7 +169,6 @@ export class RebalanceTxBuilder {
|
|
172
169
|
);
|
173
170
|
|
174
171
|
if (stdFlLiquiditySource === undefined || this.optimizeSize) {
|
175
|
-
consoleLog("Checking signer liquidity");
|
176
172
|
const { supplyBalance, debtBalance } = await this.client.signerBalances();
|
177
173
|
const signerFlLiquiditySource = this.getFlLiquiditySource(
|
178
174
|
supplyBalance,
|
@@ -344,6 +340,11 @@ export class RebalanceTxBuilder {
|
|
344
340
|
priceType: this.priceType,
|
345
341
|
};
|
346
342
|
consoleLog("Rebalance details:", rebalanceDetails);
|
343
|
+
consoleLog(
|
344
|
+
"Prices:",
|
345
|
+
safeGetPrice(this.client.pos.supplyMint, this.priceType),
|
346
|
+
safeGetPrice(this.client.pos.debtMint, this.priceType)
|
347
|
+
);
|
347
348
|
|
348
349
|
const firstRebalance = this.client.rebalanceIx(
|
349
350
|
RebalanceStep.PreSwap,
|
@@ -40,6 +40,7 @@ import {
|
|
40
40
|
getTokenAccount,
|
41
41
|
getTokenAccountData,
|
42
42
|
isMarginfiClient,
|
43
|
+
addTxOptimizations,
|
43
44
|
} from "../../utils";
|
44
45
|
import {
|
45
46
|
createMarginfiProgram,
|
@@ -417,7 +418,7 @@ function getSolautoActions(umi: Umi, tx: TransactionBuilder): SolautoAction[] {
|
|
417
418
|
serializer
|
418
419
|
.serialize({
|
419
420
|
amount: 0,
|
420
|
-
depositUpToLimit: true
|
421
|
+
depositUpToLimit: true,
|
421
422
|
})
|
422
423
|
.slice(0, 8)
|
423
424
|
);
|
@@ -614,12 +615,21 @@ export function getErrorInfo(
|
|
614
615
|
let errCode: number | undefined;
|
615
616
|
let errName: string | undefined;
|
616
617
|
|
617
|
-
|
618
|
+
// sub ixs to account for computeUnitLimit and computeUnitPrice that get added
|
619
|
+
const getComputeIxs = (txIdx: number) =>
|
620
|
+
addTxOptimizations(
|
621
|
+
umi,
|
622
|
+
txs[txIdx],
|
623
|
+
1,
|
624
|
+
!simulationSuccessful ? 1 : undefined
|
625
|
+
).getInstructions().length - txs.length;
|
618
626
|
|
619
627
|
try {
|
620
628
|
if (error instanceof BundleSimulationError) {
|
621
629
|
errTxIdx = error.details.transactionIdx;
|
622
|
-
errIxIdx =
|
630
|
+
errIxIdx =
|
631
|
+
error.details.instructionIdx -
|
632
|
+
getComputeIxs(error.details.transactionIdx);
|
623
633
|
errCode = error.details.errorCode;
|
624
634
|
} else if (
|
625
635
|
typeof error === "object" &&
|
@@ -627,7 +637,7 @@ export function getErrorInfo(
|
|
627
637
|
) {
|
628
638
|
const err = (error as any)["InstructionError"];
|
629
639
|
|
630
|
-
errIxIdx = err[0] -
|
640
|
+
errIxIdx = err[0] - getComputeIxs(0);
|
631
641
|
errCode =
|
632
642
|
typeof err[1] === "object" && "Custom" in err[1]
|
633
643
|
? err[1]["Custom"]
|