@gearbox-protocol/sdk 4.1.8 → 4.2.0-next.1
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/dev/index.js +3 -5
- package/dist/cjs/dev/ltUtils.js +200 -0
- package/dist/cjs/sdk/GearboxSDK.js +68 -42
- package/dist/cjs/sdk/core/address-provider/{AddressProviderV3Contract.js → AddressProviderV300Contract.js} +9 -9
- package/dist/cjs/sdk/core/address-provider/{AddressProviderV3_1Contract.js → AddressProviderV310Contract.js} +9 -9
- package/dist/cjs/sdk/core/address-provider/createAddressProvider.js +25 -29
- package/dist/cjs/sdk/core/address-provider/index.js +4 -4
- package/dist/cjs/sdk/gauges/GaugeStakingService.js +15 -9
- package/dist/cjs/sdk/market/MarketRegister.js +5 -2
- package/dist/cjs/sdk/utils/index.js +3 -1
- package/dist/cjs/sdk/utils/version.js +35 -0
- package/dist/esm/dev/index.js +1 -2
- package/dist/esm/dev/ltUtils.js +178 -0
- package/dist/esm/sdk/GearboxSDK.js +68 -42
- package/dist/esm/sdk/core/address-provider/{AddressProviderV3Contract.js → AddressProviderV300Contract.js} +5 -5
- package/dist/esm/sdk/core/address-provider/{AddressProviderV3_1Contract.js → AddressProviderV310Contract.js} +5 -5
- package/dist/esm/sdk/core/address-provider/createAddressProvider.js +23 -28
- package/dist/esm/sdk/core/address-provider/index.js +2 -2
- package/dist/esm/sdk/gauges/GaugeStakingService.js +15 -9
- package/dist/esm/sdk/market/MarketRegister.js +5 -2
- package/dist/esm/sdk/utils/index.js +1 -0
- package/dist/esm/sdk/utils/version.js +10 -0
- package/dist/types/dev/index.d.ts +1 -2
- package/dist/types/dev/ltUtils.d.ts +11 -0
- package/dist/types/sdk/GearboxSDK.d.ts +8 -2
- package/dist/types/sdk/core/address-provider/{AddressProviderV3Contract.d.ts → AddressProviderV300Contract.d.ts} +2 -2
- package/dist/types/sdk/core/address-provider/{AddressProviderV3_1Contract.d.ts → AddressProviderV310Contract.d.ts} +2 -2
- package/dist/types/sdk/core/address-provider/createAddressProvider.d.ts +2 -5
- package/dist/types/sdk/core/address-provider/index.d.ts +2 -2
- package/dist/types/sdk/market/MarketRegister.d.ts +2 -1
- package/dist/types/sdk/types/state-human.d.ts +2 -2
- package/dist/types/sdk/types/state.d.ts +9 -0
- package/dist/types/sdk/utils/index.d.ts +1 -0
- package/dist/types/sdk/utils/version.d.ts +2 -0
- package/package.json +1 -1
- package/dist/cjs/dev/setLTZero.js +0 -124
- package/dist/cjs/dev/setLTs.js +0 -73
- package/dist/esm/dev/setLTZero.js +0 -103
- package/dist/esm/dev/setLTs.js +0 -49
- package/dist/types/dev/setLTZero.d.ts +0 -5
- package/dist/types/dev/setLTs.d.ts +0 -14
|
@@ -27,6 +27,7 @@ __reExport(utils_exports, require("./json.js"), module.exports);
|
|
|
27
27
|
__reExport(utils_exports, require("./mappers.js"), module.exports);
|
|
28
28
|
__reExport(utils_exports, require("./retry.js"), module.exports);
|
|
29
29
|
__reExport(utils_exports, require("./toAddress.js"), module.exports);
|
|
30
|
+
__reExport(utils_exports, require("./version.js"), module.exports);
|
|
30
31
|
// Annotate the CommonJS export names for ESM import in node:
|
|
31
32
|
0 && (module.exports = {
|
|
32
33
|
...require("./AddressMap.js"),
|
|
@@ -40,5 +41,6 @@ __reExport(utils_exports, require("./toAddress.js"), module.exports);
|
|
|
40
41
|
...require("./json.js"),
|
|
41
42
|
...require("./mappers.js"),
|
|
42
43
|
...require("./retry.js"),
|
|
43
|
-
...require("./toAddress.js")
|
|
44
|
+
...require("./toAddress.js"),
|
|
45
|
+
...require("./version.js")
|
|
44
46
|
});
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var version_exports = {};
|
|
20
|
+
__export(version_exports, {
|
|
21
|
+
isV300: () => isV300,
|
|
22
|
+
isV310: () => isV310
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(version_exports);
|
|
25
|
+
function isV300(version) {
|
|
26
|
+
return version >= 300 && version < 310;
|
|
27
|
+
}
|
|
28
|
+
function isV310(version) {
|
|
29
|
+
return version >= 310 && version < 320;
|
|
30
|
+
}
|
|
31
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
32
|
+
0 && (module.exports = {
|
|
33
|
+
isV300,
|
|
34
|
+
isV310
|
|
35
|
+
});
|
package/dist/esm/dev/index.js
CHANGED
|
@@ -4,7 +4,6 @@ export * from "./create2.js";
|
|
|
4
4
|
export * from "./createAnvilClient.js";
|
|
5
5
|
export * from "./createTransport.js";
|
|
6
6
|
export * from "./detectChain.js";
|
|
7
|
+
export * from "./ltUtils.js";
|
|
7
8
|
export * from "./migrateFaucet.js";
|
|
8
9
|
export * from "./PriceFeedStore.js";
|
|
9
|
-
export * from "./setLTs.js";
|
|
10
|
-
export * from "./setLTZero.js";
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { erc20Abi, parseEther } from "viem";
|
|
2
|
+
import {
|
|
3
|
+
iCreditConfiguratorV300Abi,
|
|
4
|
+
iCreditManagerV300Abi
|
|
5
|
+
} from "../abi/v300.js";
|
|
6
|
+
import { hexEq, PERCENTAGE_FACTOR, TypedObjectUtils } from "../sdk/index.js";
|
|
7
|
+
import { iaclTraitAbi, iOwnableAbi } from "./abi.js";
|
|
8
|
+
async function setLTs(anvil, cm, newLTs, logger) {
|
|
9
|
+
const configuratorAddr = await impresonateCCOwner(anvil, cm);
|
|
10
|
+
for (const [t, lt] of Object.entries(newLTs)) {
|
|
11
|
+
await anvil.writeContract({
|
|
12
|
+
chain: anvil.chain,
|
|
13
|
+
address: cm.creditConfigurator.baseParams.addr,
|
|
14
|
+
account: configuratorAddr,
|
|
15
|
+
abi: iCreditConfiguratorV300Abi,
|
|
16
|
+
functionName: "setLiquidationThreshold",
|
|
17
|
+
args: [t, lt]
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
await anvil.stopImpersonatingAccount({
|
|
21
|
+
address: configuratorAddr
|
|
22
|
+
});
|
|
23
|
+
await logLTs(anvil, cm, TypedObjectUtils.keys(newLTs), logger);
|
|
24
|
+
}
|
|
25
|
+
async function setLTZero(anvil, cm, logger) {
|
|
26
|
+
const v = Number(cm.creditConfigurator.baseParams.version);
|
|
27
|
+
if (v >= 300 && v < 310) {
|
|
28
|
+
await setLTZeroV300(anvil, cm, logger);
|
|
29
|
+
} else if (v >= 310 && v < 320) {
|
|
30
|
+
await setLTZeroV310(anvil, cm, logger);
|
|
31
|
+
} else {
|
|
32
|
+
throw new Error(
|
|
33
|
+
`zero LT is not implemented for credit configurator version: ${v}`
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async function setLTZeroV300(anvil, cm, logger) {
|
|
38
|
+
const ccAddr = cm.creditConfigurator.baseParams.addr;
|
|
39
|
+
const cmAddr = cm.creditManager.baseParams.addr;
|
|
40
|
+
const {
|
|
41
|
+
name,
|
|
42
|
+
underlying,
|
|
43
|
+
feeInterest,
|
|
44
|
+
liquidationDiscount,
|
|
45
|
+
feeLiquidation,
|
|
46
|
+
feeLiquidationExpired,
|
|
47
|
+
liquidationDiscountExpired
|
|
48
|
+
} = cm.creditManager;
|
|
49
|
+
const owner = await impresonateCCOwner(anvil, cm);
|
|
50
|
+
let hash = await anvil.writeContract({
|
|
51
|
+
chain: anvil.chain,
|
|
52
|
+
address: ccAddr,
|
|
53
|
+
account: owner,
|
|
54
|
+
abi: iCreditConfiguratorV300Abi,
|
|
55
|
+
functionName: "setFees",
|
|
56
|
+
args: [
|
|
57
|
+
feeInterest,
|
|
58
|
+
liquidationDiscount - 1,
|
|
59
|
+
Number(PERCENTAGE_FACTOR) - liquidationDiscount,
|
|
60
|
+
feeLiquidationExpired,
|
|
61
|
+
liquidationDiscountExpired
|
|
62
|
+
]
|
|
63
|
+
});
|
|
64
|
+
await anvil.waitForTransactionReceipt({ hash });
|
|
65
|
+
logger?.debug(`[${name}] setFees part 2`);
|
|
66
|
+
hash = await anvil.writeContract({
|
|
67
|
+
chain: anvil.chain,
|
|
68
|
+
address: ccAddr,
|
|
69
|
+
account: owner,
|
|
70
|
+
abi: iCreditConfiguratorV300Abi,
|
|
71
|
+
functionName: "setFees",
|
|
72
|
+
args: [
|
|
73
|
+
feeInterest,
|
|
74
|
+
feeLiquidation,
|
|
75
|
+
Number(PERCENTAGE_FACTOR) - liquidationDiscount,
|
|
76
|
+
feeLiquidationExpired,
|
|
77
|
+
liquidationDiscountExpired
|
|
78
|
+
]
|
|
79
|
+
});
|
|
80
|
+
await anvil.waitForTransactionReceipt({ hash });
|
|
81
|
+
logger?.debug(`[${name}] setFees done`);
|
|
82
|
+
await anvil.impersonateAccount({
|
|
83
|
+
address: ccAddr
|
|
84
|
+
});
|
|
85
|
+
await anvil.setBalance({
|
|
86
|
+
address: ccAddr,
|
|
87
|
+
value: parseEther("100")
|
|
88
|
+
});
|
|
89
|
+
logger?.debug(`[${name}] impresonating creditConfigurator ${ccAddr}`);
|
|
90
|
+
logger?.debug(`[${name}] setting liquidation threshold`);
|
|
91
|
+
hash = await anvil.writeContract({
|
|
92
|
+
chain: anvil.chain,
|
|
93
|
+
address: cmAddr,
|
|
94
|
+
account: ccAddr,
|
|
95
|
+
abi: iCreditManagerV300Abi,
|
|
96
|
+
functionName: "setCollateralTokenData",
|
|
97
|
+
args: [underlying, 1, 1, Number(2n ** 40n - 1n), 0]
|
|
98
|
+
});
|
|
99
|
+
await anvil.waitForTransactionReceipt({ hash });
|
|
100
|
+
logger?.debug(`[${name}] setting configurator ${ccAddr}`);
|
|
101
|
+
hash = await anvil.writeContract({
|
|
102
|
+
chain: anvil.chain,
|
|
103
|
+
address: cmAddr,
|
|
104
|
+
account: ccAddr,
|
|
105
|
+
abi: iCreditManagerV300Abi,
|
|
106
|
+
functionName: "setCreditConfigurator",
|
|
107
|
+
args: [ccAddr]
|
|
108
|
+
});
|
|
109
|
+
await anvil.waitForTransactionReceipt({ hash });
|
|
110
|
+
logger?.debug(`[${name}] done`);
|
|
111
|
+
await anvil.stopImpersonatingAccount({
|
|
112
|
+
address: ccAddr
|
|
113
|
+
});
|
|
114
|
+
await anvil.stopImpersonatingAccount({ address: owner });
|
|
115
|
+
await logLTs(
|
|
116
|
+
anvil,
|
|
117
|
+
cm,
|
|
118
|
+
cm.creditManager.collateralTokens.map((c) => c.token),
|
|
119
|
+
logger
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
async function setLTZeroV310(anvil, cm, logger) {
|
|
123
|
+
const newLTs = {};
|
|
124
|
+
for (const { token } of cm.creditManager.collateralTokens) {
|
|
125
|
+
if (!hexEq(token, cm.creditManager.underlying)) {
|
|
126
|
+
newLTs[token] = 0;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
await setLTs(anvil, cm, newLTs, logger);
|
|
130
|
+
}
|
|
131
|
+
async function impresonateCCOwner(anvil, cm) {
|
|
132
|
+
const aclAddr = await anvil.readContract({
|
|
133
|
+
address: cm.creditConfigurator.baseParams.addr,
|
|
134
|
+
abi: iaclTraitAbi,
|
|
135
|
+
functionName: "acl"
|
|
136
|
+
});
|
|
137
|
+
const owner = await anvil.readContract({
|
|
138
|
+
address: aclAddr,
|
|
139
|
+
abi: iOwnableAbi,
|
|
140
|
+
functionName: "owner"
|
|
141
|
+
});
|
|
142
|
+
await anvil.impersonateAccount({
|
|
143
|
+
address: owner
|
|
144
|
+
});
|
|
145
|
+
await anvil.setBalance({
|
|
146
|
+
address: owner,
|
|
147
|
+
value: parseEther("100")
|
|
148
|
+
});
|
|
149
|
+
return owner;
|
|
150
|
+
}
|
|
151
|
+
async function logLTs(anvil, cm, tokens, logger) {
|
|
152
|
+
const resp = await anvil.multicall({
|
|
153
|
+
allowFailure: true,
|
|
154
|
+
contracts: tokens.flatMap((t) => [
|
|
155
|
+
{
|
|
156
|
+
abi: iCreditManagerV300Abi,
|
|
157
|
+
functionName: "liquidationThresholds",
|
|
158
|
+
address: cm.creditManager.baseParams.addr,
|
|
159
|
+
args: [t]
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
abi: erc20Abi,
|
|
163
|
+
functionName: "symbol",
|
|
164
|
+
address: t,
|
|
165
|
+
args: []
|
|
166
|
+
}
|
|
167
|
+
])
|
|
168
|
+
});
|
|
169
|
+
for (let i = 0; i < tokens.length; i++) {
|
|
170
|
+
const lt = resp[i * 2]?.result ?? "error";
|
|
171
|
+
const symbol = resp[i * 2 + 1]?.result ?? tokens[i];
|
|
172
|
+
logger?.debug(`new LT for ${symbol}: ${lt}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
export {
|
|
176
|
+
setLTZero,
|
|
177
|
+
setLTs
|
|
178
|
+
};
|
|
@@ -17,7 +17,8 @@ import {
|
|
|
17
17
|
import {
|
|
18
18
|
BotListContract,
|
|
19
19
|
createAddressProvider,
|
|
20
|
-
GearStakingContract
|
|
20
|
+
GearStakingContract,
|
|
21
|
+
hydrateAddressProvider
|
|
21
22
|
} from "./core/index.js";
|
|
22
23
|
import { MarketRegister } from "./market/MarketRegister.js";
|
|
23
24
|
import { PriceFeedRegister } from "./market/pricefeeds/index.js";
|
|
@@ -34,6 +35,7 @@ import {
|
|
|
34
35
|
import { Hooks } from "./utils/internal/index.js";
|
|
35
36
|
import { getLogsSafe } from "./utils/viem/index.js";
|
|
36
37
|
const ERR_NOT_ATTACHED = new Error("Gearbox SDK not attached");
|
|
38
|
+
const STATE_VERSION = 1;
|
|
37
39
|
class GearboxSDK {
|
|
38
40
|
#hooks = new Hooks();
|
|
39
41
|
// Represents chain object
|
|
@@ -45,13 +47,9 @@ class GearboxSDK {
|
|
|
45
47
|
#syncing = false;
|
|
46
48
|
// Collection of core singleton contracts
|
|
47
49
|
#addressProvider;
|
|
48
|
-
#botListContract;
|
|
49
|
-
#gearStakingContract;
|
|
50
50
|
#attachConfig;
|
|
51
51
|
// Collection of markets
|
|
52
52
|
#marketRegister;
|
|
53
|
-
// Routers by address
|
|
54
|
-
#routers = new AddressMap();
|
|
55
53
|
logger;
|
|
56
54
|
/**
|
|
57
55
|
* Interest rate models can be reused across chain (and SDK operates on chain level)
|
|
@@ -119,6 +117,15 @@ class GearboxSDK {
|
|
|
119
117
|
marketConfigurators
|
|
120
118
|
});
|
|
121
119
|
}
|
|
120
|
+
static hydrate(options, state) {
|
|
121
|
+
const { logger, ...rest } = options;
|
|
122
|
+
const provider = new Provider({
|
|
123
|
+
...rest,
|
|
124
|
+
chainId: state.chainId,
|
|
125
|
+
networkType: state.network
|
|
126
|
+
});
|
|
127
|
+
return new GearboxSDK({ provider, logger }).#hydrate(rest, state);
|
|
128
|
+
}
|
|
122
129
|
constructor(options) {
|
|
123
130
|
this.#provider = options.provider;
|
|
124
131
|
this.logger = options.logger;
|
|
@@ -139,7 +146,6 @@ class GearboxSDK {
|
|
|
139
146
|
addressProvider,
|
|
140
147
|
blockNumber,
|
|
141
148
|
redstoneHistoricTimestamp,
|
|
142
|
-
redstoneGateways,
|
|
143
149
|
ignoreUpdateablePrices,
|
|
144
150
|
marketConfigurators
|
|
145
151
|
} = opts;
|
|
@@ -167,12 +173,7 @@ class GearboxSDK {
|
|
|
167
173
|
);
|
|
168
174
|
this.#currentBlock = block.number;
|
|
169
175
|
this.#timestamp = block.timestamp;
|
|
170
|
-
|
|
171
|
-
this.priceFeeds.redstoneUpdater.historicalTimestamp = redstoneHistoricTimestamp === true ? Number(block.timestamp) * 1e3 : redstoneHistoricTimestamp;
|
|
172
|
-
}
|
|
173
|
-
if (redstoneGateways?.length) {
|
|
174
|
-
this.priceFeeds.redstoneUpdater.gateways = redstoneGateways;
|
|
175
|
-
}
|
|
176
|
+
this.#confugureRedstone(opts);
|
|
176
177
|
this.logger?.debug(
|
|
177
178
|
`${re}attach block number ${this.currentBlock} timestamp ${this.timestamp}`
|
|
178
179
|
);
|
|
@@ -181,23 +182,6 @@ class GearboxSDK {
|
|
|
181
182
|
`address provider version: ${this.#addressProvider.version}`
|
|
182
183
|
);
|
|
183
184
|
await this.#addressProvider.syncState(this.currentBlock);
|
|
184
|
-
try {
|
|
185
|
-
const botListAddress = this.#addressProvider.getAddress(
|
|
186
|
-
AP_BOT_LIST,
|
|
187
|
-
NO_VERSION
|
|
188
|
-
);
|
|
189
|
-
this.#botListContract = new BotListContract(this, botListAddress);
|
|
190
|
-
} catch (e) {
|
|
191
|
-
this.logger?.error(e);
|
|
192
|
-
}
|
|
193
|
-
const gearStakingAddress = this.#addressProvider.getAddress(
|
|
194
|
-
AP_GEAR_STAKING,
|
|
195
|
-
NO_VERSION
|
|
196
|
-
);
|
|
197
|
-
this.#gearStakingContract = new GearStakingContract(
|
|
198
|
-
this,
|
|
199
|
-
gearStakingAddress
|
|
200
|
-
);
|
|
201
185
|
this.#marketRegister = new MarketRegister(this);
|
|
202
186
|
await this.#marketRegister.loadMarkets(
|
|
203
187
|
marketConfigurators,
|
|
@@ -224,13 +208,48 @@ class GearboxSDK {
|
|
|
224
208
|
this.logger?.info(`${re}attach time: ${Date.now() - time} ms`);
|
|
225
209
|
return this;
|
|
226
210
|
}
|
|
211
|
+
#hydrate(options, state) {
|
|
212
|
+
const { logger: _logger, ...opts } = options;
|
|
213
|
+
if (state.version !== STATE_VERSION) {
|
|
214
|
+
throw new Error(
|
|
215
|
+
`hydrated state version is ${state.version}, but expected ${STATE_VERSION}`
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
this.#currentBlock = state.currentBlock;
|
|
219
|
+
this.#timestamp = state.timestamp;
|
|
220
|
+
this.#confugureRedstone(opts);
|
|
221
|
+
this.#addressProvider = hydrateAddressProvider(this, state.addressProvider);
|
|
222
|
+
this.logger?.debug(
|
|
223
|
+
`address provider version: ${this.#addressProvider.version}`
|
|
224
|
+
);
|
|
225
|
+
this.#marketRegister = new MarketRegister(this);
|
|
226
|
+
this.#marketRegister.hydrate(state.markets);
|
|
227
|
+
this.#attachConfig = {
|
|
228
|
+
...opts,
|
|
229
|
+
addressProvider: this.addressProvider.address,
|
|
230
|
+
marketConfigurators: this.marketRegister.marketConfigurators.map(
|
|
231
|
+
(m) => m.address
|
|
232
|
+
),
|
|
233
|
+
blockNumber: this.currentBlock
|
|
234
|
+
};
|
|
235
|
+
return this;
|
|
236
|
+
}
|
|
237
|
+
#confugureRedstone(opts) {
|
|
238
|
+
const { redstoneGateways, redstoneHistoricTimestamp } = opts;
|
|
239
|
+
if (redstoneHistoricTimestamp) {
|
|
240
|
+
this.priceFeeds.redstoneUpdater.historicalTimestamp = redstoneHistoricTimestamp === true ? Number(this.timestamp) * 1e3 : redstoneHistoricTimestamp;
|
|
241
|
+
}
|
|
242
|
+
if (redstoneGateways?.length) {
|
|
243
|
+
this.priceFeeds.redstoneUpdater.gateways = redstoneGateways;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
227
246
|
/**
|
|
228
247
|
* Reattach SDK with the same config as before, without re-creating instance. Will load all state from scratch
|
|
229
248
|
* Be mindful of block number, for example
|
|
230
249
|
*/
|
|
231
250
|
async reattach() {
|
|
232
251
|
if (!this.#attachConfig) {
|
|
233
|
-
throw new Error("
|
|
252
|
+
throw new Error("cannot reattach, attach config is not set");
|
|
234
253
|
}
|
|
235
254
|
await this.#attach(this.#attachConfig);
|
|
236
255
|
}
|
|
@@ -288,8 +307,8 @@ class GearboxSDK {
|
|
|
288
307
|
timestamp: Number(this.timestamp),
|
|
289
308
|
core: {
|
|
290
309
|
addressProviderV3: this.addressProvider.stateHuman(raw),
|
|
291
|
-
botList: this.botListContract
|
|
292
|
-
gearStakingV3: this.gearStakingContract
|
|
310
|
+
botList: this.botListContract?.stateHuman(raw),
|
|
311
|
+
gearStakingV3: this.gearStakingContract?.stateHuman(raw)
|
|
293
312
|
},
|
|
294
313
|
tokens: this.tokensMeta.values(),
|
|
295
314
|
plugins: Object.fromEntries(
|
|
@@ -303,7 +322,11 @@ class GearboxSDK {
|
|
|
303
322
|
}
|
|
304
323
|
get state() {
|
|
305
324
|
return {
|
|
325
|
+
version: STATE_VERSION,
|
|
326
|
+
network: this.provider.networkType,
|
|
327
|
+
chainId: this.provider.chainId,
|
|
306
328
|
currentBlock: this.currentBlock,
|
|
329
|
+
timestamp: this.timestamp,
|
|
307
330
|
addressProvider: this.addressProvider.state,
|
|
308
331
|
markets: this.marketRegister.state
|
|
309
332
|
};
|
|
@@ -419,16 +442,18 @@ class GearboxSDK {
|
|
|
419
442
|
return this.#addressProvider;
|
|
420
443
|
}
|
|
421
444
|
get botListContract() {
|
|
422
|
-
|
|
423
|
-
|
|
445
|
+
const addr = this.addressProvider.getAddress(AP_BOT_LIST, NO_VERSION);
|
|
446
|
+
if (!this.contracts.has(addr)) {
|
|
447
|
+
return new BotListContract(this, addr);
|
|
424
448
|
}
|
|
425
|
-
return this
|
|
449
|
+
return this.contracts.get(addr);
|
|
426
450
|
}
|
|
427
451
|
get gearStakingContract() {
|
|
428
|
-
|
|
429
|
-
|
|
452
|
+
const addr = this.addressProvider.getAddress(AP_GEAR_STAKING, NO_VERSION);
|
|
453
|
+
if (!this.contracts.has(addr)) {
|
|
454
|
+
return new GearStakingContract(this, addr);
|
|
430
455
|
}
|
|
431
|
-
return this
|
|
456
|
+
return this.contracts.get(addr);
|
|
432
457
|
}
|
|
433
458
|
get marketRegister() {
|
|
434
459
|
if (this.#marketRegister === void 0) {
|
|
@@ -463,12 +488,13 @@ class GearboxSDK {
|
|
|
463
488
|
);
|
|
464
489
|
}
|
|
465
490
|
const [routerAddr, routerV] = routerEntry;
|
|
466
|
-
if (!this
|
|
467
|
-
|
|
491
|
+
if (!this.contracts.has(routerAddr)) {
|
|
492
|
+
return createRouter(this, routerAddr, routerV);
|
|
468
493
|
}
|
|
469
|
-
return this
|
|
494
|
+
return this.contracts.get(routerAddr);
|
|
470
495
|
}
|
|
471
496
|
}
|
|
472
497
|
export {
|
|
473
|
-
GearboxSDK
|
|
498
|
+
GearboxSDK,
|
|
499
|
+
STATE_VERSION
|
|
474
500
|
};
|
|
@@ -4,15 +4,15 @@ import { ADDRESS_PROVIDER_BLOCK } from "../../constants/index.js";
|
|
|
4
4
|
import { getLogsSafe } from "../../utils/viem/index.js";
|
|
5
5
|
import AbstractAddressProviderContract from "./AbstractAddressProviderContract.js";
|
|
6
6
|
const abi = iAddressProviderV300Abi;
|
|
7
|
-
class
|
|
8
|
-
constructor(sdk, address, addresses = {}) {
|
|
7
|
+
class AddressProviderV300Contract extends AbstractAddressProviderContract {
|
|
8
|
+
constructor(sdk, address, version, addresses = {}) {
|
|
9
9
|
super(
|
|
10
10
|
sdk,
|
|
11
11
|
{
|
|
12
12
|
addr: address,
|
|
13
|
-
name: "
|
|
13
|
+
name: "AddressProviderV300",
|
|
14
14
|
abi,
|
|
15
|
-
version
|
|
15
|
+
version
|
|
16
16
|
},
|
|
17
17
|
addresses
|
|
18
18
|
);
|
|
@@ -74,5 +74,5 @@ class AddressProviderContractV3 extends AbstractAddressProviderContract {
|
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
76
|
export {
|
|
77
|
-
|
|
77
|
+
AddressProviderV300Contract
|
|
78
78
|
};
|
|
@@ -2,15 +2,15 @@ import { bytesToString, parseEventLogs, toBytes } from "viem";
|
|
|
2
2
|
import { iAddressProviderV310Abi } from "../../../abi/v310.js";
|
|
3
3
|
import AbstractAddressProviderContract from "./AbstractAddressProviderContract.js";
|
|
4
4
|
const abi = iAddressProviderV310Abi;
|
|
5
|
-
class
|
|
6
|
-
constructor(sdk, address, addresses = {}) {
|
|
5
|
+
class AddressProviderV310Contract extends AbstractAddressProviderContract {
|
|
6
|
+
constructor(sdk, address, version, addresses = {}) {
|
|
7
7
|
super(
|
|
8
8
|
sdk,
|
|
9
9
|
{
|
|
10
10
|
addr: address,
|
|
11
|
-
name: "
|
|
11
|
+
name: "AddressProviderV310",
|
|
12
12
|
abi,
|
|
13
|
-
version
|
|
13
|
+
version
|
|
14
14
|
},
|
|
15
15
|
addresses
|
|
16
16
|
);
|
|
@@ -59,5 +59,5 @@ class AddressProviderContractV3_1 extends AbstractAddressProviderContract {
|
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
export {
|
|
62
|
-
|
|
62
|
+
AddressProviderV310Contract
|
|
63
63
|
};
|
|
@@ -1,34 +1,29 @@
|
|
|
1
1
|
import { iVersionAbi } from "../../../abi/iVersion.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
2
|
+
import { isV300, isV310 } from "../../utils/index.js";
|
|
3
|
+
import { AddressProviderV300Contract } from "./AddressProviderV300Contract.js";
|
|
4
|
+
import { AddressProviderV310Contract } from "./AddressProviderV310Contract.js";
|
|
5
|
+
async function createAddressProvider(sdk, address) {
|
|
6
|
+
const v = await sdk.provider.publicClient.readContract({
|
|
7
|
+
address,
|
|
8
|
+
abi: iVersionAbi,
|
|
9
|
+
functionName: "version"
|
|
10
|
+
});
|
|
11
|
+
return newAddressProvider(sdk, address, Number(v));
|
|
12
|
+
}
|
|
13
|
+
function hydrateAddressProvider(sdk, state) {
|
|
14
|
+
const { addr, version } = state.baseParams;
|
|
15
|
+
return newAddressProvider(sdk, addr, Number(version), state.addresses);
|
|
16
|
+
}
|
|
17
|
+
function newAddressProvider(sdk, address, version, addresses) {
|
|
18
|
+
if (isV300(version)) {
|
|
19
|
+
return new AddressProviderV300Contract(sdk, address, version, addresses);
|
|
14
20
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
return new AddressProviderContractV3(
|
|
18
|
-
sdk,
|
|
19
|
-
addr,
|
|
20
|
-
options?.state?.addresses
|
|
21
|
-
);
|
|
22
|
-
case 310:
|
|
23
|
-
return new AddressProviderContractV3_1(
|
|
24
|
-
sdk,
|
|
25
|
-
addr,
|
|
26
|
-
options?.state?.addresses
|
|
27
|
-
);
|
|
28
|
-
default:
|
|
29
|
-
throw new Error(`Unsupported address provider version: ${v}`);
|
|
21
|
+
if (isV310(version)) {
|
|
22
|
+
return new AddressProviderV310Contract(sdk, address, version, addresses);
|
|
30
23
|
}
|
|
24
|
+
throw new Error(`unsupported address provider version: ${version}`);
|
|
31
25
|
}
|
|
32
26
|
export {
|
|
33
|
-
createAddressProvider
|
|
27
|
+
createAddressProvider,
|
|
28
|
+
hydrateAddressProvider
|
|
34
29
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export * from "./
|
|
2
|
-
export * from "./
|
|
1
|
+
export * from "./AddressProviderV300Contract.js";
|
|
2
|
+
export * from "./AddressProviderV310Contract.js";
|
|
3
3
|
export * from "./createAddressProvider.js";
|
|
4
4
|
export * from "./types.js";
|
|
@@ -14,7 +14,13 @@ class GaugeStakingService extends SDKConstruct {
|
|
|
14
14
|
*/
|
|
15
15
|
async getGaugeStakingData(wallet) {
|
|
16
16
|
const marketFilter = this.sdk.marketRegister.marketFilter;
|
|
17
|
-
|
|
17
|
+
const gearStaking = this.sdk.gearStakingContract;
|
|
18
|
+
if (!marketFilter) {
|
|
19
|
+
throw new Error("market filter is not set");
|
|
20
|
+
}
|
|
21
|
+
if (!gearStaking) {
|
|
22
|
+
throw new Error("gear staking contract is not set");
|
|
23
|
+
}
|
|
18
24
|
const [gauges, availableBalance, totalBalance, withdrawableAmounts, epoch] = await this.provider.publicClient.multicall({
|
|
19
25
|
allowFailure: false,
|
|
20
26
|
contracts: [
|
|
@@ -25,26 +31,26 @@ class GaugeStakingService extends SDKConstruct {
|
|
|
25
31
|
args: [marketFilter, wallet]
|
|
26
32
|
},
|
|
27
33
|
{
|
|
28
|
-
address:
|
|
29
|
-
abi:
|
|
34
|
+
address: gearStaking.address,
|
|
35
|
+
abi: gearStaking.abi,
|
|
30
36
|
functionName: "availableBalance",
|
|
31
37
|
args: [wallet]
|
|
32
38
|
},
|
|
33
39
|
{
|
|
34
|
-
address:
|
|
35
|
-
abi:
|
|
40
|
+
address: gearStaking.address,
|
|
41
|
+
abi: gearStaking.abi,
|
|
36
42
|
functionName: "balanceOf",
|
|
37
43
|
args: [wallet]
|
|
38
44
|
},
|
|
39
45
|
{
|
|
40
|
-
address:
|
|
41
|
-
abi:
|
|
46
|
+
address: gearStaking.address,
|
|
47
|
+
abi: gearStaking.abi,
|
|
42
48
|
functionName: "getWithdrawableAmounts",
|
|
43
49
|
args: [wallet]
|
|
44
50
|
},
|
|
45
51
|
{
|
|
46
|
-
address:
|
|
47
|
-
abi:
|
|
52
|
+
address: gearStaking.address,
|
|
53
|
+
abi: gearStaking.abi,
|
|
48
54
|
functionName: "getCurrentEpoch",
|
|
49
55
|
args: []
|
|
50
56
|
}
|
|
@@ -11,10 +11,13 @@ class MarketRegister extends SDKConstruct {
|
|
|
11
11
|
*/
|
|
12
12
|
#markets = new AddressMap(void 0, "markets");
|
|
13
13
|
#marketFilter;
|
|
14
|
-
constructor(sdk
|
|
14
|
+
constructor(sdk) {
|
|
15
15
|
super(sdk);
|
|
16
16
|
this.#logger = childLogger("MarketRegister", sdk.logger);
|
|
17
|
-
|
|
17
|
+
}
|
|
18
|
+
hydrate(state) {
|
|
19
|
+
this.#markets.clear();
|
|
20
|
+
for (const data of state) {
|
|
18
21
|
this.#markets.upsert(
|
|
19
22
|
data.pool.baseParams.addr,
|
|
20
23
|
new MarketSuite(this.sdk, data)
|
|
@@ -4,7 +4,6 @@ export * from "./create2.js";
|
|
|
4
4
|
export * from "./createAnvilClient.js";
|
|
5
5
|
export * from "./createTransport.js";
|
|
6
6
|
export * from "./detectChain.js";
|
|
7
|
+
export * from "./ltUtils.js";
|
|
7
8
|
export * from "./migrateFaucet.js";
|
|
8
9
|
export * from "./PriceFeedStore.js";
|
|
9
|
-
export * from "./setLTs.js";
|
|
10
|
-
export * from "./setLTZero.js";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Address } from "viem";
|
|
2
|
+
import type { CreditSuiteState, ILogger } from "../sdk/index.js";
|
|
3
|
+
import type { AnvilClient } from "./createAnvilClient.js";
|
|
4
|
+
/**
|
|
5
|
+
* Helper function to set liquidation thresholds on credit manager via anvil impersonation
|
|
6
|
+
* @param sdk
|
|
7
|
+
* @param cm
|
|
8
|
+
* @param newLTs
|
|
9
|
+
*/
|
|
10
|
+
export declare function setLTs(anvil: AnvilClient, cm: CreditSuiteState, newLTs: Record<Address, number>, logger?: ILogger): Promise<void>;
|
|
11
|
+
export declare function setLTZero(anvil: AnvilClient, cm: CreditSuiteState, logger?: ILogger): Promise<void>;
|