@gearbox-protocol/sdk 13.3.3 → 13.4.0-beta.2
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/cjs/permissionless/utils/price-update/get-price-update-tx.js +3 -15
- package/dist/cjs/sdk/GearboxSDK.js +135 -20
- package/dist/cjs/sdk/accounts/AbstractCreditAccountsService.js +196 -340
- package/dist/cjs/sdk/accounts/CreditAccountsServiceV310.js +30 -35
- package/dist/cjs/sdk/accounts/multicall-utils.js +91 -0
- package/dist/cjs/sdk/base/BaseContract.js +26 -6
- package/dist/cjs/sdk/base/ChainContractsRegister.js +39 -2
- package/dist/cjs/sdk/base/Construct.js +15 -3
- package/dist/cjs/sdk/base/TokensMeta.js +23 -0
- package/dist/cjs/sdk/constants/address-provider.js +0 -22
- package/dist/cjs/sdk/core/AbstractAddressProviderContract.js +15 -0
- package/dist/cjs/sdk/market/MarketRegister.js +74 -3
- package/dist/cjs/sdk/market/credit/CreditFacadeV310Contract.js +6 -0
- package/dist/cjs/sdk/market/oracle/PriceOracleBaseContract.js +31 -50
- package/dist/cjs/sdk/market/pricefeeds/PriceFeedRef.js +16 -0
- package/dist/cjs/sdk/market/pricefeeds/PriceFeedsRegister.js +55 -12
- package/dist/cjs/sdk/options.js +30 -24
- package/dist/cjs/sdk/plugins/BasePlugin.js +24 -0
- package/dist/cjs/sdk/pools/AbstractPoolService.js +6 -0
- package/dist/cjs/sdk/router/AbstractRouterContract.js +4 -1
- package/dist/cjs/sdk/router/RouterV310Contract.js +20 -15
- package/dist/cjs/sdk/utils/AddressMap.js +53 -17
- package/dist/cjs/sdk/utils/AddressSet.js +9 -0
- package/dist/esm/permissionless/utils/price-update/get-price-update-tx.js +6 -20
- package/dist/esm/sdk/GearboxSDK.js +135 -20
- package/dist/esm/sdk/accounts/AbstractCreditAccountsService.js +204 -342
- package/dist/esm/sdk/accounts/CreditAccountsServiceV310.js +30 -35
- package/dist/esm/sdk/accounts/multicall-utils.js +69 -0
- package/dist/esm/sdk/base/BaseContract.js +26 -6
- package/dist/esm/sdk/base/ChainContractsRegister.js +39 -2
- package/dist/esm/sdk/base/Construct.js +15 -3
- package/dist/esm/sdk/base/TokensMeta.js +23 -0
- package/dist/esm/sdk/constants/address-provider.js +0 -21
- package/dist/esm/sdk/core/AbstractAddressProviderContract.js +15 -0
- package/dist/esm/sdk/market/MarketRegister.js +74 -3
- package/dist/esm/sdk/market/credit/CreditFacadeV310Contract.js +6 -0
- package/dist/esm/sdk/market/oracle/PriceOracleBaseContract.js +31 -50
- package/dist/esm/sdk/market/pricefeeds/PriceFeedRef.js +16 -0
- package/dist/esm/sdk/market/pricefeeds/PriceFeedsRegister.js +55 -12
- package/dist/esm/sdk/options.js +30 -24
- package/dist/esm/sdk/plugins/BasePlugin.js +24 -0
- package/dist/esm/sdk/pools/AbstractPoolService.js +6 -0
- package/dist/esm/sdk/router/AbstractRouterContract.js +4 -1
- package/dist/esm/sdk/router/RouterV310Contract.js +20 -15
- package/dist/esm/sdk/utils/AddressMap.js +53 -17
- package/dist/esm/sdk/utils/AddressSet.js +9 -0
- package/dist/types/permissionless/bindings/price-feed-store.d.ts +1 -2
- package/dist/types/permissionless/bindings/types.d.ts +0 -4
- package/dist/types/permissionless/utils/price-update/get-price-update-tx.d.ts +1 -3
- package/dist/types/sdk/GearboxSDK.d.ts +236 -34
- package/dist/types/sdk/accounts/AbstractCreditAccountsService.d.ts +92 -147
- package/dist/types/sdk/accounts/CreditAccountsServiceV310.d.ts +14 -5
- package/dist/types/sdk/accounts/multicall-utils.d.ts +39 -0
- package/dist/types/sdk/accounts/types.d.ts +237 -40
- package/dist/types/sdk/base/BaseContract.d.ts +67 -6
- package/dist/types/sdk/base/ChainContractsRegister.d.ts +51 -2
- package/dist/types/sdk/base/Construct.d.ts +31 -0
- package/dist/types/sdk/base/PlaceholderContract.d.ts +3 -0
- package/dist/types/sdk/base/SDKConstruct.d.ts +10 -0
- package/dist/types/sdk/base/TokensMeta.d.ts +59 -2
- package/dist/types/sdk/base/types.d.ts +185 -25
- package/dist/types/sdk/chain/chains.d.ts +78 -18
- package/dist/types/sdk/chain/detectNetwork.d.ts +7 -0
- package/dist/types/sdk/constants/address-provider.d.ts +4 -3
- package/dist/types/sdk/core/AbstractAddressProviderContract.d.ts +23 -0
- package/dist/types/sdk/core/types.d.ts +46 -0
- package/dist/types/sdk/market/MarketRegister.d.ts +81 -0
- package/dist/types/sdk/market/adapters/PlaceholderAdapterContracts.d.ts +3 -0
- package/dist/types/sdk/market/credit/CreditFacadeV310Contract.d.ts +1 -0
- package/dist/types/sdk/market/oracle/PriceOracleBaseContract.d.ts +40 -50
- package/dist/types/sdk/market/oracle/types.d.ts +78 -59
- package/dist/types/sdk/market/pricefeeds/AbstractLPPriceFeed.d.ts +3 -0
- package/dist/types/sdk/market/pricefeeds/AbstractPriceFeed.d.ts +3 -0
- package/dist/types/sdk/market/pricefeeds/PriceFeedRef.d.ts +22 -2
- package/dist/types/sdk/market/pricefeeds/PriceFeedsRegister.d.ts +80 -16
- package/dist/types/sdk/market/pricefeeds/getRawPriceUpdates.d.ts +2 -2
- package/dist/types/sdk/market/pricefeeds/types.d.ts +75 -11
- package/dist/types/sdk/options.d.ts +13 -4
- package/dist/types/sdk/plugins/BasePlugin.d.ts +39 -0
- package/dist/types/sdk/plugins/types.d.ts +73 -43
- package/dist/types/sdk/pools/AbstractPoolService.d.ts +12 -0
- package/dist/types/sdk/pools/types.d.ts +75 -6
- package/dist/types/sdk/router/AbstractRouterContract.d.ts +21 -2
- package/dist/types/sdk/router/RouterV310Contract.d.ts +27 -15
- package/dist/types/sdk/router/types.d.ts +47 -70
- package/dist/types/sdk/types/state.d.ts +32 -3
- package/dist/types/sdk/utils/AddressMap.d.ts +61 -17
- package/dist/types/sdk/utils/AddressSet.d.ts +15 -0
- package/package.json +4 -2
|
@@ -10,9 +10,6 @@ import { simulateWithPriceUpdates } from "../utils/viem/index.js";
|
|
|
10
10
|
import { MarketConfiguratorContract } from "./MarketConfiguratorContract.js";
|
|
11
11
|
import { MarketSuite } from "./MarketSuite.js";
|
|
12
12
|
class MarketRegister extends SDKConstruct {
|
|
13
|
-
/**
|
|
14
|
-
* Mapping pool.address -> MarketSuite
|
|
15
|
-
*/
|
|
16
13
|
#markets = new AddressMap(void 0, "markets");
|
|
17
14
|
#marketFilter;
|
|
18
15
|
#marketConfigurators = new AddressMap(
|
|
@@ -20,12 +17,21 @@ class MarketRegister extends SDKConstruct {
|
|
|
20
17
|
"marketConfigurators"
|
|
21
18
|
);
|
|
22
19
|
#ignoreMarkets;
|
|
20
|
+
/**
|
|
21
|
+
* @param sdk - Top-level SDK instance.
|
|
22
|
+
* @param ignoreMarkets - Pool addresses of markets to exclude from loading.
|
|
23
|
+
**/
|
|
23
24
|
constructor(sdk, ignoreMarkets = []) {
|
|
24
25
|
super(sdk);
|
|
25
26
|
this.#ignoreMarkets = new Set(
|
|
26
27
|
ignoreMarkets.map((m) => m.toLowerCase())
|
|
27
28
|
);
|
|
28
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* Restores market state from a previously serialized snapshot,
|
|
32
|
+
* bypassing on-chain reads.
|
|
33
|
+
* @param state - Array of market data snapshots.
|
|
34
|
+
**/
|
|
29
35
|
hydrate(state) {
|
|
30
36
|
this.#markets.clear();
|
|
31
37
|
const configurators = new Set(state.map((m) => m.configurator));
|
|
@@ -44,6 +50,13 @@ class MarketRegister extends SDKConstruct {
|
|
|
44
50
|
);
|
|
45
51
|
}
|
|
46
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* Fetches all markets from the on-chain for the given market configurators.
|
|
55
|
+
*
|
|
56
|
+
* @param marketConfigurators - Addresses of market configurator contracts to query.
|
|
57
|
+
* @param ignoreUpdateablePrices - When `true`, skips generating off-chain
|
|
58
|
+
* price updates before loading
|
|
59
|
+
**/
|
|
47
60
|
async loadMarkets(marketConfigurators, ignoreUpdateablePrices) {
|
|
48
61
|
if (!marketConfigurators.length) {
|
|
49
62
|
this.logger?.warn(
|
|
@@ -66,6 +79,10 @@ class MarketRegister extends SDKConstruct {
|
|
|
66
79
|
underlying: ADDRESS_0X0
|
|
67
80
|
};
|
|
68
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* The active filter used to scope market compressor queries.
|
|
84
|
+
* @throws If the register has not been hydrated or attached yet.
|
|
85
|
+
**/
|
|
69
86
|
get marketFilter() {
|
|
70
87
|
if (!this.#marketFilter) {
|
|
71
88
|
throw new Error(
|
|
@@ -74,6 +91,15 @@ class MarketRegister extends SDKConstruct {
|
|
|
74
91
|
}
|
|
75
92
|
return this.#marketFilter;
|
|
76
93
|
}
|
|
94
|
+
/**
|
|
95
|
+
* Re-synchronizes market state with the chain. If during sdk synchronization
|
|
96
|
+
* we detected that some markets or market configurators were changed,
|
|
97
|
+
* we reload everything.
|
|
98
|
+
*
|
|
99
|
+
* Otherwise only prices are refreshed.
|
|
100
|
+
*
|
|
101
|
+
* @param ignoreUpdateablePrices - When `true`, skips off-chain price updates.
|
|
102
|
+
**/
|
|
77
103
|
async syncState(ignoreUpdateablePrices) {
|
|
78
104
|
const dirty = this.markets.some((m) => m.dirty) || this.marketConfigurators.some((c) => c.dirty);
|
|
79
105
|
if (dirty) {
|
|
@@ -184,26 +210,50 @@ class MarketRegister extends SDKConstruct {
|
|
|
184
210
|
...this.marketFilter.configurators
|
|
185
211
|
]);
|
|
186
212
|
}
|
|
213
|
+
/**
|
|
214
|
+
* Serializable snapshot of all loaded markets, suitable for hydration.
|
|
215
|
+
**/
|
|
187
216
|
get state() {
|
|
188
217
|
return this.markets.map((market) => market.state);
|
|
189
218
|
}
|
|
219
|
+
/**
|
|
220
|
+
* Returns a human-readable snapshot of all markets.
|
|
221
|
+
* @param raw - When `true`, includes raw/unformatted values.
|
|
222
|
+
**/
|
|
190
223
|
stateHuman(raw = true) {
|
|
191
224
|
return {
|
|
192
225
|
markets: this.markets.map((market) => market.stateHuman(raw))
|
|
193
226
|
};
|
|
194
227
|
}
|
|
228
|
+
/**
|
|
229
|
+
* All pool suites across loaded markets.
|
|
230
|
+
**/
|
|
195
231
|
get pools() {
|
|
196
232
|
return this.markets.map((market) => market.pool);
|
|
197
233
|
}
|
|
234
|
+
/**
|
|
235
|
+
* All price oracles across loaded markets.
|
|
236
|
+
**/
|
|
198
237
|
get priceOracles() {
|
|
199
238
|
return this.markets.map((market) => market.priceOracle);
|
|
200
239
|
}
|
|
240
|
+
/**
|
|
241
|
+
* All credit manager suites across loaded markets.
|
|
242
|
+
**/
|
|
201
243
|
get creditManagers() {
|
|
202
244
|
return this.markets.flatMap((market) => market.creditManagers);
|
|
203
245
|
}
|
|
246
|
+
/**
|
|
247
|
+
* All known market configurator contracts.
|
|
248
|
+
**/
|
|
204
249
|
get marketConfigurators() {
|
|
205
250
|
return this.#marketConfigurators.values();
|
|
206
251
|
}
|
|
252
|
+
/**
|
|
253
|
+
* Finds a credit manager suite by its on-chain address.
|
|
254
|
+
* @param creditManager - Credit manager contract address.
|
|
255
|
+
* @throws If no loaded market contains the given credit manager.
|
|
256
|
+
**/
|
|
207
257
|
findCreditManager(creditManager) {
|
|
208
258
|
const addr = creditManager.toLowerCase();
|
|
209
259
|
for (const market of this.markets) {
|
|
@@ -215,6 +265,11 @@ class MarketRegister extends SDKConstruct {
|
|
|
215
265
|
}
|
|
216
266
|
throw new Error(`cannot find credit manager ${creditManager}`);
|
|
217
267
|
}
|
|
268
|
+
/**
|
|
269
|
+
* Finds the market that contains the given credit manager.
|
|
270
|
+
* @param creditManager - Credit manager contract address.
|
|
271
|
+
* @throws If no loaded market contains the given credit manager.
|
|
272
|
+
**/
|
|
218
273
|
findByCreditManager(creditManager) {
|
|
219
274
|
const addr = creditManager.toLowerCase();
|
|
220
275
|
const market = this.markets.find(
|
|
@@ -227,6 +282,11 @@ class MarketRegister extends SDKConstruct {
|
|
|
227
282
|
}
|
|
228
283
|
return market;
|
|
229
284
|
}
|
|
285
|
+
/**
|
|
286
|
+
* Finds the market that uses the given price oracle.
|
|
287
|
+
* @param address - Price oracle contract address.
|
|
288
|
+
* @throws If no loaded market uses the given oracle.
|
|
289
|
+
**/
|
|
230
290
|
findByPriceOracle(address) {
|
|
231
291
|
const addr = address.toLowerCase();
|
|
232
292
|
for (const market of this.markets) {
|
|
@@ -236,6 +296,11 @@ class MarketRegister extends SDKConstruct {
|
|
|
236
296
|
}
|
|
237
297
|
throw new Error(`cannot find market for price oracle ${address}`);
|
|
238
298
|
}
|
|
299
|
+
/**
|
|
300
|
+
* Finds the market associated with the given pool.
|
|
301
|
+
* @param address - Pool contract address.
|
|
302
|
+
* @throws If no loaded market uses the given pool.
|
|
303
|
+
**/
|
|
239
304
|
findByPool(address) {
|
|
240
305
|
const addr = address.toLowerCase();
|
|
241
306
|
for (const market of this.markets) {
|
|
@@ -245,9 +310,15 @@ class MarketRegister extends SDKConstruct {
|
|
|
245
310
|
}
|
|
246
311
|
throw new Error(`cannot find market for pool ${address}`);
|
|
247
312
|
}
|
|
313
|
+
/**
|
|
314
|
+
* Underlying address map of pool address to market suite
|
|
315
|
+
**/
|
|
248
316
|
get marketsMap() {
|
|
249
317
|
return this.#markets;
|
|
250
318
|
}
|
|
319
|
+
/**
|
|
320
|
+
* All loaded market suites.
|
|
321
|
+
**/
|
|
251
322
|
get markets() {
|
|
252
323
|
return this.#markets.values();
|
|
253
324
|
}
|
|
@@ -72,6 +72,12 @@ class CreditFacadeV310Contract extends CreditFacadeV310BaseContract {
|
|
|
72
72
|
args: [ca, calls]
|
|
73
73
|
});
|
|
74
74
|
}
|
|
75
|
+
botMulticall(ca, calls) {
|
|
76
|
+
return this.createRawTx({
|
|
77
|
+
functionName: "botMulticall",
|
|
78
|
+
args: [ca, calls]
|
|
79
|
+
});
|
|
80
|
+
}
|
|
75
81
|
openCreditAccount(to, calls, referralCode) {
|
|
76
82
|
return this.createRawTx({
|
|
77
83
|
functionName: "openCreditAccount",
|
|
@@ -13,26 +13,26 @@ const ZERO_PRICE_FEED = stringToHex("PRICE_FEED::ZERO", { size: 32 });
|
|
|
13
13
|
class PriceOracleBaseContract extends BaseContract {
|
|
14
14
|
sdk;
|
|
15
15
|
/**
|
|
16
|
-
*
|
|
17
|
-
|
|
16
|
+
* {@inheritDoc IPriceOracleContract.mainPriceFeeds}
|
|
17
|
+
**/
|
|
18
18
|
mainPriceFeeds = new AddressMap(
|
|
19
19
|
void 0,
|
|
20
20
|
"mainPriceFeeds"
|
|
21
21
|
);
|
|
22
22
|
/**
|
|
23
|
-
*
|
|
24
|
-
|
|
23
|
+
* {@inheritDoc IPriceOracleContract.reservePriceFeeds}
|
|
24
|
+
**/
|
|
25
25
|
reservePriceFeeds = new AddressMap(
|
|
26
26
|
void 0,
|
|
27
27
|
"reservePriceFeeds"
|
|
28
28
|
);
|
|
29
29
|
/**
|
|
30
|
-
*
|
|
31
|
-
|
|
30
|
+
* {@inheritDoc IPriceOracleContract.mainPrices}
|
|
31
|
+
**/
|
|
32
32
|
mainPrices = new PriceFeedAnswerMap(void 0, "mainPrices");
|
|
33
33
|
/**
|
|
34
|
-
*
|
|
35
|
-
|
|
34
|
+
* {@inheritDoc IPriceOracleContract.reservePrices}
|
|
35
|
+
**/
|
|
36
36
|
reservePrices = new PriceFeedAnswerMap(
|
|
37
37
|
void 0,
|
|
38
38
|
"reservePrices"
|
|
@@ -48,11 +48,8 @@ class PriceOracleBaseContract extends BaseContract {
|
|
|
48
48
|
this.#loadState(priceFeedMap, priceFeedTree);
|
|
49
49
|
}
|
|
50
50
|
/**
|
|
51
|
-
*
|
|
52
|
-
|
|
53
|
-
* @param opts Option to include main/reserve feeds only, defaults to both
|
|
54
|
-
* @returns
|
|
55
|
-
*/
|
|
51
|
+
* {@inheritDoc IPriceOracleContract.priceFeedsForTokens}
|
|
52
|
+
**/
|
|
56
53
|
priceFeedsForTokens(tokens, opts) {
|
|
57
54
|
const main = opts?.main ?? true;
|
|
58
55
|
const reserve = opts?.reserve ?? true;
|
|
@@ -62,39 +59,26 @@ class PriceOracleBaseContract extends BaseContract {
|
|
|
62
59
|
]).filter((f) => !!f);
|
|
63
60
|
}
|
|
64
61
|
/**
|
|
65
|
-
*
|
|
66
|
-
|
|
67
|
-
* @param token
|
|
68
|
-
* @returns
|
|
69
|
-
*/
|
|
62
|
+
* {@inheritDoc IPriceOracleContract.mainPrice}
|
|
63
|
+
**/
|
|
70
64
|
mainPrice(token) {
|
|
71
65
|
return this.mainPrices.price(token);
|
|
72
66
|
}
|
|
73
67
|
/**
|
|
74
|
-
*
|
|
75
|
-
|
|
76
|
-
* @param token
|
|
77
|
-
* @returns
|
|
78
|
-
*/
|
|
68
|
+
* {@inheritDoc IPriceOracleContract.reservePrice}
|
|
69
|
+
**/
|
|
79
70
|
reservePrice(token) {
|
|
80
71
|
return this.reservePrices.price(token);
|
|
81
72
|
}
|
|
82
73
|
/**
|
|
83
|
-
*
|
|
84
|
-
|
|
85
|
-
* @param priceFeed
|
|
86
|
-
* @returns
|
|
87
|
-
*/
|
|
74
|
+
* {@inheritDoc IPriceOracleContract.usesPriceFeed}
|
|
75
|
+
**/
|
|
88
76
|
usesPriceFeed(priceFeed) {
|
|
89
77
|
return this.#priceFeedTree.has(priceFeed);
|
|
90
78
|
}
|
|
91
79
|
/**
|
|
92
|
-
*
|
|
93
|
-
|
|
94
|
-
* @param to
|
|
95
|
-
* @param amount
|
|
96
|
-
* @param reserve use reserve price feed instead of main
|
|
97
|
-
*/
|
|
80
|
+
* {@inheritDoc IPriceOracleContract.convert}
|
|
81
|
+
**/
|
|
98
82
|
convert(from, to, amount, reserve = false) {
|
|
99
83
|
if (from === to) {
|
|
100
84
|
return amount;
|
|
@@ -106,11 +90,8 @@ class PriceOracleBaseContract extends BaseContract {
|
|
|
106
90
|
return amount * fromPrice * toScale / (toPrice * fromScale);
|
|
107
91
|
}
|
|
108
92
|
/**
|
|
109
|
-
*
|
|
110
|
-
|
|
111
|
-
* @param amount
|
|
112
|
-
* @param reserve use reserve price feed instead of main
|
|
113
|
-
*/
|
|
93
|
+
* {@inheritDoc IPriceOracleContract.convertToUSD}
|
|
94
|
+
**/
|
|
114
95
|
convertToUSD(from, amount, reserve = false) {
|
|
115
96
|
if (amount === 0n) {
|
|
116
97
|
return 0n;
|
|
@@ -120,11 +101,8 @@ class PriceOracleBaseContract extends BaseContract {
|
|
|
120
101
|
return amount * price / scale;
|
|
121
102
|
}
|
|
122
103
|
/**
|
|
123
|
-
*
|
|
124
|
-
|
|
125
|
-
* @param amount
|
|
126
|
-
* @param reserve use reserve price feed instead of main
|
|
127
|
-
*/
|
|
104
|
+
* {@inheritDoc IPriceOracleContract.convertFromUSD}
|
|
105
|
+
**/
|
|
128
106
|
convertFromUSD(to, amount, reserve = false) {
|
|
129
107
|
if (amount === 0n) {
|
|
130
108
|
return 0n;
|
|
@@ -134,14 +112,14 @@ class PriceOracleBaseContract extends BaseContract {
|
|
|
134
112
|
return amount * scale / price;
|
|
135
113
|
}
|
|
136
114
|
/**
|
|
137
|
-
*
|
|
138
|
-
|
|
115
|
+
* {@inheritDoc IPriceOracleContract.priceFeeds}
|
|
116
|
+
**/
|
|
139
117
|
get priceFeeds() {
|
|
140
118
|
return this.#priceFeedTree.values().map((node) => this.sdk.priceFeeds.mustGet(node.baseParams.addr));
|
|
141
119
|
}
|
|
142
120
|
/**
|
|
143
|
-
*
|
|
144
|
-
|
|
121
|
+
* {@inheritDoc IPriceOracleContract.syncStateMulticall}
|
|
122
|
+
**/
|
|
145
123
|
syncStateMulticall() {
|
|
146
124
|
const args = [this.address];
|
|
147
125
|
const [address] = this.sdk.addressProvider.mustGetLatest(
|
|
@@ -207,11 +185,14 @@ class PriceOracleBaseContract extends BaseContract {
|
|
|
207
185
|
});
|
|
208
186
|
}
|
|
209
187
|
/**
|
|
210
|
-
*
|
|
211
|
-
|
|
188
|
+
* {@inheritDoc IPriceOracleContract.watchAddresses}
|
|
189
|
+
**/
|
|
212
190
|
get watchAddresses() {
|
|
213
191
|
return /* @__PURE__ */ new Set([this.address]);
|
|
214
192
|
}
|
|
193
|
+
/**
|
|
194
|
+
* {@inheritDoc IPriceOracleContract.stateHuman}
|
|
195
|
+
**/
|
|
215
196
|
stateHuman(raw = true) {
|
|
216
197
|
return {
|
|
217
198
|
...super.stateHuman(raw),
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import { Construct } from "../../base/index.js";
|
|
2
2
|
import { formatDuration } from "../../utils/index.js";
|
|
3
3
|
class PriceFeedRef extends Construct {
|
|
4
|
+
/**
|
|
5
|
+
* On-chain address of the referenced price feed contract.
|
|
6
|
+
**/
|
|
4
7
|
address;
|
|
8
|
+
/**
|
|
9
|
+
* Maximum allowed age (in seconds) of the feed's answer before the
|
|
10
|
+
* oracle considers it stale.
|
|
11
|
+
**/
|
|
5
12
|
stalenessPeriod;
|
|
6
13
|
#priceFeed;
|
|
7
14
|
constructor(options, address, stalenessPeriod) {
|
|
@@ -9,6 +16,10 @@ class PriceFeedRef extends Construct {
|
|
|
9
16
|
this.address = address;
|
|
10
17
|
this.stalenessPeriod = stalenessPeriod;
|
|
11
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Lazily resolved price feed contract instance.
|
|
21
|
+
* @throws If the feed is not registered in the contracts register.
|
|
22
|
+
**/
|
|
12
23
|
get priceFeed() {
|
|
13
24
|
if (!this.#priceFeed) {
|
|
14
25
|
this.#priceFeed = this.register.mustGetContract(
|
|
@@ -17,6 +28,11 @@ class PriceFeedRef extends Construct {
|
|
|
17
28
|
}
|
|
18
29
|
return this.#priceFeed;
|
|
19
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* Returns a human-readable snapshot of the feed state, including the
|
|
33
|
+
* staleness period formatted as a duration string.
|
|
34
|
+
* @param raw - When `true`, includes raw/unformatted values.
|
|
35
|
+
**/
|
|
20
36
|
stateHuman(raw = true) {
|
|
21
37
|
return {
|
|
22
38
|
...this.priceFeed.stateHuman(raw),
|
|
@@ -33,17 +33,29 @@ import { YearnPriceFeedContract } from "./YearnPriceFeed.js";
|
|
|
33
33
|
import { ZeroPriceFeedContract } from "./ZeroPriceFeed.js";
|
|
34
34
|
class PriceFeedRegister extends SDKConstruct {
|
|
35
35
|
#hooks = new Hooks();
|
|
36
|
+
#updaters;
|
|
36
37
|
#feeds = new AddressMap(void 0, "priceFeeds");
|
|
37
38
|
#latestUpdate;
|
|
38
|
-
updaters;
|
|
39
39
|
constructor(sdk, opts = {}) {
|
|
40
40
|
super(sdk);
|
|
41
|
-
this
|
|
41
|
+
this.#updaters = [
|
|
42
42
|
new PythUpdater(sdk, opts?.pyth),
|
|
43
43
|
new RedstoneUpdater(sdk, opts?.redstone)
|
|
44
44
|
];
|
|
45
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* @internal
|
|
48
|
+
* Registers a callback for price-feed register lifecycle events.
|
|
49
|
+
* @param event - Event name.
|
|
50
|
+
* @param handler - Callback to invoke.
|
|
51
|
+
**/
|
|
46
52
|
addHook = this.#hooks.addHook.bind(this.#hooks);
|
|
53
|
+
/**
|
|
54
|
+
* @internal
|
|
55
|
+
* Removes a previously registered hook.
|
|
56
|
+
* @param event - Event name.
|
|
57
|
+
* @param handler - Callback to remove.
|
|
58
|
+
**/
|
|
47
59
|
removeHook = this.#hooks.removeHook.bind(this.#hooks);
|
|
48
60
|
/**
|
|
49
61
|
* Returns all price feeds known to sdk
|
|
@@ -52,12 +64,13 @@ class PriceFeedRegister extends SDKConstruct {
|
|
|
52
64
|
return this.#feeds.values();
|
|
53
65
|
}
|
|
54
66
|
/**
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
|
|
67
|
+
* Generates transactions to push fresh off-chain prices to updatable feeds.
|
|
68
|
+
*
|
|
69
|
+
* @param priceFeeds - Top-level price feeds whose updatable dependencies
|
|
70
|
+
* will be resolved, or a filter (`{ main: true }` / `{ reserve: true }`)
|
|
71
|
+
* to gather feeds from all oracles. When omitted, all registered feeds
|
|
72
|
+
* are used.
|
|
73
|
+
**/
|
|
61
74
|
async generatePriceFeedsUpdateTxs(priceFeeds) {
|
|
62
75
|
let updateables = this.#feeds.values();
|
|
63
76
|
let filterRemark = "";
|
|
@@ -78,7 +91,7 @@ class PriceFeedRegister extends SDKConstruct {
|
|
|
78
91
|
timestamp: Math.floor(Date.now() / 1e3)
|
|
79
92
|
};
|
|
80
93
|
const updates = (await Promise.all(
|
|
81
|
-
this
|
|
94
|
+
this.#updaters.map((u) => u.getUpdateTxs(updateables).catch(() => []))
|
|
82
95
|
)).flat();
|
|
83
96
|
let maxTimestamp = 0;
|
|
84
97
|
for (const tx of updates) {
|
|
@@ -128,7 +141,7 @@ class PriceFeedRegister extends SDKConstruct {
|
|
|
128
141
|
});
|
|
129
142
|
}
|
|
130
143
|
/**
|
|
131
|
-
* Similar to {@link generatePriceFeedsUpdateTxs}, but will generate necessary price update transactions for external price feeds
|
|
144
|
+
* Similar to {@link generatePriceFeedsUpdateTxs}, but will generate necessary price update transactions for external price feeds (not known to sdk)
|
|
132
145
|
* This does not add feeds to this register, so they won't be implicitly included in future generatePriceFeedsUpdateTxs calls
|
|
133
146
|
* @param feeds
|
|
134
147
|
* @param block
|
|
@@ -165,12 +178,32 @@ class PriceFeedRegister extends SDKConstruct {
|
|
|
165
178
|
);
|
|
166
179
|
return getRawPriceUpdates(updates);
|
|
167
180
|
}
|
|
181
|
+
/**
|
|
182
|
+
* Checks whether a price feed is already registered at the given address.
|
|
183
|
+
* @param address - On-chain address to look up.
|
|
184
|
+
**/
|
|
168
185
|
has(address) {
|
|
169
186
|
return this.#feeds.has(address);
|
|
170
187
|
}
|
|
188
|
+
/**
|
|
189
|
+
* Returns the cached price feed contract at the given address.
|
|
190
|
+
* @param address - On-chain address to look up.
|
|
191
|
+
* @throws If no feed is registered at that address.
|
|
192
|
+
**/
|
|
171
193
|
mustGet(address) {
|
|
172
194
|
return this.#feeds.mustGet(address);
|
|
173
195
|
}
|
|
196
|
+
/**
|
|
197
|
+
* Inserts or updates a price feed from a full tree node.
|
|
198
|
+
*
|
|
199
|
+
* If a fully loaded feed already exists at the same address, only the
|
|
200
|
+
* answer is refreshed. Otherwise a new contract wrapper is created and
|
|
201
|
+
* cached.
|
|
202
|
+
*
|
|
203
|
+
* @param data - Full price feed tree node from the compressor.
|
|
204
|
+
* @returns The cached (or newly created) feed instance.
|
|
205
|
+
* @throws If the created feed is only partially initialized.
|
|
206
|
+
**/
|
|
174
207
|
upsert(data) {
|
|
175
208
|
const existing = this.#feeds.get(data.baseParams.addr);
|
|
176
209
|
if (existing?.loaded) {
|
|
@@ -217,6 +250,14 @@ class PriceFeedRegister extends SDKConstruct {
|
|
|
217
250
|
);
|
|
218
251
|
return result.map((baseParams) => this.#createUpdatableProxy({ baseParams }));
|
|
219
252
|
}
|
|
253
|
+
/**
|
|
254
|
+
* Instantiates the appropriate price feed contract wrapper based on
|
|
255
|
+
* the `contractType` discriminator in the node's base params.
|
|
256
|
+
*
|
|
257
|
+
* @param data - Partial or full price feed tree node.
|
|
258
|
+
* @returns A new (uncached) feed contract instance.
|
|
259
|
+
* @throws If the contract type is unsupported and strict mode is enabled.
|
|
260
|
+
**/
|
|
220
261
|
create(data) {
|
|
221
262
|
const contractType = bytes32ToString(
|
|
222
263
|
data.baseParams.contractType
|
|
@@ -280,8 +321,10 @@ class PriceFeedRegister extends SDKConstruct {
|
|
|
280
321
|
});
|
|
281
322
|
}
|
|
282
323
|
/**
|
|
283
|
-
*
|
|
284
|
-
|
|
324
|
+
* @internal
|
|
325
|
+
* Diagnostic snapshot of the most recent price-update round, or
|
|
326
|
+
* `undefined` if no updates have been generated yet.
|
|
327
|
+
**/
|
|
285
328
|
get latestUpdate() {
|
|
286
329
|
return this.#latestUpdate;
|
|
287
330
|
}
|
package/dist/esm/sdk/options.js
CHANGED
|
@@ -6,50 +6,56 @@ import {
|
|
|
6
6
|
import { ZodAddress } from "./utils/index.js";
|
|
7
7
|
const SDKOptions = z.object({
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
10
|
-
|
|
9
|
+
* Override address of the Gearbox AddressProvider contract.
|
|
10
|
+
* If not set, uses default universal address provider address {@link ADDRESS_PROVIDER_V310}
|
|
11
|
+
**/
|
|
11
12
|
addressProvider: ZodAddress().optional(),
|
|
12
13
|
/**
|
|
13
|
-
*
|
|
14
|
-
|
|
14
|
+
* Addresses of market configurator contracts to load.
|
|
15
|
+
* If not set, all default market configurators for the chain are loaded
|
|
16
|
+
* (from {@link GearboxChain.defaultMarketConfigurators})
|
|
17
|
+
**/
|
|
15
18
|
marketConfigurators: z.array(ZodAddress()).optional(),
|
|
16
19
|
/**
|
|
17
|
-
*
|
|
18
|
-
|
|
20
|
+
* Pin SDK to a specific block number during attach.
|
|
21
|
+
* When set, all on-chain reads use this block instead of `latest`.
|
|
22
|
+
**/
|
|
19
23
|
blockNumber: z.union([z.bigint().nonnegative(), z.number().int().nonnegative()]).optional(),
|
|
20
24
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
|
|
25
|
+
* Skip fetching updatable price feeds on attach and sync.
|
|
26
|
+
* Speeds up initialisation when prices are not needed.
|
|
27
|
+
**/
|
|
24
28
|
ignoreUpdateablePrices: z.boolean().optional(),
|
|
25
29
|
/**
|
|
26
|
-
*
|
|
27
|
-
|
|
30
|
+
* Pool addresses whose markets should be skipped during attach/hydrate/sync.
|
|
31
|
+
**/
|
|
28
32
|
ignoreMarkets: z.array(ZodAddress()).optional(),
|
|
29
33
|
/**
|
|
30
|
-
*
|
|
31
|
-
|
|
34
|
+
* When `true`, throw on unrecognised contract types instead of falling
|
|
35
|
+
* back to a generic contract wrapper.
|
|
36
|
+
**/
|
|
32
37
|
strictContractTypes: z.boolean().optional(),
|
|
33
38
|
/**
|
|
34
|
-
* Plugins
|
|
35
|
-
|
|
39
|
+
* Plugins that extend SDK functionality.
|
|
40
|
+
**/
|
|
36
41
|
plugins: z.record(z.string(), z.any()).optional(),
|
|
37
42
|
/**
|
|
38
|
-
*
|
|
39
|
-
|
|
43
|
+
* Custom logger implementation.
|
|
44
|
+
**/
|
|
40
45
|
logger: z.any(),
|
|
41
46
|
/**
|
|
42
|
-
* Options
|
|
43
|
-
|
|
47
|
+
* Options for Redstone price-feed updates.
|
|
48
|
+
**/
|
|
44
49
|
redstone: RedstoneOptions.optional(),
|
|
45
50
|
/**
|
|
46
|
-
* Options
|
|
47
|
-
|
|
51
|
+
* Options for Pyth price-feed updates.
|
|
52
|
+
**/
|
|
48
53
|
pyth: PythOptions.optional(),
|
|
49
54
|
/**
|
|
50
|
-
* Explicit gas limit for read
|
|
51
|
-
*
|
|
52
|
-
|
|
55
|
+
* Explicit gas limit for read-only `eth_call` requests.
|
|
56
|
+
* `null` disables the gas limit entirely; `undefined` uses the SDK default.
|
|
57
|
+
* Default gas limit is 550_000_000 (550M).
|
|
58
|
+
**/
|
|
53
59
|
gasLimit: z.bigint().nonnegative().nullable().optional()
|
|
54
60
|
});
|
|
55
61
|
export {
|
|
@@ -1,11 +1,23 @@
|
|
|
1
1
|
class BasePlugin {
|
|
2
2
|
#sdk;
|
|
3
3
|
logger;
|
|
4
|
+
/**
|
|
5
|
+
* Plugin state version for hydration compatibility checks.
|
|
6
|
+
* @default 1
|
|
7
|
+
**/
|
|
4
8
|
version = 1;
|
|
9
|
+
/**
|
|
10
|
+
* When `true`, state is fetched eagerly during the `attach` phase
|
|
11
|
+
* rather than waiting for an explicit `load` call.
|
|
12
|
+
**/
|
|
5
13
|
loadOnAttach;
|
|
6
14
|
constructor(loadOnAttach = false) {
|
|
7
15
|
this.loadOnAttach = loadOnAttach;
|
|
8
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Reference to the parent SDK instance.
|
|
19
|
+
* @throws Error if the SDK has not been attached yet.
|
|
20
|
+
**/
|
|
9
21
|
get sdk() {
|
|
10
22
|
if (!this.#sdk) {
|
|
11
23
|
throw new Error("SDK is not attached");
|
|
@@ -19,17 +31,29 @@ class BasePlugin {
|
|
|
19
31
|
this.#sdk = sdk;
|
|
20
32
|
this.logger = sdk.logger?.child?.({ name: this.constructor.name }) ?? sdk.logger;
|
|
21
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* {@inheritDoc IGearboxSDKPlugin.attach}
|
|
36
|
+
**/
|
|
22
37
|
async attach() {
|
|
23
38
|
if (this.loadOnAttach) {
|
|
24
39
|
await this.load(true);
|
|
25
40
|
}
|
|
26
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* {@inheritDoc IGearboxSDKPlugin.syncState}
|
|
44
|
+
**/
|
|
27
45
|
async syncState() {
|
|
28
46
|
await this.load(false);
|
|
29
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Network type of the connected chain (e.g. `"Mainnet"`, `"Arbitrum"`).
|
|
50
|
+
**/
|
|
30
51
|
get network() {
|
|
31
52
|
return this.sdk.networkType;
|
|
32
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Viem public client for read-only chain interactions.
|
|
56
|
+
**/
|
|
33
57
|
get client() {
|
|
34
58
|
return this.sdk.client;
|
|
35
59
|
}
|
|
@@ -10,6 +10,9 @@ class AbstractPoolService extends SDKConstruct {
|
|
|
10
10
|
this.#version = version;
|
|
11
11
|
this.logger?.debug(`Created PoolService with version: ${this.#version}`);
|
|
12
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* {@inheritDoc IPoolsService.addLiquidity}
|
|
15
|
+
**/
|
|
13
16
|
addLiquidity({
|
|
14
17
|
collateral,
|
|
15
18
|
pool,
|
|
@@ -66,6 +69,9 @@ class AbstractPoolService extends SDKConstruct {
|
|
|
66
69
|
];
|
|
67
70
|
}
|
|
68
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* {@inheritDoc IPoolsService.removeLiquidity}
|
|
74
|
+
**/
|
|
69
75
|
removeLiquidity({
|
|
70
76
|
pool,
|
|
71
77
|
amount,
|
|
@@ -3,6 +3,9 @@ import { PERCENTAGE_FACTOR } from "../constants/math.js";
|
|
|
3
3
|
import { AddressMap, AddressSet, formatBN, isDust } from "../utils/index.js";
|
|
4
4
|
import { limitLeftover } from "./helpers.js";
|
|
5
5
|
class AbstractRouterContract extends BaseContract {
|
|
6
|
+
/**
|
|
7
|
+
* Reference to the parent SDK instance.
|
|
8
|
+
**/
|
|
6
9
|
sdk;
|
|
7
10
|
constructor(sdk, args) {
|
|
8
11
|
super(sdk, args);
|
|
@@ -65,7 +68,7 @@ class AbstractRouterContract extends BaseContract {
|
|
|
65
68
|
};
|
|
66
69
|
}
|
|
67
70
|
/**
|
|
68
|
-
* Tries to sell just
|
|
71
|
+
* Tries to sell just enough of the most valuable token to cover debt.
|
|
69
72
|
* @param ca
|
|
70
73
|
* @param keepAssets
|
|
71
74
|
* @returns
|