@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.
Files changed (275) hide show
  1. package/.eslintignore +3 -0
  2. package/.github/workflows/lint_pr.yml +18 -0
  3. package/.github/workflows/pr.yml +39 -0
  4. package/.github/workflows/release.yml +47 -0
  5. package/.gitignore +19 -0
  6. package/.husky/commit-msg +1 -0
  7. package/.husky/pre-commit +1 -0
  8. package/.nvmrc +1 -0
  9. package/.releaserc.json +34 -0
  10. package/.vscode/extensions.json +7 -0
  11. package/.vscode/settings.json +16 -0
  12. package/.yarn/install-state.gz +0 -0
  13. package/.yarnrc.yml +1 -0
  14. package/ContributionAgreement +72 -0
  15. package/dist/cjs/abi/iZapper.cjs +85 -0
  16. package/dist/cjs/abi/iZapper.d.ts +123 -0
  17. package/dist/cjs/sdk/index.cjs +19830 -19764
  18. package/dist/cjs/sdk/index.d.ts +3746 -3061
  19. package/dist/esm/abi/iZapper.d.mts +123 -0
  20. package/dist/esm/abi/iZapper.mjs +83 -0
  21. package/dist/esm/sdk/index.d.mts +3746 -3061
  22. package/dist/esm/sdk/index.mjs +19807 -19765
  23. package/jest.config.js +7 -0
  24. package/package.json +32 -2
  25. package/scripts/example.ts +30 -0
  26. package/src/abi/compressors.ts +3962 -0
  27. package/src/abi/errors.ts +196 -0
  28. package/src/abi/iERC20.ts +122 -0
  29. package/src/abi/iPausable.ts +35 -0
  30. package/src/abi/iPriceFeedStore.ts +227 -0
  31. package/src/abi/iUpdatablePriceFeed.ts +16 -0
  32. package/src/abi/iVersion.ts +28 -0
  33. package/src/abi/iZapper.ts +84 -0
  34. package/src/abi/routerV300.ts +378 -0
  35. package/src/abi/v300.ts +4151 -0
  36. package/src/abi/v310.ts +5179 -0
  37. package/src/adapters/AbstractAdapter.ts +28 -0
  38. package/src/adapters/BalancerV2VaultAdapterContract.ts +19 -0
  39. package/src/adapters/BalancerV3RouterAdapterContract.ts +19 -0
  40. package/src/adapters/CamelotV3AdapterContract.ts +20 -0
  41. package/src/adapters/ConvexV1BaseRewardPoolAdapterContract.ts +20 -0
  42. package/src/adapters/ConvexV1BoosterAdapterContract.ts +20 -0
  43. package/src/adapters/Curve2AssetsAdapterContract.ts +20 -0
  44. package/src/adapters/Curve3AssetsAdapterContract.ts +20 -0
  45. package/src/adapters/Curve4AssetsAdapterContract.ts +20 -0
  46. package/src/adapters/CurveV1AdapterStETHContract.ts +20 -0
  47. package/src/adapters/CurveV1StableNGAdapterContract.ts +20 -0
  48. package/src/adapters/DaiUsdsAdapterContract.ts +21 -0
  49. package/src/adapters/ERC4626AdapterContract.ts +20 -0
  50. package/src/adapters/MellowERC4626VaultAdapterContract.ts +20 -0
  51. package/src/adapters/MellowVaultAdapterContract.ts +20 -0
  52. package/src/adapters/PendleRouterAdapterContract.ts +21 -0
  53. package/src/adapters/StakingRewardsAdapterContract.ts +21 -0
  54. package/src/adapters/UniswapV2AdapterContract.ts +20 -0
  55. package/src/adapters/UniswapV3AdapterContract.ts +170 -0
  56. package/src/adapters/VelodromeV2AdapterContract.ts +20 -0
  57. package/src/adapters/WstETHV1AdapterContract.ts +20 -0
  58. package/src/adapters/YearnV2AdapterContract.ts +20 -0
  59. package/src/adapters/abi/adapters.ts +4325 -0
  60. package/src/adapters/abi/iBalancerV3RouterAdapter.ts +126 -0
  61. package/src/adapters/abi/index.ts +2 -0
  62. package/src/adapters/index.ts +2 -0
  63. package/src/adapters/plugin.ts +90 -0
  64. package/src/adapters/types.ts +62 -0
  65. package/src/dev/AccountOpener.ts +611 -0
  66. package/src/dev/PriceFeedStore.ts +95 -0
  67. package/src/dev/SDKExample.ts +167 -0
  68. package/src/dev/abi.ts +14 -0
  69. package/src/dev/calcLiquidatableLTs.ts +77 -0
  70. package/src/dev/createAnvilClient.ts +155 -0
  71. package/src/dev/index.ts +7 -0
  72. package/src/dev/setLTZero.ts +127 -0
  73. package/src/dev/setLTs.ts +68 -0
  74. package/src/sdk/GearboxSDK.ts +488 -0
  75. package/src/sdk/abi/index.ts +1 -0
  76. package/src/sdk/abi/oracles.ts +4614 -0
  77. package/src/sdk/accounts/CreditAccountsService.ts +1123 -0
  78. package/src/sdk/accounts/index.ts +1 -0
  79. package/src/sdk/base/AddressLabeller.ts +35 -0
  80. package/src/sdk/base/BaseContract.ts +237 -0
  81. package/src/sdk/base/IAddressLabeller.ts +13 -0
  82. package/src/sdk/base/PlaceholderContract.ts +12 -0
  83. package/src/sdk/base/SDKConstruct.ts +35 -0
  84. package/src/sdk/base/TokensMeta.ts +45 -0
  85. package/src/sdk/base/index.ts +6 -0
  86. package/src/sdk/base/types.ts +102 -0
  87. package/src/sdk/bots/BotsService.ts +92 -0
  88. package/src/sdk/bots/index.ts +2 -0
  89. package/src/sdk/bots/utils.ts +19 -0
  90. package/src/sdk/chain/Provider.ts +99 -0
  91. package/src/sdk/chain/chains.ts +41 -0
  92. package/src/sdk/chain/detectChain.ts +21 -0
  93. package/src/sdk/chain/index.ts +3 -0
  94. package/src/sdk/constants/address-provider.ts +47 -0
  95. package/src/sdk/constants/addresses.ts +82 -0
  96. package/src/sdk/constants/bot-permissions.ts +36 -0
  97. package/src/sdk/constants/index.ts +6 -0
  98. package/src/sdk/constants/math.ts +23 -0
  99. package/src/sdk/constants/networks.ts +38 -0
  100. package/src/sdk/constants/periphery.ts +7 -0
  101. package/src/sdk/core/BotListV3Contract.ts +103 -0
  102. package/src/sdk/core/GearStakingV3Contract.ts +84 -0
  103. package/src/sdk/core/address-provider/AbstractAddressProviderContract.ts +101 -0
  104. package/src/sdk/core/address-provider/AddressProviderV3Contract.ts +105 -0
  105. package/src/sdk/core/address-provider/AddressProviderV3_1Contract.ts +92 -0
  106. package/src/sdk/core/address-provider/getAddressProvider.ts +45 -0
  107. package/src/sdk/core/address-provider/index.ts +4 -0
  108. package/src/sdk/core/address-provider/types.ts +17 -0
  109. package/src/sdk/core/index.ts +3 -0
  110. package/src/sdk/gauges/GaugeStakingService.ts +100 -0
  111. package/src/sdk/gauges/index.ts +2 -0
  112. package/src/sdk/gauges/utils.ts +25 -0
  113. package/src/sdk/index.ts +17 -0
  114. package/src/sdk/market/MarketConfiguratorContract.ts +78 -0
  115. package/src/sdk/market/MarketRegister.ts +330 -0
  116. package/src/sdk/market/MarketSuite.ts +83 -0
  117. package/src/sdk/market/adapters/PlaceholderAdapterContracts.ts +18 -0
  118. package/src/sdk/market/adapters/factory.ts +34 -0
  119. package/src/sdk/market/adapters/index.ts +3 -0
  120. package/src/sdk/market/adapters/types.ts +7 -0
  121. package/src/sdk/market/credit/CreditConfiguratorV300Contract.ts +164 -0
  122. package/src/sdk/market/credit/CreditConfiguratorV310Contract.ts +139 -0
  123. package/src/sdk/market/credit/CreditFacadeV300Contract.ts +206 -0
  124. package/src/sdk/market/credit/CreditFacadeV310Contract.ts +190 -0
  125. package/src/sdk/market/credit/CreditManagerV300Contract.ts +122 -0
  126. package/src/sdk/market/credit/CreditManagerV310Contract.ts +122 -0
  127. package/src/sdk/market/credit/CreditSuite.ts +65 -0
  128. package/src/sdk/market/credit/createCreditConfigurator.ts +18 -0
  129. package/src/sdk/market/credit/createCreditFacade.ts +18 -0
  130. package/src/sdk/market/credit/createCreditManager.ts +18 -0
  131. package/src/sdk/market/credit/index.ts +8 -0
  132. package/src/sdk/market/credit/types.ts +42 -0
  133. package/src/sdk/market/index.ts +7 -0
  134. package/src/sdk/market/oracle/PriceOracleBaseContract.ts +376 -0
  135. package/src/sdk/market/oracle/PriceOracleV300Contract.ts +71 -0
  136. package/src/sdk/market/oracle/PriceOracleV310Contract.ts +43 -0
  137. package/src/sdk/market/oracle/createPriceOracle.ts +22 -0
  138. package/src/sdk/market/oracle/index.ts +4 -0
  139. package/src/sdk/market/oracle/types.ts +48 -0
  140. package/src/sdk/market/pool/GaugeContract.ts +120 -0
  141. package/src/sdk/market/pool/LinearInterestRateModelContract.ts +75 -0
  142. package/src/sdk/market/pool/PoolQuotaKeeperV300Contract.ts +89 -0
  143. package/src/sdk/market/pool/PoolQuotaKeeperV310Contract.ts +89 -0
  144. package/src/sdk/market/pool/PoolSuite.ts +76 -0
  145. package/src/sdk/market/pool/PoolV300Contract.ts +144 -0
  146. package/src/sdk/market/pool/PoolV310Contract.ts +144 -0
  147. package/src/sdk/market/pool/TumblerContract.ts +73 -0
  148. package/src/sdk/market/pool/createInterestRateModel.ts +33 -0
  149. package/src/sdk/market/pool/createPool.ts +19 -0
  150. package/src/sdk/market/pool/createPoolQuotaKeeper.ts +20 -0
  151. package/src/sdk/market/pool/createRateKeeper.ts +25 -0
  152. package/src/sdk/market/pool/index.ts +6 -0
  153. package/src/sdk/market/pool/types.ts +28 -0
  154. package/src/sdk/market/pricefeeds/AbstractLPPriceFeed.ts +71 -0
  155. package/src/sdk/market/pricefeeds/AbstractPriceFeed.ts +137 -0
  156. package/src/sdk/market/pricefeeds/BalancerStablePriceFeed.ts +24 -0
  157. package/src/sdk/market/pricefeeds/BalancerWeightedPriceFeed.ts +70 -0
  158. package/src/sdk/market/pricefeeds/BoundedPriceFeed.ts +34 -0
  159. package/src/sdk/market/pricefeeds/ChainlinkPriceFeed.ts +16 -0
  160. package/src/sdk/market/pricefeeds/CompositePriceFeed.ts +25 -0
  161. package/src/sdk/market/pricefeeds/CurveCryptoPriceFeed.ts +24 -0
  162. package/src/sdk/market/pricefeeds/CurveStablePriceFeed.ts +24 -0
  163. package/src/sdk/market/pricefeeds/CurveUSDPriceFeed.ts +24 -0
  164. package/src/sdk/market/pricefeeds/Erc4626PriceFeed.ts +36 -0
  165. package/src/sdk/market/pricefeeds/MellowLRTPriceFeed.ts +26 -0
  166. package/src/sdk/market/pricefeeds/PendleTWAPPTPriceFeed.ts +44 -0
  167. package/src/sdk/market/pricefeeds/PriceFeedRef.ts +34 -0
  168. package/src/sdk/market/pricefeeds/PriceFeedsRegister.ts +293 -0
  169. package/src/sdk/market/pricefeeds/RedstonePriceFeed.ts +65 -0
  170. package/src/sdk/market/pricefeeds/RedstoneUpdater.ts +304 -0
  171. package/src/sdk/market/pricefeeds/WstETHPriceFeed.ts +24 -0
  172. package/src/sdk/market/pricefeeds/YearnPriceFeed.ts +24 -0
  173. package/src/sdk/market/pricefeeds/ZeroPriceFeed.ts +17 -0
  174. package/src/sdk/market/pricefeeds/index.ts +20 -0
  175. package/src/sdk/market/pricefeeds/types.ts +82 -0
  176. package/src/sdk/market/pricefeeds/utils.ts +24 -0
  177. package/src/sdk/plugins/index.ts +10 -0
  178. package/src/sdk/router/PathOptionFactory.ts +147 -0
  179. package/src/sdk/router/RouterV3Contract.ts +558 -0
  180. package/src/sdk/router/index.ts +2 -0
  181. package/src/sdk/router/types.ts +48 -0
  182. package/src/sdk/sdk-gov-legacy/contracts/adapters.ts +39 -0
  183. package/src/sdk/sdk-gov-legacy/contracts/contracts.ts +647 -0
  184. package/src/sdk/sdk-gov-legacy/contracts/index.ts +2 -0
  185. package/src/sdk/sdk-gov-legacy/core/constants.ts +11 -0
  186. package/src/sdk/sdk-gov-legacy/index.ts +4 -0
  187. package/src/sdk/sdk-gov-legacy/oracles/PriceFeedType.ts +24 -0
  188. package/src/sdk/sdk-gov-legacy/oracles/index.ts +1 -0
  189. package/src/sdk/sdk-gov-legacy/tokens/aave.ts +101 -0
  190. package/src/sdk/sdk-gov-legacy/tokens/aura.ts +284 -0
  191. package/src/sdk/sdk-gov-legacy/tokens/balancer.ts +421 -0
  192. package/src/sdk/sdk-gov-legacy/tokens/compound.ts +79 -0
  193. package/src/sdk/sdk-gov-legacy/tokens/convex.ts +561 -0
  194. package/src/sdk/sdk-gov-legacy/tokens/curveLP.ts +480 -0
  195. package/src/sdk/sdk-gov-legacy/tokens/decimals.ts +301 -0
  196. package/src/sdk/sdk-gov-legacy/tokens/erc4626.ts +75 -0
  197. package/src/sdk/sdk-gov-legacy/tokens/gear.ts +273 -0
  198. package/src/sdk/sdk-gov-legacy/tokens/index.ts +18 -0
  199. package/src/sdk/sdk-gov-legacy/tokens/normal.ts +613 -0
  200. package/src/sdk/sdk-gov-legacy/tokens/quoted.ts +10 -0
  201. package/src/sdk/sdk-gov-legacy/tokens/stakingRewards.ts +41 -0
  202. package/src/sdk/sdk-gov-legacy/tokens/token.ts +2354 -0
  203. package/src/sdk/sdk-gov-legacy/tokens/tokenData.ts +44 -0
  204. package/src/sdk/sdk-gov-legacy/tokens/tokenType.ts +33 -0
  205. package/src/sdk/sdk-gov-legacy/tokens/wrapped.ts +28 -0
  206. package/src/sdk/sdk-gov-legacy/tokens/yearn.ts +122 -0
  207. package/src/sdk/sdk-gov-legacy/tokens/zircuit.ts +44 -0
  208. package/src/sdk/sdk-legacy/apy/index.ts +149 -0
  209. package/src/sdk/sdk-legacy/core/assets.ts +200 -0
  210. package/src/sdk/sdk-legacy/core/creditAccount.spec.ts +1966 -0
  211. package/src/sdk/sdk-legacy/core/creditAccount.ts +816 -0
  212. package/src/sdk/sdk-legacy/core/creditManager.ts +316 -0
  213. package/src/sdk/sdk-legacy/core/creditSession.ts +352 -0
  214. package/src/sdk/sdk-legacy/core/endpoint.ts +131 -0
  215. package/src/sdk/sdk-legacy/core/eventOrTx.ts +101 -0
  216. package/src/sdk/sdk-legacy/core/pool.ts +439 -0
  217. package/src/sdk/sdk-legacy/core/strategy.ts +82 -0
  218. package/src/sdk/sdk-legacy/core/transactions.ts +865 -0
  219. package/src/sdk/sdk-legacy/gearboxRewards/api.ts +704 -0
  220. package/src/sdk/sdk-legacy/gearboxRewards/apy.ts +267 -0
  221. package/src/sdk/sdk-legacy/gearboxRewards/extraAPY.ts +165 -0
  222. package/src/sdk/sdk-legacy/gearboxRewards/index.ts +3 -0
  223. package/src/sdk/sdk-legacy/gearboxRewards/merklAPI.ts +151 -0
  224. package/src/sdk/sdk-legacy/index.ts +21 -0
  225. package/src/sdk/sdk-legacy/pathfinder/core.ts +18 -0
  226. package/src/sdk/sdk-legacy/pathfinder/index.ts +1 -0
  227. package/src/sdk/sdk-legacy/payload/creditAccount.ts +48 -0
  228. package/src/sdk/sdk-legacy/payload/creditManager.ts +133 -0
  229. package/src/sdk/sdk-legacy/payload/creditSession.ts +143 -0
  230. package/src/sdk/sdk-legacy/payload/graphPayload.ts +10 -0
  231. package/src/sdk/sdk-legacy/payload/pool.ts +198 -0
  232. package/src/sdk/sdk-legacy/payload/token.ts +13 -0
  233. package/src/sdk/sdk-legacy/tokens/tokenData.ts +57 -0
  234. package/src/sdk/sdk-legacy/types/IAirdropDistributor.ts +103 -0
  235. package/src/sdk/sdk-legacy/types/IBaseRewardPool.ts +249 -0
  236. package/src/sdk/sdk-legacy/types/IDataCompressorV3.ts +957 -0
  237. package/src/sdk/sdk-legacy/types/IDegenDistributor.ts +70 -0
  238. package/src/sdk/sdk-legacy/types/IERC20Permit.ts +35 -0
  239. package/src/sdk/sdk-legacy/types/IERC20ZapperDeposits.ts +99 -0
  240. package/src/sdk/sdk-legacy/types/IETHZapperDeposits.ts +27 -0
  241. package/src/sdk/sdk-legacy/types/IFarmingPool.ts +229 -0
  242. package/src/sdk/sdk-legacy/types/IInterestRateModel.ts +23 -0
  243. package/src/sdk/sdk-legacy/types/IMulticall3.ts +242 -0
  244. package/src/sdk/sdk-legacy/types/IOffchainOracle.ts +31 -0
  245. package/src/sdk/sdk-legacy/types/index.ts +11 -0
  246. package/src/sdk/sdk-legacy/utils/formatter.ts +46 -0
  247. package/src/sdk/sdk-legacy/utils/index.ts +3 -0
  248. package/src/sdk/sdk-legacy/utils/math.ts +6 -0
  249. package/src/sdk/sdk-legacy/utils/price.ts +27 -0
  250. package/src/sdk/types/index.ts +5 -0
  251. package/src/sdk/types/logger.ts +13 -0
  252. package/src/sdk/types/state-human.ts +224 -0
  253. package/src/sdk/types/state.ts +8 -0
  254. package/src/sdk/types/transactions.ts +22 -0
  255. package/src/sdk/types/tvl.ts +4 -0
  256. package/src/sdk/utils/AddressMap.ts +111 -0
  257. package/src/sdk/utils/bytes32ToString.ts +6 -0
  258. package/src/sdk/utils/childLogger.ts +8 -0
  259. package/src/sdk/utils/createRawTx.ts +86 -0
  260. package/src/sdk/utils/etherscan.ts +42 -0
  261. package/src/sdk/utils/filterDust.ts +20 -0
  262. package/src/sdk/utils/formatter.ts +124 -0
  263. package/src/sdk/utils/index.ts +10 -0
  264. package/src/sdk/utils/internal/Hooks.ts +51 -0
  265. package/src/sdk/utils/internal/index.ts +1 -0
  266. package/src/sdk/utils/json.ts +27 -0
  267. package/src/sdk/utils/mappers.ts +38 -0
  268. package/src/sdk/utils/retry.ts +24 -0
  269. package/src/sdk/utils/viem/detectNetwork.ts +27 -0
  270. package/src/sdk/utils/viem/index.ts +3 -0
  271. package/src/sdk/utils/viem/sendRawTx.ts +36 -0
  272. package/src/sdk/utils/viem/simulateMulticall.ts +262 -0
  273. package/tsconfig.build.json +4 -0
  274. package/tsconfig.json +16 -0
  275. 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";