@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,704 @@
1
+ import axios from "axios";
2
+ import type { Address, PublicClient, WalletClient } from "viem";
3
+ import { getAddress, getContract } from "viem";
4
+
5
+ import type { NetworkType } from "../../chain";
6
+ import { chains } from "../../chain";
7
+ import { MULTICALL_ADDRESS } from "../../constants";
8
+ import type { SupportedToken } from "../../sdk-gov-legacy";
9
+ import { toBigInt, TypedObjectUtils } from "../../utils";
10
+ import { GearboxBackendApi } from "../core/endpoint";
11
+ import type { PoolData_Legacy } from "../core/pool";
12
+ import type { TokenData } from "../tokens/tokenData";
13
+ import { iAirdropDistributorAbi, iFarmingPoolAbi } from "../types";
14
+ import { BigIntMath } from "../utils/math";
15
+ import type { ExtraRewardApy } from "./apy";
16
+ import type {
17
+ MerkleXYZUserRewardsV4Response,
18
+ MerkleXYZV4CampaignsResponse,
19
+ MerkleXYZV4RewardCampaignResponse,
20
+ MerklXYZV4RewardCampaign,
21
+ } from "./merklAPI";
22
+ import { MerkleXYZApi } from "./merklAPI";
23
+
24
+ export interface GearboxExtraMerkleLmReward {
25
+ pool: Address;
26
+ poolToken: Address;
27
+
28
+ rewardTokenSymbol: string;
29
+ rewardTokenDecimals: number;
30
+ rewardToken: Address;
31
+ amount: bigint;
32
+
33
+ type: "extraMerkle";
34
+ }
35
+ export interface GearboxStakedV3LmReward {
36
+ pool: Address;
37
+ poolToken: Address;
38
+
39
+ rewardTokenSymbol: string;
40
+ rewardTokenDecimals: number;
41
+ rewardToken: Address;
42
+ amount: bigint;
43
+
44
+ type: "stakedV3";
45
+ }
46
+ export interface GearboxMerkleV2LmReward {
47
+ pool?: undefined;
48
+ poolToken?: undefined;
49
+
50
+ rewardTokenSymbol: string;
51
+ rewardTokenDecimals: number;
52
+ rewardToken: Address;
53
+ amount: bigint;
54
+
55
+ type: "merkleV2";
56
+ }
57
+
58
+ export type GearboxLmReward =
59
+ | GearboxStakedV3LmReward
60
+ | GearboxMerkleV2LmReward
61
+ | GearboxExtraMerkleLmReward;
62
+
63
+ interface GetTotalClaimedProps {
64
+ account: Address;
65
+ provider: PublicClient;
66
+ airdropDistributorAddress: Address;
67
+ }
68
+
69
+ interface GetAmountOnContractProps {
70
+ account: Address;
71
+ merkleData: MerkleDistributorInfo | undefined;
72
+ }
73
+
74
+ export interface MerkleDistributorInfo {
75
+ merkleRoot: string;
76
+ tokenTotal: string;
77
+ claims: Record<
78
+ string,
79
+ {
80
+ index: number;
81
+ amount: string;
82
+ proof: Array<Address>;
83
+ }
84
+ >;
85
+ }
86
+
87
+ interface FarmInfoOutput {
88
+ finished: number;
89
+ duration: number;
90
+ reward: bigint;
91
+ balance: bigint;
92
+ }
93
+ export interface FarmInfo {
94
+ pool: Address;
95
+ finished: bigint;
96
+ duration: bigint;
97
+ reward: bigint;
98
+ balance: bigint;
99
+ symbol: SupportedToken;
100
+ }
101
+
102
+ type ReportHandler = (e: unknown, description?: string) => void;
103
+
104
+ export interface GetLmRewardsInfoProps {
105
+ pools: Record<Address, PoolData_Legacy>;
106
+ tokensList: Record<Address, TokenData>;
107
+ provider: PublicClient;
108
+ }
109
+
110
+ export interface GetExtraRewardsProps {
111
+ chainId: number;
112
+ tokensList: Record<Address, TokenData>;
113
+ }
114
+
115
+ export interface GetLmRewardsProps {
116
+ pools: Record<Address, PoolData_Legacy>;
117
+
118
+ baseRewardPoolsInfo: Record<string, FarmInfo>;
119
+ currentTokenData: Record<SupportedToken, Address>;
120
+ tokensList: Record<Address, TokenData>;
121
+ account: Address;
122
+ provider: PublicClient;
123
+
124
+ airdropDistributorAddress: Address | undefined;
125
+ network: NetworkType;
126
+ reportError?: ReportHandler;
127
+ }
128
+
129
+ export interface ClaimLmRewardsV2Props {
130
+ signer: WalletClient;
131
+ account: Address;
132
+ provider: PublicClient;
133
+
134
+ airdropDistributorAddress: Address | undefined;
135
+ network: NetworkType;
136
+ }
137
+
138
+ export interface ClaimLmRewardsV3Props {
139
+ reward: GearboxStakedV3LmReward;
140
+ account: Address;
141
+ signer: WalletClient;
142
+ }
143
+
144
+ const BROKEN_CAMPAIGNS: Record<string, boolean> = {
145
+ "11136065905617273958": true,
146
+ };
147
+
148
+ export class GearboxRewardsApi {
149
+ static async getExtraRewards({ chainId, tokensList }: GetExtraRewardsProps) {
150
+ const res = await axios.get<MerkleXYZV4CampaignsResponse>(
151
+ MerkleXYZApi.getGearboxCampaignsUrl(),
152
+ );
153
+ const currentActiveCampaigns = res.data.filter(
154
+ c =>
155
+ c.status === "LIVE" && c.chainId === chainId && !BROKEN_CAMPAIGNS[c.id],
156
+ );
157
+
158
+ const aprIdsList = currentActiveCampaigns
159
+ .map(c =>
160
+ // apr token for campaigns with a single reward is obvious
161
+ c.aprRecord.breakdowns.length > 1
162
+ ? c.aprRecord.breakdowns.map(b => {
163
+ return {
164
+ campaignId: c.id,
165
+ aprId: b.identifier,
166
+ };
167
+ })
168
+ : [],
169
+ )
170
+ .flat(1);
171
+
172
+ const aprIdsResponse = await Promise.allSettled(
173
+ aprIdsList.map(id =>
174
+ axios.get<MerkleXYZV4RewardCampaignResponse>(
175
+ MerkleXYZApi.getGearboxRewardCampaignUrl(id.aprId),
176
+ ),
177
+ ),
178
+ );
179
+
180
+ const aprCampaignByAPRId = aprIdsResponse.reduce<
181
+ Record<Address, Array<MerklXYZV4RewardCampaign> | undefined>
182
+ >((acc, r, i) => {
183
+ const id = aprIdsList[i].aprId;
184
+ acc[id] = r.status === "fulfilled" ? r.value.data : undefined;
185
+
186
+ return acc;
187
+ }, {});
188
+
189
+ const r = currentActiveCampaigns.reduce<
190
+ Record<Address, Array<ExtraRewardApy>>
191
+ >((acc, campaign) => {
192
+ const rewardSource = (
193
+ campaign.tokens[0]?.address || campaign.identifier
194
+ ).toLowerCase() as Address;
195
+
196
+ const allRewards = campaign.aprRecord.breakdowns
197
+ .map((r, i) => {
198
+ const apy = r.value;
199
+
200
+ const { rewardToken } = aprCampaignByAPRId[r.identifier]?.[0] || {};
201
+ const tokenRewardsRecord =
202
+ campaign.rewardsRecord.breakdowns[i]?.token;
203
+
204
+ const { address = tokenRewardsRecord?.address || "" } =
205
+ rewardToken || {};
206
+
207
+ const tokenLc = address.toLowerCase() as Address;
208
+ const {
209
+ symbol = rewardToken?.symbol || tokenRewardsRecord?.symbol || "",
210
+ } = tokensList[tokenLc] || {};
211
+
212
+ const apyObject: ExtraRewardApy = {
213
+ token: rewardSource,
214
+ balance: null,
215
+
216
+ apy: apy,
217
+ rewardToken: tokenLc,
218
+ rewardTokenSymbol: symbol,
219
+ };
220
+
221
+ return apyObject;
222
+ })
223
+ .filter(r => r.apy > 0);
224
+
225
+ acc[rewardSource] = [...(acc[rewardSource] || []), ...allRewards];
226
+
227
+ return acc;
228
+ }, {});
229
+
230
+ return r;
231
+ }
232
+
233
+ static async getLmRewardsInfo({
234
+ pools,
235
+ provider,
236
+ tokensList,
237
+ }: GetLmRewardsInfoProps) {
238
+ const poolByStakedDiesel = Object.values(pools).reduce<
239
+ Record<Address, Address>
240
+ >((acc, p) => {
241
+ p.stakedDieselToken.forEach(t => {
242
+ if (t) acc[t] = p.address;
243
+ });
244
+ p.stakedDieselToken_old.forEach(t => {
245
+ if (t) acc[t] = p.address;
246
+ });
247
+
248
+ return acc;
249
+ }, {});
250
+
251
+ const poolByDiesel = Object.values(pools).reduce<Record<Address, Address>>(
252
+ (acc, p) => {
253
+ acc[p.dieselToken] = p.address;
254
+
255
+ return acc;
256
+ },
257
+ {},
258
+ );
259
+
260
+ const poolByItsToken = { ...poolByStakedDiesel, ...poolByDiesel };
261
+
262
+ const poolStakedTokens = TypedObjectUtils.keys(poolByStakedDiesel);
263
+ const allPoolTokens = TypedObjectUtils.keys(poolByItsToken);
264
+
265
+ const farmInfoCalls = poolStakedTokens.map(address => ({
266
+ address,
267
+ abi: iFarmingPoolAbi,
268
+ functionName: "farmInfo",
269
+ args: [],
270
+ }));
271
+
272
+ const farmSupplyCalls = allPoolTokens.map(address => ({
273
+ address,
274
+ abi: iFarmingPoolAbi,
275
+ functionName: "totalSupply",
276
+ args: [],
277
+ }));
278
+
279
+ const rewardTokenCalls = poolStakedTokens.map(address => ({
280
+ address,
281
+ abi: POOL_REWARDS_ABI,
282
+ functionName: "rewardsToken",
283
+ args: [],
284
+ }));
285
+
286
+ const mc = await provider.multicall({
287
+ allowFailure: false,
288
+ multicallAddress: MULTICALL_ADDRESS,
289
+ contracts: [...farmInfoCalls, ...farmSupplyCalls, ...rewardTokenCalls],
290
+ });
291
+
292
+ const mcResponse = mc;
293
+ const [...restMCResponse] = mcResponse;
294
+
295
+ const farmInfoCallsEnd = farmInfoCalls.length;
296
+ const farmInfo = restMCResponse.slice(
297
+ 0,
298
+ farmInfoCallsEnd,
299
+ ) as Array<FarmInfoOutput>;
300
+
301
+ const farmSupplyCallsEnd = farmInfoCallsEnd + farmSupplyCalls.length;
302
+ const farmSupply = restMCResponse.slice(
303
+ farmInfoCallsEnd,
304
+ farmSupplyCallsEnd,
305
+ ) as Array<bigint>;
306
+
307
+ const rewardTokenCallsEnd = farmSupplyCallsEnd + rewardTokenCalls.length;
308
+ const rewardTokens = restMCResponse.slice(
309
+ farmSupplyCallsEnd,
310
+ rewardTokenCallsEnd,
311
+ ) as Array<Address>;
312
+
313
+ const infoByPool = poolStakedTokens.reduce<Record<Address, FarmInfoOutput>>(
314
+ (acc, p, index) => {
315
+ const info = farmInfo[index];
316
+
317
+ if (info) acc[p] = info;
318
+
319
+ return acc;
320
+ },
321
+ {},
322
+ );
323
+
324
+ const rewardTokenPool = poolStakedTokens.reduce<Record<Address, Address>>(
325
+ (acc, p, index) => {
326
+ const token = rewardTokens[index];
327
+
328
+ if (token) {
329
+ acc[p] = token.toLowerCase() as Address;
330
+ }
331
+
332
+ return acc;
333
+ },
334
+ {},
335
+ );
336
+
337
+ const stakedTokenRewards = allPoolTokens.reduce<{
338
+ base: Record<string, FarmInfo>;
339
+ all: Record<string, Array<FarmInfo>>;
340
+ }>(
341
+ (acc, pool) => {
342
+ const info = infoByPool[pool];
343
+ const token = rewardTokenPool[pool];
344
+ const tokenData = tokensList[token];
345
+
346
+ const baseReward: FarmInfo | undefined =
347
+ info && tokenData
348
+ ? {
349
+ pool: poolByItsToken[pool],
350
+ duration: BigInt(info.duration),
351
+ finished: BigInt(info.finished),
352
+ reward: info.reward,
353
+ balance: info.balance,
354
+ symbol: tokenData.symbol,
355
+ }
356
+ : undefined;
357
+
358
+ if (baseReward) acc.base[pool] = baseReward;
359
+ acc.all[pool] = [...(baseReward ? [baseReward] : [])];
360
+
361
+ return acc;
362
+ },
363
+ { base: {}, all: {} },
364
+ );
365
+
366
+ const rewardPoolsSupply = allPoolTokens.reduce<Record<string, bigint>>(
367
+ (acc, address, i) => {
368
+ acc[address] = farmSupply[i] || 0n;
369
+
370
+ return acc;
371
+ },
372
+ {},
373
+ );
374
+
375
+ return {
376
+ rewardPoolsInfo: stakedTokenRewards.all,
377
+ baseRewardPoolsInfo: stakedTokenRewards.base,
378
+ rewardPoolsSupply,
379
+ };
380
+ }
381
+
382
+ static async getLmRewardsV2({
383
+ provider,
384
+ account,
385
+ currentTokenData,
386
+
387
+ network,
388
+ airdropDistributorAddress,
389
+ }: GetLmRewardsProps) {
390
+ if (!airdropDistributorAddress) return { rewards: [] };
391
+
392
+ const [claimedResp, merkleDataResp] = await Promise.all([
393
+ this.getClaimed({ airdropDistributorAddress, provider, account }),
394
+ this.getMerkle(provider, airdropDistributorAddress, network, account),
395
+ ]);
396
+
397
+ const amountOnContract = this.getAmountOnContract({
398
+ account,
399
+ merkleData: merkleDataResp,
400
+ });
401
+ const diff = amountOnContract - claimedResp;
402
+ const availableToClaimV2 = BigIntMath.max(0n, diff);
403
+
404
+ const rewards: Array<GearboxLmReward> = [
405
+ {
406
+ amount: availableToClaimV2,
407
+ type: "merkleV2",
408
+
409
+ rewardToken: currentTokenData.GEAR,
410
+ rewardTokenDecimals: 18,
411
+ rewardTokenSymbol: "GEAR",
412
+ },
413
+ ];
414
+
415
+ return { rewards: rewards };
416
+ }
417
+
418
+ static async getLmRewardsV3({
419
+ pools,
420
+
421
+ baseRewardPoolsInfo,
422
+ currentTokenData,
423
+ tokensList,
424
+ provider,
425
+ account,
426
+
427
+ network,
428
+ reportError,
429
+ }: GetLmRewardsProps) {
430
+ const poolTokens = Object.keys(baseRewardPoolsInfo) as Array<Address>;
431
+
432
+ const [gearboxLmResponse, merkleXYZLMResponse] = await Promise.allSettled([
433
+ provider.multicall({
434
+ allowFailure: false,
435
+ multicallAddress: MULTICALL_ADDRESS,
436
+ contracts: poolTokens.map(address => ({
437
+ address: address,
438
+ abi: iFarmingPoolAbi,
439
+ functionName: "farmed",
440
+ args: [account],
441
+ })),
442
+ }),
443
+ axios.get<MerkleXYZUserRewardsV4Response>(
444
+ MerkleXYZApi.getUserRewardsUrl({
445
+ params: {
446
+ chainId: chains[network].id,
447
+ user: getAddress(account),
448
+ },
449
+ }),
450
+ ),
451
+ ]);
452
+
453
+ const gearboxLm = (this.extractFulfilled(
454
+ gearboxLmResponse,
455
+ reportError,
456
+ "v3Rewards",
457
+ ) || []) as Array<bigint>;
458
+ const merkleXYZLm = this.extractFulfilled(
459
+ merkleXYZLMResponse,
460
+ reportError,
461
+ "merkleRewards",
462
+ )?.data;
463
+
464
+ const poolByItsToken = Object.values(pools).reduce<
465
+ Record<Address, Address>
466
+ >((acc, p) => {
467
+ p.stakedDieselToken.forEach(t => {
468
+ if (t) acc[t] = p.address;
469
+ });
470
+ p.stakedDieselToken_old.forEach(t => {
471
+ if (t) acc[t] = p.address;
472
+ });
473
+
474
+ acc[p.dieselToken] = p.address;
475
+
476
+ return acc;
477
+ }, {});
478
+
479
+ const extraRewards = (merkleXYZLm || []).reduce<Array<GearboxLmReward>>(
480
+ (acc, chainRewards) => {
481
+ chainRewards.rewards.forEach(reward => {
482
+ const rewardToken = reward.token.address.toLowerCase() as Address;
483
+
484
+ reward.breakdowns.forEach(reason => {
485
+ const poolToken = (
486
+ (reason.reason || "").split("_")[1] || ""
487
+ ).toLowerCase() as Address;
488
+
489
+ const pool = (
490
+ baseRewardPoolsInfo[poolToken]?.pool ||
491
+ poolToken ||
492
+ ""
493
+ ).toLowerCase() as Address;
494
+
495
+ if (poolByItsToken[poolToken] && poolByItsToken[pool]) {
496
+ const total = toBigInt(reason.amount || 0);
497
+ const claimed = toBigInt(reason.claimed || 0);
498
+
499
+ acc.push({
500
+ pool,
501
+ poolToken,
502
+ rewardToken,
503
+ rewardTokenSymbol: reward.token.symbol,
504
+ rewardTokenDecimals: reward.token.decimals || 18,
505
+ amount: BigIntMath.max(total - claimed, 0n),
506
+ type: "extraMerkle",
507
+ });
508
+ }
509
+ });
510
+ });
511
+
512
+ return acc;
513
+ },
514
+ [],
515
+ );
516
+
517
+ const gearboxLmRewards = poolTokens.map((address, i): GearboxLmReward => {
518
+ const info = baseRewardPoolsInfo[address];
519
+ const rewardToken = currentTokenData[info.symbol];
520
+
521
+ return {
522
+ pool: info.pool,
523
+ poolToken: address,
524
+
525
+ rewardToken,
526
+ rewardTokenDecimals: tokensList[rewardToken]?.decimals || 18,
527
+ rewardTokenSymbol: info.symbol,
528
+
529
+ amount: gearboxLm[i] || 0n,
530
+ type: "stakedV3",
531
+ };
532
+ });
533
+
534
+ const { zero, nonZero } = gearboxLmRewards.reduce<{
535
+ nonZero: Array<GearboxLmReward>;
536
+ zero: Array<GearboxLmReward>;
537
+ }>(
538
+ (acc, r) => {
539
+ const amount = r.amount || 0n;
540
+ if (amount > 0n) {
541
+ acc.nonZero.push(r);
542
+ } else {
543
+ acc.zero.push(r);
544
+ }
545
+
546
+ return acc;
547
+ },
548
+ { nonZero: [], zero: [] },
549
+ );
550
+
551
+ return {
552
+ rewards: [...nonZero, ...extraRewards, zero],
553
+ };
554
+ }
555
+
556
+ private static extractFulfilled<T>(
557
+ r: PromiseSettledResult<T>,
558
+ reportError?: ReportHandler,
559
+ description?: string,
560
+ ) {
561
+ if (r.status === "fulfilled") {
562
+ return r.value;
563
+ } else {
564
+ if (reportError) {
565
+ reportError(r.reason, description);
566
+ } else {
567
+ console.error(r.reason);
568
+ }
569
+ return undefined;
570
+ }
571
+ }
572
+
573
+ static async claimLmRewardsV2({
574
+ signer,
575
+ account,
576
+ provider,
577
+
578
+ network,
579
+ airdropDistributorAddress,
580
+ }: ClaimLmRewardsV2Props) {
581
+ if (!airdropDistributorAddress)
582
+ throw new Error(`V2 rewards are not supported on chain: ${network}`);
583
+
584
+ const merkleData = await this.getMerkle(
585
+ provider,
586
+ airdropDistributorAddress,
587
+ network,
588
+ account,
589
+ );
590
+
591
+ const rewardFromMerkle = merkleData?.claims[getAddress(account)];
592
+ if (!rewardFromMerkle) throw new Error("No rewards found");
593
+
594
+ const distributor = getContract({
595
+ address: airdropDistributorAddress,
596
+ abi: iAirdropDistributorAbi,
597
+ client: signer,
598
+ });
599
+
600
+ return distributor.write.claim(
601
+ [
602
+ BigInt(rewardFromMerkle.index),
603
+ account,
604
+ toBigInt(rewardFromMerkle.amount),
605
+ rewardFromMerkle.proof,
606
+ ],
607
+ {
608
+ account: account,
609
+ chain: signer.chain,
610
+ },
611
+ );
612
+ }
613
+
614
+ static async claimLmRewardsV3({
615
+ reward,
616
+ signer,
617
+ account,
618
+ }: ClaimLmRewardsV3Props) {
619
+ const pool = getContract({
620
+ address: reward.poolToken,
621
+ abi: iFarmingPoolAbi,
622
+ client: signer,
623
+ });
624
+
625
+ return pool.write.claim({
626
+ account: account,
627
+ chain: signer.chain,
628
+ });
629
+ }
630
+
631
+ private static async getMerkle(
632
+ provider: PublicClient,
633
+ distributorAddress: Address,
634
+ network: NetworkType,
635
+ account: Address,
636
+ ): Promise<MerkleDistributorInfo> {
637
+ const distributor = getContract({
638
+ address: distributorAddress,
639
+ abi: iAirdropDistributorAbi,
640
+ client: provider,
641
+ });
642
+
643
+ const root = await distributor.read.merkleRoot();
644
+
645
+ const result = await axios.get<MerkleDistributorInfo>(
646
+ GearboxBackendApi.getRewardsMerkleUrl(network, root, account),
647
+ );
648
+ return result.data;
649
+ }
650
+
651
+ private static async getClaimed({
652
+ provider,
653
+ airdropDistributorAddress,
654
+ account,
655
+ }: GetTotalClaimedProps) {
656
+ const distributor = getContract({
657
+ address: airdropDistributorAddress,
658
+ abi: iAirdropDistributorAbi,
659
+ client: provider,
660
+ });
661
+
662
+ const claimedRewardsResponse = await distributor.getEvents.Claimed(
663
+ {
664
+ account,
665
+ historic: false,
666
+ },
667
+ {
668
+ fromBlock: 0n,
669
+ },
670
+ );
671
+
672
+ const claimedRewards = (claimedRewardsResponse || []).reduce(
673
+ (acc, r) => acc + (r.args.amount || 0n),
674
+ 0n,
675
+ );
676
+ return claimedRewards;
677
+ }
678
+
679
+ private static getAmountOnContract({
680
+ account,
681
+ merkleData,
682
+ }: GetAmountOnContractProps) {
683
+ const { claims = {} } = merkleData || {};
684
+ const { amount } = claims[getAddress(account)] || {};
685
+
686
+ return BigInt(amount || 0);
687
+ }
688
+ }
689
+
690
+ const POOL_REWARDS_ABI = [
691
+ {
692
+ inputs: [],
693
+ name: "rewardsToken",
694
+ outputs: [
695
+ {
696
+ internalType: "contract IERC20",
697
+ name: "",
698
+ type: "address",
699
+ },
700
+ ],
701
+ stateMutability: "view",
702
+ type: "function",
703
+ },
704
+ ] as const;