@gearbox-protocol/sdk 3.0.0-vfourabi.1 → 3.0.0-vfourabi.3
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/.eslintignore +3 -0
- package/.github/workflows/lint_pr.yml +18 -0
- package/.github/workflows/pr.yml +39 -0
- package/.github/workflows/release.yml +47 -0
- package/.gitignore +19 -0
- package/.husky/commit-msg +1 -0
- package/.husky/pre-commit +1 -0
- package/.nvmrc +1 -0
- package/.releaserc.json +34 -0
- package/.vscode/extensions.json +7 -0
- package/.vscode/settings.json +16 -0
- package/.yarn/install-state.gz +0 -0
- package/.yarnrc.yml +1 -0
- package/ContributionAgreement +72 -0
- package/dist/cjs/abi/iZapper.cjs +85 -0
- package/dist/cjs/abi/iZapper.d.ts +123 -0
- package/dist/cjs/sdk/index.cjs +19830 -19764
- package/dist/cjs/sdk/index.d.ts +3746 -3061
- package/dist/esm/abi/iZapper.d.mts +123 -0
- package/dist/esm/abi/iZapper.mjs +83 -0
- package/dist/esm/sdk/index.d.mts +3746 -3061
- package/dist/esm/sdk/index.mjs +19807 -19765
- package/jest.config.js +7 -0
- package/package.json +32 -2
- package/scripts/example.ts +30 -0
- package/src/abi/compressors.ts +3962 -0
- package/src/abi/errors.ts +196 -0
- package/src/abi/iERC20.ts +122 -0
- package/src/abi/iPausable.ts +35 -0
- package/src/abi/iPriceFeedStore.ts +227 -0
- package/src/abi/iUpdatablePriceFeed.ts +16 -0
- package/src/abi/iVersion.ts +28 -0
- package/src/abi/iZapper.ts +84 -0
- package/src/abi/routerV300.ts +378 -0
- package/src/abi/v300.ts +4151 -0
- package/src/abi/v310.ts +5179 -0
- package/src/adapters/AbstractAdapter.ts +28 -0
- package/src/adapters/BalancerV2VaultAdapterContract.ts +19 -0
- package/src/adapters/BalancerV3RouterAdapterContract.ts +19 -0
- package/src/adapters/CamelotV3AdapterContract.ts +20 -0
- package/src/adapters/ConvexV1BaseRewardPoolAdapterContract.ts +20 -0
- package/src/adapters/ConvexV1BoosterAdapterContract.ts +20 -0
- package/src/adapters/Curve2AssetsAdapterContract.ts +20 -0
- package/src/adapters/Curve3AssetsAdapterContract.ts +20 -0
- package/src/adapters/Curve4AssetsAdapterContract.ts +20 -0
- package/src/adapters/CurveV1AdapterStETHContract.ts +20 -0
- package/src/adapters/CurveV1StableNGAdapterContract.ts +20 -0
- package/src/adapters/DaiUsdsAdapterContract.ts +21 -0
- package/src/adapters/ERC4626AdapterContract.ts +20 -0
- package/src/adapters/MellowERC4626VaultAdapterContract.ts +20 -0
- package/src/adapters/MellowVaultAdapterContract.ts +20 -0
- package/src/adapters/PendleRouterAdapterContract.ts +21 -0
- package/src/adapters/StakingRewardsAdapterContract.ts +21 -0
- package/src/adapters/UniswapV2AdapterContract.ts +20 -0
- package/src/adapters/UniswapV3AdapterContract.ts +170 -0
- package/src/adapters/VelodromeV2AdapterContract.ts +20 -0
- package/src/adapters/WstETHV1AdapterContract.ts +20 -0
- package/src/adapters/YearnV2AdapterContract.ts +20 -0
- package/src/adapters/abi/adapters.ts +4325 -0
- package/src/adapters/abi/iBalancerV3RouterAdapter.ts +126 -0
- package/src/adapters/abi/index.ts +2 -0
- package/src/adapters/index.ts +2 -0
- package/src/adapters/plugin.ts +90 -0
- package/src/adapters/types.ts +62 -0
- package/src/dev/AccountOpener.ts +611 -0
- package/src/dev/PriceFeedStore.ts +95 -0
- package/src/dev/SDKExample.ts +167 -0
- package/src/dev/abi.ts +14 -0
- package/src/dev/calcLiquidatableLTs.ts +77 -0
- package/src/dev/createAnvilClient.ts +155 -0
- package/src/dev/index.ts +7 -0
- package/src/dev/setLTZero.ts +127 -0
- package/src/dev/setLTs.ts +68 -0
- package/src/sdk/GearboxSDK.ts +488 -0
- package/src/sdk/abi/index.ts +1 -0
- package/src/sdk/abi/oracles.ts +4614 -0
- package/src/sdk/accounts/CreditAccountsService.ts +1123 -0
- package/src/sdk/accounts/index.ts +1 -0
- package/src/sdk/base/AddressLabeller.ts +35 -0
- package/src/sdk/base/BaseContract.ts +237 -0
- package/src/sdk/base/IAddressLabeller.ts +13 -0
- package/src/sdk/base/PlaceholderContract.ts +12 -0
- package/src/sdk/base/SDKConstruct.ts +35 -0
- package/src/sdk/base/TokensMeta.ts +45 -0
- package/src/sdk/base/index.ts +6 -0
- package/src/sdk/base/types.ts +102 -0
- package/src/sdk/bots/BotsService.ts +92 -0
- package/src/sdk/bots/index.ts +2 -0
- package/src/sdk/bots/utils.ts +19 -0
- package/src/sdk/chain/Provider.ts +99 -0
- package/src/sdk/chain/chains.ts +41 -0
- package/src/sdk/chain/detectChain.ts +21 -0
- package/src/sdk/chain/index.ts +3 -0
- package/src/sdk/constants/address-provider.ts +47 -0
- package/src/sdk/constants/addresses.ts +82 -0
- package/src/sdk/constants/bot-permissions.ts +36 -0
- package/src/sdk/constants/index.ts +6 -0
- package/src/sdk/constants/math.ts +23 -0
- package/src/sdk/constants/networks.ts +38 -0
- package/src/sdk/constants/periphery.ts +7 -0
- package/src/sdk/core/BotListV3Contract.ts +103 -0
- package/src/sdk/core/GearStakingV3Contract.ts +84 -0
- package/src/sdk/core/address-provider/AbstractAddressProviderContract.ts +101 -0
- package/src/sdk/core/address-provider/AddressProviderV3Contract.ts +105 -0
- package/src/sdk/core/address-provider/AddressProviderV3_1Contract.ts +92 -0
- package/src/sdk/core/address-provider/getAddressProvider.ts +45 -0
- package/src/sdk/core/address-provider/index.ts +4 -0
- package/src/sdk/core/address-provider/types.ts +17 -0
- package/src/sdk/core/index.ts +3 -0
- package/src/sdk/gauges/GaugeStakingService.ts +100 -0
- package/src/sdk/gauges/index.ts +2 -0
- package/src/sdk/gauges/utils.ts +25 -0
- package/src/sdk/index.ts +17 -0
- package/src/sdk/market/MarketConfiguratorContract.ts +78 -0
- package/src/sdk/market/MarketRegister.ts +330 -0
- package/src/sdk/market/MarketSuite.ts +83 -0
- package/src/sdk/market/adapters/PlaceholderAdapterContracts.ts +18 -0
- package/src/sdk/market/adapters/factory.ts +34 -0
- package/src/sdk/market/adapters/index.ts +3 -0
- package/src/sdk/market/adapters/types.ts +7 -0
- package/src/sdk/market/credit/CreditConfiguratorV300Contract.ts +164 -0
- package/src/sdk/market/credit/CreditConfiguratorV310Contract.ts +139 -0
- package/src/sdk/market/credit/CreditFacadeV300Contract.ts +206 -0
- package/src/sdk/market/credit/CreditFacadeV310Contract.ts +190 -0
- package/src/sdk/market/credit/CreditManagerV300Contract.ts +122 -0
- package/src/sdk/market/credit/CreditManagerV310Contract.ts +122 -0
- package/src/sdk/market/credit/CreditSuite.ts +65 -0
- package/src/sdk/market/credit/createCreditConfigurator.ts +18 -0
- package/src/sdk/market/credit/createCreditFacade.ts +18 -0
- package/src/sdk/market/credit/createCreditManager.ts +18 -0
- package/src/sdk/market/credit/index.ts +8 -0
- package/src/sdk/market/credit/types.ts +42 -0
- package/src/sdk/market/index.ts +7 -0
- package/src/sdk/market/oracle/PriceOracleBaseContract.ts +376 -0
- package/src/sdk/market/oracle/PriceOracleV300Contract.ts +71 -0
- package/src/sdk/market/oracle/PriceOracleV310Contract.ts +43 -0
- package/src/sdk/market/oracle/createPriceOracle.ts +22 -0
- package/src/sdk/market/oracle/index.ts +4 -0
- package/src/sdk/market/oracle/types.ts +48 -0
- package/src/sdk/market/pool/GaugeContract.ts +120 -0
- package/src/sdk/market/pool/LinearInterestRateModelContract.ts +75 -0
- package/src/sdk/market/pool/PoolQuotaKeeperV300Contract.ts +89 -0
- package/src/sdk/market/pool/PoolQuotaKeeperV310Contract.ts +89 -0
- package/src/sdk/market/pool/PoolSuite.ts +76 -0
- package/src/sdk/market/pool/PoolV300Contract.ts +144 -0
- package/src/sdk/market/pool/PoolV310Contract.ts +144 -0
- package/src/sdk/market/pool/TumblerContract.ts +73 -0
- package/src/sdk/market/pool/createInterestRateModel.ts +33 -0
- package/src/sdk/market/pool/createPool.ts +19 -0
- package/src/sdk/market/pool/createPoolQuotaKeeper.ts +20 -0
- package/src/sdk/market/pool/createRateKeeper.ts +25 -0
- package/src/sdk/market/pool/index.ts +6 -0
- package/src/sdk/market/pool/types.ts +28 -0
- package/src/sdk/market/pricefeeds/AbstractLPPriceFeed.ts +71 -0
- package/src/sdk/market/pricefeeds/AbstractPriceFeed.ts +137 -0
- package/src/sdk/market/pricefeeds/BalancerStablePriceFeed.ts +24 -0
- package/src/sdk/market/pricefeeds/BalancerWeightedPriceFeed.ts +70 -0
- package/src/sdk/market/pricefeeds/BoundedPriceFeed.ts +34 -0
- package/src/sdk/market/pricefeeds/ChainlinkPriceFeed.ts +16 -0
- package/src/sdk/market/pricefeeds/CompositePriceFeed.ts +25 -0
- package/src/sdk/market/pricefeeds/CurveCryptoPriceFeed.ts +24 -0
- package/src/sdk/market/pricefeeds/CurveStablePriceFeed.ts +24 -0
- package/src/sdk/market/pricefeeds/CurveUSDPriceFeed.ts +24 -0
- package/src/sdk/market/pricefeeds/Erc4626PriceFeed.ts +36 -0
- package/src/sdk/market/pricefeeds/MellowLRTPriceFeed.ts +26 -0
- package/src/sdk/market/pricefeeds/PendleTWAPPTPriceFeed.ts +44 -0
- package/src/sdk/market/pricefeeds/PriceFeedRef.ts +34 -0
- package/src/sdk/market/pricefeeds/PriceFeedsRegister.ts +293 -0
- package/src/sdk/market/pricefeeds/RedstonePriceFeed.ts +65 -0
- package/src/sdk/market/pricefeeds/RedstoneUpdater.ts +304 -0
- package/src/sdk/market/pricefeeds/WstETHPriceFeed.ts +24 -0
- package/src/sdk/market/pricefeeds/YearnPriceFeed.ts +24 -0
- package/src/sdk/market/pricefeeds/ZeroPriceFeed.ts +17 -0
- package/src/sdk/market/pricefeeds/index.ts +20 -0
- package/src/sdk/market/pricefeeds/types.ts +82 -0
- package/src/sdk/market/pricefeeds/utils.ts +24 -0
- package/src/sdk/plugins/index.ts +10 -0
- package/src/sdk/router/PathOptionFactory.ts +147 -0
- package/src/sdk/router/RouterV3Contract.ts +558 -0
- package/src/sdk/router/index.ts +2 -0
- package/src/sdk/router/types.ts +48 -0
- package/src/sdk/sdk-gov-legacy/contracts/adapters.ts +39 -0
- package/src/sdk/sdk-gov-legacy/contracts/contracts.ts +647 -0
- package/src/sdk/sdk-gov-legacy/contracts/index.ts +2 -0
- package/src/sdk/sdk-gov-legacy/core/constants.ts +11 -0
- package/src/sdk/sdk-gov-legacy/index.ts +4 -0
- package/src/sdk/sdk-gov-legacy/oracles/PriceFeedType.ts +24 -0
- package/src/sdk/sdk-gov-legacy/oracles/index.ts +1 -0
- package/src/sdk/sdk-gov-legacy/tokens/aave.ts +101 -0
- package/src/sdk/sdk-gov-legacy/tokens/aura.ts +284 -0
- package/src/sdk/sdk-gov-legacy/tokens/balancer.ts +421 -0
- package/src/sdk/sdk-gov-legacy/tokens/compound.ts +79 -0
- package/src/sdk/sdk-gov-legacy/tokens/convex.ts +561 -0
- package/src/sdk/sdk-gov-legacy/tokens/curveLP.ts +480 -0
- package/src/sdk/sdk-gov-legacy/tokens/decimals.ts +301 -0
- package/src/sdk/sdk-gov-legacy/tokens/erc4626.ts +75 -0
- package/src/sdk/sdk-gov-legacy/tokens/gear.ts +273 -0
- package/src/sdk/sdk-gov-legacy/tokens/index.ts +18 -0
- package/src/sdk/sdk-gov-legacy/tokens/normal.ts +613 -0
- package/src/sdk/sdk-gov-legacy/tokens/quoted.ts +10 -0
- package/src/sdk/sdk-gov-legacy/tokens/stakingRewards.ts +41 -0
- package/src/sdk/sdk-gov-legacy/tokens/token.ts +2354 -0
- package/src/sdk/sdk-gov-legacy/tokens/tokenData.ts +44 -0
- package/src/sdk/sdk-gov-legacy/tokens/tokenType.ts +33 -0
- package/src/sdk/sdk-gov-legacy/tokens/wrapped.ts +28 -0
- package/src/sdk/sdk-gov-legacy/tokens/yearn.ts +122 -0
- package/src/sdk/sdk-gov-legacy/tokens/zircuit.ts +44 -0
- package/src/sdk/sdk-legacy/apy/index.ts +149 -0
- package/src/sdk/sdk-legacy/core/assets.ts +200 -0
- package/src/sdk/sdk-legacy/core/creditAccount.spec.ts +1966 -0
- package/src/sdk/sdk-legacy/core/creditAccount.ts +816 -0
- package/src/sdk/sdk-legacy/core/creditManager.ts +316 -0
- package/src/sdk/sdk-legacy/core/creditSession.ts +352 -0
- package/src/sdk/sdk-legacy/core/endpoint.ts +131 -0
- package/src/sdk/sdk-legacy/core/eventOrTx.ts +101 -0
- package/src/sdk/sdk-legacy/core/pool.ts +439 -0
- package/src/sdk/sdk-legacy/core/strategy.ts +82 -0
- package/src/sdk/sdk-legacy/core/transactions.ts +865 -0
- package/src/sdk/sdk-legacy/gearboxRewards/api.ts +704 -0
- package/src/sdk/sdk-legacy/gearboxRewards/apy.ts +267 -0
- package/src/sdk/sdk-legacy/gearboxRewards/extraAPY.ts +165 -0
- package/src/sdk/sdk-legacy/gearboxRewards/index.ts +3 -0
- package/src/sdk/sdk-legacy/gearboxRewards/merklAPI.ts +151 -0
- package/src/sdk/sdk-legacy/index.ts +21 -0
- package/src/sdk/sdk-legacy/pathfinder/core.ts +18 -0
- package/src/sdk/sdk-legacy/pathfinder/index.ts +1 -0
- package/src/sdk/sdk-legacy/payload/creditAccount.ts +48 -0
- package/src/sdk/sdk-legacy/payload/creditManager.ts +133 -0
- package/src/sdk/sdk-legacy/payload/creditSession.ts +143 -0
- package/src/sdk/sdk-legacy/payload/graphPayload.ts +10 -0
- package/src/sdk/sdk-legacy/payload/pool.ts +198 -0
- package/src/sdk/sdk-legacy/payload/token.ts +13 -0
- package/src/sdk/sdk-legacy/tokens/tokenData.ts +57 -0
- package/src/sdk/sdk-legacy/types/IAirdropDistributor.ts +103 -0
- package/src/sdk/sdk-legacy/types/IBaseRewardPool.ts +249 -0
- package/src/sdk/sdk-legacy/types/IDataCompressorV3.ts +957 -0
- package/src/sdk/sdk-legacy/types/IDegenDistributor.ts +70 -0
- package/src/sdk/sdk-legacy/types/IERC20Permit.ts +35 -0
- package/src/sdk/sdk-legacy/types/IERC20ZapperDeposits.ts +99 -0
- package/src/sdk/sdk-legacy/types/IETHZapperDeposits.ts +27 -0
- package/src/sdk/sdk-legacy/types/IFarmingPool.ts +229 -0
- package/src/sdk/sdk-legacy/types/IInterestRateModel.ts +23 -0
- package/src/sdk/sdk-legacy/types/IMulticall3.ts +242 -0
- package/src/sdk/sdk-legacy/types/IOffchainOracle.ts +31 -0
- package/src/sdk/sdk-legacy/types/index.ts +11 -0
- package/src/sdk/sdk-legacy/utils/formatter.ts +46 -0
- package/src/sdk/sdk-legacy/utils/index.ts +3 -0
- package/src/sdk/sdk-legacy/utils/math.ts +6 -0
- package/src/sdk/sdk-legacy/utils/price.ts +27 -0
- package/src/sdk/types/index.ts +5 -0
- package/src/sdk/types/logger.ts +13 -0
- package/src/sdk/types/state-human.ts +224 -0
- package/src/sdk/types/state.ts +8 -0
- package/src/sdk/types/transactions.ts +22 -0
- package/src/sdk/types/tvl.ts +4 -0
- package/src/sdk/utils/AddressMap.ts +111 -0
- package/src/sdk/utils/bytes32ToString.ts +6 -0
- package/src/sdk/utils/childLogger.ts +8 -0
- package/src/sdk/utils/createRawTx.ts +86 -0
- package/src/sdk/utils/etherscan.ts +42 -0
- package/src/sdk/utils/filterDust.ts +20 -0
- package/src/sdk/utils/formatter.ts +124 -0
- package/src/sdk/utils/index.ts +10 -0
- package/src/sdk/utils/internal/Hooks.ts +51 -0
- package/src/sdk/utils/internal/index.ts +1 -0
- package/src/sdk/utils/json.ts +27 -0
- package/src/sdk/utils/mappers.ts +38 -0
- package/src/sdk/utils/retry.ts +24 -0
- package/src/sdk/utils/viem/detectNetwork.ts +27 -0
- package/src/sdk/utils/viem/index.ts +3 -0
- package/src/sdk/utils/viem/sendRawTx.ts +36 -0
- package/src/sdk/utils/viem/simulateMulticall.ts +262 -0
- package/tsconfig.build.json +4 -0
- package/tsconfig.json +16 -0
- package/tsup.config.ts +77 -0
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
import type { Address, Hex } from "viem";
|
|
2
|
+
import { createPublicClient, parseEventLogs } from "viem";
|
|
3
|
+
|
|
4
|
+
import type { BaseContract } from "./base";
|
|
5
|
+
import { TokensMeta } from "./base";
|
|
6
|
+
import type {
|
|
7
|
+
ConnectionOptions,
|
|
8
|
+
NetworkOptions,
|
|
9
|
+
TransportOptions,
|
|
10
|
+
} from "./chain";
|
|
11
|
+
import { createTransport, Provider } from "./chain";
|
|
12
|
+
import {
|
|
13
|
+
ADDRESS_PROVIDER,
|
|
14
|
+
AP_BOT_LIST,
|
|
15
|
+
AP_GEAR_STAKING,
|
|
16
|
+
AP_GEAR_TOKEN,
|
|
17
|
+
AP_ROUTER,
|
|
18
|
+
NO_VERSION,
|
|
19
|
+
} from "./constants";
|
|
20
|
+
import type { IAddressProviderContract } from "./core";
|
|
21
|
+
import {
|
|
22
|
+
BotListContract,
|
|
23
|
+
GearStakingContract,
|
|
24
|
+
getAddressProvider,
|
|
25
|
+
} from "./core";
|
|
26
|
+
import { MarketRegister } from "./market/MarketRegister";
|
|
27
|
+
import { PriceFeedRegister } from "./market/pricefeeds";
|
|
28
|
+
import type { IGearboxSDKPlugin } from "./plugins";
|
|
29
|
+
import { RouterV3Contract } from "./router";
|
|
30
|
+
import type {
|
|
31
|
+
GearboxState,
|
|
32
|
+
GearboxStateHuman,
|
|
33
|
+
ILogger,
|
|
34
|
+
MultiCall,
|
|
35
|
+
} from "./types";
|
|
36
|
+
import { AddressMap, formatBN } from "./utils";
|
|
37
|
+
import { Hooks } from "./utils/internal";
|
|
38
|
+
import { detectNetwork } from "./utils/viem";
|
|
39
|
+
|
|
40
|
+
export interface SDKOptions {
|
|
41
|
+
/**
|
|
42
|
+
* If not set, address provider address is determinted automatically from networkType
|
|
43
|
+
*/
|
|
44
|
+
addressProvider?: Address;
|
|
45
|
+
/**
|
|
46
|
+
* Market configurators
|
|
47
|
+
*/
|
|
48
|
+
marketConfigurators: Address[];
|
|
49
|
+
/**
|
|
50
|
+
* Attach and load state at this specific block number
|
|
51
|
+
*/
|
|
52
|
+
blockNumber?: bigint | number;
|
|
53
|
+
/**
|
|
54
|
+
* Fixed redstone historic timestamp in ms
|
|
55
|
+
* Set to true to enable redstone historical mode using timestamp from attach block
|
|
56
|
+
*/
|
|
57
|
+
redstoneHistoricTimestamp?: number | true;
|
|
58
|
+
/**
|
|
59
|
+
* Override redstone gateways. Can be used to set caching proxies, to avoid rate limiting
|
|
60
|
+
*/
|
|
61
|
+
redstoneGateways?: string[];
|
|
62
|
+
/**
|
|
63
|
+
* Will skip updateable prices on attach and sync
|
|
64
|
+
* Makes things faster when your service is not intereseted in prices
|
|
65
|
+
*/
|
|
66
|
+
ignoreUpdateablePrices?: boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Plugins to extends SDK functionality
|
|
69
|
+
*/
|
|
70
|
+
plugins?: IGearboxSDKPlugin[];
|
|
71
|
+
/**
|
|
72
|
+
* Bring your own logger
|
|
73
|
+
*/
|
|
74
|
+
logger?: ILogger;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
interface SDKContructorArgs {
|
|
78
|
+
provider: Provider;
|
|
79
|
+
logger?: ILogger;
|
|
80
|
+
plugins?: IGearboxSDKPlugin[];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
interface AttachOptionsInternal {
|
|
84
|
+
addressProvider: Address;
|
|
85
|
+
blockNumber?: bigint | number;
|
|
86
|
+
redstoneHistoricTimestamp?: number | true;
|
|
87
|
+
redstoneGateways?: string[];
|
|
88
|
+
ignoreUpdateablePrices?: boolean;
|
|
89
|
+
marketConfigurators: Address[];
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export interface SyncStateOptions {
|
|
93
|
+
blockNumber: bigint;
|
|
94
|
+
timestamp: bigint;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-definitions
|
|
98
|
+
export type SDKHooks = {
|
|
99
|
+
syncState: [];
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
export class GearboxSDK {
|
|
103
|
+
readonly #hooks = new Hooks<SDKHooks>();
|
|
104
|
+
// Represents chain object
|
|
105
|
+
readonly #provider: Provider;
|
|
106
|
+
|
|
107
|
+
// Block which was use for data query
|
|
108
|
+
#currentBlock?: bigint;
|
|
109
|
+
#timestamp?: bigint;
|
|
110
|
+
#syncing = false;
|
|
111
|
+
|
|
112
|
+
#gear?: Address;
|
|
113
|
+
|
|
114
|
+
// Collection of core singleton contracts
|
|
115
|
+
#addressProvider?: IAddressProviderContract;
|
|
116
|
+
#botListContract?: BotListContract;
|
|
117
|
+
#gearStakingContract?: GearStakingContract;
|
|
118
|
+
|
|
119
|
+
// Collection of markets
|
|
120
|
+
#marketRegister?: MarketRegister;
|
|
121
|
+
|
|
122
|
+
// Router contract
|
|
123
|
+
#router?: RouterV3Contract;
|
|
124
|
+
|
|
125
|
+
public readonly logger?: ILogger;
|
|
126
|
+
public readonly plugins: ReadonlyArray<IGearboxSDKPlugin>;
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Interest rate models can be reused across chain (and SDK operates on chain level)
|
|
130
|
+
* TODO: use whatever interface is necessary for InterestRateModels
|
|
131
|
+
*/
|
|
132
|
+
public readonly interestRateModels = new AddressMap<
|
|
133
|
+
BaseContract<readonly unknown[]>
|
|
134
|
+
>();
|
|
135
|
+
/**
|
|
136
|
+
* All price feeds known to sdk, without oracle-related data (stalenessPeriod, main/reserve, etc.)
|
|
137
|
+
*/
|
|
138
|
+
public readonly priceFeeds: PriceFeedRegister;
|
|
139
|
+
/**
|
|
140
|
+
* All contracts known to sdk
|
|
141
|
+
*/
|
|
142
|
+
public readonly contracts = new AddressMap<BaseContract<any>>(
|
|
143
|
+
undefined,
|
|
144
|
+
"contracts",
|
|
145
|
+
);
|
|
146
|
+
/**
|
|
147
|
+
* Token metadata such as symbol and decimals
|
|
148
|
+
*/
|
|
149
|
+
public readonly tokensMeta = new TokensMeta(undefined, "tokensMeta");
|
|
150
|
+
|
|
151
|
+
public addHook = this.#hooks.addHook.bind(this.#hooks);
|
|
152
|
+
public removeHook = this.#hooks.removeHook.bind(this.#hooks);
|
|
153
|
+
|
|
154
|
+
public static async attach(
|
|
155
|
+
options: SDKOptions &
|
|
156
|
+
Partial<NetworkOptions> &
|
|
157
|
+
ConnectionOptions &
|
|
158
|
+
TransportOptions,
|
|
159
|
+
): Promise<GearboxSDK> {
|
|
160
|
+
const {
|
|
161
|
+
logger,
|
|
162
|
+
plugins,
|
|
163
|
+
blockNumber,
|
|
164
|
+
redstoneHistoricTimestamp,
|
|
165
|
+
ignoreUpdateablePrices,
|
|
166
|
+
marketConfigurators,
|
|
167
|
+
} = options;
|
|
168
|
+
let { networkType, addressProvider, chainId } = options;
|
|
169
|
+
|
|
170
|
+
const attachClient = createPublicClient({
|
|
171
|
+
transport: createTransport(options),
|
|
172
|
+
});
|
|
173
|
+
if (!networkType) {
|
|
174
|
+
networkType = await detectNetwork(attachClient);
|
|
175
|
+
}
|
|
176
|
+
if (!chainId) {
|
|
177
|
+
chainId = await attachClient.getChainId();
|
|
178
|
+
}
|
|
179
|
+
if (!addressProvider) {
|
|
180
|
+
addressProvider = ADDRESS_PROVIDER[networkType];
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const provider = new Provider({
|
|
184
|
+
...options,
|
|
185
|
+
chainId,
|
|
186
|
+
networkType,
|
|
187
|
+
});
|
|
188
|
+
logger?.debug(
|
|
189
|
+
{ networkType, chainId, addressProvider, marketConfigurators },
|
|
190
|
+
"attaching gearbox sdk",
|
|
191
|
+
);
|
|
192
|
+
|
|
193
|
+
return new GearboxSDK({
|
|
194
|
+
provider,
|
|
195
|
+
logger,
|
|
196
|
+
plugins,
|
|
197
|
+
}).#attach({
|
|
198
|
+
addressProvider,
|
|
199
|
+
blockNumber,
|
|
200
|
+
redstoneHistoricTimestamp,
|
|
201
|
+
ignoreUpdateablePrices,
|
|
202
|
+
marketConfigurators,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
private constructor(options: SDKContructorArgs) {
|
|
207
|
+
this.#provider = options.provider;
|
|
208
|
+
this.logger = options.logger;
|
|
209
|
+
this.priceFeeds = new PriceFeedRegister(this);
|
|
210
|
+
this.plugins = options.plugins ?? [];
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
async #attach(opts: AttachOptionsInternal): Promise<this> {
|
|
214
|
+
const {
|
|
215
|
+
addressProvider,
|
|
216
|
+
blockNumber,
|
|
217
|
+
redstoneHistoricTimestamp,
|
|
218
|
+
redstoneGateways,
|
|
219
|
+
ignoreUpdateablePrices,
|
|
220
|
+
marketConfigurators,
|
|
221
|
+
} = opts;
|
|
222
|
+
const time = Date.now();
|
|
223
|
+
const block = await this.provider.publicClient.getBlock(
|
|
224
|
+
blockNumber
|
|
225
|
+
? { blockNumber: BigInt(blockNumber) }
|
|
226
|
+
: {
|
|
227
|
+
blockTag: "latest",
|
|
228
|
+
},
|
|
229
|
+
);
|
|
230
|
+
this.#currentBlock = block.number;
|
|
231
|
+
this.#timestamp = block.timestamp;
|
|
232
|
+
|
|
233
|
+
if (redstoneHistoricTimestamp) {
|
|
234
|
+
this.priceFeeds.redstoneUpdater.historicalTimestamp =
|
|
235
|
+
redstoneHistoricTimestamp === true
|
|
236
|
+
? Number(block.timestamp) * 1000
|
|
237
|
+
: redstoneHistoricTimestamp;
|
|
238
|
+
}
|
|
239
|
+
if (redstoneGateways?.length) {
|
|
240
|
+
this.priceFeeds.redstoneUpdater.gateways = redstoneGateways;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
this.logger?.info(
|
|
244
|
+
{
|
|
245
|
+
addressProvider,
|
|
246
|
+
blockNumber: block.number,
|
|
247
|
+
timestamp: block.timestamp,
|
|
248
|
+
},
|
|
249
|
+
"attaching",
|
|
250
|
+
);
|
|
251
|
+
this.#addressProvider = await getAddressProvider(this, addressProvider);
|
|
252
|
+
this.logger?.debug(
|
|
253
|
+
`address provider version: ${this.#addressProvider.version}`,
|
|
254
|
+
);
|
|
255
|
+
await this.#addressProvider.syncState(this.currentBlock);
|
|
256
|
+
|
|
257
|
+
// Attaching bot list contract
|
|
258
|
+
const botListAddress = this.#addressProvider.getAddress(
|
|
259
|
+
AP_BOT_LIST,
|
|
260
|
+
NO_VERSION,
|
|
261
|
+
);
|
|
262
|
+
this.#botListContract = new BotListContract(this, botListAddress);
|
|
263
|
+
|
|
264
|
+
// Attaching gear staking contract
|
|
265
|
+
this.#gear = this.#addressProvider.getAddress(AP_GEAR_TOKEN, NO_VERSION);
|
|
266
|
+
const gearStakingAddress = this.#addressProvider.getAddress(
|
|
267
|
+
AP_GEAR_STAKING,
|
|
268
|
+
NO_VERSION,
|
|
269
|
+
);
|
|
270
|
+
this.#gearStakingContract = new GearStakingContract(
|
|
271
|
+
this,
|
|
272
|
+
gearStakingAddress,
|
|
273
|
+
);
|
|
274
|
+
|
|
275
|
+
this.#marketRegister = new MarketRegister(this);
|
|
276
|
+
await this.#marketRegister.loadMarkets(
|
|
277
|
+
marketConfigurators,
|
|
278
|
+
ignoreUpdateablePrices,
|
|
279
|
+
);
|
|
280
|
+
|
|
281
|
+
try {
|
|
282
|
+
const router = this.#addressProvider.getLatestVersion(AP_ROUTER);
|
|
283
|
+
this.#router = new RouterV3Contract(this, router);
|
|
284
|
+
} catch (e) {
|
|
285
|
+
this.logger?.warn("Router not found", e);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
this.logger?.info(`attach time: ${Date.now() - time} ms`);
|
|
289
|
+
|
|
290
|
+
return this;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Converts contract call into some human-friendly string
|
|
295
|
+
* @param address
|
|
296
|
+
* @param calldata
|
|
297
|
+
* @returns
|
|
298
|
+
*/
|
|
299
|
+
public parseFunctionData(address: Address, calldata: Hex): string {
|
|
300
|
+
const contract = this.contracts.get(address);
|
|
301
|
+
// TODO: fallback to 4bytes directory
|
|
302
|
+
return contract
|
|
303
|
+
? contract.parseFunctionData(calldata)
|
|
304
|
+
: `unknown: ${address}.${calldata.slice(0, 10)}`;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Converts multicalls into some human-friendly strings
|
|
309
|
+
* @param address
|
|
310
|
+
* @param calldata
|
|
311
|
+
* @returns
|
|
312
|
+
*/
|
|
313
|
+
public parseMultiCall(calls: MultiCall[]): string[] {
|
|
314
|
+
return calls.map(call =>
|
|
315
|
+
this.parseFunctionData(call.target, call.callData),
|
|
316
|
+
);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Return args, function, type and address name from contract call
|
|
321
|
+
* @param address
|
|
322
|
+
* @param calldata
|
|
323
|
+
* @returns
|
|
324
|
+
*/
|
|
325
|
+
public parseFunctionDataToObject(address: Address, calldata: Hex) {
|
|
326
|
+
const contract = this.contracts.get(address);
|
|
327
|
+
// TODO: fallback to 4bytes directory
|
|
328
|
+
|
|
329
|
+
return contract
|
|
330
|
+
? {
|
|
331
|
+
...contract.parseFunctionDataToObject(calldata),
|
|
332
|
+
address,
|
|
333
|
+
type: contract.contractType,
|
|
334
|
+
}
|
|
335
|
+
: null;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* Converts multicalls into call info
|
|
340
|
+
* @param address
|
|
341
|
+
* @param calldata
|
|
342
|
+
* @returns
|
|
343
|
+
*/
|
|
344
|
+
public parseMultiCallToObject(calls: MultiCall[]) {
|
|
345
|
+
return calls.map(call =>
|
|
346
|
+
this.parseFunctionDataToObject(call.target, call.callData),
|
|
347
|
+
);
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
public stateHuman(raw = true): GearboxStateHuman {
|
|
351
|
+
return {
|
|
352
|
+
block: Number(this.currentBlock),
|
|
353
|
+
timestamp: Number(this.timestamp),
|
|
354
|
+
core: {
|
|
355
|
+
addressProviderV3: this.addressProvider.stateHuman(raw),
|
|
356
|
+
botList: this.botListContract.stateHuman(raw),
|
|
357
|
+
gearStakingV3: this.gearStakingContract.stateHuman(raw),
|
|
358
|
+
},
|
|
359
|
+
tokens: this.tokensMeta.values(),
|
|
360
|
+
...this.marketRegister.stateHuman(raw),
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
public get state(): GearboxState {
|
|
365
|
+
return {
|
|
366
|
+
currentBlock: this.currentBlock,
|
|
367
|
+
addressProvider: this.addressProvider.state,
|
|
368
|
+
markets: this.marketRegister.state,
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
public async tvl(): Promise<void> {
|
|
373
|
+
const { tvl, tvlUSD } = await this.marketRegister.tvl();
|
|
374
|
+
this.logger?.info(tvl);
|
|
375
|
+
this.logger?.info(`Total TVL: ${formatBN(tvlUSD, 8)}`);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* Reloads markets states based on events from last processed block to new block (defaults to latest block)
|
|
380
|
+
* @param opts
|
|
381
|
+
* @returns
|
|
382
|
+
*/
|
|
383
|
+
public async syncState(opts?: SyncStateOptions): Promise<void> {
|
|
384
|
+
let { blockNumber, timestamp } = opts ?? {};
|
|
385
|
+
if (!blockNumber) {
|
|
386
|
+
const block = await this.provider.publicClient.getBlock({
|
|
387
|
+
blockTag: "latest",
|
|
388
|
+
});
|
|
389
|
+
blockNumber = block.number;
|
|
390
|
+
timestamp = block.timestamp;
|
|
391
|
+
}
|
|
392
|
+
if (blockNumber <= this.currentBlock) {
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
if (this.#syncing) {
|
|
396
|
+
this.logger?.warn(`cannot sync to ${blockNumber}, already syncing`);
|
|
397
|
+
return;
|
|
398
|
+
}
|
|
399
|
+
this.#syncing = true;
|
|
400
|
+
this.logger?.debug(`syncing state to block ${blockNumber}...`);
|
|
401
|
+
|
|
402
|
+
const logs = await this.provider.publicClient.getLogs({
|
|
403
|
+
fromBlock: this.currentBlock,
|
|
404
|
+
toBlock: blockNumber,
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
for (const log of logs) {
|
|
408
|
+
const contract = this.contracts.get(log.address);
|
|
409
|
+
if (contract) {
|
|
410
|
+
const event = parseEventLogs({
|
|
411
|
+
abi: contract.abi,
|
|
412
|
+
logs: [log],
|
|
413
|
+
})[0];
|
|
414
|
+
contract.processLog(event);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
// This will reload all or some markets
|
|
419
|
+
await this.marketRegister.syncState();
|
|
420
|
+
// TODO: do wee need to sync state on botlist and others?
|
|
421
|
+
|
|
422
|
+
this.#currentBlock = blockNumber;
|
|
423
|
+
this.#timestamp = timestamp;
|
|
424
|
+
await this.#hooks.triggerHooks("syncState");
|
|
425
|
+
this.#syncing = false;
|
|
426
|
+
this.logger?.debug(`synced state to block ${blockNumber}`);
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
public get provider(): Provider {
|
|
430
|
+
return this.#provider;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
public get currentBlock(): bigint {
|
|
434
|
+
if (this.#currentBlock === undefined) {
|
|
435
|
+
throw new Error("Gearbox SDK not attached");
|
|
436
|
+
}
|
|
437
|
+
return this.#currentBlock;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
public get timestamp(): bigint {
|
|
441
|
+
if (this.#timestamp === undefined) {
|
|
442
|
+
throw new Error("Gearbox SDK not attached");
|
|
443
|
+
}
|
|
444
|
+
return this.#timestamp;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
public get gear(): Address {
|
|
448
|
+
if (this.#gear === undefined) {
|
|
449
|
+
throw new Error("Gearbox SDK not attached");
|
|
450
|
+
}
|
|
451
|
+
return this.#gear;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
public get addressProvider(): IAddressProviderContract {
|
|
455
|
+
if (this.#addressProvider === undefined) {
|
|
456
|
+
throw new Error("Gearbox SDK not attached");
|
|
457
|
+
}
|
|
458
|
+
return this.#addressProvider;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
public get botListContract(): BotListContract {
|
|
462
|
+
if (this.#botListContract === undefined) {
|
|
463
|
+
throw new Error("Gearbox SDK not attached");
|
|
464
|
+
}
|
|
465
|
+
return this.#botListContract;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
public get gearStakingContract(): GearStakingContract {
|
|
469
|
+
if (this.#gearStakingContract === undefined) {
|
|
470
|
+
throw new Error("Gearbox SDK not attached");
|
|
471
|
+
}
|
|
472
|
+
return this.#gearStakingContract;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
public get marketRegister(): MarketRegister {
|
|
476
|
+
if (this.#marketRegister === undefined) {
|
|
477
|
+
throw new Error("Gearbox SDK not attached");
|
|
478
|
+
}
|
|
479
|
+
return this.#marketRegister;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
public get router(): RouterV3Contract {
|
|
483
|
+
if (this.#router === undefined) {
|
|
484
|
+
throw new Error("Gearbox SDK not attached");
|
|
485
|
+
}
|
|
486
|
+
return this.#router;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./oracles";
|